@ix-xs/node-comfort 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/CHANGELOG.md +190 -0
  2. package/README.md +136 -549
  3. package/index.js +80 -35
  4. package/package.json +160 -33
  5. package/src/Arr.js +887 -419
  6. package/src/Async.js +585 -0
  7. package/src/Cache.js +329 -0
  8. package/src/Checker.js +971 -539
  9. package/src/Cli.js +1034 -0
  10. package/src/Color.js +415 -0
  11. package/src/Crypto.js +707 -0
  12. package/src/Emitter.js +289 -0
  13. package/src/Env.js +555 -0
  14. package/src/FS.js +1483 -894
  15. package/src/Func.js +670 -353
  16. package/src/Http.js +538 -0
  17. package/src/Id.js +384 -201
  18. package/src/Logger.js +739 -378
  19. package/src/Num.js +844 -361
  20. package/src/Obj.js +855 -372
  21. package/src/SQLite.js +1308 -1005
  22. package/src/Schema.js +1586 -0
  23. package/src/Str.js +983 -436
  24. package/src/Sys.js +511 -0
  25. package/src/Time.js +1260 -422
  26. package/src/Utils.js +321 -325
  27. package/src/errors.js +292 -0
  28. package/types/index.d.ts +693 -526
  29. package/types/src/Arr.d.ts +455 -145
  30. package/types/src/Arr.d.ts.map +1 -1
  31. package/types/src/Async.d.ts +321 -0
  32. package/types/src/Async.d.ts.map +1 -0
  33. package/types/src/Cache.d.ts +195 -0
  34. package/types/src/Cache.d.ts.map +1 -0
  35. package/types/src/Checker.d.ts +501 -235
  36. package/types/src/Checker.d.ts.map +1 -1
  37. package/types/src/Cli.d.ts +582 -0
  38. package/types/src/Cli.d.ts.map +1 -0
  39. package/types/src/Color.d.ts +294 -0
  40. package/types/src/Color.d.ts.map +1 -0
  41. package/types/src/Crypto.d.ts +534 -0
  42. package/types/src/Crypto.d.ts.map +1 -0
  43. package/types/src/Emitter.d.ts +170 -0
  44. package/types/src/Emitter.d.ts.map +1 -0
  45. package/types/src/Env.d.ts +382 -0
  46. package/types/src/Env.d.ts.map +1 -0
  47. package/types/src/FS.d.ts +686 -238
  48. package/types/src/FS.d.ts.map +1 -1
  49. package/types/src/Func.d.ts +380 -135
  50. package/types/src/Func.d.ts.map +1 -1
  51. package/types/src/Http.d.ts +374 -0
  52. package/types/src/Http.d.ts.map +1 -0
  53. package/types/src/Id.d.ts +149 -68
  54. package/types/src/Id.d.ts.map +1 -1
  55. package/types/src/Logger.d.ts +363 -46
  56. package/types/src/Logger.d.ts.map +1 -1
  57. package/types/src/Num.d.ts +473 -137
  58. package/types/src/Num.d.ts.map +1 -1
  59. package/types/src/Obj.d.ts +390 -104
  60. package/types/src/Obj.d.ts.map +1 -1
  61. package/types/src/SQLite.d.ts +646 -309
  62. package/types/src/SQLite.d.ts.map +1 -1
  63. package/types/src/Schema.d.ts +940 -0
  64. package/types/src/Schema.d.ts.map +1 -0
  65. package/types/src/Str.d.ts +569 -166
  66. package/types/src/Str.d.ts.map +1 -1
  67. package/types/src/Sys.d.ts +269 -0
  68. package/types/src/Sys.d.ts.map +1 -0
  69. package/types/src/Time.d.ts +663 -204
  70. package/types/src/Time.d.ts.map +1 -1
  71. package/types/src/Utils.d.ts +154 -102
  72. package/types/src/Utils.d.ts.map +1 -1
  73. package/types/src/errors.d.ts +292 -0
  74. package/types/src/errors.d.ts.map +1 -0
  75. package/types/index.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Num.d.ts","sourceRoot":"","sources":["../../src/Num.js"],"names":[],"mappings":"AAOE;;;;;;;;;;;GAWG;AACH,6BALW,MAAM,OACN,MAAM,OACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;GAOG;AACH,+BALW,MAAM,OACN,MAAM,OACN,MAAM,GACJ,OAAO,CAInB;AAED;;;;;;;;;GASG;AACH,6BAJW,MAAM,aACN,MAAM,GACJ,MAAM,CAKlB;AAED;;;;;;GAMG;AACH,6BAJW,MAAM,aACN,MAAM,GACJ,MAAM,CAKlB;AAED;;;;;;GAMG;AACH,4BAJW,MAAM,aACN,MAAM,GACJ,MAAM,CAKlB;AAED;;;;;;;;;;GAUG;AACH,4BALW,MAAM,OACN,MAAM,KACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;;;GAYG;AACH,gCAPW,MAAM,SACN,MAAM,SACN,MAAM,UACN,MAAM,UACN,MAAM,GACJ,MAAM,CAKlB;AAED;;;;;;;;GAQG;AACH,6BAJW,MAAM,QACN,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;GASG;AACH,+BAJW,MAAM,OACN,MAAM,GACJ,MAAM,CAMlB;AAED;;;;;GAKG;AACH,4BAHW,MAAM,EAAE,GACN,MAAM,CAIlB;AAED;;;;;GAKG;AACH,gCAHW,MAAM,EAAE,GACN,MAAM,CAIlB;AAED;;;;;GAKG;AACH,+BAHW,MAAM,EAAE,GACN,MAAM,CAOlB;AAED;;;;;GAKG;AACH,4BAHW,MAAM,EAAE,GACN,MAAM,GAAC,SAAS,CAI5B;AAED;;;;;GAKG;AACH,4BAHW,MAAM,EAAE,GACN,MAAM,GAAC,SAAS,CAI5B;AAED;;;;;;;;;;GAUG;AACH,+BALW,MAAM,SACN,MAAM,aACN,MAAM,GACJ,MAAM,CAKlB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,mCAJW,MAAM,YACN;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,OAAO,CAAA;CAAE,GACpD,MAAM,CAalB;AAED;;;;;;;;;;GAUG;AACH,kCAJW,MAAM,aACN,MAAM,GACJ,MAAM,CAelB;AAED;;;;;;;;;;GAUG;AACH,iCAJW,MAAM,cACN,MAAM,GACJ,MAAM,CAMlB;AAED;;;;;;;;;GASG;AACH,+BAHW,MAAM,GACJ,MAAM,CASlB;AAED;;;;;;;;;;GAUG;AACH,6BAJW,GAAC,aACD,MAAM,GACJ,MAAM,CAMlB;AAED;;;;GAIG;AACH,8BAHW,MAAM,GACJ,OAAO,CAInB;AAED;;;;GAIG;AACH,6BAHW,MAAM,GACJ,OAAO,CAInB;AAED;;;;;;;;;;;;;;;GAeG;AACH,6BALW,MAAM,QACN,MAAM,SACN,MAAM,GACJ,MAAM,EAAE,CAkBpB"}
