@vielzeug/forge 2.3.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +17 -16
  2. package/dist/_field.cjs +1 -1
  3. package/dist/_field.cjs.map +1 -1
  4. package/dist/_field.d.ts +13 -10
  5. package/dist/_field.d.ts.map +1 -1
  6. package/dist/_field.js +33 -33
  7. package/dist/_field.js.map +1 -1
  8. package/dist/_notify.cjs +1 -1
  9. package/dist/_notify.cjs.map +1 -1
  10. package/dist/_notify.d.ts +6 -5
  11. package/dist/_notify.d.ts.map +1 -1
  12. package/dist/_notify.js +22 -8
  13. package/dist/_notify.js.map +1 -1
  14. package/dist/core/path.cjs +1 -1
  15. package/dist/core/path.cjs.map +1 -1
  16. package/dist/core/path.d.ts +23 -12
  17. package/dist/core/path.d.ts.map +1 -1
  18. package/dist/core/path.js +172 -114
  19. package/dist/core/path.js.map +1 -1
  20. package/dist/dom.cjs +1 -1
  21. package/dist/dom.cjs.map +1 -1
  22. package/dist/dom.d.ts +5 -6
  23. package/dist/dom.d.ts.map +1 -1
  24. package/dist/dom.js +7 -7
  25. package/dist/dom.js.map +1 -1
  26. package/dist/errors.cjs +1 -1
  27. package/dist/errors.cjs.map +1 -1
  28. package/dist/errors.d.ts +6 -1
  29. package/dist/errors.d.ts.map +1 -1
  30. package/dist/errors.js +10 -2
  31. package/dist/errors.js.map +1 -1
  32. package/dist/forge.cjs +1 -1
  33. package/dist/forge.cjs.map +1 -1
  34. package/dist/forge.iife.js +1 -1
  35. package/dist/forge.iife.js.map +1 -1
  36. package/dist/forge.js +1 -1
  37. package/dist/forge.js.map +1 -1
  38. package/dist/form-data.cjs +1 -1
  39. package/dist/form-data.cjs.map +1 -1
  40. package/dist/form-data.d.ts +2 -2
  41. package/dist/form-data.d.ts.map +1 -1
  42. package/dist/form-data.js +23 -16
  43. package/dist/form-data.js.map +1 -1
  44. package/dist/form.cjs +1 -1
  45. package/dist/form.cjs.map +1 -1
  46. package/dist/form.d.ts +1 -1
  47. package/dist/form.d.ts.map +1 -1
  48. package/dist/form.js +136 -86
  49. package/dist/form.js.map +1 -1
  50. package/dist/index.cjs +1 -1
  51. package/dist/index.d.ts +4 -3
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +2 -1
  54. package/dist/persist.cjs +2 -0
  55. package/dist/persist.cjs.map +1 -0
  56. package/dist/persist.d.ts +18 -0
  57. package/dist/persist.d.ts.map +1 -0
  58. package/dist/persist.js +19 -0
  59. package/dist/persist.js.map +1 -0
  60. package/dist/plain.cjs +2 -0
  61. package/dist/plain.cjs.map +1 -0
  62. package/dist/plain.d.ts +21 -0
  63. package/dist/plain.d.ts.map +1 -0
  64. package/dist/plain.js +9 -0
  65. package/dist/plain.js.map +1 -0
  66. package/dist/schema.cjs +2 -0
  67. package/dist/schema.cjs.map +1 -0
  68. package/dist/schema.d.ts +22 -0
  69. package/dist/schema.d.ts.map +1 -0
  70. package/dist/schema.js +26 -0
  71. package/dist/schema.js.map +1 -0
  72. package/dist/types.d.ts +28 -20
  73. package/dist/types.d.ts.map +1 -1
  74. package/package.json +26 -34
  75. package/dist/spell.cjs +0 -2
  76. package/dist/spell.cjs.map +0 -1
  77. package/dist/spell.d.ts +0 -5
  78. package/dist/spell.d.ts.map +0 -1
  79. package/dist/spell.js +0 -48
  80. package/dist/spell.js.map +0 -1
  81. package/dist/vault.cjs +0 -2
  82. package/dist/vault.cjs.map +0 -1
  83. package/dist/vault.d.ts +0 -10
  84. package/dist/vault.d.ts.map +0 -1
  85. package/dist/vault.js +0 -14
  86. package/dist/vault.js.map +0 -1
package/dist/types.d.ts CHANGED
@@ -1,18 +1,26 @@
1
1
  export type Unsubscribe = () => void;
