Skip to content
This repository was archived by the owner on Dec 30, 2023. It is now read-only.

Commit 6bcaee8

Browse files
authored
feat(object): ✨ Add a new snippets group merge & apply it to config package (#76)
1 parent 44f3461 commit 6bcaee8

File tree

10 files changed

+58
-9
lines changed

10 files changed

+58
-9
lines changed

.changeset/few-crabs-cry.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@terminal-nerds/snippets-object": minor
3+
---
4+
5+
✨ Added a new module `merge`

packages/config/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@
4242
],
4343
"dependencies": {
4444
"@terminal-nerds/snippets-error": "workspace:*",
45+
"@terminal-nerds/snippets-object": "workspace:^",
4546
"@terminal-nerds/snippets-runtime": "workspace:*",
46-
"deepmerge-ts": "5.0.0",
4747
"pkg-dir": "7.0.0",
4848
"type-fest": "3.6.1"
4949
},

packages/config/source/merge/merge.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { deepmerge } from "deepmerge-ts";
1+
import { mergeDeepObjects } from "@terminal-nerds/snippets-object/merge";
22

33
export type MergedConfig<T extends Record<string, unknown> = Record<string, unknown>> = T;
44

55
export function createMergedConfig<T extends Record<string, unknown> = Record<string, unknown>>(
66
dirtyConfigsList: Array<unknown>,
77
): MergedConfig<T> {
8-
const cleanConfigsList = dirtyConfigsList.filter(Boolean);
8+
const cleanConfigsList = dirtyConfigsList.filter(Boolean) as Array<Record<string, object>>;
99

10-
return deepmerge(...cleanConfigsList) as MergedConfig<T>;
10+
return mergeDeepObjects(cleanConfigsList) as MergedConfig<T>;
1111
}

packages/object/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,18 @@
2828
| ------------------------------------------ | ----------------------------------------------------- |
2929
| [`@terminal-nerds/snippets-object/keys`] | ![keys size gzip badge] ![keys size brotli badge] |
3030
| [`@terminal-nerds/snippets-object/schema`] | ![schema size gzip badge] ![schema size brotli badge] |
31+
| [`@terminal-nerds/snippets-object/schema`] | ![schema size gzip badge] ![schema size brotli badge] |
3132

3233
<!-- prettier-ignore-start -->
3334
<!-- MODULES LINKS -->
3435
[`@terminal-nerds/snippets-object/keys`]: https://github.com/terminal-nerds/snippets/blob/main/packages/object/source/keys/keys.ts
3536
[keys size gzip badge]: https://badgen.net/badgesize/gzip/file-object/unpkg.com/@terminal-nerds/snippets-object/dist/keys/keys.js?label=gzip
3637
[keys size brotli badge]: https://badgen.net/badgesize/brotli/file-object/unpkg.com/@terminal-nerds/snippets-object/dist/keys/keys.js?label=brotli
3738

39+
[`@terminal-nerds/snippets-object/merge`]: https://github.com/terminal-nerds/snippets/blob/main/packages/object/source/merge/merge.ts
40+
[merge size gzip badge]: https://badgen.net/badgesize/gzip/file-object/unpkg.com/@terminal-nerds/snippets-object/dist/merge/merge.js?label=gzip
41+
[merge size brotli badge]: https://badgen.net/badgesize/brotli/file-object/unpkg.com/@terminal-nerds/snippets-object/dist/merge/merge.js?label=brotli
42+
3843
[`@terminal-nerds/snippets-object/schema`]: https://github.com/terminal-nerds/snippets/blob/main/packages/object/source/schema/schema.ts
3944
[schema size gzip badge]: https://badgen.net/badgesize/gzip/file-object/unpkg.com/@terminal-nerds/snippets-object/dist/schema/schema.js?label=gzip
4045
[schema size brotli badge]: https://badgen.net/badgesize/brotli/file-object/unpkg.com/@terminal-nerds/snippets-object/dist/schema/schema.js?label=brotli

packages/object/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
},
7676
"dependencies": {
7777
"@terminal-nerds/snippets-type": "workspace:*",
78+
"deepmerge-ts": "5.0.0",
7879
"type-fest": "3.6.1",
7980
"zod": "3.21.4"
8081
}

packages/object/source/keys/keys.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { z } from "zod";
22

3-
const OBJECT_KEY_SCHEMA = z.number().or(z.string()).or(z.symbol());
3+
export const OBJECT_KEY_SCHEMA = z.number().or(z.string()).or(z.symbol());
4+
45
const RENAMER_SCHEMA = z.function().args(OBJECT_KEY_SCHEMA).returns(OBJECT_KEY_SCHEMA);
5-
type ObjectKey = number | string | symbol;
6+
7+
export type ObjectKey = number | string | symbol;
68

79
export function renameObjectKeys<OldKey extends ObjectKey, Value, NewKey extends ObjectKey>(
810
object: Record<OldKey, Value>,

packages/object/source/main.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
/* MODULES */
22
export * from "./keys/keys.ts";
3+
export * from "./merge/merge.ts";
34
export * from "./schema/schema.ts";
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { SAMPLE_PRIMITIVES } from "@terminal-nerds/snippets-test/sample";
2+
import { returns, throws } from "@terminal-nerds/snippets-test/unit";
3+
import { describe, it } from "vitest";
4+
import { ZodError } from "zod";
5+
6+
import { mergeDeepObjects } from "./merge.ts";
7+
8+
const SAMPLE_OBJECT1 = { a: [1] } as const;
9+
const SAMPLE_OBJECT2 = { a: [2, 3], b: false } as const;
10+
const SAMPLE_OBJECT3 = { a: [4, 5], b: true, c: "terminal nerds" } as const;
11+
12+
describe(`deepMergeObjects(objects)`, () => {
13+
it(throws(ZodError).on(`invalid object values`).samples(SAMPLE_PRIMITIVES), ({ expect }) => {
14+
// @ts-expect-error Testing
15+
expect(() => mergeDeepObjects(SAMPLE_PRIMITIVES)).toThrowError(ZodError);
16+
});
17+
18+
const expected = { a: [1, 2, 3, 4, 5], b: true, c: "terminal nerds" } as const;
19+
20+
it(returns(expected).on(`sample objects`), ({ expect }) => {
21+
expect(mergeDeepObjects([SAMPLE_OBJECT1, SAMPLE_OBJECT2, SAMPLE_OBJECT3])).toEqual(expected);
22+
});
23+
});

packages/object/source/merge/merge.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { OBJECT_SCHEMA } from "@terminal-nerds/snippets-type/non-primitive";
2+
import { deepmerge } from "deepmerge-ts";
3+
import { z } from "zod";
4+
5+
export function mergeDeepObjects(objects: ReadonlyArray<object>): object {
6+
z.array(OBJECT_SCHEMA).parse(objects);
7+
8+
return deepmerge(...objects) as object;
9+
}

pnpm-lock.yaml

Lines changed: 6 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)