1
+ {"version":3,"file":"Num.d.ts","sourceRoot":"","sources":["../../src/Num.js"],"names":[],"mappings":"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"}
@@ -1,189 +1,475 @@
1
+ declare namespace _exports {
2
+ export { PathLeaf, Paths, NullishToUndefined, PathValue, PathStep, PathInput, DeepReadonly, Change, MergeOptions, CompactOptions };
3
+ }
4
+ declare namespace _exports {
5
+ export { clone };
6
+ export { merge };
7
+ export { mergeWith };
8
+ export { defaults };
9
+ export { equal };
10
+ export { diff };
11
+ export { get };
12
+ export { set };
13
+ export { unset };
14
+ export { has };
15
+ export { pick };
16
+ export { omit };
17
+ export { filter };
18
+ export { mapValues };
19
+ export { mapKeys };
20
+ export { renameKeys };
21
+ export { invert };
22
+ export { compact };
23
+ export { flatten };
24
+ export { unflatten };
25
+ export { keys };
26
+ export { entries };
27
+ export { fromEntries };
28
+ export { size };
29
+ export { isEmpty };
30
+ export { deepFreeze };
31
+ }
32
+ export = _exports;
1
33
  /**
2
- * Deeply clones a value.
34
+ * Values that end a path: dates, regexes, maps, sets, functions and arrays.
35
+ */
36
+ type PathLeaf = Date | RegExp | Map<any, any> | Set<any> | ((...args: any[]) => any) | readonly any[];
37
+ /**
38
+ * Every dotted path of an object type, up to 6 levels. This is what powers
39
+ * path completion in `obj.get()` and friends.
40
+ */
41
+ type Paths<T, Depth extends unknown[] = []> = Depth["length"] extends 6 ? never : T extends PathLeaf ? never : T extends object ? { [K in keyof T & (string | number)]: NonNullable<T[K]> extends PathLeaf ? `${K}` : NonNullable<T[K]> extends object ? `${K}` | `${K}.${Paths<NonNullable<T[K]>, [...Depth, 0]>}` : `${K}`; }[keyof T & (string | number)] : never;
42
+ type NullishToUndefined<T> = [Extract<T, null | undefined>] extends [never] ? never : undefined;
43
+ /**
44
+ * The type found at a dotted path of `T`, or `any` for an unknown path.
45
+ */
46
+ type PathValue<T, P extends string> = P extends `${infer Head}.${infer Rest}` ? PathStep<T, Head> extends infer Next ? ([Next] extends [typeof _NOT_FOUND] ? any : PathValue<Next, Rest> | NullishToUndefined<T>) : any : PathStep<T, P> extends infer Next ? ([Next] extends [typeof _NOT_FOUND] ? any : Next | NullishToUndefined<T>) : any;
47
+ type PathStep<T, K extends string> = K extends keyof NonNullable<T> ? NonNullable<T>[K] : NonNullable<T> extends readonly (infer E)[] ? (K extends `${number}` ? E | undefined : typeof _NOT_FOUND) : typeof _NOT_FOUND;
48
+ /**
49
+ * A path: a known dotted path (completed by your editor), any other string
50
+ * like `"items[0].name"`, or an array of keys.
51
+ */
52
+ type PathInput<T> = Paths<T> | (string & {}) | ReadonlyArray<string | number>;
53
+ /**
54
+ * `T`, read-only all the way down.
55
+ */
56
+ type DeepReadonly<T> = T extends (...args: any[]) => any ? T : T extends object ? { readonly [K in keyof T]: DeepReadonly<T[K]>; } : T;
57
+ /**
58
+ * One difference reported by `diff()`.
59
+ */
60
+ type Change = {
61
+ /**
62
+ * Where it changed, like `["address", "city"]`.
63
+ */
64
+ path: Array<string | number>;
65
+ type: "added" | "removed" | "changed";
66
+ /**
67
+ * The old value.
68
+ */
69
+ from?: unknown;
70
+ /**
71
+ * The new value.
72
+ */
73
+ to?: unknown;
74
+ };
75
+ /**
76
+ * Options for `mergeWith()`.
77
+ */
78
+ type MergeOptions = {
79
+ /**
80
+ * When both sides have an array: keep the last, join them, or join without duplicates. Defaults to `"replace"`.
81
+ */
82
+ arrays?: "concat" | "replace" | "unique" | undefined;
83
+ /**
84
+ * Don't let `undefined` overwrite an existing value.
85
+ */
86
+ skipUndefined?: boolean | undefined;
87
+ };
88
+ /**
89
+ * Options for `compact()`.
90
+ */
91
+ type CompactOptions = {
92
+ /**
93
+ * Clean nested objects and arrays too.
94
+ */
95
+ deep?: boolean | undefined;
96
+ /**
97
+ * Also remove `""`, `[]` and `{}`.
98
+ */
99
+ removeEmpty?: boolean | undefined;
100
+ };
101
+ /**
102
+ * Deep copy. Uses `structuredClone` when it can, and falls back to a copy
103
+ * that keeps functions and class prototypes.
104
+ *
105
+ * @example
106
+ * const copy = obj.clone({ a: { b: [1, 2] }, when: new Date() });
107
+ * copy.a.b.push(3); // the original is untouched
108
+ *
109
+ * @template T
110
+ * @param {T} value
111
+ * @returns {T}
112
+ */
113
+ declare function clone<T>(value: T): T;
114
+ /**
115
+ * Deep-merges objects into a new one. Later objects win, nested objects are
116
+ * merged, arrays are replaced. See `mergeWith()` to join arrays instead.
117
+ *
118
+ * @example
119
+ * obj.merge({ db: { host: "localhost", port: 5432 } }, { db: { port: 6543 } });
120
+ * // { db: { host: "localhost", port: 6543 } }
121
+ *
122
+ * @template {object} A
123
+ * @overload
124
+ * @param {A} a
125
+ * @returns {A}
126
+ */
127
+ declare function merge<A extends object>(a: A): A;
128
+ /**
129
+ * Deep-merges `b` into a copy of `a`.
130
+ *
131
+ * @template {object} A
132
+ * @template {object} B
133
+ * @overload
134
+ * @param {A} a
135
+ * @param {B} b
136
+ * @returns {A & B}
137
+ */
138
+ declare function merge<A extends object, B extends object>(a: A, b: B): A & B;
139
+ /**
140
+ * Deep-merges three objects; the last one wins.
141
+ *
142
+ * @template {object} A
143
+ * @template {object} B
144
+ * @template {object} C
145
+ * @overload
146
+ * @param {A} a
147
+ * @param {B} b
148
+ * @param {C} c
149
+ * @returns {A & B & C}
150
+ */
151
+ declare function merge<A extends object, B extends object, C extends object>(a: A, b: B, c: C): A & B & C;
152
+ /**
153
+ * Deep-merges any number of objects; the last one wins.
154
+ *
155
+ * @overload
156
+ * @param {...object} sources
157
+ * @returns {Record<string, any>}
158
+ */
159
+ declare function merge(...sources: object[]): Record<string, any>;
160
+ /**
161
+ * Like `merge()`, with a choice of what happens to arrays and `undefined`.
162
+ *
163
+ * @example
164
+ * obj.mergeWith({ arrays: "unique" }, { tags: ["a", "b"] }, { tags: ["b", "c"] });
165
+ * // { tags: ["a", "b", "c"] }
166
+ * obj.mergeWith({ skipUndefined: true }, { port: 80 }, { port: undefined });
167
+ * // { port: 80 }
168
+ *
169
+ * @param {MergeOptions} options
170
+ * @param {...object} sources
171
+ * @returns {Record<string, any>}
172
+ */
173
+ declare function mergeWith(options: MergeOptions, ...sources: object[]): Record<string, any>;
174
+ /**
175
+ * Fills in missing properties from defaults, deeply. Values that are set,
176
+ * even `null` or `0`, are kept.
177
+ *
178
+ * @example
179
+ * obj.defaults({ port: 8080, db: { user: "me" } }, { port: 80, db: { user: "root", pass: "" } });
180
+ * // { port: 8080, db: { user: "me", pass: "" } }
181
+ *
182
+ * @template {object} T
183
+ * @template {object} D
184
+ * @param {T} target
185
+ * @param {...D} sources The first one has the highest priority.
186
+ * @returns {T & D}
187
+ */
188
+ declare function defaults<T extends object, D extends object>(target: T, ...sources: D[]): T & D;
189
+ /**
190
+ * Deep equality. Knows about arrays, dates, regexes, maps, sets, typed
191
+ * arrays, `NaN` and circular references.
192
+ *
193
+ * @example
194
+ * obj.equal({ a: [1, { b: 2 }] }, { a: [1, { b: 2 }] }); // true
195
+ * obj.equal(new Set([1, 2]), new Set([2, 1])); // true
196
+ * obj.equal({ a: 1 }, { a: 1, b: undefined }); // false
197
+ *
198
+ * @param {unknown} a
199
+ * @param {unknown} b
200
+ * @returns {boolean}
201
+ */
202
+ declare function equal(a: unknown, b: unknown): boolean;
203
+ /**
204
+ * Lists what changed between two values, deeply. Handy for audit logs and
205
+ * partial updates.
3
206
  *
4
- * Uses the native `structuredClone` when the value supports it (plain data,
5
- * Dates, Maps, Sets, typed arrays, ...), and falls back to a manual deep copy
6
- * otherwise. Functions are copied by reference.
207
+ * @example
208
+ * obj.diff({ name: "Ada", tags: ["a"] }, { name: "Ada L.", tags: ["a", "b"] });
209
+ * // [
210
+ * // { path: ["name"], type: "changed", from: "Ada", to: "Ada L." },
211
+ * // { path: ["tags", 1], type: "added", to: "b" },
212
+ * // ]
213
+ *
214
+ * @param {unknown} before
215
+ * @param {unknown} after
216
+ * @returns {Change[]} Empty when nothing changed.
217
+ */
218
+ declare function diff(before: unknown, after: unknown): Change[];
219
+ /**
220
+ * Reads a nested value from a dotted path. Your editor completes the paths
221
+ * and knows the type of the result.
7
222
  *
8
223
  * @example
9
- * const copy = nodeComfort.obj.clone({ a: { b: 1 } });
224
+ * obj.get(config, "db.pool.max"); // number | undefined
225
+ * obj.get(config, "db.pool.max", 10); // number
226
+ * obj.get(data, "users[0].name");
227
+ * obj.get(data, ["users", 0, "name"]);
10
228
  *
11
229
  * @template T
12
- * @param {T} value - Value to clone.
13
- * @returns {T} A deep copy.
230
+ * @template {string} P
231
+ * @overload
232
+ * @param {T} object
233
+ * @param {P | Paths<T> | ReadonlyArray<string | number>} path Like `"a.b.c"`, `"a[0].b"` or `["a", 0, "b"]`.
234
+ * @returns {PathValue<T, P>}
14
235
  */
