data-path 2.0.0 → 2.0.1
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/index.cjs +12 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +12 -23
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -82,29 +82,13 @@ function matchesPrefix(full, prefix) {
|
|
|
82
82
|
return false;
|
|
83
83
|
}
|
|
84
84
|
if (f >= full.length) return false;
|
|
85
|
+
if (full[f] === DEEP_WILDCARD && prefix[p] !== DEEP_WILDCARD) return false;
|
|
85
86
|
if (prefix[p] !== WILDCARD && prefix[p] !== full[f]) return false;
|
|
86
87
|
p++;
|
|
87
88
|
f++;
|
|
88
89
|
}
|
|
89
90
|
return p === prefix.length;
|
|
90
91
|
}
|
|
91
|
-
function patternMatches(pattern, concrete) {
|
|
92
|
-
function walk(pi, ci) {
|
|
93
|
-
if (pi === pattern.length) return ci === concrete.length;
|
|
94
|
-
const seg = pattern[pi];
|
|
95
|
-
if (seg === DEEP_WILDCARD) {
|
|
96
|
-
for (let skip = 0; ci + skip <= concrete.length; skip++) {
|
|
97
|
-
if (walk(pi + 1, ci + skip)) return true;
|
|
98
|
-
}
|
|
99
|
-
return false;
|
|
100
|
-
}
|
|
101
|
-
if (ci === concrete.length) return false;
|
|
102
|
-
if (seg === WILDCARD) return walk(pi + 1, ci + 1);
|
|
103
|
-
if (seg !== concrete[ci]) return false;
|
|
104
|
-
return walk(pi + 1, ci + 1);
|
|
105
|
-
}
|
|
106
|
-
return walk(0, 0);
|
|
107
|
-
}
|
|
108
92
|
function hasWildcardSegment(segments) {
|
|
109
93
|
for (const s of segments) {
|
|
110
94
|
if (s === WILDCARD || s === DEEP_WILDCARD) return true;
|
|
@@ -141,13 +125,18 @@ var AbstractPathImpl = class {
|
|
|
141
125
|
match(other) {
|
|
142
126
|
const otherSegs = resolveSegments(other);
|
|
143
127
|
if (segmentsEqual(this.segments, otherSegs)) return { relation: "equals" };
|
|
144
|
-
|
|
145
|
-
|
|
128
|
+
const thisHasWild = hasWildcardSegment(this.segments);
|
|
129
|
+
const otherHasWild = hasWildcardSegment(otherSegs);
|
|
130
|
+
if (thisHasWild && matchesPrefix(otherSegs, this.segments))
|
|
131
|
+
return { relation: "covers" };
|
|
132
|
+
if (otherHasWild && matchesPrefix(this.segments, otherSegs))
|
|
146
133
|
return { relation: "covered-by" };
|
|
147
|
-
if (!
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
134
|
+
if (!thisHasWild && !otherHasWild) {
|
|
135
|
+
if (matchesPrefix(this.segments, otherSegs) && this.segments.length > otherSegs.length)
|
|
136
|
+
return { relation: "child" };
|
|
137
|
+
if (matchesPrefix(otherSegs, this.segments) && otherSegs.length > this.segments.length)
|
|
138
|
+
return { relation: "parent" };
|
|
139
|
+
}
|
|
151
140
|
return null;
|
|
152
141
|
}
|
|
153
142
|
};
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils.ts","../src/impl/base-path-impl.ts","../src/impl/path-impl.ts","../src/path.ts"],"sourcesContent":["/**\n * data-path — typed object property paths\n */\n\nexport { DEEP_WILDCARD, WILDCARD } from \"./constants.js\";\nexport { path, unsafePath } from \"./path.js\";\nexport type {\n\tBasePath,\n\tCollectionItem,\n\tMatchRelation,\n\tMatchResult,\n\tPath,\n\tPathConstructor,\n\tPathExpression,\n\tPrimitive,\n\tResolvablePath,\n\tResolvedType,\n\tSegment,\n\tTemplatePath,\n\tTraversablePathMethods,\n\tUnsafePathConstructor,\n} from \"./types.js\";\n","export const PATH_SEGMENTS = Symbol(\"PATH_SEGMENTS\");\n\n/**\n * Sentinel for a single-level wildcard segment (`each`).\n *\n * Stored as a unique Symbol — NOT the string `\"*\"` — so that a legitimate\n * object key named `\"*\"` is preserved as a literal segment and never\n * reinterpreted as a wildcard by `.get`, `.expand`, `.covers`, `.match`, etc.\n *\n * Renders as `\"*\"` in `toString()` / `.$` for dot-notation compatibility.\n */\nexport const WILDCARD: unique symbol = Symbol(\"WILDCARD\");\n\n/**\n * Sentinel for a deep wildcard segment (`deep`).\n *\n * Same rationale as {@link WILDCARD}: stored as a unique Symbol so the\n * literal string `\"**\"` remains a valid (literal) object key.\n *\n * Renders as `\"**\"` in `toString()` / `.$`.\n */\nexport const DEEP_WILDCARD: unique symbol = Symbol(\"DEEP_WILDCARD\");\n","import { DEEP_WILDCARD, PATH_SEGMENTS, WILDCARD } from \"./constants.js\";\nimport type { ResolvablePath, Segment } from \"./types.js\";\n\n/**\n * Returns true only for strings that are the canonical representation of a\n * non-negative integer (e.g. \"0\", \"1\", \"123\"). Rejects \"01\", \"1e3\", \"-1\", etc.,\n * so that numeric-looking object keys are preserved as strings.\n */\nexport function isCanonicalArrayIndex(key: string): boolean {\n\tconst num = Number(key);\n\treturn (\n\t\tNumber.isInteger(num) && num >= 0 && num < 2 ** 32 && String(num) === key\n\t);\n}\n\nexport function resolveSegments(\n\ttarget: ResolvablePath<any>,\n): readonly Segment[] {\n\tif (typeof target === \"function\") {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = target(proxy) as unknown;\n\t\treturn (\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? []\n\t\t);\n\t}\n\tif (target != null && typeof target === \"object\" && \"segments\" in target) {\n\t\treturn (target as { segments: readonly Segment[] }).segments;\n\t}\n\treturn [];\n}\n\n// Returns `any` intentionally — the proxy is typed by the caller via PathExpression<T, V>\nexport function createPathProxy(segments: readonly Segment[]): any {\n\treturn new Proxy(\n\t\t{ [PATH_SEGMENTS]: segments },\n\t\t{\n\t\t\tget(target, key) {\n\t\t\t\tif (key === PATH_SEGMENTS)\n\t\t\t\t\treturn target[PATH_SEGMENTS as keyof typeof target];\n\t\t\t\t// Symbols (other than PATH_SEGMENTS) return undefined — not recordable segments\n\t\t\t\tif (typeof key === \"symbol\") return undefined;\n\t\t\t\t// Every string key becomes a new path segment\n\t\t\t\tconst next: Segment = isCanonicalArrayIndex(key) ? Number(key) : key;\n\t\t\t\treturn createPathProxy([...segments, next]);\n\t\t\t},\n\t\t},\n\t);\n}\n\nexport function segmentsEqual(\n\ta: readonly Segment[],\n\tb: readonly Segment[],\n): boolean {\n\tif (a.length !== b.length) return false;\n\treturn a.every((s, i) => s === b[i]);\n}\n\nexport function matchesPrefix(\n\tfull: readonly Segment[],\n\tprefix: readonly Segment[],\n): boolean {\n\t// Quick reject: only when prefix is too long even after every `**` collapses\n\t// to zero segments. (Each `**` can skip 0..N segments, so each one effectively\n\t// subtracts one from the minimum prefix length.)\n\tlet minPrefixLen = 0;\n\tfor (const s of prefix) if (s !== DEEP_WILDCARD) minPrefixLen++;\n\tif (minPrefixLen > full.length) return false;\n\n\tlet p = 0;\n\tlet f = 0;\n\twhile (p < prefix.length) {\n\t\tif (prefix[p] === DEEP_WILDCARD) {\n\t\t\tif (p === prefix.length - 1) return true;\n\t\t\tconst restPrefix = prefix.slice(p + 1);\n\t\t\tfor (let skip = 0; f + skip <= full.length; skip++) {\n\t\t\t\tif (matchesPrefix(full.slice(f + skip), restPrefix)) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif (f >= full.length) return false;\n\t\tif (prefix[p] !== WILDCARD && prefix[p] !== full[f]) return false;\n\t\tp++;\n\t\tf++;\n\t}\n\treturn p === prefix.length;\n}\n\n/**\n * Returns `true` iff `pattern` matches `concrete` exactly when wildcards\n * are expanded:\n * - `WILDCARD` (`*`) consumes exactly one segment.\n * - `DEEP_WILDCARD` (`**`) consumes zero or more segments.\n * - all other segments must be `===` to the corresponding concrete segment.\n *\n * Lengths need not match: a single `**` lets the pattern collapse to a\n * shorter concrete or stretch to a longer one. This is the \"covers\"\n * relation used by `.match()` and is broader than `matchesPrefix`, which\n * only requires the pattern to match a leading slice.\n */\nexport function patternMatches(\n\tpattern: readonly Segment[],\n\tconcrete: readonly Segment[],\n): boolean {\n\tfunction walk(pi: number, ci: number): boolean {\n\t\tif (pi === pattern.length) return ci === concrete.length;\n\t\tconst seg = pattern[pi];\n\t\tif (seg === DEEP_WILDCARD) {\n\t\t\tfor (let skip = 0; ci + skip <= concrete.length; skip++) {\n\t\t\t\tif (walk(pi + 1, ci + skip)) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif (ci === concrete.length) return false;\n\t\tif (seg === WILDCARD) return walk(pi + 1, ci + 1);\n\t\tif (seg !== concrete[ci]) return false;\n\t\treturn walk(pi + 1, ci + 1);\n\t}\n\treturn walk(0, 0);\n}\n\nfunction hasWildcardSegment(segments: readonly Segment[]): boolean {\n\tfor (const s of segments) {\n\t\tif (s === WILDCARD || s === DEEP_WILDCARD) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Returns `true` iff `segments` contains a wildcard sentinel\n * (`WILDCARD` or `DEEP_WILDCARD`).\n */\nexport { hasWildcardSegment };\n","import { DEEP_WILDCARD, WILDCARD } from \"../constants.js\";\nimport type {\n\tMatchResult,\n\tPath,\n\tResolvablePath,\n\tSegment,\n\tTemplatePath,\n} from \"../types.js\";\nimport {\n\thasWildcardSegment,\n\tmatchesPrefix,\n\tpatternMatches,\n\tresolveSegments,\n\tsegmentsEqual,\n} from \"../utils.js\";\n\n/**\n * Shared structural base for PathImpl and TemplatePathImpl.\n * Contains all methods that do not depend on how a path reads, writes, or\n * creates new concrete path instances.\n */\nexport abstract class AbstractPathImpl<T = unknown, V = unknown> {\n\treadonly segments: readonly Segment[];\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tthis.segments = segments;\n\t}\n\n\tget length(): number {\n\t\treturn this.segments.length;\n\t}\n\n\tget $(): string {\n\t\treturn this.toString();\n\t}\n\n\ttoString(): string {\n\t\treturn this.segments\n\t\t\t.map((s) =>\n\t\t\t\ts === WILDCARD ? \"*\" : s === DEEP_WILDCARD ? \"**\" : String(s),\n\t\t\t)\n\t\t\t.join(\".\");\n\t}\n\n\tstartsWith(other: ResolvablePath<T>): boolean {\n\t\treturn matchesPrefix(this.segments, resolveSegments(other));\n\t}\n\n\tcovers(other: ResolvablePath<T>): boolean {\n\t\treturn matchesPrefix(resolveSegments(other), this.segments);\n\t}\n\n\tequals(other: ResolvablePath<T>): boolean {\n\t\treturn segmentsEqual(this.segments, resolveSegments(other));\n\t}\n\n\tmatch(other: ResolvablePath<T>): MatchResult | null {\n\t\tconst otherSegs = resolveSegments(other);\n\t\tif (segmentsEqual(this.segments, otherSegs)) return { relation: \"equals\" };\n\n\t\t// Check wildcard coverage BEFORE literal prefix. patternMatches handles\n\t\t// `**` collapsing, so a deep template can fully cover a concrete path of\n\t\t// any length — that's a \"covers\", not \"parent\". Order matters: a literal\n\t\t// prefix check that's wildcard-aware (via matchesPrefix) would otherwise\n\t\t// misclassify \"a.**.b covers a.x.y.b\" as \"parent\".\n\t\tif (patternMatches(this.segments, otherSegs)) return { relation: \"covers\" };\n\t\tif (patternMatches(otherSegs, this.segments))\n\t\t\treturn { relation: \"covered-by\" };\n\n\t\t// Literal parent/child: the shorter side must be wildcard-free, otherwise\n\t\t// it's not a literal prefix.\n\t\tif (\n\t\t\t!hasWildcardSegment(otherSegs) &&\n\t\t\tmatchesPrefix(this.segments, otherSegs) &&\n\t\t\tthis.segments.length > otherSegs.length\n\t\t)\n\t\t\treturn { relation: \"child\" };\n\t\tif (\n\t\t\t!hasWildcardSegment(this.segments) &&\n\t\t\tmatchesPrefix(otherSegs, this.segments) &&\n\t\t\totherSegs.length > this.segments.length\n\t\t)\n\t\t\treturn { relation: \"parent\" };\n\t\treturn null;\n\t}\n\n\t// Abstract — implementations create PathImpl or TemplatePathImpl instances which live in path-impl.ts.\n\t// TemplatePathImpl widens these to also allow returning a TemplatePath when the resulting\n\t// segments still contain wildcards.\n\tabstract parent(): Path<T, unknown> | TemplatePath<T, unknown> | null;\n\tabstract subtract<U>(\n\t\tprefix: ResolvablePath<T, U>,\n\t): Path<U, V> | TemplatePath<U, V> | null;\n\tabstract slice(\n\t\tstart?: number,\n\t\tend?: number,\n\t): Path<T, unknown> | TemplatePath<T, unknown>;\n}\n\n// Re-export constants used by both PathImpl and TemplatePathImpl so callers\n// don't need an extra import just for the wildcard check.\nexport { DEEP_WILDCARD, WILDCARD };\n","import { PATH_SEGMENTS } from \"../constants.js\";\nimport type {\n\tBasePath,\n\tCollectionItem,\n\tPath,\n\tResolvablePath,\n\tSegment,\n\tTemplatePath,\n\tTraversablePathMethods,\n} from \"../types.js\";\nimport { createPathProxy, resolveSegments, segmentsEqual } from \"../utils.js\";\nimport { AbstractPathImpl, DEEP_WILDCARD, WILDCARD } from \"./base-path-impl.js\";\n\n// ---------------------------------------------------------------------------\n// PathImpl — concrete path with no wildcards\n// ---------------------------------------------------------------------------\n\nexport class PathImpl<T = unknown, V = unknown>\n\textends AbstractPathImpl<T, V>\n\timplements BasePath<T, V>, TraversablePathMethods<T, V>\n{\n\treadonly fn: (data: T) => V | undefined;\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tsuper(segments);\n\t\tthis.fn = (data: T) => this.get(data);\n\t}\n\n\tget(data: T): V | undefined {\n\t\tlet current: unknown = data;\n\t\tfor (const seg of this.segments) {\n\t\t\tif (current == null) return undefined;\n\t\t\tcurrent = (current as Record<PropertyKey, unknown>)[seg];\n\t\t}\n\t\treturn current as V | undefined;\n\t}\n\n\tset(data: T, value: V): T {\n\t\tif (this.segments.length === 0) return value as unknown as T;\n\n\t\tconst setAt = (\n\t\t\tobj: unknown,\n\t\t\tsegs: readonly Segment[],\n\t\t\tval: unknown,\n\t\t): unknown => {\n\t\t\tif (segs.length === 1) {\n\t\t\t\tconst key = segs[0];\n\t\t\t\tif (Array.isArray(obj)) {\n\t\t\t\t\tconst arr = [...obj];\n\t\t\t\t\tarr[key as number] = val;\n\t\t\t\t\treturn arr;\n\t\t\t\t}\n\t\t\t\treturn { ...(obj as object), [key]: val };\n\t\t\t}\n\t\t\tconst [first, ...rest] = segs;\n\t\t\tconst baseObj = obj as Record<PropertyKey, unknown>;\n\t\t\tconst next = baseObj[first];\n\t\t\tconst nextCopy =\n\t\t\t\tnext != null && typeof next === \"object\"\n\t\t\t\t\t? Array.isArray(next)\n\t\t\t\t\t\t? [...next]\n\t\t\t\t\t\t: { ...next }\n\t\t\t\t\t: typeof rest[0] === \"number\"\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: {};\n\t\t\tif (Array.isArray(baseObj)) {\n\t\t\t\tconst arr = [...baseObj];\n\t\t\t\tarr[first as number] = setAt(nextCopy, rest, val) as never;\n\t\t\t\treturn arr;\n\t\t\t}\n\t\t\treturn { ...baseObj, [first]: setAt(nextCopy, rest, val) };\n\t\t};\n\n\t\tconst baseObj =\n\t\t\ttypeof data === \"object\" && data !== null\n\t\t\t\t? Array.isArray(data)\n\t\t\t\t\t? [...data]\n\t\t\t\t\t: { ...data }\n\t\t\t\t: data;\n\t\treturn setAt(baseObj, this.segments, value) as T;\n\t}\n\n\tupdate(data: T, updater: (current: V | undefined) => V): T {\n\t\treturn this.set(data, updater(this.get(data)));\n\t}\n\n\tparent(): Path<T, unknown> | null {\n\t\tif (this.segments.length === 0) return null;\n\t\treturn makeConcrete<T, unknown>(\n\t\t\tthis.segments.slice(0, -1),\n\t\t) as unknown as Path<T, unknown>;\n\t}\n\n\tsubtract<U>(prefix: ResolvablePath<T, U>): Path<U, V> | null {\n\t\tconst a = this.segments;\n\t\tconst b = resolveSegments(prefix);\n\t\tif (b.length > a.length) return null;\n\t\tif (!segmentsEqual(a.slice(0, b.length), b)) return null;\n\t\treturn makeConcrete<U, V>(a.slice(b.length)) as unknown as Path<U, V>;\n\t}\n\n\tslice(start?: number, end?: number): Path<T, unknown> {\n\t\treturn makeConcrete<T, unknown>(\n\t\t\tthis.segments.slice(start, end),\n\t\t) as unknown as Path<T, unknown>;\n\t}\n\n\teach<U = CollectionItem<V>>(\n\t\texpr?: (item: CollectionItem<V>) => U,\n\t): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tWILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tdeep<U = V>(expr?: (leaf: V) => U): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tDEEP_WILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tto<U>(relative: ResolvablePath<V, U>): Path<T, U> | TemplatePath<T, U> {\n\t\treturn makeFromSegments<T, U>([\n\t\t\t...this.segments,\n\t\t\t...resolveSegments(relative),\n\t\t]) as unknown as Path<T, U> | TemplatePath<T, U>;\n\t}\n\n\tmerge<U>(other: ResolvablePath<T, U>): Path<T, U> | TemplatePath<T, U> {\n\t\treturn makeFromSegments<T, U>(\n\t\t\tmergeSegments(this.segments, resolveSegments(other)),\n\t\t) as unknown as Path<T, U> | TemplatePath<T, U>;\n\t}\n}\n\n/**\n * Returns a concrete `PathImpl` when `segments` contains no wildcard\n * sentinels, otherwise a `TemplatePathImpl` so `.get()` correctly expands\n * matches.\n *\n * Safe by construction: wildcards are unique Symbols (see\n * {@link WILDCARD} / {@link DEEP_WILDCARD}). Legitimate object keys named\n * `\"*\"` or `\"**\"` are stored as strings and never trigger the template\n * branch.\n */\nfunction makeFromSegments<T, V>(\n\tsegments: readonly Segment[],\n): PathImpl<T, V> | TemplatePathImpl<T, V> {\n\treturn hasWildcard(segments)\n\t\t? new TemplatePathImpl<T, V>(segments)\n\t\t: new PathImpl<T, V>(segments);\n}\n\nfunction hasWildcard(segments: readonly Segment[]): boolean {\n\tfor (const s of segments) {\n\t\tif (s === WILDCARD || s === DEEP_WILDCARD) return true;\n\t}\n\treturn false;\n}\n\n// ---------------------------------------------------------------------------\n// TemplatePathImpl — path containing * or ** wildcards\n// ---------------------------------------------------------------------------\n\nexport class TemplatePathImpl<\n\tT = unknown,\n\tV = unknown,\n> extends AbstractPathImpl<T, V> {\n\t// fn returns V[] (not V|undefined) — no covariance conflict since we don't\n\t// extend PathImpl; the declared type here matches TemplatePath<T,V>.fn.\n\treadonly fn: (data: T) => V[];\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tsuper(segments);\n\t\tthis.fn = (data: T) => this.get(data);\n\t}\n\n\tget(data: T): V[] {\n\t\treturn this.expand(data).map(\n\t\t\t// expand() only returns paths where the key exists in data, so get() is safe\n\t\t\t(p) => p.get(data) as V,\n\t\t);\n\t}\n\n\tset(data: T, value: V): T {\n\t\tconst paths = this.expand(data);\n\t\tlet current = data;\n\t\tfor (const p of paths) {\n\t\t\tcurrent = p.set(current, value);\n\t\t}\n\t\treturn current;\n\t}\n\n\t/**\n\t * Applies `updater` to each matched value individually (per-item transform).\n\t * Use `.set(data, constant)` to assign the same value to every match.\n\t */\n\tupdate(data: T, updater: (current: V | undefined) => V): T {\n\t\tconst paths = this.expand(data);\n\t\tlet current = data;\n\t\tfor (const p of paths) {\n\t\t\tcurrent = p.set(current, updater(p.get(current)));\n\t\t}\n\t\treturn current;\n\t}\n\n\tparent(): Path<T, unknown> | TemplatePath<T, unknown> | null {\n\t\tif (this.segments.length === 0) return null;\n\t\treturn makeFromSegments<T, unknown>(\n\t\t\tthis.segments.slice(0, -1),\n\t\t) as unknown as Path<T, unknown> | TemplatePath<T, unknown>;\n\t}\n\n\tsubtract<U>(\n\t\tprefix: ResolvablePath<T, U>,\n\t): Path<U, V> | TemplatePath<U, V> | null {\n\t\tconst a = this.segments;\n\t\tconst b = resolveSegments(prefix);\n\t\tif (b.length > a.length) return null;\n\t\tif (!segmentsEqual(a.slice(0, b.length), b)) return null;\n\t\treturn makeFromSegments<U, V>(a.slice(b.length)) as unknown as\n\t\t\t| Path<U, V>\n\t\t\t| TemplatePath<U, V>;\n\t}\n\n\tslice(\n\t\tstart?: number,\n\t\tend?: number,\n\t): Path<T, unknown> | TemplatePath<T, unknown> {\n\t\treturn makeFromSegments<T, unknown>(\n\t\t\tthis.segments.slice(start, end),\n\t\t) as unknown as Path<T, unknown> | TemplatePath<T, unknown>;\n\t}\n\n\teach<U = CollectionItem<V>>(\n\t\texpr?: (item: CollectionItem<V>) => U,\n\t): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tWILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tdeep<U = V>(expr?: (leaf: V) => U): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tDEEP_WILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tto<U>(relative: ResolvablePath<V, U>): TemplatePath<T, U> {\n\t\tconst tail = resolveSegments(relative);\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tmerge<U>(other: ResolvablePath<T, U>): TemplatePath<T, U> {\n\t\treturn new TemplatePathImpl<T, U>(\n\t\t\tmergeSegments(this.segments, resolveSegments(other)),\n\t\t) as unknown as TemplatePath<T, U>;\n\t}\n\n\t/**\n\t * Resolves this template to all concrete paths that exist in `data`.\n\t */\n\texpand(data: T): Path<T, V>[] {\n\t\tconst results: Path<T, V>[] = [];\n\n\t\tconst walk = (current: unknown, idx: number, acc: Segment[]): void => {\n\t\t\tif (idx >= this.segments.length) {\n\t\t\t\tresults.push(new PathImpl<T, V>(acc));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst seg = this.segments[idx];\n\n\t\t\tif (seg === WILDCARD) {\n\t\t\t\tif (current != null && typeof current === \"object\") {\n\t\t\t\t\tconst keys = Array.isArray(current)\n\t\t\t\t\t\t? (Array.from(current.keys()) as number[])\n\t\t\t\t\t\t: Object.keys(current);\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[key], idx + 1, [\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (seg === DEEP_WILDCARD) {\n\t\t\t\t// Try matching rest of pattern at current depth\n\t\t\t\twalk(current, idx + 1, acc);\n\t\t\t\t// Recurse into every child\n\t\t\t\tif (current != null && typeof current === \"object\") {\n\t\t\t\t\tconst keys = Array.isArray(current)\n\t\t\t\t\t\t? (Array.from(current.keys()) as number[])\n\t\t\t\t\t\t: Object.keys(current);\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[key], idx, [\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tcurrent != null &&\n\t\t\t\t\ttypeof current === \"object\" &&\n\t\t\t\t\tseg in (current as object)\n\t\t\t\t) {\n\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[seg], idx + 1, [\n\t\t\t\t\t\t...acc,\n\t\t\t\t\t\tseg,\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\twalk(data, 0, []);\n\t\treturn results;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\nfunction makeConcrete<T, V>(segments: readonly Segment[]): PathImpl<T, V> {\n\treturn new PathImpl<T, V>(segments);\n}\n\nfunction evalExpr(expr: (proxy: unknown) => unknown): readonly Segment[] {\n\tconst proxy = createPathProxy([]);\n\tconst result = expr(proxy);\n\treturn (\n\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? []\n\t);\n}\n\nfunction mergeSegments(\n\ta: readonly Segment[],\n\tb: readonly Segment[],\n): readonly Segment[] {\n\tlet overlapLen = 0;\n\tfor (let len = Math.min(a.length, b.length); len >= 1; len--) {\n\t\tif (segmentsEqual(a.slice(-len), b.slice(0, len))) {\n\t\t\toverlapLen = len;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn overlapLen > 0 ? [...a.slice(0, -overlapLen), ...b] : [...a, ...b];\n}\n","import { PATH_SEGMENTS } from \"./constants.js\";\nimport { PathImpl } from \"./impl/path-impl.js\";\nimport type { BasePath, Path, PathExpression, Segment } from \"./types.js\";\nimport { createPathProxy, isCanonicalArrayIndex } from \"./utils.js\";\n\n/**\n * Create a typed path from a lambda expression, from an existing base path, or as a root.\n *\n * @example\n * // Lambda — recommended: annotate the parameter so both T and V are inferred\n * const p = path((user: User) => user.profile.firstName);\n *\n * @example\n * // Both generics explicit\n * const p = path<User, string>((u) => u.profile.firstName);\n *\n * @example\n * // Root path (no segments) — typically extended via .to() or path(root, expr)\n * const root = path<User>();\n *\n * @example\n * // Extend an existing base path\n * const p2 = path(root, (u) => u.profile);\n */\nexport function path<T>(): Path<T, T>;\nexport function path<T, V = unknown>(expr: PathExpression<T, V>): Path<T, V>;\nexport function path<T, U, V = unknown>(\n\tbase: BasePath<T, U>,\n\texpr: PathExpression<U, V>,\n): Path<T, V>;\nexport function path<T, V = unknown>(\n\tbaseOrExpr?: BasePath<T, unknown> | PathExpression<T, V>,\n\texpr?: PathExpression<unknown, V>,\n): Path<T, V> {\n\tif (baseOrExpr === undefined) {\n\t\treturn new PathImpl<T, V>([]);\n\t}\n\n\tif (typeof baseOrExpr === \"function\") {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = (baseOrExpr as PathExpression<T, V>)(proxy);\n\t\tconst segments: Segment[] =\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? [];\n\t\treturn new PathImpl<T, V>(segments);\n\t}\n\n\tconst baseSegments = (baseOrExpr as BasePath<T, unknown>).segments;\n\tif (expr !== undefined) {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = (expr as PathExpression<unknown, V>)(proxy);\n\t\tconst tailSegments =\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? [];\n\t\treturn new PathImpl<T, V>([...baseSegments, ...tailSegments]);\n\t}\n\n\treturn new PathImpl<T, V>(baseSegments);\n}\n\n/**\n * Create a path from a raw dot-separated string (e.g. `\"users.0.name\"`).\n *\n * Useful for dynamic paths from external sources (API responses, Zod issue paths, etc.).\n * Segments that are canonical non-negative integers are stored as numbers; all others as strings.\n *\n * The optional second generic `V` declares the expected leaf type without a cast:\n * ```ts\n * unsafePath<User, string>(\"profile.firstName\").get(user) // string | undefined\n * ```\n *\n * @param raw Dot-separated string. Empty string returns a zero-segment root path.\n */\nexport function unsafePath<T, V = unknown>(raw: string): Path<T, V> {\n\tconst segments: Segment[] = raw\n\t\t? raw\n\t\t\t\t.split(\".\")\n\t\t\t\t.map((s) => (s === \"\" ? s : isCanonicalArrayIndex(s) ? Number(s) : s))\n\t\t: [];\n\treturn new PathImpl<T, V>(segments);\n}\n"],"mappings":"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","names":["baseObj"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/utils.ts","../src/impl/base-path-impl.ts","../src/impl/path-impl.ts","../src/path.ts"],"sourcesContent":["/**\n * data-path — typed object property paths\n */\n\nexport { DEEP_WILDCARD, WILDCARD } from \"./constants.js\";\nexport { path, unsafePath } from \"./path.js\";\nexport type {\n\tBasePath,\n\tCollectionItem,\n\tMatchRelation,\n\tMatchResult,\n\tPath,\n\tPathConstructor,\n\tPathExpression,\n\tPrimitive,\n\tResolvablePath,\n\tResolvedType,\n\tSegment,\n\tTemplatePath,\n\tTraversablePathMethods,\n\tUnsafePathConstructor,\n} from \"./types.js\";\n","export const PATH_SEGMENTS = Symbol(\"PATH_SEGMENTS\");\n\n/**\n * Sentinel for a single-level wildcard segment (`each`).\n *\n * Stored as a unique Symbol — NOT the string `\"*\"` — so that a legitimate\n * object key named `\"*\"` is preserved as a literal segment and never\n * reinterpreted as a wildcard by `.get`, `.expand`, `.covers`, `.match`, etc.\n *\n * Renders as `\"*\"` in `toString()` / `.$` for dot-notation compatibility.\n */\nexport const WILDCARD: unique symbol = Symbol(\"WILDCARD\");\n\n/**\n * Sentinel for a deep wildcard segment (`deep`).\n *\n * Same rationale as {@link WILDCARD}: stored as a unique Symbol so the\n * literal string `\"**\"` remains a valid (literal) object key.\n *\n * Renders as `\"**\"` in `toString()` / `.$`.\n */\nexport const DEEP_WILDCARD: unique symbol = Symbol(\"DEEP_WILDCARD\");\n","import { DEEP_WILDCARD, PATH_SEGMENTS, WILDCARD } from \"./constants.js\";\nimport type { ResolvablePath, Segment } from \"./types.js\";\n\n/**\n * Returns true only for strings that are the canonical representation of a\n * non-negative integer (e.g. \"0\", \"1\", \"123\"). Rejects \"01\", \"1e3\", \"-1\", etc.,\n * so that numeric-looking object keys are preserved as strings.\n */\nexport function isCanonicalArrayIndex(key: string): boolean {\n\tconst num = Number(key);\n\treturn (\n\t\tNumber.isInteger(num) && num >= 0 && num < 2 ** 32 && String(num) === key\n\t);\n}\n\nexport function resolveSegments(\n\ttarget: ResolvablePath<any>,\n): readonly Segment[] {\n\tif (typeof target === \"function\") {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = target(proxy) as unknown;\n\t\treturn (\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? []\n\t\t);\n\t}\n\tif (target != null && typeof target === \"object\" && \"segments\" in target) {\n\t\treturn (target as { segments: readonly Segment[] }).segments;\n\t}\n\treturn [];\n}\n\n// Returns `any` intentionally — the proxy is typed by the caller via PathExpression<T, V>\nexport function createPathProxy(segments: readonly Segment[]): any {\n\treturn new Proxy(\n\t\t{ [PATH_SEGMENTS]: segments },\n\t\t{\n\t\t\tget(target, key) {\n\t\t\t\tif (key === PATH_SEGMENTS)\n\t\t\t\t\treturn target[PATH_SEGMENTS as keyof typeof target];\n\t\t\t\t// Symbols (other than PATH_SEGMENTS) return undefined — not recordable segments\n\t\t\t\tif (typeof key === \"symbol\") return undefined;\n\t\t\t\t// Every string key becomes a new path segment\n\t\t\t\tconst next: Segment = isCanonicalArrayIndex(key) ? Number(key) : key;\n\t\t\t\treturn createPathProxy([...segments, next]);\n\t\t\t},\n\t\t},\n\t);\n}\n\nexport function segmentsEqual(\n\ta: readonly Segment[],\n\tb: readonly Segment[],\n): boolean {\n\tif (a.length !== b.length) return false;\n\treturn a.every((s, i) => s === b[i]);\n}\n\nexport function matchesPrefix(\n\tfull: readonly Segment[],\n\tprefix: readonly Segment[],\n): boolean {\n\t// Quick reject: only when prefix is too long even after every `**` collapses\n\t// to zero segments. (Each `**` can skip 0..N segments, so each one effectively\n\t// subtracts one from the minimum prefix length.)\n\tlet minPrefixLen = 0;\n\tfor (const s of prefix) if (s !== DEEP_WILDCARD) minPrefixLen++;\n\tif (minPrefixLen > full.length) return false;\n\n\tlet p = 0;\n\tlet f = 0;\n\twhile (p < prefix.length) {\n\t\tif (prefix[p] === DEEP_WILDCARD) {\n\t\t\tif (p === prefix.length - 1) return true;\n\t\t\tconst restPrefix = prefix.slice(p + 1);\n\t\t\tfor (let skip = 0; f + skip <= full.length; skip++) {\n\t\t\t\tif (matchesPrefix(full.slice(f + skip), restPrefix)) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif (f >= full.length) return false;\n\t\t// `**` on `full`'s side stands for 0..N segments; a single-segment\n\t\t// element in `prefix` (literal or `*`) can't absorb it. Without this\n\t\t// guard, `prefix.WILDCARD` short-circuits the next check and silently\n\t\t// treats `**` as one segment.\n\t\tif (full[f] === DEEP_WILDCARD && prefix[p] !== DEEP_WILDCARD) return false;\n\t\tif (prefix[p] !== WILDCARD && prefix[p] !== full[f]) return false;\n\t\tp++;\n\t\tf++;\n\t}\n\treturn p === prefix.length;\n}\n\n/**\n * Returns `true` iff `segments` contains a wildcard sentinel\n * (`WILDCARD` or `DEEP_WILDCARD`).\n */\nexport function hasWildcardSegment(segments: readonly Segment[]): boolean {\n\tfor (const s of segments) {\n\t\tif (s === WILDCARD || s === DEEP_WILDCARD) return true;\n\t}\n\treturn false;\n}\n","import { DEEP_WILDCARD, WILDCARD } from \"../constants.js\";\nimport type {\n\tMatchResult,\n\tPath,\n\tResolvablePath,\n\tSegment,\n\tTemplatePath,\n} from \"../types.js\";\nimport {\n\thasWildcardSegment,\n\tmatchesPrefix,\n\tresolveSegments,\n\tsegmentsEqual,\n} from \"../utils.js\";\n\n/**\n * Shared structural base for PathImpl and TemplatePathImpl.\n * Contains all methods that do not depend on how a path reads, writes, or\n * creates new concrete path instances.\n */\nexport abstract class AbstractPathImpl<T = unknown, V = unknown> {\n\treadonly segments: readonly Segment[];\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tthis.segments = segments;\n\t}\n\n\tget length(): number {\n\t\treturn this.segments.length;\n\t}\n\n\tget $(): string {\n\t\treturn this.toString();\n\t}\n\n\ttoString(): string {\n\t\treturn this.segments\n\t\t\t.map((s) =>\n\t\t\t\ts === WILDCARD ? \"*\" : s === DEEP_WILDCARD ? \"**\" : String(s),\n\t\t\t)\n\t\t\t.join(\".\");\n\t}\n\n\tstartsWith(other: ResolvablePath<T>): boolean {\n\t\treturn matchesPrefix(this.segments, resolveSegments(other));\n\t}\n\n\tcovers(other: ResolvablePath<T>): boolean {\n\t\treturn matchesPrefix(resolveSegments(other), this.segments);\n\t}\n\n\tequals(other: ResolvablePath<T>): boolean {\n\t\treturn segmentsEqual(this.segments, resolveSegments(other));\n\t}\n\n\tmatch(other: ResolvablePath<T>): MatchResult | null {\n\t\tconst otherSegs = resolveSegments(other);\n\t\tif (segmentsEqual(this.segments, otherSegs)) return { relation: \"equals\" };\n\n\t\tconst thisHasWild = hasWildcardSegment(this.segments);\n\t\tconst otherHasWild = hasWildcardSegment(otherSegs);\n\n\t\t// Wildcard coverage: a wildcard-bearing side covers the other when its\n\t\t// segments form a prefix-pattern of the other's segments. This includes\n\t\t// both exact matches (template fully expands to the concrete) and prefix\n\t\t// matches (template covers a region the concrete sits inside).\n\t\t// `matchesPrefix(full, prefix)` returns true exactly in those cases when\n\t\t// the prefix carries wildcards, so it unifies what `.covers()` does with\n\t\t// what `.match()` should report.\n\t\tif (thisHasWild && matchesPrefix(otherSegs, this.segments))\n\t\t\treturn { relation: \"covers\" };\n\t\tif (otherHasWild && matchesPrefix(this.segments, otherSegs))\n\t\t\treturn { relation: \"covered-by\" };\n\n\t\t// Literal parent/child: both sides must be wildcard-free. A wildcard\n\t\t// prefix is not a literal prefix.\n\t\tif (!thisHasWild && !otherHasWild) {\n\t\t\tif (\n\t\t\t\tmatchesPrefix(this.segments, otherSegs) &&\n\t\t\t\tthis.segments.length > otherSegs.length\n\t\t\t)\n\t\t\t\treturn { relation: \"child\" };\n\t\t\tif (\n\t\t\t\tmatchesPrefix(otherSegs, this.segments) &&\n\t\t\t\totherSegs.length > this.segments.length\n\t\t\t)\n\t\t\t\treturn { relation: \"parent\" };\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t// Abstract — implementations create PathImpl or TemplatePathImpl instances which live in path-impl.ts.\n\t// TemplatePathImpl widens these to also allow returning a TemplatePath when the resulting\n\t// segments still contain wildcards.\n\tabstract parent(): Path<T, unknown> | TemplatePath<T, unknown> | null;\n\tabstract subtract<U>(\n\t\tprefix: ResolvablePath<T, U>,\n\t): Path<U, V> | TemplatePath<U, V> | null;\n\tabstract slice(\n\t\tstart?: number,\n\t\tend?: number,\n\t): Path<T, unknown> | TemplatePath<T, unknown>;\n}\n\n// Re-export constants used by both PathImpl and TemplatePathImpl so callers\n// don't need an extra import just for the wildcard check.\nexport { DEEP_WILDCARD, WILDCARD };\n","import { PATH_SEGMENTS } from \"../constants.js\";\nimport type {\n\tBasePath,\n\tCollectionItem,\n\tPath,\n\tResolvablePath,\n\tSegment,\n\tTemplatePath,\n\tTraversablePathMethods,\n} from \"../types.js\";\nimport { createPathProxy, resolveSegments, segmentsEqual } from \"../utils.js\";\nimport { AbstractPathImpl, DEEP_WILDCARD, WILDCARD } from \"./base-path-impl.js\";\n\n// ---------------------------------------------------------------------------\n// PathImpl — concrete path with no wildcards\n// ---------------------------------------------------------------------------\n\nexport class PathImpl<T = unknown, V = unknown>\n\textends AbstractPathImpl<T, V>\n\timplements BasePath<T, V>, TraversablePathMethods<T, V>\n{\n\treadonly fn: (data: T) => V | undefined;\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tsuper(segments);\n\t\tthis.fn = (data: T) => this.get(data);\n\t}\n\n\tget(data: T): V | undefined {\n\t\tlet current: unknown = data;\n\t\tfor (const seg of this.segments) {\n\t\t\tif (current == null) return undefined;\n\t\t\tcurrent = (current as Record<PropertyKey, unknown>)[seg];\n\t\t}\n\t\treturn current as V | undefined;\n\t}\n\n\tset(data: T, value: V): T {\n\t\tif (this.segments.length === 0) return value as unknown as T;\n\n\t\tconst setAt = (\n\t\t\tobj: unknown,\n\t\t\tsegs: readonly Segment[],\n\t\t\tval: unknown,\n\t\t): unknown => {\n\t\t\tif (segs.length === 1) {\n\t\t\t\tconst key = segs[0];\n\t\t\t\tif (Array.isArray(obj)) {\n\t\t\t\t\tconst arr = [...obj];\n\t\t\t\t\tarr[key as number] = val;\n\t\t\t\t\treturn arr;\n\t\t\t\t}\n\t\t\t\treturn { ...(obj as object), [key]: val };\n\t\t\t}\n\t\t\tconst [first, ...rest] = segs;\n\t\t\tconst baseObj = obj as Record<PropertyKey, unknown>;\n\t\t\tconst next = baseObj[first];\n\t\t\tconst nextCopy =\n\t\t\t\tnext != null && typeof next === \"object\"\n\t\t\t\t\t? Array.isArray(next)\n\t\t\t\t\t\t? [...next]\n\t\t\t\t\t\t: { ...next }\n\t\t\t\t\t: typeof rest[0] === \"number\"\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: {};\n\t\t\tif (Array.isArray(baseObj)) {\n\t\t\t\tconst arr = [...baseObj];\n\t\t\t\tarr[first as number] = setAt(nextCopy, rest, val) as never;\n\t\t\t\treturn arr;\n\t\t\t}\n\t\t\treturn { ...baseObj, [first]: setAt(nextCopy, rest, val) };\n\t\t};\n\n\t\tconst baseObj =\n\t\t\ttypeof data === \"object\" && data !== null\n\t\t\t\t? Array.isArray(data)\n\t\t\t\t\t? [...data]\n\t\t\t\t\t: { ...data }\n\t\t\t\t: data;\n\t\treturn setAt(baseObj, this.segments, value) as T;\n\t}\n\n\tupdate(data: T, updater: (current: V | undefined) => V): T {\n\t\treturn this.set(data, updater(this.get(data)));\n\t}\n\n\tparent(): Path<T, unknown> | null {\n\t\tif (this.segments.length === 0) return null;\n\t\treturn makeConcrete<T, unknown>(\n\t\t\tthis.segments.slice(0, -1),\n\t\t) as unknown as Path<T, unknown>;\n\t}\n\n\tsubtract<U>(prefix: ResolvablePath<T, U>): Path<U, V> | null {\n\t\tconst a = this.segments;\n\t\tconst b = resolveSegments(prefix);\n\t\tif (b.length > a.length) return null;\n\t\tif (!segmentsEqual(a.slice(0, b.length), b)) return null;\n\t\treturn makeConcrete<U, V>(a.slice(b.length)) as unknown as Path<U, V>;\n\t}\n\n\tslice(start?: number, end?: number): Path<T, unknown> {\n\t\treturn makeConcrete<T, unknown>(\n\t\t\tthis.segments.slice(start, end),\n\t\t) as unknown as Path<T, unknown>;\n\t}\n\n\teach<U = CollectionItem<V>>(\n\t\texpr?: (item: CollectionItem<V>) => U,\n\t): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tWILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tdeep<U = V>(expr?: (leaf: V) => U): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tDEEP_WILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tto<U>(relative: ResolvablePath<V, U>): Path<T, U> | TemplatePath<T, U> {\n\t\treturn makeFromSegments<T, U>([\n\t\t\t...this.segments,\n\t\t\t...resolveSegments(relative),\n\t\t]) as unknown as Path<T, U> | TemplatePath<T, U>;\n\t}\n\n\tmerge<U>(other: ResolvablePath<T, U>): Path<T, U> | TemplatePath<T, U> {\n\t\treturn makeFromSegments<T, U>(\n\t\t\tmergeSegments(this.segments, resolveSegments(other)),\n\t\t) as unknown as Path<T, U> | TemplatePath<T, U>;\n\t}\n}\n\n/**\n * Returns a concrete `PathImpl` when `segments` contains no wildcard\n * sentinels, otherwise a `TemplatePathImpl` so `.get()` correctly expands\n * matches.\n *\n * Safe by construction: wildcards are unique Symbols (see\n * {@link WILDCARD} / {@link DEEP_WILDCARD}). Legitimate object keys named\n * `\"*\"` or `\"**\"` are stored as strings and never trigger the template\n * branch.\n */\nfunction makeFromSegments<T, V>(\n\tsegments: readonly Segment[],\n): PathImpl<T, V> | TemplatePathImpl<T, V> {\n\treturn hasWildcard(segments)\n\t\t? new TemplatePathImpl<T, V>(segments)\n\t\t: new PathImpl<T, V>(segments);\n}\n\nfunction hasWildcard(segments: readonly Segment[]): boolean {\n\tfor (const s of segments) {\n\t\tif (s === WILDCARD || s === DEEP_WILDCARD) return true;\n\t}\n\treturn false;\n}\n\n// ---------------------------------------------------------------------------\n// TemplatePathImpl — path containing * or ** wildcards\n// ---------------------------------------------------------------------------\n\nexport class TemplatePathImpl<\n\tT = unknown,\n\tV = unknown,\n> extends AbstractPathImpl<T, V> {\n\t// fn returns V[] (not V|undefined) — no covariance conflict since we don't\n\t// extend PathImpl; the declared type here matches TemplatePath<T,V>.fn.\n\treadonly fn: (data: T) => V[];\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tsuper(segments);\n\t\tthis.fn = (data: T) => this.get(data);\n\t}\n\n\tget(data: T): V[] {\n\t\treturn this.expand(data).map(\n\t\t\t// expand() only returns paths where the key exists in data, so get() is safe\n\t\t\t(p) => p.get(data) as V,\n\t\t);\n\t}\n\n\tset(data: T, value: V): T {\n\t\tconst paths = this.expand(data);\n\t\tlet current = data;\n\t\tfor (const p of paths) {\n\t\t\tcurrent = p.set(current, value);\n\t\t}\n\t\treturn current;\n\t}\n\n\t/**\n\t * Applies `updater` to each matched value individually (per-item transform).\n\t * Use `.set(data, constant)` to assign the same value to every match.\n\t */\n\tupdate(data: T, updater: (current: V | undefined) => V): T {\n\t\tconst paths = this.expand(data);\n\t\tlet current = data;\n\t\tfor (const p of paths) {\n\t\t\tcurrent = p.set(current, updater(p.get(current)));\n\t\t}\n\t\treturn current;\n\t}\n\n\tparent(): Path<T, unknown> | TemplatePath<T, unknown> | null {\n\t\tif (this.segments.length === 0) return null;\n\t\treturn makeFromSegments<T, unknown>(\n\t\t\tthis.segments.slice(0, -1),\n\t\t) as unknown as Path<T, unknown> | TemplatePath<T, unknown>;\n\t}\n\n\tsubtract<U>(\n\t\tprefix: ResolvablePath<T, U>,\n\t): Path<U, V> | TemplatePath<U, V> | null {\n\t\tconst a = this.segments;\n\t\tconst b = resolveSegments(prefix);\n\t\tif (b.length > a.length) return null;\n\t\tif (!segmentsEqual(a.slice(0, b.length), b)) return null;\n\t\treturn makeFromSegments<U, V>(a.slice(b.length)) as unknown as\n\t\t\t| Path<U, V>\n\t\t\t| TemplatePath<U, V>;\n\t}\n\n\tslice(\n\t\tstart?: number,\n\t\tend?: number,\n\t): Path<T, unknown> | TemplatePath<T, unknown> {\n\t\treturn makeFromSegments<T, unknown>(\n\t\t\tthis.segments.slice(start, end),\n\t\t) as unknown as Path<T, unknown> | TemplatePath<T, unknown>;\n\t}\n\n\teach<U = CollectionItem<V>>(\n\t\texpr?: (item: CollectionItem<V>) => U,\n\t): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tWILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tdeep<U = V>(expr?: (leaf: V) => U): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tDEEP_WILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tto<U>(relative: ResolvablePath<V, U>): TemplatePath<T, U> {\n\t\tconst tail = resolveSegments(relative);\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tmerge<U>(other: ResolvablePath<T, U>): TemplatePath<T, U> {\n\t\treturn new TemplatePathImpl<T, U>(\n\t\t\tmergeSegments(this.segments, resolveSegments(other)),\n\t\t) as unknown as TemplatePath<T, U>;\n\t}\n\n\t/**\n\t * Resolves this template to all concrete paths that exist in `data`.\n\t */\n\texpand(data: T): Path<T, V>[] {\n\t\tconst results: Path<T, V>[] = [];\n\n\t\tconst walk = (current: unknown, idx: number, acc: Segment[]): void => {\n\t\t\tif (idx >= this.segments.length) {\n\t\t\t\tresults.push(new PathImpl<T, V>(acc));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst seg = this.segments[idx];\n\n\t\t\tif (seg === WILDCARD) {\n\t\t\t\tif (current != null && typeof current === \"object\") {\n\t\t\t\t\tconst keys = Array.isArray(current)\n\t\t\t\t\t\t? (Array.from(current.keys()) as number[])\n\t\t\t\t\t\t: Object.keys(current);\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[key], idx + 1, [\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (seg === DEEP_WILDCARD) {\n\t\t\t\t// Try matching rest of pattern at current depth\n\t\t\t\twalk(current, idx + 1, acc);\n\t\t\t\t// Recurse into every child\n\t\t\t\tif (current != null && typeof current === \"object\") {\n\t\t\t\t\tconst keys = Array.isArray(current)\n\t\t\t\t\t\t? (Array.from(current.keys()) as number[])\n\t\t\t\t\t\t: Object.keys(current);\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[key], idx, [\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tcurrent != null &&\n\t\t\t\t\ttypeof current === \"object\" &&\n\t\t\t\t\tseg in (current as object)\n\t\t\t\t) {\n\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[seg], idx + 1, [\n\t\t\t\t\t\t...acc,\n\t\t\t\t\t\tseg,\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\twalk(data, 0, []);\n\t\treturn results;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\nfunction makeConcrete<T, V>(segments: readonly Segment[]): PathImpl<T, V> {\n\treturn new PathImpl<T, V>(segments);\n}\n\nfunction evalExpr(expr: (proxy: unknown) => unknown): readonly Segment[] {\n\tconst proxy = createPathProxy([]);\n\tconst result = expr(proxy);\n\treturn (\n\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? []\n\t);\n}\n\nfunction mergeSegments(\n\ta: readonly Segment[],\n\tb: readonly Segment[],\n): readonly Segment[] {\n\tlet overlapLen = 0;\n\tfor (let len = Math.min(a.length, b.length); len >= 1; len--) {\n\t\tif (segmentsEqual(a.slice(-len), b.slice(0, len))) {\n\t\t\toverlapLen = len;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn overlapLen > 0 ? [...a.slice(0, -overlapLen), ...b] : [...a, ...b];\n}\n","import { PATH_SEGMENTS } from \"./constants.js\";\nimport { PathImpl } from \"./impl/path-impl.js\";\nimport type { BasePath, Path, PathExpression, Segment } from \"./types.js\";\nimport { createPathProxy, isCanonicalArrayIndex } from \"./utils.js\";\n\n/**\n * Create a typed path from a lambda expression, from an existing base path, or as a root.\n *\n * @example\n * // Lambda — recommended: annotate the parameter so both T and V are inferred\n * const p = path((user: User) => user.profile.firstName);\n *\n * @example\n * // Both generics explicit\n * const p = path<User, string>((u) => u.profile.firstName);\n *\n * @example\n * // Root path (no segments) — typically extended via .to() or path(root, expr)\n * const root = path<User>();\n *\n * @example\n * // Extend an existing base path\n * const p2 = path(root, (u) => u.profile);\n */\nexport function path<T>(): Path<T, T>;\nexport function path<T, V = unknown>(expr: PathExpression<T, V>): Path<T, V>;\nexport function path<T, U, V = unknown>(\n\tbase: BasePath<T, U>,\n\texpr: PathExpression<U, V>,\n): Path<T, V>;\nexport function path<T, V = unknown>(\n\tbaseOrExpr?: BasePath<T, unknown> | PathExpression<T, V>,\n\texpr?: PathExpression<unknown, V>,\n): Path<T, V> {\n\tif (baseOrExpr === undefined) {\n\t\treturn new PathImpl<T, V>([]);\n\t}\n\n\tif (typeof baseOrExpr === \"function\") {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = (baseOrExpr as PathExpression<T, V>)(proxy);\n\t\tconst segments: Segment[] =\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? [];\n\t\treturn new PathImpl<T, V>(segments);\n\t}\n\n\tconst baseSegments = (baseOrExpr as BasePath<T, unknown>).segments;\n\tif (expr !== undefined) {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = (expr as PathExpression<unknown, V>)(proxy);\n\t\tconst tailSegments =\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? [];\n\t\treturn new PathImpl<T, V>([...baseSegments, ...tailSegments]);\n\t}\n\n\treturn new PathImpl<T, V>(baseSegments);\n}\n\n/**\n * Create a path from a raw dot-separated string (e.g. `\"users.0.name\"`).\n *\n * Useful for dynamic paths from external sources (API responses, Zod issue paths, etc.).\n * Segments that are canonical non-negative integers are stored as numbers; all others as strings.\n *\n * The optional second generic `V` declares the expected leaf type without a cast:\n * ```ts\n * unsafePath<User, string>(\"profile.firstName\").get(user) // string | undefined\n * ```\n *\n * @param raw Dot-separated string. Empty string returns a zero-segment root path.\n */\nexport function unsafePath<T, V = unknown>(raw: string): Path<T, V> {\n\tconst segments: Segment[] = raw\n\t\t? raw\n\t\t\t\t.split(\".\")\n\t\t\t\t.map((s) => (s === \"\" ? s : isCanonicalArrayIndex(s) ? Number(s) : s))\n\t\t: [];\n\treturn new PathImpl<T, V>(segments);\n}\n"],"mappings":"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","names":["baseObj"]}
|
package/dist/index.js
CHANGED
|
@@ -53,29 +53,13 @@ function matchesPrefix(full, prefix) {
|
|
|
53
53
|
return false;
|
|
54
54
|
}
|
|
55
55
|
if (f >= full.length) return false;
|
|
56
|
+
if (full[f] === DEEP_WILDCARD && prefix[p] !== DEEP_WILDCARD) return false;
|
|
56
57
|
if (prefix[p] !== WILDCARD && prefix[p] !== full[f]) return false;
|
|
57
58
|
p++;
|
|
58
59
|
f++;
|
|
59
60
|
}
|
|
60
61
|
return p === prefix.length;
|
|
61
62
|
}
|
|
62
|
-
function patternMatches(pattern, concrete) {
|
|
63
|
-
function walk(pi, ci) {
|
|
64
|
-
if (pi === pattern.length) return ci === concrete.length;
|
|
65
|
-
const seg = pattern[pi];
|
|
66
|
-
if (seg === DEEP_WILDCARD) {
|
|
67
|
-
for (let skip = 0; ci + skip <= concrete.length; skip++) {
|
|
68
|
-
if (walk(pi + 1, ci + skip)) return true;
|
|
69
|
-
}
|
|
70
|
-
return false;
|
|
71
|
-
}
|
|
72
|
-
if (ci === concrete.length) return false;
|
|
73
|
-
if (seg === WILDCARD) return walk(pi + 1, ci + 1);
|
|
74
|
-
if (seg !== concrete[ci]) return false;
|
|
75
|
-
return walk(pi + 1, ci + 1);
|
|
76
|
-
}
|
|
77
|
-
return walk(0, 0);
|
|
78
|
-
}
|
|
79
63
|
function hasWildcardSegment(segments) {
|
|
80
64
|
for (const s of segments) {
|
|
81
65
|
if (s === WILDCARD || s === DEEP_WILDCARD) return true;
|
|
@@ -112,13 +96,18 @@ var AbstractPathImpl = class {
|
|
|
112
96
|
match(other) {
|
|
113
97
|
const otherSegs = resolveSegments(other);
|
|
114
98
|
if (segmentsEqual(this.segments, otherSegs)) return { relation: "equals" };
|
|
115
|
-
|
|
116
|
-
|
|
99
|
+
const thisHasWild = hasWildcardSegment(this.segments);
|
|
100
|
+
const otherHasWild = hasWildcardSegment(otherSegs);
|
|
101
|
+
if (thisHasWild && matchesPrefix(otherSegs, this.segments))
|
|
102
|
+
return { relation: "covers" };
|
|
103
|
+
if (otherHasWild && matchesPrefix(this.segments, otherSegs))
|
|
117
104
|
return { relation: "covered-by" };
|
|
118
|
-
if (!
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
105
|
+
if (!thisHasWild && !otherHasWild) {
|
|
106
|
+
if (matchesPrefix(this.segments, otherSegs) && this.segments.length > otherSegs.length)
|
|
107
|
+
return { relation: "child" };
|
|
108
|
+
if (matchesPrefix(otherSegs, this.segments) && otherSegs.length > this.segments.length)
|
|
109
|
+
return { relation: "parent" };
|
|
110
|
+
}
|
|
122
111
|
return null;
|
|
123
112
|
}
|
|
124
113
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/impl/base-path-impl.ts","../src/impl/path-impl.ts","../src/path.ts"],"sourcesContent":["export const PATH_SEGMENTS = Symbol(\"PATH_SEGMENTS\");\n\n/**\n * Sentinel for a single-level wildcard segment (`each`).\n *\n * Stored as a unique Symbol — NOT the string `\"*\"` — so that a legitimate\n * object key named `\"*\"` is preserved as a literal segment and never\n * reinterpreted as a wildcard by `.get`, `.expand`, `.covers`, `.match`, etc.\n *\n * Renders as `\"*\"` in `toString()` / `.$` for dot-notation compatibility.\n */\nexport const WILDCARD: unique symbol = Symbol(\"WILDCARD\");\n\n/**\n * Sentinel for a deep wildcard segment (`deep`).\n *\n * Same rationale as {@link WILDCARD}: stored as a unique Symbol so the\n * literal string `\"**\"` remains a valid (literal) object key.\n *\n * Renders as `\"**\"` in `toString()` / `.$`.\n */\nexport const DEEP_WILDCARD: unique symbol = Symbol(\"DEEP_WILDCARD\");\n","import { DEEP_WILDCARD, PATH_SEGMENTS, WILDCARD } from \"./constants.js\";\nimport type { ResolvablePath, Segment } from \"./types.js\";\n\n/**\n * Returns true only for strings that are the canonical representation of a\n * non-negative integer (e.g. \"0\", \"1\", \"123\"). Rejects \"01\", \"1e3\", \"-1\", etc.,\n * so that numeric-looking object keys are preserved as strings.\n */\nexport function isCanonicalArrayIndex(key: string): boolean {\n\tconst num = Number(key);\n\treturn (\n\t\tNumber.isInteger(num) && num >= 0 && num < 2 ** 32 && String(num) === key\n\t);\n}\n\nexport function resolveSegments(\n\ttarget: ResolvablePath<any>,\n): readonly Segment[] {\n\tif (typeof target === \"function\") {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = target(proxy) as unknown;\n\t\treturn (\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? []\n\t\t);\n\t}\n\tif (target != null && typeof target === \"object\" && \"segments\" in target) {\n\t\treturn (target as { segments: readonly Segment[] }).segments;\n\t}\n\treturn [];\n}\n\n// Returns `any` intentionally — the proxy is typed by the caller via PathExpression<T, V>\nexport function createPathProxy(segments: readonly Segment[]): any {\n\treturn new Proxy(\n\t\t{ [PATH_SEGMENTS]: segments },\n\t\t{\n\t\t\tget(target, key) {\n\t\t\t\tif (key === PATH_SEGMENTS)\n\t\t\t\t\treturn target[PATH_SEGMENTS as keyof typeof target];\n\t\t\t\t// Symbols (other than PATH_SEGMENTS) return undefined — not recordable segments\n\t\t\t\tif (typeof key === \"symbol\") return undefined;\n\t\t\t\t// Every string key becomes a new path segment\n\t\t\t\tconst next: Segment = isCanonicalArrayIndex(key) ? Number(key) : key;\n\t\t\t\treturn createPathProxy([...segments, next]);\n\t\t\t},\n\t\t},\n\t);\n}\n\nexport function segmentsEqual(\n\ta: readonly Segment[],\n\tb: readonly Segment[],\n): boolean {\n\tif (a.length !== b.length) return false;\n\treturn a.every((s, i) => s === b[i]);\n}\n\nexport function matchesPrefix(\n\tfull: readonly Segment[],\n\tprefix: readonly Segment[],\n): boolean {\n\t// Quick reject: only when prefix is too long even after every `**` collapses\n\t// to zero segments. (Each `**` can skip 0..N segments, so each one effectively\n\t// subtracts one from the minimum prefix length.)\n\tlet minPrefixLen = 0;\n\tfor (const s of prefix) if (s !== DEEP_WILDCARD) minPrefixLen++;\n\tif (minPrefixLen > full.length) return false;\n\n\tlet p = 0;\n\tlet f = 0;\n\twhile (p < prefix.length) {\n\t\tif (prefix[p] === DEEP_WILDCARD) {\n\t\t\tif (p === prefix.length - 1) return true;\n\t\t\tconst restPrefix = prefix.slice(p + 1);\n\t\t\tfor (let skip = 0; f + skip <= full.length; skip++) {\n\t\t\t\tif (matchesPrefix(full.slice(f + skip), restPrefix)) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif (f >= full.length) return false;\n\t\tif (prefix[p] !== WILDCARD && prefix[p] !== full[f]) return false;\n\t\tp++;\n\t\tf++;\n\t}\n\treturn p === prefix.length;\n}\n\n/**\n * Returns `true` iff `pattern` matches `concrete` exactly when wildcards\n * are expanded:\n * - `WILDCARD` (`*`) consumes exactly one segment.\n * - `DEEP_WILDCARD` (`**`) consumes zero or more segments.\n * - all other segments must be `===` to the corresponding concrete segment.\n *\n * Lengths need not match: a single `**` lets the pattern collapse to a\n * shorter concrete or stretch to a longer one. This is the \"covers\"\n * relation used by `.match()` and is broader than `matchesPrefix`, which\n * only requires the pattern to match a leading slice.\n */\nexport function patternMatches(\n\tpattern: readonly Segment[],\n\tconcrete: readonly Segment[],\n): boolean {\n\tfunction walk(pi: number, ci: number): boolean {\n\t\tif (pi === pattern.length) return ci === concrete.length;\n\t\tconst seg = pattern[pi];\n\t\tif (seg === DEEP_WILDCARD) {\n\t\t\tfor (let skip = 0; ci + skip <= concrete.length; skip++) {\n\t\t\t\tif (walk(pi + 1, ci + skip)) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif (ci === concrete.length) return false;\n\t\tif (seg === WILDCARD) return walk(pi + 1, ci + 1);\n\t\tif (seg !== concrete[ci]) return false;\n\t\treturn walk(pi + 1, ci + 1);\n\t}\n\treturn walk(0, 0);\n}\n\nfunction hasWildcardSegment(segments: readonly Segment[]): boolean {\n\tfor (const s of segments) {\n\t\tif (s === WILDCARD || s === DEEP_WILDCARD) return true;\n\t}\n\treturn false;\n}\n\n/**\n * Returns `true` iff `segments` contains a wildcard sentinel\n * (`WILDCARD` or `DEEP_WILDCARD`).\n */\nexport { hasWildcardSegment };\n","import { DEEP_WILDCARD, WILDCARD } from \"../constants.js\";\nimport type {\n\tMatchResult,\n\tPath,\n\tResolvablePath,\n\tSegment,\n\tTemplatePath,\n} from \"../types.js\";\nimport {\n\thasWildcardSegment,\n\tmatchesPrefix,\n\tpatternMatches,\n\tresolveSegments,\n\tsegmentsEqual,\n} from \"../utils.js\";\n\n/**\n * Shared structural base for PathImpl and TemplatePathImpl.\n * Contains all methods that do not depend on how a path reads, writes, or\n * creates new concrete path instances.\n */\nexport abstract class AbstractPathImpl<T = unknown, V = unknown> {\n\treadonly segments: readonly Segment[];\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tthis.segments = segments;\n\t}\n\n\tget length(): number {\n\t\treturn this.segments.length;\n\t}\n\n\tget $(): string {\n\t\treturn this.toString();\n\t}\n\n\ttoString(): string {\n\t\treturn this.segments\n\t\t\t.map((s) =>\n\t\t\t\ts === WILDCARD ? \"*\" : s === DEEP_WILDCARD ? \"**\" : String(s),\n\t\t\t)\n\t\t\t.join(\".\");\n\t}\n\n\tstartsWith(other: ResolvablePath<T>): boolean {\n\t\treturn matchesPrefix(this.segments, resolveSegments(other));\n\t}\n\n\tcovers(other: ResolvablePath<T>): boolean {\n\t\treturn matchesPrefix(resolveSegments(other), this.segments);\n\t}\n\n\tequals(other: ResolvablePath<T>): boolean {\n\t\treturn segmentsEqual(this.segments, resolveSegments(other));\n\t}\n\n\tmatch(other: ResolvablePath<T>): MatchResult | null {\n\t\tconst otherSegs = resolveSegments(other);\n\t\tif (segmentsEqual(this.segments, otherSegs)) return { relation: \"equals\" };\n\n\t\t// Check wildcard coverage BEFORE literal prefix. patternMatches handles\n\t\t// `**` collapsing, so a deep template can fully cover a concrete path of\n\t\t// any length — that's a \"covers\", not \"parent\". Order matters: a literal\n\t\t// prefix check that's wildcard-aware (via matchesPrefix) would otherwise\n\t\t// misclassify \"a.**.b covers a.x.y.b\" as \"parent\".\n\t\tif (patternMatches(this.segments, otherSegs)) return { relation: \"covers\" };\n\t\tif (patternMatches(otherSegs, this.segments))\n\t\t\treturn { relation: \"covered-by\" };\n\n\t\t// Literal parent/child: the shorter side must be wildcard-free, otherwise\n\t\t// it's not a literal prefix.\n\t\tif (\n\t\t\t!hasWildcardSegment(otherSegs) &&\n\t\t\tmatchesPrefix(this.segments, otherSegs) &&\n\t\t\tthis.segments.length > otherSegs.length\n\t\t)\n\t\t\treturn { relation: \"child\" };\n\t\tif (\n\t\t\t!hasWildcardSegment(this.segments) &&\n\t\t\tmatchesPrefix(otherSegs, this.segments) &&\n\t\t\totherSegs.length > this.segments.length\n\t\t)\n\t\t\treturn { relation: \"parent\" };\n\t\treturn null;\n\t}\n\n\t// Abstract — implementations create PathImpl or TemplatePathImpl instances which live in path-impl.ts.\n\t// TemplatePathImpl widens these to also allow returning a TemplatePath when the resulting\n\t// segments still contain wildcards.\n\tabstract parent(): Path<T, unknown> | TemplatePath<T, unknown> | null;\n\tabstract subtract<U>(\n\t\tprefix: ResolvablePath<T, U>,\n\t): Path<U, V> | TemplatePath<U, V> | null;\n\tabstract slice(\n\t\tstart?: number,\n\t\tend?: number,\n\t): Path<T, unknown> | TemplatePath<T, unknown>;\n}\n\n// Re-export constants used by both PathImpl and TemplatePathImpl so callers\n// don't need an extra import just for the wildcard check.\nexport { DEEP_WILDCARD, WILDCARD };\n","import { PATH_SEGMENTS } from \"../constants.js\";\nimport type {\n\tBasePath,\n\tCollectionItem,\n\tPath,\n\tResolvablePath,\n\tSegment,\n\tTemplatePath,\n\tTraversablePathMethods,\n} from \"../types.js\";\nimport { createPathProxy, resolveSegments, segmentsEqual } from \"../utils.js\";\nimport { AbstractPathImpl, DEEP_WILDCARD, WILDCARD } from \"./base-path-impl.js\";\n\n// ---------------------------------------------------------------------------\n// PathImpl — concrete path with no wildcards\n// ---------------------------------------------------------------------------\n\nexport class PathImpl<T = unknown, V = unknown>\n\textends AbstractPathImpl<T, V>\n\timplements BasePath<T, V>, TraversablePathMethods<T, V>\n{\n\treadonly fn: (data: T) => V | undefined;\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tsuper(segments);\n\t\tthis.fn = (data: T) => this.get(data);\n\t}\n\n\tget(data: T): V | undefined {\n\t\tlet current: unknown = data;\n\t\tfor (const seg of this.segments) {\n\t\t\tif (current == null) return undefined;\n\t\t\tcurrent = (current as Record<PropertyKey, unknown>)[seg];\n\t\t}\n\t\treturn current as V | undefined;\n\t}\n\n\tset(data: T, value: V): T {\n\t\tif (this.segments.length === 0) return value as unknown as T;\n\n\t\tconst setAt = (\n\t\t\tobj: unknown,\n\t\t\tsegs: readonly Segment[],\n\t\t\tval: unknown,\n\t\t): unknown => {\n\t\t\tif (segs.length === 1) {\n\t\t\t\tconst key = segs[0];\n\t\t\t\tif (Array.isArray(obj)) {\n\t\t\t\t\tconst arr = [...obj];\n\t\t\t\t\tarr[key as number] = val;\n\t\t\t\t\treturn arr;\n\t\t\t\t}\n\t\t\t\treturn { ...(obj as object), [key]: val };\n\t\t\t}\n\t\t\tconst [first, ...rest] = segs;\n\t\t\tconst baseObj = obj as Record<PropertyKey, unknown>;\n\t\t\tconst next = baseObj[first];\n\t\t\tconst nextCopy =\n\t\t\t\tnext != null && typeof next === \"object\"\n\t\t\t\t\t? Array.isArray(next)\n\t\t\t\t\t\t? [...next]\n\t\t\t\t\t\t: { ...next }\n\t\t\t\t\t: typeof rest[0] === \"number\"\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: {};\n\t\t\tif (Array.isArray(baseObj)) {\n\t\t\t\tconst arr = [...baseObj];\n\t\t\t\tarr[first as number] = setAt(nextCopy, rest, val) as never;\n\t\t\t\treturn arr;\n\t\t\t}\n\t\t\treturn { ...baseObj, [first]: setAt(nextCopy, rest, val) };\n\t\t};\n\n\t\tconst baseObj =\n\t\t\ttypeof data === \"object\" && data !== null\n\t\t\t\t? Array.isArray(data)\n\t\t\t\t\t? [...data]\n\t\t\t\t\t: { ...data }\n\t\t\t\t: data;\n\t\treturn setAt(baseObj, this.segments, value) as T;\n\t}\n\n\tupdate(data: T, updater: (current: V | undefined) => V): T {\n\t\treturn this.set(data, updater(this.get(data)));\n\t}\n\n\tparent(): Path<T, unknown> | null {\n\t\tif (this.segments.length === 0) return null;\n\t\treturn makeConcrete<T, unknown>(\n\t\t\tthis.segments.slice(0, -1),\n\t\t) as unknown as Path<T, unknown>;\n\t}\n\n\tsubtract<U>(prefix: ResolvablePath<T, U>): Path<U, V> | null {\n\t\tconst a = this.segments;\n\t\tconst b = resolveSegments(prefix);\n\t\tif (b.length > a.length) return null;\n\t\tif (!segmentsEqual(a.slice(0, b.length), b)) return null;\n\t\treturn makeConcrete<U, V>(a.slice(b.length)) as unknown as Path<U, V>;\n\t}\n\n\tslice(start?: number, end?: number): Path<T, unknown> {\n\t\treturn makeConcrete<T, unknown>(\n\t\t\tthis.segments.slice(start, end),\n\t\t) as unknown as Path<T, unknown>;\n\t}\n\n\teach<U = CollectionItem<V>>(\n\t\texpr?: (item: CollectionItem<V>) => U,\n\t): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tWILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tdeep<U = V>(expr?: (leaf: V) => U): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tDEEP_WILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tto<U>(relative: ResolvablePath<V, U>): Path<T, U> | TemplatePath<T, U> {\n\t\treturn makeFromSegments<T, U>([\n\t\t\t...this.segments,\n\t\t\t...resolveSegments(relative),\n\t\t]) as unknown as Path<T, U> | TemplatePath<T, U>;\n\t}\n\n\tmerge<U>(other: ResolvablePath<T, U>): Path<T, U> | TemplatePath<T, U> {\n\t\treturn makeFromSegments<T, U>(\n\t\t\tmergeSegments(this.segments, resolveSegments(other)),\n\t\t) as unknown as Path<T, U> | TemplatePath<T, U>;\n\t}\n}\n\n/**\n * Returns a concrete `PathImpl` when `segments` contains no wildcard\n * sentinels, otherwise a `TemplatePathImpl` so `.get()` correctly expands\n * matches.\n *\n * Safe by construction: wildcards are unique Symbols (see\n * {@link WILDCARD} / {@link DEEP_WILDCARD}). Legitimate object keys named\n * `\"*\"` or `\"**\"` are stored as strings and never trigger the template\n * branch.\n */\nfunction makeFromSegments<T, V>(\n\tsegments: readonly Segment[],\n): PathImpl<T, V> | TemplatePathImpl<T, V> {\n\treturn hasWildcard(segments)\n\t\t? new TemplatePathImpl<T, V>(segments)\n\t\t: new PathImpl<T, V>(segments);\n}\n\nfunction hasWildcard(segments: readonly Segment[]): boolean {\n\tfor (const s of segments) {\n\t\tif (s === WILDCARD || s === DEEP_WILDCARD) return true;\n\t}\n\treturn false;\n}\n\n// ---------------------------------------------------------------------------\n// TemplatePathImpl — path containing * or ** wildcards\n// ---------------------------------------------------------------------------\n\nexport class TemplatePathImpl<\n\tT = unknown,\n\tV = unknown,\n> extends AbstractPathImpl<T, V> {\n\t// fn returns V[] (not V|undefined) — no covariance conflict since we don't\n\t// extend PathImpl; the declared type here matches TemplatePath<T,V>.fn.\n\treadonly fn: (data: T) => V[];\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tsuper(segments);\n\t\tthis.fn = (data: T) => this.get(data);\n\t}\n\n\tget(data: T): V[] {\n\t\treturn this.expand(data).map(\n\t\t\t// expand() only returns paths where the key exists in data, so get() is safe\n\t\t\t(p) => p.get(data) as V,\n\t\t);\n\t}\n\n\tset(data: T, value: V): T {\n\t\tconst paths = this.expand(data);\n\t\tlet current = data;\n\t\tfor (const p of paths) {\n\t\t\tcurrent = p.set(current, value);\n\t\t}\n\t\treturn current;\n\t}\n\n\t/**\n\t * Applies `updater` to each matched value individually (per-item transform).\n\t * Use `.set(data, constant)` to assign the same value to every match.\n\t */\n\tupdate(data: T, updater: (current: V | undefined) => V): T {\n\t\tconst paths = this.expand(data);\n\t\tlet current = data;\n\t\tfor (const p of paths) {\n\t\t\tcurrent = p.set(current, updater(p.get(current)));\n\t\t}\n\t\treturn current;\n\t}\n\n\tparent(): Path<T, unknown> | TemplatePath<T, unknown> | null {\n\t\tif (this.segments.length === 0) return null;\n\t\treturn makeFromSegments<T, unknown>(\n\t\t\tthis.segments.slice(0, -1),\n\t\t) as unknown as Path<T, unknown> | TemplatePath<T, unknown>;\n\t}\n\n\tsubtract<U>(\n\t\tprefix: ResolvablePath<T, U>,\n\t): Path<U, V> | TemplatePath<U, V> | null {\n\t\tconst a = this.segments;\n\t\tconst b = resolveSegments(prefix);\n\t\tif (b.length > a.length) return null;\n\t\tif (!segmentsEqual(a.slice(0, b.length), b)) return null;\n\t\treturn makeFromSegments<U, V>(a.slice(b.length)) as unknown as\n\t\t\t| Path<U, V>\n\t\t\t| TemplatePath<U, V>;\n\t}\n\n\tslice(\n\t\tstart?: number,\n\t\tend?: number,\n\t): Path<T, unknown> | TemplatePath<T, unknown> {\n\t\treturn makeFromSegments<T, unknown>(\n\t\t\tthis.segments.slice(start, end),\n\t\t) as unknown as Path<T, unknown> | TemplatePath<T, unknown>;\n\t}\n\n\teach<U = CollectionItem<V>>(\n\t\texpr?: (item: CollectionItem<V>) => U,\n\t): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tWILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tdeep<U = V>(expr?: (leaf: V) => U): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tDEEP_WILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tto<U>(relative: ResolvablePath<V, U>): TemplatePath<T, U> {\n\t\tconst tail = resolveSegments(relative);\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tmerge<U>(other: ResolvablePath<T, U>): TemplatePath<T, U> {\n\t\treturn new TemplatePathImpl<T, U>(\n\t\t\tmergeSegments(this.segments, resolveSegments(other)),\n\t\t) as unknown as TemplatePath<T, U>;\n\t}\n\n\t/**\n\t * Resolves this template to all concrete paths that exist in `data`.\n\t */\n\texpand(data: T): Path<T, V>[] {\n\t\tconst results: Path<T, V>[] = [];\n\n\t\tconst walk = (current: unknown, idx: number, acc: Segment[]): void => {\n\t\t\tif (idx >= this.segments.length) {\n\t\t\t\tresults.push(new PathImpl<T, V>(acc));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst seg = this.segments[idx];\n\n\t\t\tif (seg === WILDCARD) {\n\t\t\t\tif (current != null && typeof current === \"object\") {\n\t\t\t\t\tconst keys = Array.isArray(current)\n\t\t\t\t\t\t? (Array.from(current.keys()) as number[])\n\t\t\t\t\t\t: Object.keys(current);\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[key], idx + 1, [\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (seg === DEEP_WILDCARD) {\n\t\t\t\t// Try matching rest of pattern at current depth\n\t\t\t\twalk(current, idx + 1, acc);\n\t\t\t\t// Recurse into every child\n\t\t\t\tif (current != null && typeof current === \"object\") {\n\t\t\t\t\tconst keys = Array.isArray(current)\n\t\t\t\t\t\t? (Array.from(current.keys()) as number[])\n\t\t\t\t\t\t: Object.keys(current);\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[key], idx, [\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tcurrent != null &&\n\t\t\t\t\ttypeof current === \"object\" &&\n\t\t\t\t\tseg in (current as object)\n\t\t\t\t) {\n\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[seg], idx + 1, [\n\t\t\t\t\t\t...acc,\n\t\t\t\t\t\tseg,\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\twalk(data, 0, []);\n\t\treturn results;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\nfunction makeConcrete<T, V>(segments: readonly Segment[]): PathImpl<T, V> {\n\treturn new PathImpl<T, V>(segments);\n}\n\nfunction evalExpr(expr: (proxy: unknown) => unknown): readonly Segment[] {\n\tconst proxy = createPathProxy([]);\n\tconst result = expr(proxy);\n\treturn (\n\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? []\n\t);\n}\n\nfunction mergeSegments(\n\ta: readonly Segment[],\n\tb: readonly Segment[],\n): readonly Segment[] {\n\tlet overlapLen = 0;\n\tfor (let len = Math.min(a.length, b.length); len >= 1; len--) {\n\t\tif (segmentsEqual(a.slice(-len), b.slice(0, len))) {\n\t\t\toverlapLen = len;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn overlapLen > 0 ? [...a.slice(0, -overlapLen), ...b] : [...a, ...b];\n}\n","import { PATH_SEGMENTS } from \"./constants.js\";\nimport { PathImpl } from \"./impl/path-impl.js\";\nimport type { BasePath, Path, PathExpression, Segment } from \"./types.js\";\nimport { createPathProxy, isCanonicalArrayIndex } from \"./utils.js\";\n\n/**\n * Create a typed path from a lambda expression, from an existing base path, or as a root.\n *\n * @example\n * // Lambda — recommended: annotate the parameter so both T and V are inferred\n * const p = path((user: User) => user.profile.firstName);\n *\n * @example\n * // Both generics explicit\n * const p = path<User, string>((u) => u.profile.firstName);\n *\n * @example\n * // Root path (no segments) — typically extended via .to() or path(root, expr)\n * const root = path<User>();\n *\n * @example\n * // Extend an existing base path\n * const p2 = path(root, (u) => u.profile);\n */\nexport function path<T>(): Path<T, T>;\nexport function path<T, V = unknown>(expr: PathExpression<T, V>): Path<T, V>;\nexport function path<T, U, V = unknown>(\n\tbase: BasePath<T, U>,\n\texpr: PathExpression<U, V>,\n): Path<T, V>;\nexport function path<T, V = unknown>(\n\tbaseOrExpr?: BasePath<T, unknown> | PathExpression<T, V>,\n\texpr?: PathExpression<unknown, V>,\n): Path<T, V> {\n\tif (baseOrExpr === undefined) {\n\t\treturn new PathImpl<T, V>([]);\n\t}\n\n\tif (typeof baseOrExpr === \"function\") {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = (baseOrExpr as PathExpression<T, V>)(proxy);\n\t\tconst segments: Segment[] =\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? [];\n\t\treturn new PathImpl<T, V>(segments);\n\t}\n\n\tconst baseSegments = (baseOrExpr as BasePath<T, unknown>).segments;\n\tif (expr !== undefined) {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = (expr as PathExpression<unknown, V>)(proxy);\n\t\tconst tailSegments =\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? [];\n\t\treturn new PathImpl<T, V>([...baseSegments, ...tailSegments]);\n\t}\n\n\treturn new PathImpl<T, V>(baseSegments);\n}\n\n/**\n * Create a path from a raw dot-separated string (e.g. `\"users.0.name\"`).\n *\n * Useful for dynamic paths from external sources (API responses, Zod issue paths, etc.).\n * Segments that are canonical non-negative integers are stored as numbers; all others as strings.\n *\n * The optional second generic `V` declares the expected leaf type without a cast:\n * ```ts\n * unsafePath<User, string>(\"profile.firstName\").get(user) // string | undefined\n * ```\n *\n * @param raw Dot-separated string. Empty string returns a zero-segment root path.\n */\nexport function unsafePath<T, V = unknown>(raw: string): Path<T, V> {\n\tconst segments: Segment[] = raw\n\t\t? raw\n\t\t\t\t.split(\".\")\n\t\t\t\t.map((s) => (s === \"\" ? s : isCanonicalArrayIndex(s) ? Number(s) : s))\n\t\t: [];\n\treturn new PathImpl<T, V>(segments);\n}\n"],"mappings":"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","names":["baseObj"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/utils.ts","../src/impl/base-path-impl.ts","../src/impl/path-impl.ts","../src/path.ts"],"sourcesContent":["export const PATH_SEGMENTS = Symbol(\"PATH_SEGMENTS\");\n\n/**\n * Sentinel for a single-level wildcard segment (`each`).\n *\n * Stored as a unique Symbol — NOT the string `\"*\"` — so that a legitimate\n * object key named `\"*\"` is preserved as a literal segment and never\n * reinterpreted as a wildcard by `.get`, `.expand`, `.covers`, `.match`, etc.\n *\n * Renders as `\"*\"` in `toString()` / `.$` for dot-notation compatibility.\n */\nexport const WILDCARD: unique symbol = Symbol(\"WILDCARD\");\n\n/**\n * Sentinel for a deep wildcard segment (`deep`).\n *\n * Same rationale as {@link WILDCARD}: stored as a unique Symbol so the\n * literal string `\"**\"` remains a valid (literal) object key.\n *\n * Renders as `\"**\"` in `toString()` / `.$`.\n */\nexport const DEEP_WILDCARD: unique symbol = Symbol(\"DEEP_WILDCARD\");\n","import { DEEP_WILDCARD, PATH_SEGMENTS, WILDCARD } from \"./constants.js\";\nimport type { ResolvablePath, Segment } from \"./types.js\";\n\n/**\n * Returns true only for strings that are the canonical representation of a\n * non-negative integer (e.g. \"0\", \"1\", \"123\"). Rejects \"01\", \"1e3\", \"-1\", etc.,\n * so that numeric-looking object keys are preserved as strings.\n */\nexport function isCanonicalArrayIndex(key: string): boolean {\n\tconst num = Number(key);\n\treturn (\n\t\tNumber.isInteger(num) && num >= 0 && num < 2 ** 32 && String(num) === key\n\t);\n}\n\nexport function resolveSegments(\n\ttarget: ResolvablePath<any>,\n): readonly Segment[] {\n\tif (typeof target === \"function\") {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = target(proxy) as unknown;\n\t\treturn (\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? []\n\t\t);\n\t}\n\tif (target != null && typeof target === \"object\" && \"segments\" in target) {\n\t\treturn (target as { segments: readonly Segment[] }).segments;\n\t}\n\treturn [];\n}\n\n// Returns `any` intentionally — the proxy is typed by the caller via PathExpression<T, V>\nexport function createPathProxy(segments: readonly Segment[]): any {\n\treturn new Proxy(\n\t\t{ [PATH_SEGMENTS]: segments },\n\t\t{\n\t\t\tget(target, key) {\n\t\t\t\tif (key === PATH_SEGMENTS)\n\t\t\t\t\treturn target[PATH_SEGMENTS as keyof typeof target];\n\t\t\t\t// Symbols (other than PATH_SEGMENTS) return undefined — not recordable segments\n\t\t\t\tif (typeof key === \"symbol\") return undefined;\n\t\t\t\t// Every string key becomes a new path segment\n\t\t\t\tconst next: Segment = isCanonicalArrayIndex(key) ? Number(key) : key;\n\t\t\t\treturn createPathProxy([...segments, next]);\n\t\t\t},\n\t\t},\n\t);\n}\n\nexport function segmentsEqual(\n\ta: readonly Segment[],\n\tb: readonly Segment[],\n): boolean {\n\tif (a.length !== b.length) return false;\n\treturn a.every((s, i) => s === b[i]);\n}\n\nexport function matchesPrefix(\n\tfull: readonly Segment[],\n\tprefix: readonly Segment[],\n): boolean {\n\t// Quick reject: only when prefix is too long even after every `**` collapses\n\t// to zero segments. (Each `**` can skip 0..N segments, so each one effectively\n\t// subtracts one from the minimum prefix length.)\n\tlet minPrefixLen = 0;\n\tfor (const s of prefix) if (s !== DEEP_WILDCARD) minPrefixLen++;\n\tif (minPrefixLen > full.length) return false;\n\n\tlet p = 0;\n\tlet f = 0;\n\twhile (p < prefix.length) {\n\t\tif (prefix[p] === DEEP_WILDCARD) {\n\t\t\tif (p === prefix.length - 1) return true;\n\t\t\tconst restPrefix = prefix.slice(p + 1);\n\t\t\tfor (let skip = 0; f + skip <= full.length; skip++) {\n\t\t\t\tif (matchesPrefix(full.slice(f + skip), restPrefix)) return true;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tif (f >= full.length) return false;\n\t\t// `**` on `full`'s side stands for 0..N segments; a single-segment\n\t\t// element in `prefix` (literal or `*`) can't absorb it. Without this\n\t\t// guard, `prefix.WILDCARD` short-circuits the next check and silently\n\t\t// treats `**` as one segment.\n\t\tif (full[f] === DEEP_WILDCARD && prefix[p] !== DEEP_WILDCARD) return false;\n\t\tif (prefix[p] !== WILDCARD && prefix[p] !== full[f]) return false;\n\t\tp++;\n\t\tf++;\n\t}\n\treturn p === prefix.length;\n}\n\n/**\n * Returns `true` iff `segments` contains a wildcard sentinel\n * (`WILDCARD` or `DEEP_WILDCARD`).\n */\nexport function hasWildcardSegment(segments: readonly Segment[]): boolean {\n\tfor (const s of segments) {\n\t\tif (s === WILDCARD || s === DEEP_WILDCARD) return true;\n\t}\n\treturn false;\n}\n","import { DEEP_WILDCARD, WILDCARD } from \"../constants.js\";\nimport type {\n\tMatchResult,\n\tPath,\n\tResolvablePath,\n\tSegment,\n\tTemplatePath,\n} from \"../types.js\";\nimport {\n\thasWildcardSegment,\n\tmatchesPrefix,\n\tresolveSegments,\n\tsegmentsEqual,\n} from \"../utils.js\";\n\n/**\n * Shared structural base for PathImpl and TemplatePathImpl.\n * Contains all methods that do not depend on how a path reads, writes, or\n * creates new concrete path instances.\n */\nexport abstract class AbstractPathImpl<T = unknown, V = unknown> {\n\treadonly segments: readonly Segment[];\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tthis.segments = segments;\n\t}\n\n\tget length(): number {\n\t\treturn this.segments.length;\n\t}\n\n\tget $(): string {\n\t\treturn this.toString();\n\t}\n\n\ttoString(): string {\n\t\treturn this.segments\n\t\t\t.map((s) =>\n\t\t\t\ts === WILDCARD ? \"*\" : s === DEEP_WILDCARD ? \"**\" : String(s),\n\t\t\t)\n\t\t\t.join(\".\");\n\t}\n\n\tstartsWith(other: ResolvablePath<T>): boolean {\n\t\treturn matchesPrefix(this.segments, resolveSegments(other));\n\t}\n\n\tcovers(other: ResolvablePath<T>): boolean {\n\t\treturn matchesPrefix(resolveSegments(other), this.segments);\n\t}\n\n\tequals(other: ResolvablePath<T>): boolean {\n\t\treturn segmentsEqual(this.segments, resolveSegments(other));\n\t}\n\n\tmatch(other: ResolvablePath<T>): MatchResult | null {\n\t\tconst otherSegs = resolveSegments(other);\n\t\tif (segmentsEqual(this.segments, otherSegs)) return { relation: \"equals\" };\n\n\t\tconst thisHasWild = hasWildcardSegment(this.segments);\n\t\tconst otherHasWild = hasWildcardSegment(otherSegs);\n\n\t\t// Wildcard coverage: a wildcard-bearing side covers the other when its\n\t\t// segments form a prefix-pattern of the other's segments. This includes\n\t\t// both exact matches (template fully expands to the concrete) and prefix\n\t\t// matches (template covers a region the concrete sits inside).\n\t\t// `matchesPrefix(full, prefix)` returns true exactly in those cases when\n\t\t// the prefix carries wildcards, so it unifies what `.covers()` does with\n\t\t// what `.match()` should report.\n\t\tif (thisHasWild && matchesPrefix(otherSegs, this.segments))\n\t\t\treturn { relation: \"covers\" };\n\t\tif (otherHasWild && matchesPrefix(this.segments, otherSegs))\n\t\t\treturn { relation: \"covered-by\" };\n\n\t\t// Literal parent/child: both sides must be wildcard-free. A wildcard\n\t\t// prefix is not a literal prefix.\n\t\tif (!thisHasWild && !otherHasWild) {\n\t\t\tif (\n\t\t\t\tmatchesPrefix(this.segments, otherSegs) &&\n\t\t\t\tthis.segments.length > otherSegs.length\n\t\t\t)\n\t\t\t\treturn { relation: \"child\" };\n\t\t\tif (\n\t\t\t\tmatchesPrefix(otherSegs, this.segments) &&\n\t\t\t\totherSegs.length > this.segments.length\n\t\t\t)\n\t\t\t\treturn { relation: \"parent\" };\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t// Abstract — implementations create PathImpl or TemplatePathImpl instances which live in path-impl.ts.\n\t// TemplatePathImpl widens these to also allow returning a TemplatePath when the resulting\n\t// segments still contain wildcards.\n\tabstract parent(): Path<T, unknown> | TemplatePath<T, unknown> | null;\n\tabstract subtract<U>(\n\t\tprefix: ResolvablePath<T, U>,\n\t): Path<U, V> | TemplatePath<U, V> | null;\n\tabstract slice(\n\t\tstart?: number,\n\t\tend?: number,\n\t): Path<T, unknown> | TemplatePath<T, unknown>;\n}\n\n// Re-export constants used by both PathImpl and TemplatePathImpl so callers\n// don't need an extra import just for the wildcard check.\nexport { DEEP_WILDCARD, WILDCARD };\n","import { PATH_SEGMENTS } from \"../constants.js\";\nimport type {\n\tBasePath,\n\tCollectionItem,\n\tPath,\n\tResolvablePath,\n\tSegment,\n\tTemplatePath,\n\tTraversablePathMethods,\n} from \"../types.js\";\nimport { createPathProxy, resolveSegments, segmentsEqual } from \"../utils.js\";\nimport { AbstractPathImpl, DEEP_WILDCARD, WILDCARD } from \"./base-path-impl.js\";\n\n// ---------------------------------------------------------------------------\n// PathImpl — concrete path with no wildcards\n// ---------------------------------------------------------------------------\n\nexport class PathImpl<T = unknown, V = unknown>\n\textends AbstractPathImpl<T, V>\n\timplements BasePath<T, V>, TraversablePathMethods<T, V>\n{\n\treadonly fn: (data: T) => V | undefined;\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tsuper(segments);\n\t\tthis.fn = (data: T) => this.get(data);\n\t}\n\n\tget(data: T): V | undefined {\n\t\tlet current: unknown = data;\n\t\tfor (const seg of this.segments) {\n\t\t\tif (current == null) return undefined;\n\t\t\tcurrent = (current as Record<PropertyKey, unknown>)[seg];\n\t\t}\n\t\treturn current as V | undefined;\n\t}\n\n\tset(data: T, value: V): T {\n\t\tif (this.segments.length === 0) return value as unknown as T;\n\n\t\tconst setAt = (\n\t\t\tobj: unknown,\n\t\t\tsegs: readonly Segment[],\n\t\t\tval: unknown,\n\t\t): unknown => {\n\t\t\tif (segs.length === 1) {\n\t\t\t\tconst key = segs[0];\n\t\t\t\tif (Array.isArray(obj)) {\n\t\t\t\t\tconst arr = [...obj];\n\t\t\t\t\tarr[key as number] = val;\n\t\t\t\t\treturn arr;\n\t\t\t\t}\n\t\t\t\treturn { ...(obj as object), [key]: val };\n\t\t\t}\n\t\t\tconst [first, ...rest] = segs;\n\t\t\tconst baseObj = obj as Record<PropertyKey, unknown>;\n\t\t\tconst next = baseObj[first];\n\t\t\tconst nextCopy =\n\t\t\t\tnext != null && typeof next === \"object\"\n\t\t\t\t\t? Array.isArray(next)\n\t\t\t\t\t\t? [...next]\n\t\t\t\t\t\t: { ...next }\n\t\t\t\t\t: typeof rest[0] === \"number\"\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: {};\n\t\t\tif (Array.isArray(baseObj)) {\n\t\t\t\tconst arr = [...baseObj];\n\t\t\t\tarr[first as number] = setAt(nextCopy, rest, val) as never;\n\t\t\t\treturn arr;\n\t\t\t}\n\t\t\treturn { ...baseObj, [first]: setAt(nextCopy, rest, val) };\n\t\t};\n\n\t\tconst baseObj =\n\t\t\ttypeof data === \"object\" && data !== null\n\t\t\t\t? Array.isArray(data)\n\t\t\t\t\t? [...data]\n\t\t\t\t\t: { ...data }\n\t\t\t\t: data;\n\t\treturn setAt(baseObj, this.segments, value) as T;\n\t}\n\n\tupdate(data: T, updater: (current: V | undefined) => V): T {\n\t\treturn this.set(data, updater(this.get(data)));\n\t}\n\n\tparent(): Path<T, unknown> | null {\n\t\tif (this.segments.length === 0) return null;\n\t\treturn makeConcrete<T, unknown>(\n\t\t\tthis.segments.slice(0, -1),\n\t\t) as unknown as Path<T, unknown>;\n\t}\n\n\tsubtract<U>(prefix: ResolvablePath<T, U>): Path<U, V> | null {\n\t\tconst a = this.segments;\n\t\tconst b = resolveSegments(prefix);\n\t\tif (b.length > a.length) return null;\n\t\tif (!segmentsEqual(a.slice(0, b.length), b)) return null;\n\t\treturn makeConcrete<U, V>(a.slice(b.length)) as unknown as Path<U, V>;\n\t}\n\n\tslice(start?: number, end?: number): Path<T, unknown> {\n\t\treturn makeConcrete<T, unknown>(\n\t\t\tthis.segments.slice(start, end),\n\t\t) as unknown as Path<T, unknown>;\n\t}\n\n\teach<U = CollectionItem<V>>(\n\t\texpr?: (item: CollectionItem<V>) => U,\n\t): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tWILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tdeep<U = V>(expr?: (leaf: V) => U): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tDEEP_WILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tto<U>(relative: ResolvablePath<V, U>): Path<T, U> | TemplatePath<T, U> {\n\t\treturn makeFromSegments<T, U>([\n\t\t\t...this.segments,\n\t\t\t...resolveSegments(relative),\n\t\t]) as unknown as Path<T, U> | TemplatePath<T, U>;\n\t}\n\n\tmerge<U>(other: ResolvablePath<T, U>): Path<T, U> | TemplatePath<T, U> {\n\t\treturn makeFromSegments<T, U>(\n\t\t\tmergeSegments(this.segments, resolveSegments(other)),\n\t\t) as unknown as Path<T, U> | TemplatePath<T, U>;\n\t}\n}\n\n/**\n * Returns a concrete `PathImpl` when `segments` contains no wildcard\n * sentinels, otherwise a `TemplatePathImpl` so `.get()` correctly expands\n * matches.\n *\n * Safe by construction: wildcards are unique Symbols (see\n * {@link WILDCARD} / {@link DEEP_WILDCARD}). Legitimate object keys named\n * `\"*\"` or `\"**\"` are stored as strings and never trigger the template\n * branch.\n */\nfunction makeFromSegments<T, V>(\n\tsegments: readonly Segment[],\n): PathImpl<T, V> | TemplatePathImpl<T, V> {\n\treturn hasWildcard(segments)\n\t\t? new TemplatePathImpl<T, V>(segments)\n\t\t: new PathImpl<T, V>(segments);\n}\n\nfunction hasWildcard(segments: readonly Segment[]): boolean {\n\tfor (const s of segments) {\n\t\tif (s === WILDCARD || s === DEEP_WILDCARD) return true;\n\t}\n\treturn false;\n}\n\n// ---------------------------------------------------------------------------\n// TemplatePathImpl — path containing * or ** wildcards\n// ---------------------------------------------------------------------------\n\nexport class TemplatePathImpl<\n\tT = unknown,\n\tV = unknown,\n> extends AbstractPathImpl<T, V> {\n\t// fn returns V[] (not V|undefined) — no covariance conflict since we don't\n\t// extend PathImpl; the declared type here matches TemplatePath<T,V>.fn.\n\treadonly fn: (data: T) => V[];\n\n\tconstructor(segments: readonly Segment[]) {\n\t\tsuper(segments);\n\t\tthis.fn = (data: T) => this.get(data);\n\t}\n\n\tget(data: T): V[] {\n\t\treturn this.expand(data).map(\n\t\t\t// expand() only returns paths where the key exists in data, so get() is safe\n\t\t\t(p) => p.get(data) as V,\n\t\t);\n\t}\n\n\tset(data: T, value: V): T {\n\t\tconst paths = this.expand(data);\n\t\tlet current = data;\n\t\tfor (const p of paths) {\n\t\t\tcurrent = p.set(current, value);\n\t\t}\n\t\treturn current;\n\t}\n\n\t/**\n\t * Applies `updater` to each matched value individually (per-item transform).\n\t * Use `.set(data, constant)` to assign the same value to every match.\n\t */\n\tupdate(data: T, updater: (current: V | undefined) => V): T {\n\t\tconst paths = this.expand(data);\n\t\tlet current = data;\n\t\tfor (const p of paths) {\n\t\t\tcurrent = p.set(current, updater(p.get(current)));\n\t\t}\n\t\treturn current;\n\t}\n\n\tparent(): Path<T, unknown> | TemplatePath<T, unknown> | null {\n\t\tif (this.segments.length === 0) return null;\n\t\treturn makeFromSegments<T, unknown>(\n\t\t\tthis.segments.slice(0, -1),\n\t\t) as unknown as Path<T, unknown> | TemplatePath<T, unknown>;\n\t}\n\n\tsubtract<U>(\n\t\tprefix: ResolvablePath<T, U>,\n\t): Path<U, V> | TemplatePath<U, V> | null {\n\t\tconst a = this.segments;\n\t\tconst b = resolveSegments(prefix);\n\t\tif (b.length > a.length) return null;\n\t\tif (!segmentsEqual(a.slice(0, b.length), b)) return null;\n\t\treturn makeFromSegments<U, V>(a.slice(b.length)) as unknown as\n\t\t\t| Path<U, V>\n\t\t\t| TemplatePath<U, V>;\n\t}\n\n\tslice(\n\t\tstart?: number,\n\t\tend?: number,\n\t): Path<T, unknown> | TemplatePath<T, unknown> {\n\t\treturn makeFromSegments<T, unknown>(\n\t\t\tthis.segments.slice(start, end),\n\t\t) as unknown as Path<T, unknown> | TemplatePath<T, unknown>;\n\t}\n\n\teach<U = CollectionItem<V>>(\n\t\texpr?: (item: CollectionItem<V>) => U,\n\t): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tWILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tdeep<U = V>(expr?: (leaf: V) => U): TemplatePath<T, U> {\n\t\tconst tail = expr ? evalExpr(expr as (p: unknown) => unknown) : [];\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\tDEEP_WILDCARD,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tto<U>(relative: ResolvablePath<V, U>): TemplatePath<T, U> {\n\t\tconst tail = resolveSegments(relative);\n\t\treturn new TemplatePathImpl<T, U>([\n\t\t\t...this.segments,\n\t\t\t...tail,\n\t\t]) as unknown as TemplatePath<T, U>;\n\t}\n\n\tmerge<U>(other: ResolvablePath<T, U>): TemplatePath<T, U> {\n\t\treturn new TemplatePathImpl<T, U>(\n\t\t\tmergeSegments(this.segments, resolveSegments(other)),\n\t\t) as unknown as TemplatePath<T, U>;\n\t}\n\n\t/**\n\t * Resolves this template to all concrete paths that exist in `data`.\n\t */\n\texpand(data: T): Path<T, V>[] {\n\t\tconst results: Path<T, V>[] = [];\n\n\t\tconst walk = (current: unknown, idx: number, acc: Segment[]): void => {\n\t\t\tif (idx >= this.segments.length) {\n\t\t\t\tresults.push(new PathImpl<T, V>(acc));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst seg = this.segments[idx];\n\n\t\t\tif (seg === WILDCARD) {\n\t\t\t\tif (current != null && typeof current === \"object\") {\n\t\t\t\t\tconst keys = Array.isArray(current)\n\t\t\t\t\t\t? (Array.from(current.keys()) as number[])\n\t\t\t\t\t\t: Object.keys(current);\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[key], idx + 1, [\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (seg === DEEP_WILDCARD) {\n\t\t\t\t// Try matching rest of pattern at current depth\n\t\t\t\twalk(current, idx + 1, acc);\n\t\t\t\t// Recurse into every child\n\t\t\t\tif (current != null && typeof current === \"object\") {\n\t\t\t\t\tconst keys = Array.isArray(current)\n\t\t\t\t\t\t? (Array.from(current.keys()) as number[])\n\t\t\t\t\t\t: Object.keys(current);\n\t\t\t\t\tfor (const key of keys) {\n\t\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[key], idx, [\n\t\t\t\t\t\t\t...acc,\n\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (\n\t\t\t\t\tcurrent != null &&\n\t\t\t\t\ttypeof current === \"object\" &&\n\t\t\t\t\tseg in (current as object)\n\t\t\t\t) {\n\t\t\t\t\twalk((current as Record<PropertyKey, unknown>)[seg], idx + 1, [\n\t\t\t\t\t\t...acc,\n\t\t\t\t\t\tseg,\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\twalk(data, 0, []);\n\t\treturn results;\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// Private helpers\n// ---------------------------------------------------------------------------\n\nfunction makeConcrete<T, V>(segments: readonly Segment[]): PathImpl<T, V> {\n\treturn new PathImpl<T, V>(segments);\n}\n\nfunction evalExpr(expr: (proxy: unknown) => unknown): readonly Segment[] {\n\tconst proxy = createPathProxy([]);\n\tconst result = expr(proxy);\n\treturn (\n\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? []\n\t);\n}\n\nfunction mergeSegments(\n\ta: readonly Segment[],\n\tb: readonly Segment[],\n): readonly Segment[] {\n\tlet overlapLen = 0;\n\tfor (let len = Math.min(a.length, b.length); len >= 1; len--) {\n\t\tif (segmentsEqual(a.slice(-len), b.slice(0, len))) {\n\t\t\toverlapLen = len;\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn overlapLen > 0 ? [...a.slice(0, -overlapLen), ...b] : [...a, ...b];\n}\n","import { PATH_SEGMENTS } from \"./constants.js\";\nimport { PathImpl } from \"./impl/path-impl.js\";\nimport type { BasePath, Path, PathExpression, Segment } from \"./types.js\";\nimport { createPathProxy, isCanonicalArrayIndex } from \"./utils.js\";\n\n/**\n * Create a typed path from a lambda expression, from an existing base path, or as a root.\n *\n * @example\n * // Lambda — recommended: annotate the parameter so both T and V are inferred\n * const p = path((user: User) => user.profile.firstName);\n *\n * @example\n * // Both generics explicit\n * const p = path<User, string>((u) => u.profile.firstName);\n *\n * @example\n * // Root path (no segments) — typically extended via .to() or path(root, expr)\n * const root = path<User>();\n *\n * @example\n * // Extend an existing base path\n * const p2 = path(root, (u) => u.profile);\n */\nexport function path<T>(): Path<T, T>;\nexport function path<T, V = unknown>(expr: PathExpression<T, V>): Path<T, V>;\nexport function path<T, U, V = unknown>(\n\tbase: BasePath<T, U>,\n\texpr: PathExpression<U, V>,\n): Path<T, V>;\nexport function path<T, V = unknown>(\n\tbaseOrExpr?: BasePath<T, unknown> | PathExpression<T, V>,\n\texpr?: PathExpression<unknown, V>,\n): Path<T, V> {\n\tif (baseOrExpr === undefined) {\n\t\treturn new PathImpl<T, V>([]);\n\t}\n\n\tif (typeof baseOrExpr === \"function\") {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = (baseOrExpr as PathExpression<T, V>)(proxy);\n\t\tconst segments: Segment[] =\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? [];\n\t\treturn new PathImpl<T, V>(segments);\n\t}\n\n\tconst baseSegments = (baseOrExpr as BasePath<T, unknown>).segments;\n\tif (expr !== undefined) {\n\t\tconst proxy = createPathProxy([]);\n\t\tconst result = (expr as PathExpression<unknown, V>)(proxy);\n\t\tconst tailSegments =\n\t\t\t((result as Record<symbol, unknown>)?.[PATH_SEGMENTS] as Segment[]) ?? [];\n\t\treturn new PathImpl<T, V>([...baseSegments, ...tailSegments]);\n\t}\n\n\treturn new PathImpl<T, V>(baseSegments);\n}\n\n/**\n * Create a path from a raw dot-separated string (e.g. `\"users.0.name\"`).\n *\n * Useful for dynamic paths from external sources (API responses, Zod issue paths, etc.).\n * Segments that are canonical non-negative integers are stored as numbers; all others as strings.\n *\n * The optional second generic `V` declares the expected leaf type without a cast:\n * ```ts\n * unsafePath<User, string>(\"profile.firstName\").get(user) // string | undefined\n * ```\n *\n * @param raw Dot-separated string. Empty string returns a zero-segment root path.\n */\nexport function unsafePath<T, V = unknown>(raw: string): Path<T, V> {\n\tconst segments: Segment[] = raw\n\t\t? raw\n\t\t\t\t.split(\".\")\n\t\t\t\t.map((s) => (s === \"\" ? s : isCanonicalArrayIndex(s) ? Number(s) : s))\n\t\t: [];\n\treturn new PathImpl<T, V>(segments);\n}\n"],"mappings":"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","names":["baseObj"]}
|
package/package.json
CHANGED