@owlmeans/state 0.1.18-rc.8 → 0.1.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +173 -68
  2. package/agent-meta/manifest.json +3 -3
  3. package/agent-meta/skills/state/SKILL.md +137 -58
  4. package/build/consts.local.d.ts +10 -0
  5. package/build/consts.local.d.ts.map +1 -0
  6. package/build/consts.local.js +10 -0
  7. package/build/consts.local.js.map +1 -0
  8. package/build/errors.d.ts +12 -5
  9. package/build/errors.d.ts.map +1 -1
  10. package/build/errors.js +16 -13
  11. package/build/errors.js.map +1 -1
  12. package/build/helper.d.ts +16 -0
  13. package/build/helper.d.ts.map +1 -0
  14. package/build/helper.js +14 -0
  15. package/build/helper.js.map +1 -0
  16. package/build/index.d.ts +3 -2
  17. package/build/index.d.ts.map +1 -1
  18. package/build/index.js +2 -2
  19. package/build/index.js.map +1 -1
  20. package/build/resource.d.ts +12 -5
  21. package/build/resource.d.ts.map +1 -1
  22. package/build/resource.js +317 -207
  23. package/build/resource.js.map +1 -1
  24. package/build/types.d.ts +91 -50
  25. package/build/types.d.ts.map +1 -1
  26. package/build/types.local.d.ts +15 -0
  27. package/build/types.local.d.ts.map +1 -0
  28. package/build/types.local.js +2 -0
  29. package/build/types.local.js.map +1 -0
  30. package/build/utils/criteria.d.ts.map +1 -1
  31. package/build/utils/criteria.js.map +1 -1
  32. package/build/utils/model.d.ts +10 -2
  33. package/build/utils/model.d.ts.map +1 -1
  34. package/build/utils/model.js +26 -22
  35. package/build/utils/model.js.map +1 -1
  36. package/build/utils/types.d.ts +15 -0
  37. package/build/utils/types.d.ts.map +1 -0
  38. package/build/utils/types.js +2 -0
  39. package/build/utils/types.js.map +1 -0
  40. package/package.json +4 -4
  41. package/src/consts.local.ts +11 -0
  42. package/src/errors.ts +16 -13
  43. package/src/helper.ts +17 -0
  44. package/src/index.ts +3 -2
  45. package/src/resource.ts +359 -241
  46. package/src/types.local.ts +16 -0
  47. package/src/types.ts +98 -55
  48. package/src/utils/model.ts +35 -28
  49. package/src/utils/types.ts +15 -0
  50. package/tests/resource.spec.ts +347 -90
  51. package/build/.gitkeep +0 -0
  52. package/src/consts.ts +0 -3
  53. package/src/utils/criteria.ts +0 -252
  54. package/src/utils/index.ts +0 -3
  55. package/tests/criteria.spec.ts +0 -121