15
- export function clone<T>(value: T): T;
236
+ declare function get<T, P extends string>(object: T, path: P | Paths<T> | ReadonlyArray<string | number>): PathValue<T, P>;
16
237
  /**
17
- * Deeply merges two or more plain objects into a new object.
238
+ * Reads a nested value from a dotted path, or returns `fallback` if there's
239
+ * nothing there.
18
240
  *
19
- * Later sources win. Plain-object values are merged recursively; arrays and
20
- * other values are replaced (not concatenated). Inputs are never mutated.
241
+ * @template T
242
+ * @template {string} P
243
+ * @template F
244
+ * @overload
245
+ * @param {T} object
246
+ * @param {P | Paths<T> | ReadonlyArray<string | number>} path Like `"a.b.c"`, `"a[0].b"` or `["a", 0, "b"]`.
247
+ * @param {F} fallback
248
+ * @returns {Exclude<PathValue<T, P>, undefined> | F}
249
+ */
250
+ declare function get<T, P extends string, F>(object: T, path: P | Paths<T> | ReadonlyArray<string | number>, fallback: F): Exclude<PathValue<T, P>, undefined> | F;
251
+ /**
252
+ * Returns a copy with a nested value set. Missing levels are created
253
+ * (arrays when the next key is a number).
21
254
  *
22
255
  * @example
23
- * nodeComfort.obj.merge({ a: { x: 1 } }, { a: { y: 2 } });
24
- * // { a: { x: 1, y: 2 } }
256
+ * obj.set({}, "a.b.c", 1); // { a: { b: { c: 1 } } }
257
+ * obj.set(state, "user.name", "Ada"); // state is untouched
25
258
  *
26
- * @param {...Record<string, any>} sources - Objects to merge.
27
- * @returns {Record<string, any>} The merged object.
259
+ * @template T
260
+ * @param {T} object
261
+ * @param {PathInput<T>} path
262
+ * @param {unknown} value
263
+ * @returns {T}
28
264
  */
