@jfdevelops/multi-step-form-core 1.0.0-alpha.18 → 1.0.0-alpha.19
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.
- package/dist/utils/casing.d.cts +1 -1
- package/dist/utils/casing.d.cts.map +1 -1
- package/dist/utils/casing.d.mts +1 -1
- package/dist/utils/casing.d.mts.map +1 -1
- package/dist/utils/path.cjs +83 -7
- package/dist/utils/path.cjs.map +1 -1
- package/dist/utils/path.d.cts.map +1 -1
- package/dist/utils/path.d.mts.map +1 -1
- package/dist/utils/path.mjs +83 -7
- package/dist/utils/path.mjs.map +1 -1
- package/dist/utils/validator.d.mts.map +1 -1
- package/package.json +1 -1
package/dist/utils/casing.d.cts
CHANGED
|
@@ -34,7 +34,7 @@ declare function isCasingValid(value: unknown): value is CasingType;
|
|
|
34
34
|
* @param fallback An optional fallback value if {@linkcode input} is `undefined`.
|
|
35
35
|
* @returns The {@linkcode input} or {@linkcode fallback} if {@linkcode input} is `undefined` or an {@linkcode isCasingValid invalid} {@linkcode CasingType}.
|
|
36
36
|
*/
|
|
37
|
-
declare function setCasingType<TCasing extends CasingType>(input: TCasing | undefined, fallback?: CasingType): "
|
|
37
|
+
declare function setCasingType<TCasing extends CasingType>(input: TCasing | undefined, fallback?: CasingType): "sentence" | "title" | "camel" | "lower" | "upper" | "pascal" | "snake" | "screaming-snake" | "flat" | "kebab";
|
|
38
38
|
//#endregion
|
|
39
39
|
export { CASING_TYPES, CapitalizeWord, CasingType, ChangeCasing, ChangeObjectCasing, DEFAULT_CASING, DefaultCasing, ToLower, changeCasing, isCasingValid, quote, setCasingType };
|
|
40
40
|
//# sourceMappingURL=casing.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"casing.d.cts","names":[],"sources":["../../src/utils/casing.ts"],"sourcesContent":[],"mappings":";;;KAEY,UAAA,WAAqB;KACrB,4BAA4B,sCACjC,UAAU,KAAK,QAAQ,OAC1B;AAHQ,KAKA,cALU,CAAA,UAAW,MAAY,CAAA,GAKE,CALF,SAAA,GAAA,KAAA,EAAA,GAAA,KAAA,EAAA,EAAA,GAAA,GAMtC,SANsC,CAM5B,CAN4B,CAAA,GAMvB,OANuB,CAMf,CANe,CAAA,EAAA,GAOzC,CAPyC;AAC7C,KAQK,SARc,CAAA,UAAA,MAAA,CAAA,GAQgB,UARhB,CAQ2B,CAR3B,CAAA;KAWd,SAXmC,CAAA,UAAA,MAAA,CAAA,GAWL,SAXK,CAYtC,CAZsC,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GAAA,GAa/B,CAb+B,IAa1B,SAb0B,CAahB,CAbgB,CAAA,EAAA,GAclC,CAdkC,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GAAA,GAe/B,CAf+B,IAe1B,SAf0B,CAehB,CAfgB,CAAA,EAAA,GAgBlC,CAhBkC,CAAA;KAoBnC,SAnBY,CAAA,UAAA,MAAA,CAAA,GAmBkB,SAnBlB,CAoBf,CApBe,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GAAA,GAqBR,CArBQ,IAqBH,SArBG,CAqBO,CArBP,CAAA,EAAA,GAsBX,CAtBW,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GAAA,GAuBR,CAvBQ,IAuBH,SAvBG,CAuBO,CAvBP,CAAA,EAAA,GAwBX,CAxBW,CAAA;KA4BZ,gBA5BE,CAAA,UAAA,MAAA,CAAA,GA4BmC,CA5BnC,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GAAA,GA6BA,CA7BA,GA6BI,gBA7BJ,CA6BqB,CA7BrB,CAAA,EAAA,GA8BH,CA9BG,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GAAA,GA+BA,CA/BA,GA+BI,gBA/BJ,CA+BqB,CA/BrB,CAAA,EAAA,GAgCH,CAhCG,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,EAAA,EAAA,GAAA,GAiCA,CAjCA,GAiCI,gBAjCJ,CAiCqB,CAjCrB,CAAA,EAAA,GAkCH,CAlCG;KAqCF,SArCyB,CAAA,UAAA,MAAA,CAAA,GAqCK,UArCL,CAqCgB,SArChB,CAqC0B,CArC1B,CAAA,CAAA;KAwCzB,YAxCiB,CAAA,UAAA,MAAA,CAAA,GAwCgB,UAxChB,CAwC2B,SAxC3B,CAwCqC,CAxCrC,CAAA,CAAA;AAClB,KAwCQ,YAxCR,CAAA,UAAA,MAAA,EAAA,UA0CQ,UA1CR,CAAA,GA2CA,CA3CA,SAAA,OAAA,GA4CA,SA5CA,CA4CU,CA5CV,CAAA,GA6CA,CA7CA,SAAA,OAAA,GA8CA,SA9CA,CA8CU,CA9CV,CAAA,GA+CA,CA/CA,SAAA,OAAA,GAgDA,YAhDA,CAgDa,SAhDb,CAgDuB,CAhDvB,CAAA,CAAA,GAiDA,CAjDA,SAAA,QAAA,GAkDA,SAlDA,CAkDU,CAlDV,CAAA,GAmDA,CAnDA,SAAA,OAAA,GAoDA,SApDA,CAoDU,CApDV,CAAA,GAqDA,CArDA,SAAA,iBAAA,GAsDA,SAtDA,CAsDU,SAtDV,CAsDoB,CAtDpB,CAAA,CAAA,GAuDA,CAvDA,SAAA,OAAA,GAwDA,SAxDA,CAwDU,CAxDV,CAAA,GAyDA,CAzDA,SAAA,MAAA,GA0DA,gBA1DA,CA0DiB,SA1DjB,CA0D2B,CA1D3B,CAAA,CAAA,GA2DA,CA3DA,SAAA,OAAA,GA4DA,SA5DA,CA4DU,CA5DV,CAAA,GA6DA,CA7DA,SAAA,UAAA,GA8DA,YA9DA,CA8Da,CA9Db,CAAA,GA+DA,CA/DA;AAAC,KAgEO,kBAhEP,CAAA,UAAA,MAAA,EAAA,gBAkEa,UAlEb,CAAA,GAmED,MAnEC,CAAA,QAEO,MAkEE,CAlEF,IAkEO,CAlEO,SAAA,MAAA,GAkEY,YAlEZ,CAkEyB,CAlEzB,EAkE4B,OAlE5B,CAAA,GAkEuC,CAlEvC,GAkE2C,CAlE3C,CAkE6C,CAlE7C,CAAA,EAAqB,CAAA;AAC9B,cAoEJ,YApEI,EAAA,SAAA,CAAA,UAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,OAAA,EAAA,QAAA,EAAA,OAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,OAAA,CAAA;AAAV,KAiFK,aAAA,GAjFL,OAiF4B,cAjF5B;AAAuB,cAkFjB,cAlFiB,EAkFD,gBAlFC,CAkFgB,UAlFhB,EAAA,OAAA,CAAA;;;;AACxB;AAEuC;;;AAKrB,iBAoFR,YApFQ,CAAA,eAAA,MAAA,EAAA,cAoF0C,UApF1C,CAAA,CAAA,KAAA,EAqFf,MArFe,EAAA,IAAA,EAsFhB,KAtFgB,CAAA,EAuFrB,YAvFqB,CAuFR,MAvFQ,EAuFA,KAvFA,CAAA;AAAV,iBAsJE,KAAA,CAtJF,GAAA,EAAA,MAAA,EAAA,SAAA,CAAA,EAAA,GAAA,GAAA,GAAA,CAAA,EAAA,MAAA;AACR,iBAqKU,aAAA,CArKV,KAAA,EAAA,OAAA,CAAA,EAAA,KAAA,IAqKkD,UArKlD;;;;;;;AAHsC;;;AAWpB,iBA2LR,aA3LQ,CAAA,gBA2LsB,UA3LtB,CAAA,CAAA,KAAA,EA4Lf,OA5Le,GAAA,SAAA,EAAA,QAAA,CAAA,EA6LZ,UA7LY,CAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"casing.d.cts","names":[],"sources":["../../src/utils/casing.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/utils/casing.d.mts
CHANGED
|
@@ -34,7 +34,7 @@ declare function isCasingValid(value: unknown): value is CasingType;
|
|
|
34
34
|
* @param fallback An optional fallback value if {@linkcode input} is `undefined`.
|
|
35
35
|
* @returns The {@linkcode input} or {@linkcode fallback} if {@linkcode input} is `undefined` or an {@linkcode isCasingValid invalid} {@linkcode CasingType}.
|
|
36
36
|
*/
|
|
37
|
-
declare function setCasingType<TCasing extends CasingType>(input: TCasing | undefined, fallback?: CasingType): "
|
|
37
|
+
declare function setCasingType<TCasing extends CasingType>(input: TCasing | undefined, fallback?: CasingType): "sentence" | "title" | "camel" | "lower" | "upper" | "pascal" | "snake" | "screaming-snake" | "flat" | "kebab";
|
|
38
38
|
//#endregion
|
|
39
39
|
export { CASING_TYPES, CapitalizeWord, CasingType, ChangeCasing, ChangeObjectCasing, DEFAULT_CASING, DefaultCasing, ToLower, changeCasing, isCasingValid, quote, setCasingType };
|
|
40
40
|
//# sourceMappingURL=casing.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"casing.d.mts","names":[],"sources":["../../src/utils/casing.ts"],"sourcesContent":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"casing.d.mts","names":[],"sources":["../../src/utils/casing.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/utils/path.cjs
CHANGED
|
@@ -263,7 +263,12 @@ let path;
|
|
|
263
263
|
if (paths.length === 1) {
|
|
264
264
|
const [path$1] = paths;
|
|
265
265
|
const missingData = pickBy(obj, ...paths);
|
|
266
|
-
|
|
266
|
+
const setPath = getPathThatMatter(path$1);
|
|
267
|
+
if (setPath === "") {
|
|
268
|
+
if (missingData !== null && missingData !== void 0 && typeof missingData === "object") return missingData;
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
return setBy(value, setPath, missingData);
|
|
267
272
|
}
|
|
268
273
|
if (paths.length > 1) {
|
|
269
274
|
let resolvedValue = {};
|
|
@@ -294,6 +299,63 @@ let path;
|
|
|
294
299
|
}
|
|
295
300
|
}
|
|
296
301
|
_path.joinAtPath = joinAtPath;
|
|
302
|
+
/**
|
|
303
|
+
* Check if an array contains objects (not primitives)
|
|
304
|
+
*/
|
|
305
|
+
function isArrayOfObjects(arr) {
|
|
306
|
+
return arr.length > 0 && arr.every((item) => item !== null && typeof item === "object" && !Array.isArray(item));
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Merge two array elements, handling objects recursively
|
|
310
|
+
* sourceItem is the new value, targetItem is the original (missing data)
|
|
311
|
+
* We want to preserve targetItem properties and let sourceItem override
|
|
312
|
+
*/
|
|
313
|
+
function mergeArrayElement(sourceItem, targetItem) {
|
|
314
|
+
if (targetItem === void 0) return sourceItem;
|
|
315
|
+
if (sourceItem !== null && typeof sourceItem === "object" && !Array.isArray(sourceItem) && targetItem !== null && typeof targetItem === "object" && !Array.isArray(targetItem)) return mergeObjects(sourceItem, targetItem);
|
|
316
|
+
return sourceItem;
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Deep merge two objects recursively
|
|
320
|
+
* Target (original/missing data) is the base, source (new value) overrides
|
|
321
|
+
*/
|
|
322
|
+
function mergeObjects(source, target) {
|
|
323
|
+
const result = { ...target };
|
|
324
|
+
for (const key in source) if (key in result) result[key] = deepMergePreserveType(source[key], result[key]);
|
|
325
|
+
else result[key] = source[key];
|
|
326
|
+
return result;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Deep merge two values while preserving their structure.
|
|
330
|
+
* - Arrays:
|
|
331
|
+
* - If both are arrays of objects: merge element-wise
|
|
332
|
+
* - If both are arrays of primitives: use source (replacement)
|
|
333
|
+
* - Otherwise: use source
|
|
334
|
+
* - Objects: deep merge nested properties
|
|
335
|
+
* - Primitives: use source value
|
|
336
|
+
*/
|
|
337
|
+
function deepMergePreserveType(source, target) {
|
|
338
|
+
if (target === void 0 || target === null) return source;
|
|
339
|
+
if (Array.isArray(source)) {
|
|
340
|
+
if (Array.isArray(target)) {
|
|
341
|
+
const sourceArr = source;
|
|
342
|
+
const targetArr = target;
|
|
343
|
+
if (isArrayOfObjects(sourceArr) && isArrayOfObjects(targetArr)) return sourceArr.map((item, index) => {
|
|
344
|
+
const targetItem = targetArr[index];
|
|
345
|
+
if (targetItem !== void 0) return mergeArrayElement(item, targetItem);
|
|
346
|
+
return item;
|
|
347
|
+
});
|
|
348
|
+
if (sourceArr.length === 0) return source;
|
|
349
|
+
return [...targetArr, ...sourceArr];
|
|
350
|
+
}
|
|
351
|
+
return source;
|
|
352
|
+
}
|
|
353
|
+
if (source !== null && typeof source === "object") {
|
|
354
|
+
if (target !== null && typeof target === "object" && !Array.isArray(target)) return mergeObjects(source, target);
|
|
355
|
+
return source;
|
|
356
|
+
}
|
|
357
|
+
return source;
|
|
358
|
+
}
|
|
297
359
|
function updateAt(options) {
|
|
298
360
|
const { obj, partial, paths, value } = options;
|
|
299
361
|
const norm = normalizePaths(...paths);
|
|
@@ -301,11 +363,25 @@ let path;
|
|
|
301
363
|
let result = obj;
|
|
302
364
|
let resolvedValue = value;
|
|
303
365
|
if (partial) {
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
366
|
+
let missingData = joinAtPath(findMissingPaths(obj, paths, value), obj, resolvedValue);
|
|
367
|
+
if (missingData === void 0 || typeof missingData === "object" && missingData !== null && Object.keys(missingData).length === 0) {
|
|
368
|
+
if (norm.length === 1) {
|
|
369
|
+
const originalValue = getBy(obj, norm[0]);
|
|
370
|
+
if (originalValue !== void 0) {
|
|
371
|
+
if (Array.isArray(originalValue) && Array.isArray(resolvedValue)) {
|
|
372
|
+
if (resolvedValue.length > 0) missingData = originalValue;
|
|
373
|
+
} else if (originalValue !== null && typeof originalValue === "object" && !Array.isArray(originalValue) && resolvedValue !== null && typeof resolvedValue === "object" && !Array.isArray(resolvedValue)) missingData = originalValue;
|
|
374
|
+
}
|
|
375
|
+
} else if (norm.length > 1) {
|
|
376
|
+
const originalData = {};
|
|
377
|
+
for (const p of norm) {
|
|
378
|
+
const originalValue = getBy(obj, p);
|
|
379
|
+
if (originalValue !== void 0) setBy(originalData, p, originalValue);
|
|
380
|
+
}
|
|
381
|
+
if (Object.keys(originalData).length > 0) missingData = originalData;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
resolvedValue = deepMergePreserveType(resolvedValue, missingData);
|
|
309
385
|
}
|
|
310
386
|
if (norm.length === 1) {
|
|
311
387
|
const path$1 = norm[0];
|
|
@@ -313,7 +389,7 @@ let path;
|
|
|
313
389
|
return result;
|
|
314
390
|
}
|
|
315
391
|
for (const path$1 of norm) {
|
|
316
|
-
const sub = getBy(
|
|
392
|
+
const sub = getBy(resolvedValue, path$1);
|
|
317
393
|
result = setAtImmutable(result, path$1, sub);
|
|
318
394
|
}
|
|
319
395
|
return result;
|
package/dist/utils/path.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.cjs","names":["path","finalPaths: string[]","result: Record<string, unknown>","paths: string[]","parts: string[]","m: RegExpExecArray | null","node: any","lastFn: ExpectedTransformFn | undefined","mismatches: Mismatch[]","lines: string[]","clone","keys: string[]"],"sources":["../../src/utils/path.ts"],"sourcesContent":["import type { DeepKeys, unionHelpers } from './types';\n\nexport namespace path {\n type getBy<T, TPath extends string> = TPath extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? getBy<T[K], Rest>\n : never\n : TPath extends keyof T\n ? T[TPath]\n : never;\n\n type buildFromPath<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? { [Key in K]: buildFromPath<getBy<T, K>, Rest> }\n : P extends keyof T\n ? { [Key in P]: T[P] }\n : never;\n\n /**\n * Does P have any ancestor path in All? (i.e. some Q in All such that Q is a\n * strict prefix of P)\n */\n type hasAncestor<P extends string, All extends string> = true extends (\n All extends string\n ? All extends P\n ? false // same path, not an ancestor\n : P extends `${All}.${string}`\n ? true\n : false\n : never\n )\n ? true\n : false;\n\n /**\n * Normalize a union of paths by removing those that have an ancestor path\n * also in the union.\n *\n * Example:\n * NormalizePaths<'foo.bar.baz' | 'foo.bar'> -> 'foo.bar'\n * NormalizePaths<'foo.bar' | 'other'> -> 'foo.bar' | 'other'\n */\n type normalize<\n Paths extends string,\n All extends string = Paths\n > = Paths extends string\n ? hasAncestor<Paths, All> extends true\n ? never\n : Paths\n : never;\n\n // helper to distribute BuildFromPath over union\n type distributeAndBuild<T, Paths extends string> = Paths extends unknown\n ? buildFromPath<T, Paths>\n : never;\n\n export type generateObjectConfig<T> = {\n [K in keyof T]: T[K] extends object\n ? // K's value is an object: allow stopping at K, or going deeper\n { [P in K]: true } | { [P in K]: generateObjectConfig<T[K]> }\n : // K's value is not object: can only stop at K\n { [P in K]: true };\n }[keyof T];\n export type objectToPath<O> = {\n [K in keyof O]: O[K] extends true\n ? K & string\n : O[K] extends object\n ? `${K & string}.${objectToPath<O[K]>}`\n : never;\n }[keyof O];\n\n /**\n * Pick by paths:\n * - Normalize the paths (remove descendants when parent also present)\n * - If only one normalized path:\n * return GetByPath<T, P> (relative type)\n * - If multiple:\n * intersect root-built shapes for each normalized path\n *\n * @example\n * ```ts\n * type User = {\n * foo: {\n * bar: {\n * baz: number;\n * qux: string;\n * };\n * };\n * other: string;\n * };\n *\n * type Test1 = PickByPaths<User, 'foo.bar'>;\n * // { baz: number; qux: string } ✅ relative object at foo.bar\n *\n * type Test2 = PickByPaths<User, 'foo.bar.baz'>;\n * // number ✅ leaf type\n *\n * type Test3 = PickByPaths<User, 'foo.bar' | 'other'>;\n * // { foo: { bar: { baz: number; qux: string } } } & { other: string } ✅\n *\n * type Test4 = PickByPaths<User, 'foo.bar.baz' | 'foo.bar' | 'other'>;\n * // { baz: number; qux: string } ✅ parent 'foo.bar' wins, relative\n * ```\n */\n export type pickBy<\n T,\n Paths extends DeepKeys<T>\n > = normalize<Paths> extends infer normalized extends string\n ? unionHelpers.is<normalized> extends true\n ? unionHelpers.toIntersection<distributeAndBuild<T, normalized>>\n : getBy<T, normalized>\n : never;\n\n function getBy(obj: any, path: string): any {\n return path\n .split('.')\n .reduce((acc, key) => (acc == null ? undefined : acc[key]), obj);\n }\n export function setBy<\n def extends Record<string, unknown>,\n path extends DeepKeys<def>\n >(target: def, path: path, value: unknown) {\n const keys = path.split('.');\n let current = target;\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n if (i === keys.length - 1) {\n // last key -> assign/merge\n if (\n current[k] !== undefined &&\n typeof current[k] === 'object' &&\n typeof value === 'object' &&\n value !== null\n ) {\n Object.assign(current[k] as Record<string, unknown>, value);\n } else {\n (current[k] as any) = value;\n }\n } else {\n if (typeof current[k] !== 'object' || current[k] === null) {\n (current[k] as any) = {};\n }\n (current as any) = current[k];\n }\n }\n\n return current;\n }\n\n // Runtime: normalize paths (drop descendants when ancestor exists)\n export function normalizePaths(...paths: string[]) {\n // Sort by depth (deepest first), so longer paths come before their parents.\n const sorted = [...paths].sort(\n (a, b) => b.split('.').length - a.split('.').length\n );\n\n const finalPaths: string[] = [];\n\n for (const path of sorted) {\n // If the path is contained inside another selected deeper path, skip it\n const isCovered = finalPaths.some((p) => p.startsWith(path + '.'));\n\n if (!isCovered) {\n finalPaths.push(path);\n }\n }\n\n // The order may not matter, but returning in shallow-to-deep order feels natural.\n return finalPaths.reverse();\n }\n\n /**\n * pickByPaths:\n * - paths can be a union of string literals\n * - return type is PickByPaths<T, Paths>\n */\n export function pickBy<def, paths extends DeepKeys<def>>(\n obj: def,\n ...paths: paths[]\n ): pickBy<def, paths> {\n const norm = normalizePaths(...paths);\n\n // Single normalized path -> return relative value at that path\n if (norm.length === 1) {\n return getBy(obj, norm[0]) as pickBy<def, paths>;\n }\n\n // Multiple normalized paths -> build root-based object and intersect\n const result: Record<string, unknown> = {};\n\n for (const p of norm) {\n const value = getBy(obj, p);\n\n setBy(result, p, value);\n }\n\n return result as pickBy<def, paths>;\n }\n\n /**\n * Creates an array of all deep paths in an object.\n * Recursively traverses the object and returns all possible dot-separated paths.\n *\n * @example\n * ```ts\n * const obj = {\n * foo: {\n * bar: {\n * baz: 1,\n * qux: 2\n * }\n * },\n * other: 'value'\n * };\n *\n * createPaths(obj);\n * // ['foo', 'foo.bar', 'foo.bar.baz', 'foo.bar.qux', 'other']\n * ```\n */\n export function createDeep<T>(obj: T): DeepKeys<T>[] {\n const paths: string[] = [];\n\n function traverse(current: any, prefix: string = ''): void {\n if (current === null || current === undefined) {\n return;\n }\n\n if (typeof current !== 'object' || Array.isArray(current)) {\n return;\n }\n\n const keys = Object.keys(current);\n for (const key of keys) {\n const path = prefix ? `${prefix}.${key}` : key;\n paths.push(path);\n\n const value = current[key];\n if (\n value !== null &&\n value !== undefined &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n traverse(value, path);\n }\n }\n }\n\n traverse(obj);\n return paths as DeepKeys<T>[];\n }\n\n export type MismatchReason =\n | 'value-mismatch'\n | 'type-mismatch'\n | 'missing-key'\n | 'extra-key';\n export interface Mismatch {\n path: string;\n expected: unknown;\n actual: unknown;\n reason: MismatchReason;\n }\n\n export interface CompareResult {\n ok: boolean;\n mismatches: Mismatch[];\n }\n type ExpectedTransformFn<TValue = unknown> = (\n value: TValue,\n path: string\n ) => unknown;\n /**\n * Transform config:\n * - a single function: applies to the whole T\n * - or an object shaped like T, where values are either:\n * - functions (apply at/under that node)\n * - nested objects continuing the shape\n */\n export type ExpectedTransformConfig<T, V = unknown> =\n | ExpectedTransformFn<V>\n | { [K in keyof T]?: ExpectedTransformConfig<T[K], T[K]> };\n export interface EqualsOptions<T> {\n /**\n * How to transform the \"expected\" field in mismatches.\n * If omitted, a default type-ish formatting is used.\n */\n transformExpected?: ExpectedTransformConfig<T>;\n }\n interface DeepCompareOptions<T> {\n includeValueMismatch?: boolean;\n\n transformExpected?: ExpectedTransformConfig<T>;\n }\n\n function defaultExpectedFormat(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'Array';\n const t = typeof value;\n if (t !== 'object') return t; // 'string', 'number', etc.\n const ctor = (value as any)?.constructor?.name;\n return ctor && ctor !== 'Object' ? ctor : 'object';\n }\n\n function splitPath(path: string): string[] {\n if (!path) return [];\n const parts: string[] = [];\n const regex = /[^.[\\]]+|\\[(\\d+)\\]/g;\n let m: RegExpExecArray | null;\n while ((m = regex.exec(path))) {\n parts.push(m[1] ?? m[0]);\n }\n return parts;\n }\n\n function getTransformFunction<T>(\n root: ExpectedTransformConfig<T> | undefined,\n path: string\n ): ExpectedTransformFn | undefined {\n if (!root) return undefined;\n\n if (typeof root === 'function') {\n // TS now knows this is ExpectedTransformFn, but we can be explicit:\n return root as ExpectedTransformFn;\n }\n\n const segments = splitPath(path);\n let node: any = root;\n let lastFn: ExpectedTransformFn | undefined;\n\n for (const seg of segments) {\n if (!node) break;\n\n if (typeof node === 'function') {\n lastFn = node as ExpectedTransformFn;\n break;\n }\n\n node = node[seg];\n\n if (typeof node === 'function') {\n lastFn = node as ExpectedTransformFn;\n break;\n }\n }\n\n return lastFn;\n }\n\n function formatExpected<T>(\n rawExpected: unknown,\n path: string,\n cfg: ExpectedTransformConfig<T> | undefined\n ): unknown {\n const fn = getTransformFunction(cfg, path);\n if (fn) return fn(rawExpected, path);\n return defaultExpectedFormat(rawExpected);\n }\n\n function isObjectLike(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null;\n }\n\n function deepCompare<T>(\n expected: unknown,\n actual: unknown,\n basePath: string,\n mismatches: Mismatch[],\n options: DeepCompareOptions<T>\n ): Mismatch[] {\n // identical (covers primitives + same-ref objects)\n if (expected === actual) {\n return mismatches;\n }\n\n // one is null/undefined OR types not object-like -> primitive / scalar mismatch\n if (\n expected === null ||\n actual === null ||\n typeof expected !== 'object' ||\n typeof actual !== 'object'\n ) {\n const path = basePath || '(root)';\n\n if (typeof expected !== typeof actual) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n return mismatches;\n }\n\n if (options.includeValueMismatch) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'value-mismatch',\n });\n }\n\n return mismatches;\n }\n\n // arrays\n if (Array.isArray(expected) || Array.isArray(actual)) {\n if (!Array.isArray(expected) || !Array.isArray(actual)) {\n const path = basePath || '(root)';\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n return mismatches;\n }\n\n // Both values are arrays.\n // We *do* compare element structure/types where both have an index, but we\n // intentionally ignore length differences (no missing/extra index errors).\n const maxLen = expected.length;\n\n for (let i = 0; i < maxLen; i++) {\n const expVal = expected[i];\n const actVal = actual[i];\n const path = basePath === '' ? `[${i}]` : `${basePath}[${i}]`;\n\n deepCompare(expVal, actVal, path, mismatches, options);\n }\n\n return mismatches;\n }\n\n // plain objects\n if (isObjectLike(expected) && isObjectLike(actual)) {\n const expKeys = Object.keys(expected);\n const actKeys = Object.keys(actual);\n\n for (const key of expKeys) {\n const expVal = (expected as any)[key];\n const actVal = (actual as any)[key];\n const path = basePath ? `${basePath}.${key}` : key;\n\n if (!(key in actual)) {\n mismatches.push({\n path,\n expected: formatExpected(expVal, path, options.transformExpected),\n actual: undefined,\n reason: 'missing-key',\n });\n continue;\n }\n\n deepCompare(expVal, actVal, path, mismatches, options);\n }\n\n for (const key of actKeys) {\n if (!(key in expected)) {\n const path = basePath ? `${basePath}.${key}` : key;\n mismatches.push({\n path,\n expected: undefined,\n actual: (actual as any)[key],\n reason: 'extra-key',\n });\n }\n }\n\n return mismatches;\n }\n\n const path = basePath || '(root)';\n if (typeof expected !== typeof actual) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n } else if (options.includeValueMismatch) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'value-mismatch',\n });\n }\n\n return mismatches;\n }\n\n export function equalsAtPaths<def, paths extends DeepKeys<def>>(\n obj: def,\n paths: paths[],\n actual: pickBy<def, paths>,\n options?: EqualsOptions<def>\n ): CompareResult {\n // expected comes from obj at the given paths\n const expected = pickBy<def, paths>(obj, ...paths);\n\n const mismatches: Mismatch[] = [];\n\n const basePath = paths.length === 1 ? (paths[0] as string) : '';\n\n deepCompare<def>(expected, actual, basePath, mismatches, {\n transformExpected: options?.transformExpected,\n });\n\n return {\n ok: mismatches.length === 0,\n mismatches,\n };\n }\n\n function formatValue(v: unknown): string {\n if (v === undefined) return 'undefined';\n if (typeof v === 'string') return JSON.stringify(v); // add quotes\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n }\n\n function formatReason(m: Mismatch): string {\n switch (m.reason) {\n case 'missing-key':\n return 'Missing key';\n case 'extra-key':\n return 'Extra key';\n case 'type-mismatch':\n return 'Type mismatch';\n case 'value-mismatch':\n return 'Value mismatch';\n default:\n return m.reason;\n }\n }\n\n /**\n * Turn a CompareResult into a pretty error string.\n */\n export function formatMismatches(result: CompareResult) {\n if (result.ok || result.mismatches.length === 0) {\n return 'No mismatches.';\n }\n\n const lines: string[] = [];\n\n for (const m of result.mismatches) {\n lines.push(\n `\\n● ${formatReason(m)} at \"${m.path}\":`,\n ` expected: ${formatValue(m.expected)}`,\n ` actual: ${formatValue(m.actual)}`,\n '' // blank line between entries\n );\n }\n\n // trim trailing blank line\n if (lines.at(-1) === '') {\n lines.pop();\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Convenience: log to console.error.\n */\n export function printMismatches(result: CompareResult): void {\n const msg = formatMismatches(result);\n if (msg !== 'No mismatches.') {\n console.error(msg);\n }\n }\n\n function setAtImmutable<\n T extends Record<string, unknown>,\n path extends DeepKeys<T>\n >(root: T, path: path, value: pickBy<T, path>) {\n const keys = path.split('.');\n\n function helper(current: T, idx: number): any {\n const key = keys[idx];\n const resolvedCurrent = Array.isArray(current)\n ? [...current]\n : { ...current };\n\n if (idx === keys.length - 1) {\n let clone =\n current && typeof current === 'object' ? resolvedCurrent : {};\n\n clone = {\n ...clone,\n [key]: value,\n };\n\n return clone;\n }\n\n const next =\n current && typeof current === 'object' ? current[key] : undefined;\n\n const updatedChild = helper((next as T) ?? ({} as T), idx + 1);\n\n let clone = current && typeof current === 'object' ? resolvedCurrent : {};\n\n clone = {\n ...clone,\n [key]: updatedChild,\n };\n\n return clone;\n }\n\n return helper(root, 0);\n }\n\n export function findMissingPaths<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(obj: obj, paths: Array<path>, actual: pickBy<obj, path>) {\n const keys: string[] = [];\n\n for (const path of paths) {\n const value = pickBy(obj, path);\n const expectedKeys = createDeep(value);\n const actualKeys = createDeep(actual);\n const missingKeys = expectedKeys\n .filter((key) => !actualKeys.includes(key))\n .map((key) => `${path}.${key}`);\n\n keys.push(...missingKeys);\n }\n\n return keys as Array<DeepKeys<obj>>;\n }\n\n export type updateAtOptions<\n T extends Record<string, unknown>,\n path extends DeepKeys<T>\n > = {\n obj: T;\n paths: Array<path>;\n value: pickBy<T, path>;\n partial?: boolean;\n };\n\n function getPathThatMatter(path: string) {\n // Only works when updating a `defaultValue`\n // TODO make this work with the entire object - will need to figure out some way to normalize\n const [, ...rest] = path.split('.defaultValue.');\n\n return rest.join('.');\n }\n\n export function joinAtPath<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(paths: Array<path>, obj: obj, value: pickBy<obj, path>) {\n if (paths.length === 1) {\n const [path] = paths;\n const missingData = pickBy(obj, ...paths);\n const setPath = getPathThatMatter(path);\n\n // if (last) {\n // const data = setBy(\n // value as Record<string, unknown>,\n // last,\n // missingData\n // ) as pickBy<obj, path>;\n\n // return data;\n // }\n\n const data = setBy(\n value as Record<string, unknown>,\n setPath,\n missingData\n ) as pickBy<obj, path>;\n\n return data;\n }\n\n if (paths.length > 1) {\n let resolvedValue = {} as Record<string, unknown>;\n\n for (const path of paths) {\n const pathThatMatters = getPathThatMatter(path);\n const missing = joinAtPath([path], obj, value);\n const valueAtPathThatMatters = getBy(obj, path);\n\n // This check is here to ensure `resolvedValue` will only have\n // nested properties where they belong.\n if (\n Object.keys(resolvedValue).length > 0 &&\n valueAtPathThatMatters !== 'undefined'\n ) {\n const dataAtPath = pickBy(obj, path);\n const [key] = pathThatMatters.split('.');\n\n if (typeof dataAtPath === 'object') {\n if (missing) {\n resolvedValue = {\n ...resolvedValue,\n [key]: {\n ...(resolvedValue[key] as Record<string, unknown>),\n ...missing,\n },\n };\n }\n }\n\n continue;\n }\n\n if (missing) {\n resolvedValue = {\n ...resolvedValue,\n ...missing,\n };\n }\n }\n\n return resolvedValue as pickBy<obj, path>;\n }\n }\n\n export function updateAt<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(options: updateAtOptions<obj, path>) {\n const { obj, partial, paths, value } = options;\n const norm = normalizePaths(...paths);\n if (norm.length === 0) return obj;\n\n let result = obj;\n let resolvedValue = value;\n\n if (partial) {\n const missingPaths = findMissingPaths(obj, paths, value);\n\n const missingData = joinAtPath(\n missingPaths as Array<path>,\n obj,\n resolvedValue\n );\n\n resolvedValue = {\n ...(resolvedValue as Record<string, unknown>),\n ...(missingData as Record<string, unknown>),\n } as pickBy<obj, path>;\n }\n\n if (norm.length === 1) {\n // single path: value is relative at that path\n const path = norm[0] as DeepKeys<obj>;\n\n result = setAtImmutable(result, path, resolvedValue as never);\n\n return result;\n }\n\n // multiple paths:\n // value is the root-shaped object that contains all those paths\n for (const path of norm) {\n const sub = getBy(value, path);\n\n result = setAtImmutable(result, path as DeepKeys<obj>, sub);\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"path.cjs","names":["path","finalPaths: string[]","result: Record<string, unknown>","paths: string[]","parts: string[]","m: RegExpExecArray | null","node: any","lastFn: ExpectedTransformFn | undefined","mismatches: Mismatch[]","lines: string[]","clone","keys: string[]","originalData: Record<string, unknown>"],"sources":["../../src/utils/path.ts"],"sourcesContent":["import type { DeepKeys, unionHelpers } from './types';\n\nexport namespace path {\n type getBy<T, TPath extends string> = TPath extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? getBy<T[K], Rest>\n : never\n : TPath extends keyof T\n ? T[TPath]\n : never;\n\n type buildFromPath<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? { [Key in K]: buildFromPath<getBy<T, K>, Rest> }\n : P extends keyof T\n ? { [Key in P]: T[P] }\n : never;\n\n /**\n * Does P have any ancestor path in All? (i.e. some Q in All such that Q is a\n * strict prefix of P)\n */\n type hasAncestor<P extends string, All extends string> = true extends (\n All extends string\n ? All extends P\n ? false // same path, not an ancestor\n : P extends `${All}.${string}`\n ? true\n : false\n : never\n )\n ? true\n : false;\n\n /**\n * Normalize a union of paths by removing those that have an ancestor path\n * also in the union.\n *\n * Example:\n * NormalizePaths<'foo.bar.baz' | 'foo.bar'> -> 'foo.bar'\n * NormalizePaths<'foo.bar' | 'other'> -> 'foo.bar' | 'other'\n */\n type normalize<\n Paths extends string,\n All extends string = Paths\n > = Paths extends string\n ? hasAncestor<Paths, All> extends true\n ? never\n : Paths\n : never;\n\n // helper to distribute BuildFromPath over union\n type distributeAndBuild<T, Paths extends string> = Paths extends unknown\n ? buildFromPath<T, Paths>\n : never;\n\n export type generateObjectConfig<T> = {\n [K in keyof T]: T[K] extends object\n ? // K's value is an object: allow stopping at K, or going deeper\n { [P in K]: true } | { [P in K]: generateObjectConfig<T[K]> }\n : // K's value is not object: can only stop at K\n { [P in K]: true };\n }[keyof T];\n export type objectToPath<O> = {\n [K in keyof O]: O[K] extends true\n ? K & string\n : O[K] extends object\n ? `${K & string}.${objectToPath<O[K]>}`\n : never;\n }[keyof O];\n\n /**\n * Pick by paths:\n * - Normalize the paths (remove descendants when parent also present)\n * - If only one normalized path:\n * return GetByPath<T, P> (relative type)\n * - If multiple:\n * intersect root-built shapes for each normalized path\n *\n * @example\n * ```ts\n * type User = {\n * foo: {\n * bar: {\n * baz: number;\n * qux: string;\n * };\n * };\n * other: string;\n * };\n *\n * type Test1 = PickByPaths<User, 'foo.bar'>;\n * // { baz: number; qux: string } ✅ relative object at foo.bar\n *\n * type Test2 = PickByPaths<User, 'foo.bar.baz'>;\n * // number ✅ leaf type\n *\n * type Test3 = PickByPaths<User, 'foo.bar' | 'other'>;\n * // { foo: { bar: { baz: number; qux: string } } } & { other: string } ✅\n *\n * type Test4 = PickByPaths<User, 'foo.bar.baz' | 'foo.bar' | 'other'>;\n * // { baz: number; qux: string } ✅ parent 'foo.bar' wins, relative\n * ```\n */\n export type pickBy<\n T,\n Paths extends DeepKeys<T>\n > = normalize<Paths> extends infer normalized extends string\n ? unionHelpers.is<normalized> extends true\n ? unionHelpers.toIntersection<distributeAndBuild<T, normalized>>\n : getBy<T, normalized>\n : never;\n\n function getBy(obj: any, path: string): any {\n return path\n .split('.')\n .reduce((acc, key) => (acc == null ? undefined : acc[key]), obj);\n }\n export function setBy<\n def extends Record<string, unknown>,\n path extends DeepKeys<def>\n >(target: def, path: path, value: unknown) {\n const keys = path.split('.');\n let current = target;\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n if (i === keys.length - 1) {\n // last key -> assign/merge\n if (\n current[k] !== undefined &&\n typeof current[k] === 'object' &&\n typeof value === 'object' &&\n value !== null\n ) {\n Object.assign(current[k] as Record<string, unknown>, value);\n } else {\n (current[k] as any) = value;\n }\n } else {\n if (typeof current[k] !== 'object' || current[k] === null) {\n (current[k] as any) = {};\n }\n (current as any) = current[k];\n }\n }\n\n return current;\n }\n\n // Runtime: normalize paths (drop descendants when ancestor exists)\n export function normalizePaths(...paths: string[]) {\n // Sort by depth (deepest first), so longer paths come before their parents.\n const sorted = [...paths].sort(\n (a, b) => b.split('.').length - a.split('.').length\n );\n\n const finalPaths: string[] = [];\n\n for (const path of sorted) {\n // If the path is contained inside another selected deeper path, skip it\n const isCovered = finalPaths.some((p) => p.startsWith(path + '.'));\n\n if (!isCovered) {\n finalPaths.push(path);\n }\n }\n\n // The order may not matter, but returning in shallow-to-deep order feels natural.\n return finalPaths.reverse();\n }\n\n /**\n * pickByPaths:\n * - paths can be a union of string literals\n * - return type is PickByPaths<T, Paths>\n */\n export function pickBy<def, paths extends DeepKeys<def>>(\n obj: def,\n ...paths: paths[]\n ): pickBy<def, paths> {\n const norm = normalizePaths(...paths);\n\n // Single normalized path -> return relative value at that path\n if (norm.length === 1) {\n return getBy(obj, norm[0]) as pickBy<def, paths>;\n }\n\n // Multiple normalized paths -> build root-based object and intersect\n const result: Record<string, unknown> = {};\n\n for (const p of norm) {\n const value = getBy(obj, p);\n\n setBy(result, p, value);\n }\n\n return result as pickBy<def, paths>;\n }\n\n /**\n * Creates an array of all deep paths in an object.\n * Recursively traverses the object and returns all possible dot-separated paths.\n *\n * @example\n * ```ts\n * const obj = {\n * foo: {\n * bar: {\n * baz: 1,\n * qux: 2\n * }\n * },\n * other: 'value'\n * };\n *\n * createPaths(obj);\n * // ['foo', 'foo.bar', 'foo.bar.baz', 'foo.bar.qux', 'other']\n * ```\n */\n export function createDeep<T>(obj: T): DeepKeys<T>[] {\n const paths: string[] = [];\n\n function traverse(current: any, prefix: string = ''): void {\n if (current === null || current === undefined) {\n return;\n }\n\n if (typeof current !== 'object' || Array.isArray(current)) {\n return;\n }\n\n const keys = Object.keys(current);\n for (const key of keys) {\n const path = prefix ? `${prefix}.${key}` : key;\n paths.push(path);\n\n const value = current[key];\n if (\n value !== null &&\n value !== undefined &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n traverse(value, path);\n }\n }\n }\n\n traverse(obj);\n return paths as DeepKeys<T>[];\n }\n\n export type MismatchReason =\n | 'value-mismatch'\n | 'type-mismatch'\n | 'missing-key'\n | 'extra-key';\n export interface Mismatch {\n path: string;\n expected: unknown;\n actual: unknown;\n reason: MismatchReason;\n }\n\n export interface CompareResult {\n ok: boolean;\n mismatches: Mismatch[];\n }\n type ExpectedTransformFn<TValue = unknown> = (\n value: TValue,\n path: string\n ) => unknown;\n /**\n * Transform config:\n * - a single function: applies to the whole T\n * - or an object shaped like T, where values are either:\n * - functions (apply at/under that node)\n * - nested objects continuing the shape\n */\n export type ExpectedTransformConfig<T, V = unknown> =\n | ExpectedTransformFn<V>\n | { [K in keyof T]?: ExpectedTransformConfig<T[K], T[K]> };\n export interface EqualsOptions<T> {\n /**\n * How to transform the \"expected\" field in mismatches.\n * If omitted, a default type-ish formatting is used.\n */\n transformExpected?: ExpectedTransformConfig<T>;\n }\n interface DeepCompareOptions<T> {\n includeValueMismatch?: boolean;\n\n transformExpected?: ExpectedTransformConfig<T>;\n }\n\n function defaultExpectedFormat(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'Array';\n const t = typeof value;\n if (t !== 'object') return t; // 'string', 'number', etc.\n const ctor = (value as any)?.constructor?.name;\n return ctor && ctor !== 'Object' ? ctor : 'object';\n }\n\n function splitPath(path: string): string[] {\n if (!path) return [];\n const parts: string[] = [];\n const regex = /[^.[\\]]+|\\[(\\d+)\\]/g;\n let m: RegExpExecArray | null;\n while ((m = regex.exec(path))) {\n parts.push(m[1] ?? m[0]);\n }\n return parts;\n }\n\n function getTransformFunction<T>(\n root: ExpectedTransformConfig<T> | undefined,\n path: string\n ): ExpectedTransformFn | undefined {\n if (!root) return undefined;\n\n if (typeof root === 'function') {\n // TS now knows this is ExpectedTransformFn, but we can be explicit:\n return root as ExpectedTransformFn;\n }\n\n const segments = splitPath(path);\n let node: any = root;\n let lastFn: ExpectedTransformFn | undefined;\n\n for (const seg of segments) {\n if (!node) break;\n\n if (typeof node === 'function') {\n lastFn = node as ExpectedTransformFn;\n break;\n }\n\n node = node[seg];\n\n if (typeof node === 'function') {\n lastFn = node as ExpectedTransformFn;\n break;\n }\n }\n\n return lastFn;\n }\n\n function formatExpected<T>(\n rawExpected: unknown,\n path: string,\n cfg: ExpectedTransformConfig<T> | undefined\n ): unknown {\n const fn = getTransformFunction(cfg, path);\n if (fn) return fn(rawExpected, path);\n return defaultExpectedFormat(rawExpected);\n }\n\n function isObjectLike(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null;\n }\n\n function deepCompare<T>(\n expected: unknown,\n actual: unknown,\n basePath: string,\n mismatches: Mismatch[],\n options: DeepCompareOptions<T>\n ): Mismatch[] {\n // identical (covers primitives + same-ref objects)\n if (expected === actual) {\n return mismatches;\n }\n\n // one is null/undefined OR types not object-like -> primitive / scalar mismatch\n if (\n expected === null ||\n actual === null ||\n typeof expected !== 'object' ||\n typeof actual !== 'object'\n ) {\n const path = basePath || '(root)';\n\n if (typeof expected !== typeof actual) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n return mismatches;\n }\n\n if (options.includeValueMismatch) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'value-mismatch',\n });\n }\n\n return mismatches;\n }\n\n // arrays\n if (Array.isArray(expected) || Array.isArray(actual)) {\n if (!Array.isArray(expected) || !Array.isArray(actual)) {\n const path = basePath || '(root)';\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n return mismatches;\n }\n\n // Both values are arrays.\n // We *do* compare element structure/types where both have an index, but we\n // intentionally ignore length differences (no missing/extra index errors).\n const maxLen = expected.length;\n\n for (let i = 0; i < maxLen; i++) {\n const expVal = expected[i];\n const actVal = actual[i];\n const path = basePath === '' ? `[${i}]` : `${basePath}[${i}]`;\n\n deepCompare(expVal, actVal, path, mismatches, options);\n }\n\n return mismatches;\n }\n\n // plain objects\n if (isObjectLike(expected) && isObjectLike(actual)) {\n const expKeys = Object.keys(expected);\n const actKeys = Object.keys(actual);\n\n for (const key of expKeys) {\n const expVal = (expected as any)[key];\n const actVal = (actual as any)[key];\n const path = basePath ? `${basePath}.${key}` : key;\n\n if (!(key in actual)) {\n mismatches.push({\n path,\n expected: formatExpected(expVal, path, options.transformExpected),\n actual: undefined,\n reason: 'missing-key',\n });\n continue;\n }\n\n deepCompare(expVal, actVal, path, mismatches, options);\n }\n\n for (const key of actKeys) {\n if (!(key in expected)) {\n const path = basePath ? `${basePath}.${key}` : key;\n mismatches.push({\n path,\n expected: undefined,\n actual: (actual as any)[key],\n reason: 'extra-key',\n });\n }\n }\n\n return mismatches;\n }\n\n const path = basePath || '(root)';\n if (typeof expected !== typeof actual) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n } else if (options.includeValueMismatch) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'value-mismatch',\n });\n }\n\n return mismatches;\n }\n\n export function equalsAtPaths<def, paths extends DeepKeys<def>>(\n obj: def,\n paths: paths[],\n actual: pickBy<def, paths>,\n options?: EqualsOptions<def>\n ): CompareResult {\n // expected comes from obj at the given paths\n const expected = pickBy<def, paths>(obj, ...paths);\n\n const mismatches: Mismatch[] = [];\n\n const basePath = paths.length === 1 ? (paths[0] as string) : '';\n\n deepCompare<def>(expected, actual, basePath, mismatches, {\n transformExpected: options?.transformExpected,\n });\n\n return {\n ok: mismatches.length === 0,\n mismatches,\n };\n }\n\n function formatValue(v: unknown): string {\n if (v === undefined) return 'undefined';\n if (typeof v === 'string') return JSON.stringify(v); // add quotes\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n }\n\n function formatReason(m: Mismatch): string {\n switch (m.reason) {\n case 'missing-key':\n return 'Missing key';\n case 'extra-key':\n return 'Extra key';\n case 'type-mismatch':\n return 'Type mismatch';\n case 'value-mismatch':\n return 'Value mismatch';\n default:\n return m.reason;\n }\n }\n\n /**\n * Turn a CompareResult into a pretty error string.\n */\n export function formatMismatches(result: CompareResult) {\n if (result.ok || result.mismatches.length === 0) {\n return 'No mismatches.';\n }\n\n const lines: string[] = [];\n\n for (const m of result.mismatches) {\n lines.push(\n `\\n● ${formatReason(m)} at \"${m.path}\":`,\n ` expected: ${formatValue(m.expected)}`,\n ` actual: ${formatValue(m.actual)}`,\n '' // blank line between entries\n );\n }\n\n // trim trailing blank line\n if (lines.at(-1) === '') {\n lines.pop();\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Convenience: log to console.error.\n */\n export function printMismatches(result: CompareResult): void {\n const msg = formatMismatches(result);\n if (msg !== 'No mismatches.') {\n console.error(msg);\n }\n }\n\n function setAtImmutable<\n T extends Record<string, unknown>,\n path extends DeepKeys<T>\n >(root: T, path: path, value: pickBy<T, path>) {\n const keys = path.split('.');\n\n function helper(current: T, idx: number): any {\n const key = keys[idx];\n const resolvedCurrent = Array.isArray(current)\n ? [...current]\n : { ...current };\n\n if (idx === keys.length - 1) {\n let clone =\n current && typeof current === 'object' ? resolvedCurrent : {};\n\n clone = {\n ...clone,\n [key]: value,\n };\n\n return clone;\n }\n\n const next =\n current && typeof current === 'object' ? current[key] : undefined;\n\n const updatedChild = helper((next as T) ?? ({} as T), idx + 1);\n\n let clone = current && typeof current === 'object' ? resolvedCurrent : {};\n\n clone = {\n ...clone,\n [key]: updatedChild,\n };\n\n return clone;\n }\n\n return helper(root, 0);\n }\n\n export function findMissingPaths<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(obj: obj, paths: Array<path>, actual: pickBy<obj, path>) {\n const keys: string[] = [];\n\n for (const path of paths) {\n const value = pickBy(obj, path);\n const expectedKeys = createDeep(value);\n const actualKeys = createDeep(actual);\n const missingKeys = expectedKeys\n .filter((key) => !actualKeys.includes(key))\n .map((key) => `${path}.${key}`);\n\n keys.push(...missingKeys);\n }\n\n return keys as Array<DeepKeys<obj>>;\n }\n\n export type updateAtOptions<\n T extends Record<string, unknown>,\n path extends DeepKeys<T>\n > = {\n obj: T;\n paths: Array<path>;\n value: pickBy<T, path>;\n partial?: boolean;\n };\n\n function getPathThatMatter(path: string) {\n // Only works when updating a `defaultValue`\n // TODO make this work with the entire object - will need to figure out some way to normalize\n const [, ...rest] = path.split('.defaultValue.');\n\n return rest.join('.');\n }\n\n export function joinAtPath<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(paths: Array<path>, obj: obj, value: pickBy<obj, path>) {\n if (paths.length === 1) {\n const [path] = paths;\n const missingData = pickBy(obj, ...paths);\n const setPath = getPathThatMatter(path);\n\n // If setPath is empty (path doesn't contain .defaultValue.),\n // return missingData directly. The merge will happen in deepMergePreserveType.\n // Calling setBy with empty path would create a \"\" key which is wrong.\n // Only return if missingData is an object/array, not a primitive\n if (setPath === '') {\n if (\n missingData !== null &&\n missingData !== undefined &&\n typeof missingData === 'object'\n ) {\n return missingData;\n }\n // If missingData is a primitive, return undefined so merge doesn't happen\n return undefined;\n }\n\n const data = setBy(\n value as Record<string, unknown>,\n setPath,\n missingData\n ) as pickBy<obj, path>;\n\n return data;\n }\n\n if (paths.length > 1) {\n let resolvedValue = {} as Record<string, unknown>;\n\n for (const path of paths) {\n const pathThatMatters = getPathThatMatter(path);\n const missing = joinAtPath([path], obj, value);\n const valueAtPathThatMatters = getBy(obj, path);\n\n // This check is here to ensure `resolvedValue` will only have\n // nested properties where they belong.\n if (\n Object.keys(resolvedValue).length > 0 &&\n valueAtPathThatMatters !== 'undefined'\n ) {\n const dataAtPath = pickBy(obj, path);\n const [key] = pathThatMatters.split('.');\n\n if (typeof dataAtPath === 'object') {\n if (missing) {\n resolvedValue = {\n ...resolvedValue,\n [key]: {\n ...(resolvedValue[key] as Record<string, unknown>),\n ...missing,\n },\n };\n }\n }\n\n continue;\n }\n\n if (missing) {\n resolvedValue = {\n ...resolvedValue,\n ...missing,\n };\n }\n }\n\n return resolvedValue as pickBy<obj, path>;\n }\n }\n\n /**\n * Check if an array contains objects (not primitives)\n */\n function isArrayOfObjects(arr: unknown[]): boolean {\n return (\n arr.length > 0 &&\n arr.every(\n (item) =>\n item !== null && typeof item === 'object' && !Array.isArray(item)\n )\n );\n }\n\n /**\n * Merge two array elements, handling objects recursively\n * sourceItem is the new value, targetItem is the original (missing data)\n * We want to preserve targetItem properties and let sourceItem override\n */\n function mergeArrayElement(\n sourceItem: unknown,\n targetItem: unknown\n ): unknown {\n if (targetItem === undefined) {\n return sourceItem;\n }\n // If both are objects (not arrays), deep merge them\n // targetItem (original) is base, sourceItem (new) overrides\n if (\n sourceItem !== null &&\n typeof sourceItem === 'object' &&\n !Array.isArray(sourceItem) &&\n targetItem !== null &&\n typeof targetItem === 'object' &&\n !Array.isArray(targetItem)\n ) {\n // Merge: target (original) is base, source (new) overrides\n return mergeObjects(\n sourceItem as Record<string, unknown>,\n targetItem as Record<string, unknown>\n );\n }\n // Otherwise, prefer source item (new value)\n return sourceItem;\n }\n\n /**\n * Deep merge two objects recursively\n * Target (original/missing data) is the base, source (new value) overrides\n */\n function mergeObjects(\n source: Record<string, unknown>,\n target: Record<string, unknown>\n ): Record<string, unknown> {\n // Start with target (original) to preserve all its properties\n const result = { ...target };\n for (const key in source) {\n if (key in result) {\n // Deep merge nested properties (target is base, source overrides)\n result[key] = deepMergePreserveType(source[key], result[key]);\n } else {\n // Add new properties from source\n result[key] = source[key];\n }\n }\n return result;\n }\n\n /**\n * Deep merge two values while preserving their structure.\n * - Arrays:\n * - If both are arrays of objects: merge element-wise\n * - If both are arrays of primitives: use source (replacement)\n * - Otherwise: use source\n * - Objects: deep merge nested properties\n * - Primitives: use source value\n */\n function deepMergePreserveType<T>(source: T, target: unknown): T {\n if (target === undefined || target === null) {\n return source;\n }\n\n if (Array.isArray(source)) {\n if (Array.isArray(target)) {\n const sourceArr = source as unknown[];\n const targetArr = target as unknown[];\n\n // If both are arrays of objects, merge element-wise\n if (isArrayOfObjects(sourceArr) && isArrayOfObjects(targetArr)) {\n // Merge element-wise: for each source item, merge with corresponding target item\n // Use the length of source array (new values take precedence)\n return sourceArr.map((item, index) => {\n const targetItem = targetArr[index];\n // If target has a corresponding item, merge them (target properties preserved, source overrides)\n if (targetItem !== undefined) {\n return mergeArrayElement(item, targetItem);\n }\n // If no target item, use source item\n return item;\n }) as T;\n }\n\n // For arrays of primitives:\n // - If source is empty, use it (replacement/clear)\n // - Otherwise, concatenate target then source (preserve original, add new)\n if (sourceArr.length === 0) {\n return source;\n }\n return [...targetArr, ...sourceArr] as T;\n }\n return source;\n }\n\n if (source !== null && typeof source === 'object') {\n if (\n target !== null &&\n typeof target === 'object' &&\n !Array.isArray(target)\n ) {\n return mergeObjects(\n source as Record<string, unknown>,\n target as Record<string, unknown>\n ) as T;\n }\n return source;\n }\n\n return source;\n }\n\n export function updateAt<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(options: updateAtOptions<obj, path>) {\n const { obj, partial, paths, value } = options;\n const norm = normalizePaths(...paths);\n if (norm.length === 0) return obj;\n\n let result = obj;\n let resolvedValue = value;\n\n if (partial) {\n const missingPaths = findMissingPaths(obj, paths, value);\n\n let missingData = joinAtPath(\n missingPaths as Array<path>,\n obj,\n resolvedValue\n );\n\n // For arrays and objects, if missingData is undefined or empty object, we need to get the original value\n // This can happen when:\n // 1. missingPaths is empty (because createDeep skips arrays)\n // 2. missingPaths has paths but joinAtPath returns undefined or {} (paths don't contain .defaultValue.)\n if (\n missingData === undefined ||\n (typeof missingData === 'object' &&\n missingData !== null &&\n Object.keys(missingData).length === 0)\n ) {\n if (norm.length === 1) {\n // Single path: get the original value at that path\n const originalValue = getBy(obj, norm[0]);\n if (originalValue !== undefined) {\n if (Array.isArray(originalValue) && Array.isArray(resolvedValue)) {\n if (resolvedValue.length > 0) {\n missingData = originalValue as pickBy<obj, path>;\n }\n } else if (\n originalValue !== null &&\n typeof originalValue === 'object' &&\n !Array.isArray(originalValue) &&\n resolvedValue !== null &&\n typeof resolvedValue === 'object' &&\n !Array.isArray(resolvedValue)\n ) {\n missingData = originalValue;\n }\n }\n } else if (norm.length > 1) {\n // Multiple paths: build an object with original values at each path\n const originalData: Record<string, unknown> = {};\n for (const p of norm) {\n const originalValue = getBy(obj, p);\n if (originalValue !== undefined) {\n // Set the value at the path in the root-shaped object\n setBy(originalData, p, originalValue);\n }\n }\n if (Object.keys(originalData).length > 0) {\n missingData = originalData as pickBy<obj, path>;\n }\n }\n }\n\n // Merge missingData into resolvedValue while preserving structure\n resolvedValue = deepMergePreserveType(resolvedValue, missingData);\n }\n\n if (norm.length === 1) {\n // single path: value is relative at that path\n const path = norm[0] as DeepKeys<obj>;\n\n result = setAtImmutable(result, path, resolvedValue as never);\n\n return result;\n }\n\n // multiple paths:\n // value is the root-shaped object that contains all those paths\n // Use resolvedValue (which has been merged with missingData if partial) instead of value\n for (const path of norm) {\n const sub = getBy(resolvedValue, path);\n\n result = setAtImmutable(result, path as DeepKeys<obj>, sub);\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.d.cts","names":[],"sources":["../../src/utils/path.ts"],"sourcesContent":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"path.d.cts","names":[],"sources":["../../src/utils/path.ts"],"sourcesContent":[],"mappings":";;;kBAEiB,IAAA;wCACuB,2DAClB,IACd,MAAM,EAAE,IAAI,gBAEd,oBAAoB,IACpB,EAAE;EANS,KAAA,aAAI,CAAA,CAAA,EAAA,UAAA,MAAA,CAAA,GASuB,CATvB,SAAA,GAAA,KAAA,EAAA,IAAA,KAAA,KAAA,EAAA,GAAA,UAUL,CATwB,GASpB,aAToB,CASN,KATM,CASA,CATA,EASG,CATH,CAAA,EASO,IATP,CAAA,EAClB,GAShB,CATgB,SAAA,MASA,CATA,GAAA,UAUN,CATF,GASM,CATN,CASQ,CATR,CAAA,EAAE,GAAA,KAAA;EAAI;;;;EAGd,KAAA,WAAA,CAAA,UAAA,MAAA,EAAA,YAAA,MAAA,CAAA,GAAA,IAAA,SAAA,CAcF,GAdE,SAAA,MAAA,GAeE,GAfF,SAec,CAfd,GAAA,KAAA,GAiBI,CAjBJ,SAAA,GAiBiB,GAjBjB,IAAA,MAAA,EAAA,GAAA,IAAA,GAAA,KAAA,GAAA,KAAA,CAAA,GAAA,IAAA,GAAA,KAAA;EAAE;;;;;;;;EAKF,KAAA,SAAA,CAAA,cAAA,MAAA,EAAA,YAAA,MAAA,GA8BmB,KA9BnB,CAAA,GA+BA,KA/BA,SAAA,MAAA,GAgCA,WAhCA,CAgCY,KAhCZ,EAgCmB,GAhCnB,CAAA,SAAA,IAAA,GAAA,KAAA,GAkCE,KAlCF,GAAA,KAAA;EAAgB,KAAA,kBAAA,CAAA,CAAA,EAAA,cAAA,MAAA,CAAA,GAsC+B,KAtC/B,SAAA,OAAA,GAuChB,aAvCgB,CAuCF,CAvCE,EAuCC,KAvCD,CAAA,GAAA,KAAA;EACN,OAAA,KAAA,oBAAA,CAAA,CAAA,CAAA,GAAA,QAAI,MA0CJ,CA1CI,GA0CA,CA1CA,CA0CE,CA1CF,CAAA,SAAA,MAAA;EAAA;EAAE,QA4CN,CApCZ,GAAA,IAAA,EACI,GAAA,QAmC6B,CAnCjB,GAmCqB,oBAnCrB,CAmC0C,CAnC1C,CAmC4C,CAnC5C,CAAA,CAAA,EAEV,GAAA,QAmCM,CAnCO,GAAA,IAAA,EAkBE,EACnB,CAAA,MAiBI,CAjBJ,CAAA;EACY,OAAA,KAAA,YAAA,CAAA,CAAA,CAAA,GAAA,QAAO,MAkBT,CAlBS,GAkBL,CAlBK,CAkBH,CAlBG,CAAA,SAAA,IAAA,GAmBjB,CAnBiB,GAAA,MAAA,GAoBjB,CApBiB,CAoBf,CApBe,CAAA,SAAA,MAAA,GAAA,GAqBd,CArBc,GAAA,MAAA,IAqBA,YArBA,CAqBa,CArBb,CAqBe,CArBf,CAAA,CAAA,EAAA,GAAA,KAAA,EAAnB,CAAA,MAuBI,CAvBJ,CAAA;EAEE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6DkD,OAAA,KAAA,MAAA,CAAA,CAAA,EAAA,cAHxC,QAGwC,CAH/B,CAG+B,CAAA,CAAA,GAFpD,SAEoD,CAF1C,KAE0C,CAAA,SAAA,KAAA,oBAAA,MAAA,GADpD,YAAA,CAAa,EACuC,CADpC,UACoC,CAAA,SAAA,IAAA,GAAlD,YAAA,CAAa,cAAqC,CAAtB,kBAAsB,CAAH,CAAG,EAAA,UAAA,CAAA,CAAA,GAClD,KADkD,CAC5C,CAD4C,EACzC,UADyC,CAAA,GAAA,KAAA;EAAtB,SAAA,KAAA,CAAA,GAAA,EAAA,GAAA,EAAA,IAAA,EAAA,MAAA,CAAA,EAAA,GAAA;EAA5B,OAAA,SAAa,KAAA,CAAA,YAUL,MAVK,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,eAWJ,QAXI,CAWK,GAXL,CAAA,CAAA,CAAA,MAAA,EAYT,GAZS,EAAA,IAAA,EAYE,MAZF,EAAA,KAAA,EAAA,OAAA,CAAA,EAYsB,GAZtB;EACP,OAAA,SAAA,cAAA,CAAA,GAAA,KAAA,EAAA,MAAA,EAAA,CAAA,EAAA,MAAA,EAAA;EAAG;;;;;EAWL,OAAA,SAAA,MAAA,CAAA,GAAA,EAAA,cAwDgC,QAxDhC,CAwDyC,GAxDzC,CAAA,CAAA,CAAA,GAAA,EAyDH,GAzDG,EAAA,GAAA,KAAA,EA0DE,KA1DF,EAAA,CAAA,EA2DP,MA3DO,CA2DA,GA3DA,EA2DK,KA3DL,CAAA;EAAW;;;;;;;;;;;;;;;;;;;;EAiKgC,OAAA,SAAA,UAAA,CAAA,CAAA,CAAA,CAAA,GAAA,EA9DlB,CA8DkB,CAAA,EA9Dd,QA8Dc,CA9DL,CA8DK,CAAA,EAAA;EAAE,OAAA,KAAA,cAAA,GAAA,gBAAA,GAAA,eAAA,GAAA,aAAA,GAAA,WAAA;EAAhC,OAAA,UAAA,QAAA,CAAA;IAMuB,IAAA,EAAA,MAAA;IAAxB,QAAA,EAAA,OAAA;IA8MoC,MAAA,EAAA,OAAA;IAAT,MAAA,EAxOvC,cAwOuC;EAC1C;EACE,OAAA,UAAA,aAAA,CAAA;IACQ,EAAA,EAAA,OAAA;IAAK,UAAA,EAtOR,QAsOQ,EAAA;EAAZ;EACgB,KAAA,mBAAA,CAAA,SAAA,OAAA,CAAA,GAAA,CAAA,KAAA,EApOjB,MAoOiB,EAAA,IAAA,EAAA,MAAA,EAAA,GAAA,OAAA;EAAd;;;;;;;EA8HL,OAAA,KAAA,uBAAA,CAAA,CAAA,EAAA,IAAA,OAAA,CAAA,GAvVH,mBAuVG,CAvViB,CAuVjB,CAAA,GAAA,QAAkB,MAtVP,CAsVO,IAtVF,uBAsVE,CAtVsB,CAsVtB,CAtVwB,CAsVxB,CAAA,EAtV4B,CAsV5B,CAtV8B,CAsV9B,CAAA,CAAA,EAAN;EAA4B,OAAA,UAAA,aAAA,CAAA,CAAA,CAAA,CAAA;IAAK;;;;IAcnC,iBAAA,CAAA,EA9VK,uBA8VL,CA9V6B,CA8V7B,CAAA;EAIL;EACY,OAAA,SAAA,aAAA,CAAA,GAAA,EAAA,cArJyB,QAqJzB,CArJkC,GAqJlC,CAAA,CAAA,CAAA,GAAA,EApJjB,GAoJiB,EAAA,KAAA,EAnJf,KAmJe,EAAA,EAAA,MAAA,EAlJd,MAkJc,CAlJP,GAkJO,EAlJF,KAkJE,CAAA,EAAA,OAAA,CAAA,EAjJZ,aAiJY,CAjJE,GAiJF,CAAA,CAAA,EAhJrB,aAgJqB;EAAT;;;EAGN,OAAA,SAAA,gBAAA,CAAA,MAAA,EArGgC,aAqGhC,CAAA,EAAA,MAAA;EACO;;;EAaF,OAAA,SAAA,eAAA,CAAA,MAAA,EAxF0B,aAwF1B,CAAA,EAAA,IAAA;EACU,OAAA,SAAA,gBAAA,CAAA,YAvCV,MAuCU,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,eAtCT,QAsCS,CAtCA,GAsCA,CAAA,CAAA,CAAA,GAAA,EArCjB,GAqCiB,EAAA,KAAA,EArCL,KAqCK,CArCC,MAqCD,CAAA,EAAA,MAAA,EArCgB,MAqChB,CArCuB,GAqCvB,EArC4B,MAqC5B,CAAA,CAAA,EAvBP,KAuBO,CAvBD,QAuBC,CAvBQ,GAuBR,CAAA,CAAA;EAAT,OAAA,KAAA,eAAA,CAAA,UAnBH,MAmBG,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,eAlBA,QAkBA,CAlBS,CAkBT,CAAA,CAAA,GAAA;IACA,GAAA,EAjBR,CAiBQ;IAAN,KAAA,EAhBA,KAgBA,CAhBM,MAgBN,CAAA;IAAkB,KAAA,EAflB,MAekB,CAfX,CAeW,EAfR,MAeQ,CAAA;IAAmB,OAAA,CAAA,EAAA,OAAA;EAAK,CAAA;EAAZ,OAAA,SAAA,UAAA,CAAA,YAFzB,MAEyB,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,eADxB,QACwB,CADf,GACe,CAAA,CAAA,CAAA,KAAA,EAA9B,KAA8B,CAAxB,MAAwB,CAAA,EAAA,GAAA,EAAZ,GAAY,EAAA,KAAA,EAAA,MAAA,CAAO,GAAP,EAAY,MAAZ,CAAA,CAAA,EAAiB,MAAjB,CAAiB,GAAjB,EAAiB,MAAjB,CAAA,GAAA,SAAA;EAAiB,OAAA,SAAA,QAAA,CAAA,YA6M1C,MA7M0C,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,eA8MzC,QA9MyC,CA8MhC,GA9MgC,CAAA,CAAA,CAAA,OAAA,EA+M7C,eA/M6C,CA+M7B,GA/M6B,EA+MxB,MA/MwB,CAAA,CAAA,EA+MnB,GA/MmB;EAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.d.mts","names":[],"sources":["../../src/utils/path.ts"],"sourcesContent":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"path.d.mts","names":[],"sources":["../../src/utils/path.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/utils/path.mjs
CHANGED
|
@@ -262,7 +262,12 @@ let path;
|
|
|
262
262
|
if (paths.length === 1) {
|
|
263
263
|
const [path$1] = paths;
|
|
264
264
|
const missingData = pickBy(obj, ...paths);
|
|
265
|
-
|
|
265
|
+
const setPath = getPathThatMatter(path$1);
|
|
266
|
+
if (setPath === "") {
|
|
267
|
+
if (missingData !== null && missingData !== void 0 && typeof missingData === "object") return missingData;
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
return setBy(value, setPath, missingData);
|
|
266
271
|
}
|
|
267
272
|
if (paths.length > 1) {
|
|
268
273
|
let resolvedValue = {};
|
|
@@ -293,6 +298,63 @@ let path;
|
|
|
293
298
|
}
|
|
294
299
|
}
|
|
295
300
|
_path.joinAtPath = joinAtPath;
|
|
301
|
+
/**
|
|
302
|
+
* Check if an array contains objects (not primitives)
|
|
303
|
+
*/
|
|
304
|
+
function isArrayOfObjects(arr) {
|
|
305
|
+
return arr.length > 0 && arr.every((item) => item !== null && typeof item === "object" && !Array.isArray(item));
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Merge two array elements, handling objects recursively
|
|
309
|
+
* sourceItem is the new value, targetItem is the original (missing data)
|
|
310
|
+
* We want to preserve targetItem properties and let sourceItem override
|
|
311
|
+
*/
|
|
312
|
+
function mergeArrayElement(sourceItem, targetItem) {
|
|
313
|
+
if (targetItem === void 0) return sourceItem;
|
|
314
|
+
if (sourceItem !== null && typeof sourceItem === "object" && !Array.isArray(sourceItem) && targetItem !== null && typeof targetItem === "object" && !Array.isArray(targetItem)) return mergeObjects(sourceItem, targetItem);
|
|
315
|
+
return sourceItem;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Deep merge two objects recursively
|
|
319
|
+
* Target (original/missing data) is the base, source (new value) overrides
|
|
320
|
+
*/
|
|
321
|
+
function mergeObjects(source, target) {
|
|
322
|
+
const result = { ...target };
|
|
323
|
+
for (const key in source) if (key in result) result[key] = deepMergePreserveType(source[key], result[key]);
|
|
324
|
+
else result[key] = source[key];
|
|
325
|
+
return result;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Deep merge two values while preserving their structure.
|
|
329
|
+
* - Arrays:
|
|
330
|
+
* - If both are arrays of objects: merge element-wise
|
|
331
|
+
* - If both are arrays of primitives: use source (replacement)
|
|
332
|
+
* - Otherwise: use source
|
|
333
|
+
* - Objects: deep merge nested properties
|
|
334
|
+
* - Primitives: use source value
|
|
335
|
+
*/
|
|
336
|
+
function deepMergePreserveType(source, target) {
|
|
337
|
+
if (target === void 0 || target === null) return source;
|
|
338
|
+
if (Array.isArray(source)) {
|
|
339
|
+
if (Array.isArray(target)) {
|
|
340
|
+
const sourceArr = source;
|
|
341
|
+
const targetArr = target;
|
|
342
|
+
if (isArrayOfObjects(sourceArr) && isArrayOfObjects(targetArr)) return sourceArr.map((item, index) => {
|
|
343
|
+
const targetItem = targetArr[index];
|
|
344
|
+
if (targetItem !== void 0) return mergeArrayElement(item, targetItem);
|
|
345
|
+
return item;
|
|
346
|
+
});
|
|
347
|
+
if (sourceArr.length === 0) return source;
|
|
348
|
+
return [...targetArr, ...sourceArr];
|
|
349
|
+
}
|
|
350
|
+
return source;
|
|
351
|
+
}
|
|
352
|
+
if (source !== null && typeof source === "object") {
|
|
353
|
+
if (target !== null && typeof target === "object" && !Array.isArray(target)) return mergeObjects(source, target);
|
|
354
|
+
return source;
|
|
355
|
+
}
|
|
356
|
+
return source;
|
|
357
|
+
}
|
|
296
358
|
function updateAt(options) {
|
|
297
359
|
const { obj, partial, paths, value } = options;
|
|
298
360
|
const norm = normalizePaths(...paths);
|
|
@@ -300,11 +362,25 @@ let path;
|
|
|
300
362
|
let result = obj;
|
|
301
363
|
let resolvedValue = value;
|
|
302
364
|
if (partial) {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
365
|
+
let missingData = joinAtPath(findMissingPaths(obj, paths, value), obj, resolvedValue);
|
|
366
|
+
if (missingData === void 0 || typeof missingData === "object" && missingData !== null && Object.keys(missingData).length === 0) {
|
|
367
|
+
if (norm.length === 1) {
|
|
368
|
+
const originalValue = getBy(obj, norm[0]);
|
|
369
|
+
if (originalValue !== void 0) {
|
|
370
|
+
if (Array.isArray(originalValue) && Array.isArray(resolvedValue)) {
|
|
371
|
+
if (resolvedValue.length > 0) missingData = originalValue;
|
|
372
|
+
} else if (originalValue !== null && typeof originalValue === "object" && !Array.isArray(originalValue) && resolvedValue !== null && typeof resolvedValue === "object" && !Array.isArray(resolvedValue)) missingData = originalValue;
|
|
373
|
+
}
|
|
374
|
+
} else if (norm.length > 1) {
|
|
375
|
+
const originalData = {};
|
|
376
|
+
for (const p of norm) {
|
|
377
|
+
const originalValue = getBy(obj, p);
|
|
378
|
+
if (originalValue !== void 0) setBy(originalData, p, originalValue);
|
|
379
|
+
}
|
|
380
|
+
if (Object.keys(originalData).length > 0) missingData = originalData;
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
resolvedValue = deepMergePreserveType(resolvedValue, missingData);
|
|
308
384
|
}
|
|
309
385
|
if (norm.length === 1) {
|
|
310
386
|
const path$1 = norm[0];
|
|
@@ -312,7 +388,7 @@ let path;
|
|
|
312
388
|
return result;
|
|
313
389
|
}
|
|
314
390
|
for (const path$1 of norm) {
|
|
315
|
-
const sub = getBy(
|
|
391
|
+
const sub = getBy(resolvedValue, path$1);
|
|
316
392
|
result = setAtImmutable(result, path$1, sub);
|
|
317
393
|
}
|
|
318
394
|
return result;
|
package/dist/utils/path.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.mjs","names":["path","finalPaths: string[]","result: Record<string, unknown>","paths: string[]","parts: string[]","m: RegExpExecArray | null","node: any","lastFn: ExpectedTransformFn | undefined","mismatches: Mismatch[]","lines: string[]","clone","keys: string[]"],"sources":["../../src/utils/path.ts"],"sourcesContent":["import type { DeepKeys, unionHelpers } from './types';\n\nexport namespace path {\n type getBy<T, TPath extends string> = TPath extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? getBy<T[K], Rest>\n : never\n : TPath extends keyof T\n ? T[TPath]\n : never;\n\n type buildFromPath<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? { [Key in K]: buildFromPath<getBy<T, K>, Rest> }\n : P extends keyof T\n ? { [Key in P]: T[P] }\n : never;\n\n /**\n * Does P have any ancestor path in All? (i.e. some Q in All such that Q is a\n * strict prefix of P)\n */\n type hasAncestor<P extends string, All extends string> = true extends (\n All extends string\n ? All extends P\n ? false // same path, not an ancestor\n : P extends `${All}.${string}`\n ? true\n : false\n : never\n )\n ? true\n : false;\n\n /**\n * Normalize a union of paths by removing those that have an ancestor path\n * also in the union.\n *\n * Example:\n * NormalizePaths<'foo.bar.baz' | 'foo.bar'> -> 'foo.bar'\n * NormalizePaths<'foo.bar' | 'other'> -> 'foo.bar' | 'other'\n */\n type normalize<\n Paths extends string,\n All extends string = Paths\n > = Paths extends string\n ? hasAncestor<Paths, All> extends true\n ? never\n : Paths\n : never;\n\n // helper to distribute BuildFromPath over union\n type distributeAndBuild<T, Paths extends string> = Paths extends unknown\n ? buildFromPath<T, Paths>\n : never;\n\n export type generateObjectConfig<T> = {\n [K in keyof T]: T[K] extends object\n ? // K's value is an object: allow stopping at K, or going deeper\n { [P in K]: true } | { [P in K]: generateObjectConfig<T[K]> }\n : // K's value is not object: can only stop at K\n { [P in K]: true };\n }[keyof T];\n export type objectToPath<O> = {\n [K in keyof O]: O[K] extends true\n ? K & string\n : O[K] extends object\n ? `${K & string}.${objectToPath<O[K]>}`\n : never;\n }[keyof O];\n\n /**\n * Pick by paths:\n * - Normalize the paths (remove descendants when parent also present)\n * - If only one normalized path:\n * return GetByPath<T, P> (relative type)\n * - If multiple:\n * intersect root-built shapes for each normalized path\n *\n * @example\n * ```ts\n * type User = {\n * foo: {\n * bar: {\n * baz: number;\n * qux: string;\n * };\n * };\n * other: string;\n * };\n *\n * type Test1 = PickByPaths<User, 'foo.bar'>;\n * // { baz: number; qux: string } ✅ relative object at foo.bar\n *\n * type Test2 = PickByPaths<User, 'foo.bar.baz'>;\n * // number ✅ leaf type\n *\n * type Test3 = PickByPaths<User, 'foo.bar' | 'other'>;\n * // { foo: { bar: { baz: number; qux: string } } } & { other: string } ✅\n *\n * type Test4 = PickByPaths<User, 'foo.bar.baz' | 'foo.bar' | 'other'>;\n * // { baz: number; qux: string } ✅ parent 'foo.bar' wins, relative\n * ```\n */\n export type pickBy<\n T,\n Paths extends DeepKeys<T>\n > = normalize<Paths> extends infer normalized extends string\n ? unionHelpers.is<normalized> extends true\n ? unionHelpers.toIntersection<distributeAndBuild<T, normalized>>\n : getBy<T, normalized>\n : never;\n\n function getBy(obj: any, path: string): any {\n return path\n .split('.')\n .reduce((acc, key) => (acc == null ? undefined : acc[key]), obj);\n }\n export function setBy<\n def extends Record<string, unknown>,\n path extends DeepKeys<def>\n >(target: def, path: path, value: unknown) {\n const keys = path.split('.');\n let current = target;\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n if (i === keys.length - 1) {\n // last key -> assign/merge\n if (\n current[k] !== undefined &&\n typeof current[k] === 'object' &&\n typeof value === 'object' &&\n value !== null\n ) {\n Object.assign(current[k] as Record<string, unknown>, value);\n } else {\n (current[k] as any) = value;\n }\n } else {\n if (typeof current[k] !== 'object' || current[k] === null) {\n (current[k] as any) = {};\n }\n (current as any) = current[k];\n }\n }\n\n return current;\n }\n\n // Runtime: normalize paths (drop descendants when ancestor exists)\n export function normalizePaths(...paths: string[]) {\n // Sort by depth (deepest first), so longer paths come before their parents.\n const sorted = [...paths].sort(\n (a, b) => b.split('.').length - a.split('.').length\n );\n\n const finalPaths: string[] = [];\n\n for (const path of sorted) {\n // If the path is contained inside another selected deeper path, skip it\n const isCovered = finalPaths.some((p) => p.startsWith(path + '.'));\n\n if (!isCovered) {\n finalPaths.push(path);\n }\n }\n\n // The order may not matter, but returning in shallow-to-deep order feels natural.\n return finalPaths.reverse();\n }\n\n /**\n * pickByPaths:\n * - paths can be a union of string literals\n * - return type is PickByPaths<T, Paths>\n */\n export function pickBy<def, paths extends DeepKeys<def>>(\n obj: def,\n ...paths: paths[]\n ): pickBy<def, paths> {\n const norm = normalizePaths(...paths);\n\n // Single normalized path -> return relative value at that path\n if (norm.length === 1) {\n return getBy(obj, norm[0]) as pickBy<def, paths>;\n }\n\n // Multiple normalized paths -> build root-based object and intersect\n const result: Record<string, unknown> = {};\n\n for (const p of norm) {\n const value = getBy(obj, p);\n\n setBy(result, p, value);\n }\n\n return result as pickBy<def, paths>;\n }\n\n /**\n * Creates an array of all deep paths in an object.\n * Recursively traverses the object and returns all possible dot-separated paths.\n *\n * @example\n * ```ts\n * const obj = {\n * foo: {\n * bar: {\n * baz: 1,\n * qux: 2\n * }\n * },\n * other: 'value'\n * };\n *\n * createPaths(obj);\n * // ['foo', 'foo.bar', 'foo.bar.baz', 'foo.bar.qux', 'other']\n * ```\n */\n export function createDeep<T>(obj: T): DeepKeys<T>[] {\n const paths: string[] = [];\n\n function traverse(current: any, prefix: string = ''): void {\n if (current === null || current === undefined) {\n return;\n }\n\n if (typeof current !== 'object' || Array.isArray(current)) {\n return;\n }\n\n const keys = Object.keys(current);\n for (const key of keys) {\n const path = prefix ? `${prefix}.${key}` : key;\n paths.push(path);\n\n const value = current[key];\n if (\n value !== null &&\n value !== undefined &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n traverse(value, path);\n }\n }\n }\n\n traverse(obj);\n return paths as DeepKeys<T>[];\n }\n\n export type MismatchReason =\n | 'value-mismatch'\n | 'type-mismatch'\n | 'missing-key'\n | 'extra-key';\n export interface Mismatch {\n path: string;\n expected: unknown;\n actual: unknown;\n reason: MismatchReason;\n }\n\n export interface CompareResult {\n ok: boolean;\n mismatches: Mismatch[];\n }\n type ExpectedTransformFn<TValue = unknown> = (\n value: TValue,\n path: string\n ) => unknown;\n /**\n * Transform config:\n * - a single function: applies to the whole T\n * - or an object shaped like T, where values are either:\n * - functions (apply at/under that node)\n * - nested objects continuing the shape\n */\n export type ExpectedTransformConfig<T, V = unknown> =\n | ExpectedTransformFn<V>\n | { [K in keyof T]?: ExpectedTransformConfig<T[K], T[K]> };\n export interface EqualsOptions<T> {\n /**\n * How to transform the \"expected\" field in mismatches.\n * If omitted, a default type-ish formatting is used.\n */\n transformExpected?: ExpectedTransformConfig<T>;\n }\n interface DeepCompareOptions<T> {\n includeValueMismatch?: boolean;\n\n transformExpected?: ExpectedTransformConfig<T>;\n }\n\n function defaultExpectedFormat(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'Array';\n const t = typeof value;\n if (t !== 'object') return t; // 'string', 'number', etc.\n const ctor = (value as any)?.constructor?.name;\n return ctor && ctor !== 'Object' ? ctor : 'object';\n }\n\n function splitPath(path: string): string[] {\n if (!path) return [];\n const parts: string[] = [];\n const regex = /[^.[\\]]+|\\[(\\d+)\\]/g;\n let m: RegExpExecArray | null;\n while ((m = regex.exec(path))) {\n parts.push(m[1] ?? m[0]);\n }\n return parts;\n }\n\n function getTransformFunction<T>(\n root: ExpectedTransformConfig<T> | undefined,\n path: string\n ): ExpectedTransformFn | undefined {\n if (!root) return undefined;\n\n if (typeof root === 'function') {\n // TS now knows this is ExpectedTransformFn, but we can be explicit:\n return root as ExpectedTransformFn;\n }\n\n const segments = splitPath(path);\n let node: any = root;\n let lastFn: ExpectedTransformFn | undefined;\n\n for (const seg of segments) {\n if (!node) break;\n\n if (typeof node === 'function') {\n lastFn = node as ExpectedTransformFn;\n break;\n }\n\n node = node[seg];\n\n if (typeof node === 'function') {\n lastFn = node as ExpectedTransformFn;\n break;\n }\n }\n\n return lastFn;\n }\n\n function formatExpected<T>(\n rawExpected: unknown,\n path: string,\n cfg: ExpectedTransformConfig<T> | undefined\n ): unknown {\n const fn = getTransformFunction(cfg, path);\n if (fn) return fn(rawExpected, path);\n return defaultExpectedFormat(rawExpected);\n }\n\n function isObjectLike(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null;\n }\n\n function deepCompare<T>(\n expected: unknown,\n actual: unknown,\n basePath: string,\n mismatches: Mismatch[],\n options: DeepCompareOptions<T>\n ): Mismatch[] {\n // identical (covers primitives + same-ref objects)\n if (expected === actual) {\n return mismatches;\n }\n\n // one is null/undefined OR types not object-like -> primitive / scalar mismatch\n if (\n expected === null ||\n actual === null ||\n typeof expected !== 'object' ||\n typeof actual !== 'object'\n ) {\n const path = basePath || '(root)';\n\n if (typeof expected !== typeof actual) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n return mismatches;\n }\n\n if (options.includeValueMismatch) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'value-mismatch',\n });\n }\n\n return mismatches;\n }\n\n // arrays\n if (Array.isArray(expected) || Array.isArray(actual)) {\n if (!Array.isArray(expected) || !Array.isArray(actual)) {\n const path = basePath || '(root)';\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n return mismatches;\n }\n\n // Both values are arrays.\n // We *do* compare element structure/types where both have an index, but we\n // intentionally ignore length differences (no missing/extra index errors).\n const maxLen = expected.length;\n\n for (let i = 0; i < maxLen; i++) {\n const expVal = expected[i];\n const actVal = actual[i];\n const path = basePath === '' ? `[${i}]` : `${basePath}[${i}]`;\n\n deepCompare(expVal, actVal, path, mismatches, options);\n }\n\n return mismatches;\n }\n\n // plain objects\n if (isObjectLike(expected) && isObjectLike(actual)) {\n const expKeys = Object.keys(expected);\n const actKeys = Object.keys(actual);\n\n for (const key of expKeys) {\n const expVal = (expected as any)[key];\n const actVal = (actual as any)[key];\n const path = basePath ? `${basePath}.${key}` : key;\n\n if (!(key in actual)) {\n mismatches.push({\n path,\n expected: formatExpected(expVal, path, options.transformExpected),\n actual: undefined,\n reason: 'missing-key',\n });\n continue;\n }\n\n deepCompare(expVal, actVal, path, mismatches, options);\n }\n\n for (const key of actKeys) {\n if (!(key in expected)) {\n const path = basePath ? `${basePath}.${key}` : key;\n mismatches.push({\n path,\n expected: undefined,\n actual: (actual as any)[key],\n reason: 'extra-key',\n });\n }\n }\n\n return mismatches;\n }\n\n const path = basePath || '(root)';\n if (typeof expected !== typeof actual) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n } else if (options.includeValueMismatch) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'value-mismatch',\n });\n }\n\n return mismatches;\n }\n\n export function equalsAtPaths<def, paths extends DeepKeys<def>>(\n obj: def,\n paths: paths[],\n actual: pickBy<def, paths>,\n options?: EqualsOptions<def>\n ): CompareResult {\n // expected comes from obj at the given paths\n const expected = pickBy<def, paths>(obj, ...paths);\n\n const mismatches: Mismatch[] = [];\n\n const basePath = paths.length === 1 ? (paths[0] as string) : '';\n\n deepCompare<def>(expected, actual, basePath, mismatches, {\n transformExpected: options?.transformExpected,\n });\n\n return {\n ok: mismatches.length === 0,\n mismatches,\n };\n }\n\n function formatValue(v: unknown): string {\n if (v === undefined) return 'undefined';\n if (typeof v === 'string') return JSON.stringify(v); // add quotes\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n }\n\n function formatReason(m: Mismatch): string {\n switch (m.reason) {\n case 'missing-key':\n return 'Missing key';\n case 'extra-key':\n return 'Extra key';\n case 'type-mismatch':\n return 'Type mismatch';\n case 'value-mismatch':\n return 'Value mismatch';\n default:\n return m.reason;\n }\n }\n\n /**\n * Turn a CompareResult into a pretty error string.\n */\n export function formatMismatches(result: CompareResult) {\n if (result.ok || result.mismatches.length === 0) {\n return 'No mismatches.';\n }\n\n const lines: string[] = [];\n\n for (const m of result.mismatches) {\n lines.push(\n `\\n● ${formatReason(m)} at \"${m.path}\":`,\n ` expected: ${formatValue(m.expected)}`,\n ` actual: ${formatValue(m.actual)}`,\n '' // blank line between entries\n );\n }\n\n // trim trailing blank line\n if (lines.at(-1) === '') {\n lines.pop();\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Convenience: log to console.error.\n */\n export function printMismatches(result: CompareResult): void {\n const msg = formatMismatches(result);\n if (msg !== 'No mismatches.') {\n console.error(msg);\n }\n }\n\n function setAtImmutable<\n T extends Record<string, unknown>,\n path extends DeepKeys<T>\n >(root: T, path: path, value: pickBy<T, path>) {\n const keys = path.split('.');\n\n function helper(current: T, idx: number): any {\n const key = keys[idx];\n const resolvedCurrent = Array.isArray(current)\n ? [...current]\n : { ...current };\n\n if (idx === keys.length - 1) {\n let clone =\n current && typeof current === 'object' ? resolvedCurrent : {};\n\n clone = {\n ...clone,\n [key]: value,\n };\n\n return clone;\n }\n\n const next =\n current && typeof current === 'object' ? current[key] : undefined;\n\n const updatedChild = helper((next as T) ?? ({} as T), idx + 1);\n\n let clone = current && typeof current === 'object' ? resolvedCurrent : {};\n\n clone = {\n ...clone,\n [key]: updatedChild,\n };\n\n return clone;\n }\n\n return helper(root, 0);\n }\n\n export function findMissingPaths<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(obj: obj, paths: Array<path>, actual: pickBy<obj, path>) {\n const keys: string[] = [];\n\n for (const path of paths) {\n const value = pickBy(obj, path);\n const expectedKeys = createDeep(value);\n const actualKeys = createDeep(actual);\n const missingKeys = expectedKeys\n .filter((key) => !actualKeys.includes(key))\n .map((key) => `${path}.${key}`);\n\n keys.push(...missingKeys);\n }\n\n return keys as Array<DeepKeys<obj>>;\n }\n\n export type updateAtOptions<\n T extends Record<string, unknown>,\n path extends DeepKeys<T>\n > = {\n obj: T;\n paths: Array<path>;\n value: pickBy<T, path>;\n partial?: boolean;\n };\n\n function getPathThatMatter(path: string) {\n // Only works when updating a `defaultValue`\n // TODO make this work with the entire object - will need to figure out some way to normalize\n const [, ...rest] = path.split('.defaultValue.');\n\n return rest.join('.');\n }\n\n export function joinAtPath<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(paths: Array<path>, obj: obj, value: pickBy<obj, path>) {\n if (paths.length === 1) {\n const [path] = paths;\n const missingData = pickBy(obj, ...paths);\n const setPath = getPathThatMatter(path);\n\n // if (last) {\n // const data = setBy(\n // value as Record<string, unknown>,\n // last,\n // missingData\n // ) as pickBy<obj, path>;\n\n // return data;\n // }\n\n const data = setBy(\n value as Record<string, unknown>,\n setPath,\n missingData\n ) as pickBy<obj, path>;\n\n return data;\n }\n\n if (paths.length > 1) {\n let resolvedValue = {} as Record<string, unknown>;\n\n for (const path of paths) {\n const pathThatMatters = getPathThatMatter(path);\n const missing = joinAtPath([path], obj, value);\n const valueAtPathThatMatters = getBy(obj, path);\n\n // This check is here to ensure `resolvedValue` will only have\n // nested properties where they belong.\n if (\n Object.keys(resolvedValue).length > 0 &&\n valueAtPathThatMatters !== 'undefined'\n ) {\n const dataAtPath = pickBy(obj, path);\n const [key] = pathThatMatters.split('.');\n\n if (typeof dataAtPath === 'object') {\n if (missing) {\n resolvedValue = {\n ...resolvedValue,\n [key]: {\n ...(resolvedValue[key] as Record<string, unknown>),\n ...missing,\n },\n };\n }\n }\n\n continue;\n }\n\n if (missing) {\n resolvedValue = {\n ...resolvedValue,\n ...missing,\n };\n }\n }\n\n return resolvedValue as pickBy<obj, path>;\n }\n }\n\n export function updateAt<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(options: updateAtOptions<obj, path>) {\n const { obj, partial, paths, value } = options;\n const norm = normalizePaths(...paths);\n if (norm.length === 0) return obj;\n\n let result = obj;\n let resolvedValue = value;\n\n if (partial) {\n const missingPaths = findMissingPaths(obj, paths, value);\n\n const missingData = joinAtPath(\n missingPaths as Array<path>,\n obj,\n resolvedValue\n );\n\n resolvedValue = {\n ...(resolvedValue as Record<string, unknown>),\n ...(missingData as Record<string, unknown>),\n } as pickBy<obj, path>;\n }\n\n if (norm.length === 1) {\n // single path: value is relative at that path\n const path = norm[0] as DeepKeys<obj>;\n\n result = setAtImmutable(result, path, resolvedValue as never);\n\n return result;\n }\n\n // multiple paths:\n // value is the root-shaped object that contains all those paths\n for (const path of norm) {\n const sub = getBy(value, path);\n\n result = setAtImmutable(result, path as DeepKeys<obj>, sub);\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"path.mjs","names":["path","finalPaths: string[]","result: Record<string, unknown>","paths: string[]","parts: string[]","m: RegExpExecArray | null","node: any","lastFn: ExpectedTransformFn | undefined","mismatches: Mismatch[]","lines: string[]","clone","keys: string[]","originalData: Record<string, unknown>"],"sources":["../../src/utils/path.ts"],"sourcesContent":["import type { DeepKeys, unionHelpers } from './types';\n\nexport namespace path {\n type getBy<T, TPath extends string> = TPath extends `${infer K}.${infer Rest}`\n ? K extends keyof T\n ? getBy<T[K], Rest>\n : never\n : TPath extends keyof T\n ? T[TPath]\n : never;\n\n type buildFromPath<T, P extends string> = P extends `${infer K}.${infer Rest}`\n ? { [Key in K]: buildFromPath<getBy<T, K>, Rest> }\n : P extends keyof T\n ? { [Key in P]: T[P] }\n : never;\n\n /**\n * Does P have any ancestor path in All? (i.e. some Q in All such that Q is a\n * strict prefix of P)\n */\n type hasAncestor<P extends string, All extends string> = true extends (\n All extends string\n ? All extends P\n ? false // same path, not an ancestor\n : P extends `${All}.${string}`\n ? true\n : false\n : never\n )\n ? true\n : false;\n\n /**\n * Normalize a union of paths by removing those that have an ancestor path\n * also in the union.\n *\n * Example:\n * NormalizePaths<'foo.bar.baz' | 'foo.bar'> -> 'foo.bar'\n * NormalizePaths<'foo.bar' | 'other'> -> 'foo.bar' | 'other'\n */\n type normalize<\n Paths extends string,\n All extends string = Paths\n > = Paths extends string\n ? hasAncestor<Paths, All> extends true\n ? never\n : Paths\n : never;\n\n // helper to distribute BuildFromPath over union\n type distributeAndBuild<T, Paths extends string> = Paths extends unknown\n ? buildFromPath<T, Paths>\n : never;\n\n export type generateObjectConfig<T> = {\n [K in keyof T]: T[K] extends object\n ? // K's value is an object: allow stopping at K, or going deeper\n { [P in K]: true } | { [P in K]: generateObjectConfig<T[K]> }\n : // K's value is not object: can only stop at K\n { [P in K]: true };\n }[keyof T];\n export type objectToPath<O> = {\n [K in keyof O]: O[K] extends true\n ? K & string\n : O[K] extends object\n ? `${K & string}.${objectToPath<O[K]>}`\n : never;\n }[keyof O];\n\n /**\n * Pick by paths:\n * - Normalize the paths (remove descendants when parent also present)\n * - If only one normalized path:\n * return GetByPath<T, P> (relative type)\n * - If multiple:\n * intersect root-built shapes for each normalized path\n *\n * @example\n * ```ts\n * type User = {\n * foo: {\n * bar: {\n * baz: number;\n * qux: string;\n * };\n * };\n * other: string;\n * };\n *\n * type Test1 = PickByPaths<User, 'foo.bar'>;\n * // { baz: number; qux: string } ✅ relative object at foo.bar\n *\n * type Test2 = PickByPaths<User, 'foo.bar.baz'>;\n * // number ✅ leaf type\n *\n * type Test3 = PickByPaths<User, 'foo.bar' | 'other'>;\n * // { foo: { bar: { baz: number; qux: string } } } & { other: string } ✅\n *\n * type Test4 = PickByPaths<User, 'foo.bar.baz' | 'foo.bar' | 'other'>;\n * // { baz: number; qux: string } ✅ parent 'foo.bar' wins, relative\n * ```\n */\n export type pickBy<\n T,\n Paths extends DeepKeys<T>\n > = normalize<Paths> extends infer normalized extends string\n ? unionHelpers.is<normalized> extends true\n ? unionHelpers.toIntersection<distributeAndBuild<T, normalized>>\n : getBy<T, normalized>\n : never;\n\n function getBy(obj: any, path: string): any {\n return path\n .split('.')\n .reduce((acc, key) => (acc == null ? undefined : acc[key]), obj);\n }\n export function setBy<\n def extends Record<string, unknown>,\n path extends DeepKeys<def>\n >(target: def, path: path, value: unknown) {\n const keys = path.split('.');\n let current = target;\n\n for (let i = 0; i < keys.length; i++) {\n const k = keys[i];\n if (i === keys.length - 1) {\n // last key -> assign/merge\n if (\n current[k] !== undefined &&\n typeof current[k] === 'object' &&\n typeof value === 'object' &&\n value !== null\n ) {\n Object.assign(current[k] as Record<string, unknown>, value);\n } else {\n (current[k] as any) = value;\n }\n } else {\n if (typeof current[k] !== 'object' || current[k] === null) {\n (current[k] as any) = {};\n }\n (current as any) = current[k];\n }\n }\n\n return current;\n }\n\n // Runtime: normalize paths (drop descendants when ancestor exists)\n export function normalizePaths(...paths: string[]) {\n // Sort by depth (deepest first), so longer paths come before their parents.\n const sorted = [...paths].sort(\n (a, b) => b.split('.').length - a.split('.').length\n );\n\n const finalPaths: string[] = [];\n\n for (const path of sorted) {\n // If the path is contained inside another selected deeper path, skip it\n const isCovered = finalPaths.some((p) => p.startsWith(path + '.'));\n\n if (!isCovered) {\n finalPaths.push(path);\n }\n }\n\n // The order may not matter, but returning in shallow-to-deep order feels natural.\n return finalPaths.reverse();\n }\n\n /**\n * pickByPaths:\n * - paths can be a union of string literals\n * - return type is PickByPaths<T, Paths>\n */\n export function pickBy<def, paths extends DeepKeys<def>>(\n obj: def,\n ...paths: paths[]\n ): pickBy<def, paths> {\n const norm = normalizePaths(...paths);\n\n // Single normalized path -> return relative value at that path\n if (norm.length === 1) {\n return getBy(obj, norm[0]) as pickBy<def, paths>;\n }\n\n // Multiple normalized paths -> build root-based object and intersect\n const result: Record<string, unknown> = {};\n\n for (const p of norm) {\n const value = getBy(obj, p);\n\n setBy(result, p, value);\n }\n\n return result as pickBy<def, paths>;\n }\n\n /**\n * Creates an array of all deep paths in an object.\n * Recursively traverses the object and returns all possible dot-separated paths.\n *\n * @example\n * ```ts\n * const obj = {\n * foo: {\n * bar: {\n * baz: 1,\n * qux: 2\n * }\n * },\n * other: 'value'\n * };\n *\n * createPaths(obj);\n * // ['foo', 'foo.bar', 'foo.bar.baz', 'foo.bar.qux', 'other']\n * ```\n */\n export function createDeep<T>(obj: T): DeepKeys<T>[] {\n const paths: string[] = [];\n\n function traverse(current: any, prefix: string = ''): void {\n if (current === null || current === undefined) {\n return;\n }\n\n if (typeof current !== 'object' || Array.isArray(current)) {\n return;\n }\n\n const keys = Object.keys(current);\n for (const key of keys) {\n const path = prefix ? `${prefix}.${key}` : key;\n paths.push(path);\n\n const value = current[key];\n if (\n value !== null &&\n value !== undefined &&\n typeof value === 'object' &&\n !Array.isArray(value)\n ) {\n traverse(value, path);\n }\n }\n }\n\n traverse(obj);\n return paths as DeepKeys<T>[];\n }\n\n export type MismatchReason =\n | 'value-mismatch'\n | 'type-mismatch'\n | 'missing-key'\n | 'extra-key';\n export interface Mismatch {\n path: string;\n expected: unknown;\n actual: unknown;\n reason: MismatchReason;\n }\n\n export interface CompareResult {\n ok: boolean;\n mismatches: Mismatch[];\n }\n type ExpectedTransformFn<TValue = unknown> = (\n value: TValue,\n path: string\n ) => unknown;\n /**\n * Transform config:\n * - a single function: applies to the whole T\n * - or an object shaped like T, where values are either:\n * - functions (apply at/under that node)\n * - nested objects continuing the shape\n */\n export type ExpectedTransformConfig<T, V = unknown> =\n | ExpectedTransformFn<V>\n | { [K in keyof T]?: ExpectedTransformConfig<T[K], T[K]> };\n export interface EqualsOptions<T> {\n /**\n * How to transform the \"expected\" field in mismatches.\n * If omitted, a default type-ish formatting is used.\n */\n transformExpected?: ExpectedTransformConfig<T>;\n }\n interface DeepCompareOptions<T> {\n includeValueMismatch?: boolean;\n\n transformExpected?: ExpectedTransformConfig<T>;\n }\n\n function defaultExpectedFormat(value: unknown): string {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'Array';\n const t = typeof value;\n if (t !== 'object') return t; // 'string', 'number', etc.\n const ctor = (value as any)?.constructor?.name;\n return ctor && ctor !== 'Object' ? ctor : 'object';\n }\n\n function splitPath(path: string): string[] {\n if (!path) return [];\n const parts: string[] = [];\n const regex = /[^.[\\]]+|\\[(\\d+)\\]/g;\n let m: RegExpExecArray | null;\n while ((m = regex.exec(path))) {\n parts.push(m[1] ?? m[0]);\n }\n return parts;\n }\n\n function getTransformFunction<T>(\n root: ExpectedTransformConfig<T> | undefined,\n path: string\n ): ExpectedTransformFn | undefined {\n if (!root) return undefined;\n\n if (typeof root === 'function') {\n // TS now knows this is ExpectedTransformFn, but we can be explicit:\n return root as ExpectedTransformFn;\n }\n\n const segments = splitPath(path);\n let node: any = root;\n let lastFn: ExpectedTransformFn | undefined;\n\n for (const seg of segments) {\n if (!node) break;\n\n if (typeof node === 'function') {\n lastFn = node as ExpectedTransformFn;\n break;\n }\n\n node = node[seg];\n\n if (typeof node === 'function') {\n lastFn = node as ExpectedTransformFn;\n break;\n }\n }\n\n return lastFn;\n }\n\n function formatExpected<T>(\n rawExpected: unknown,\n path: string,\n cfg: ExpectedTransformConfig<T> | undefined\n ): unknown {\n const fn = getTransformFunction(cfg, path);\n if (fn) return fn(rawExpected, path);\n return defaultExpectedFormat(rawExpected);\n }\n\n function isObjectLike(v: unknown): v is Record<string, unknown> {\n return typeof v === 'object' && v !== null;\n }\n\n function deepCompare<T>(\n expected: unknown,\n actual: unknown,\n basePath: string,\n mismatches: Mismatch[],\n options: DeepCompareOptions<T>\n ): Mismatch[] {\n // identical (covers primitives + same-ref objects)\n if (expected === actual) {\n return mismatches;\n }\n\n // one is null/undefined OR types not object-like -> primitive / scalar mismatch\n if (\n expected === null ||\n actual === null ||\n typeof expected !== 'object' ||\n typeof actual !== 'object'\n ) {\n const path = basePath || '(root)';\n\n if (typeof expected !== typeof actual) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n return mismatches;\n }\n\n if (options.includeValueMismatch) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'value-mismatch',\n });\n }\n\n return mismatches;\n }\n\n // arrays\n if (Array.isArray(expected) || Array.isArray(actual)) {\n if (!Array.isArray(expected) || !Array.isArray(actual)) {\n const path = basePath || '(root)';\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n return mismatches;\n }\n\n // Both values are arrays.\n // We *do* compare element structure/types where both have an index, but we\n // intentionally ignore length differences (no missing/extra index errors).\n const maxLen = expected.length;\n\n for (let i = 0; i < maxLen; i++) {\n const expVal = expected[i];\n const actVal = actual[i];\n const path = basePath === '' ? `[${i}]` : `${basePath}[${i}]`;\n\n deepCompare(expVal, actVal, path, mismatches, options);\n }\n\n return mismatches;\n }\n\n // plain objects\n if (isObjectLike(expected) && isObjectLike(actual)) {\n const expKeys = Object.keys(expected);\n const actKeys = Object.keys(actual);\n\n for (const key of expKeys) {\n const expVal = (expected as any)[key];\n const actVal = (actual as any)[key];\n const path = basePath ? `${basePath}.${key}` : key;\n\n if (!(key in actual)) {\n mismatches.push({\n path,\n expected: formatExpected(expVal, path, options.transformExpected),\n actual: undefined,\n reason: 'missing-key',\n });\n continue;\n }\n\n deepCompare(expVal, actVal, path, mismatches, options);\n }\n\n for (const key of actKeys) {\n if (!(key in expected)) {\n const path = basePath ? `${basePath}.${key}` : key;\n mismatches.push({\n path,\n expected: undefined,\n actual: (actual as any)[key],\n reason: 'extra-key',\n });\n }\n }\n\n return mismatches;\n }\n\n const path = basePath || '(root)';\n if (typeof expected !== typeof actual) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'type-mismatch',\n });\n } else if (options.includeValueMismatch) {\n mismatches.push({\n path,\n expected: formatExpected(expected, path, options.transformExpected),\n actual,\n reason: 'value-mismatch',\n });\n }\n\n return mismatches;\n }\n\n export function equalsAtPaths<def, paths extends DeepKeys<def>>(\n obj: def,\n paths: paths[],\n actual: pickBy<def, paths>,\n options?: EqualsOptions<def>\n ): CompareResult {\n // expected comes from obj at the given paths\n const expected = pickBy<def, paths>(obj, ...paths);\n\n const mismatches: Mismatch[] = [];\n\n const basePath = paths.length === 1 ? (paths[0] as string) : '';\n\n deepCompare<def>(expected, actual, basePath, mismatches, {\n transformExpected: options?.transformExpected,\n });\n\n return {\n ok: mismatches.length === 0,\n mismatches,\n };\n }\n\n function formatValue(v: unknown): string {\n if (v === undefined) return 'undefined';\n if (typeof v === 'string') return JSON.stringify(v); // add quotes\n try {\n return JSON.stringify(v, null, 2);\n } catch {\n return String(v);\n }\n }\n\n function formatReason(m: Mismatch): string {\n switch (m.reason) {\n case 'missing-key':\n return 'Missing key';\n case 'extra-key':\n return 'Extra key';\n case 'type-mismatch':\n return 'Type mismatch';\n case 'value-mismatch':\n return 'Value mismatch';\n default:\n return m.reason;\n }\n }\n\n /**\n * Turn a CompareResult into a pretty error string.\n */\n export function formatMismatches(result: CompareResult) {\n if (result.ok || result.mismatches.length === 0) {\n return 'No mismatches.';\n }\n\n const lines: string[] = [];\n\n for (const m of result.mismatches) {\n lines.push(\n `\\n● ${formatReason(m)} at \"${m.path}\":`,\n ` expected: ${formatValue(m.expected)}`,\n ` actual: ${formatValue(m.actual)}`,\n '' // blank line between entries\n );\n }\n\n // trim trailing blank line\n if (lines.at(-1) === '') {\n lines.pop();\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Convenience: log to console.error.\n */\n export function printMismatches(result: CompareResult): void {\n const msg = formatMismatches(result);\n if (msg !== 'No mismatches.') {\n console.error(msg);\n }\n }\n\n function setAtImmutable<\n T extends Record<string, unknown>,\n path extends DeepKeys<T>\n >(root: T, path: path, value: pickBy<T, path>) {\n const keys = path.split('.');\n\n function helper(current: T, idx: number): any {\n const key = keys[idx];\n const resolvedCurrent = Array.isArray(current)\n ? [...current]\n : { ...current };\n\n if (idx === keys.length - 1) {\n let clone =\n current && typeof current === 'object' ? resolvedCurrent : {};\n\n clone = {\n ...clone,\n [key]: value,\n };\n\n return clone;\n }\n\n const next =\n current && typeof current === 'object' ? current[key] : undefined;\n\n const updatedChild = helper((next as T) ?? ({} as T), idx + 1);\n\n let clone = current && typeof current === 'object' ? resolvedCurrent : {};\n\n clone = {\n ...clone,\n [key]: updatedChild,\n };\n\n return clone;\n }\n\n return helper(root, 0);\n }\n\n export function findMissingPaths<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(obj: obj, paths: Array<path>, actual: pickBy<obj, path>) {\n const keys: string[] = [];\n\n for (const path of paths) {\n const value = pickBy(obj, path);\n const expectedKeys = createDeep(value);\n const actualKeys = createDeep(actual);\n const missingKeys = expectedKeys\n .filter((key) => !actualKeys.includes(key))\n .map((key) => `${path}.${key}`);\n\n keys.push(...missingKeys);\n }\n\n return keys as Array<DeepKeys<obj>>;\n }\n\n export type updateAtOptions<\n T extends Record<string, unknown>,\n path extends DeepKeys<T>\n > = {\n obj: T;\n paths: Array<path>;\n value: pickBy<T, path>;\n partial?: boolean;\n };\n\n function getPathThatMatter(path: string) {\n // Only works when updating a `defaultValue`\n // TODO make this work with the entire object - will need to figure out some way to normalize\n const [, ...rest] = path.split('.defaultValue.');\n\n return rest.join('.');\n }\n\n export function joinAtPath<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(paths: Array<path>, obj: obj, value: pickBy<obj, path>) {\n if (paths.length === 1) {\n const [path] = paths;\n const missingData = pickBy(obj, ...paths);\n const setPath = getPathThatMatter(path);\n\n // If setPath is empty (path doesn't contain .defaultValue.),\n // return missingData directly. The merge will happen in deepMergePreserveType.\n // Calling setBy with empty path would create a \"\" key which is wrong.\n // Only return if missingData is an object/array, not a primitive\n if (setPath === '') {\n if (\n missingData !== null &&\n missingData !== undefined &&\n typeof missingData === 'object'\n ) {\n return missingData;\n }\n // If missingData is a primitive, return undefined so merge doesn't happen\n return undefined;\n }\n\n const data = setBy(\n value as Record<string, unknown>,\n setPath,\n missingData\n ) as pickBy<obj, path>;\n\n return data;\n }\n\n if (paths.length > 1) {\n let resolvedValue = {} as Record<string, unknown>;\n\n for (const path of paths) {\n const pathThatMatters = getPathThatMatter(path);\n const missing = joinAtPath([path], obj, value);\n const valueAtPathThatMatters = getBy(obj, path);\n\n // This check is here to ensure `resolvedValue` will only have\n // nested properties where they belong.\n if (\n Object.keys(resolvedValue).length > 0 &&\n valueAtPathThatMatters !== 'undefined'\n ) {\n const dataAtPath = pickBy(obj, path);\n const [key] = pathThatMatters.split('.');\n\n if (typeof dataAtPath === 'object') {\n if (missing) {\n resolvedValue = {\n ...resolvedValue,\n [key]: {\n ...(resolvedValue[key] as Record<string, unknown>),\n ...missing,\n },\n };\n }\n }\n\n continue;\n }\n\n if (missing) {\n resolvedValue = {\n ...resolvedValue,\n ...missing,\n };\n }\n }\n\n return resolvedValue as pickBy<obj, path>;\n }\n }\n\n /**\n * Check if an array contains objects (not primitives)\n */\n function isArrayOfObjects(arr: unknown[]): boolean {\n return (\n arr.length > 0 &&\n arr.every(\n (item) =>\n item !== null && typeof item === 'object' && !Array.isArray(item)\n )\n );\n }\n\n /**\n * Merge two array elements, handling objects recursively\n * sourceItem is the new value, targetItem is the original (missing data)\n * We want to preserve targetItem properties and let sourceItem override\n */\n function mergeArrayElement(\n sourceItem: unknown,\n targetItem: unknown\n ): unknown {\n if (targetItem === undefined) {\n return sourceItem;\n }\n // If both are objects (not arrays), deep merge them\n // targetItem (original) is base, sourceItem (new) overrides\n if (\n sourceItem !== null &&\n typeof sourceItem === 'object' &&\n !Array.isArray(sourceItem) &&\n targetItem !== null &&\n typeof targetItem === 'object' &&\n !Array.isArray(targetItem)\n ) {\n // Merge: target (original) is base, source (new) overrides\n return mergeObjects(\n sourceItem as Record<string, unknown>,\n targetItem as Record<string, unknown>\n );\n }\n // Otherwise, prefer source item (new value)\n return sourceItem;\n }\n\n /**\n * Deep merge two objects recursively\n * Target (original/missing data) is the base, source (new value) overrides\n */\n function mergeObjects(\n source: Record<string, unknown>,\n target: Record<string, unknown>\n ): Record<string, unknown> {\n // Start with target (original) to preserve all its properties\n const result = { ...target };\n for (const key in source) {\n if (key in result) {\n // Deep merge nested properties (target is base, source overrides)\n result[key] = deepMergePreserveType(source[key], result[key]);\n } else {\n // Add new properties from source\n result[key] = source[key];\n }\n }\n return result;\n }\n\n /**\n * Deep merge two values while preserving their structure.\n * - Arrays:\n * - If both are arrays of objects: merge element-wise\n * - If both are arrays of primitives: use source (replacement)\n * - Otherwise: use source\n * - Objects: deep merge nested properties\n * - Primitives: use source value\n */\n function deepMergePreserveType<T>(source: T, target: unknown): T {\n if (target === undefined || target === null) {\n return source;\n }\n\n if (Array.isArray(source)) {\n if (Array.isArray(target)) {\n const sourceArr = source as unknown[];\n const targetArr = target as unknown[];\n\n // If both are arrays of objects, merge element-wise\n if (isArrayOfObjects(sourceArr) && isArrayOfObjects(targetArr)) {\n // Merge element-wise: for each source item, merge with corresponding target item\n // Use the length of source array (new values take precedence)\n return sourceArr.map((item, index) => {\n const targetItem = targetArr[index];\n // If target has a corresponding item, merge them (target properties preserved, source overrides)\n if (targetItem !== undefined) {\n return mergeArrayElement(item, targetItem);\n }\n // If no target item, use source item\n return item;\n }) as T;\n }\n\n // For arrays of primitives:\n // - If source is empty, use it (replacement/clear)\n // - Otherwise, concatenate target then source (preserve original, add new)\n if (sourceArr.length === 0) {\n return source;\n }\n return [...targetArr, ...sourceArr] as T;\n }\n return source;\n }\n\n if (source !== null && typeof source === 'object') {\n if (\n target !== null &&\n typeof target === 'object' &&\n !Array.isArray(target)\n ) {\n return mergeObjects(\n source as Record<string, unknown>,\n target as Record<string, unknown>\n ) as T;\n }\n return source;\n }\n\n return source;\n }\n\n export function updateAt<\n obj extends Record<string, unknown>,\n path extends DeepKeys<obj>\n >(options: updateAtOptions<obj, path>) {\n const { obj, partial, paths, value } = options;\n const norm = normalizePaths(...paths);\n if (norm.length === 0) return obj;\n\n let result = obj;\n let resolvedValue = value;\n\n if (partial) {\n const missingPaths = findMissingPaths(obj, paths, value);\n\n let missingData = joinAtPath(\n missingPaths as Array<path>,\n obj,\n resolvedValue\n );\n\n // For arrays and objects, if missingData is undefined or empty object, we need to get the original value\n // This can happen when:\n // 1. missingPaths is empty (because createDeep skips arrays)\n // 2. missingPaths has paths but joinAtPath returns undefined or {} (paths don't contain .defaultValue.)\n if (\n missingData === undefined ||\n (typeof missingData === 'object' &&\n missingData !== null &&\n Object.keys(missingData).length === 0)\n ) {\n if (norm.length === 1) {\n // Single path: get the original value at that path\n const originalValue = getBy(obj, norm[0]);\n if (originalValue !== undefined) {\n if (Array.isArray(originalValue) && Array.isArray(resolvedValue)) {\n if (resolvedValue.length > 0) {\n missingData = originalValue as pickBy<obj, path>;\n }\n } else if (\n originalValue !== null &&\n typeof originalValue === 'object' &&\n !Array.isArray(originalValue) &&\n resolvedValue !== null &&\n typeof resolvedValue === 'object' &&\n !Array.isArray(resolvedValue)\n ) {\n missingData = originalValue;\n }\n }\n } else if (norm.length > 1) {\n // Multiple paths: build an object with original values at each path\n const originalData: Record<string, unknown> = {};\n for (const p of norm) {\n const originalValue = getBy(obj, p);\n if (originalValue !== undefined) {\n // Set the value at the path in the root-shaped object\n setBy(originalData, p, originalValue);\n }\n }\n if (Object.keys(originalData).length > 0) {\n missingData = originalData as pickBy<obj, path>;\n }\n }\n }\n\n // Merge missingData into resolvedValue while preserving structure\n resolvedValue = deepMergePreserveType(resolvedValue, missingData);\n }\n\n if (norm.length === 1) {\n // single path: value is relative at that path\n const path = norm[0] as DeepKeys<obj>;\n\n result = setAtImmutable(result, path, resolvedValue as never);\n\n return result;\n }\n\n // multiple paths:\n // value is the root-shaped object that contains all those paths\n // Use resolvedValue (which has been merged with missingData if partial) instead of value\n for (const path of norm) {\n const sub = getBy(resolvedValue, path);\n\n result = setAtImmutable(result, path as DeepKeys<obj>, sub);\n }\n\n return result;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.mts","names":[],"sources":["../../src/utils/validator.ts"],"sourcesContent":[],"mappings":";UAAiB,kDAAkD;EAAlD,SAAA,WAAA,EACO,gBAAA,CAAiB,KADD,CACO,KADP,EACc,MADd,CAAA;;AACO,kBAGtB,gBAAA,CAHsB;EAAO;EAA9B,UAAA,KAAiB,CAAA,QAAA,OAAA,EAAA,SAKU,KALV,CAAA,CAAA;IAAK;IAGrB,SAAA,OAAgB,EAAA,CAAA;IAEU;IAQnC,SAAA,MAAA,EAAA,MAAA;IAAP;IAAgC,SAAA,QAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAhC,MAAgC,CAAzB,MAAyB,CAAA,GAAf,OAAe,CAAP,MAAO,CAAA,MAAA,CAAA,CAAA;IAAP;IAAR,SAAA,KAAA,CAAA,EAEL,KAFK,CAEC,KAFD,EAEQ,MAFR,CAAA,GAAA,SAAA;EAEC;EAAO;EAAb,KAAA,MAAA,CAAA,MAAA,CAAA,GAIU,aAJV,CAIwB,MAJxB,CAAA,GAIkC,aAJlC;EAIwB;EAAd,UAAA,aAAA,CAAA,MAAA,CAAA,CAAA;IAAwB;IAKnC,SAAA,KAAA,EAAA,MAAA;IAQe;IAAd,SAAA,MAAA,CAAA,EAAA,SAAA;EAQa;EAAc;EAA5B,UAAA,aAAA,CAAA;IAMF;IAIiC,SAAA,MAAA,EAlB9B,aAkB8B,CAlBhB,KAkBgB,CAAA;EAE/B;EAEC;EAImB,UAAA,KAAA,CAAA;IACpC;IAD+D,SAAA,OAAA,EAAA,MAAA;IAK1B;IACrC,SAAA,IAAA,CAAA,EAxBgB,aAwBhB,CAxB8B,WAwB9B,GAxB4C,WAwB5C,CAAA,GAAA,SAAA;EADgE;EAAW;EAM9D,UAAA,WAAgB,CAAA;IAEtB;IACC,SAAA,GAAA,EA1BM,WA0BN;EAEiB;EAAO;EAEnB,UAAA,KAAY,CAAA,QAAA,OAAA,EAAA,SA1BsB,KA0BtB,CAAA,CAAA;IACR;IAAQ,SAAA,KAAA,EAzBT,KAyBS;IAApB;IAAW,SAAA,MAAA,EAvBC,MAuBD;EAER;EACA;EACI,KAAA,UAAA,CAAA,eAvBwB,uBAuBxB,CAAA,GAvBmD,WAuBnD,CAtBZ,MAsBY,CAAA,WAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,OAAA,CAAA;EAAO;EAAnB,KAAA,WAAA,CAAA,eAlBqC,uBAkBrC,CAAA,GAlBgE,WAkBhE,CAjBA,MAiBA,CAAA,WAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CAAA,QAAA,CAAA;;AAC+B,UAblB,gBAakB,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA;EAA/B,KAAA,EAAA;IAAuB,KAAA,EAXhB,MAWgB;IACf,MAAA,EAXA,OAWS;EACT,CAAA;EAA6B,KAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAVZ,OAUY;;AAAV,UARd,YAQc,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA;EAAS,KAAA,EAP/B,WAO+B,CAPnB,MAOmB,EAPX,OAOW,CAAA;AACxC;AACY,KAPA,WAOY,CAAA,KAAA,
|
|
1
|
+
{"version":3,"file":"validator.d.mts","names":[],"sources":["../../src/utils/validator.ts"],"sourcesContent":[],"mappings":"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"}
|