package/build/types.d.ts CHANGED
@@ -1,67 +1,108 @@
1
- import type { ListCriteria, Resource, ResourceRecord } from '@owlmeans/resource';
2
- export interface StateResource<T extends ResourceRecord> extends Resource<T> {
1
+ import type { Criteria, FirstOptions, PubSubResource, Resource, ResourceRecord } from '@owlmeans/resource';
2
+ /**
3
+ * How a state resource is keyed and what it shows before anything is loaded.
4
+ *
5
+ * Everything here is optional: an unconfigured resource keys records by `id`, holds as many of
6
+ * them as it is given, and shows an empty object until a record arrives.
7
+ */
8
+ export interface StateConfig<T extends ResourceRecord> {
9
+ /** The field records are keyed by. Defaults to `id`. */
10
+ id?: keyof T & string;
3
11
  /**
4
- * @returns unsubscribe function
12
+ * The resource holds exactly ONE record, which therefore needs no id — the current user, the
13
+ * active session, a wizard being filled in. It is what makes `watch(undefined, ...)` (and so
14
+ * `useStoreModel()` with no id) answerable: elsewhere there is no "the record" to address.
5
15
  */
6
- subscribe: (params: StateSubscriptionOption<T>) => [() => void, StateModel<T>[]];
7
- listen: (listener: StateListener<T>) => () => void;
8
- erase: () => Promise<void>;
16
+ single?: boolean;
9
17
  /**
10
- * Every record held, as a plain array.
11
- *
12
- * `list()` answers the `Resource` contract and therefore returns `{ items, pager }`; this is
13
- * the same data without the envelope, for the overwhelmingly common case of "give me what is
14
- * in the store". Destructuring the wrong one of the two is a silent empty render, so both
15
- * spellings exist rather than one being the trap the other rescues.
18
+ * What {@link StateModel.record} shows while the model is empty. A screen that binds to a
19
+ * record before it has arrived reads the default instead of guarding every field — and the
20
+ * store still holds nothing, so nothing renders it as a row.
16
21
  */
17
- all: () => Promise<T[]>;
22
+ default?: () => T;
23
+ }
24
+ /** One change to the store, as its subscribers see it. */
25
+ export interface StateEvent<T extends ResourceRecord> {
26
+ type: 'set' | 'remove';
27
+ records: T[];
28
+ }
29
+ /**
30
+ * The framework's client store: a `Resource` like any other, registered ON the context — which is
31
+ * what separates it from a store held beside the app, since a screen, a service and a guard all
32
+ * reach the same records through the same container.
33
+ *
34
+ * Reads and writes are the resource vocabulary; `watch` and `query` are the live half, and they
35
+ * are synchronous on purpose — a React subscriber has to have its value before it renders.
36
+ */
37
+ export interface StateResource<T extends ResourceRecord> extends Resource<T>, PubSubResource<StateEvent<T>> {
38
+ readonly config: StateConfig<T>;
18
39
  /**
19
- * The records the criteria accepts, as a plain array.
40
+ * Make the store agree with an authoritative list: every record given is written, and every
41
+ * record the list does not name is dropped. That is the shape of "the server just told us what
42
+ * exists" — saving each record one by one leaves the ones deleted elsewhere behind.
43
+ */
44
+ replace(records: T[]): Promise<void>;
45
+ /** Drop every record. */
46
+ clear(): Promise<void>;
47
+ /**
48
+ * Follow one record. The listener is called with the current model straight away — before
49
+ * `watch` returns — and again on every change to that record, including its removal.
50
+ *
51
+ * `undefined` addresses the one record of a `single` resource; on any other it throws, since
52
+ * there is nothing for it to mean.
20
53
  *
21
- * Same criteria language as the server resources (`@owlmeans/postgres-resource`), so a filter
22
- * written for an endpoint means the same thing applied locally. Records the store does not
23
- * hold cannot match — this filters what has been loaded, it never fetches.
54
+ * An absent id on a listed resource watches nothing and reports an empty model — a screen
55
+ * binds before the record supplying the id exists, and that is a loading state, not an error.
56
+ * @returns unsubscribe
24
57
  */
25
- match: (criteria?: ListCriteria) => Promise<T[]>;
26
- }
27
- export interface StateSubscriptionOption<T extends ResourceRecord> {
28
- id?: string | string[];
29
- _systemId?: string;
58
+ watch(id: string | undefined, listener: (model: StateModel<T>) => void): () => void;
30
59
  /**
31
- * Subscribe to a live QUERY instead of to fixed ids.
60
+ * Follow a live QUERY. The listener is called with the matching models straight away and again
61
+ * whenever a write changes the answer, so a list screen never recomputes ids and never
62
+ * re-subscribes to keep up. `undefined` matches every record.
32
63
  *
33
- * The listener is called with every record the criteria currently accepts, and again whenever
34
- * a create, update or delete changes that answer — so a list screen never recomputes ids and
35
- * never re-subscribes to keep up. Ignored when `id` is given: a subscription is either to
36
- * named records or to a query, never to both.
64
+ * A query subscription creates nothing: an empty store yields an empty list.
37
65
  *
38
- * Unlike an id subscription, this one creates nothing: an empty store yields an empty list
39
- * rather than a placeholder record.
66
+ * @returns unsubscribe
40
67
  */
41
- query?: ListCriteria;
42
- default?: Partial<T>;
43
- listener: StateListener<T>;
44
- }
45
- export interface StateListener<T extends ResourceRecord> {
46
- (record: StateModel<T>[], systemId?: string): void | Promise<void>;
68
+ query(where: Criteria<T> | undefined, listener: (models: StateModel<T>[]) => void, opts?: FirstOptions<T>): () => void;
47
69
  }
70
+ /**
71
+ * One record, as something bound to it can hold: what it currently says, and how to change it.
72
+ *
73
+ * `record` is a snapshot — assigning into it changes nothing anyone can see. `update` is how a
74
+ * change reaches the store and every other subscriber.
75
+ */
48
76
  export interface StateModel<T extends ResourceRecord> {
49
- record: T;
50
- commit: (force?: boolean) => void;
51
- update: (data?: Partial<T>) => void;
52
- clear: () => void;
53
- }
54
- export interface StateResourceAppend {
55
- getStateResource: <T extends ResourceRecord>(alias?: string) => StateResource<T>;
56
- }
57
- export interface UseStoreHelper {
58
- <T extends ResourceRecord>(id?: string | UseStoreHelperOptions<T>, opts?: string | boolean | UseStoreHelperOptions<T>): StateModel<T>;
77
+ readonly id: string | undefined;
78
+ /**
79
+ * Nothing is loaded yet: the store holds no record under this model's key. This — not a
80
+ * sentinel id, and not a placeholder record — is what "not there" looks like, so a subscription
81
+ * to an unknown id leaves the store exactly as empty as it found it.
82
+ */
83
+ readonly empty: boolean;
84
+ /** The record, or the configured `default` while {@link StateModel.empty} is true. */
85
+ readonly record: Readonly<T>;
86
+ /** Merge and write in one step. */
87
+ update(patch: Partial<T>): Promise<T>;
88
+ /** Write what {@link StateModel.record} currently holds — including a default not yet stored. */
89
+ commit(): Promise<T>;
90
+ clear(): Promise<void>;
59
91
  }
60
- export interface UseStoreListHelper {
61
- <T extends ResourceRecord>(id?: string | string[] | UseStoreHelperOptions<T>, opts?: string | boolean | UseStoreHelperOptions<T>): StateModel<T>[];
92
+ /**
93
+ * A state alias that remembers the record type it addresses, so `getStateResource(TASKS)` is
94
+ * typed without repeating `<Task>` at every call site. Built by {@link stateAlias}; it is a plain
95
+ * string at runtime, so it works anywhere an alias is expected.
96
+ */
97
+ export type StateAlias<T extends ResourceRecord> = string & {
98
+ readonly _state?: T;
99
+ };
100
+ export interface GetStateResource {
101
+ <T extends ResourceRecord>(alias: StateAlias<T>): StateResource<T>;
102
+ <T extends ResourceRecord = ResourceRecord>(alias?: string): StateResource<T>;
62
103
  }
63
- export interface UseStoreHelperOptions<T extends ResourceRecord> extends Omit<StateSubscriptionOption<T>, "listener"> {
64
- listen?: boolean;
65
- resource?: string;
104
+ export interface StateResourceAppend {
105
+ /** The state resource under `alias`, or the first one appended to the context. */
106
+ getStateResource: GetStateResource;
66
107
  }
67
108
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEhF,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,cAAc,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;IAC1E;;OAEG;IACH,SAAS,EAAE,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;IAChF,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,MAAM,IAAI,CAAA;IAClD,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAE1B;;;;;;;OAOG;IACH,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;IAEvB;;;;;;OAMG;IACH,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;CACjD;AAED,MAAM,WAAW,uBAAuB,CAAC,CAAC,SAAS,cAAc;IAC/D,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;;;OAUG;IACH,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;IACpB,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;CAC3B;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,cAAc;IACrD,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACnE;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,cAAc;IAClD,MAAM,EAAE,CAAC,CAAC;IAEV,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IAEjC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;IAEnC,KAAK,EAAE,MAAM,IAAI,CAAA;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,CAAC,CAAC,SAAS,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,CAAA;CACjF;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,CAAC,SAAS,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;CACtI;AAED,MAAM,WAAW,kBAAkB;IACjC,CAAC,CAAC,SAAS,cAAc,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,qBAAqB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,qBAAqB,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;CACnJ;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,cAAc,CAAE,SAAQ,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;IACnH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EACjE,MAAM,oBAAoB,CAAA;AAE3B;;;;;GAKG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,cAAc;IACnD,wDAAwD;IACxD,EAAE,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAA;IACrB;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;CAClB;AAED,0DAA0D;AAC1D,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,cAAc;IAClD,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAA;IACtB,OAAO,EAAE,CAAC,EAAE,CAAA;CACb;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,cAAc,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACzG,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAA;IAE/B;;;;OAIG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEpC,yBAAyB;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAEtB;;;;;;;;;;OAUG;IACH,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;IAEnF;;;;;;;;OAQG;IACH,KAAK,CACH,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,EAC9B,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAC3C,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACrB,MAAM,IAAI,CAAA;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,cAAc;IAClD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;IACvB,sFAAsF;IACtF,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC5B,mCAAmC;IACnC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACrC,iGAAiG;IACjG,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,CAAA;IACpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,cAAc,IAAI,MAAM,GAAG;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;CAAE,CAAA;AAEnF,MAAM,WAAW,gBAAgB;IAC/B,CAAC,CAAC,SAAS,cAAc,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;IAClE,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;CAC9E;AAED,MAAM,WAAW,mBAAmB;IAClC,kFAAkF;IAClF,gBAAgB,EAAE,gBAAgB,CAAA;CACnC"}
@@ -0,0 +1,15 @@
1
+ import type { Criteria, FirstOptions, ResourceRecord } from '@owlmeans/resource';
2
+ import type { StateEvent, StateModel } from './types.js';
3
+ export interface QueryWatch<T extends ResourceRecord> {
4
+ where?: Criteria<T>;
5
+ opts?: FirstOptions<T>;
6
+ listener: (models: StateModel<T>[]) => void;
7
+ last: StateModel<T>[];
8
+ }
9
+ export interface Subscription<T extends ResourceRecord> {
10
+ handler: (value: StateEvent<T>) => void | Promise<void>;
11
+ channel: string;
12
+ once: boolean;
13
+ timer?: ReturnType<typeof setTimeout>;
14
+ }
15
+ //# sourceMappingURL=types.local.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.local.d.ts","sourceRoot":"","sources":["../src/types.local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAExD,MAAM,WAAW,UAAU,CAAC,CAAC,SAAS,cAAc;IAClD,KAAK,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IACnB,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAA;IACtB,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAA;IAC3C,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;CACtB;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,cAAc;IACpD,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAA;CACtC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.local.js","sourceRoot":"","sources":["../src/types.local.ts"],"names":[],"mappings":""}
@@ -1 +1 @@
1
- {"version":3,"file":"criteria.d.ts","sourceRoot":"","sources":["../../src/utils/criteria.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAgKhF;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,cAAc,UAC5C,CAAC,aAAa,YAAY,KACjC,OA0CF,CAAA;AAED,6DAA6D;AAC7D,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,cAAc,WAC3C,CAAC,EAAE,aAAa,YAAY,KACpC,CAAC,EAE2D,CAAA;AAE/D;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,cAAc,WAAW,CAAC,EAAE,SAAS,QAAQ,EAAE,KAAG,CAAC,EAuBxF,CAAA"}
1
+ {"version":3,"file":"criteria.d.ts","sourceRoot":"","sources":["../../src/utils/criteria.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAgKhF;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,cAAc,EACpD,QAAQ,CAAC,EAAE,WAAW,YAAY,KACjC,OA0CF,CAAA;AAED,6DAA6D;AAC7D,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,cAAc,EACpD,SAAS,CAAC,EAAE,EAAE,WAAW,YAAY,KACpC,CAAC,EAE2D,CAAA;AAE/D;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,cAAc,EAAE,SAAS,CAAC,EAAE,EAAE,OAAO,QAAQ,EAAE,KAAG,CAAC,EAuBxF,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"criteria.js","sourceRoot":"","sources":["../../src/utils/criteria.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"criteria.js","sourceRoot":"","sources":["../../src/utils/criteria.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAG7D;;;;;;;;;;;;;;GAcG;AAEH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAA;AAExE,mEAAmE;AACnE,MAAM,UAAU,GAAG,CAAC,KAAc,EAAW,EAAE,CAC7C,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,CAAA;AAEjD,8FAA8F;AAC9F,MAAM,KAAK,GAAG,CAAC,MAAe,EAAE,IAAc,EAAW,EAAE,CACzD,IAAI,CAAC,MAAM,CACT,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;IACzD,CAAC,CAAC,SAAS;IACX,CAAC,CAAE,KAAiC,CAAC,IAAI,CAAC,EAC5C,MAAM,CACP,CAAA;AAEH;;;GAGG;AACH,MAAM,cAAc,GAAG,CAAC,KAAc,EAAoC,EAAE,CAC1E,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC;OAC5F,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAA;AAExD,MAAM,KAAK,GAAG,CAAC,IAAa,EAAE,KAAc,EAAW,EAAE;IACvD,IAAI,IAAI,YAAY,IAAI,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAClD,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK,CAAC,CAAA;IAC/C,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACjG,CAAC;IACD,OAAO,IAAI,KAAK,KAAK,CAAA;AACvB,CAAC,CAAA;AAED,gGAAgG;AAChG,MAAM,MAAM,GAAG,CAAC,KAAc,EAAE,OAAgB,EAAW,EAAE;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;IAC3D,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAA;AAClF,CAAC,CAAA;AAED,MAAM,IAAI,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,CAAA;AAExE,2DAA2D;AAC3D,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,KAAa,EAAU,EAAE;IAC9D,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAE,CAAA;QAC5B,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAChD,MAAM,IAAI,OAAO,CAAC,EAAE,KAAK,CAAE,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;YAClE,SAAQ;QACV,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAAC,MAAM,IAAI,IAAI,CAAC;YAAC,SAAQ;QAAC,CAAC;QAC9C,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAAC,MAAM,IAAI,GAAG,CAAC;YAAC,SAAQ;QAAC,CAAC;QAC7C,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,IAAI,MAAM,CAAC,IAAI,MAAM,GAAG,EAAE,KAAK,CAAC,CAAA;AACzC,CAAC,CAAA;AAED;;GAEG;AACH,MAAM,cAAc,GAAG,CAAC,KAAc,EAAE,IAA6B,EAAW,EAAE;IAChF,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,IAAI,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;YAC9B,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,MAAM,OAAO,GACX,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC;gBACxC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC;oBAC3C,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK;wBACrC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAE,IAAc,GAAI,KAAe;4BACvD,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAE,IAAc,IAAK,KAAe;gCACzD,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAE,IAAc,GAAI,KAAe;oCACvD,CAAC,CAAE,IAAc,IAAK,KAAe,CAAA;YACnD,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAA;YAC1B,SAAQ;QACV,CAAC;QACD,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,KAAK;gBACR,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;oBAAE,OAAO,KAAK,CAAA;gBACzC,MAAK;YACP,KAAK,MAAM;gBACT,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC;oBAAE,OAAO,KAAK,CAAA;gBACxC,MAAK;YACP,KAAK,SAAS;gBACZ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAA;gBACzD,MAAK;YACP,KAAK,OAAO;gBACV,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAA;gBACzD,MAAK;YACP,KAAK,OAAO;gBACV,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBACpE,MAAK;YACP,KAAK,QAAQ;gBACX,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBACrE,MAAK;YACP,KAAK,QAAQ;gBACX,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBAC9D,MAAK;YACP,KAAK,aAAa;gBAChB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBACxD,MAAK;YACP,KAAK,WAAW;gBACd,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBACtD,MAAK;YACP,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACpD,MAAM,IAAI,wBAAwB,CAAC,mBAAmB,CAAC,CAAA;gBACzD,CAAC;gBACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;gBAC9B,IAAI,IAAI,IAAI,IAAI;oBAAE,OAAO,KAAK,CAAA;gBAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBACnC,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;gBACjC,IAAK,IAAc,GAAI,IAAc,IAAK,IAAc,GAAI,EAAY;oBAAE,OAAO,KAAK,CAAA;gBACtF,MAAK;YACP,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;gBAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBACrD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBAC7F,MAAK;YACP,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;gBAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBACrD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBAC7F,MAAK;YACP,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;gBAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;gBACrD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;oBAAE,OAAO,KAAK,CAAA;gBAC5F,MAAK;YACP,CAAC;YACD;gBACE,MAAM,IAAI,wBAAwB,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAA;QACvE,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,MAAS,EAAE,QAAuB,EACzB,EAAE;IACX,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;QACxD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,SAAQ;QACV,CAAC;QAED,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAmB,CAAA;YAClE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,SAAQ;YAC9B,MAAM,OAAO,GAAG,GAAG,KAAK,MAAM;gBAC5B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBAClD,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;YACnD,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAA;YAC1B,SAAQ;QACV,CAAC;QACD,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,IAAI,aAAa,CAAC,MAAM,EAAE,GAAmB,CAAC;gBAAE,OAAO,KAAK,CAAA;YAC5D,SAAQ;QACV,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;QAE3C,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACjB,IAAI,KAAK,IAAI,IAAI;gBAAE,OAAO,KAAK,CAAA;YAC/B,SAAQ;QACV,CAAC;QACD,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,GAA8B,CAAC;gBAAE,OAAO,KAAK,CAAA;YACxE,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB;;;eAGG;YACH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAA;YACrC,SAAQ;QACV,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;YAAE,OAAO,KAAK,CAAA;IACtC,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,6DAA6D;AAC7D,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,OAAY,EAAE,QAAuB,EAChC,EAAE,CAAC,QAAQ,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC;IAC1D,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC;IACd,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;AAE/D;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAA2B,OAAY,EAAE,IAAiB,EAAO,EAAE;IAC5F,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAA;IACrB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAClD,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;QAC9C,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAElC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACvC,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACnD,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACpD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;gBAAE,SAAQ;YACpC,wFAAwF;YACxF,IAAI,CAAC,IAAI,IAAI;gBAAE,OAAO,CAAC,CAAA;YACvB,IAAI,CAAC,IAAI,IAAI;gBAAE,OAAO,CAAC,CAAC,CAAA;YACxB,IAAK,CAAW,GAAI,CAAW;gBAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YACrD,IAAK,CAAW,GAAI,CAAW;gBAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACvD,CAAC;QAED,OAAO,CAAC,CAAA;IACV,CAAC,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -1,4 +1,12 @@
1
1
  import type { ResourceRecord } from '@owlmeans/resource';
2
- import type { StateModel, StateResource } from '../types.js';
3
- export declare const createStateModel: <T extends ResourceRecord>(record: T, resource: StateResource<T>) => StateModel<T>;
2
+ import type { StateModel } from '../types.js';
3
+ import type { StateModelBinding } from './types.js';
4
+ /**
5
+ * Wrap one record — or its absence — as something a screen can bind to.
6
+ *
7
+ * The working copy is replaced rather than mutated on every write, so the record a caller is
8
+ * holding never changes underneath it and two models of the same record stay comparable by
9
+ * reference.
10
+ */
11
+ export declare const createStateModel: <T extends ResourceRecord>(binding: StateModelBinding<T>) => StateModel<T>;
4
12
  //# sourceMappingURL=model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/utils/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE5D,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,cAAc,UAC/C,CAAC,YAAY,aAAa,CAAC,CAAC,CAAC,KACpC,UAAU,CAAC,CAAC,CAmCd,CAAA"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/utils/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,cAAc,WAC9C,iBAAiB,CAAC,CAAC,CAAC,KAC5B,UAAU,CAAC,CAAC,CAmCd,CAAA"}
@@ -1,28 +1,32 @@
1
- import { MisshapedRecord } from '@owlmeans/resource';
2
- export const createStateModel = (record, resource) => {
3
- let before = record;
1
+ /**
2
+ * Wrap one record — or its absence — as something a screen can bind to.
3
+ *
4
+ * The working copy is replaced rather than mutated on every write, so the record a caller is
5
+ * holding never changes underneath it and two models of the same record stay comparable by
6
+ * reference.
7
+ */
8
+ export const createStateModel = (binding) => {
9
+ /** What an empty model shows: the configured default, or nothing at all. */
10
+ const blank = () => binding.default?.() ?? {};
11
+ let working = binding.record ?? blank();
12
+ let stored = binding.record != null;
4
13
  const model = {
5
- record: { ...record },
6
- commit: force => {
7
- if (force !== true) {
8
- if (!Object.entries(before).reduce((changed, [key, value]) => changed || model.record[key] !== value, false) && !Object.entries(model.record).reduce((changed, [key, value]) => changed || before[key] !== value, false)) {
9
- return;
10
- }
11
- }
12
- if (record.id == null) {
13
- throw new MisshapedRecord('id');
14
- }
15
- before = model.record;
16
- void resource.load(record.id).then(exists => {
17
- exists != null && resource.update(model.record);
18
- });
14
+ get id() { return binding.id; },
15
+ get empty() { return !stored; },
16
+ get record() { return working; },
17
+ update: async (patch) => {
18
+ working = { ...working, ...patch };
19
+ return model.commit();
19
20
  },
20
- update: data => {
21
- Object.assign(model.record, data);
22
- model.commit();
21
+ commit: async () => {
22
+ working = await binding.write(working);
23
+ stored = true;
24
+ return working;
23
25
  },
24
- clear: () => {
25
- void resource.delete(record);
26
+ clear: async () => {
27
+ await binding.drop();
28
+ stored = false;
29
+ working = blank();
26
30
  }
27
31
  };
28
32
  return model;
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/utils/model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAGpD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,MAAS,EAAE,QAA0B,EACtB,EAAE;IACjB,IAAI,MAAM,GAAM,MAAM,CAAA;IACtB,MAAM,KAAK,GAAkB;QAC3B,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE;QAErB,MAAM,EAAE,KAAK,CAAC,EAAE;YACd,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAChC,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,GAAc,CAAC,KAAK,KAAK,EAAE,KAAK,CACpF,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CACvC,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,MAAM,CAAC,GAAc,CAAC,KAAK,KAAK,EAAE,KAAK,CAC9E,EAAE,CAAC;oBACF,OAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;gBACtB,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;YACjC,CAAC;YACD,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;YACrB,KAAK,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;gBAC1C,MAAM,IAAI,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACjD,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,MAAM,EAAE,IAAI,CAAC,EAAE;YACb,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACjC,KAAK,CAAC,MAAM,EAAE,CAAA;QAChB,CAAC;QAED,KAAK,EAAE,GAAG,EAAE;YACV,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC9B,CAAC;KACF,CAAA;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/utils/model.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,OAA6B,EACd,EAAE;IACjB,4EAA4E;IAC5E,MAAM,KAAK,GAAG,GAAM,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAO,CAAA;IAErD,IAAI,OAAO,GAAM,OAAO,CAAC,MAAM,IAAI,KAAK,EAAE,CAAA;IAC1C,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAA;IAEnC,MAAM,KAAK,GAAkB;QAC3B,IAAI,EAAE,KAAK,OAAO,OAAO,CAAC,EAAE,CAAA,CAAC,CAAC;QAE9B,IAAI,KAAK,KAAK,OAAO,CAAC,MAAM,CAAA,CAAC,CAAC;QAE9B,IAAI,MAAM,KAAK,OAAO,OAAO,CAAA,CAAC,CAAC;QAE/B,MAAM,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;YACpB,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,EAAO,CAAA;YAEvC,OAAO,KAAK,CAAC,MAAM,EAAE,CAAA;QACvB,CAAC;QAED,MAAM,EAAE,KAAK,IAAI,EAAE;YACjB,OAAO,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACtC,MAAM,GAAG,IAAI,CAAA;YAEb,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;YACpB,MAAM,GAAG,KAAK,CAAA;YACd,OAAO,GAAG,KAAK,EAAE,CAAA;QACnB,CAAC;KACF,CAAA;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
@@ -0,0 +1,15 @@
1
+ import type { ResourceRecord } from '@owlmeans/resource';
2
+ /**
3
+ * What a model needs from the resource that made it: which record it stands for, and the two
4
+ * writes it can perform. The key stays on the resource side, so a model bound to the one record
5
+ * of a `single` resource works the same as one bound to an id.
6
+ */
7
+ export interface StateModelBinding<T extends ResourceRecord> {
8
+ id: string | undefined;
9
+ /** The stored record, or `undefined` when the store holds none — an EMPTY model. */
10
+ record: T | undefined;
11
+ default?: () => T;
12
+ write: (record: T) => Promise<T>;
13
+ drop: () => Promise<void>;
14
+ }
15
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAExD;;;;GAIG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,SAAS,cAAc;IACzD,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,oFAAoF;IACpF,MAAM,EAAE,CAAC,GAAG,SAAS,CAAA;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,CAAA;IACjB,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;IAChC,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/utils/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@owlmeans/state",
3
- "version": "0.1.18-rc.8",
3
+ "version": "0.1.18",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -22,11 +22,11 @@
22
22
  }
23
23
  },
24
24
  "dependencies": {
25
- "@owlmeans/context": "^0.1.18-rc.6",
26
- "@owlmeans/resource": "^0.1.18-rc.7"
25
+ "@owlmeans/context": "^0.1.18",
26
+ "@owlmeans/resource": "^0.1.18"
27
27
  },
28
28
  "devDependencies": {
29
- "@owlmeans/dep-config": "workspace:*",
29
+ "@owlmeans/dep-config": "^0.1.18",
30
30
  "nodemon": "^3.1.14",
31
31
  "typescript": "^7.0.2"
32
32
  },
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The one slot of a `single` resource. It is a KEY and never a value: nothing writes it into a
3
+ * record, so a single resource's record still carries whatever id it arrived with, or none.
4
+ */
5
+ export const SOLE = ''
6
+
7
+ /** The channel writes publish on, and the one a subscriber gets when it names none. */
8
+ export const CHANGES = 'changes'
9
+
10
+ /** The alias a context's first state resource takes when nothing else is asked for. */
11
+ export const STATE = 'state'
package/src/errors.ts CHANGED
@@ -1,23 +1,26 @@
1
1
 
2
2
  import { ResourceError } from '@owlmeans/resource'
3
3
 
4
- export class StateToolingError extends ResourceError {
5
- public static override typeName = `${ResourceError.typeName}Tooling`
4
+ /**
5
+ * The resource was asked for something its {@link StateConfig} does not allow. Both cases are
6
+ * wiring mistakes rather than missing data, so they throw instead of answering with nothing.
7
+ */
8
+ export class StateConfigError extends ResourceError {
9
+ public static override typeName = `${ResourceError.typeName}StateConfig`
6
10
 
7
- constructor(msg: string) {
8
- super(`tooling:${msg}`)
9
- this.type = StateToolingError.typeName
10
- }
11
- }
11
+ /**
12
+ * A record was addressed without an id on a resource that holds many of them. Only a `single`
13
+ * resource has a record that needs no naming.
14
+ */
15
+ public static readonly NonSingle: string = 'non-single'
12
16
 
13
- export class StateListenerError extends StateToolingError {
14
- public static override typeName = `${StateToolingError.typeName}Listener`
17
+ /** A write carried no value for the resource's id field, and nothing here mints one. */
18
+ public static readonly NoId: string = 'no-id'
15
19
 
16
20
  constructor(msg: string) {
17
- super(`listener:${msg}`)
18
- this.type = StateListenerError.typeName
21
+ super(`state-config:${msg}`)
22
+ this.type = StateConfigError.typeName
19
23
  }
20
24
  }
21
25
 
22
- ResourceError.registerErrorClass(StateToolingError)
23
- ResourceError.registerErrorClass(StateListenerError)
26
+ ResourceError.registerErrorClass(StateConfigError)
package/src/helper.ts ADDED
@@ -0,0 +1,17 @@
1
+ import type { ResourceRecord } from '@owlmeans/resource'
2
+ import type { StateAlias } from './types.js'
3
+
4
+ /**
5
+ * Name a state resource once, with the record type it holds attached:
6
+ *
7
+ * ```typescript
8
+ * export const TASKS = stateAlias<Task>('tasks')
9
+ * const tasks = context.getStateResource(TASKS) // StateResource<Task>
10
+ * ```
11
+ *
12
+ * The handle is the string itself at runtime — the type rides along only so that every reader of
13
+ * the alias gets the record type without repeating it, and so that a mismatch is a compile error
14
+ * instead of a record shaped like nothing anyone expected.
15
+ */
16
+ export const stateAlias = <T extends ResourceRecord>(alias: string): StateAlias<T> =>
17
+ alias as StateAlias<T>
package/src/index.ts CHANGED
@@ -1,7 +1,8 @@
1
1
 
2
2
  export type * from './types.js'
3
3
 
4
- export * from './consts.js'
5
4
  export * from './errors.js'
5
+ export * from './helper.js'
6
6
  export * from './resource.js'
7
- export * from './utils/criteria.js'
7
+ export * from './utils/model.js'
8
+ export type * from './utils/types.js'