29
- export function merge(...sources: Record<string, any>[]): Record<string, any>;
265
+ declare function set<T>(object: T, path: PathInput<T>, value: unknown): T;
30
266
  /**
31
- * Deeply compares two values for structural equality.
267
+ * Returns a copy without the property at `path`.
32
268
  *
33
- * Handles plain objects, arrays, Dates, RegExps, Maps and Sets.
269
+ * @example
270
+ * obj.unset({ a: { b: 1, c: 2 } }, "a.b"); // { a: { c: 2 } }
271
+ *
272
+ * @template T
273
+ * @param {T} object
274
+ * @param {PathInput<T>} path
275
+ * @returns {T}
276
+ */
277
+ declare function unset<T>(object: T, path: PathInput<T>): T;
278
+ /**
279
+ * Does the path exist? A property set to `undefined` still counts.
34
280
  *
35
281
  * @example
36
- * nodeComfort.obj.equal({ a: [1, 2] }, { a: [1, 2] }); // true
282
+ * obj.has({ a: { b: undefined } }, "a.b"); // true
283
+ * obj.has({ a: {} }, "a.b"); // false
37
284
  *
38
- * @param {*} a - First value.
39
- * @param {*} b - Second value.
40
- * @returns {boolean} True if the values are deeply equal.
285
+ * @template T
286
+ * @param {T} object
287
+ * @param {PathInput<T>} path
288
+ * @returns {boolean}
41
289
  */
