@vielzeug/forge 2.1.0 → 2.2.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 +2 -1
- package/dist/_field.cjs +2 -0
- package/dist/_field.cjs.map +1 -0
- package/dist/_field.d.ts +18 -0
- package/dist/_field.d.ts.map +1 -0
- package/dist/_field.js +64 -0
- package/dist/_field.js.map +1 -0
- package/dist/_notify.cjs +2 -0
- package/dist/_notify.cjs.map +1 -0
- package/dist/_notify.d.ts +8 -0
- package/dist/_notify.d.ts.map +1 -0
- package/dist/_notify.js +39 -0
- package/dist/_notify.js.map +1 -0
- package/dist/core/path.cjs +1 -1
- package/dist/core/path.cjs.map +1 -1
- package/dist/core/path.d.ts +14 -9
- package/dist/core/path.d.ts.map +1 -1
- package/dist/core/path.js +84 -50
- package/dist/core/path.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 +2 -0
- package/dist/form-data.cjs.map +1 -0
- package/dist/form-data.d.ts.map +1 -0
- package/dist/form-data.js +32 -0
- package/dist/form-data.js.map +1 -0
- package/dist/form.cjs +1 -1
- package/dist/form.cjs.map +1 -1
- package/dist/form.d.ts.map +1 -1
- package/dist/form.js +107 -152
- package/dist/form.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -3
- package/dist/spell.cjs +1 -1
- package/dist/spell.cjs.map +1 -1
- package/dist/spell.d.ts.map +1 -1
- package/dist/spell.js +17 -25
- package/dist/spell.js.map +1 -1
- package/dist/types.d.ts +14 -12
- package/dist/types.d.ts.map +1 -1
- package/package.json +19 -8
- package/dist/adapters/form-data.cjs +0 -2
- package/dist/adapters/form-data.cjs.map +0 -1
- package/dist/adapters/form-data.d.ts.map +0 -1
- package/dist/adapters/form-data.js +0 -14
- package/dist/adapters/form-data.js.map +0 -1
- /package/dist/{adapters/form-data.d.ts → form-data.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -20,11 +20,12 @@ email.set('ada@example.com');
|
|
|
20
20
|
const result = await form.submit((value) => saveProfile(value));
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
`Form` owns one immutable value tree of primitives, plain objects, arrays, `File`, and `Blob`. Object fields select child branches
|
|
23
|
+
`Form` owns one immutable value tree of primitives, plain objects, arrays, `Date`, `File`, and `Blob`. Object fields select child branches and array items support per-index field handles. One validator evaluates the whole form and returns `{ fields, formError }`.
|
|
24
24
|
|
|
25
25
|
## Optional adapters
|
|
26
26
|
|
|
27
27
|
- `@vielzeug/forge/dom` — explicit element binding; application owns validation timing.
|
|
28
|
+
- `@vielzeug/forge/form-data` — `toFormData()` serializes nested values into `FormData`.
|
|
28
29
|
- `@vielzeug/forge/spell` — typed `customValidator(schema)` adapter with per-union diagnostics.
|
|
29
30
|
- `@vielzeug/forge/vault` — explicit `saveForm()` and `loadForm()` draft helpers.
|
|
30
31
|
|
package/dist/_field.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const e=require("./errors.cjs"),t=require("./core/path.cjs");function n(e,n){let r=t.readAtPath(e.value,n),i=t.readAtPath(e.baseline,n);return Object.freeze({dirty:r!==i||t.hasAtPath(e.value,n)!==t.hasAtPath(e.baseline,n),error:t.readError(e.errors,n),touched:t.readMeta(e.touched,n),value:r})}function r(i,a){return Object.assign({get dirty(){return n(a.readState(),i).dirty},get error(){return n(a.readState(),i).error},reset(){a.ensureActive(`field().reset`),a.abortValidation(),a.resetValue(i)},set(e){a.ensureActive(`field().set`),a.abortValidation();let n=t.readAtPath(a.readState().value,i),r=typeof e==`function`?e(n):e;a.setValue(i,r)},get state(){return n(a.readState(),i)},subscribe(e,t={}){a.ensureActive(`field().subscribe`);let r=n(a.readState(),i);return t.immediate&&e(r),a.addListener(()=>{let t=n(a.readState(),i);(t.value!==r.value||t.error!==r.error||t.touched!==r.touched||t.dirty!==r.dirty)&&(r=t,e(t))})},touch(){a.ensureActive(`field().touch`),a.setTouched(i,!0)},get touched(){return n(a.readState(),i).touched},get value(){return n(a.readState(),i).value}},{field(n){if(typeof n==`number`){let o=t.readAtPath(a.readState().value,i);if(o!==void 0&&!Array.isArray(o))throw new e.ForgeConfigError(`Cannot index ${n} because the current field value is not an array.`);return r([...i,n],a)}t.assertSafeKey(n);let o=t.readAtPath(a.readState().value,i);if(o!==void 0&&!t.isRecord(o))throw new e.ForgeConfigError(`Cannot select '${n}' because the current field value is not an object.`);return r([...i,n],a)}})}exports.createField=r;
|
|
2
|
+
//# sourceMappingURL=_field.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_field.cjs","names":[],"sources":["../src/_field.ts"],"sourcesContent":["import { assertSafeKey, hasAtPath, isRecord, type MetaRoot, readAtPath, readError, readMeta } from './core/path';\nimport { ForgeConfigError } from './errors';\nimport type { Field, FieldState, ReadonlyDeep, SubscribeOptions, Unsubscribe } from './types';\n\nexport interface FieldAccess {\n abortValidation(): void;\n addListener(listener: () => void): Unsubscribe;\n ensureActive(operation: string): void;\n readState(): { baseline: unknown; errors: unknown; touched: MetaRoot; value: unknown };\n resetValue(path: readonly (string | number)[]): void;\n setTouched(path: readonly (string | number)[], touched: boolean): void;\n setValue(path: readonly (string | number)[], next: unknown): void;\n}\n\nfunction makeFieldState<V>(\n state: { baseline: unknown; errors: unknown; touched: MetaRoot; value: unknown },\n path: readonly (string | number)[],\n): FieldState<V> {\n const value = readAtPath<V>(state.value, path);\n const baseline = readAtPath<V>(state.baseline, path);\n\n return Object.freeze({\n dirty: value !== baseline || hasAtPath(state.value, path) !== hasAtPath(state.baseline, path),\n error: readError(state.errors, path),\n touched: readMeta(state.touched, path),\n value: value as ReadonlyDeep<V>,\n });\n}\n\nexport function createField<V>(path: readonly (string | number)[], access: FieldAccess): Field<V> {\n const common = {\n get dirty() {\n return makeFieldState<V>(access.readState(), path).dirty;\n },\n get error() {\n return makeFieldState<V>(access.readState(), path).error;\n },\n reset() {\n access.ensureActive('field().reset');\n access.abortValidation();\n access.resetValue(path);\n },\n set(next: V | ((previous: ReadonlyDeep<V>) => V)) {\n access.ensureActive('field().set');\n access.abortValidation();\n\n const previous = readAtPath<V>(access.readState().value, path) as ReadonlyDeep<V>;\n const value = typeof next === 'function' ? (next as (current: ReadonlyDeep<V>) => V)(previous) : next;\n\n access.setValue(path, value);\n },\n get state() {\n return makeFieldState<V>(access.readState(), path);\n },\n subscribe(listener: (state: FieldState<V>) => void, subscribeOptions: SubscribeOptions = {}): Unsubscribe {\n access.ensureActive('field().subscribe');\n\n let previous = makeFieldState<V>(access.readState(), path);\n\n if (subscribeOptions.immediate) listener(previous);\n\n const filtered = () => {\n const next = makeFieldState<V>(access.readState(), path);\n\n if (\n next.value === previous.value &&\n next.error === previous.error &&\n next.touched === previous.touched &&\n next.dirty === previous.dirty\n ) {\n return;\n }\n\n previous = next;\n listener(next);\n };\n\n return access.addListener(filtered);\n },\n touch() {\n access.ensureActive('field().touch');\n access.setTouched(path, true);\n },\n get touched() {\n return makeFieldState<V>(access.readState(), path).touched;\n },\n get value() {\n return makeFieldState<V>(access.readState(), path).value;\n },\n };\n\n return Object.assign(common, {\n field(key: string | number): Field<unknown> {\n if (typeof key === 'number') {\n const currentVal = readAtPath(access.readState().value, path);\n\n if (currentVal !== undefined && !Array.isArray(currentVal)) {\n throw new ForgeConfigError(`Cannot index ${key} because the current field value is not an array.`);\n }\n\n return createField([...path, key], access);\n }\n\n assertSafeKey(key);\n\n const currentVal = readAtPath(access.readState().value, path);\n\n if (currentVal !== undefined && !isRecord(currentVal)) {\n throw new ForgeConfigError(`Cannot select '${key}' because the current field value is not an object.`);\n }\n\n return createField([...path, key], access);\n },\n }) as unknown as Field<V>;\n}\n"],"mappings":"6DAcA,SAAS,EACP,EACA,EACe,CACf,IAAM,EAAQ,EAAA,WAAc,EAAM,MAAO,CAAI,EACvC,EAAW,EAAA,WAAc,EAAM,SAAU,CAAI,EAEnD,OAAO,OAAO,OAAO,CACnB,MAAO,IAAU,GAAY,EAAA,UAAU,EAAM,MAAO,CAAI,IAAM,EAAA,UAAU,EAAM,SAAU,CAAI,EAC5F,MAAO,EAAA,UAAU,EAAM,OAAQ,CAAI,EACnC,QAAS,EAAA,SAAS,EAAM,QAAS,CAAI,EAC9B,OACT,CAAC,CACH,CAEA,SAAgB,EAAe,EAAoC,EAA+B,CA8DhG,OAAO,OAAO,OAAO,CA5DnB,IAAI,OAAQ,CACV,OAAO,EAAkB,EAAO,UAAU,EAAG,CAAI,CAAC,CAAC,KACrD,EACA,IAAI,OAAQ,CACV,OAAO,EAAkB,EAAO,UAAU,EAAG,CAAI,CAAC,CAAC,KACrD,EACA,OAAQ,CACN,EAAO,aAAa,eAAe,EACnC,EAAO,gBAAgB,EACvB,EAAO,WAAW,CAAI,CACxB,EACA,IAAI,EAA8C,CAChD,EAAO,aAAa,aAAa,EACjC,EAAO,gBAAgB,EAEvB,IAAM,EAAW,EAAA,WAAc,EAAO,UAAU,CAAC,CAAC,MAAO,CAAI,EACvD,EAAQ,OAAO,GAAS,WAAc,EAAyC,CAAQ,EAAI,EAEjG,EAAO,SAAS,EAAM,CAAK,CAC7B,EACA,IAAI,OAAQ,CACV,OAAO,EAAkB,EAAO,UAAU,EAAG,CAAI,CACnD,EACA,UAAU,EAA0C,EAAqC,CAAC,EAAgB,CACxG,EAAO,aAAa,mBAAmB,EAEvC,IAAI,EAAW,EAAkB,EAAO,UAAU,EAAG,CAAI,EAoBzD,OAlBI,EAAiB,WAAW,EAAS,CAAQ,EAkB1C,EAAO,gBAhBS,CACrB,IAAM,EAAO,EAAkB,EAAO,UAAU,EAAG,CAAI,GAGrD,EAAK,QAAU,EAAS,OACxB,EAAK,QAAU,EAAS,OACxB,EAAK,UAAY,EAAS,SAC1B,EAAK,QAAU,EAAS,SAK1B,EAAW,EACX,EAAS,CAAI,EACf,CAEkC,CACpC,EACA,OAAQ,CACN,EAAO,aAAa,eAAe,EACnC,EAAO,WAAW,EAAM,EAAI,CAC9B,EACA,IAAI,SAAU,CACZ,OAAO,EAAkB,EAAO,UAAU,EAAG,CAAI,CAAC,CAAC,OACrD,EACA,IAAI,OAAQ,CACV,OAAO,EAAkB,EAAO,UAAU,EAAG,CAAI,CAAC,CAAC,KACrD,CAGmB,EAAQ,CAC3B,MAAM,EAAsC,CAC1C,GAAI,OAAO,GAAQ,SAAU,CAC3B,IAAM,EAAa,EAAA,WAAW,EAAO,UAAU,CAAC,CAAC,MAAO,CAAI,EAE5D,GAAI,IAAe,IAAA,IAAa,CAAC,MAAM,QAAQ,CAAU,EACvD,MAAM,IAAI,EAAA,iBAAiB,gBAAgB,EAAI,kDAAkD,EAGnG,OAAO,EAAY,CAAC,GAAG,EAAM,CAAG,EAAG,CAAM,CAC3C,CAEA,EAAA,cAAc,CAAG,EAEjB,IAAM,EAAa,EAAA,WAAW,EAAO,UAAU,CAAC,CAAC,MAAO,CAAI,EAE5D,GAAI,IAAe,IAAA,IAAa,CAAC,EAAA,SAAS,CAAU,EAClD,MAAM,IAAI,EAAA,iBAAiB,kBAAkB,EAAI,oDAAoD,EAGvG,OAAO,EAAY,CAAC,GAAG,EAAM,CAAG,EAAG,CAAM,CAC3C,CACF,CAAC,CACH"}
|
package/dist/_field.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type MetaRoot } from './core/path';
|
|
2
|
+
import type { Field, Unsubscribe } from './types';
|
|
3
|
+
export interface FieldAccess {
|
|
4
|
+
abortValidation(): void;
|
|
5
|
+
addListener(listener: () => void): Unsubscribe;
|
|
6
|
+
ensureActive(operation: string): void;
|
|
7
|
+
readState(): {
|
|
8
|
+
baseline: unknown;
|
|
9
|
+
errors: unknown;
|
|
10
|
+
touched: MetaRoot;
|
|
11
|
+
value: unknown;
|
|
12
|
+
};
|
|
13
|
+
resetValue(path: readonly (string | number)[]): void;
|
|
14
|
+
setTouched(path: readonly (string | number)[], touched: boolean): void;
|
|
15
|
+
setValue(path: readonly (string | number)[], next: unknown): void;
|
|
16
|
+
}
|
|
17
|
+
export declare function createField<V>(path: readonly (string | number)[], access: FieldAccess): Field<V>;
|
|
18
|
+
//# sourceMappingURL=_field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_field.d.ts","sourceRoot":"","sources":["../src/_field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsC,KAAK,QAAQ,EAAmC,MAAM,aAAa,CAAC;AAEjH,OAAO,KAAK,EAAE,KAAK,EAA8C,WAAW,EAAE,MAAM,SAAS,CAAC;AAE9F,MAAM,WAAW,WAAW;IAC1B,eAAe,IAAI,IAAI,CAAC;IACxB,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;IAC/C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,SAAS,IAAI;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,QAAQ,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IACvF,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC;IACrD,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACvE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAAC;CACnE;AAiBD,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAqFhG"}
|
package/dist/_field.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ForgeConfigError as e } from "./errors.js";
|
|
2
|
+
import { assertSafeKey as t, hasAtPath as n, isRecord as r, readAtPath as i, readError as a, readMeta as o } from "./core/path.js";
|
|
3
|
+
//#region src/_field.ts
|
|
4
|
+
function s(e, t) {
|
|
5
|
+
let r = i(e.value, t), s = i(e.baseline, t);
|
|
6
|
+
return Object.freeze({
|
|
7
|
+
dirty: r !== s || n(e.value, t) !== n(e.baseline, t),
|
|
8
|
+
error: a(e.errors, t),
|
|
9
|
+
touched: o(e.touched, t),
|
|
10
|
+
value: r
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function c(n, a) {
|
|
14
|
+
return Object.assign({
|
|
15
|
+
get dirty() {
|
|
16
|
+
return s(a.readState(), n).dirty;
|
|
17
|
+
},
|
|
18
|
+
get error() {
|
|
19
|
+
return s(a.readState(), n).error;
|
|
20
|
+
},
|
|
21
|
+
reset() {
|
|
22
|
+
a.ensureActive("field().reset"), a.abortValidation(), a.resetValue(n);
|
|
23
|
+
},
|
|
24
|
+
set(e) {
|
|
25
|
+
a.ensureActive("field().set"), a.abortValidation();
|
|
26
|
+
let t = i(a.readState().value, n), r = typeof e == "function" ? e(t) : e;
|
|
27
|
+
a.setValue(n, r);
|
|
28
|
+
},
|
|
29
|
+
get state() {
|
|
30
|
+
return s(a.readState(), n);
|
|
31
|
+
},
|
|
32
|
+
subscribe(e, t = {}) {
|
|
33
|
+
a.ensureActive("field().subscribe");
|
|
34
|
+
let r = s(a.readState(), n);
|
|
35
|
+
return t.immediate && e(r), a.addListener(() => {
|
|
36
|
+
let t = s(a.readState(), n);
|
|
37
|
+
(t.value !== r.value || t.error !== r.error || t.touched !== r.touched || t.dirty !== r.dirty) && (r = t, e(t));
|
|
38
|
+
});
|
|
39
|
+
},
|
|
40
|
+
touch() {
|
|
41
|
+
a.ensureActive("field().touch"), a.setTouched(n, !0);
|
|
42
|
+
},
|
|
43
|
+
get touched() {
|
|
44
|
+
return s(a.readState(), n).touched;
|
|
45
|
+
},
|
|
46
|
+
get value() {
|
|
47
|
+
return s(a.readState(), n).value;
|
|
48
|
+
}
|
|
49
|
+
}, { field(o) {
|
|
50
|
+
if (typeof o == "number") {
|
|
51
|
+
let t = i(a.readState().value, n);
|
|
52
|
+
if (t !== void 0 && !Array.isArray(t)) throw new e(`Cannot index ${o} because the current field value is not an array.`);
|
|
53
|
+
return c([...n, o], a);
|
|
54
|
+
}
|
|
55
|
+
t(o);
|
|
56
|
+
let s = i(a.readState().value, n);
|
|
57
|
+
if (s !== void 0 && !r(s)) throw new e(`Cannot select '${o}' because the current field value is not an object.`);
|
|
58
|
+
return c([...n, o], a);
|
|
59
|
+
} });
|
|
60
|
+
}
|
|
61
|
+
//#endregion
|
|
62
|
+
export { c as createField };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=_field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_field.js","names":[],"sources":["../src/_field.ts"],"sourcesContent":["import { assertSafeKey, hasAtPath, isRecord, type MetaRoot, readAtPath, readError, readMeta } from './core/path';\nimport { ForgeConfigError } from './errors';\nimport type { Field, FieldState, ReadonlyDeep, SubscribeOptions, Unsubscribe } from './types';\n\nexport interface FieldAccess {\n abortValidation(): void;\n addListener(listener: () => void): Unsubscribe;\n ensureActive(operation: string): void;\n readState(): { baseline: unknown; errors: unknown; touched: MetaRoot; value: unknown };\n resetValue(path: readonly (string | number)[]): void;\n setTouched(path: readonly (string | number)[], touched: boolean): void;\n setValue(path: readonly (string | number)[], next: unknown): void;\n}\n\nfunction makeFieldState<V>(\n state: { baseline: unknown; errors: unknown; touched: MetaRoot; value: unknown },\n path: readonly (string | number)[],\n): FieldState<V> {\n const value = readAtPath<V>(state.value, path);\n const baseline = readAtPath<V>(state.baseline, path);\n\n return Object.freeze({\n dirty: value !== baseline || hasAtPath(state.value, path) !== hasAtPath(state.baseline, path),\n error: readError(state.errors, path),\n touched: readMeta(state.touched, path),\n value: value as ReadonlyDeep<V>,\n });\n}\n\nexport function createField<V>(path: readonly (string | number)[], access: FieldAccess): Field<V> {\n const common = {\n get dirty() {\n return makeFieldState<V>(access.readState(), path).dirty;\n },\n get error() {\n return makeFieldState<V>(access.readState(), path).error;\n },\n reset() {\n access.ensureActive('field().reset');\n access.abortValidation();\n access.resetValue(path);\n },\n set(next: V | ((previous: ReadonlyDeep<V>) => V)) {\n access.ensureActive('field().set');\n access.abortValidation();\n\n const previous = readAtPath<V>(access.readState().value, path) as ReadonlyDeep<V>;\n const value = typeof next === 'function' ? (next as (current: ReadonlyDeep<V>) => V)(previous) : next;\n\n access.setValue(path, value);\n },\n get state() {\n return makeFieldState<V>(access.readState(), path);\n },\n subscribe(listener: (state: FieldState<V>) => void, subscribeOptions: SubscribeOptions = {}): Unsubscribe {\n access.ensureActive('field().subscribe');\n\n let previous = makeFieldState<V>(access.readState(), path);\n\n if (subscribeOptions.immediate) listener(previous);\n\n const filtered = () => {\n const next = makeFieldState<V>(access.readState(), path);\n\n if (\n next.value === previous.value &&\n next.error === previous.error &&\n next.touched === previous.touched &&\n next.dirty === previous.dirty\n ) {\n return;\n }\n\n previous = next;\n listener(next);\n };\n\n return access.addListener(filtered);\n },\n touch() {\n access.ensureActive('field().touch');\n access.setTouched(path, true);\n },\n get touched() {\n return makeFieldState<V>(access.readState(), path).touched;\n },\n get value() {\n return makeFieldState<V>(access.readState(), path).value;\n },\n };\n\n return Object.assign(common, {\n field(key: string | number): Field<unknown> {\n if (typeof key === 'number') {\n const currentVal = readAtPath(access.readState().value, path);\n\n if (currentVal !== undefined && !Array.isArray(currentVal)) {\n throw new ForgeConfigError(`Cannot index ${key} because the current field value is not an array.`);\n }\n\n return createField([...path, key], access);\n }\n\n assertSafeKey(key);\n\n const currentVal = readAtPath(access.readState().value, path);\n\n if (currentVal !== undefined && !isRecord(currentVal)) {\n throw new ForgeConfigError(`Cannot select '${key}' because the current field value is not an object.`);\n }\n\n return createField([...path, key], access);\n },\n }) as unknown as Field<V>;\n}\n"],"mappings":";;;AAcA,SAAS,EACP,GACA,GACe;CACf,IAAM,IAAQ,EAAc,EAAM,OAAO,CAAI,GACvC,IAAW,EAAc,EAAM,UAAU,CAAI;CAEnD,OAAO,OAAO,OAAO;EACnB,OAAO,MAAU,KAAY,EAAU,EAAM,OAAO,CAAI,MAAM,EAAU,EAAM,UAAU,CAAI;EAC5F,OAAO,EAAU,EAAM,QAAQ,CAAI;EACnC,SAAS,EAAS,EAAM,SAAS,CAAI;EAC9B;CACT,CAAC;AACH;AAEA,SAAgB,EAAe,GAAoC,GAA+B;CA8DhG,OAAO,OAAO,OAAO;EA5DnB,IAAI,QAAQ;GACV,OAAO,EAAkB,EAAO,UAAU,GAAG,CAAI,CAAC,CAAC;EACrD;EACA,IAAI,QAAQ;GACV,OAAO,EAAkB,EAAO,UAAU,GAAG,CAAI,CAAC,CAAC;EACrD;EACA,QAAQ;GAGN,AAFA,EAAO,aAAa,eAAe,GACnC,EAAO,gBAAgB,GACvB,EAAO,WAAW,CAAI;EACxB;EACA,IAAI,GAA8C;GAEhD,AADA,EAAO,aAAa,aAAa,GACjC,EAAO,gBAAgB;GAEvB,IAAM,IAAW,EAAc,EAAO,UAAU,CAAC,CAAC,OAAO,CAAI,GACvD,IAAQ,OAAO,KAAS,aAAc,EAAyC,CAAQ,IAAI;GAEjG,EAAO,SAAS,GAAM,CAAK;EAC7B;EACA,IAAI,QAAQ;GACV,OAAO,EAAkB,EAAO,UAAU,GAAG,CAAI;EACnD;EACA,UAAU,GAA0C,IAAqC,CAAC,GAAgB;GACxG,EAAO,aAAa,mBAAmB;GAEvC,IAAI,IAAW,EAAkB,EAAO,UAAU,GAAG,CAAI;GAoBzD,OAlBI,EAAiB,aAAW,EAAS,CAAQ,GAkB1C,EAAO,kBAhBS;IACrB,IAAM,IAAO,EAAkB,EAAO,UAAU,GAAG,CAAI;IAGrD,GAAK,UAAU,EAAS,SACxB,EAAK,UAAU,EAAS,SACxB,EAAK,YAAY,EAAS,WAC1B,EAAK,UAAU,EAAS,WAK1B,IAAW,GACX,EAAS,CAAI;GACf,CAEkC;EACpC;EACA,QAAQ;GAEN,AADA,EAAO,aAAa,eAAe,GACnC,EAAO,WAAW,GAAM,EAAI;EAC9B;EACA,IAAI,UAAU;GACZ,OAAO,EAAkB,EAAO,UAAU,GAAG,CAAI,CAAC,CAAC;EACrD;EACA,IAAI,QAAQ;GACV,OAAO,EAAkB,EAAO,UAAU,GAAG,CAAI,CAAC,CAAC;EACrD;CAGmB,GAAQ,EAC3B,MAAM,GAAsC;EAC1C,IAAI,OAAO,KAAQ,UAAU;GAC3B,IAAM,IAAa,EAAW,EAAO,UAAU,CAAC,CAAC,OAAO,CAAI;GAE5D,IAAI,MAAe,KAAA,KAAa,CAAC,MAAM,QAAQ,CAAU,GACvD,MAAM,IAAI,EAAiB,gBAAgB,EAAI,kDAAkD;GAGnG,OAAO,EAAY,CAAC,GAAG,GAAM,CAAG,GAAG,CAAM;EAC3C;EAEA,EAAc,CAAG;EAEjB,IAAM,IAAa,EAAW,EAAO,UAAU,CAAC,CAAC,OAAO,CAAI;EAE5D,IAAI,MAAe,KAAA,KAAa,CAAC,EAAS,CAAU,GAClD,MAAM,IAAI,EAAiB,kBAAkB,EAAI,oDAAoD;EAGvG,OAAO,EAAY,CAAC,GAAG,GAAM,CAAG,GAAG,CAAM;CAC3C,EACF,CAAC;AACH"}
|
package/dist/_notify.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e){queueMicrotask(()=>{throw e})}function t(t){let n=new Set;function r(n){if(!t){e(n);return}try{t(n)}catch(t){e(t)}}return{add(e){return n.add(e),()=>n.delete(e)},clear(){n.clear()},notify(){for(let e of[...n])try{e()}catch(e){r(e)}}}}exports.createNotifier=t;
|
|
2
|
+
//# sourceMappingURL=_notify.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_notify.cjs","names":[],"sources":["../src/_notify.ts"],"sourcesContent":["import type { Unsubscribe } from './types';\n\nexport interface Notifier {\n add(listener: () => void): Unsubscribe;\n clear(): void;\n notify(): void;\n}\n\nfunction rethrowAsync(error: unknown): void {\n queueMicrotask(() => {\n throw error;\n });\n}\n\nexport function createNotifier(onError?: (error: unknown) => void): Notifier {\n const listeners = new Set<() => void>();\n\n function reportError(error: unknown): void {\n if (!onError) {\n rethrowAsync(error);\n\n return;\n }\n\n try {\n onError(error);\n } catch (reporterError) {\n rethrowAsync(reporterError);\n }\n }\n\n return {\n add(listener) {\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n clear() {\n listeners.clear();\n },\n notify() {\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch (error) {\n reportError(error);\n }\n }\n },\n };\n}\n"],"mappings":"AAQA,SAAS,EAAa,EAAsB,CAC1C,mBAAqB,CACnB,MAAM,CACR,CAAC,CACH,CAEA,SAAgB,EAAe,EAA8C,CAC3E,IAAM,EAAY,IAAI,IAEtB,SAAS,EAAY,EAAsB,CACzC,GAAI,CAAC,EAAS,CACZ,EAAa,CAAK,EAElB,MACF,CAEA,GAAI,CACF,EAAQ,CAAK,CACf,OAAS,EAAe,CACtB,EAAa,CAAa,CAC5B,CACF,CAEA,MAAO,CACL,IAAI,EAAU,CAGZ,OAFA,EAAU,IAAI,CAAQ,MAET,EAAU,OAAO,CAAQ,CACxC,EACA,OAAQ,CACN,EAAU,MAAM,CAClB,EACA,QAAS,CACP,IAAK,IAAM,IAAY,CAAC,GAAG,CAAS,EAClC,GAAI,CACF,EAAS,CACX,OAAS,EAAO,CACd,EAAY,CAAK,CACnB,CAEJ,CACF,CACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Unsubscribe } from './types';
|
|
2
|
+
export interface Notifier {
|
|
3
|
+
add(listener: () => void): Unsubscribe;
|
|
4
|
+
clear(): void;
|
|
5
|
+
notify(): void;
|
|
6
|
+
}
|
|
7
|
+
export declare function createNotifier(onError?: (error: unknown) => void): Notifier;
|
|
8
|
+
//# sourceMappingURL=_notify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_notify.d.ts","sourceRoot":"","sources":["../src/_notify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;IACvC,KAAK,IAAI,IAAI,CAAC;IACd,MAAM,IAAI,IAAI,CAAC;CAChB;AAQD,wBAAgB,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,QAAQ,CAoC3E"}
|
package/dist/_notify.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
//#region src/_notify.ts
|
|
2
|
+
function e(e) {
|
|
3
|
+
queueMicrotask(() => {
|
|
4
|
+
throw e;
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
function t(t) {
|
|
8
|
+
let n = /* @__PURE__ */ new Set();
|
|
9
|
+
function r(n) {
|
|
10
|
+
if (!t) {
|
|
11
|
+
e(n);
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
t(n);
|
|
16
|
+
} catch (t) {
|
|
17
|
+
e(t);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
add(e) {
|
|
22
|
+
return n.add(e), () => n.delete(e);
|
|
23
|
+
},
|
|
24
|
+
clear() {
|
|
25
|
+
n.clear();
|
|
26
|
+
},
|
|
27
|
+
notify() {
|
|
28
|
+
for (let e of [...n]) try {
|
|
29
|
+
e();
|
|
30
|
+
} catch (e) {
|
|
31
|
+
r(e);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { t as createNotifier };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=_notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_notify.js","names":[],"sources":["../src/_notify.ts"],"sourcesContent":["import type { Unsubscribe } from './types';\n\nexport interface Notifier {\n add(listener: () => void): Unsubscribe;\n clear(): void;\n notify(): void;\n}\n\nfunction rethrowAsync(error: unknown): void {\n queueMicrotask(() => {\n throw error;\n });\n}\n\nexport function createNotifier(onError?: (error: unknown) => void): Notifier {\n const listeners = new Set<() => void>();\n\n function reportError(error: unknown): void {\n if (!onError) {\n rethrowAsync(error);\n\n return;\n }\n\n try {\n onError(error);\n } catch (reporterError) {\n rethrowAsync(reporterError);\n }\n }\n\n return {\n add(listener) {\n listeners.add(listener);\n\n return () => listeners.delete(listener);\n },\n clear() {\n listeners.clear();\n },\n notify() {\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch (error) {\n reportError(error);\n }\n }\n },\n };\n}\n"],"mappings":";AAQA,SAAS,EAAa,GAAsB;CAC1C,qBAAqB;EACnB,MAAM;CACR,CAAC;AACH;AAEA,SAAgB,EAAe,GAA8C;CAC3E,IAAM,oBAAY,IAAI,IAAgB;CAEtC,SAAS,EAAY,GAAsB;EACzC,IAAI,CAAC,GAAS;GACZ,EAAa,CAAK;GAElB;EACF;EAEA,IAAI;GACF,EAAQ,CAAK;EACf,SAAS,GAAe;GACtB,EAAa,CAAa;EAC5B;CACF;CAEA,OAAO;EACL,IAAI,GAAU;GAGZ,OAFA,EAAU,IAAI,CAAQ,SAET,EAAU,OAAO,CAAQ;EACxC;EACA,QAAQ;GACN,EAAU,MAAM;EAClB;EACA,SAAS;GACP,KAAK,IAAM,KAAY,CAAC,GAAG,CAAS,GAClC,IAAI;IACF,EAAS;GACX,SAAS,GAAO;IACd,EAAY,CAAK;GACnB;EAEJ;CACF;AACF"}
|
package/dist/core/path.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../errors.cjs");var t=new Set([`__proto__`,`constructor`,`prototype`]);function n(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function r(n){if(!n||t.has(n))throw new e.ForgeConfigError(`Invalid field key '${n}'.`)}function i(e
|
|
1
|
+
const e=require("../errors.cjs");var t=new Set([`__proto__`,`constructor`,`prototype`]);function n(e){if(typeof e!=`object`||!e||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function r(n){if(!n||t.has(n))throw new e.ForgeConfigError(`Invalid field key '${n}'.`)}function i(e){return typeof Blob<`u`&&e instanceof Blob||typeof File<`u`&&e instanceof File||e instanceof Date}function a(t){if(Array.isArray(t))return Object.freeze(t.map(a));if(typeof t!=`object`||!t||i(t))return t;if(!n(t))throw new e.ForgeConfigError(`Form values must contain only plain objects, arrays, Date, File, Blob, or primitive values.`);return Object.freeze(Object.fromEntries(Object.entries(t).map(([e,t])=>[e,a(t)])))}function o(e,t){let r=e;for(let e of t)if(typeof e==`number`){if(!Array.isArray(r)||e<0||e>=r.length)return;r=r[e]}else{if(!n(r)||!Object.hasOwn(r,e))return;r=r[e]}return r}function s(e,t){let r=e;for(let e of t)if(typeof e==`number`){if(!Array.isArray(r)||e<0||e>=r.length)return!1;r=r[e]}else{if(!n(r)||!Object.hasOwn(r,e))return!1;r=r[e]}return!0}function c(t,i,o){let[s,...l]=i;if(typeof s==`number`){if(!Array.isArray(t))throw new e.ForgeConfigError(`Cannot index ${s} because the current value is not an array.`);if(s<0||s>=t.length)throw new e.ForgeConfigError(`Index ${s} is out of range for array of length ${t.length}.`);if(l.length===0){let e=[...t];return e[s]=a(o),Object.freeze(e)}let n=[...t];return n[s]=c(t[s],l,o),Object.freeze(n)}if(r(s),!n(t))throw new e.ForgeConfigError(`Cannot select '${s}' because the current value is not an object.`);if(l.length===0)return Object.freeze({...t,[s]:a(o)});let u=t[s];if(u!==void 0&&!n(u)&&!Array.isArray(u))throw new e.ForgeConfigError(`Cannot select '${s}' because it is not an object or array.`);let d=u??{};return Object.freeze({...t,[s]:c(d,l,o)})}function l(e,t,r){let[i,...a]=r;if(typeof i==`number`){if(!Array.isArray(e)||!Array.isArray(t)||i>=t.length||i>=e.length)return e;if(a.length===0){let n=[...e];return n[i]=t[i],Object.freeze(n)}let n=[...e];return n[i]=l(e[i],t[i],a),Object.freeze(n)}if(!n(e))return e;if(a.length===0){if(Object.hasOwn(t,i))return Object.freeze({...e,[i]:t[i]});let{[i]:n,...r}=e;return Object.freeze(r)}let o=t[i];if(!n(o)&&!Array.isArray(o)){if(Object.hasOwn(t,i))return Object.freeze({...e,[i]:o});let{[i]:n,...r}=e;return Object.freeze(r)}let s=e[i],c=n(s)||Array.isArray(s)?s:{};return Object.freeze({...e,[i]:l(c,o,a)})}function u(e,t,r){let[i,...a]=t,o=String(i),s={...e};if(a.length===0)r?s[o]=!0:delete s[o];else{let t=u(n(e[o])?e[o]:{},a,r);Object.keys(t).length===0?delete s[o]:s[o]=t}return Object.freeze(s)}function d(e,t){let r=e;for(let e of t){let t=String(e);if(!n(r)||!Object.hasOwn(r,t))return!1;r=r[t]}return r===!0}function f(e){return Array.isArray(e)?Object.freeze(Object.fromEntries(e.map((e,t)=>[String(t),n(e)||Array.isArray(e)?f(e):!0]))):n(e)?Object.freeze(Object.fromEntries(Object.entries(e).map(([e,t])=>[e,n(t)||Array.isArray(t)?f(t):!0]))):{}}function p(e,t){let n=o(e,t);return typeof n==`string`?n:void 0}function m(e,r,i){let[a,...o]=r;if(typeof a==`number`){let t=Array.isArray(e)?[...e]:[];return o.length===0?t[a]===void 0&&(t[a]=i):t[a]=m(t[a],o,i),t}if(!a||t.has(a))return e??{};let s=n(e)?{...e}:{};return o.length===0?s[a]===void 0&&(s[a]=i):s[a]=m(s[a],o,i),s}function h(e,t,r){let i=m(e,t,r);return n(i)?i:e}function g(e){if(typeof e==`string`)return e;if(Array.isArray(e)){let t=e.map(e=>g(e));return t.every(e=>e===void 0)?void 0:Object.freeze(t)}if(!n(e))return;let t=Object.entries(e).map(([e,t])=>[e,g(t)]).filter(([,e])=>e!==void 0);return t.length===0?void 0:Object.freeze(Object.fromEntries(t))}exports.assertSafeKey=r,exports.hasAtPath=s,exports.immutable=a,exports.isRecord=n,exports.normalizeErrors=g,exports.readAtPath=o,exports.readError=p,exports.readMeta=d,exports.resetAtPath=l,exports.touchAll=f,exports.writeAtPath=c,exports.writeError=h,exports.writeMeta=u;
|
|
2
2
|
//# sourceMappingURL=path.cjs.map
|
package/dist/core/path.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.cjs","names":[],"sources":["../../src/core/path.ts"],"sourcesContent":["import { ForgeConfigError } from '../errors';\n\nconst unsafeKeys = new Set(['__proto__', 'constructor', 'prototype']);\n\ntype ErrorTree = Record<string, unknown>;\ntype RecordValue = Record<string, unknown>;\ntype MetaTree = true | MetaNode;\ninterface MetaNode {\n readonly [key: string]: MetaTree;\n}\nexport type MetaRoot = MetaNode;\n\nexport function isRecord(value: unknown): value is RecordValue {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function assertSafeKey(key: string): void {\n if (!key || unsafeKeys.has(key)) throw new ForgeConfigError(`Invalid field key '${key}'.`);\n}\n\nexport function writeError(tree: ErrorTree, path: readonly string[], message: string): ErrorTree {\n const [key, ...rest] = path;\n\n if (!key || unsafeKeys.has(key)) return tree;\n\n if (rest.length === 0) return tree[key] === undefined ? { ...tree, [key]: message } : tree;\n\n const child = tree[key];\n\n if (child !== undefined && !isRecord(child)) return tree;\n\n return { ...tree, [key]: writeError((child ?? {}) as ErrorTree, rest, message) };\n}\n\nfunction isAtomicLeaf(value: unknown): boolean {\n return (\n (typeof Blob !== 'undefined' && value instanceof Blob) || (typeof File !== 'undefined' && value instanceof File)\n );\n}\n\nexport function immutable<T>(value: T): T {\n if (Array.isArray(value)) return Object.freeze(value.map(immutable)) as T;\n\n if (value === null || typeof value !== 'object' || isAtomicLeaf(value)) return value;\n\n if (!isRecord(value)) {\n throw new ForgeConfigError('Form values must contain only plain objects, arrays, File, Blob, or primitive values.');\n }\n\n return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, child]) => [key, immutable(child)]))) as T;\n}\n\nexport function readAtPath<T>(value: unknown, path: readonly string[]): T | undefined {\n let current = value;\n\n for (const key of path) {\n if (!isRecord(current) || !Object.hasOwn(current, key)) return undefined;\n\n current = current[key];\n }\n\n return current as T | undefined;\n}\n\nexport function hasAtPath(value: unknown, path: readonly string[]): boolean {\n let current = value;\n\n for (const key of path) {\n if (!isRecord(current) || !Object.hasOwn(current, key)) return false;\n\n current = current[key];\n }\n\n return true;\n}\n\nexport function writeAtPath<T extends RecordValue>(value: T, path: readonly string[], next: unknown): T {\n const [key, ...rest] = path;\n\n assertSafeKey(key);\n\n if (rest.length === 0) return Object.freeze({ ...value, [key]: immutable(next) }) as T;\n\n const child = value[key];\n\n if (child !== undefined && !isRecord(child)) {\n throw new ForgeConfigError(`Cannot select '${key}' because it is not an object.`);\n }\n\n return Object.freeze({ ...value, [key]: writeAtPath((child ?? {}) as RecordValue, rest, next) }) as T;\n}\n\nexport function resetAtPath<T extends RecordValue>(value: T, baseline: T, path: readonly string[]): T {\n const [key, ...rest] = path;\n\n if (rest.length === 0) {\n if (Object.hasOwn(baseline, key)) return Object.freeze({ ...value, [key]: baseline[key] }) as T;\n\n const { [key]: _removed, ...next } = value;\n\n return Object.freeze(next) as T;\n }\n\n const baselineChild = baseline[key];\n\n if (!isRecord(baselineChild)) {\n if (Object.hasOwn(baseline, key)) return Object.freeze({ ...value, [key]: baselineChild }) as T;\n\n const { [key]: _removed, ...next } = value;\n\n return Object.freeze(next) as T;\n }\n\n const currentChild = isRecord(value[key]) ? value[key] : {};\n\n return Object.freeze({ ...value, [key]: resetAtPath(currentChild, baselineChild, rest) }) as T;\n}\n\nexport function writeMeta(meta: MetaRoot, path: readonly string[], next: boolean): MetaRoot {\n const [key, ...rest] = path;\n const copy: Record<string, MetaTree> = { ...meta };\n\n if (rest.length === 0) {\n if (next) copy[key] = true;\n else delete copy[key];\n } else {\n const child = isRecord(meta[key]) ? (meta[key] as MetaRoot) : {};\n const updated = writeMeta(child, rest, next);\n\n if (Object.keys(updated).length === 0) delete copy[key];\n else copy[key] = updated;\n }\n\n return Object.freeze(copy);\n}\n\nexport function readMeta(meta: MetaRoot, path: readonly string[]): boolean {\n let current: MetaTree | undefined = meta;\n\n for (const key of path) {\n if (!isRecord(current) || !Object.hasOwn(current, key)) return false;\n\n current = current[key] as MetaTree;\n }\n\n return current === true;\n}\n\nexport function touchAll(value: unknown): MetaRoot {\n if (!isRecord(value)) return {};\n\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).map(([key, child]) => [key, isRecord(child) ? touchAll(child) : (true as const)]),\n ),\n );\n}\n\nexport function readError(errors: unknown, path: readonly string[]): string | undefined {\n const error = readAtPath(errors, path);\n\n return typeof error === 'string' ? error : undefined;\n}\n\nexport function normalizeErrors<T>(errors: T): T | undefined {\n if (typeof errors === 'string') return errors;\n\n if (!isRecord(errors)) return undefined;\n\n const entries = Object.entries(errors)\n .map(([key, value]) => [key, normalizeErrors(value)] as const)\n .filter(([, value]) => value !== undefined);\n\n return entries.length === 0 ? undefined : (Object.freeze(Object.fromEntries(entries)) as T);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"path.cjs","names":[],"sources":["../../src/core/path.ts"],"sourcesContent":["import { ForgeConfigError } from '../errors';\n\nconst unsafeKeys = new Set(['__proto__', 'constructor', 'prototype']);\n\ntype ErrorNode = string | ErrorTree | ErrorArray;\nexport interface ErrorTree {\n readonly [key: string]: ErrorNode;\n}\ntype ErrorArray = ErrorNode[];\ntype MutableErrorTree = Record<string, ErrorNode>;\ntype RecordValue = Record<string, unknown>;\ntype TreeValue = RecordValue | readonly unknown[];\ntype MetaTree = true | MetaNode;\ninterface MetaNode {\n readonly [key: string]: MetaTree;\n}\nexport type MetaRoot = MetaNode;\n\nexport function isRecord(value: unknown): value is RecordValue {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function assertSafeKey(key: string): void {\n if (!key || unsafeKeys.has(key)) throw new ForgeConfigError(`Invalid field key '${key}'.`);\n}\n\nfunction isAtomicLeaf(value: unknown): boolean {\n return (\n (typeof Blob !== 'undefined' && value instanceof Blob) ||\n (typeof File !== 'undefined' && value instanceof File) ||\n value instanceof Date\n );\n}\n\nexport function immutable<T>(value: T): T {\n if (Array.isArray(value)) return Object.freeze(value.map(immutable)) as T;\n\n if (value === null || typeof value !== 'object' || isAtomicLeaf(value)) return value;\n\n if (!isRecord(value)) {\n throw new ForgeConfigError(\n 'Form values must contain only plain objects, arrays, Date, File, Blob, or primitive values.',\n );\n }\n\n return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, child]) => [key, immutable(child)]))) as T;\n}\n\nexport function readAtPath<T>(value: unknown, path: readonly (string | number)[]): T | undefined {\n let current: unknown = value;\n\n for (const key of path) {\n if (typeof key === 'number') {\n if (!Array.isArray(current) || key < 0 || key >= current.length) return undefined;\n\n current = current[key];\n } else {\n if (!isRecord(current) || !Object.hasOwn(current, key)) return undefined;\n\n current = current[key];\n }\n }\n\n return current as T | undefined;\n}\n\nexport function hasAtPath(value: unknown, path: readonly (string | number)[]): boolean {\n let current: unknown = value;\n\n for (const key of path) {\n if (typeof key === 'number') {\n if (!Array.isArray(current) || key < 0 || key >= current.length) return false;\n\n current = current[key];\n } else {\n if (!isRecord(current) || !Object.hasOwn(current, key)) return false;\n\n current = current[key];\n }\n }\n\n return true;\n}\n\nexport function writeAtPath<T extends TreeValue>(value: T, path: readonly (string | number)[], next: unknown): T {\n const [key, ...rest] = path;\n\n if (typeof key === 'number') {\n if (!Array.isArray(value)) {\n throw new ForgeConfigError(`Cannot index ${key} because the current value is not an array.`);\n }\n\n if (key < 0 || key >= value.length) {\n throw new ForgeConfigError(`Index ${key} is out of range for array of length ${value.length}.`);\n }\n\n if (rest.length === 0) {\n const copy = [...value];\n\n copy[key] = immutable(next);\n\n return Object.freeze(copy) as T;\n }\n\n const copy = [...value];\n\n copy[key] = writeAtPath(value[key] as TreeValue, rest, next);\n\n return Object.freeze(copy) as T;\n }\n\n assertSafeKey(key);\n\n if (!isRecord(value)) {\n throw new ForgeConfigError(`Cannot select '${key}' because the current value is not an object.`);\n }\n\n if (rest.length === 0) return Object.freeze({ ...value, [key]: immutable(next) }) as T;\n\n const child = value[key];\n\n if (child !== undefined && !isRecord(child) && !Array.isArray(child)) {\n throw new ForgeConfigError(`Cannot select '${key}' because it is not an object or array.`);\n }\n\n const childTree = (child ?? {}) as TreeValue;\n\n return Object.freeze({ ...value, [key]: writeAtPath(childTree, rest, next) }) as T;\n}\n\nexport function resetAtPath<T extends TreeValue>(value: T, baseline: T, path: readonly (string | number)[]): T {\n const [key, ...rest] = path;\n\n if (typeof key === 'number') {\n if (!Array.isArray(value)) return value;\n if (!Array.isArray(baseline) || key >= baseline.length || key >= value.length) return value;\n\n if (rest.length === 0) {\n const copy = [...value];\n\n copy[key] = baseline[key];\n\n return Object.freeze(copy) as T;\n }\n\n const copy = [...value];\n\n copy[key] = resetAtPath(value[key] as TreeValue, baseline[key] as TreeValue, rest);\n\n return Object.freeze(copy) as T;\n }\n\n if (!isRecord(value)) return value;\n\n if (rest.length === 0) {\n if (Object.hasOwn(baseline, key)) return Object.freeze({ ...value, [key]: (baseline as RecordValue)[key] }) as T;\n\n const { [key]: _removed, ...next } = value;\n\n return Object.freeze(next) as T;\n }\n\n const baselineChild = (baseline as RecordValue)[key];\n\n if (!isRecord(baselineChild) && !Array.isArray(baselineChild)) {\n if (Object.hasOwn(baseline, key)) return Object.freeze({ ...value, [key]: baselineChild }) as T;\n\n const { [key]: _removed, ...next } = value;\n\n return Object.freeze(next) as T;\n }\n\n const currentChild = value[key];\n const childTree = (isRecord(currentChild) || Array.isArray(currentChild) ? currentChild : {}) as TreeValue;\n\n return Object.freeze({ ...value, [key]: resetAtPath(childTree, baselineChild as TreeValue, rest) }) as T;\n}\n\nexport function writeMeta(meta: MetaRoot, path: readonly (string | number)[], next: boolean): MetaRoot {\n const [key, ...rest] = path;\n const stringKey = String(key);\n const copy: Record<string, MetaTree> = { ...meta };\n\n if (rest.length === 0) {\n if (next) copy[stringKey] = true;\n else delete copy[stringKey];\n } else {\n const child = isRecord(meta[stringKey]) ? (meta[stringKey] as MetaRoot) : {};\n const updated = writeMeta(child, rest, next);\n\n if (Object.keys(updated).length === 0) delete copy[stringKey];\n else copy[stringKey] = updated;\n }\n\n return Object.freeze(copy);\n}\n\nexport function readMeta(meta: MetaRoot, path: readonly (string | number)[]): boolean {\n let current: MetaTree | undefined = meta;\n\n for (const key of path) {\n const stringKey = String(key);\n\n if (!isRecord(current) || !Object.hasOwn(current, stringKey)) return false;\n\n current = current[stringKey] as MetaTree;\n }\n\n return current === true;\n}\n\nexport function touchAll(value: unknown): MetaRoot {\n if (Array.isArray(value)) {\n return Object.freeze(\n Object.fromEntries(\n value.map((child, i) => [\n String(i),\n isRecord(child) || Array.isArray(child) ? touchAll(child) : (true as const),\n ]),\n ),\n );\n }\n\n if (!isRecord(value)) return {};\n\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).map(([key, child]) => [\n key,\n isRecord(child) || Array.isArray(child) ? touchAll(child) : (true as const),\n ]),\n ),\n );\n}\n\nexport function readError(errors: unknown, path: readonly (string | number)[]): string | undefined {\n const error = readAtPath(errors, path);\n\n return typeof error === 'string' ? error : undefined;\n}\n\nfunction writeErrorNode(\n node: ErrorTree | ErrorArray | undefined,\n path: readonly (string | number)[],\n message: string,\n): ErrorTree | ErrorArray {\n const [key, ...rest] = path;\n\n if (typeof key === 'number') {\n const arr: ErrorNode[] = Array.isArray(node) ? [...node] : [];\n\n if (rest.length === 0) {\n if (arr[key] === undefined) arr[key] = message;\n } else {\n arr[key] = writeErrorNode(arr[key] as ErrorTree | ErrorArray | undefined, rest, message);\n }\n\n return arr;\n }\n\n if (!key || unsafeKeys.has(key)) return node ?? {};\n\n const record: MutableErrorTree = isRecord(node) ? { ...node } : {};\n\n if (rest.length === 0) {\n if (record[key] === undefined) record[key] = message;\n } else {\n record[key] = writeErrorNode(record[key] as ErrorTree | ErrorArray | undefined, rest, message);\n }\n\n return record;\n}\n\nexport function writeError(tree: ErrorTree, path: readonly (string | number)[], message: string): ErrorTree {\n const result = writeErrorNode(tree, path, message);\n\n return isRecord(result) ? result : tree;\n}\n\nexport function normalizeErrors<T>(errors: T): T | undefined {\n if (typeof errors === 'string') return errors;\n\n if (Array.isArray(errors)) {\n const normalized = errors.map((item) => normalizeErrors(item));\n\n if (normalized.every((value) => value === undefined)) return undefined;\n\n return Object.freeze(normalized) as T;\n }\n\n if (!isRecord(errors)) return undefined;\n\n const entries = Object.entries(errors)\n .map(([key, value]) => [key, normalizeErrors(value)] as const)\n .filter(([, value]) => value !== undefined);\n\n return entries.length === 0 ? undefined : (Object.freeze(Object.fromEntries(entries)) as T);\n}\n"],"mappings":"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"}
|
package/dist/core/path.d.ts
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
|
-
type
|
|
1
|
+
type ErrorNode = string | ErrorTree | ErrorArray;
|
|
2
|
+
export interface ErrorTree {
|
|
3
|
+
readonly [key: string]: ErrorNode;
|
|
4
|
+
}
|
|
5
|
+
type ErrorArray = ErrorNode[];
|
|
2
6
|
type RecordValue = Record<string, unknown>;
|
|
7
|
+
type TreeValue = RecordValue | readonly unknown[];
|
|
3
8
|
type MetaTree = true | MetaNode;
|
|
4
9
|
interface MetaNode {
|
|
5
10
|
readonly [key: string]: MetaTree;
|
|
@@ -7,16 +12,16 @@ interface MetaNode {
|
|
|
7
12
|
export type MetaRoot = MetaNode;
|
|
8
13
|
export declare function isRecord(value: unknown): value is RecordValue;
|
|
9
14
|
export declare function assertSafeKey(key: string): void;
|
|
10
|
-
export declare function writeError(tree: ErrorTree, path: readonly string[], message: string): ErrorTree;
|
|
11
15
|
export declare function immutable<T>(value: T): T;
|
|
12
|
-
export declare function readAtPath<T>(value: unknown, path: readonly string[]): T | undefined;
|
|
13
|
-
export declare function hasAtPath(value: unknown, path: readonly string[]): boolean;
|
|
14
|
-
export declare function writeAtPath<T extends
|
|
15
|
-
export declare function resetAtPath<T extends
|
|
16
|
-
export declare function writeMeta(meta: MetaRoot, path: readonly string[], next: boolean): MetaRoot;
|
|
17
|
-
export declare function readMeta(meta: MetaRoot, path: readonly string[]): boolean;
|
|
16
|
+
export declare function readAtPath<T>(value: unknown, path: readonly (string | number)[]): T | undefined;
|
|
17
|
+
export declare function hasAtPath(value: unknown, path: readonly (string | number)[]): boolean;
|
|
18
|
+
export declare function writeAtPath<T extends TreeValue>(value: T, path: readonly (string | number)[], next: unknown): T;
|
|
19
|
+
export declare function resetAtPath<T extends TreeValue>(value: T, baseline: T, path: readonly (string | number)[]): T;
|
|
20
|
+
export declare function writeMeta(meta: MetaRoot, path: readonly (string | number)[], next: boolean): MetaRoot;
|
|
21
|
+
export declare function readMeta(meta: MetaRoot, path: readonly (string | number)[]): boolean;
|
|
18
22
|
export declare function touchAll(value: unknown): MetaRoot;
|
|
19
|
-
export declare function readError(errors: unknown, path: readonly string[]): string | undefined;
|
|
23
|
+
export declare function readError(errors: unknown, path: readonly (string | number)[]): string | undefined;
|
|
24
|
+
export declare function writeError(tree: ErrorTree, path: readonly (string | number)[], message: string): ErrorTree;
|
|
20
25
|
export declare function normalizeErrors<T>(errors: T): T | undefined;
|
|
21
26
|
export {};
|
|
22
27
|
//# sourceMappingURL=path.d.ts.map
|
package/dist/core/path.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/core/path.ts"],"names":[],"mappings":"AAIA,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../src/core/path.ts"],"names":[],"mappings":"AAIA,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AACjD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACnC;AACD,KAAK,UAAU,GAAG,SAAS,EAAE,CAAC;AAE9B,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC3C,KAAK,SAAS,GAAG,WAAW,GAAG,SAAS,OAAO,EAAE,CAAC;AAClD,KAAK,QAAQ,GAAG,IAAI,GAAG,QAAQ,CAAC;AAChC,UAAU,QAAQ;IAChB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC;CAClC;AACD,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;AAEhC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAM7D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE/C;AAUD,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAYxC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,SAAS,CAgB/F;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAgBrF;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,CAAC,CA4C/G;AAED,wBAAgB,WAAW,CAAC,CAAC,SAAS,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,CAAC,CA8C7G;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,GAAG,QAAQ,CAiBrG;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAYpF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAsBjD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,GAAG,SAAS,CAIjG;AAkCD,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAI1G;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS,CAkB3D"}
|
package/dist/core/path.js
CHANGED
|
@@ -13,59 +13,74 @@ function n(e) {
|
|
|
13
13
|
function r(n) {
|
|
14
14
|
if (!n || t.has(n)) throw new e(`Invalid field key '${n}'.`);
|
|
15
15
|
}
|
|
16
|
-
function i(e
|
|
17
|
-
|
|
18
|
-
if (!o || t.has(o)) return e;
|
|
19
|
-
if (s.length === 0) return e[o] === void 0 ? {
|
|
20
|
-
...e,
|
|
21
|
-
[o]: a
|
|
22
|
-
} : e;
|
|
23
|
-
let c = e[o];
|
|
24
|
-
return c !== void 0 && !n(c) ? e : {
|
|
25
|
-
...e,
|
|
26
|
-
[o]: i(c ?? {}, s, a)
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
function a(e) {
|
|
30
|
-
return typeof Blob < "u" && e instanceof Blob || typeof File < "u" && e instanceof File;
|
|
16
|
+
function i(e) {
|
|
17
|
+
return typeof Blob < "u" && e instanceof Blob || typeof File < "u" && e instanceof File || e instanceof Date;
|
|
31
18
|
}
|
|
32
|
-
function
|
|
33
|
-
if (Array.isArray(t)) return Object.freeze(t.map(
|
|
34
|
-
if (typeof t != "object" || !t ||
|
|
35
|
-
if (!n(t)) throw new e("Form values must contain only plain objects, arrays, File, Blob, or primitive values.");
|
|
36
|
-
return Object.freeze(Object.fromEntries(Object.entries(t).map(([e, t]) => [e,
|
|
19
|
+
function a(t) {
|
|
20
|
+
if (Array.isArray(t)) return Object.freeze(t.map(a));
|
|
21
|
+
if (typeof t != "object" || !t || i(t)) return t;
|
|
22
|
+
if (!n(t)) throw new e("Form values must contain only plain objects, arrays, Date, File, Blob, or primitive values.");
|
|
23
|
+
return Object.freeze(Object.fromEntries(Object.entries(t).map(([e, t]) => [e, a(t)])));
|
|
37
24
|
}
|
|
38
|
-
function
|
|
25
|
+
function o(e, t) {
|
|
39
26
|
let r = e;
|
|
40
|
-
for (let e of t) {
|
|
27
|
+
for (let e of t) if (typeof e == "number") {
|
|
28
|
+
if (!Array.isArray(r) || e < 0 || e >= r.length) return;
|
|
29
|
+
r = r[e];
|
|
30
|
+
} else {
|
|
41
31
|
if (!n(r) || !Object.hasOwn(r, e)) return;
|
|
42
32
|
r = r[e];
|
|
43
33
|
}
|
|
44
34
|
return r;
|
|
45
35
|
}
|
|
46
|
-
function
|
|
36
|
+
function s(e, t) {
|
|
47
37
|
let r = e;
|
|
48
|
-
for (let e of t) {
|
|
38
|
+
for (let e of t) if (typeof e == "number") {
|
|
39
|
+
if (!Array.isArray(r) || e < 0 || e >= r.length) return !1;
|
|
40
|
+
r = r[e];
|
|
41
|
+
} else {
|
|
49
42
|
if (!n(r) || !Object.hasOwn(r, e)) return !1;
|
|
50
43
|
r = r[e];
|
|
51
44
|
}
|
|
52
45
|
return !0;
|
|
53
46
|
}
|
|
54
|
-
function
|
|
55
|
-
let [s, ...
|
|
56
|
-
if (
|
|
47
|
+
function c(t, i, o) {
|
|
48
|
+
let [s, ...l] = i;
|
|
49
|
+
if (typeof s == "number") {
|
|
50
|
+
if (!Array.isArray(t)) throw new e(`Cannot index ${s} because the current value is not an array.`);
|
|
51
|
+
if (s < 0 || s >= t.length) throw new e(`Index ${s} is out of range for array of length ${t.length}.`);
|
|
52
|
+
if (l.length === 0) {
|
|
53
|
+
let e = [...t];
|
|
54
|
+
return e[s] = a(o), Object.freeze(e);
|
|
55
|
+
}
|
|
56
|
+
let n = [...t];
|
|
57
|
+
return n[s] = c(t[s], l, o), Object.freeze(n);
|
|
58
|
+
}
|
|
59
|
+
if (r(s), !n(t)) throw new e(`Cannot select '${s}' because the current value is not an object.`);
|
|
60
|
+
if (l.length === 0) return Object.freeze({
|
|
57
61
|
...t,
|
|
58
|
-
[s]: o
|
|
62
|
+
[s]: a(o)
|
|
59
63
|
});
|
|
60
64
|
let u = t[s];
|
|
61
|
-
if (u !== void 0 && !n(u)) throw new e(`Cannot select '${s}' because it is not an object.`);
|
|
65
|
+
if (u !== void 0 && !n(u) && !Array.isArray(u)) throw new e(`Cannot select '${s}' because it is not an object or array.`);
|
|
66
|
+
let d = u ?? {};
|
|
62
67
|
return Object.freeze({
|
|
63
68
|
...t,
|
|
64
|
-
[s]:
|
|
69
|
+
[s]: c(d, l, o)
|
|
65
70
|
});
|
|
66
71
|
}
|
|
67
|
-
function
|
|
72
|
+
function l(e, t, r) {
|
|
68
73
|
let [i, ...a] = r;
|
|
74
|
+
if (typeof i == "number") {
|
|
75
|
+
if (!Array.isArray(e) || !Array.isArray(t) || i >= t.length || i >= e.length) return e;
|
|
76
|
+
if (a.length === 0) {
|
|
77
|
+
let n = [...e];
|
|
78
|
+
return n[i] = t[i], Object.freeze(n);
|
|
79
|
+
}
|
|
80
|
+
let n = [...e];
|
|
81
|
+
return n[i] = l(e[i], t[i], a), Object.freeze(n);
|
|
82
|
+
}
|
|
83
|
+
if (!n(e)) return e;
|
|
69
84
|
if (a.length === 0) {
|
|
70
85
|
if (Object.hasOwn(t, i)) return Object.freeze({
|
|
71
86
|
...e,
|
|
@@ -75,7 +90,7 @@ function u(e, t, r) {
|
|
|
75
90
|
return Object.freeze(r);
|
|
76
91
|
}
|
|
77
92
|
let o = t[i];
|
|
78
|
-
if (!n(o)) {
|
|
93
|
+
if (!n(o) && !Array.isArray(o)) {
|
|
79
94
|
if (Object.hasOwn(t, i)) return Object.freeze({
|
|
80
95
|
...e,
|
|
81
96
|
[i]: o
|
|
@@ -83,43 +98,62 @@ function u(e, t, r) {
|
|
|
83
98
|
let { [i]: n, ...r } = e;
|
|
84
99
|
return Object.freeze(r);
|
|
85
100
|
}
|
|
86
|
-
let s =
|
|
101
|
+
let s = e[i], c = n(s) || Array.isArray(s) ? s : {};
|
|
87
102
|
return Object.freeze({
|
|
88
103
|
...e,
|
|
89
|
-
[i]:
|
|
104
|
+
[i]: l(c, o, a)
|
|
90
105
|
});
|
|
91
106
|
}
|
|
92
|
-
function
|
|
93
|
-
let [i, ...a] = t, o = { ...e };
|
|
94
|
-
if (a.length === 0) r ? o
|
|
107
|
+
function u(e, t, r) {
|
|
108
|
+
let [i, ...a] = t, o = String(i), s = { ...e };
|
|
109
|
+
if (a.length === 0) r ? s[o] = !0 : delete s[o];
|
|
95
110
|
else {
|
|
96
|
-
let t =
|
|
97
|
-
Object.keys(t).length === 0 ? delete o
|
|
111
|
+
let t = u(n(e[o]) ? e[o] : {}, a, r);
|
|
112
|
+
Object.keys(t).length === 0 ? delete s[o] : s[o] = t;
|
|
98
113
|
}
|
|
99
|
-
return Object.freeze(
|
|
114
|
+
return Object.freeze(s);
|
|
100
115
|
}
|
|
101
|
-
function
|
|
116
|
+
function d(e, t) {
|
|
102
117
|
let r = e;
|
|
103
118
|
for (let e of t) {
|
|
104
|
-
|
|
105
|
-
r
|
|
119
|
+
let t = String(e);
|
|
120
|
+
if (!n(r) || !Object.hasOwn(r, t)) return !1;
|
|
121
|
+
r = r[t];
|
|
106
122
|
}
|
|
107
123
|
return r === !0;
|
|
108
124
|
}
|
|
109
|
-
function
|
|
110
|
-
return n(e) ? Object.freeze(Object.fromEntries(Object.entries(e).map(([e, t]) => [e,
|
|
125
|
+
function f(e) {
|
|
126
|
+
return Array.isArray(e) ? Object.freeze(Object.fromEntries(e.map((e, t) => [String(t), n(e) || Array.isArray(e) ? f(e) : !0]))) : n(e) ? Object.freeze(Object.fromEntries(Object.entries(e).map(([e, t]) => [e, n(t) || Array.isArray(t) ? f(t) : !0]))) : {};
|
|
111
127
|
}
|
|
112
|
-
function
|
|
113
|
-
let n =
|
|
128
|
+
function p(e, t) {
|
|
129
|
+
let n = o(e, t);
|
|
114
130
|
return typeof n == "string" ? n : void 0;
|
|
115
131
|
}
|
|
116
|
-
function
|
|
132
|
+
function m(e, r, i) {
|
|
133
|
+
let [a, ...o] = r;
|
|
134
|
+
if (typeof a == "number") {
|
|
135
|
+
let t = Array.isArray(e) ? [...e] : [];
|
|
136
|
+
return o.length === 0 ? t[a] === void 0 && (t[a] = i) : t[a] = m(t[a], o, i), t;
|
|
137
|
+
}
|
|
138
|
+
if (!a || t.has(a)) return e ?? {};
|
|
139
|
+
let s = n(e) ? { ...e } : {};
|
|
140
|
+
return o.length === 0 ? s[a] === void 0 && (s[a] = i) : s[a] = m(s[a], o, i), s;
|
|
141
|
+
}
|
|
142
|
+
function h(e, t, r) {
|
|
143
|
+
let i = m(e, t, r);
|
|
144
|
+
return n(i) ? i : e;
|
|
145
|
+
}
|
|
146
|
+
function g(e) {
|
|
117
147
|
if (typeof e == "string") return e;
|
|
148
|
+
if (Array.isArray(e)) {
|
|
149
|
+
let t = e.map((e) => g(e));
|
|
150
|
+
return t.every((e) => e === void 0) ? void 0 : Object.freeze(t);
|
|
151
|
+
}
|
|
118
152
|
if (!n(e)) return;
|
|
119
|
-
let t = Object.entries(e).map(([e, t]) => [e,
|
|
153
|
+
let t = Object.entries(e).map(([e, t]) => [e, g(t)]).filter(([, e]) => e !== void 0);
|
|
120
154
|
return t.length === 0 ? void 0 : Object.freeze(Object.fromEntries(t));
|
|
121
155
|
}
|
|
122
156
|
//#endregion
|
|
123
|
-
export { r as assertSafeKey,
|
|
157
|
+
export { r as assertSafeKey, s as hasAtPath, a as immutable, n as isRecord, g as normalizeErrors, o as readAtPath, p as readError, d as readMeta, l as resetAtPath, f as touchAll, c as writeAtPath, h as writeError, u as writeMeta };
|
|
124
158
|
|
|
125
159
|
//# sourceMappingURL=path.js.map
|
package/dist/core/path.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path.js","names":[],"sources":["../../src/core/path.ts"],"sourcesContent":["import { ForgeConfigError } from '../errors';\n\nconst unsafeKeys = new Set(['__proto__', 'constructor', 'prototype']);\n\ntype ErrorTree = Record<string, unknown>;\ntype RecordValue = Record<string, unknown>;\ntype MetaTree = true | MetaNode;\ninterface MetaNode {\n readonly [key: string]: MetaTree;\n}\nexport type MetaRoot = MetaNode;\n\nexport function isRecord(value: unknown): value is RecordValue {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function assertSafeKey(key: string): void {\n if (!key || unsafeKeys.has(key)) throw new ForgeConfigError(`Invalid field key '${key}'.`);\n}\n\nexport function writeError(tree: ErrorTree, path: readonly string[], message: string): ErrorTree {\n const [key, ...rest] = path;\n\n if (!key || unsafeKeys.has(key)) return tree;\n\n if (rest.length === 0) return tree[key] === undefined ? { ...tree, [key]: message } : tree;\n\n const child = tree[key];\n\n if (child !== undefined && !isRecord(child)) return tree;\n\n return { ...tree, [key]: writeError((child ?? {}) as ErrorTree, rest, message) };\n}\n\nfunction isAtomicLeaf(value: unknown): boolean {\n return (\n (typeof Blob !== 'undefined' && value instanceof Blob) || (typeof File !== 'undefined' && value instanceof File)\n );\n}\n\nexport function immutable<T>(value: T): T {\n if (Array.isArray(value)) return Object.freeze(value.map(immutable)) as T;\n\n if (value === null || typeof value !== 'object' || isAtomicLeaf(value)) return value;\n\n if (!isRecord(value)) {\n throw new ForgeConfigError('Form values must contain only plain objects, arrays, File, Blob, or primitive values.');\n }\n\n return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, child]) => [key, immutable(child)]))) as T;\n}\n\nexport function readAtPath<T>(value: unknown, path: readonly string[]): T | undefined {\n let current = value;\n\n for (const key of path) {\n if (!isRecord(current) || !Object.hasOwn(current, key)) return undefined;\n\n current = current[key];\n }\n\n return current as T | undefined;\n}\n\nexport function hasAtPath(value: unknown, path: readonly string[]): boolean {\n let current = value;\n\n for (const key of path) {\n if (!isRecord(current) || !Object.hasOwn(current, key)) return false;\n\n current = current[key];\n }\n\n return true;\n}\n\nexport function writeAtPath<T extends RecordValue>(value: T, path: readonly string[], next: unknown): T {\n const [key, ...rest] = path;\n\n assertSafeKey(key);\n\n if (rest.length === 0) return Object.freeze({ ...value, [key]: immutable(next) }) as T;\n\n const child = value[key];\n\n if (child !== undefined && !isRecord(child)) {\n throw new ForgeConfigError(`Cannot select '${key}' because it is not an object.`);\n }\n\n return Object.freeze({ ...value, [key]: writeAtPath((child ?? {}) as RecordValue, rest, next) }) as T;\n}\n\nexport function resetAtPath<T extends RecordValue>(value: T, baseline: T, path: readonly string[]): T {\n const [key, ...rest] = path;\n\n if (rest.length === 0) {\n if (Object.hasOwn(baseline, key)) return Object.freeze({ ...value, [key]: baseline[key] }) as T;\n\n const { [key]: _removed, ...next } = value;\n\n return Object.freeze(next) as T;\n }\n\n const baselineChild = baseline[key];\n\n if (!isRecord(baselineChild)) {\n if (Object.hasOwn(baseline, key)) return Object.freeze({ ...value, [key]: baselineChild }) as T;\n\n const { [key]: _removed, ...next } = value;\n\n return Object.freeze(next) as T;\n }\n\n const currentChild = isRecord(value[key]) ? value[key] : {};\n\n return Object.freeze({ ...value, [key]: resetAtPath(currentChild, baselineChild, rest) }) as T;\n}\n\nexport function writeMeta(meta: MetaRoot, path: readonly string[], next: boolean): MetaRoot {\n const [key, ...rest] = path;\n const copy: Record<string, MetaTree> = { ...meta };\n\n if (rest.length === 0) {\n if (next) copy[key] = true;\n else delete copy[key];\n } else {\n const child = isRecord(meta[key]) ? (meta[key] as MetaRoot) : {};\n const updated = writeMeta(child, rest, next);\n\n if (Object.keys(updated).length === 0) delete copy[key];\n else copy[key] = updated;\n }\n\n return Object.freeze(copy);\n}\n\nexport function readMeta(meta: MetaRoot, path: readonly string[]): boolean {\n let current: MetaTree | undefined = meta;\n\n for (const key of path) {\n if (!isRecord(current) || !Object.hasOwn(current, key)) return false;\n\n current = current[key] as MetaTree;\n }\n\n return current === true;\n}\n\nexport function touchAll(value: unknown): MetaRoot {\n if (!isRecord(value)) return {};\n\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).map(([key, child]) => [key, isRecord(child) ? touchAll(child) : (true as const)]),\n ),\n );\n}\n\nexport function readError(errors: unknown, path: readonly string[]): string | undefined {\n const error = readAtPath(errors, path);\n\n return typeof error === 'string' ? error : undefined;\n}\n\nexport function normalizeErrors<T>(errors: T): T | undefined {\n if (typeof errors === 'string') return errors;\n\n if (!isRecord(errors)) return undefined;\n\n const entries = Object.entries(errors)\n .map(([key, value]) => [key, normalizeErrors(value)] as const)\n .filter(([, value]) => value !== undefined);\n\n return entries.length === 0 ? undefined : (Object.freeze(Object.fromEntries(entries)) as T);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"path.js","names":[],"sources":["../../src/core/path.ts"],"sourcesContent":["import { ForgeConfigError } from '../errors';\n\nconst unsafeKeys = new Set(['__proto__', 'constructor', 'prototype']);\n\ntype ErrorNode = string | ErrorTree | ErrorArray;\nexport interface ErrorTree {\n readonly [key: string]: ErrorNode;\n}\ntype ErrorArray = ErrorNode[];\ntype MutableErrorTree = Record<string, ErrorNode>;\ntype RecordValue = Record<string, unknown>;\ntype TreeValue = RecordValue | readonly unknown[];\ntype MetaTree = true | MetaNode;\ninterface MetaNode {\n readonly [key: string]: MetaTree;\n}\nexport type MetaRoot = MetaNode;\n\nexport function isRecord(value: unknown): value is RecordValue {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n\n const prototype = Object.getPrototypeOf(value);\n\n return prototype === Object.prototype || prototype === null;\n}\n\nexport function assertSafeKey(key: string): void {\n if (!key || unsafeKeys.has(key)) throw new ForgeConfigError(`Invalid field key '${key}'.`);\n}\n\nfunction isAtomicLeaf(value: unknown): boolean {\n return (\n (typeof Blob !== 'undefined' && value instanceof Blob) ||\n (typeof File !== 'undefined' && value instanceof File) ||\n value instanceof Date\n );\n}\n\nexport function immutable<T>(value: T): T {\n if (Array.isArray(value)) return Object.freeze(value.map(immutable)) as T;\n\n if (value === null || typeof value !== 'object' || isAtomicLeaf(value)) return value;\n\n if (!isRecord(value)) {\n throw new ForgeConfigError(\n 'Form values must contain only plain objects, arrays, Date, File, Blob, or primitive values.',\n );\n }\n\n return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, child]) => [key, immutable(child)]))) as T;\n}\n\nexport function readAtPath<T>(value: unknown, path: readonly (string | number)[]): T | undefined {\n let current: unknown = value;\n\n for (const key of path) {\n if (typeof key === 'number') {\n if (!Array.isArray(current) || key < 0 || key >= current.length) return undefined;\n\n current = current[key];\n } else {\n if (!isRecord(current) || !Object.hasOwn(current, key)) return undefined;\n\n current = current[key];\n }\n }\n\n return current as T | undefined;\n}\n\nexport function hasAtPath(value: unknown, path: readonly (string | number)[]): boolean {\n let current: unknown = value;\n\n for (const key of path) {\n if (typeof key === 'number') {\n if (!Array.isArray(current) || key < 0 || key >= current.length) return false;\n\n current = current[key];\n } else {\n if (!isRecord(current) || !Object.hasOwn(current, key)) return false;\n\n current = current[key];\n }\n }\n\n return true;\n}\n\nexport function writeAtPath<T extends TreeValue>(value: T, path: readonly (string | number)[], next: unknown): T {\n const [key, ...rest] = path;\n\n if (typeof key === 'number') {\n if (!Array.isArray(value)) {\n throw new ForgeConfigError(`Cannot index ${key} because the current value is not an array.`);\n }\n\n if (key < 0 || key >= value.length) {\n throw new ForgeConfigError(`Index ${key} is out of range for array of length ${value.length}.`);\n }\n\n if (rest.length === 0) {\n const copy = [...value];\n\n copy[key] = immutable(next);\n\n return Object.freeze(copy) as T;\n }\n\n const copy = [...value];\n\n copy[key] = writeAtPath(value[key] as TreeValue, rest, next);\n\n return Object.freeze(copy) as T;\n }\n\n assertSafeKey(key);\n\n if (!isRecord(value)) {\n throw new ForgeConfigError(`Cannot select '${key}' because the current value is not an object.`);\n }\n\n if (rest.length === 0) return Object.freeze({ ...value, [key]: immutable(next) }) as T;\n\n const child = value[key];\n\n if (child !== undefined && !isRecord(child) && !Array.isArray(child)) {\n throw new ForgeConfigError(`Cannot select '${key}' because it is not an object or array.`);\n }\n\n const childTree = (child ?? {}) as TreeValue;\n\n return Object.freeze({ ...value, [key]: writeAtPath(childTree, rest, next) }) as T;\n}\n\nexport function resetAtPath<T extends TreeValue>(value: T, baseline: T, path: readonly (string | number)[]): T {\n const [key, ...rest] = path;\n\n if (typeof key === 'number') {\n if (!Array.isArray(value)) return value;\n if (!Array.isArray(baseline) || key >= baseline.length || key >= value.length) return value;\n\n if (rest.length === 0) {\n const copy = [...value];\n\n copy[key] = baseline[key];\n\n return Object.freeze(copy) as T;\n }\n\n const copy = [...value];\n\n copy[key] = resetAtPath(value[key] as TreeValue, baseline[key] as TreeValue, rest);\n\n return Object.freeze(copy) as T;\n }\n\n if (!isRecord(value)) return value;\n\n if (rest.length === 0) {\n if (Object.hasOwn(baseline, key)) return Object.freeze({ ...value, [key]: (baseline as RecordValue)[key] }) as T;\n\n const { [key]: _removed, ...next } = value;\n\n return Object.freeze(next) as T;\n }\n\n const baselineChild = (baseline as RecordValue)[key];\n\n if (!isRecord(baselineChild) && !Array.isArray(baselineChild)) {\n if (Object.hasOwn(baseline, key)) return Object.freeze({ ...value, [key]: baselineChild }) as T;\n\n const { [key]: _removed, ...next } = value;\n\n return Object.freeze(next) as T;\n }\n\n const currentChild = value[key];\n const childTree = (isRecord(currentChild) || Array.isArray(currentChild) ? currentChild : {}) as TreeValue;\n\n return Object.freeze({ ...value, [key]: resetAtPath(childTree, baselineChild as TreeValue, rest) }) as T;\n}\n\nexport function writeMeta(meta: MetaRoot, path: readonly (string | number)[], next: boolean): MetaRoot {\n const [key, ...rest] = path;\n const stringKey = String(key);\n const copy: Record<string, MetaTree> = { ...meta };\n\n if (rest.length === 0) {\n if (next) copy[stringKey] = true;\n else delete copy[stringKey];\n } else {\n const child = isRecord(meta[stringKey]) ? (meta[stringKey] as MetaRoot) : {};\n const updated = writeMeta(child, rest, next);\n\n if (Object.keys(updated).length === 0) delete copy[stringKey];\n else copy[stringKey] = updated;\n }\n\n return Object.freeze(copy);\n}\n\nexport function readMeta(meta: MetaRoot, path: readonly (string | number)[]): boolean {\n let current: MetaTree | undefined = meta;\n\n for (const key of path) {\n const stringKey = String(key);\n\n if (!isRecord(current) || !Object.hasOwn(current, stringKey)) return false;\n\n current = current[stringKey] as MetaTree;\n }\n\n return current === true;\n}\n\nexport function touchAll(value: unknown): MetaRoot {\n if (Array.isArray(value)) {\n return Object.freeze(\n Object.fromEntries(\n value.map((child, i) => [\n String(i),\n isRecord(child) || Array.isArray(child) ? touchAll(child) : (true as const),\n ]),\n ),\n );\n }\n\n if (!isRecord(value)) return {};\n\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).map(([key, child]) => [\n key,\n isRecord(child) || Array.isArray(child) ? touchAll(child) : (true as const),\n ]),\n ),\n );\n}\n\nexport function readError(errors: unknown, path: readonly (string | number)[]): string | undefined {\n const error = readAtPath(errors, path);\n\n return typeof error === 'string' ? error : undefined;\n}\n\nfunction writeErrorNode(\n node: ErrorTree | ErrorArray | undefined,\n path: readonly (string | number)[],\n message: string,\n): ErrorTree | ErrorArray {\n const [key, ...rest] = path;\n\n if (typeof key === 'number') {\n const arr: ErrorNode[] = Array.isArray(node) ? [...node] : [];\n\n if (rest.length === 0) {\n if (arr[key] === undefined) arr[key] = message;\n } else {\n arr[key] = writeErrorNode(arr[key] as ErrorTree | ErrorArray | undefined, rest, message);\n }\n\n return arr;\n }\n\n if (!key || unsafeKeys.has(key)) return node ?? {};\n\n const record: MutableErrorTree = isRecord(node) ? { ...node } : {};\n\n if (rest.length === 0) {\n if (record[key] === undefined) record[key] = message;\n } else {\n record[key] = writeErrorNode(record[key] as ErrorTree | ErrorArray | undefined, rest, message);\n }\n\n return record;\n}\n\nexport function writeError(tree: ErrorTree, path: readonly (string | number)[], message: string): ErrorTree {\n const result = writeErrorNode(tree, path, message);\n\n return isRecord(result) ? result : tree;\n}\n\nexport function normalizeErrors<T>(errors: T): T | undefined {\n if (typeof errors === 'string') return errors;\n\n if (Array.isArray(errors)) {\n const normalized = errors.map((item) => normalizeErrors(item));\n\n if (normalized.every((value) => value === undefined)) return undefined;\n\n return Object.freeze(normalized) as T;\n }\n\n if (!isRecord(errors)) return undefined;\n\n const entries = Object.entries(errors)\n .map(([key, value]) => [key, normalizeErrors(value)] as const)\n .filter(([, value]) => value !== undefined);\n\n return entries.length === 0 ? undefined : (Object.freeze(Object.fromEntries(entries)) as T);\n}\n"],"mappings":"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"}
|