vultus-core 0.3.0 → 0.5.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 +319 -4
- package/dist/ArgStoreContext.d.ts +10 -0
- package/dist/ArgStoreContext.d.ts.map +1 -0
- package/dist/ArgStoreContext.js +15 -0
- package/dist/ArgStoreContext.js.map +1 -0
- package/dist/Components.d.ts +30 -0
- package/dist/Components.d.ts.map +1 -0
- package/dist/Components.js +28 -0
- package/dist/Components.js.map +1 -0
- package/dist/FieldContext.d.ts +38 -0
- package/dist/FieldContext.d.ts.map +1 -0
- package/dist/FieldContext.js +82 -0
- package/dist/FieldContext.js.map +1 -0
- package/dist/argStore.d.ts +26 -0
- package/dist/argStore.d.ts.map +1 -0
- package/dist/argStore.js +27 -0
- package/dist/argStore.js.map +1 -0
- package/dist/choices.d.ts +43 -0
- package/dist/choices.d.ts.map +1 -0
- package/dist/choices.js +20 -0
- package/dist/choices.js.map +1 -0
- package/dist/field.d.ts +42 -15
- package/dist/field.d.ts.map +1 -1
- package/dist/field.js +20 -7
- package/dist/field.js.map +1 -1
- package/dist/index.d.ts +22 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -3
- package/dist/index.js.map +1 -1
- package/dist/kinds.d.ts +51 -0
- package/dist/kinds.d.ts.map +1 -0
- package/dist/kinds.js +143 -0
- package/dist/kinds.js.map +1 -0
- package/dist/localStorageStore.d.ts +16 -0
- package/dist/localStorageStore.d.ts.map +1 -0
- package/dist/localStorageStore.js +72 -0
- package/dist/localStorageStore.js.map +1 -0
- package/dist/normalizeText.d.ts +6 -0
- package/dist/normalizeText.d.ts.map +1 -0
- package/dist/normalizeText.js +8 -0
- package/dist/normalizeText.js.map +1 -0
- package/dist/numeric.d.ts +38 -0
- package/dist/numeric.d.ts.map +1 -0
- package/dist/numeric.js +43 -0
- package/dist/numeric.js.map +1 -0
- package/dist/resolve.d.ts +13 -0
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +25 -0
- package/dist/resolve.js.map +1 -1
- package/dist/tree.d.ts +69 -0
- package/dist/tree.d.ts.map +1 -0
- package/dist/tree.js +151 -0
- package/dist/tree.js.map +1 -0
- package/dist/types.d.ts +15 -7
- package/dist/types.d.ts.map +1 -1
- package/dist/useArg.d.ts +45 -0
- package/dist/useArg.d.ts.map +1 -0
- package/dist/useArg.js +83 -0
- package/dist/useArg.js.map +1 -0
- package/dist/useBoolField.d.ts +8 -3
- package/dist/useBoolField.d.ts.map +1 -1
- package/dist/useBoolField.js +9 -1
- package/dist/useBoolField.js.map +1 -1
- package/dist/useManyOfField.d.ts +35 -0
- package/dist/useManyOfField.d.ts.map +1 -0
- package/dist/useManyOfField.js +74 -0
- package/dist/useManyOfField.js.map +1 -0
- package/dist/useMixedBoolField.d.ts +8 -3
- package/dist/useMixedBoolField.d.ts.map +1 -1
- package/dist/useMixedBoolField.js +9 -1
- package/dist/useMixedBoolField.js.map +1 -1
- package/dist/useNumericField.d.ts +25 -0
- package/dist/useNumericField.d.ts.map +1 -0
- package/dist/useNumericField.js +52 -0
- package/dist/useNumericField.js.map +1 -0
- package/dist/useOneOfField.d.ts +18 -34
- package/dist/useOneOfField.d.ts.map +1 -1
- package/dist/useOneOfField.js +18 -18
- package/dist/useOneOfField.js.map +1 -1
- package/dist/useRangeField.d.ts +34 -0
- package/dist/useRangeField.d.ts.map +1 -0
- package/dist/useRangeField.js +63 -0
- package/dist/useRangeField.js.map +1 -0
- package/dist/useStoredField.d.ts +61 -0
- package/dist/useStoredField.d.ts.map +1 -0
- package/dist/useStoredField.js +151 -0
- package/dist/useStoredField.js.map +1 -0
- package/dist/useTextField.d.ts +22 -0
- package/dist/useTextField.d.ts.map +1 -0
- package/dist/useTextField.js +21 -0
- package/dist/useTextField.js.map +1 -0
- package/dist/useTreeField.d.ts +39 -0
- package/dist/useTreeField.d.ts.map +1 -0
- package/dist/useTreeField.js +66 -0
- package/dist/useTreeField.js.map +1 -0
- package/dist/valueTypes.d.ts +28 -0
- package/dist/valueTypes.d.ts.map +1 -0
- package/dist/valueTypes.js +65 -0
- package/dist/valueTypes.js.map +1 -0
- package/package.json +1 -1
- package/src/ArgStoreContext.tsx +16 -0
- package/src/Components.tsx +47 -0
- package/src/FieldContext.tsx +98 -0
- package/src/argStore.ts +49 -0
- package/src/choices.ts +62 -0
- package/src/field.ts +64 -25
- package/src/index.ts +54 -4
- package/src/kinds.ts +197 -0
- package/src/localStorageStore.ts +68 -0
- package/src/normalizeText.ts +7 -0
- package/src/numeric.ts +68 -0
- package/src/resolve.ts +23 -0
- package/src/tree.ts +175 -0
- package/src/types.ts +28 -7
- package/src/useArg.ts +121 -0
- package/src/useBoolField.ts +19 -6
- package/src/useManyOfField.ts +107 -0
- package/src/useMixedBoolField.ts +19 -6
- package/src/useNumericField.ts +69 -0
- package/src/useOneOfField.ts +38 -58
- package/src/useRangeField.ts +86 -0
- package/src/useStoredField.ts +205 -0
- package/src/useTextField.ts +39 -0
- package/src/useTreeField.ts +108 -0
- package/src/valueTypes.ts +77 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { Decision } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* One choice of a one-of or many-of field, or a tree node (moxb's
|
|
5
|
+
* BindOneOfChoice). Shared by useOneOfField today; useManyOfField and the
|
|
6
|
+
* tree hook (later tasks) build on the same shape.
|
|
7
|
+
*/
|
|
8
|
+
export interface OneOfChoice<T extends string = string> {
|
|
9
|
+
value: T;
|
|
10
|
+
/** Shown for the choice; default: the value. */
|
|
11
|
+
label?: string;
|
|
12
|
+
/** What choosing it does (moxb's `help`), markdown; also the field's current state when it is chosen. */
|
|
13
|
+
description?: string;
|
|
14
|
+
/** Shown before the label (or instead of it, for an icon-only widget), like an action's icon. */
|
|
15
|
+
icon?: ReactNode;
|
|
16
|
+
/** Choosable? Default true, optionally with a reason. Use `enabled` or `disabled`, not contradicting each other. */
|
|
17
|
+
enabled?: Decision;
|
|
18
|
+
disabled?: Decision;
|
|
19
|
+
/** Shown as the main or a dangerous choice, like an action's variant. Default 'default'. */
|
|
20
|
+
variant?: 'default' | 'primary' | 'danger';
|
|
21
|
+
/** A heading the choice is listed under, after the choices without one (OneOfSelect); default none. */
|
|
22
|
+
group?: string;
|
|
23
|
+
/** Shown after the label in secondary colour, e.g. a count ("12", "12 · 8%"). Default none. */
|
|
24
|
+
note?: string;
|
|
25
|
+
/** Shown faded, e.g. a choice with nothing behind it right now (no matching tasks). Default false. */
|
|
26
|
+
dimmed?: boolean;
|
|
27
|
+
}
|
|
28
|
+
/** A choice as the widgets get it. */
|
|
29
|
+
export interface OneOfChoiceControls<T extends string = string> {
|
|
30
|
+
value: T;
|
|
31
|
+
label: string;
|
|
32
|
+
description: string | undefined;
|
|
33
|
+
icon: ReactNode | undefined;
|
|
34
|
+
enabled: boolean;
|
|
35
|
+
whyDisabled: string | undefined;
|
|
36
|
+
variant: 'default' | 'primary' | 'danger';
|
|
37
|
+
group: string | undefined;
|
|
38
|
+
note: string | undefined;
|
|
39
|
+
dimmed: boolean;
|
|
40
|
+
}
|
|
41
|
+
/** Resolves a choice's `enabled` / `disabled` and defaults, as useOneOfField does for each of its choices. */
|
|
42
|
+
export declare function resolveChoice<T extends string>(fieldId: string, choice: OneOfChoice<T>): OneOfChoiceControls<T>;
|
|
43
|
+
//# sourceMappingURL=choices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choices.d.ts","sourceRoot":"","sources":["../src/choices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;GAIG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IACpD,KAAK,EAAE,CAAC,CAAC;IACT,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yGAAyG;IACzG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iGAAiG;IACjG,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oHAAoH;IACpH,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,4FAA4F;IAC5F,OAAO,CAAC,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC3C,uGAAuG;IACvG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sGAAsG;IACtG,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,sCAAsC;AACtC,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM;IAC5D,KAAK,EAAE,CAAC,CAAC;IACT,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC1C,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,8GAA8G;AAC9G,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAe/G"}
|
package/dist/choices.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { calculateEnabled } from './field.js';
|
|
2
|
+
import { getReason, getVerdict } from './decision.js';
|
|
3
|
+
/** Resolves a choice's `enabled` / `disabled` and defaults, as useOneOfField does for each of its choices. */
|
|
4
|
+
export function resolveChoice(fieldId, choice) {
|
|
5
|
+
const decision = calculateEnabled(`${fieldId}.${choice.value}`, choice.enabled, choice.disabled);
|
|
6
|
+
const enabled = getVerdict(decision, true);
|
|
7
|
+
return {
|
|
8
|
+
value: choice.value,
|
|
9
|
+
label: choice.label ?? choice.value,
|
|
10
|
+
description: choice.description,
|
|
11
|
+
icon: choice.icon,
|
|
12
|
+
enabled,
|
|
13
|
+
whyDisabled: enabled ? undefined : getReason(decision),
|
|
14
|
+
variant: choice.variant ?? 'default',
|
|
15
|
+
group: choice.group,
|
|
16
|
+
note: choice.note,
|
|
17
|
+
dimmed: choice.dimmed ?? false,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=choices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"choices.js","sourceRoot":"","sources":["../src/choices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AA2CtD,8GAA8G;AAC9G,MAAM,UAAU,aAAa,CAAmB,OAAe,EAAE,MAAsB;IACrF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjG,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3C,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK;QACnC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO;QACP,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC;QACtD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,SAAS;QACpC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK;KAC/B,CAAC;AACJ,CAAC"}
|
package/dist/field.d.ts
CHANGED
|
@@ -8,6 +8,13 @@ import type { ConfirmationSpec, Decision, ErrorRoutesRegistry, ExecutionContext,
|
|
|
8
8
|
* immediate commit (`commit`), whose setter runs as an action.
|
|
9
9
|
* Design notes: unitas docs/2026-10-05-vultus-field-model-design.md.
|
|
10
10
|
*/
|
|
11
|
+
/** The field kinds (FieldControls.type and a FieldDefinition's `kind`). */
|
|
12
|
+
export type FieldKind = 'boolean' | 'mixed-boolean' | 'oneOf' | 'manyOf' | 'numeric' | 'range' | 'tree' | 'text';
|
|
13
|
+
/** The widget to render a field with: a name, or a name with display options overriding its defaults. */
|
|
14
|
+
export type WidgetHint = string | {
|
|
15
|
+
name: string;
|
|
16
|
+
[option: string]: unknown;
|
|
17
|
+
};
|
|
11
18
|
/** How an immediately committing field stores a change: an action that receives the requested value. */
|
|
12
19
|
export interface FieldCommit<TRequest, RouteId extends string = string> {
|
|
13
20
|
fire: (next: TRequest, ctx: ExecutionContext) => Promise<void> | void;
|
|
@@ -17,16 +24,30 @@ export interface FieldCommit<TRequest, RouteId extends string = string> {
|
|
|
17
24
|
}
|
|
18
25
|
/** The key of a value in `valueDescriptions`: 'true' / 'false' for booleans, the value itself for strings. */
|
|
19
26
|
export type ValueKey<T> = T extends boolean ? `${T}` : T extends string | number ? `${T}` : never;
|
|
20
|
-
|
|
27
|
+
/**
|
|
28
|
+
* What every field has, whatever its storage. `Ctx` is the field context the options' functions
|
|
29
|
+
* receive (see FieldContextProvider); a function without parameters needs none.
|
|
30
|
+
*/
|
|
31
|
+
export interface FieldBaseOptions<TValue, Ctx = any> {
|
|
21
32
|
id: string;
|
|
22
|
-
|
|
23
|
-
|
|
33
|
+
/**
|
|
34
|
+
* The field's kind, as a FieldDefinition carries it (optional here: a hook knows its own
|
|
35
|
+
* kind). Given and different from the hook's own kind, it throws — a defence against passing
|
|
36
|
+
* the wrong definition to a kind-specific hook.
|
|
37
|
+
*/
|
|
38
|
+
kind?: FieldKind;
|
|
39
|
+
label?: ValueOrFn<string, Ctx>;
|
|
40
|
+
description?: ValueOrFn<string | undefined, Ctx>;
|
|
41
|
+
/** Shown while the field is empty (moxb's Value); a widget that has no notion of "empty" ignores it. */
|
|
42
|
+
placeholder?: ValueOrFn<string | undefined, Ctx>;
|
|
43
|
+
/** The widget to render this field with: a name, or a name with its display options. Each kind has a default; vultus-antd's `<Field>` applies render-site overrides on top of this. */
|
|
44
|
+
widget?: WidgetHint;
|
|
24
45
|
/** Shown? Default true. Use `visible` or `hidden`, not contradicting each other. */
|
|
25
|
-
visible?: ValueOrFn<boolean>;
|
|
26
|
-
hidden?: ValueOrFn<boolean>;
|
|
46
|
+
visible?: ValueOrFn<boolean, Ctx>;
|
|
47
|
+
hidden?: ValueOrFn<boolean, Ctx>;
|
|
27
48
|
/** Changeable? Default true, optionally with a reason. Use `enabled` or `disabled`, not contradicting each other. */
|
|
28
|
-
enabled?: ValueOrFn<Decision>;
|
|
29
|
-
disabled?: ValueOrFn<Decision>;
|
|
49
|
+
enabled?: ValueOrFn<Decision, Ctx>;
|
|
50
|
+
disabled?: ValueOrFn<Decision, Ctx>;
|
|
30
51
|
/**
|
|
31
52
|
* What each value means right now, keyed by value (for booleans `true` / `false`, and `mixed`
|
|
32
53
|
* where the field can show it). Shown with the current value, next to `description`, which
|
|
@@ -39,10 +60,10 @@ interface FieldBaseOptions<TValue> {
|
|
|
39
60
|
* `TValue` and can be asked for a `TRequest`; usually the same type, but an aggregate can show
|
|
40
61
|
* a state that cannot be requested (a boolean field showing 'mixed').
|
|
41
62
|
*/
|
|
42
|
-
export type FieldStorage<TValue, TRequest = TValue, RouteId extends string = string> =
|
|
43
|
-
/** Inside the field: its own state, starting at `initialValue
|
|
63
|
+
export type FieldStorage<TValue, TRequest = TValue, RouteId extends string = string, Ctx = any> =
|
|
64
|
+
/** Inside the field: its own state, starting at `initialValue` (resolved once, when the field mounts). */
|
|
44
65
|
{
|
|
45
|
-
initialValue?: TValue
|
|
66
|
+
initialValue?: ValueOrFn<TValue, Ctx>;
|
|
46
67
|
value?: never;
|
|
47
68
|
onChange?: never;
|
|
48
69
|
commit?: never;
|
|
@@ -61,13 +82,14 @@ export type FieldStorage<TValue, TRequest = TValue, RouteId extends string = str
|
|
|
61
82
|
initialValue?: never;
|
|
62
83
|
onChange?: never;
|
|
63
84
|
};
|
|
64
|
-
export type FieldOptions<TValue, TRequest = TValue, RouteId extends string = string> = FieldBaseOptions<TValue> & FieldStorage<TValue, TRequest, RouteId>;
|
|
85
|
+
export type FieldOptions<TValue, TRequest = TValue, RouteId extends string = string, Ctx = any> = FieldBaseOptions<TValue, Ctx> & FieldStorage<TValue, TRequest, RouteId, Ctx>;
|
|
65
86
|
/** What a field widget receives: everything it shows, and the one way to change the value. */
|
|
66
87
|
export interface FieldControls<TValue, TRequest = TValue> {
|
|
67
|
-
type:
|
|
88
|
+
type: FieldKind;
|
|
68
89
|
id: string;
|
|
69
90
|
label: string;
|
|
70
91
|
description: string | undefined;
|
|
92
|
+
placeholder: string | undefined;
|
|
71
93
|
/** What the current value means (from `valueDescriptions`). */
|
|
72
94
|
valueDescription: string | undefined;
|
|
73
95
|
visible: boolean;
|
|
@@ -78,10 +100,13 @@ export interface FieldControls<TValue, TRequest = TValue> {
|
|
|
78
100
|
setValue(next: TRequest): void;
|
|
79
101
|
/** A commit is running. */
|
|
80
102
|
pending: boolean;
|
|
103
|
+
/** The field stores through `commit` — true exactly in commit storage mode, so a widget can hold back requests while typing. */
|
|
104
|
+
commits: boolean;
|
|
81
105
|
/** Messages of the last commit. */
|
|
82
106
|
messages: Message[];
|
|
83
107
|
/** The confirmation a widget must obtain before requesting `next`, if any. */
|
|
84
108
|
confirmationFor(next: TRequest): ConfirmationSpec | undefined;
|
|
109
|
+
widget: WidgetHint | undefined;
|
|
85
110
|
}
|
|
86
111
|
export type FieldStorageMode = 'inside' | 'local' | 'commit';
|
|
87
112
|
export declare function fieldStorageMode(id: string, opts: FieldStorage<unknown, unknown, string>): FieldStorageMode;
|
|
@@ -90,8 +115,10 @@ export declare function calculateEnabled(id: string, enabled: Decision | undefin
|
|
|
90
115
|
/**
|
|
91
116
|
* The shared core of every field hook: label and description, visibility and
|
|
92
117
|
* enabled state (with reason), the storage mode, and in commit mode the setter
|
|
93
|
-
* as an action (its pending state and messages become the field's).
|
|
118
|
+
* as an action (its pending state and messages become the field's). Functions
|
|
119
|
+
* among the options are resolved with the field context, on every render;
|
|
120
|
+
* `initialValue` once, when the field mounts. A kind's hook passes its implicit
|
|
121
|
+
* initial value as a zero-argument function, so that too is computed only then.
|
|
94
122
|
*/
|
|
95
|
-
export declare function useFieldCore<TValue, TRequest extends TValue = TValue, RouteId extends string = string>(type:
|
|
96
|
-
export {};
|
|
123
|
+
export declare function useFieldCore<TValue, TRequest extends TValue = TValue, RouteId extends string = string, Ctx = any>(type: FieldKind, opts: FieldOptions<TValue, TRequest, RouteId, Ctx>, registry?: ErrorRoutesRegistry<RouteId>): FieldControls<TValue, TRequest>;
|
|
97
124
|
//# sourceMappingURL=field.d.ts.map
|
package/dist/field.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"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"}
|
package/dist/field.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { useState } from 'react';
|
|
2
2
|
import { getReason, getVerdict, invertDecision } from './decision.js';
|
|
3
|
-
import {
|
|
3
|
+
import { useFieldContext } from './FieldContext.js';
|
|
4
|
+
import { resolveIn } from './resolve.js';
|
|
4
5
|
import { useAction } from './useAction.js';
|
|
5
6
|
export function fieldStorageMode(id, opts) {
|
|
6
7
|
const { initialValue, value, onChange, commit } = opts;
|
|
@@ -37,15 +38,24 @@ export function calculateEnabled(id, enabled, disabled) {
|
|
|
37
38
|
/**
|
|
38
39
|
* The shared core of every field hook: label and description, visibility and
|
|
39
40
|
* enabled state (with reason), the storage mode, and in commit mode the setter
|
|
40
|
-
* as an action (its pending state and messages become the field's).
|
|
41
|
+
* as an action (its pending state and messages become the field's). Functions
|
|
42
|
+
* among the options are resolved with the field context, on every render;
|
|
43
|
+
* `initialValue` once, when the field mounts. A kind's hook passes its implicit
|
|
44
|
+
* initial value as a zero-argument function, so that too is computed only then.
|
|
41
45
|
*/
|
|
42
46
|
export function useFieldCore(type, opts, registry) {
|
|
47
|
+
if (opts.kind !== undefined && opts.kind !== type) {
|
|
48
|
+
throw new Error(`Field '${opts.id}': a definition of kind '${opts.kind}' was passed to the '${type}' hook`);
|
|
49
|
+
}
|
|
43
50
|
const mode = fieldStorageMode(opts.id, opts);
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
const
|
|
51
|
+
const ctx = useFieldContext();
|
|
52
|
+
const where = (name) => `Field '${opts.id}': option '${name}'`;
|
|
53
|
+
const [inner, setInner] = useState(() => resolveIn(opts.initialValue, undefined, ctx, where('initialValue')));
|
|
54
|
+
const label = resolveIn(opts.label, '', ctx, where('label'));
|
|
55
|
+
const description = resolveIn(opts.description, undefined, ctx, where('description'));
|
|
56
|
+
const placeholder = resolveIn(opts.placeholder, undefined, ctx, where('placeholder'));
|
|
57
|
+
const visible = calculateVisible(opts.id, resolveIn(opts.visible, undefined, ctx, where('visible')), resolveIn(opts.hidden, undefined, ctx, where('hidden')));
|
|
58
|
+
const enabledDecision = calculateEnabled(opts.id, resolveIn(opts.enabled, undefined, ctx, where('enabled')), resolveIn(opts.disabled, undefined, ctx, where('disabled')));
|
|
49
59
|
const enabled = getVerdict(enabledDecision, true);
|
|
50
60
|
const whyDisabled = enabled ? undefined : getReason(enabledDecision);
|
|
51
61
|
// Hooks run unconditionally; the setter action is only fired in commit mode.
|
|
@@ -81,6 +91,7 @@ export function useFieldCore(type, opts, registry) {
|
|
|
81
91
|
id: opts.id,
|
|
82
92
|
label,
|
|
83
93
|
description,
|
|
94
|
+
placeholder,
|
|
84
95
|
valueDescription,
|
|
85
96
|
visible,
|
|
86
97
|
enabled,
|
|
@@ -88,8 +99,10 @@ export function useFieldCore(type, opts, registry) {
|
|
|
88
99
|
value,
|
|
89
100
|
setValue,
|
|
90
101
|
pending,
|
|
102
|
+
commits: mode === 'commit',
|
|
91
103
|
messages: mode === 'commit' ? (setter.messages ?? []) : [],
|
|
92
104
|
confirmationFor,
|
|
105
|
+
widget: opts.widget,
|
|
93
106
|
};
|
|
94
107
|
}
|
|
95
108
|
//# sourceMappingURL=field.js.map
|
package/dist/field.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field.js","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"field.js","sourceRoot":"","sources":["../src/field.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,10 +6,28 @@ export * from './routeApiError.js';
|
|
|
6
6
|
export { ActionErrorContext, useActionErrorCtx } from './useActionErrorCtx.js';
|
|
7
7
|
export { useAction } from './useAction.js';
|
|
8
8
|
export { useActionList } from './useActionList.js';
|
|
9
|
-
export {
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
9
|
+
export { FieldContextProvider, createFieldContext, useFieldContext, NO_FIELD_CONTEXT, type FieldCtx, } from './FieldContext.js';
|
|
10
|
+
export { useFieldCore, fieldStorageMode, calculateVisible, calculateEnabled, type FieldBaseOptions, type FieldCommit, type FieldControls, type FieldOptions, type FieldStorage, type FieldStorageMode, type FieldKind, type WidgetHint, type ValueKey, } from './field.js';
|
|
11
|
+
export { resolveChoice, type OneOfChoice, type OneOfChoiceControls } from './choices.js';
|
|
12
|
+
export { normalizeText } from './normalizeText.js';
|
|
13
|
+
export { useBoolField, boolInitialValue, type BoolFieldControls, type BoolFieldOptions } from './useBoolField.js';
|
|
14
|
+
export { useMixedBoolField, aggregateBool, mixedBoolInitialValue, type MixedBool, type MixedBoolFieldControls, type MixedBoolFieldOptions, } from './useMixedBoolField.js';
|
|
15
|
+
export { useOneOfField, oneOfInitialValue, type OneOfFieldControls, type OneOfFieldOptions, type OneOfOwnOptions, } from './useOneOfField.js';
|
|
16
|
+
export { useManyOfField, manyOfInitialValue, type ManyOfFieldControls, type ManyOfFieldOptions, type ManyOfOwnOptions, type ManyOfChoiceControls, } from './useManyOfField.js';
|
|
17
|
+
export { clamp, resolveNumeric, type NumericBounds, type ResolvedNumeric } from './numeric.js';
|
|
18
|
+
export { useNumericField, numericInitialValue, type NumericFieldControls, type NumericFieldOptions, type NumericOwnOptions, } from './useNumericField.js';
|
|
19
|
+
export { useRangeField, rangeInitialValue, type NumberRange, type RangeFieldControls, type RangeFieldOptions, type RangeOwnOptions, } from './useRangeField.js';
|
|
20
|
+
export { normalizeTreeValue, coveredNodes, toggleTreeValue, expandedTreeKeys, filterTree, type TreeNode, type TreeNodeControls, type TreeSelection, type TreeExpand, } from './tree.js';
|
|
21
|
+
export { useTreeField, treeInitialValue, type TreeFieldControls, type TreeFieldOptions, type TreeOwnOptions, } from './useTreeField.js';
|
|
22
|
+
export { useTextField, textInitialValue, type TextFieldControls, type TextFieldOptions, type TextOwnOptions, } from './useTextField.js';
|
|
23
|
+
export { booleanType, stringType, stringSetType, numberType, rangeType, type ValueType, } from './valueTypes.js';
|
|
24
|
+
export { initialValueOf, valueTypeOf, sanitizeStored, type FieldDefinition } from './kinds.js';
|
|
25
|
+
export { memoryStore, type ArgStore, type RawChange, type UpdateMethod } from './argStore.js';
|
|
26
|
+
export { localStorageStore } from './localStorageStore.js';
|
|
27
|
+
export { ArgStoreProvider, useArgStore } from './ArgStoreContext.js';
|
|
28
|
+
export { useArg, useArgWriter, setArg, resetArg, type ArgDefinition, type ArgControls, type ArgChange, } from './useArg.js';
|
|
29
|
+
export { argOf, useStoredField, useStoredFields, type StoredField, type StoredFields, } from './useStoredField.js';
|
|
13
30
|
export { InternalLinkContext, useInternalLink, type InternalLinkComponent } from './LinkContext.js';
|
|
14
31
|
export { MessageSinkContext, useMessageSink, type MessageSink } from './MessageSink.js';
|
|
32
|
+
export { VultusComponentsContext, useVultusComponents, SpinnerScope, useSpinnerKey, type VultusComponents, type SpinnerProps, type SpinnerComponent, } from './Components.js';
|
|
15
33
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,EAClE,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,KAAK,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -6,10 +6,28 @@ export * from './routeApiError.js';
|
|
|
6
6
|
export { ActionErrorContext, useActionErrorCtx } from './useActionErrorCtx.js';
|
|
7
7
|
export { useAction } from './useAction.js';
|
|
8
8
|
export { useActionList } from './useActionList.js';
|
|
9
|
+
export { FieldContextProvider, createFieldContext, useFieldContext, NO_FIELD_CONTEXT, } from './FieldContext.js';
|
|
9
10
|
export { useFieldCore, fieldStorageMode, calculateVisible, calculateEnabled, } from './field.js';
|
|
10
|
-
export {
|
|
11
|
-
export {
|
|
12
|
-
export {
|
|
11
|
+
export { resolveChoice } from './choices.js';
|
|
12
|
+
export { normalizeText } from './normalizeText.js';
|
|
13
|
+
export { useBoolField, boolInitialValue } from './useBoolField.js';
|
|
14
|
+
export { useMixedBoolField, aggregateBool, mixedBoolInitialValue, } from './useMixedBoolField.js';
|
|
15
|
+
export { useOneOfField, oneOfInitialValue, } from './useOneOfField.js';
|
|
16
|
+
export { useManyOfField, manyOfInitialValue, } from './useManyOfField.js';
|
|
17
|
+
export { clamp, resolveNumeric } from './numeric.js';
|
|
18
|
+
export { useNumericField, numericInitialValue, } from './useNumericField.js';
|
|
19
|
+
export { useRangeField, rangeInitialValue, } from './useRangeField.js';
|
|
20
|
+
export { normalizeTreeValue, coveredNodes, toggleTreeValue, expandedTreeKeys, filterTree, } from './tree.js';
|
|
21
|
+
export { useTreeField, treeInitialValue, } from './useTreeField.js';
|
|
22
|
+
export { useTextField, textInitialValue, } from './useTextField.js';
|
|
23
|
+
export { booleanType, stringType, stringSetType, numberType, rangeType, } from './valueTypes.js';
|
|
24
|
+
export { initialValueOf, valueTypeOf, sanitizeStored } from './kinds.js';
|
|
25
|
+
export { memoryStore } from './argStore.js';
|
|
26
|
+
export { localStorageStore } from './localStorageStore.js';
|
|
27
|
+
export { ArgStoreProvider, useArgStore } from './ArgStoreContext.js';
|
|
28
|
+
export { useArg, useArgWriter, setArg, resetArg, } from './useArg.js';
|
|
29
|
+
export { argOf, useStoredField, useStoredFields, } from './useStoredField.js';
|
|
13
30
|
export { InternalLinkContext, useInternalLink } from './LinkContext.js';
|
|
14
31
|
export { MessageSinkContext, useMessageSink } from './MessageSink.js';
|
|
32
|
+
export { VultusComponentsContext, useVultusComponents, SpinnerScope, useSpinnerKey, } from './Components.js';
|
|
15
33
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EACL,oBAAoB,EAAE,kBAAkB,EAAE,eAAe,EAAE,gBAAgB,GAC5E,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,gBAAgB,GAGnE,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAA8C,MAAM,cAAc,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAiD,MAAM,mBAAmB,CAAC;AAClH,OAAO,EACL,iBAAiB,EAAE,aAAa,EAAE,qBAAqB,GAExD,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,aAAa,EAAE,iBAAiB,GACjC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,cAAc,EAAE,kBAAkB,GAEnC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,cAAc,EAA4C,MAAM,cAAc,CAAC;AAC/F,OAAO,EACL,eAAe,EAAE,mBAAmB,GAErC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,aAAa,EAAE,iBAAiB,GAEjC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,UAAU,GAEhF,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,YAAY,EAAE,gBAAgB,GAE/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EAAE,gBAAgB,GAE/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,GAC9D,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAwB,MAAM,YAAY,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAoD,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EACL,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,GAEvC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,EAAE,cAAc,EAAE,eAAe,GACvC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAA8B,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAoB,MAAM,kBAAkB,CAAC;AACxF,OAAO,EACL,uBAAuB,EAAE,mBAAmB,EAAE,YAAY,EAAE,aAAa,GAE1E,MAAM,iBAAiB,CAAC"}
|
package/dist/kinds.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { FieldBaseOptions, FieldKind } from './field.js';
|
|
2
|
+
import type { FieldCtx } from './FieldContext.js';
|
|
3
|
+
import type { ValueOrFn } from './types.js';
|
|
4
|
+
import { type ManyOfOwnOptions } from './useManyOfField.js';
|
|
5
|
+
import { type MixedBool } from './useMixedBoolField.js';
|
|
6
|
+
import { type NumericOwnOptions } from './useNumericField.js';
|
|
7
|
+
import { type OneOfOwnOptions } from './useOneOfField.js';
|
|
8
|
+
import { type NumberRange, type RangeOwnOptions } from './useRangeField.js';
|
|
9
|
+
import { type TextOwnOptions } from './useTextField.js';
|
|
10
|
+
import { type TreeOwnOptions } from './useTreeField.js';
|
|
11
|
+
import { type ValueType } from './valueTypes.js';
|
|
12
|
+
/**
|
|
13
|
+
* A definition of kind `K`: the kind's hook options in their inside form, with `kind` required.
|
|
14
|
+
* It has no `value`, `onChange` or `commit`: where the value lives is chosen by whoever runs the
|
|
15
|
+
* field, and a store holds the definition's initial value as its default.
|
|
16
|
+
*/
|
|
17
|
+
type Definition<K extends FieldKind, V, Own, Ctx> = {
|
|
18
|
+
kind: K;
|
|
19
|
+
} & FieldBaseOptions<V, Ctx> & {
|
|
20
|
+
initialValue?: ValueOrFn<V, Ctx>;
|
|
21
|
+
} & Own;
|
|
22
|
+
/**
|
|
23
|
+
* A field as plain data (a module's filters, a dialog's options), tagged by its kind. Narrowed
|
|
24
|
+
* by `kind`, a definition is its kind's hook options as they are: `useOneOfField(definition)`.
|
|
25
|
+
* Its functions receive the field context `Ctx` (see FieldContextProvider).
|
|
26
|
+
*/
|
|
27
|
+
export type FieldDefinition<Ctx = any> = Definition<'boolean', boolean, {}, Ctx> | Definition<'mixed-boolean', MixedBool, {}, Ctx> | Definition<'oneOf', string, OneOfOwnOptions<string, Ctx>, Ctx> | Definition<'manyOf', string[], ManyOfOwnOptions<string, Ctx>, Ctx> | Definition<'numeric', number, NumericOwnOptions<Ctx>, Ctx> | Definition<'range', NumberRange, RangeOwnOptions<Ctx>, Ctx> | Definition<'tree', string[], TreeOwnOptions<string, Ctx>, Ctx> | Definition<'text', string, TextOwnOptions, Ctx>;
|
|
28
|
+
/**
|
|
29
|
+
* A definition's default: `initialValue` resolved with the field context, else its kind's
|
|
30
|
+
* implicit initial value (false; the first enabled choice; the empty list; `min`, or 0, clamped
|
|
31
|
+
* into the bounds; `[min, max]`; the empty string). A tree's comes normalized under its
|
|
32
|
+
* selection, as the hook shows it, so a value equal to what the field shows by default is equal
|
|
33
|
+
* to the default too. It is what a store falls back to, what a reset restores, and what "is it
|
|
34
|
+
* set?" compares against; the kind's hook starts at the same value.
|
|
35
|
+
*/
|
|
36
|
+
export declare function initialValueOf(definition: FieldDefinition, ctx: FieldCtx): unknown;
|
|
37
|
+
/** How a kind's value is kept in a store. A mixed-boolean field shows an aggregate of other data, so it has none and throws. */
|
|
38
|
+
export declare function valueTypeOf(kind: FieldKind): ValueType<any>;
|
|
39
|
+
/**
|
|
40
|
+
* A stored value (already parsed by the kind's value type) made fit for the definition as it is
|
|
41
|
+
* now: choices, nodes and bounds follow the data, and an old URL may not. A one-of value that is
|
|
42
|
+
* not a choice becomes the initial value; many-of and tree values that are not choices or nodes
|
|
43
|
+
* are dropped; numbers and ranges are clamped into the bounds. Each such change warns, naming
|
|
44
|
+
* the field: the value came from outside, so it is not an error. Reordering is silent: lists
|
|
45
|
+
* come back in choice order or normalized under the tree's selection (a store keeps them
|
|
46
|
+
* sorted, so a warning would come on every read), and a range's ends in order. The warnings go
|
|
47
|
+
* to `warn`, console.warn unless a caller that only summarizes (useStoredFields) silences them.
|
|
48
|
+
*/
|
|
49
|
+
export declare function sanitizeStored(definition: FieldDefinition, value: unknown, ctx: FieldCtx, warn?: (message: string) => void): unknown;
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=kinds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kinds.d.ts","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIlD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAsB,KAAK,gBAAgB,EAAuB,MAAM,qBAAqB,CAAC;AACrG,OAAO,EAAyB,KAAK,SAAS,EAA0B,MAAM,wBAAwB,CAAC;AACvG,OAAO,EAAuB,KAAK,iBAAiB,EAAwB,MAAM,sBAAsB,CAAC;AACzG,OAAO,EAAqB,KAAK,eAAe,EAAsB,MAAM,oBAAoB,CAAC;AACjG,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,eAAe,EAAsB,MAAM,oBAAoB,CAAC;AACnH,OAAO,EAAoB,KAAK,cAAc,EAAqB,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAoB,KAAK,cAAc,EAAqB,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAiE,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEhH;;;;GAIG;AACH,KAAK,UAAU,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,IAC9C;IAAE,IAAI,EAAE,CAAC,CAAA;CAAE,GAAG,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG;IAAE,YAAY,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;CAAE,GAAG,GAAG,CAAC;AAEtF;;;;GAIG;AACH,MAAM,MAAM,eAAe,CAAC,GAAG,GAAG,GAAG,IACjC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,GACvC,UAAU,CAAC,eAAe,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,GAC/C,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAC9D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAClE,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAC1D,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAC3D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,GAC9D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;AAkDpD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,eAAe,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAclF;AAED,gIAAgI;AAChI,wBAAgB,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAY3D;AAQD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,eAAe,EAC3B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,QAAQ,EACb,IAAI,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAyC,GACnE,OAAO,CAgDT"}
|
package/dist/kinds.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { resolveChoice } from './choices.js';
|
|
2
|
+
import { clamp, resolveNumeric } from './numeric.js';
|
|
3
|
+
import { resolveIn } from './resolve.js';
|
|
4
|
+
import { normalizeTreeValue } from './tree.js';
|
|
5
|
+
import { boolInitialValue } from './useBoolField.js';
|
|
6
|
+
import { manyOfInitialValue } from './useManyOfField.js';
|
|
7
|
+
import { mixedBoolInitialValue } from './useMixedBoolField.js';
|
|
8
|
+
import { numericInitialValue } from './useNumericField.js';
|
|
9
|
+
import { oneOfInitialValue } from './useOneOfField.js';
|
|
10
|
+
import { rangeInitialValue } from './useRangeField.js';
|
|
11
|
+
import { textInitialValue } from './useTextField.js';
|
|
12
|
+
import { treeInitialValue } from './useTreeField.js';
|
|
13
|
+
import { booleanType, numberType, rangeType, stringSetType, stringType } from './valueTypes.js';
|
|
14
|
+
const NOT_STORABLE = 'a mixed-boolean field is an aggregate of other data and cannot be stored';
|
|
15
|
+
/** A definition whose kind is none of FieldKind's (plain data can carry anything): fail loudly rather than give nothing. */
|
|
16
|
+
function unknownKind(definition) {
|
|
17
|
+
const { id, kind } = definition;
|
|
18
|
+
throw new Error(`Field '${id}': unknown kind '${String(kind)}'`);
|
|
19
|
+
}
|
|
20
|
+
/** The choices of a one-of or many-of definition, resolved as the hooks resolve them. */
|
|
21
|
+
function choicesOf(definition, ctx) {
|
|
22
|
+
const { id, choices } = definition;
|
|
23
|
+
return resolveIn(choices, [], ctx, `Field '${id}': option 'choices'`).map((c) => resolveChoice(id, c));
|
|
24
|
+
}
|
|
25
|
+
/** Every node's value, at any depth. */
|
|
26
|
+
function nodeValues(nodes, into = new Set()) {
|
|
27
|
+
for (const node of nodes) {
|
|
28
|
+
into.add(node.value);
|
|
29
|
+
if (node.children)
|
|
30
|
+
nodeValues(node.children, into);
|
|
31
|
+
}
|
|
32
|
+
return into;
|
|
33
|
+
}
|
|
34
|
+
/** A tree definition's nodes, resolved as useTreeField resolves them. */
|
|
35
|
+
function nodesOf(definition, ctx) {
|
|
36
|
+
return resolveIn(definition.nodes, [], ctx, `Field '${definition.id}': option 'nodes'`);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* A definition's default: `initialValue` resolved with the field context, else its kind's
|
|
40
|
+
* implicit initial value (false; the first enabled choice; the empty list; `min`, or 0, clamped
|
|
41
|
+
* into the bounds; `[min, max]`; the empty string). A tree's comes normalized under its
|
|
42
|
+
* selection, as the hook shows it, so a value equal to what the field shows by default is equal
|
|
43
|
+
* to the default too. It is what a store falls back to, what a reset restores, and what "is it
|
|
44
|
+
* set?" compares against; the kind's hook starts at the same value.
|
|
45
|
+
*/
|
|
46
|
+
export function initialValueOf(definition, ctx) {
|
|
47
|
+
const { id } = definition;
|
|
48
|
+
switch (definition.kind) {
|
|
49
|
+
case 'boolean': return boolInitialValue(definition, ctx, id);
|
|
50
|
+
case 'mixed-boolean': return mixedBoolInitialValue(definition, ctx, id);
|
|
51
|
+
case 'oneOf': return oneOfInitialValue(definition, ctx, id, choicesOf(definition, ctx));
|
|
52
|
+
case 'manyOf': return manyOfInitialValue(definition, ctx, id);
|
|
53
|
+
case 'numeric': return numericInitialValue(definition, ctx, id);
|
|
54
|
+
case 'range': return rangeInitialValue(definition, ctx, id);
|
|
55
|
+
case 'tree':
|
|
56
|
+
return normalizeTreeValue(nodesOf(definition, ctx), treeInitialValue(definition, ctx, id), definition.selection ?? 'topmost');
|
|
57
|
+
case 'text': return textInitialValue(definition, ctx, id);
|
|
58
|
+
default: return unknownKind(definition);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** How a kind's value is kept in a store. A mixed-boolean field shows an aggregate of other data, so it has none and throws. */
|
|
62
|
+
export function valueTypeOf(kind) {
|
|
63
|
+
switch (kind) {
|
|
64
|
+
case 'boolean': return booleanType;
|
|
65
|
+
case 'oneOf':
|
|
66
|
+
case 'text': return stringType;
|
|
67
|
+
case 'manyOf':
|
|
68
|
+
case 'tree': return stringSetType;
|
|
69
|
+
case 'numeric': return numberType;
|
|
70
|
+
case 'range': return rangeType;
|
|
71
|
+
case 'mixed-boolean': throw new Error(NOT_STORABLE);
|
|
72
|
+
default: throw new Error(`unknown field kind '${String(kind)}'`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function warnDropped(id, among, dropped, warn) {
|
|
76
|
+
if (dropped.length === 0)
|
|
77
|
+
return;
|
|
78
|
+
const listed = [...new Set(dropped)].map((v) => `'${v}'`).join(', ');
|
|
79
|
+
warn(`Field '${id}': dropping stored values that are not among its ${among}: ${listed}`);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* A stored value (already parsed by the kind's value type) made fit for the definition as it is
|
|
83
|
+
* now: choices, nodes and bounds follow the data, and an old URL may not. A one-of value that is
|
|
84
|
+
* not a choice becomes the initial value; many-of and tree values that are not choices or nodes
|
|
85
|
+
* are dropped; numbers and ranges are clamped into the bounds. Each such change warns, naming
|
|
86
|
+
* the field: the value came from outside, so it is not an error. Reordering is silent: lists
|
|
87
|
+
* come back in choice order or normalized under the tree's selection (a store keeps them
|
|
88
|
+
* sorted, so a warning would come on every read), and a range's ends in order. The warnings go
|
|
89
|
+
* to `warn`, console.warn unless a caller that only summarizes (useStoredFields) silences them.
|
|
90
|
+
*/
|
|
91
|
+
export function sanitizeStored(definition, value, ctx, warn = (message) => console.warn(message)) {
|
|
92
|
+
const { id } = definition;
|
|
93
|
+
switch (definition.kind) {
|
|
94
|
+
case 'boolean':
|
|
95
|
+
case 'text':
|
|
96
|
+
return value;
|
|
97
|
+
case 'mixed-boolean':
|
|
98
|
+
throw new Error(`Field '${id}': ${NOT_STORABLE}`);
|
|
99
|
+
case 'oneOf': {
|
|
100
|
+
const choices = choicesOf(definition, ctx);
|
|
101
|
+
if (choices.some((c) => c.value === value))
|
|
102
|
+
return value;
|
|
103
|
+
const fallback = oneOfInitialValue(definition, ctx, id, choices);
|
|
104
|
+
if (fallback !== value)
|
|
105
|
+
warn(`Field '${id}': stored value '${value}' is not one of its choices, using '${fallback}'`);
|
|
106
|
+
return fallback;
|
|
107
|
+
}
|
|
108
|
+
case 'manyOf': {
|
|
109
|
+
const stored = value;
|
|
110
|
+
const known = choicesOf(definition, ctx).map((c) => c.value);
|
|
111
|
+
warnDropped(id, 'choices', stored.filter((v) => !known.includes(v)), warn);
|
|
112
|
+
return known.filter((v) => stored.includes(v));
|
|
113
|
+
}
|
|
114
|
+
case 'tree': {
|
|
115
|
+
const stored = value;
|
|
116
|
+
const nodes = nodesOf(definition, ctx);
|
|
117
|
+
const known = nodeValues(nodes);
|
|
118
|
+
warnDropped(id, 'nodes', stored.filter((v) => !known.has(v)), warn);
|
|
119
|
+
return normalizeTreeValue(nodes, stored.filter((v) => known.has(v)), definition.selection ?? 'topmost');
|
|
120
|
+
}
|
|
121
|
+
case 'numeric': {
|
|
122
|
+
const stored = value;
|
|
123
|
+
const { min, max } = resolveNumeric(id, definition, ctx);
|
|
124
|
+
const clamped = clamp(stored, min, max);
|
|
125
|
+
if (clamped !== stored)
|
|
126
|
+
warn(`Field '${id}': stored value ${stored} is outside its bounds, using ${clamped}`);
|
|
127
|
+
return clamped;
|
|
128
|
+
}
|
|
129
|
+
case 'range': {
|
|
130
|
+
const stored = value;
|
|
131
|
+
const { min, max } = resolveNumeric(id, definition, ctx);
|
|
132
|
+
const from = clamp(stored[0], min, max);
|
|
133
|
+
const to = clamp(stored[1], min, max);
|
|
134
|
+
const sanitized = [Math.min(from, to), Math.max(from, to)];
|
|
135
|
+
if (from !== stored[0] || to !== stored[1]) {
|
|
136
|
+
warn(`Field '${id}': stored range ${rangeType.format(stored)} is outside its bounds, using ${rangeType.format(sanitized)}`);
|
|
137
|
+
}
|
|
138
|
+
return sanitized;
|
|
139
|
+
}
|
|
140
|
+
default: return unknownKind(definition);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=kinds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kinds.js","sourceRoot":"","sources":["../src/kinds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ArgStore } from './argStore.js';
|
|
2
|
+
/**
|
|
3
|
+
* An ArgStore over `window.localStorage` (Praeceptor's print options), items kept under
|
|
4
|
+
* `${prefix}.${key}`. Guarded for SSR/Node (`typeof window === 'undefined'`), so creating one
|
|
5
|
+
* outside a browser does not crash: reads then give `undefined` and writes are no-ops. A browser
|
|
6
|
+
* may block storage (a sandboxed frame, blocked site data) or refuse a write (quota), and then
|
|
7
|
+
* reaching or using `localStorage` throws: a read that fails reads as absent and a write that
|
|
8
|
+
* fails is skipped, with one warning per store rather than one per call.
|
|
9
|
+
*
|
|
10
|
+
* A write notifies this store's own subscribers; a `storage` event (another tab changed a key
|
|
11
|
+
* under the prefix) notifies them too. The store listens for that event on `window` only while
|
|
12
|
+
* it has subscribers, so a store that is dropped leaves no listener behind; still, create one
|
|
13
|
+
* once (outside render, or in `useMemo`) rather than on every render.
|
|
14
|
+
*/
|
|
15
|
+
export declare function localStorageStore(prefix: string): ArgStore;
|
|
16
|
+
//# sourceMappingURL=localStorageStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localStorageStore.d.ts","sourceRoot":"","sources":["../src/localStorageStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAoD1D"}
|