42
- export function equal(a: any, b: any): boolean;
290
+ declare function has<T>(object: T, path: PathInput<T>): boolean;
43
291
  /**
44
- * Gets a nested value from an object using a dot/bracket path.
292
+ * A copy with only the listed keys.
45
293
  *
46
294
  * @example
47
- * nodeComfort.obj.get({ a: { b: [{ c: 42 }] } }, "a.b[0].c"); // 42
48
- * nodeComfort.obj.get({}, "a.b.c", "default"); // "default"
295
+ * obj.pick(user, ["id", "email"]);
49
296
  *
50
- * @param {Record<string, any>} object - Source object.
51
- * @param {string|Array<string|number>} path - Dot path or key array.
52
- * @param {*} [fallback] - Returned when the path does not resolve.
53
- * @returns {*} The value at the path, or the fallback.
297
+ * @template {object} T
298
+ * @template {keyof T} K
299
+ * @param {T} object
300
+ * @param {readonly K[]} keys
301
+ * @returns {Pick<T, K>}
54
302
  */
55
- export function get(object: Record<string, any>, path: string | Array<string | number>, fallback?: any): any;
303
+ declare function pick<T extends object, K extends keyof T>(object: T, keys: readonly K[]): Pick<T, K>;
56
304
  /**
57
- * Sets a nested value in an object using a dot/bracket path (returns a clone).
305
+ * A copy without the listed keys.
306
+ *
307
+ * @example
308
+ * obj.omit(user, ["password", "token"]);
58
309
  *
59
- * Intermediate objects/arrays are created as needed. The original object is
60
- * not mutated.
310
+ * @template {object} T
311
+ * @template {keyof T} K
312
+ * @param {T} object
313
+ * @param {readonly K[]} keys
314
+ * @returns {Omit<T, K>}
315
+ */
316
+ declare function omit<T extends object, K extends keyof T>(object: T, keys: readonly K[]): Omit<T, K>;
317
+ /**
318
+ * Keeps the entries that pass a test.
61
319
  *
62
320
  * @example
63
- * nodeComfort.obj.set({}, "a.b.c", 1); // { a: { b: { c: 1 } } }
321
+ * obj.filter({ a: 1, b: 2, c: 3 }, (value) => value > 1); // { b: 2, c: 3 }
64
322
  *
65
- * @param {Record<string, any>} object - Source object.
66
- * @param {string|Array<string|number>} path - Dot path or key array.
67
- * @param {*} value - Value to set.
68
- * @returns {Record<string, any>} A new object with the value set.
323
+ * @template {object} T
324
+ * @param {T} object
325
+ * @param {(value: T[keyof T], key: keyof T & string) => unknown} predicate
326
+ * @returns {Partial<T>}
69
327
  */
