vultus-core 0.4.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 +304 -6
- 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/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 +21 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -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/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 +50 -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,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How a value is kept in a store as a string (moxb's url-arg types): a URL query, localStorage.
|
|
3
|
+
* A stored string comes from outside (an edited or old URL), so `parse` never throws: a string
|
|
4
|
+
* that stands for no value gives `undefined`, and the caller falls back to its default.
|
|
5
|
+
* `isEqual` is the value's meaning (a list as a set, a range by both ends), used everywhere two
|
|
6
|
+
* values are compared, e.g. to leave a default out of the store.
|
|
7
|
+
*/
|
|
8
|
+
export interface ValueType<T> {
|
|
9
|
+
parse(raw: string): T | undefined;
|
|
10
|
+
format(value: T): string;
|
|
11
|
+
isEqual(a: T, b: T): boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/** A boolean as `1` / `0`; any other string is no value. */
|
|
15
|
+
export const booleanType: ValueType<boolean> = {
|
|
16
|
+
parse: (raw) => (raw === '1' ? true : raw === '0' ? false : undefined),
|
|
17
|
+
format: (value) => (value ? '1' : '0'),
|
|
18
|
+
isEqual: (a, b) => a === b,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** A string as itself. */
|
|
22
|
+
export const stringType: ValueType<string> = {
|
|
23
|
+
parse: (raw) => raw,
|
|
24
|
+
format: (value) => value,
|
|
25
|
+
isEqual: (a, b) => a === b,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/** A set's canonical form: sorted, without duplicates. */
|
|
29
|
+
function canonicalSet(items: string[]): string[] {
|
|
30
|
+
return [...new Set(items)].sort();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* A set of strings as a sorted comma list; the empty string is the empty list (so a list
|
|
35
|
+
* present but empty differs from an absent one). Reading drops empty items. An item containing
|
|
36
|
+
* `,`, or an empty one (it would read back as no item), cannot be stored and throws: that is the
|
|
37
|
+
* definer's mistake, not outside input.
|
|
38
|
+
*/
|
|
39
|
+
export const stringSetType: ValueType<string[]> = {
|
|
40
|
+
parse: (raw) => canonicalSet(raw.split(',').filter((item) => item !== '')),
|
|
41
|
+
format: (value) => {
|
|
42
|
+
if (value.includes('')) throw new Error(`'' is empty and cannot be stored in a list`);
|
|
43
|
+
const bad = value.find((item) => item.includes(','));
|
|
44
|
+
if (bad !== undefined) throw new Error(`'${bad}' contains ',' and cannot be stored in a list`);
|
|
45
|
+
return canonicalSet(value).join(',');
|
|
46
|
+
},
|
|
47
|
+
isEqual: (a, b) => {
|
|
48
|
+
const x = canonicalSet(a);
|
|
49
|
+
const y = canonicalSet(b);
|
|
50
|
+
return x.length === y.length && x.every((item, i) => item === y[i]);
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** A finite number as its decimal string; an empty or non-numeric string is no value. */
|
|
55
|
+
export const numberType: ValueType<number> = {
|
|
56
|
+
parse: (raw) => {
|
|
57
|
+
if (raw.trim() === '') return undefined;
|
|
58
|
+
const n = Number(raw);
|
|
59
|
+
return Number.isFinite(n) ? n : undefined;
|
|
60
|
+
},
|
|
61
|
+
format: (value) => String(value),
|
|
62
|
+
isEqual: (a, b) => a === b,
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/** A `[from, to]` range as `from..to`; ends that are not numbers, or out of order, are no value. */
|
|
66
|
+
export const rangeType: ValueType<[number, number]> = {
|
|
67
|
+
parse: (raw) => {
|
|
68
|
+
const ends = raw.split('..');
|
|
69
|
+
if (ends.length !== 2) return undefined;
|
|
70
|
+
const from = numberType.parse(ends[0]);
|
|
71
|
+
const to = numberType.parse(ends[1]);
|
|
72
|
+
if (from === undefined || to === undefined || from > to) return undefined;
|
|
73
|
+
return [from, to];
|
|
74
|
+
},
|
|
75
|
+
format: ([from, to]) => `${from}..${to}`,
|
|
76
|
+
isEqual: (a, b) => a[0] === b[0] && a[1] === b[1],
|
|
77
|
+
};
|