2
2
  export type MaybePromise<T> = T | PromiseLike<T>;
3
- export type ReadonlyDeep<T> = T extends (...args: never[]) => unknown ? T : T extends readonly (infer Item)[] ? readonly ReadonlyDeep<Item>[] : T extends Record<string, unknown> ? {
3
+ /**
4
+ * `Date`, `File`, and `Blob` are built-in atomic leaves. Dates are cloned and exposed
5
+ * without mutator methods; browser binary values preserve identity. Other values must be
6
+ * finite JSON primitives, plain objects, or dense arrays.
7
+ */
8
+ export type Atomic = Date | File | Blob;
9
+ type DateMutator = Extract<keyof Date, `set${string}`>;
10
+ export type ReadonlyDate = Omit<Date, DateMutator>;
11
+ export type ReadonlyDeep<T> = T extends Date ? ReadonlyDate : T extends File | Blob ? T : T extends readonly (infer Item)[] ? readonly ReadonlyDeep<Item>[] : T extends Record<string, unknown> ? {
4
12
  readonly [K in keyof T]: ReadonlyDeep<T[K]>;
5
13
  } : T;
6
- export type FormErrors<T> = T extends readonly (infer Item)[] ? string | readonly (FormErrors<Item> | undefined)[] : T extends Record<string, unknown> ? string | {
7
- readonly [K in keyof T]?: FormErrors<T[K]>;
8
- } : string;
9
- export type ValidationErrors<TValues extends Record<string, unknown>> = Readonly<{
10
- fields?: FormErrors<TValues>;
11
- formError?: string;
14
+ /** A single flat validation issue. `path: []` denotes a form-level error. */
15
+ export type ValidationIssue = Readonly<{
16
+ path: readonly (string | number)[];
17
+ message: string;
12
18
  }>;
13
- export type FormValidator<TValues extends Record<string, unknown>> = (values: ReadonlyDeep<TValues>, signal: AbortSignal) => MaybePromise<ValidationErrors<TValues> | undefined>;
19
+ export type FormValidator<TValues extends Record<string, unknown>> = (values: ReadonlyDeep<TValues>, signal: AbortSignal) => MaybePromise<readonly ValidationIssue[] | undefined>;
14
20
  export type FormOptions<TValues extends Record<string, unknown>> = Readonly<{
15
21
  initialValues: TValues;
22
+ /** Applied before immutable() at every write boundary (init, set, patch, reset, field.set). */
23
+ normalize?: (value: unknown) => unknown;
16
24
  onSubscriberError?: (error: unknown) => void;
17
25
  validate?: FormValidator<NoInfer<TValues>>;
18
26
  }>;
@@ -25,31 +33,29 @@ export type FieldState<V> = Readonly<{
25
33
  touched: boolean;
26
34
  value: ReadonlyDeep<V>;
27
35
  }>;
28
- export type FormState<TValues extends Record<string, unknown>> = Readonly<{
29
- errors: FormErrors<TValues> | undefined;
36
+ export type FormState = Readonly<{
30
37
  formError: string | undefined;
31
38
  hasErrors: boolean;
39
+ issues: readonly ValidationIssue[] | undefined;
32
40
  submitCount: number;
33
41
  submitting: boolean;
34
42
  touched: boolean;
35
43
  validity: 'invalid' | 'unknown' | 'valid';
36
44
  validating: boolean;
37
45
  }>;
38
- export type ValidationResult<TValues extends Record<string, unknown>> = Readonly<{
46
+ export type ValidationResult = Readonly<{
39
47
  status: 'aborted';
40
48
  }> | Readonly<{
41
49
  status: 'valid';
42
50
  }> | Readonly<{
43
- errors: FormErrors<TValues> | undefined;
44
- formError: string | undefined;
51
+ issues: readonly ValidationIssue[];
45
52
  status: 'invalid';
46
53
  }>;
47
- export type SubmitResult<TResult = void, TValues extends Record<string, unknown> = Record<string, unknown>> = Readonly<{
54
+ export type SubmitResult<TResult = void> = Readonly<{
48
55
  status: 'aborted';
49
56
  }> | Readonly<{
57
+ issues: readonly ValidationIssue[];
50
58
  status: 'invalid';
51
- errors: FormErrors<TValues> | undefined;
52
- formError: string | undefined;
53
59
  }> | Readonly<{
54
60
  status: 'ok';
55
61
  value: TResult;
@@ -76,12 +82,14 @@ export type Form<TValues extends Record<string, unknown>> = {
76
82
  dispose(): void;
77
83
  readonly disposed: boolean;
78
84
  field<K extends keyof TValues & string>(key: K): Field<TValues[K]>;
85
+ patch(next: Partial<TValues>): void;
86
+ patch(updater: (previous: ReadonlyDeep<TValues>) => Partial<TValues>): void;
79
87
  reset(next?: TValues): void;
80
88
  set(next: TValues | ((previous: ReadonlyDeep<TValues>) => TValues)): void;
81
- readonly state: FormState<TValues>;
82
- submit<TResult = void>(handler: (values: ReadonlyDeep<TValues>, signal: AbortSignal) => MaybePromise<TResult>, signal?: AbortSignal): Promise<SubmitResult<TResult, TValues>>;
83
- subscribe(listener: (state: FormState<TValues>) => void, options?: SubscribeOptions): Unsubscribe;
84
- validate(signal?: AbortSignal): Promise<ValidationResult<TValues>>;
89
+ readonly state: FormState;
90
+ submit<TResult = void>(handler: (values: ReadonlyDeep<TValues>, signal: AbortSignal) => MaybePromise<TResult>, signal?: AbortSignal): Promise<SubmitResult<TResult>>;
91
+ subscribe(listener: (state: FormState) => void, options?: SubscribeOptions): Unsubscribe;
92
+ validate(signal?: AbortSignal): Promise<ValidationResult>;
85
93
  readonly value: ReadonlyDeep<TValues>;
86
94
  };
87
95
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vielzeug/forge",
3
- "version": "2.3.1",
4
- "description": "Immutable typed form state with focused fields and explicit full-form validation",
3
+ "version": "3.1.0",
4
+ "description": "Typed form state, validation, submission",
5
5
  "repository": {
6
6
  "type": "git",
7
7
  "url": "https://github.com/helmuthdu/vielzeug",
@@ -33,15 +33,15 @@
33
33
  "require": "./dist/form-data.cjs",
34
34
  "types": "./dist/form-data.d.ts"
35
35
  },
36
- "./spell": {
37
- "import": "./dist/spell.js",
38
- "require": "./dist/spell.cjs",
39
- "types": "./dist/spell.d.ts"
36
+ "./persist": {
37
+ "import": "./dist/persist.js",
38
+ "require": "./dist/persist.cjs",
39
+ "types": "./dist/persist.d.ts"
40
40
  },
41
- "./vault": {
42
- "import": "./dist/vault.js",
43
- "require": "./dist/vault.cjs",
44
- "types": "./dist/vault.d.ts"
41
+ "./schema": {
42
+ "import": "./dist/schema.js",
43
+ "require": "./dist/schema.cjs",
44
+ "types": "./dist/schema.d.ts"
45
45
  }
46
46
  },
47
47
  "typesVersions": {
@@ -52,11 +52,11 @@
52
52
  "form-data": [
53
53
  "dist/form-data.d.ts"
54
54
  ],
55
- "spell": [
56
- "dist/spell.d.ts"
55
+ "persist": [
56
+ "dist/persist.d.ts"
57
57
  ],
58
- "vault": [
59
- "dist/vault.d.ts"
58
+ "schema": [
59
+ "dist/schema.d.ts"
60
60
  ]
61
61
  }
62
62
  },
@@ -66,34 +66,26 @@
66
66
  "registry": "https://registry.npmjs.org/"
67
67
  },
68
68
  "scripts": {
69
- "build": "vite build && pnpm run build:bundle && pnpm run build:types",
69
+ "build": "vite build && pnpm --silent run build:bundle && pnpm --silent run build:types && pnpm --silent run test:types && pnpm --silent run verify:exports",
70
70
  "build:bundle": "vite build --config vite.bundle.config.ts",
71
71
  "build:types": "tsc -p tsconfig.declarations.json",
72
72
  "fix": "biome check --write src",
73
73
  "lint": "biome ci src",
74
- "prepublishOnly": "pnpm run build",
74
+ "prepublishOnly": "pnpm --silent run build",
75
75
  "preview": "vite preview",
76
- "test": "vitest"
76
+ "test": "vitest",
77
+ "test:types": "tsc -p tsconfig.type-tests.json",
78
+ "verify:exports": "node verify-exports.mjs"
77
79
  },
78
- "dependencies": {},
79
- "peerDependencies": {
80
- "@vielzeug/spell": "2.3.0",
81
- "@vielzeug/vault": "2.5.0"
82
- },
83
- "peerDependenciesMeta": {
84
- "@vielzeug/spell": {
85
- "optional": true
86
- },
87
- "@vielzeug/vault": {
88
- "optional": true
89
- }
80
+ "dependencies": {
81
+ "@vielzeug/arsenal": "3.0.0"
90
82
  },
91
83
  "devDependencies": {
92
- "@types/node": "^26.2.0",
93
- "@vielzeug/spell": "2.3.0",
94
- "@vielzeug/vault": "2.5.0",
84
+ "@types/node": "^26.4.1",
85
+ "@vielzeug/spell": "3.1.0",
86
+ "@vielzeug/vault": "3.0.1",
95
87
  "typescript": "^6.0.3",
96
- "vite": "^8.2.1",
97
- "vitest": "^4.1.10"
88
+ "vite": "^8.2.2",
89
+ "vitest": "^5.0.0"
98
90
  }
99
91
  }
package/dist/spell.cjs DELETED
@@ -1,2 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./core/path.cjs");function t(e){return e.code===`invalid_union`}function n(e,t){return t.aborted?Promise.resolve(void 0):new Promise((n,r)=>{let i=()=>n(void 0);t.addEventListener(`abort`,i,{once:!0}),e.then(e=>{t.removeEventListener(`abort`,i),n(e)},e=>{t.removeEventListener(`abort`,i),r(e)})})}function r(e,t){return t.map(t=>({...t,path:[...e,...t.path]}))}function i(i){return async(a,o)=>{let s=await n(i.safeParseAsync(a),o);if(!s||s.success)return;let c=s.error.issues.flatMap(e=>{if(!t(e))return[e];let n=s.error.bestMatch(e);return n?r(e.path,n):[e]}),l={},u;for(let t of c){if(t.path.length===0){u??=t.message;continue}l=e.writeError(l,t.path,t.message)}let d={fields:Object.keys(l).length===0?void 0:l,formError:u};return d.fields===void 0&&d.formError===void 0?void 0:d}}exports.customValidator=i;
2
- //# sourceMappingURL=spell.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spell.cjs","names":[],"sources":["../src/spell.ts"],"sourcesContent":["import type { AnySchema, Issue, SchemaMode } from '@vielzeug/spell';\nimport type { ErrorTree } from './core/path';\nimport { writeError } from './core/path';\nimport type { FormErrors, FormValidator, ValidationErrors } from './types';\n\ntype UnionIssue = Extract<Issue, { code: 'invalid_union' }>;\n\nfunction isUnionIssue(issue: Issue): issue is UnionIssue {\n return issue.code === 'invalid_union';\n}\n\nfunction abortable<T>(promise: Promise<T>, signal: AbortSignal): Promise<T | undefined> {\n if (signal.aborted) return Promise.resolve(undefined);\n\n return new Promise((resolve, reject) => {\n const abort = () => resolve(undefined);\n\n signal.addEventListener('abort', abort, { once: true });\n void promise.then(\n (value) => {\n signal.removeEventListener('abort', abort);\n resolve(value);\n },\n (error: unknown) => {\n signal.removeEventListener('abort', abort);\n reject(error);\n },\n );\n });\n}\n\nfunction prefixIssues(path: readonly (string | number)[], issues: readonly Issue[]): Issue[] {\n return issues.map((issue) => ({ ...issue, path: [...path, ...issue.path] }));\n}\n\n/** Adapts a Spell Schema into Forge's full-form validator without transforming form values. */\nexport function customValidator<TValues extends Record<string, unknown>>(\n schema: AnySchema<unknown, TValues, SchemaMode>,\n): FormValidator<TValues> {\n return async (values, signal) => {\n const result = await abortable(schema.safeParseAsync(values), signal);\n\n if (!result || result.success) return undefined;\n\n const issues = result.error.issues.flatMap((issue) => {\n if (!isUnionIssue(issue)) return [issue];\n\n const bestMatch = result.error.bestMatch(issue);\n\n return bestMatch ? prefixIssues(issue.path, bestMatch) : [issue];\n });\n let fields: ErrorTree = {};\n let formError: string | undefined;\n\n for (const issue of issues) {\n if (issue.path.length === 0) {\n formError ??= issue.message;\n continue;\n }\n\n fields = writeError(fields, issue.path, issue.message);\n }\n\n const errors: ValidationErrors<TValues> = {\n fields: Object.keys(fields).length === 0 ? undefined : (fields as FormErrors<TValues>),\n formError,\n };\n\n return errors.fields === undefined && errors.formError === undefined ? undefined : errors;\n };\n}\n"],"mappings":"sGAOA,SAAS,EAAa,EAAmC,CACvD,OAAO,EAAM,OAAS,eACxB,CAEA,SAAS,EAAa,EAAqB,EAA6C,CAGtF,OAFI,EAAO,QAAgB,QAAQ,QAAQ,IAAA,EAAS,EAE7C,IAAI,SAAS,EAAS,IAAW,CACtC,IAAM,MAAc,EAAQ,IAAA,EAAS,EAErC,EAAO,iBAAiB,QAAS,EAAO,CAAE,KAAM,EAAK,CAAC,EACtD,EAAa,KACV,GAAU,CACT,EAAO,oBAAoB,QAAS,CAAK,EACzC,EAAQ,CAAK,CACf,EACC,GAAmB,CAClB,EAAO,oBAAoB,QAAS,CAAK,EACzC,EAAO,CAAK,CACd,CACF,CACF,CAAC,CACH,CAEA,SAAS,EAAa,EAAoC,EAAmC,CAC3F,OAAO,EAAO,IAAK,IAAW,CAAE,GAAG,EAAO,KAAM,CAAC,GAAG,EAAM,GAAG,EAAM,IAAI,CAAE,EAAE,CAC7E,CAGA,SAAgB,EACd,EACwB,CACxB,OAAO,MAAO,EAAQ,IAAW,CAC/B,IAAM,EAAS,MAAM,EAAU,EAAO,eAAe,CAAM,EAAG,CAAM,EAEpE,GAAI,CAAC,GAAU,EAAO,QAAS,OAE/B,IAAM,EAAS,EAAO,MAAM,OAAO,QAAS,GAAU,CACpD,GAAI,CAAC,EAAa,CAAK,EAAG,MAAO,CAAC,CAAK,EAEvC,IAAM,EAAY,EAAO,MAAM,UAAU,CAAK,EAE9C,OAAO,EAAY,EAAa,EAAM,KAAM,CAAS,EAAI,CAAC,CAAK,CACjE,CAAC,EACG,EAAoB,CAAC,EACrB,EAEJ,IAAK,IAAM,KAAS,EAAQ,CAC1B,GAAI,EAAM,KAAK,SAAW,EAAG,CAC3B,IAAc,EAAM,QACpB,QACF,CAEA,EAAS,EAAA,WAAW,EAAQ,EAAM,KAAM,EAAM,OAAO,CACvD,CAEA,IAAM,EAAoC,CACxC,OAAQ,OAAO,KAAK,CAAM,CAAC,CAAC,SAAW,EAAI,IAAA,GAAa,EACxD,WACF,EAEA,OAAO,EAAO,SAAW,IAAA,IAAa,EAAO,YAAc,IAAA,GAAY,IAAA,GAAY,CACrF,CACF"}
package/dist/spell.d.ts DELETED
@@ -1,5 +0,0 @@
1
- import type { AnySchema, SchemaMode } from '@vielzeug/spell';
2
- import type { FormValidator } from './types';
3
- /** Adapts a Spell Schema into Forge's full-form validator without transforming form values. */
4
- export declare function customValidator<TValues extends Record<string, unknown>>(schema: AnySchema<unknown, TValues, SchemaMode>): FormValidator<TValues>;
5
- //# sourceMappingURL=spell.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spell.d.ts","sourceRoot":"","sources":["../src/spell.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAS,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGpE,OAAO,KAAK,EAAc,aAAa,EAAoB,MAAM,SAAS,CAAC;AAgC3E,+FAA+F;AAC/F,wBAAgB,eAAe,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACrE,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,GAC9C,aAAa,CAAC,OAAO,CAAC,CAgCxB"}
package/dist/spell.js DELETED
@@ -1,48 +0,0 @@
1
- import { writeError as e } from "./core/path.js";
2
- //#region src/spell.ts
3
- function t(e) {
4
- return e.code === "invalid_union";
5
- }
6
- function n(e, t) {
7
- return t.aborted ? Promise.resolve(void 0) : new Promise((n, r) => {
8
- let i = () => n(void 0);
9
- t.addEventListener("abort", i, { once: !0 }), e.then((e) => {
10
- t.removeEventListener("abort", i), n(e);
11
- }, (e) => {
12
- t.removeEventListener("abort", i), r(e);
13
- });
14
- });
15
- }
16
- function r(e, t) {
17
- return t.map((t) => ({
18
- ...t,
19
- path: [...e, ...t.path]
20
- }));
21
- }
22
- function i(i) {
23
- return async (a, o) => {
24
- let s = await n(i.safeParseAsync(a), o);
25
- if (!s || s.success) return;
26
- let c = s.error.issues.flatMap((e) => {
27
- if (!t(e)) return [e];
28
- let n = s.error.bestMatch(e);
29
- return n ? r(e.path, n) : [e];
30
- }), l = {}, u;
31
- for (let t of c) {
32
- if (t.path.length === 0) {
33
- u ??= t.message;
34
- continue;
35
- }
36
- l = e(l, t.path, t.message);
37
- }
38
- let d = {
39
- fields: Object.keys(l).length === 0 ? void 0 : l,
40
- formError: u
41
- };
42
- return d.fields === void 0 && d.formError === void 0 ? void 0 : d;
43
- };
44
- }
45
- //#endregion
46
- export { i as customValidator };
47
-
48
- //# sourceMappingURL=spell.js.map
package/dist/spell.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"spell.js","names":[],"sources":["../src/spell.ts"],"sourcesContent":["import type { AnySchema, Issue, SchemaMode } from '@vielzeug/spell';\nimport type { ErrorTree } from './core/path';\nimport { writeError } from './core/path';\nimport type { FormErrors, FormValidator, ValidationErrors } from './types';\n\ntype UnionIssue = Extract<Issue, { code: 'invalid_union' }>;\n\nfunction isUnionIssue(issue: Issue): issue is UnionIssue {\n return issue.code === 'invalid_union';\n}\n\nfunction abortable<T>(promise: Promise<T>, signal: AbortSignal): Promise<T | undefined> {\n if (signal.aborted) return Promise.resolve(undefined);\n\n return new Promise((resolve, reject) => {\n const abort = () => resolve(undefined);\n\n signal.addEventListener('abort', abort, { once: true });\n void promise.then(\n (value) => {\n signal.removeEventListener('abort', abort);\n resolve(value);\n },\n (error: unknown) => {\n signal.removeEventListener('abort', abort);\n reject(error);\n },\n );\n });\n}\n\nfunction prefixIssues(path: readonly (string | number)[], issues: readonly Issue[]): Issue[] {\n return issues.map((issue) => ({ ...issue, path: [...path, ...issue.path] }));\n}\n\n/** Adapts a Spell Schema into Forge's full-form validator without transforming form values. */\nexport function customValidator<TValues extends Record<string, unknown>>(\n schema: AnySchema<unknown, TValues, SchemaMode>,\n): FormValidator<TValues> {\n return async (values, signal) => {\n const result = await abortable(schema.safeParseAsync(values), signal);\n\n if (!result || result.success) return undefined;\n\n const issues = result.error.issues.flatMap((issue) => {\n if (!isUnionIssue(issue)) return [issue];\n\n const bestMatch = result.error.bestMatch(issue);\n\n return bestMatch ? prefixIssues(issue.path, bestMatch) : [issue];\n });\n let fields: ErrorTree = {};\n let formError: string | undefined;\n\n for (const issue of issues) {\n if (issue.path.length === 0) {\n formError ??= issue.message;\n continue;\n }\n\n fields = writeError(fields, issue.path, issue.message);\n }\n\n const errors: ValidationErrors<TValues> = {\n fields: Object.keys(fields).length === 0 ? undefined : (fields as FormErrors<TValues>),\n formError,\n };\n\n return errors.fields === undefined && errors.formError === undefined ? undefined : errors;\n };\n}\n"],"mappings":";;AAOA,SAAS,EAAa,GAAmC;CACvD,OAAO,EAAM,SAAS;AACxB;AAEA,SAAS,EAAa,GAAqB,GAA6C;CAGtF,OAFI,EAAO,UAAgB,QAAQ,QAAQ,KAAA,CAAS,IAE7C,IAAI,SAAS,GAAS,MAAW;EACtC,IAAM,UAAc,EAAQ,KAAA,CAAS;EAGrC,AADA,EAAO,iBAAiB,SAAS,GAAO,EAAE,MAAM,GAAK,CAAC,GACtD,EAAa,MACV,MAAU;GAET,AADA,EAAO,oBAAoB,SAAS,CAAK,GACzC,EAAQ,CAAK;EACf,IACC,MAAmB;GAElB,AADA,EAAO,oBAAoB,SAAS,CAAK,GACzC,EAAO,CAAK;EACd,CACF;CACF,CAAC;AACH;AAEA,SAAS,EAAa,GAAoC,GAAmC;CAC3F,OAAO,EAAO,KAAK,OAAW;EAAE,GAAG;EAAO,MAAM,CAAC,GAAG,GAAM,GAAG,EAAM,IAAI;CAAE,EAAE;AAC7E;AAGA,SAAgB,EACd,GACwB;CACxB,OAAO,OAAO,GAAQ,MAAW;EAC/B,IAAM,IAAS,MAAM,EAAU,EAAO,eAAe,CAAM,GAAG,CAAM;EAEpE,IAAI,CAAC,KAAU,EAAO,SAAS;EAE/B,IAAM,IAAS,EAAO,MAAM,OAAO,SAAS,MAAU;GACpD,IAAI,CAAC,EAAa,CAAK,GAAG,OAAO,CAAC,CAAK;GAEvC,IAAM,IAAY,EAAO,MAAM,UAAU,CAAK;GAE9C,OAAO,IAAY,EAAa,EAAM,MAAM,CAAS,IAAI,CAAC,CAAK;EACjE,CAAC,GACG,IAAoB,CAAC,GACrB;EAEJ,KAAK,IAAM,KAAS,GAAQ;GAC1B,IAAI,EAAM,KAAK,WAAW,GAAG;IAC3B,MAAc,EAAM;IACpB;GACF;GAEA,IAAS,EAAW,GAAQ,EAAM,MAAM,EAAM,OAAO;EACvD;EAEA,IAAM,IAAoC;GACxC,QAAQ,OAAO,KAAK,CAAM,CAAC,CAAC,WAAW,IAAI,KAAA,IAAa;GACxD;EACF;EAEA,OAAO,EAAO,WAAW,KAAA,KAAa,EAAO,cAAc,KAAA,IAAY,KAAA,IAAY;CACrF;AACF"}
package/dist/vault.cjs DELETED
@@ -1,2 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});async function e(e,t,n,r,i){let a=await t.get(n,r);if(!a)return!1;let o=i.fromRecord(a);return o?(e.reset(o),!0):!1}async function t(e,t,n,r){await t.put(n,r.toRecord(e.value))}exports.loadForm=e,exports.saveForm=t;
2
- //# sourceMappingURL=vault.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vault.cjs","names":[],"sources":["../src/vault.ts"],"sourcesContent":["import type { AnySchema, KeyOf, RecordOf, VaultStore } from '@vielzeug/vault';\n\nimport type { Form, ReadonlyDeep } from './types';\n\nexport type FormDraftCodec<\n TValues extends Record<string, unknown>,\n S extends AnySchema,\n K extends keyof S & string,\n> = Readonly<{\n fromRecord(record: RecordOf<S, K>): TValues | undefined;\n toRecord(values: ReadonlyDeep<TValues>): RecordOf<S, K>;\n}>;\n\n/** Explicit save/load avoids hidden autosave, migration, and persistence-policy side effects. */\nexport async function loadForm<\n TValues extends Record<string, unknown>,\n S extends AnySchema,\n K extends keyof S & string,\n>(\n form: Form<TValues>,\n adapter: VaultStore<S>,\n table: K,\n key: KeyOf<S, K>,\n codec: FormDraftCodec<TValues, S, K>,\n): Promise<boolean> {\n const record = await adapter.get(table, key);\n\n if (!record) return false;\n\n const values = codec.fromRecord(record);\n\n if (!values) return false;\n\n form.reset(values);\n\n return true;\n}\n\nexport async function saveForm<\n TValues extends Record<string, unknown>,\n S extends AnySchema,\n K extends keyof S & string,\n>(form: Form<TValues>, adapter: VaultStore<S>, table: K, codec: FormDraftCodec<TValues, S, K>): Promise<void> {\n await adapter.put(table, codec.toRecord(form.value));\n}\n"],"mappings":"mEAcA,eAAsB,EAKpB,EACA,EACA,EACA,EACA,EACkB,CAClB,IAAM,EAAS,MAAM,EAAQ,IAAI,EAAO,CAAG,EAE3C,GAAI,CAAC,EAAQ,MAAO,GAEpB,IAAM,EAAS,EAAM,WAAW,CAAM,EAMtC,OAJK,GAEL,EAAK,MAAM,CAAM,EAEV,IAJa,EAKtB,CAEA,eAAsB,EAIpB,EAAqB,EAAwB,EAAU,EAAqD,CAC5G,MAAM,EAAQ,IAAI,EAAO,EAAM,SAAS,EAAK,KAAK,CAAC,CACrD"}
package/dist/vault.d.ts DELETED
@@ -1,10 +0,0 @@
1
- import type { AnySchema, KeyOf, RecordOf, VaultStore } from '@vielzeug/vault';
2
- import type { Form, ReadonlyDeep } from './types';
3
- export type FormDraftCodec<TValues extends Record<string, unknown>, S extends AnySchema, K extends keyof S & string> = Readonly<{
4
- fromRecord(record: RecordOf<S, K>): TValues | undefined;
5
- toRecord(values: ReadonlyDeep<TValues>): RecordOf<S, K>;
6
- }>;
7
- /** Explicit save/load avoids hidden autosave, migration, and persistence-policy side effects. */
8
- export declare function loadForm<TValues extends Record<string, unknown>, S extends AnySchema, K extends keyof S & string>(form: Form<TValues>, adapter: VaultStore<S>, table: K, key: KeyOf<S, K>, codec: FormDraftCodec<TValues, S, K>): Promise<boolean>;
9
- export declare function saveForm<TValues extends Record<string, unknown>, S extends AnySchema, K extends keyof S & string>(form: Form<TValues>, adapter: VaultStore<S>, table: K, codec: FormDraftCodec<TValues, S, K>): Promise<void>;
10
- //# sourceMappingURL=vault.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../src/vault.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE9E,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAElD,MAAM,MAAM,cAAc,CACxB,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,CAAC,SAAS,SAAS,EACnB,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,IACxB,QAAQ,CAAC;IACX,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,GAAG,SAAS,CAAC;IACxD,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;CACzD,CAAC,CAAC;AAEH,iGAAiG;AACjG,wBAAsB,QAAQ,CAC5B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,CAAC,SAAS,SAAS,EACnB,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAE1B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EACnB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EACtB,KAAK,EAAE,CAAC,EACR,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAChB,KAAK,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GACnC,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED,wBAAsB,QAAQ,CAC5B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,CAAC,SAAS,SAAS,EACnB,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,EAC1B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5G"}
package/dist/vault.js DELETED
@@ -1,14 +0,0 @@
1
- //#region src/vault.ts
2
- async function e(e, t, n, r, i) {
3
- let a = await t.get(n, r);
4
- if (!a) return !1;
5
- let o = i.fromRecord(a);
6
- return o ? (e.reset(o), !0) : !1;
7
- }
8
- async function t(e, t, n, r) {
9
- await t.put(n, r.toRecord(e.value));
10
- }
11
- //#endregion
12
- export { e as loadForm, t as saveForm };
13
-
14
- //# sourceMappingURL=vault.js.map
package/dist/vault.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"vault.js","names":[],"sources":["../src/vault.ts"],"sourcesContent":["import type { AnySchema, KeyOf, RecordOf, VaultStore } from '@vielzeug/vault';\n\nimport type { Form, ReadonlyDeep } from './types';\n\nexport type FormDraftCodec<\n TValues extends Record<string, unknown>,\n S extends AnySchema,\n K extends keyof S & string,\n> = Readonly<{\n fromRecord(record: RecordOf<S, K>): TValues | undefined;\n toRecord(values: ReadonlyDeep<TValues>): RecordOf<S, K>;\n}>;\n\n/** Explicit save/load avoids hidden autosave, migration, and persistence-policy side effects. */\nexport async function loadForm<\n TValues extends Record<string, unknown>,\n S extends AnySchema,\n K extends keyof S & string,\n>(\n form: Form<TValues>,\n adapter: VaultStore<S>,\n table: K,\n key: KeyOf<S, K>,\n codec: FormDraftCodec<TValues, S, K>,\n): Promise<boolean> {\n const record = await adapter.get(table, key);\n\n if (!record) return false;\n\n const values = codec.fromRecord(record);\n\n if (!values) return false;\n\n form.reset(values);\n\n return true;\n}\n\nexport async function saveForm<\n TValues extends Record<string, unknown>,\n S extends AnySchema,\n K extends keyof S & string,\n>(form: Form<TValues>, adapter: VaultStore<S>, table: K, codec: FormDraftCodec<TValues, S, K>): Promise<void> {\n await adapter.put(table, codec.toRecord(form.value));\n}\n"],"mappings":";AAcA,eAAsB,EAKpB,GACA,GACA,GACA,GACA,GACkB;CAClB,IAAM,IAAS,MAAM,EAAQ,IAAI,GAAO,CAAG;CAE3C,IAAI,CAAC,GAAQ,OAAO;CAEpB,IAAM,IAAS,EAAM,WAAW,CAAM;CAMtC,OAJK,KAEL,EAAK,MAAM,CAAM,GAEV,MAJa;AAKtB;AAEA,eAAsB,EAIpB,GAAqB,GAAwB,GAAU,GAAqD;CAC5G,MAAM,EAAQ,IAAI,GAAO,EAAM,SAAS,EAAK,KAAK,CAAC;AACrD"}