70
- export function set(object: Record<string, any>, path: string | Array<string | number>, value: any): Record<string, any>;
328
+ declare function filter<T extends object>(object: T, predicate: (value: T[keyof T], key: keyof T & string) => unknown): Partial<T>;
71
329
  /**
72
- * Checks whether a nested path exists in an object.
330
+ * Transforms every value, keeping the keys.
331
+ *
332
+ * @example
333
+ * obj.mapValues({ a: 1, b: 2 }, (v) => v * 10); // { a: 10, b: 20 }
73
334
  *
74
- * @param {Record<string, any>} object - Source object.
75
- * @param {string|Array<string|number>} path - Dot path or key array.
76
- * @returns {boolean} True if the path resolves.
335
+ * @template {object} T
336
+ * @template R
337
+ * @param {T} object
338
+ * @param {(value: T[keyof T], key: keyof T & string) => R} fn
339
+ * @returns {{ [K in keyof T]: R }}
77
340
  */
78
- export function has(object: Record<string, any>, path: string | Array<string | number>): boolean;
341
+ declare function mapValues<T extends object, R>(object: T, fn: (value: T[keyof T], key: keyof T & string) => R): { [K in keyof T]: R; };
79
342
  /**
80
- * Returns a new object containing only the given keys.
343
+ * Transforms every key, keeping the values.
81
344
  *
82
345
  * @example
83
- * nodeComfort.obj.pick({ a: 1, b: 2, c: 3 }, ["a", "c"]); // { a: 1, c: 3 }
346
+ * obj.mapKeys({ first_name: "Ada" }, (key) => nc.str.camelCase(key)); // { firstName: "Ada" }
84
347
  *
85
- * @param {Record<string, any>} object - Source object.
86
- * @param {string[]} keys - Keys to keep.
87
- * @returns {Record<string, any>} The picked object.
348
+ * @template {object} T
349
+ * @param {T} object
350
+ * @param {(key: keyof T & string, value: T[keyof T]) => PropertyKey} fn Returns the new key.
351
+ * @returns {Record<string, T[keyof T]>}
88
352
  */
89
- export function pick(object: Record<string, any>, keys: string[]): Record<string, any>;
353
+ declare function mapKeys<T extends object>(object: T, fn: (key: keyof T & string, value: T[keyof T]) => PropertyKey): Record<string, T[keyof T]>;
90
354
  /**
91
- * Returns a new object without the given keys.
355
+ * Renames some keys and leaves the others alone.
92
356
  *
93
357
  * @example
94
- * nodeComfort.obj.omit({ a: 1, b: 2, c: 3 }, ["b"]); // { a: 1, c: 3 }
358
+ * obj.renameKeys({ _id: 1, name: "Ada" }, { _id: "id" }); // { id: 1, name: "Ada" }
95
359
  *
96
- * @param {Record<string, any>} object - Source object.
97
- * @param {string[]} keys - Keys to remove.
98
- * @returns {Record<string, any>} The remaining object.
360
+ * @template {object} T
361
+ * @param {T} object
362
+ * @param {Partial<Record<keyof T, string>>} mapping Old name to new name.
363
+ * @returns {Record<string, T[keyof T]>}
99
364
  */
100
- export function omit(object: Record<string, any>, keys: string[]): Record<string, any>;
365
+ declare function renameKeys<T extends object>(object: T, mapping: Partial<Record<keyof T, string>>): Record<string, T[keyof T]>;
101
366
  /**
102
- * Returns a new object keeping only the entries that pass a predicate.
367
+ * Swaps keys and values.
103
368
  *
104
369
  * @example
105
- * nodeComfort.obj.filter({ a: 1, b: 2, c: 3 }, (v) => v > 1); // { b: 2, c: 3 }
370
+ * obj.invert({ a: "x", b: "y" }); // { x: "a", y: "b" }
106
371
  *
107
- * @param {Record<string, any>} object - Source object.
108
- * @param {(value: any, key: string) => boolean} predicate - Test function.
109
- * @returns {Record<string, any>} The filtered object.
372
+ * @param {Record<string, PropertyKey>} object
373
+ * @returns {Record<string, string>}
110
374
  */
