@logixjs/form 0.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.
Files changed (101) hide show
  1. package/dist/Error-VvknI9Wj.d.cts +37 -0
  2. package/dist/Error-VvknI9Wj.d.ts +37 -0
  3. package/dist/Error.cjs +46 -0
  4. package/dist/Error.cjs.map +1 -0
  5. package/dist/Error.d.cts +1 -0
  6. package/dist/Error.d.ts +1 -0
  7. package/dist/Error.js +14 -0
  8. package/dist/Error.js.map +1 -0
  9. package/dist/Form.cjs +2455 -0
  10. package/dist/Form.cjs.map +1 -0
  11. package/dist/Form.d.cts +64 -0
  12. package/dist/Form.d.ts +64 -0
  13. package/dist/Form.js +25 -0
  14. package/dist/Form.js.map +1 -0
  15. package/dist/FormView-CAg9LVrf.d.cts +17 -0
  16. package/dist/FormView-CAg9LVrf.d.ts +17 -0
  17. package/dist/FormView.cjs +61 -0
  18. package/dist/FormView.cjs.map +1 -0
  19. package/dist/FormView.d.cts +1 -0
  20. package/dist/FormView.d.ts +1 -0
  21. package/dist/FormView.js +8 -0
  22. package/dist/FormView.js.map +1 -0
  23. package/dist/Path-DOjMkAS6.d.cts +42 -0
  24. package/dist/Path-DOjMkAS6.d.ts +42 -0
  25. package/dist/Path.cjs +132 -0
  26. package/dist/Path.cjs.map +1 -0
  27. package/dist/Path.d.cts +1 -0
  28. package/dist/Path.d.ts +1 -0
  29. package/dist/Path.js +22 -0
  30. package/dist/Path.js.map +1 -0
  31. package/dist/Rule-BOAiSVz9.d.cts +202 -0
  32. package/dist/Rule-BOAiSVz9.d.ts +202 -0
  33. package/dist/Rule.cjs +307 -0
  34. package/dist/Rule.cjs.map +1 -0
  35. package/dist/Rule.d.cts +2 -0
  36. package/dist/Rule.d.ts +2 -0
  37. package/dist/Rule.js +34 -0
  38. package/dist/Rule.js.map +1 -0
  39. package/dist/SchemaErrorMapping-Cu5gl7-Z.d.ts +50 -0
  40. package/dist/SchemaErrorMapping-DOrgLzii.d.cts +50 -0
  41. package/dist/SchemaErrorMapping.cjs +305 -0
  42. package/dist/SchemaErrorMapping.cjs.map +1 -0
  43. package/dist/SchemaErrorMapping.d.cts +2 -0
  44. package/dist/SchemaErrorMapping.d.ts +2 -0
  45. package/dist/SchemaErrorMapping.js +17 -0
  46. package/dist/SchemaErrorMapping.js.map +1 -0
  47. package/dist/SchemaPathMapping-BCoUW-_q.d.ts +16 -0
  48. package/dist/SchemaPathMapping-BUq2zm8W.d.cts +20 -0
  49. package/dist/SchemaPathMapping-BUq2zm8W.d.ts +20 -0
  50. package/dist/SchemaPathMapping-DJnExqM3.d.cts +16 -0
  51. package/dist/SchemaPathMapping.cjs +179 -0
  52. package/dist/SchemaPathMapping.cjs.map +1 -0
  53. package/dist/SchemaPathMapping.d.cts +2 -0
  54. package/dist/SchemaPathMapping.d.ts +2 -0
  55. package/dist/SchemaPathMapping.js +12 -0
  56. package/dist/SchemaPathMapping.js.map +1 -0
  57. package/dist/Trait-Bu794ROY.d.cts +49 -0
  58. package/dist/Trait-Bu794ROY.d.ts +49 -0
  59. package/dist/Trait.cjs +48 -0
  60. package/dist/Trait.cjs.map +1 -0
  61. package/dist/Trait.d.cts +2 -0
  62. package/dist/Trait.d.ts +2 -0
  63. package/dist/Trait.js +12 -0
  64. package/dist/Trait.js.map +1 -0
  65. package/dist/chunk-5DRI5UGD.js +105 -0
  66. package/dist/chunk-5DRI5UGD.js.map +1 -0
  67. package/dist/chunk-AD2ZA7KA.js +23 -0
  68. package/dist/chunk-AD2ZA7KA.js.map +1 -0
  69. package/dist/chunk-EOXJRCM6.js +146 -0
  70. package/dist/chunk-EOXJRCM6.js.map +1 -0
  71. package/dist/chunk-JZ5FZKPJ.js +71 -0
  72. package/dist/chunk-JZ5FZKPJ.js.map +1 -0
  73. package/dist/chunk-LNJJPZAG.js +46 -0
  74. package/dist/chunk-LNJJPZAG.js.map +1 -0
  75. package/dist/chunk-NAR5SIFP.js +22 -0
  76. package/dist/chunk-NAR5SIFP.js.map +1 -0
  77. package/dist/chunk-OJVEZKU7.js +117 -0
  78. package/dist/chunk-OJVEZKU7.js.map +1 -0
  79. package/dist/chunk-PZ5AY32C.js +10 -0
  80. package/dist/chunk-PZ5AY32C.js.map +1 -0
  81. package/dist/chunk-S5JTU2CM.js +31 -0
  82. package/dist/chunk-S5JTU2CM.js.map +1 -0
  83. package/dist/chunk-YHDEJ47V.js +1885 -0
  84. package/dist/chunk-YHDEJ47V.js.map +1 -0
  85. package/dist/chunk-YVHXLY63.js +315 -0
  86. package/dist/chunk-YVHXLY63.js.map +1 -0
  87. package/dist/impl-BfSlyM58.d.ts +225 -0
  88. package/dist/impl-Ccdm5eDF.d.cts +225 -0
  89. package/dist/index.cjs +2689 -0
  90. package/dist/index.cjs.map +1 -0
  91. package/dist/index.d.cts +12 -0
  92. package/dist/index.d.ts +12 -0
  93. package/dist/index.js +56 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/react/index.cjs +332 -0
  96. package/dist/react/index.cjs.map +1 -0
  97. package/dist/react/index.d.cts +43 -0
  98. package/dist/react/index.d.ts +43 -0
  99. package/dist/react/index.js +201 -0
  100. package/dist/react/index.js.map +1 -0
  101. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/SchemaPathMapping.ts","../src/internal/schema/SchemaPathMapping.ts"],"sourcesContent":["import type { FieldPath, SchemaError, SchemaPathMappingOptions } from './internal/schema/SchemaPathMapping.js'\nimport { mapSchemaErrorToFieldPaths } from './internal/schema/SchemaPathMapping.js'\n\nexport type { FieldPath, SchemaError, SchemaPathMappingOptions }\nexport { mapSchemaErrorToFieldPaths }\n\nexport const SchemaPathMapping = {\n mapSchemaErrorToFieldPaths,\n} as const\n","export type FieldPath = string\n\nexport type SchemaError = unknown\n\nexport interface SchemaPathMappingOptions {\n /**\n * errorMap: an escape hatch for complex transform cases (explicitly assigns an error to a set of field paths).\n */\n readonly errorMap?: (schemaError: SchemaError) => ReadonlyArray<FieldPath>\n /**\n * rename: a common rename mapping (domainPath -> viewPath).\n */\n readonly rename?: Readonly<Record<FieldPath, FieldPath>>\n}\n\ntype Segment = string | number\n\nconst isNumericSegment = (seg: string): boolean => /^[0-9]+$/.test(seg)\n\nconst parseSegmentsFromString = (path: string): ReadonlyArray<Segment> => {\n if (!path) return []\n return path\n .split('.')\n .filter(Boolean)\n .map((seg) => (isNumericSegment(seg) ? Number(seg) : seg))\n}\n\nconst asSegments = (value: unknown): ReadonlyArray<Segment> | undefined => {\n if (typeof value === 'string') return parseSegmentsFromString(value)\n if (Array.isArray(value)) {\n const parts: Array<Segment> = []\n for (const x of value) {\n if (typeof x === 'number' && Number.isFinite(x)) {\n parts.push(Math.floor(x))\n continue\n }\n if (typeof x === 'string' && x.length > 0) {\n parts.push(isNumericSegment(x) ? Number(x) : x)\n }\n }\n return parts.length ? parts : undefined\n }\n return undefined\n}\n\nconst toConcretePath = (segments: ReadonlyArray<Segment>): string => segments.map(String).join('.')\n\nconst toPatternPath = (\n segments: ReadonlyArray<Segment>,\n): { readonly pattern: string; readonly indices: ReadonlyArray<number> } => {\n const out: Array<string> = []\n const indices: Array<number> = []\n for (const seg of segments) {\n if (typeof seg === 'number') {\n out.push('[]')\n indices.push(seg)\n } else {\n out.push(seg)\n }\n }\n const pattern = out.join('.').replace(/\\.\\[\\]/g, '[]')\n return { pattern, indices }\n}\n\nconst applyIndicesToPattern = (pattern: string, indices: ReadonlyArray<number>): string | undefined => {\n if (!pattern) return pattern\n const raw = pattern.split('.').filter(Boolean)\n const out: Array<string> = []\n\n let cursor = 0\n for (const part of raw) {\n if (part === '[]') {\n const idx = indices[cursor++]\n if (idx === undefined) return undefined\n out.push(String(idx))\n continue\n }\n if (part.endsWith('[]') && part.length > 2) {\n const base = part.slice(0, -2)\n out.push(base)\n const idx = indices[cursor++]\n if (idx === undefined) return undefined\n out.push(String(idx))\n continue\n }\n out.push(part)\n }\n return out.join('.')\n}\n\nconst concatPaths = (prefix: string, rest: string): string => {\n if (!prefix) return rest\n if (!rest) return prefix\n return `${prefix}.${rest}`\n}\n\nconst mapByRename = (\n segments: ReadonlyArray<Segment>,\n rename: Readonly<Record<FieldPath, FieldPath>>,\n): string | undefined => {\n const concrete = toConcretePath(segments)\n const direct = rename[concrete]\n if (direct !== undefined) {\n return direct\n }\n\n const { pattern, indices } = toPatternPath(segments)\n const patternDirect = rename[pattern]\n if (patternDirect !== undefined) {\n return applyIndicesToPattern(patternDirect, indices)\n }\n\n const keys = Object.keys(rename).sort((a, b) => b.length - a.length)\n for (const from of keys) {\n const to = rename[from]!\n\n const isPattern = from.includes('[]')\n const target = isPattern ? pattern : concrete\n\n if (target === from || target.startsWith(`${from}.`)) {\n const rawRest = target.slice(from.length)\n const rest = rawRest.startsWith('.') ? rawRest.slice(1) : rawRest\n const mapped = concatPaths(to, rest)\n return isPattern ? applyIndicesToPattern(mapped, indices) : mapped\n }\n }\n\n // Segment-level rename: only enabled when both from/to are single segments, to avoid accidental \"path rewrites\".\n const segMap: Record<string, string> = {}\n for (const [from, to] of Object.entries(rename)) {\n if (from.includes('.') || from.includes('[]')) continue\n if (to.includes('.') || to.includes('[]')) continue\n if (!to) continue\n segMap[from] = to\n }\n if (Object.keys(segMap).length === 0) return undefined\n\n const mappedSegments = segments.map((seg) => (typeof seg === 'string' ? (segMap[seg] ?? seg) : seg))\n return toConcretePath(mappedSegments)\n}\n\nconst extractRawPaths = (schemaError: SchemaError): ReadonlyArray<unknown> => {\n const out: Array<unknown> = []\n\n if (schemaError && typeof schemaError === 'object') {\n const anyErr = schemaError as any\n if (Array.isArray(anyErr.errors)) {\n for (const e of anyErr.errors) {\n if (e && typeof e === 'object' && 'path' in (e as any)) {\n out.push((e as any).path)\n }\n }\n }\n if (Array.isArray(anyErr.issues)) {\n for (const e of anyErr.issues) {\n if (e && typeof e === 'object' && 'path' in (e as any)) {\n out.push((e as any).path)\n }\n }\n }\n if ('path' in anyErr) {\n out.push(anyErr.path)\n }\n }\n\n return out\n}\n\n/**\n * mapSchemaErrorToFieldPaths:\n * - Phase 3: provides a minimal, usable default mapping, and allows `errorMap` to override.\n * - In a later phase (US3), we will raise the coverage goal to \">= 80% common mappings\" and fill the test matrix.\n */\nexport const mapSchemaErrorToFieldPaths = (\n schemaError: SchemaError,\n options?: SchemaPathMappingOptions,\n): ReadonlyArray<FieldPath> => {\n const fromEscapeHatch = options?.errorMap?.(schemaError)\n if (fromEscapeHatch && fromEscapeHatch.length) {\n return Array.from(new Set(fromEscapeHatch.filter((p) => typeof p === 'string' && p.length > 0)))\n }\n\n const rename = options?.rename\n const results: Array<string> = []\n\n for (const rawPath of extractRawPaths(schemaError)) {\n const segments = asSegments(rawPath)\n if (!segments || segments.length === 0) continue\n\n const mapped = rename ? mapByRename(segments, rename) : undefined\n\n const path = mapped ?? toConcretePath(segments)\n if (path) results.push(path)\n }\n\n return Array.from(new Set(results))\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,2 @@
1
+ export { F as FieldPath, S as SchemaError, a as SchemaPathMappingOptions, m as mapSchemaErrorToFieldPaths } from './SchemaPathMapping-BUq2zm8W.cjs';
2
+ export { a as SchemaPathMapping } from './SchemaPathMapping-DJnExqM3.cjs';
@@ -0,0 +1,2 @@
1
+ export { F as FieldPath, S as SchemaError, a as SchemaPathMappingOptions, m as mapSchemaErrorToFieldPaths } from './SchemaPathMapping-BUq2zm8W.js';
2
+ export { a as SchemaPathMapping } from './SchemaPathMapping-BCoUW-_q.js';
@@ -0,0 +1,12 @@
1
+ import {
2
+ SchemaPathMapping
3
+ } from "./chunk-NAR5SIFP.js";
4
+ import {
5
+ mapSchemaErrorToFieldPaths
6
+ } from "./chunk-EOXJRCM6.js";
7
+ import "./chunk-PZ5AY32C.js";
8
+ export {
9
+ SchemaPathMapping,
10
+ mapSchemaErrorToFieldPaths
11
+ };
12
+ //# sourceMappingURL=SchemaPathMapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,49 @@
1
+ import * as Logix from '@logixjs/core';
2
+
3
+ type FieldPath<S extends object> = Logix.StateTrait.StateFieldPath<S>;
4
+ type AtPath<S extends object, P extends FieldPath<S>> = Logix.StateTrait.StateAtPath<S, P>;
5
+ type TraitEntry<S extends object, P extends string = FieldPath<S>> = Logix.StateTrait.StateTraitEntry<S, P>;
6
+ type DerivedEntry<S extends object, P extends string = FieldPath<S>> = Extract<TraitEntry<S, P>, {
7
+ readonly kind: 'computed' | 'link' | 'source';
8
+ }>;
9
+ type DerivedState<TValues extends object> = TValues & {
10
+ readonly ui: Readonly<Record<string, unknown>>;
11
+ };
12
+ type DerivedSpec<TValues extends object> = Readonly<{
13
+ [P in FieldPath<DerivedState<TValues>>]?: DerivedEntry<DerivedState<TValues>, P>;
14
+ }>;
15
+ type DepsArgs<S extends object, Deps extends ReadonlyArray<FieldPath<S>>> = {
16
+ readonly [K in keyof Deps]: AtPath<S, Deps[K]>;
17
+ };
18
+ declare const computed: <S extends object, P extends FieldPath<S>, const Deps extends ReadonlyArray<FieldPath<S>>>(input: {
19
+ readonly deps: Deps;
20
+ readonly get: (...depsValues: DepsArgs<S, Deps>) => AtPath<S, P>;
21
+ readonly equals?: (prev: AtPath<S, P>, next: AtPath<S, P>) => boolean;
22
+ }) => DerivedEntry<S, P>;
23
+ declare const source: <S extends object, P extends FieldPath<S>, const Deps extends ReadonlyArray<FieldPath<S>>>(input: {
24
+ readonly resource: string;
25
+ readonly deps: Deps;
26
+ readonly key: (...depsValues: DepsArgs<S, Deps>) => unknown;
27
+ readonly triggers?: ReadonlyArray<"onMount" | "onKeyChange" | "manual">;
28
+ readonly debounceMs?: number;
29
+ readonly concurrency?: "switch" | "exhaust-trailing";
30
+ readonly meta?: Record<string, unknown>;
31
+ }) => DerivedEntry<S, P>;
32
+ declare const link: <S extends object, P extends FieldPath<S>>(meta: {
33
+ readonly from: FieldPath<S>;
34
+ }) => DerivedEntry<S, P>;
35
+
36
+ type Trait_AtPath<S extends object, P extends FieldPath<S>> = AtPath<S, P>;
37
+ type Trait_DerivedEntry<S extends object, P extends string = FieldPath<S>> = DerivedEntry<S, P>;
38
+ type Trait_DerivedSpec<TValues extends object> = DerivedSpec<TValues>;
39
+ type Trait_DerivedState<TValues extends object> = DerivedState<TValues>;
40
+ type Trait_FieldPath<S extends object> = FieldPath<S>;
41
+ type Trait_TraitEntry<S extends object, P extends string = FieldPath<S>> = TraitEntry<S, P>;
42
+ declare const Trait_computed: typeof computed;
43
+ declare const Trait_link: typeof link;
44
+ declare const Trait_source: typeof source;
45
+ declare namespace Trait {
46
+ export { type Trait_AtPath as AtPath, type Trait_DerivedEntry as DerivedEntry, type Trait_DerivedSpec as DerivedSpec, type Trait_DerivedState as DerivedState, type Trait_FieldPath as FieldPath, type Trait_TraitEntry as TraitEntry, Trait_computed as computed, Trait_link as link, Trait_source as source };
47
+ }
48
+
49
+ export { type AtPath as A, type DerivedSpec as D, type FieldPath as F, Trait as T, type TraitEntry as a, type DerivedEntry as b, computed as c, type DerivedState as d, link as l, source as s };
@@ -0,0 +1,49 @@
1
+ import * as Logix from '@logixjs/core';
2
+
3
+ type FieldPath<S extends object> = Logix.StateTrait.StateFieldPath<S>;
4
+ type AtPath<S extends object, P extends FieldPath<S>> = Logix.StateTrait.StateAtPath<S, P>;
5
+ type TraitEntry<S extends object, P extends string = FieldPath<S>> = Logix.StateTrait.StateTraitEntry<S, P>;
6
+ type DerivedEntry<S extends object, P extends string = FieldPath<S>> = Extract<TraitEntry<S, P>, {
7
+ readonly kind: 'computed' | 'link' | 'source';
8
+ }>;
9
+ type DerivedState<TValues extends object> = TValues & {
10
+ readonly ui: Readonly<Record<string, unknown>>;
11
+ };
12
+ type DerivedSpec<TValues extends object> = Readonly<{
13
+ [P in FieldPath<DerivedState<TValues>>]?: DerivedEntry<DerivedState<TValues>, P>;
14
+ }>;
15
+ type DepsArgs<S extends object, Deps extends ReadonlyArray<FieldPath<S>>> = {
16
+ readonly [K in keyof Deps]: AtPath<S, Deps[K]>;
17
+ };
18
+ declare const computed: <S extends object, P extends FieldPath<S>, const Deps extends ReadonlyArray<FieldPath<S>>>(input: {
19
+ readonly deps: Deps;
20
+ readonly get: (...depsValues: DepsArgs<S, Deps>) => AtPath<S, P>;
21
+ readonly equals?: (prev: AtPath<S, P>, next: AtPath<S, P>) => boolean;
22
+ }) => DerivedEntry<S, P>;
23
+ declare const source: <S extends object, P extends FieldPath<S>, const Deps extends ReadonlyArray<FieldPath<S>>>(input: {
24
+ readonly resource: string;
25
+ readonly deps: Deps;
26
+ readonly key: (...depsValues: DepsArgs<S, Deps>) => unknown;
27
+ readonly triggers?: ReadonlyArray<"onMount" | "onKeyChange" | "manual">;
28
+ readonly debounceMs?: number;
29
+ readonly concurrency?: "switch" | "exhaust-trailing";
30
+ readonly meta?: Record<string, unknown>;
31
+ }) => DerivedEntry<S, P>;
32
+ declare const link: <S extends object, P extends FieldPath<S>>(meta: {
33
+ readonly from: FieldPath<S>;
34
+ }) => DerivedEntry<S, P>;
35
+
36
+ type Trait_AtPath<S extends object, P extends FieldPath<S>> = AtPath<S, P>;
37
+ type Trait_DerivedEntry<S extends object, P extends string = FieldPath<S>> = DerivedEntry<S, P>;
38
+ type Trait_DerivedSpec<TValues extends object> = DerivedSpec<TValues>;
39
+ type Trait_DerivedState<TValues extends object> = DerivedState<TValues>;
40
+ type Trait_FieldPath<S extends object> = FieldPath<S>;
41
+ type Trait_TraitEntry<S extends object, P extends string = FieldPath<S>> = TraitEntry<S, P>;
42
+ declare const Trait_computed: typeof computed;
43
+ declare const Trait_link: typeof link;
44
+ declare const Trait_source: typeof source;
45
+ declare namespace Trait {
46
+ export { type Trait_AtPath as AtPath, type Trait_DerivedEntry as DerivedEntry, type Trait_DerivedSpec as DerivedSpec, type Trait_DerivedState as DerivedState, type Trait_FieldPath as FieldPath, type Trait_TraitEntry as TraitEntry, Trait_computed as computed, Trait_link as link, Trait_source as source };
47
+ }
48
+
49
+ export { type AtPath as A, type DerivedSpec as D, type FieldPath as F, Trait as T, type TraitEntry as a, type DerivedEntry as b, computed as c, type DerivedState as d, link as l, source as s };
package/dist/Trait.cjs ADDED
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/Trait.ts
31
+ var Trait_exports = {};
32
+ __export(Trait_exports, {
33
+ computed: () => computed,
34
+ link: () => link,
35
+ source: () => source
36
+ });
37
+ module.exports = __toCommonJS(Trait_exports);
38
+ var Logix = __toESM(require("@logixjs/core"), 1);
39
+ var computed = (input) => Logix.StateTrait.computed(input);
40
+ var source = (input) => Logix.StateTrait.source(input);
41
+ var link = (meta) => Logix.StateTrait.link(meta);
42
+ // Annotate the CommonJS export names for ESM import in node:
43
+ 0 && (module.exports = {
44
+ computed,
45
+ link,
46
+ source
47
+ });
48
+ //# sourceMappingURL=Trait.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Trait.ts"],"sourcesContent":["import * as Logix from '@logixjs/core'\n\nexport type FieldPath<S extends object> = Logix.StateTrait.StateFieldPath<S>\nexport type AtPath<S extends object, P extends FieldPath<S>> = Logix.StateTrait.StateAtPath<S, P>\n\nexport type TraitEntry<S extends object, P extends string = FieldPath<S>> = Logix.StateTrait.StateTraitEntry<S, P>\n\nexport type DerivedEntry<S extends object, P extends string = FieldPath<S>> = Extract<\n TraitEntry<S, P>,\n { readonly kind: 'computed' | 'link' | 'source' }\n>\n\nexport type DerivedState<TValues extends object> = TValues & {\n readonly ui: Readonly<Record<string, unknown>>\n}\n\nexport type DerivedSpec<TValues extends object> = Readonly<{\n [P in FieldPath<DerivedState<TValues>>]?: DerivedEntry<DerivedState<TValues>, P>\n}>\n\ntype DepsArgs<S extends object, Deps extends ReadonlyArray<FieldPath<S>>> = {\n readonly [K in keyof Deps]: AtPath<S, Deps[K]>\n}\n\nexport const computed = <\n S extends object,\n P extends FieldPath<S>,\n const Deps extends ReadonlyArray<FieldPath<S>>,\n>(input: {\n readonly deps: Deps\n readonly get: (...depsValues: DepsArgs<S, Deps>) => AtPath<S, P>\n readonly equals?: (prev: AtPath<S, P>, next: AtPath<S, P>) => boolean\n}): DerivedEntry<S, P> => Logix.StateTrait.computed(input as any) as any\n\nexport const source = <S extends object, P extends FieldPath<S>, const Deps extends ReadonlyArray<FieldPath<S>>>(input: {\n readonly resource: string\n readonly deps: Deps\n readonly key: (...depsValues: DepsArgs<S, Deps>) => unknown\n readonly triggers?: ReadonlyArray<'onMount' | 'onKeyChange' | 'manual'>\n readonly debounceMs?: number\n readonly concurrency?: 'switch' | 'exhaust-trailing'\n readonly meta?: Record<string, unknown>\n}): DerivedEntry<S, P> => Logix.StateTrait.source(input as any) as any\n\nexport const link = <S extends object, P extends FieldPath<S>>(meta: {\n readonly from: FieldPath<S>\n}): DerivedEntry<S, P> => Logix.StateTrait.link(meta as any) as any\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAuB;AAwBhB,IAAM,WAAW,CAItB,UAI8B,iBAAW,SAAS,KAAY;AAEzD,IAAM,SAAS,CAA2F,UAQjF,iBAAW,OAAO,KAAY;AAEvD,IAAM,OAAO,CAA2C,SAE/B,iBAAW,KAAK,IAAW;","names":[]}
@@ -0,0 +1,2 @@
1
+ import '@logixjs/core';
2
+ export { A as AtPath, b as DerivedEntry, D as DerivedSpec, d as DerivedState, F as FieldPath, a as TraitEntry, c as computed, l as link, s as source } from './Trait-Bu794ROY.cjs';
@@ -0,0 +1,2 @@
1
+ import '@logixjs/core';
2
+ export { A as AtPath, b as DerivedEntry, D as DerivedSpec, d as DerivedState, F as FieldPath, a as TraitEntry, c as computed, l as link, s as source } from './Trait-Bu794ROY.js';
package/dist/Trait.js ADDED
@@ -0,0 +1,12 @@
1
+ import {
2
+ computed,
3
+ link,
4
+ source
5
+ } from "./chunk-AD2ZA7KA.js";
6
+ import "./chunk-PZ5AY32C.js";
7
+ export {
8
+ computed,
9
+ link,
10
+ source
11
+ };
12
+ //# sourceMappingURL=Trait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,105 @@
1
+ // src/internal/form/path.ts
2
+ var getAtPath = (state, path) => {
3
+ if (!path) return state;
4
+ const segments = path.split(".");
5
+ let current = state;
6
+ for (const segment of segments) {
7
+ if (current == null) return void 0;
8
+ const index = Number(segment);
9
+ if (Array.isArray(current) && Number.isInteger(index) && String(index) === segment) {
10
+ current = current[index];
11
+ continue;
12
+ }
13
+ current = current[segment];
14
+ }
15
+ return current;
16
+ };
17
+ var cloneContainer = (value) => {
18
+ if (Array.isArray(value)) return value.slice();
19
+ if (value && typeof value === "object") return { ...value };
20
+ return void 0;
21
+ };
22
+ var setAtPath = (state, path, value) => {
23
+ if (!path) return value;
24
+ const segments = path.split(".");
25
+ const rootClone = cloneContainer(state) ?? {};
26
+ let current = rootClone;
27
+ let currentSource = state;
28
+ for (let i = 0; i < segments.length - 1; i++) {
29
+ const segment = segments[i];
30
+ const index = Number(segment);
31
+ const isIndex = Number.isInteger(index) && String(index) === segment;
32
+ const nextSource = currentSource == null ? void 0 : isIndex && Array.isArray(currentSource) ? currentSource[index] : currentSource[segment];
33
+ const nextSegment = segments[i + 1];
34
+ const nextIndex = Number(nextSegment);
35
+ const nextIsIndex = Number.isInteger(nextIndex) && String(nextIndex) === nextSegment;
36
+ const nextClone = cloneContainer(nextSource) ?? (nextIsIndex ? [] : {});
37
+ if (isIndex && Array.isArray(current)) {
38
+ current[index] = nextClone;
39
+ } else {
40
+ current[segment] = nextClone;
41
+ }
42
+ current = nextClone;
43
+ currentSource = nextSource;
44
+ }
45
+ const last = segments[segments.length - 1];
46
+ const lastIndex = Number(last);
47
+ const lastIsIndex = Number.isInteger(lastIndex) && String(lastIndex) === last;
48
+ if (lastIsIndex && Array.isArray(current)) {
49
+ current[lastIndex] = value;
50
+ } else {
51
+ current[last] = value;
52
+ }
53
+ return rootClone;
54
+ };
55
+ var unsetAtPath = (state, path) => {
56
+ if (!path) return state;
57
+ if (getAtPath(state, path) === void 0) return state;
58
+ const segments = path.split(".");
59
+ const rootClone = cloneContainer(state);
60
+ if (rootClone === void 0) return state;
61
+ let current = rootClone;
62
+ let currentSource = state;
63
+ for (let i = 0; i < segments.length - 1; i++) {
64
+ const segment = segments[i];
65
+ const index = Number(segment);
66
+ const isIndex = Number.isInteger(index) && String(index) === segment;
67
+ const nextSource = currentSource == null ? void 0 : isIndex && Array.isArray(currentSource) ? currentSource[index] : currentSource[segment];
68
+ const nextClone = cloneContainer(nextSource);
69
+ if (nextClone === void 0) {
70
+ return state;
71
+ }
72
+ if (isIndex && Array.isArray(current)) {
73
+ current[index] = nextClone;
74
+ } else {
75
+ current[segment] = nextClone;
76
+ }
77
+ current = nextClone;
78
+ currentSource = nextSource;
79
+ }
80
+ const last = segments[segments.length - 1];
81
+ const lastIndex = Number(last);
82
+ const lastIsIndex = Number.isInteger(lastIndex) && String(lastIndex) === last;
83
+ if (lastIsIndex && Array.isArray(current)) {
84
+ current[lastIndex] = void 0;
85
+ return rootClone;
86
+ }
87
+ if (current && typeof current === "object") {
88
+ delete current[last];
89
+ }
90
+ return rootClone;
91
+ };
92
+ var updateArrayAtPath = (state, path, update) => {
93
+ const current = getAtPath(state, path);
94
+ const items = Array.isArray(current) ? current : [];
95
+ const next = update(items);
96
+ return setAtPath(state, path, next);
97
+ };
98
+
99
+ export {
100
+ getAtPath,
101
+ setAtPath,
102
+ unsetAtPath,
103
+ updateArrayAtPath
104
+ };
105
+ //# sourceMappingURL=chunk-5DRI5UGD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/form/path.ts"],"sourcesContent":["export const getAtPath = (state: unknown, path: string): unknown => {\n if (!path) return state\n\n const segments = path.split('.')\n let current: any = state\n\n for (const segment of segments) {\n if (current == null) return undefined\n const index = Number(segment)\n if (Array.isArray(current) && Number.isInteger(index) && String(index) === segment) {\n current = current[index]\n continue\n }\n current = current[segment]\n }\n\n return current\n}\n\nconst cloneContainer = (value: unknown): any => {\n if (Array.isArray(value)) return value.slice()\n if (value && typeof value === 'object') return { ...(value as any) }\n return undefined\n}\n\nexport const setAtPath = (state: unknown, path: string, value: unknown): unknown => {\n if (!path) return value\n\n const segments = path.split('.')\n const rootClone = cloneContainer(state) ?? {}\n\n let current: any = rootClone\n let currentSource: any = state\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i]!\n const index = Number(segment)\n const isIndex = Number.isInteger(index) && String(index) === segment\n\n const nextSource =\n currentSource == null\n ? undefined\n : isIndex && Array.isArray(currentSource)\n ? currentSource[index]\n : currentSource[segment]\n\n const nextSegment = segments[i + 1]!\n const nextIndex = Number(nextSegment)\n const nextIsIndex = Number.isInteger(nextIndex) && String(nextIndex) === nextSegment\n\n const nextClone = cloneContainer(nextSource) ?? (nextIsIndex ? [] : {})\n\n if (isIndex && Array.isArray(current)) {\n current[index] = nextClone\n } else {\n current[segment] = nextClone\n }\n\n current = nextClone\n currentSource = nextSource\n }\n\n const last = segments[segments.length - 1]!\n const lastIndex = Number(last)\n const lastIsIndex = Number.isInteger(lastIndex) && String(lastIndex) === last\n\n if (lastIsIndex && Array.isArray(current)) {\n current[lastIndex] = value\n } else {\n current[last] = value\n }\n\n return rootClone\n}\n\nexport const unsetAtPath = (state: unknown, path: string): unknown => {\n if (!path) return state\n if (getAtPath(state, path) === undefined) return state\n\n const segments = path.split('.')\n const rootClone = cloneContainer(state)\n if (rootClone === undefined) return state\n\n let current: any = rootClone\n let currentSource: any = state\n\n for (let i = 0; i < segments.length - 1; i++) {\n const segment = segments[i]!\n const index = Number(segment)\n const isIndex = Number.isInteger(index) && String(index) === segment\n\n const nextSource =\n currentSource == null\n ? undefined\n : isIndex && Array.isArray(currentSource)\n ? currentSource[index]\n : currentSource[segment]\n\n const nextClone = cloneContainer(nextSource)\n if (nextClone === undefined) {\n return state\n }\n\n if (isIndex && Array.isArray(current)) {\n current[index] = nextClone\n } else {\n current[segment] = nextClone\n }\n\n current = nextClone\n currentSource = nextSource\n }\n\n const last = segments[segments.length - 1]!\n const lastIndex = Number(last)\n const lastIsIndex = Number.isInteger(lastIndex) && String(lastIndex) === last\n\n if (lastIsIndex && Array.isArray(current)) {\n current[lastIndex] = undefined\n return rootClone\n }\n\n if (current && typeof current === 'object') {\n delete current[last]\n }\n\n return rootClone\n}\n\nexport const updateArrayAtPath = (\n state: unknown,\n path: string,\n update: (items: ReadonlyArray<unknown>) => ReadonlyArray<unknown>,\n): unknown => {\n const current = getAtPath(state, path)\n const items = Array.isArray(current) ? current : []\n const next = update(items)\n return setAtPath(state, path, next)\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,23 @@
1
+ import {
2
+ __export
3
+ } from "./chunk-PZ5AY32C.js";
4
+
5
+ // src/Trait.ts
6
+ var Trait_exports = {};
7
+ __export(Trait_exports, {
8
+ computed: () => computed,
9
+ link: () => link,
10
+ source: () => source
11
+ });
12
+ import * as Logix from "@logixjs/core";
13
+ var computed = (input) => Logix.StateTrait.computed(input);
14
+ var source = (input) => Logix.StateTrait.source(input);
15
+ var link = (meta) => Logix.StateTrait.link(meta);
16
+
17
+ export {
18
+ computed,
19
+ source,
20
+ link,
21
+ Trait_exports
22
+ };
23
+ //# sourceMappingURL=chunk-AD2ZA7KA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/Trait.ts"],"sourcesContent":["import * as Logix from '@logixjs/core'\n\nexport type FieldPath<S extends object> = Logix.StateTrait.StateFieldPath<S>\nexport type AtPath<S extends object, P extends FieldPath<S>> = Logix.StateTrait.StateAtPath<S, P>\n\nexport type TraitEntry<S extends object, P extends string = FieldPath<S>> = Logix.StateTrait.StateTraitEntry<S, P>\n\nexport type DerivedEntry<S extends object, P extends string = FieldPath<S>> = Extract<\n TraitEntry<S, P>,\n { readonly kind: 'computed' | 'link' | 'source' }\n>\n\nexport type DerivedState<TValues extends object> = TValues & {\n readonly ui: Readonly<Record<string, unknown>>\n}\n\nexport type DerivedSpec<TValues extends object> = Readonly<{\n [P in FieldPath<DerivedState<TValues>>]?: DerivedEntry<DerivedState<TValues>, P>\n}>\n\ntype DepsArgs<S extends object, Deps extends ReadonlyArray<FieldPath<S>>> = {\n readonly [K in keyof Deps]: AtPath<S, Deps[K]>\n}\n\nexport const computed = <\n S extends object,\n P extends FieldPath<S>,\n const Deps extends ReadonlyArray<FieldPath<S>>,\n>(input: {\n readonly deps: Deps\n readonly get: (...depsValues: DepsArgs<S, Deps>) => AtPath<S, P>\n readonly equals?: (prev: AtPath<S, P>, next: AtPath<S, P>) => boolean\n}): DerivedEntry<S, P> => Logix.StateTrait.computed(input as any) as any\n\nexport const source = <S extends object, P extends FieldPath<S>, const Deps extends ReadonlyArray<FieldPath<S>>>(input: {\n readonly resource: string\n readonly deps: Deps\n readonly key: (...depsValues: DepsArgs<S, Deps>) => unknown\n readonly triggers?: ReadonlyArray<'onMount' | 'onKeyChange' | 'manual'>\n readonly debounceMs?: number\n readonly concurrency?: 'switch' | 'exhaust-trailing'\n readonly meta?: Record<string, unknown>\n}): DerivedEntry<S, P> => Logix.StateTrait.source(input as any) as any\n\nexport const link = <S extends object, P extends FieldPath<S>>(meta: {\n readonly from: FieldPath<S>\n}): DerivedEntry<S, P> => Logix.StateTrait.link(meta as any) as any\n"],"mappings":";;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAY,WAAW;AAwBhB,IAAM,WAAW,CAItB,UAI8B,iBAAW,SAAS,KAAY;AAEzD,IAAM,SAAS,CAA2F,UAQjF,iBAAW,OAAO,KAAY;AAEvD,IAAM,OAAO,CAA2C,SAE/B,iBAAW,KAAK,IAAW;","names":[]}
@@ -0,0 +1,146 @@
1
+ // src/internal/schema/SchemaPathMapping.ts
2
+ var isNumericSegment = (seg) => /^[0-9]+$/.test(seg);
3
+ var parseSegmentsFromString = (path) => {
4
+ if (!path) return [];
5
+ return path.split(".").filter(Boolean).map((seg) => isNumericSegment(seg) ? Number(seg) : seg);
6
+ };
7
+ var asSegments = (value) => {
8
+ if (typeof value === "string") return parseSegmentsFromString(value);
9
+ if (Array.isArray(value)) {
10
+ const parts = [];
11
+ for (const x of value) {
12
+ if (typeof x === "number" && Number.isFinite(x)) {
13
+ parts.push(Math.floor(x));
14
+ continue;
15
+ }
16
+ if (typeof x === "string" && x.length > 0) {
17
+ parts.push(isNumericSegment(x) ? Number(x) : x);
18
+ }
19
+ }
20
+ return parts.length ? parts : void 0;
21
+ }
22
+ return void 0;
23
+ };
24
+ var toConcretePath = (segments) => segments.map(String).join(".");
25
+ var toPatternPath = (segments) => {
26
+ const out = [];
27
+ const indices = [];
28
+ for (const seg of segments) {
29
+ if (typeof seg === "number") {
30
+ out.push("[]");
31
+ indices.push(seg);
32
+ } else {
33
+ out.push(seg);
34
+ }
35
+ }
36
+ const pattern = out.join(".").replace(/\.\[\]/g, "[]");
37
+ return { pattern, indices };
38
+ };
39
+ var applyIndicesToPattern = (pattern, indices) => {
40
+ if (!pattern) return pattern;
41
+ const raw = pattern.split(".").filter(Boolean);
42
+ const out = [];
43
+ let cursor = 0;
44
+ for (const part of raw) {
45
+ if (part === "[]") {
46
+ const idx = indices[cursor++];
47
+ if (idx === void 0) return void 0;
48
+ out.push(String(idx));
49
+ continue;
50
+ }
51
+ if (part.endsWith("[]") && part.length > 2) {
52
+ const base = part.slice(0, -2);
53
+ out.push(base);
54
+ const idx = indices[cursor++];
55
+ if (idx === void 0) return void 0;
56
+ out.push(String(idx));
57
+ continue;
58
+ }
59
+ out.push(part);
60
+ }
61
+ return out.join(".");
62
+ };
63
+ var concatPaths = (prefix, rest) => {
64
+ if (!prefix) return rest;
65
+ if (!rest) return prefix;
66
+ return `${prefix}.${rest}`;
67
+ };
68
+ var mapByRename = (segments, rename) => {
69
+ const concrete = toConcretePath(segments);
70
+ const direct = rename[concrete];
71
+ if (direct !== void 0) {
72
+ return direct;
73
+ }
74
+ const { pattern, indices } = toPatternPath(segments);
75
+ const patternDirect = rename[pattern];
76
+ if (patternDirect !== void 0) {
77
+ return applyIndicesToPattern(patternDirect, indices);
78
+ }
79
+ const keys = Object.keys(rename).sort((a, b) => b.length - a.length);
80
+ for (const from of keys) {
81
+ const to = rename[from];
82
+ const isPattern = from.includes("[]");
83
+ const target = isPattern ? pattern : concrete;
84
+ if (target === from || target.startsWith(`${from}.`)) {
85
+ const rawRest = target.slice(from.length);
86
+ const rest = rawRest.startsWith(".") ? rawRest.slice(1) : rawRest;
87
+ const mapped = concatPaths(to, rest);
88
+ return isPattern ? applyIndicesToPattern(mapped, indices) : mapped;
89
+ }
90
+ }
91
+ const segMap = {};
92
+ for (const [from, to] of Object.entries(rename)) {
93
+ if (from.includes(".") || from.includes("[]")) continue;
94
+ if (to.includes(".") || to.includes("[]")) continue;
95
+ if (!to) continue;
96
+ segMap[from] = to;
97
+ }
98
+ if (Object.keys(segMap).length === 0) return void 0;
99
+ const mappedSegments = segments.map((seg) => typeof seg === "string" ? segMap[seg] ?? seg : seg);
100
+ return toConcretePath(mappedSegments);
101
+ };
102
+ var extractRawPaths = (schemaError) => {
103
+ const out = [];
104
+ if (schemaError && typeof schemaError === "object") {
105
+ const anyErr = schemaError;
106
+ if (Array.isArray(anyErr.errors)) {
107
+ for (const e of anyErr.errors) {
108
+ if (e && typeof e === "object" && "path" in e) {
109
+ out.push(e.path);
110
+ }
111
+ }
112
+ }
113
+ if (Array.isArray(anyErr.issues)) {
114
+ for (const e of anyErr.issues) {
115
+ if (e && typeof e === "object" && "path" in e) {
116
+ out.push(e.path);
117
+ }
118
+ }
119
+ }
120
+ if ("path" in anyErr) {
121
+ out.push(anyErr.path);
122
+ }
123
+ }
124
+ return out;
125
+ };
126
+ var mapSchemaErrorToFieldPaths = (schemaError, options) => {
127
+ const fromEscapeHatch = options?.errorMap?.(schemaError);
128
+ if (fromEscapeHatch && fromEscapeHatch.length) {
129
+ return Array.from(new Set(fromEscapeHatch.filter((p) => typeof p === "string" && p.length > 0)));
130
+ }
131
+ const rename = options?.rename;
132
+ const results = [];
133
+ for (const rawPath of extractRawPaths(schemaError)) {
134
+ const segments = asSegments(rawPath);
135
+ if (!segments || segments.length === 0) continue;
136
+ const mapped = rename ? mapByRename(segments, rename) : void 0;
137
+ const path = mapped ?? toConcretePath(segments);
138
+ if (path) results.push(path);
139
+ }
140
+ return Array.from(new Set(results));
141
+ };
142
+
143
+ export {
144
+ mapSchemaErrorToFieldPaths
145
+ };
146
+ //# sourceMappingURL=chunk-EOXJRCM6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/schema/SchemaPathMapping.ts"],"sourcesContent":["export type FieldPath = string\n\nexport type SchemaError = unknown\n\nexport interface SchemaPathMappingOptions {\n /**\n * errorMap: an escape hatch for complex transform cases (explicitly assigns an error to a set of field paths).\n */\n readonly errorMap?: (schemaError: SchemaError) => ReadonlyArray<FieldPath>\n /**\n * rename: a common rename mapping (domainPath -> viewPath).\n */\n readonly rename?: Readonly<Record<FieldPath, FieldPath>>\n}\n\ntype Segment = string | number\n\nconst isNumericSegment = (seg: string): boolean => /^[0-9]+$/.test(seg)\n\nconst parseSegmentsFromString = (path: string): ReadonlyArray<Segment> => {\n if (!path) return []\n return path\n .split('.')\n .filter(Boolean)\n .map((seg) => (isNumericSegment(seg) ? Number(seg) : seg))\n}\n\nconst asSegments = (value: unknown): ReadonlyArray<Segment> | undefined => {\n if (typeof value === 'string') return parseSegmentsFromString(value)\n if (Array.isArray(value)) {\n const parts: Array<Segment> = []\n for (const x of value) {\n if (typeof x === 'number' && Number.isFinite(x)) {\n parts.push(Math.floor(x))\n continue\n }\n if (typeof x === 'string' && x.length > 0) {\n parts.push(isNumericSegment(x) ? Number(x) : x)\n }\n }\n return parts.length ? parts : undefined\n }\n return undefined\n}\n\nconst toConcretePath = (segments: ReadonlyArray<Segment>): string => segments.map(String).join('.')\n\nconst toPatternPath = (\n segments: ReadonlyArray<Segment>,\n): { readonly pattern: string; readonly indices: ReadonlyArray<number> } => {\n const out: Array<string> = []\n const indices: Array<number> = []\n for (const seg of segments) {\n if (typeof seg === 'number') {\n out.push('[]')\n indices.push(seg)\n } else {\n out.push(seg)\n }\n }\n const pattern = out.join('.').replace(/\\.\\[\\]/g, '[]')\n return { pattern, indices }\n}\n\nconst applyIndicesToPattern = (pattern: string, indices: ReadonlyArray<number>): string | undefined => {\n if (!pattern) return pattern\n const raw = pattern.split('.').filter(Boolean)\n const out: Array<string> = []\n\n let cursor = 0\n for (const part of raw) {\n if (part === '[]') {\n const idx = indices[cursor++]\n if (idx === undefined) return undefined\n out.push(String(idx))\n continue\n }\n if (part.endsWith('[]') && part.length > 2) {\n const base = part.slice(0, -2)\n out.push(base)\n const idx = indices[cursor++]\n if (idx === undefined) return undefined\n out.push(String(idx))\n continue\n }\n out.push(part)\n }\n return out.join('.')\n}\n\nconst concatPaths = (prefix: string, rest: string): string => {\n if (!prefix) return rest\n if (!rest) return prefix\n return `${prefix}.${rest}`\n}\n\nconst mapByRename = (\n segments: ReadonlyArray<Segment>,\n rename: Readonly<Record<FieldPath, FieldPath>>,\n): string | undefined => {\n const concrete = toConcretePath(segments)\n const direct = rename[concrete]\n if (direct !== undefined) {\n return direct\n }\n\n const { pattern, indices } = toPatternPath(segments)\n const patternDirect = rename[pattern]\n if (patternDirect !== undefined) {\n return applyIndicesToPattern(patternDirect, indices)\n }\n\n const keys = Object.keys(rename).sort((a, b) => b.length - a.length)\n for (const from of keys) {\n const to = rename[from]!\n\n const isPattern = from.includes('[]')\n const target = isPattern ? pattern : concrete\n\n if (target === from || target.startsWith(`${from}.`)) {\n const rawRest = target.slice(from.length)\n const rest = rawRest.startsWith('.') ? rawRest.slice(1) : rawRest\n const mapped = concatPaths(to, rest)\n return isPattern ? applyIndicesToPattern(mapped, indices) : mapped\n }\n }\n\n // Segment-level rename: only enabled when both from/to are single segments, to avoid accidental \"path rewrites\".\n const segMap: Record<string, string> = {}\n for (const [from, to] of Object.entries(rename)) {\n if (from.includes('.') || from.includes('[]')) continue\n if (to.includes('.') || to.includes('[]')) continue\n if (!to) continue\n segMap[from] = to\n }\n if (Object.keys(segMap).length === 0) return undefined\n\n const mappedSegments = segments.map((seg) => (typeof seg === 'string' ? (segMap[seg] ?? seg) : seg))\n return toConcretePath(mappedSegments)\n}\n\nconst extractRawPaths = (schemaError: SchemaError): ReadonlyArray<unknown> => {\n const out: Array<unknown> = []\n\n if (schemaError && typeof schemaError === 'object') {\n const anyErr = schemaError as any\n if (Array.isArray(anyErr.errors)) {\n for (const e of anyErr.errors) {\n if (e && typeof e === 'object' && 'path' in (e as any)) {\n out.push((e as any).path)\n }\n }\n }\n if (Array.isArray(anyErr.issues)) {\n for (const e of anyErr.issues) {\n if (e && typeof e === 'object' && 'path' in (e as any)) {\n out.push((e as any).path)\n }\n }\n }\n if ('path' in anyErr) {\n out.push(anyErr.path)\n }\n }\n\n return out\n}\n\n/**\n * mapSchemaErrorToFieldPaths:\n * - Phase 3: provides a minimal, usable default mapping, and allows `errorMap` to override.\n * - In a later phase (US3), we will raise the coverage goal to \">= 80% common mappings\" and fill the test matrix.\n */\nexport const mapSchemaErrorToFieldPaths = (\n schemaError: SchemaError,\n options?: SchemaPathMappingOptions,\n): ReadonlyArray<FieldPath> => {\n const fromEscapeHatch = options?.errorMap?.(schemaError)\n if (fromEscapeHatch && fromEscapeHatch.length) {\n return Array.from(new Set(fromEscapeHatch.filter((p) => typeof p === 'string' && p.length > 0)))\n }\n\n const rename = options?.rename\n const results: Array<string> = []\n\n for (const rawPath of extractRawPaths(schemaError)) {\n const segments = asSegments(rawPath)\n if (!segments || segments.length === 0) continue\n\n const mapped = rename ? mapByRename(segments, rename) : undefined\n\n const path = mapped ?? toConcretePath(segments)\n if (path) results.push(path)\n }\n\n return Array.from(new Set(results))\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,71 @@
1
+ import {
2
+ setAtPath
3
+ } from "./chunk-5DRI5UGD.js";
4
+ import {
5
+ toSchemaErrorsPath
6
+ } from "./chunk-OJVEZKU7.js";
7
+ import {
8
+ mapSchemaErrorToFieldPaths
9
+ } from "./chunk-EOXJRCM6.js";
10
+ import {
11
+ __export
12
+ } from "./chunk-PZ5AY32C.js";
13
+
14
+ // src/SchemaErrorMapping.ts
15
+ var SchemaErrorMapping_exports = {};
16
+ __export(SchemaErrorMapping_exports, {
17
+ SchemaErrorMapping: () => SchemaErrorMapping,
18
+ applySchemaErrorToState: () => applySchemaErrorToState,
19
+ toSchemaErrorTree: () => toSchemaErrorTree,
20
+ toSchemaErrorWrites: () => toSchemaErrorWrites
21
+ });
22
+
23
+ // src/internal/schema/SchemaErrorMapping.ts
24
+ var toSchemaErrorWrites = (schemaError, options) => {
25
+ const fieldPaths = mapSchemaErrorToFieldPaths(schemaError, options);
26
+ if (fieldPaths.length === 0) return [];
27
+ const toLeaf = options?.toLeaf ?? ((e) => e);
28
+ const leaf = toLeaf(schemaError);
29
+ return fieldPaths.map((fieldPath) => ({
30
+ fieldPath,
31
+ errorPath: toSchemaErrorsPath(fieldPath),
32
+ error: leaf
33
+ }));
34
+ };
35
+ var toSchemaErrorTree = (schemaError, options) => {
36
+ const writes = toSchemaErrorWrites(schemaError, options);
37
+ if (writes.length === 0) return {};
38
+ let next = {};
39
+ for (const w of writes) {
40
+ const prefix = "errors.$schema.";
41
+ const relative = w.errorPath.startsWith(prefix) ? w.errorPath.slice(prefix.length) : w.errorPath;
42
+ if (!relative) continue;
43
+ next = setAtPath(next, relative, w.error);
44
+ }
45
+ return next;
46
+ };
47
+ var applySchemaErrorToState = (state, schemaError, options) => {
48
+ const writes = toSchemaErrorWrites(schemaError, options);
49
+ if (writes.length === 0) return state;
50
+ let next = state;
51
+ for (const w of writes) {
52
+ next = setAtPath(next, w.errorPath, w.error);
53
+ }
54
+ return next;
55
+ };
56
+
57
+ // src/SchemaErrorMapping.ts
58
+ var SchemaErrorMapping = {
59
+ applySchemaErrorToState,
60
+ toSchemaErrorTree,
61
+ toSchemaErrorWrites
62
+ };
63
+
64
+ export {
65
+ toSchemaErrorWrites,
66
+ toSchemaErrorTree,
67
+ applySchemaErrorToState,
68
+ SchemaErrorMapping,
69
+ SchemaErrorMapping_exports
70
+ };
71
+ //# sourceMappingURL=chunk-JZ5FZKPJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/SchemaErrorMapping.ts","../src/internal/schema/SchemaErrorMapping.ts"],"sourcesContent":["import {\n applySchemaErrorToState,\n toSchemaErrorTree,\n toSchemaErrorWrites,\n} from './internal/schema/SchemaErrorMapping.js'\n\nexport type { SchemaErrorMappingOptions, SchemaErrorWrite } from './internal/schema/SchemaErrorMapping.js'\n\nexport { applySchemaErrorToState, toSchemaErrorTree, toSchemaErrorWrites }\n\nexport const SchemaErrorMapping = {\n applySchemaErrorToState,\n toSchemaErrorTree,\n toSchemaErrorWrites,\n} as const\n","import type { FieldPath, SchemaError, SchemaPathMappingOptions } from './SchemaPathMapping.js'\nimport { mapSchemaErrorToFieldPaths } from './SchemaPathMapping.js'\nimport { setAtPath } from '../form/path.js'\nimport { toSchemaErrorsPath } from '../../Path.js'\n\nexport interface SchemaErrorMappingOptions extends SchemaPathMappingOptions {\n /**\n * toLeaf: converts a schemaError into a leaf value that can be written into the error tree.\n * - Default: write the raw schemaError as-is.\n */\n readonly toLeaf?: (schemaError: SchemaError) => unknown\n}\n\nexport type SchemaErrorWrite = {\n /**\n * fieldPath: the field path without the `errors.` prefix (domain-facing).\n */\n readonly fieldPath: FieldPath\n /**\n * errorPath: the actual path written into state (with the `errors.` prefix).\n */\n readonly errorPath: string\n readonly error: unknown\n}\n\nexport const toSchemaErrorWrites = (\n schemaError: SchemaError,\n options?: SchemaErrorMappingOptions,\n): ReadonlyArray<SchemaErrorWrite> => {\n const fieldPaths = mapSchemaErrorToFieldPaths(schemaError, options)\n if (fieldPaths.length === 0) return []\n\n const toLeaf = options?.toLeaf ?? ((e: SchemaError) => e)\n const leaf = toLeaf(schemaError)\n\n return fieldPaths.map((fieldPath) => ({\n fieldPath,\n errorPath: toSchemaErrorsPath(fieldPath),\n error: leaf,\n }))\n}\n\n/**\n * toSchemaErrorTree:\n * - Produces a subtree that can be written directly to `errors.$schema` (without the `errors.$schema` prefix).\n */\nexport const toSchemaErrorTree = (schemaError: SchemaError, options?: SchemaErrorMappingOptions): unknown => {\n const writes = toSchemaErrorWrites(schemaError, options)\n if (writes.length === 0) return {}\n\n let next: unknown = {}\n for (const w of writes) {\n const prefix = 'errors.$schema.'\n const relative = w.errorPath.startsWith(prefix) ? w.errorPath.slice(prefix.length) : w.errorPath\n if (!relative) continue\n next = setAtPath(next, relative, w.error)\n }\n return next\n}\n\n/**\n * applySchemaErrorToState:\n * - Maps a SchemaError and writes it back into state.errors.$schema.*.\n * - Does not clear stale errors that are no longer matched (the caller should clear them within a more explicit scope).\n */\nexport const applySchemaErrorToState = (\n state: unknown,\n schemaError: SchemaError,\n options?: SchemaErrorMappingOptions,\n): unknown => {\n const writes = toSchemaErrorWrites(schemaError, options)\n if (writes.length === 0) return state\n\n let next: unknown = state\n for (const w of writes) {\n next = setAtPath(next, w.errorPath, w.error)\n }\n return next\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACyBO,IAAM,sBAAsB,CACjC,aACA,YACoC;AACpC,QAAM,aAAa,2BAA2B,aAAa,OAAO;AAClE,MAAI,WAAW,WAAW,EAAG,QAAO,CAAC;AAErC,QAAM,SAAS,SAAS,WAAW,CAAC,MAAmB;AACvD,QAAM,OAAO,OAAO,WAAW;AAE/B,SAAO,WAAW,IAAI,CAAC,eAAe;AAAA,IACpC;AAAA,IACA,WAAW,mBAAmB,SAAS;AAAA,IACvC,OAAO;AAAA,EACT,EAAE;AACJ;AAMO,IAAM,oBAAoB,CAAC,aAA0B,YAAiD;AAC3G,QAAM,SAAS,oBAAoB,aAAa,OAAO;AACvD,MAAI,OAAO,WAAW,EAAG,QAAO,CAAC;AAEjC,MAAI,OAAgB,CAAC;AACrB,aAAW,KAAK,QAAQ;AACtB,UAAM,SAAS;AACf,UAAM,WAAW,EAAE,UAAU,WAAW,MAAM,IAAI,EAAE,UAAU,MAAM,OAAO,MAAM,IAAI,EAAE;AACvF,QAAI,CAAC,SAAU;AACf,WAAO,UAAU,MAAM,UAAU,EAAE,KAAK;AAAA,EAC1C;AACA,SAAO;AACT;AAOO,IAAM,0BAA0B,CACrC,OACA,aACA,YACY;AACZ,QAAM,SAAS,oBAAoB,aAAa,OAAO;AACvD,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,MAAI,OAAgB;AACpB,aAAW,KAAK,QAAQ;AACtB,WAAO,UAAU,MAAM,EAAE,WAAW,EAAE,KAAK;AAAA,EAC7C;AACA,SAAO;AACT;;;ADpEO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AACF;","names":[]}