@vielzeug/forge 2.3.1 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -16
- package/dist/_field.cjs +1 -1
- package/dist/_field.cjs.map +1 -1
- package/dist/_field.d.ts +13 -10
- package/dist/_field.d.ts.map +1 -1
- package/dist/_field.js +33 -33
- package/dist/_field.js.map +1 -1
- package/dist/_notify.cjs +1 -1
- package/dist/_notify.cjs.map +1 -1
- package/dist/_notify.d.ts +6 -5
- package/dist/_notify.d.ts.map +1 -1
- package/dist/_notify.js +22 -8
- package/dist/_notify.js.map +1 -1
- package/dist/core/path.cjs +1 -1
- package/dist/core/path.cjs.map +1 -1
- package/dist/core/path.d.ts +8 -11
- package/dist/core/path.d.ts.map +1 -1
- package/dist/core/path.js +122 -110
- package/dist/core/path.js.map +1 -1
- package/dist/dom.cjs +1 -1
- package/dist/dom.cjs.map +1 -1
- package/dist/dom.d.ts +5 -6
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +7 -7
- package/dist/dom.js.map +1 -1
- package/dist/errors.cjs +1 -1
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.d.ts +6 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +10 -2
- package/dist/errors.js.map +1 -1
- package/dist/forge.cjs +1 -1
- package/dist/forge.cjs.map +1 -1
- package/dist/forge.iife.js +1 -1
- package/dist/forge.iife.js.map +1 -1
- package/dist/forge.js +1 -1
- package/dist/forge.js.map +1 -1
- package/dist/form-data.cjs +1 -1
- package/dist/form-data.cjs.map +1 -1
- package/dist/form-data.d.ts +2 -2
- package/dist/form-data.d.ts.map +1 -1
- package/dist/form-data.js +23 -16
- package/dist/form-data.js.map +1 -1
- package/dist/form.cjs +1 -1
- package/dist/form.cjs.map +1 -1
- package/dist/form.d.ts +1 -1
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +122 -86
- package/dist/form.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/persist.cjs +2 -0
- package/dist/persist.cjs.map +1 -0
- package/dist/persist.d.ts +18 -0
- package/dist/persist.d.ts.map +1 -0
- package/dist/persist.js +19 -0
- package/dist/persist.js.map +1 -0
- package/dist/schema.cjs +2 -0
- package/dist/schema.cjs.map +1 -0
- package/dist/schema.d.ts +22 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +26 -0
- package/dist/schema.js.map +1 -0
- package/dist/types.d.ts +24 -20
- package/dist/types.d.ts.map +1 -1
- package/package.json +25 -33
- package/dist/spell.cjs +0 -2
- package/dist/spell.cjs.map +0 -1
- package/dist/spell.d.ts +0 -5
- package/dist/spell.d.ts.map +0 -1
- package/dist/spell.js +0 -48
- package/dist/spell.js.map +0 -1
- package/dist/vault.cjs +0 -2
- package/dist/vault.cjs.map +0 -1
- package/dist/vault.d.ts +0 -10
- package/dist/vault.d.ts.map +0 -1
- package/dist/vault.js +0 -14
- package/dist/vault.js.map +0 -1
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC;AAErC,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAEjD,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vielzeug/forge",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "Immutable typed form state with focused fields and explicit full-form validation",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -33,15 +33,15 @@
|
|
|
33
33
|
"require": "./dist/form-data.cjs",
|
|
34
34
|
"types": "./dist/form-data.d.ts"
|
|
35
35
|
},
|
|
36
|
-
"./
|
|
37
|
-
"import": "./dist/
|
|
38
|
-
"require": "./dist/
|
|
39
|
-
"types": "./dist/
|
|
36
|
+
"./persist": {
|
|
37
|
+
"import": "./dist/persist.js",
|
|
38
|
+
"require": "./dist/persist.cjs",
|
|
39
|
+
"types": "./dist/persist.d.ts"
|
|
40
40
|
},
|
|
41
|
-
"./
|
|
42
|
-
"import": "./dist/
|
|
43
|
-
"require": "./dist/
|
|
44
|
-
"types": "./dist/
|
|
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
|
-
"
|
|
56
|
-
"dist/
|
|
55
|
+
"persist": [
|
|
56
|
+
"dist/persist.d.ts"
|
|
57
57
|
],
|
|
58
|
-
"
|
|
59
|
-
"dist/
|
|
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
|
-
|
|
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.
|
|
93
|
-
"@vielzeug/spell": "
|
|
94
|
-
"@vielzeug/vault": "
|
|
84
|
+
"@types/node": "^26.4.1",
|
|
85
|
+
"@vielzeug/spell": "3.0.0",
|
|
86
|
+
"@vielzeug/vault": "3.0.0",
|
|
95
87
|
"typescript": "^6.0.3",
|
|
96
|
-
"vite": "^8.2.
|
|
97
|
-
"vitest": "^
|
|
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
|
package/dist/spell.cjs.map
DELETED
|
@@ -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
|
package/dist/spell.d.ts.map
DELETED
|
@@ -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
|
package/dist/vault.cjs.map
DELETED
|
@@ -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
|
package/dist/vault.d.ts.map
DELETED
|
@@ -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"}
|