111
- export function filter(object: Record<string, any>, predicate: (value: any, key: string) => boolean): Record<string, any>;
375
+ declare function invert(object: Record<string, PropertyKey>): Record<string, string>;
112
376
  /**
113
- * Maps over an object's values, returning a new object with the same keys.
377
+ * Removes `null` and `undefined` values, and optionally empty ones.
114
378
  *
115
379
  * @example
116
- * nodeComfort.obj.mapValues({ a: 1, b: 2 }, (v) => v * 10); // { a: 10, b: 20 }
380
+ * obj.compact({ a: 1, b: null, c: undefined }); // { a: 1 }
381
+ * obj.compact({ a: { b: null, c: "" } }, { deep: true, removeEmpty: true }); // {}
117
382
  *
118
- * @param {Record<string, any>} object - Source object.
119
- * @param {(value: any, key: string) => any} fn - Mapping function.
120
- * @returns {Record<string, any>} The mapped object.
383
+ * @template {object} T
384
+ * @param {T} object
385
+ * @param {CompactOptions} [options]
386
+ * @returns {Partial<T>}
121
387
  */
122
- export function mapValues(object: Record<string, any>, fn: (value: any, key: string) => any): Record<string, any>;
388
+ declare function compact<T extends object>(object: T, options?: CompactOptions): Partial<T>;
123
389
  /**
124
- * Maps over an object's keys, returning a new object with remapped keys.
390
+ * Flattens nested objects into dotted keys. Arrays stay as values.
125
391
  *
126
392
  * @example
127
- * nodeComfort.obj.mapKeys({ a: 1 }, (k) => k.toUpperCase()); // { A: 1 }
393
+ * obj.flatten({ db: { host: "x", port: 5432 } }); // { "db.host": "x", "db.port": 5432 }
128
394
  *
129
- * @param {Record<string, any>} object - Source object.
130
- * @param {(key: string, value: any) => string} fn - Key-mapping function.
131
- * @returns {Record<string, any>} The remapped object.
395
+ * @param {object} object
396
+ * @param {string} [prefix=""] Added in front of every key.
397
+ * @returns {Record<string, unknown>}
132
398
  */
133
- export function mapKeys(object: Record<string, any>, fn: (key: string, value: any) => string): Record<string, any>;
399
+ declare function flatten(object: object, prefix?: string): Record<string, unknown>;
134
400
  /**
135
- * Swaps keys and values of an object.
401
+ * Rebuilds nested objects from dotted keys. The opposite of `flatten()`.
136
402
  *
137
403
  * @example
138
- * nodeComfort.obj.invert({ a: "x", b: "y" }); // { x: "a", y: "b" }
404
+ * obj.unflatten({ "db.host": "x", "db.port": 5432 }); // { db: { host: "x", port: 5432 } }
139
405
  *
140
- * @param {Record<string, any>} object - Source object.
141
- * @returns {Record<string, string>} The inverted object.
406
+ * @param {Record<string, unknown>} object
407
+ * @returns {Record<string, any>}
142
408
  */
143
- export function invert(object: Record<string, any>): Record<string, string>;
409
+ declare function unflatten(object: Record<string, unknown>): Record<string, any>;
144
410
  /**
145
- * Removes entries whose value is `null` or `undefined` (shallow).
411
+ * `Object.keys`, but typed with the object's actual keys.
146
412
  *
147
413
  * @example
148
- * nodeComfort.obj.compact({ a: 1, b: null, c: undefined }); // { a: 1 }
414
+ * for (const key of obj.keys(config)) config[key]; // no type error
149
415
  *
150
- * @param {Record<string, any>} object - Source object.
151
- * @returns {Record<string, any>} The compacted object.
416
+ * @template {object} T
417
+ * @param {T} object
418
+ * @returns {Array<keyof T & string>}
152
419
  */
153
- export function compact(object: Record<string, any>): Record<string, any>;
420
+ declare function keys<T extends object>(object: T): Array<keyof T & string>;
154
421
  /**
155
- * Flattens a nested object into a single-level object with dot-path keys.
422
+ * `Object.entries`, with typed keys and values.
423
+ *
424
+ * @template {object} T
425
+ * @param {T} object
426
+ * @returns {Array<[keyof T & string, T[keyof T]]>}
427
+ */
428
+ declare function entries<T extends object>(object: T): Array<[keyof T & string, T[keyof T]]>;
429
+ /**
430
+ * `Object.fromEntries` that accepts any iterable (a `Map` too) and skips
431
+ * unsafe keys.
156
432
  *
157
433
  * @example
158
- * nodeComfort.obj.flatten({ a: { b: { c: 1 } } }); // { "a.b.c": 1 }
434
+ * obj.fromEntries(new Map([["x", true]])); // { x: true }
159
435
  *
160
- * @param {Record<string, any>} object - Source object.
161
- * @param {string} [prefix=""] - Prefix for keys (used internally).
162
- * @returns {Record<string, any>} The flattened object.
436
+ * @template {PropertyKey} K
437
+ * @template V
438
+ * @param {Iterable<readonly [K, V]>} pairs
439
+ * @returns {Record<K, V>}
163
440
  */
164
- export function flatten(object: Record<string, any>, prefix?: string): Record<string, any>;
441
+ declare function fromEntries<K extends PropertyKey, V>(pairs: Iterable<readonly [K, V]>): Record<K, V>;
165
442
  /**
166
- * Rebuilds a nested object from a flat, dot-path keyed object.
443
+ * How many entries: own keys of an object, size of a map or set, length of
444
+ * an array or string.
167
445
  *
168
446
  * @example
169
- * nodeComfort.obj.unflatten({ "a.b.c": 1 }); // { a: { b: { c: 1 } } }
447
+ * obj.size({ a: 1, b: 2 }); // 2
170
448
  *
171
- * @param {Record<string, any>} object - Flat object.
172
- * @returns {Record<string, any>} The nested object.
449
+ * @param {unknown} value
450
+ * @returns {number}
173
451
  */
174
- export function unflatten(object: Record<string, any>): Record<string, any>;
452
+ declare function size(value: unknown): number;
175
453
  /**
176
- * Checks whether an object has no own enumerable keys.
454
+ * Does the object have no own keys? `null` and `undefined` count as empty.
177
455
  *
178
- * @param {Record<string, any>} object - Source object.
179
- * @returns {boolean} True if the object is empty.
456
+ * @param {unknown} object
457
+ * @returns {boolean}
180
458
  */
181
- export function isEmpty(object: Record<string, any>): boolean;
459
+ declare function isEmpty(object: unknown): boolean;
182
460
  /**
183
- * Freezes an object deeply, making it (and all nested objects) immutable.
461
+ * Freezes an object and everything inside it. Good for configuration and
462
+ * constants.
463
+ *
464
+ * @example
465
+ * const CONFIG = obj.deepFreeze({ db: { host: "localhost" } });
466
+ * CONFIG.db.host = "x"; // TypeScript error, and ignored at runtime
184
467
  *
185
- * @param {Record<string, any>} object - Object to freeze.
186
- * @returns {Record<string, any>} The same, now deeply-frozen, object.
468
+ * @template T
469
+ * @param {T} object
470
+ * @returns {DeepReadonly<T>} The same object.
187
471
  */
188
- export function deepFreeze(object: Record<string, any>): Record<string, any>;
472
+ declare function deepFreeze<T>(object: T): DeepReadonly<T>;
473
+ /** Marks an unknown path segment in `PathStep`. */
474
+ declare const _NOT_FOUND: unique symbol;
189
475
  //# sourceMappingURL=Obj.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Obj.d.ts","sourceRoot":"","sources":["../../src/Obj.js"],"names":[],"mappings":"AAmEE;;;;;;;;;;;;;GAaG;AACH,sBAJa,CAAC,SACH,CAAC,GACC,CAAC,CASb;AAED;;;;;;;;;;;;GAYG;AACH,kCAHc,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAA,GACpB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAkB/B;AAED;;;;;;;;;;;GAWG;AACH,yBAJW,GAAC,KACD,GAAC,GACC,OAAO,CA+BnB;AAED;;;;;;;;;;;GAWG;AACH,4BALW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QACnB,MAAM,GAAC,KAAK,CAAC,MAAM,GAAC,MAAM,CAAC,aAC3B,GAAC,GACC,GAAC,CAUb;AAED;;;;;;;;;;;;;GAaG;AACH,4BALW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QACnB,MAAM,GAAC,KAAK,CAAC,MAAM,GAAC,MAAM,CAAC,SAC3B,GAAC,GACC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAgB/B;AAED;;;;;;GAMG;AACH,4BAJW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QACnB,MAAM,GAAC,KAAK,CAAC,MAAM,GAAC,MAAM,CAAC,GACzB,OAAO,CAUnB;AAED;;;;;;;;;GASG;AACH,6BAJW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QACnB,MAAM,EAAE,GACN,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAQ/B;AAED;;;;;;;;;GASG;AACH,6BAJW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QACnB,MAAM,EAAE,GACN,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAS/B;AAED;;;;;;;;;GASG;AACH,+BAJW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,aACnB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,GAClC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAQ/B;AAED;;;;;;;;;GASG;AACH,kCAJW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MACnB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,KAAK,GAAG,GAC9B,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAQ/B;AAED;;;;;;;;;GASG;AACH,gCAJW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,MACnB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,MAAM,GACjC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAQ/B;AAED;;;;;;;;GAQG;AACH,+BAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQlC;AAED;;;;;;;;GAQG;AACH,gCAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAI/B;AAED;;;;;;;;;GASG;AACH,gCAJW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,WACnB,MAAM,GACJ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAa/B;AAED;;;;;;;;GAQG;AACH,kCAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAQ/B;AAED;;;;;GAKG;AACH,gCAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,OAAO,CAInB;AAED;;;;;GAKG;AACH,mCAHW,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACjB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAW/B"}
1
+ {"version":3,"file":"Obj.d.ts","sourceRoot":"","sources":["../../src/Obj.js"],"names":[],"mappings":"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"}