@owlmeans/state 0.1.18-rc.6 → 0.1.18-rc.7
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 +23 -1
- package/agent-meta/manifest.json +2 -2
- package/agent-meta/skills/state/SKILL.md +119 -15
- package/build/errors.d.ts.map +1 -1
- package/build/errors.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/resource.d.ts.map +1 -1
- package/build/resource.js +70 -7
- package/build/resource.js.map +1 -1
- package/build/types.d.ts +28 -0
- package/build/types.d.ts.map +1 -1
- package/build/utils/criteria.d.ts +20 -0
- package/build/utils/criteria.d.ts.map +1 -0
- package/build/utils/criteria.js +252 -0
- package/build/utils/criteria.js.map +1 -0
- package/build/utils/index.d.ts +1 -0
- package/build/utils/index.d.ts.map +1 -1
- package/build/utils/index.js +1 -0
- package/build/utils/index.js.map +1 -1
- package/build/utils/model.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/index.ts +1 -0
- package/src/resource.ts +100 -9
- package/src/types.ts +30 -0
- package/src/utils/criteria.ts +252 -0
- package/src/utils/index.ts +1 -0
- package/tests/criteria.spec.ts +121 -0
- package/tests/resource.spec.ts +162 -0
- package/tsconfig.json +6 -1
package/README.md
CHANGED
|
@@ -59,9 +59,31 @@ Creates an in-memory resource with subscription support. Registers under `alias`
|
|
|
59
59
|
|
|
60
60
|
### `StateResource<T>` (extends `Resource<T>`)
|
|
61
61
|
|
|
62
|
-
- `subscribe(params): [unsubscribe, StateModel<T>[]]` — subscribe to
|
|
62
|
+
- `subscribe(params): [unsubscribe, StateModel<T>[]]` — subscribe to records by `id`, or to a live
|
|
63
|
+
`query`; returns the current records
|
|
63
64
|
- `listen(listener)` — global listener for any change in the resource
|
|
64
65
|
- `erase()` — clear all records
|
|
66
|
+
- `all(): Promise<T[]>` — every record, as a plain array
|
|
67
|
+
- `match(criteria?): Promise<T[]>` — the records the criteria accepts, as a plain array
|
|
68
|
+
- `list(criteria?, opts?)` — the `Resource` envelope `{ items, pager }`. Unpaged unless a pager is
|
|
69
|
+
given, so `list()` returns everything
|
|
70
|
+
|
|
71
|
+
### Criteria
|
|
72
|
+
|
|
73
|
+
`list`, `match` and a `query` subscription share the criteria language of the server resources — a
|
|
74
|
+
bare value is equality, a bare array means "any of these", and `$eq $ne $gt $gte $lt $lte $in $nin
|
|
75
|
+
$exists $null $like $ilike $regex $startsWith $endsWith $between $contains $contained $overlaps`
|
|
76
|
+
combine under `$and` / `$or` / `$not`. A dotted key reaches into the record; a value of `undefined`
|
|
77
|
+
is skipped. `matchCriteria`, `filterRecords` and `sortRecords` are exported for filtering a list
|
|
78
|
+
already in hand.
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
const open = await resource.match({ status: 'open' })
|
|
82
|
+
const [unsubscribe] = resource.subscribe({
|
|
83
|
+
query: { status: 'open' },
|
|
84
|
+
listener: models => { /* re-runs on every write that changes the answer */ }
|
|
85
|
+
})
|
|
86
|
+
```
|
|
65
87
|
|
|
66
88
|
### `StateModel<T>`
|
|
67
89
|
|
package/agent-meta/manifest.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"package": "@owlmeans/state",
|
|
4
|
-
"version": "0.1.18-rc.
|
|
5
|
-
"generatedAt": "2026-08-
|
|
4
|
+
"version": "0.1.18-rc.7",
|
|
5
|
+
"generatedAt": "2026-08-22T23:28:30.595Z",
|
|
6
6
|
"canonicalRepo": "https://github.com/owlmeans/common",
|
|
7
7
|
"entries": [
|
|
8
8
|
{
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: state
|
|
3
|
-
description: How to use @owlmeans/state — appendStateResource() to register a state resource on a context,
|
|
3
|
+
description: How to use @owlmeans/state — appendStateResource() to register a client state resource on a context, useStoreModel/useStoreList to read it from React, live query subscriptions, and the StateModel commit semantics. Auto-invoked when importing state primitives or building client-side application state.
|
|
4
4
|
user-invocable: false
|
|
5
5
|
---
|
|
6
6
|
<!-- AUTO-GENERATED — do not edit. Regenerate via sync-agent-meta. -->
|
|
@@ -8,40 +8,144 @@ user-invocable: false
|
|
|
8
8
|
# @owlmeans/state
|
|
9
9
|
|
|
10
10
|
**Layer:** Core
|
|
11
|
-
**Install:** `"@owlmeans/state": "^0.1.18-rc.
|
|
11
|
+
**Install:** `"@owlmeans/state": "^0.1.18-rc.7"` in `dependencies`
|
|
12
|
+
|
|
13
|
+
The framework's client store. A state resource is a `Resource` like any other, registered **on the
|
|
14
|
+
context** — which is what separates it from a store held beside the app: a screen, a service and a
|
|
15
|
+
guard all reach the same records through the same container.
|
|
12
16
|
|
|
13
17
|
## Key Exports
|
|
14
18
|
|
|
15
19
|
| Export | Description |
|
|
16
20
|
|--------|-------------|
|
|
17
|
-
| `appendStateResource<C, T>(context, alias)` | Register a state resource on the context |
|
|
18
|
-
| `
|
|
19
|
-
|
|
|
20
|
-
|
|
|
21
|
+
| `appendStateResource<C, T>(context, alias?)` | Register a state resource on the context |
|
|
22
|
+
| `createStateResource<T>(alias?)` | The bare factory, when you register it yourself |
|
|
23
|
+
| `StateResource<T>` | The resource interface — full CRUD plus `all`, `match`, `subscribe`, `listen`, `erase` |
|
|
24
|
+
| `StateModel<T>` | The subscribed wrapper — `record`, `update`, `commit`, `clear` |
|
|
25
|
+
| `matchCriteria`, `filterRecords`, `sortRecords` | The criteria evaluator, for filtering a list you already hold |
|
|
26
|
+
| `DEFAULT_ID` (`_default`), `DEFAULT_ALIAS` (`state`) | Constants |
|
|
27
|
+
|
|
28
|
+
The React hooks live in **`@owlmeans/client`** — `useStoreModel`, `useStoreList`. They are not
|
|
29
|
+
re-exported by `@owlmeans/web-client`, so import them from `@owlmeans/client` directly.
|
|
21
30
|
|
|
22
|
-
##
|
|
31
|
+
## Registering
|
|
23
32
|
|
|
24
|
-
|
|
33
|
+
Every client context already carries one default state resource, so `useStoreModel(id)` works with
|
|
34
|
+
no setup at all. Register a named one per entity when records of different kinds must not share an
|
|
35
|
+
id space:
|
|
25
36
|
|
|
26
37
|
```typescript
|
|
27
38
|
import { appendStateResource } from '@owlmeans/state'
|
|
28
39
|
|
|
29
|
-
export const
|
|
40
|
+
export const TASK_STATE = 'task-state'
|
|
30
41
|
|
|
31
42
|
export const makeContext = <C extends Config, T extends Context<C>>(cfg: C): T => {
|
|
32
43
|
const context = makeBasicContext<C, T>(cfg)
|
|
33
|
-
appendStateResource<C, T>(context,
|
|
34
|
-
context
|
|
44
|
+
appendStateResource<C, T>(context, TASK_STATE)
|
|
45
|
+
// A child context must inherit THIS factory, or it is built without the resource above.
|
|
46
|
+
context.makeContext = makeContext as typeof context.makeContext
|
|
35
47
|
return context
|
|
36
48
|
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Reach it with `context.getStateResource<Task>(TASK_STATE)`. A typed accessor on the context
|
|
52
|
+
(`context.taskStore = () => context.getStateResource(TASK_STATE)`) is optional sugar.
|
|
53
|
+
|
|
54
|
+
## Reading it from React
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
import { useStoreList, useStoreModel } from '@owlmeans/client'
|
|
58
|
+
|
|
59
|
+
// One record, by id. Re-renders whenever that record changes.
|
|
60
|
+
const task = useStoreModel<Task>(id, TASK_STATE)
|
|
61
|
+
task.record.title
|
|
62
|
+
|
|
63
|
+
// A LIVE QUERY. Re-renders whenever any write changes which records match.
|
|
64
|
+
const open = useStoreList<Task>({ query: { status: 'open' }, resource: TASK_STATE })
|
|
65
|
+
open.map(model => model.record.title)
|
|
66
|
+
|
|
67
|
+
// Everything in the store.
|
|
68
|
+
const all = useStoreList<Task>({ query: {}, resource: TASK_STATE })
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
A query subscription creates nothing and re-evaluates on every create, update and delete — a list
|
|
72
|
+
screen never recomputes ids and never re-subscribes to keep up. The criteria object is compared by
|
|
73
|
+
content, so a filter that changes narrows the list.
|
|
74
|
+
|
|
75
|
+
An **id** subscription is different on purpose: it CREATES a placeholder record so a screen has
|
|
76
|
+
something to bind to before the real one arrives. `useStoreModel(undefined)` therefore hands back a
|
|
77
|
+
record whose id is `DEFAULT_ID` — that sentinel, not `null`, is what "nothing loaded yet" looks
|
|
78
|
+
like:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
const loading = task.record.id === DEFAULT_ID
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Writing to it
|
|
85
|
+
|
|
86
|
+
The server is the source of truth; the store is what the screen reads. Fetch, then write what came
|
|
87
|
+
back into the store, and let the subscriptions render it:
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
const store = ctx.getStateResource<Task>(TASK_STATE)
|
|
91
|
+
|
|
92
|
+
const [tasks] = await ctx.entrypoint<ClientEntrypoint<Task[]>>(TASK_LIST).call()
|
|
93
|
+
for (const task of tasks) {
|
|
94
|
+
await store.save(task)
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
`save` creates or replaces. `update` requires the record to exist. `delete(id)` removes it. Each
|
|
99
|
+
one notifies every subscriber that cares.
|
|
100
|
+
|
|
101
|
+
### The commit rule
|
|
102
|
+
|
|
103
|
+
`StateModel.record` is a COPY. Assigning to it changes nothing anyone else can see:
|
|
104
|
+
|
|
105
|
+
```typescript
|
|
106
|
+
model.record.title = 'renamed' // WRONG — a silent no-op, nothing re-renders
|
|
107
|
+
model.update({ title: 'renamed' }) // RIGHT — merges and commits
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
`update(data)` merges and commits in one step; `commit()` writes the current `record` back and is
|
|
111
|
+
what you call after assigning several fields; `clear()` deletes the record. `commit()` skips the
|
|
112
|
+
write when nothing actually changed, so calling it twice is free.
|
|
37
113
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
114
|
+
## Querying
|
|
115
|
+
|
|
116
|
+
`list`, `match` and the `query` subscription all take the same criteria language as the server
|
|
117
|
+
resources, so a filter written for an endpoint means the same thing applied locally:
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
await store.all() // every record, plain array
|
|
121
|
+
await store.match({ status: 'open' }) // the matching records, plain array
|
|
122
|
+
await store.list({ status: ['open', 'blocked'] }) // the Resource envelope: { items, pager }
|
|
123
|
+
await store.list({ criteria: { status: 'open' }, pager: { page: 0, size: 20, sort: ['createdAt'] } })
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
- A bare value is equality; a bare **array means "any of these"**.
|
|
127
|
+
- Operators: `$eq $ne $gt $gte $lt $lte $in $nin $exists $null $like $ilike $regex $startsWith
|
|
128
|
+
$endsWith $between $contains $contained $overlaps`, and `$and $or $not` to combine.
|
|
129
|
+
- A dotted key reaches into the record (`'owner.team'`).
|
|
130
|
+
- A criteria value of `undefined` is SKIPPED — an untouched filter must not empty the list.
|
|
131
|
+
- `list()` with no arguments returns everything: a state resource is unpaged unless a pager is
|
|
132
|
+
asked for, unlike a server resource that defaults to a page size.
|
|
133
|
+
|
|
134
|
+
`all()` and `match()` return plain arrays; `list()` returns `{ items, pager }` because that is the
|
|
135
|
+
`Resource` contract. Destructuring the wrong one is a silently empty render, so pick by shape.
|
|
136
|
+
|
|
137
|
+
## Subscribing outside React
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
const [unsubscribe] = store.subscribe({ query: { status: 'open' }, listener: models => { ... } })
|
|
141
|
+
const stop = store.listen(models => { ... }) // every change, whatever it is
|
|
142
|
+
await store.erase() // drop everything
|
|
41
143
|
```
|
|
42
144
|
|
|
145
|
+
Subscribing the same listener function twice throws — hold the unsubscribe and call it instead.
|
|
146
|
+
|
|
43
147
|
## Depends On
|
|
44
148
|
|
|
45
149
|
- `@owlmeans/resource` — `StateResource` extends `Resource`
|
|
46
150
|
- `@owlmeans/context` — for `getStateResource`
|
|
47
|
-
-
|
|
151
|
+
- React hooks: `@owlmeans/client`
|
package/build/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,OAAuB,QAAQ,SAAqC;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,OAAuB,QAAQ,SAAqC;gBAExD,GAAG,EAAE,MAAM;CAIxB;AAED,qBAAa,kBAAmB,SAAQ,iBAAiB;IACvD,OAAuB,QAAQ,SAA0C;gBAE7D,GAAG,EAAE,MAAM;CAIxB"}
|
package/build/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAC3C,MAAM,CAAU,QAAQ,GAAG,GAAG,aAAa,CAAC,QAAQ,SAAS,CAAA;IAEpE,YAAY,GAAW;QACrB,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAA;IACxC,CAAC
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IAC3C,MAAM,CAAU,QAAQ,GAAG,GAAG,aAAa,CAAC,QAAQ,SAAS,CAAA;IAEpE,YAAY,GAAW;QACrB,KAAK,CAAC,WAAW,GAAG,EAAE,CAAC,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAA;IACxC,CAAC;;AAGH,MAAM,OAAO,kBAAmB,SAAQ,iBAAiB;IAChD,MAAM,CAAU,QAAQ,GAAG,GAAG,iBAAiB,CAAC,QAAQ,UAAU,CAAA;IAEzE,YAAY,GAAW;QACrB,KAAK,CAAC,YAAY,GAAG,EAAE,CAAC,CAAA;QACxB,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC,QAAQ,CAAA;IACzC,CAAC;;AAGH,aAAa,CAAC,kBAAkB,CAAC,iBAAiB,CAAC,CAAA;AACnD,aAAa,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAA"}
|
package/build/index.d.ts
CHANGED
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAE/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,mBAAmB,YAAY,CAAA;AAE/B,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA"}
|
package/build/index.js
CHANGED
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA"}
|
package/build/resource.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAA8C,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACpG,OAAO,KAAK,EAA6B,aAAa,EAAE,mBAAmB,EAA2B,MAAM,YAAY,CAAA;AAKxH,OAAO,KAAK,EAAE,YAAY,IAAI,OAAO,EAAE,WAAW,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAEvF,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,cAAc,EAAE,QAAO,MAAsB,KAAG,aAAa,CAAC,CAAC,CAsT5G,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,EACxE,KAAK,CAAC,EAAE,QAAO,MAAsB,KACpC,CAAC,GAAG,mBAWN,CAAA"}
|
package/build/resource.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { appendContextual } from '@owlmeans/context';
|
|
2
2
|
import { MisshapedRecord, RecordExists, UnknownRecordError, UnsupportedArgumentError } from '@owlmeans/resource';
|
|
3
|
+
import { prepareListOptions } from '@owlmeans/resource';
|
|
3
4
|
import { DEFAULT_ALIAS, DEFAULT_ID } from './consts';
|
|
4
5
|
import { StateListenerError } from './errors.js';
|
|
5
6
|
import { createStateModel } from './utils/model.js';
|
|
7
|
+
import { filterRecords, sortRecords } from './utils/criteria.js';
|
|
6
8
|
export const createStateResource = (alias = DEFAULT_ALIAS) => {
|
|
7
9
|
const location = `state-resource:${alias}`;
|
|
8
10
|
const store = {};
|
|
@@ -10,10 +12,20 @@ export const createStateResource = (alias = DEFAULT_ALIAS) => {
|
|
|
10
12
|
const listenerToRecord = new Map();
|
|
11
13
|
const globalListeners = [];
|
|
12
14
|
const systemToListeners = {};
|
|
15
|
+
const listenerToQuery = new Map();
|
|
16
|
+
const systemToQueries = {};
|
|
13
17
|
const _notifyGlobalListeners = (records) => {
|
|
14
18
|
globalListeners.forEach(listener => listener(records.map(record => createStateModel(record, resource))));
|
|
15
19
|
};
|
|
16
20
|
const _usubscribe = (params) => () => {
|
|
21
|
+
listenerToQuery.delete(params.listener);
|
|
22
|
+
Object.entries(systemToQueries).some(([key, subscription]) => {
|
|
23
|
+
if (subscription.listener === params.listener) {
|
|
24
|
+
delete systemToQueries[key];
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
});
|
|
17
29
|
const ids = listenerToRecord.get(params.listener);
|
|
18
30
|
listenerToRecord.delete(params.listener);
|
|
19
31
|
ids?.forEach(id => {
|
|
@@ -33,6 +45,19 @@ export const createStateResource = (alias = DEFAULT_ALIAS) => {
|
|
|
33
45
|
return false;
|
|
34
46
|
});
|
|
35
47
|
};
|
|
48
|
+
const _queryModels = (query) => filterRecords(Object.values(store), query).map(record => createStateModel(record, resource));
|
|
49
|
+
/**
|
|
50
|
+
* Re-run every live query and hand each subscriber its current answer.
|
|
51
|
+
*
|
|
52
|
+
* Deliberately unconditional: deciding whether a write could have changed a given query's
|
|
53
|
+
* result is the same work as re-running it, and getting that wrong leaves a list stale with
|
|
54
|
+
* nothing to indicate it.
|
|
55
|
+
*/
|
|
56
|
+
const _notifyQueryListeners = () => {
|
|
57
|
+
for (const subscription of [...listenerToQuery.values(), ...Object.values(systemToQueries)]) {
|
|
58
|
+
subscription.listener(_queryModels(subscription.query), subscription.systemId);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
36
61
|
const _notifyListeners = (record) => {
|
|
37
62
|
for (const listener of recordToListener.get(record.id) ?? []) {
|
|
38
63
|
listener([createStateModel(record, resource)]);
|
|
@@ -66,18 +91,28 @@ export const createStateResource = (alias = DEFAULT_ALIAS) => {
|
|
|
66
91
|
}
|
|
67
92
|
return record;
|
|
68
93
|
},
|
|
94
|
+
/**
|
|
95
|
+
* The `Resource` list contract, criteria and pager included.
|
|
96
|
+
*
|
|
97
|
+
* The default page size is 0 — meaning UNPAGED — rather than the ten a server resource
|
|
98
|
+
* defaults to. Every existing caller of a state resource writes `list()` and expects the
|
|
99
|
+
* whole store back; silently returning the first ten would be a truncation nothing reports.
|
|
100
|
+
* Pagination happens when a pager is actually asked for.
|
|
101
|
+
*/
|
|
69
102
|
list: async (criteria, opts) => {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
103
|
+
const options = prepareListOptions(0, criteria, opts);
|
|
104
|
+
const matched = sortRecords(filterRecords(Object.values(store), options.criteria), options.pager?.sort);
|
|
105
|
+
const size = options.pager?.size ?? 0;
|
|
106
|
+
const page = options.pager?.page ?? 0;
|
|
107
|
+
const items = size > 0 ? matched.slice(page * size, page * size + size) : matched;
|
|
76
108
|
const result = {
|
|
77
|
-
items
|
|
109
|
+
items,
|
|
110
|
+
pager: { ...options.pager, total: matched.length }
|
|
78
111
|
};
|
|
79
112
|
return result;
|
|
80
113
|
},
|
|
114
|
+
all: async () => Object.values(store),
|
|
115
|
+
match: async (criteria) => filterRecords(Object.values(store), criteria),
|
|
81
116
|
save: async (record, opts) => {
|
|
82
117
|
const id = record.id ?? DEFAULT_ID;
|
|
83
118
|
if (store[id] != null) {
|
|
@@ -98,6 +133,7 @@ export const createStateResource = (alias = DEFAULT_ALIAS) => {
|
|
|
98
133
|
store[record.id] = record;
|
|
99
134
|
_notifyListeners(store[record.id]);
|
|
100
135
|
_notifyGlobalListeners([store[record.id]]);
|
|
136
|
+
_notifyQueryListeners();
|
|
101
137
|
return record;
|
|
102
138
|
},
|
|
103
139
|
update: async (record, opts) => {
|
|
@@ -114,6 +150,7 @@ export const createStateResource = (alias = DEFAULT_ALIAS) => {
|
|
|
114
150
|
Object.assign(reference, record);
|
|
115
151
|
_notifyListeners(reference);
|
|
116
152
|
_notifyGlobalListeners([reference]);
|
|
153
|
+
_notifyQueryListeners();
|
|
117
154
|
return reference;
|
|
118
155
|
},
|
|
119
156
|
delete: async (id, opts) => {
|
|
@@ -131,6 +168,7 @@ export const createStateResource = (alias = DEFAULT_ALIAS) => {
|
|
|
131
168
|
delete store[_id];
|
|
132
169
|
_notifyListeners(record);
|
|
133
170
|
_notifyGlobalListeners([record]);
|
|
171
|
+
_notifyQueryListeners();
|
|
134
172
|
return record;
|
|
135
173
|
},
|
|
136
174
|
pick: async (id, opts) => {
|
|
@@ -145,6 +183,31 @@ export const createStateResource = (alias = DEFAULT_ALIAS) => {
|
|
|
145
183
|
return record;
|
|
146
184
|
},
|
|
147
185
|
subscribe: params => {
|
|
186
|
+
/**
|
|
187
|
+
* A query subscription is a different thing from an id subscription and cannot be layered
|
|
188
|
+
* on top of one: it creates no placeholder record, and its answer is a set that changes
|
|
189
|
+
* membership rather than a fixed list of records that change content. `id` wins when both
|
|
190
|
+
* are given, so an existing caller that happens to pass a query keeps its behaviour.
|
|
191
|
+
*/
|
|
192
|
+
if (params.query != null && params.id == null) {
|
|
193
|
+
const subscription = { query: params.query, listener: params.listener };
|
|
194
|
+
const models = _queryModels(params.query);
|
|
195
|
+
if (params._systemId != null) {
|
|
196
|
+
const key = `${params._systemId}:query:${JSON.stringify(params.query)}`;
|
|
197
|
+
if (systemToQueries[key] != null) {
|
|
198
|
+
return [_usubscribe(params), models];
|
|
199
|
+
}
|
|
200
|
+
subscription.systemId = key;
|
|
201
|
+
systemToQueries[key] = subscription;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
if (listenerToQuery.has(params.listener)) {
|
|
205
|
+
throw new StateListenerError('subscribed');
|
|
206
|
+
}
|
|
207
|
+
listenerToQuery.set(params.listener, subscription);
|
|
208
|
+
}
|
|
209
|
+
return [_usubscribe(params), models];
|
|
210
|
+
}
|
|
148
211
|
const id = params.id ?? DEFAULT_ID;
|
|
149
212
|
const ids = Array.isArray(id) ? id : [id];
|
|
150
213
|
const records = ids.map(id => {
|
package/build/resource.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAGhH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAGnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAA2B,KAAK,GAAW,aAAa,EAAoB,EAAE;IAC/G,MAAM,QAAQ,GAAG,kBAAkB,KAAK,EAAE,CAAA;IAE1C,MAAM,KAAK,GAAwB,EAAE,CAAA;IACrC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAiC,CAAA;IACjE,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAA8B,CAAA;IAC9D,MAAM,eAAe,GAAuB,EAAE,CAAA;IAC9C,MAAM,iBAAiB,GAAqC,EAAE,CAAA;IAI9D,MAAM,sBAAsB,GAAG,CAAC,OAAY,EAAE,EAAE;QAC9C,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAC1D,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,WAAW,GAAG,CAAC,MAAkC,EAAE,EAAE,CAAC,GAAG,EAAE;QAC/D,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACjD,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QACxC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE;YAChB,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAC1C,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;gBACtB,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;gBACjC,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;oBACzB,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;QACF,MAAM,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE;YACzD,IAAI,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACjC,OAAO,iBAAiB,CAAC,GAAG,CAAC,CAAA;gBAC7B,OAAO,IAAI,CAAA;YACb,CAAC;YAED,OAAO,KAAK,CAAA;QACd,CAAC,CAAC,CAAA;IACJ,CAAC,CAAA;IAED,MAAM,gBAAgB,GAAG,CAAC,MAAS,EAAE,EAAE;QACrC,KAAK,MAAM,QAAQ,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAG,CAAC,IAAI,EAAE,EAAE,CAAC;YAC9D,QAAQ,CAAC,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;QAChD,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACjD,MAAM,CAAC,EAAE,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACtC,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YACzC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAG,CAAC,EAAE,CAAC;gBAC7B,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YACnF,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,MAAM,QAAQ,GAAqB,gBAAgB,CAAmB,KAAK,EAAE;QAC3E,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC7B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;YACnD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAA;YAClC,CAAC;YAED,OAAO,MAAa,CAAA;QACtB,CAAC;QAED,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC9B,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,MAAM,IAAI,wBAAwB,CAAC,GAAG,QAAQ,YAAY,CAAC,CAAA;YAC7D,CAAC;YACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,wBAAwB,CAAC,GAAG,QAAQ,WAAW,CAAC,CAAA;YAC5D,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAkB,CAAA;YAEzC,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAA;YACb,CAAC;YAED,OAAO,MAAa,CAAA;QACtB,CAAC;QAED,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE;YAC7B,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;gBACrB,MAAM,IAAI,wBAAwB,CAAC,GAAG,QAAQ,gBAAgB,CAAC,CAAA;YACjE,CAAC;YACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,wBAAwB,CAAC,GAAG,QAAQ,YAAY,CAAC,CAAA;YAC7D,CAAC;YAED,MAAM,MAAM,GAAkB;gBAC5B,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAQ;aAChE,CAAA;YAED,OAAO,MAAa,CAAA;QACtB,CAAC;QAED,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC3B,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,UAAU,CAAA;YAClC,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;gBACtB,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YACtC,CAAC;YAED,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAwB,CAAC,CAAA;QAC1D,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC7B,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;gBAC3C,MAAM,CAAC,EAAE,GAAG,UAAU,CAAA;YACxB,CAAC;YACD,IAAI,KAAK,CAAC,MAAM,CAAC,EAAc,CAAC,IAAI,IAAI,EAAE,CAAC;gBACzC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACnC,CAAC;YACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,wBAAwB,CAAC,GAAG,QAAQ,cAAc,CAAC,CAAA;YAC/D,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,EAAc,CAAC,GAAG,MAAsB,CAAA;YAErD,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAc,CAAC,CAAC,CAAA;YAC9C,sBAAsB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAc,CAAC,CAAC,CAAC,CAAA;YAEtD,OAAO,MAAa,CAAA;QACtB,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE;YAC7B,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,wBAAwB,CAAC,GAAG,QAAQ,cAAc,CAAC,CAAA;YAC/D,CAAC;YACD,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;gBAC3C,MAAM,CAAC,EAAE,GAAG,UAAU,CAAA;YACxB,CAAC;YACD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,EAAc,CAAC,CAAA;YAC9C,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;gBACtB,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;YACzC,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAA;YAEhC,gBAAgB,CAAC,SAAS,CAAC,CAAA;YAC3B,sBAAsB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;YAEnC,OAAO,SAAgB,CAAA;QACzB,CAAC;QAED,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YACzB,MAAM,GAAG,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;YAC/C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChB,MAAM,IAAI,wBAAwB,CAAC,IAAI,CAAC,CAAA;YAC1C,CAAC;YACD,MAAM,MAAM,GAAa,KAAK,CAAC,GAAe,CAAM,CAAA;YACpD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,OAAO,IAAI,CAAA;YACb,CAAC;YACD,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;gBACjB,MAAM,IAAI,wBAAwB,CAAC,GAAG,QAAQ,cAAc,CAAC,CAAA;YAC/D,CAAC;YACD,OAAO,KAAK,CAAC,GAAe,CAAC,CAAA;YAE7B,gBAAgB,CAAC,MAAM,CAAC,CAAA;YACxB,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;YAEhC,OAAO,MAAa,CAAA;QACtB,CAAC;QAED,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;YACvB,MAAM,GAAG,GAAG,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAA;YAC/C,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;gBAChB,MAAM,IAAI,eAAe,CAAC,IAAI,CAAC,CAAA;YACjC,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAC/C,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAA;YACnC,CAAC;YAED,OAAO,MAAa,CAAA;QACtB,CAAC;QAED,SAAS,EAAE,MAAM,CAAC,EAAE;YAClB,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,UAAU,CAAA;YAClC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;YACzC,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAC3B,IAAI,KAAK,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;oBACtB,KAAK,CAAC,EAAc,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,EAAO,CAAA;gBACxD,CAAC;gBACD,OAAO,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAA;YAC9C,CAAC,CAAC,CAAA;YACF,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE,CAAC;gBAC7B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAA;gBAClD,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;oBACnC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAA;gBACvC,CAAC;gBAED,iBAAiB,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAA;YAC1C,CAAC;iBAAM,CAAC;gBACN,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC1C,MAAM,IAAI,kBAAkB,CAAC,YAAY,CAAC,CAAA;gBAC5C,CAAC;gBACD,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;gBAC1C,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;oBACf,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC9B,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;oBACrC,CAAC;oBACD,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;gBAChD,CAAC,CAAC,CAAA;YACJ,CAAC;YAED,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAA;QACvC,CAAC;QAED,MAAM,EAAE,QAAQ,CAAC,EAAE;YACjB,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YAE9B,OAAO,GAAG,EAAE;gBACV,MAAM,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;gBAC/C,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;oBACf,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;gBAClC,CAAC;YACH,CAAC,CAAA;QACH,CAAC;QAED,KAAK,EAAE,KAAK,IAAI,EAAE;YAChB,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACxE,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,GAAM,EAAE,KAAK,GAAW,aAAa,EACZ,EAAE;IAC3B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAA;IAE3C,MAAM,IAAI,GAAG,GAA8B,CAAA;IAE3C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAA;IAC/B,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAA;IACxE,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
|
package/build/types.d.ts
CHANGED
|
@@ -6,10 +6,38 @@ export interface StateResource<T extends ResourceRecord> extends Resource<T> {
|
|
|
6
6
|
subscribe: (params: StateSubscriptionOption<T>) => [() => void, StateModel<T>[]];
|
|
7
7
|
listen: (listener: StateListener<T>) => () => void;
|
|
8
8
|
erase: () => Promise<void>;
|
|
9
|
+
/**
|
|
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.
|
|
16
|
+
*/
|
|
17
|
+
all: () => Promise<T[]>;
|
|
18
|
+
/**
|
|
19
|
+
* The records the criteria accepts, as a plain array.
|
|
20
|
+
*
|
|
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.
|
|
24
|
+
*/
|
|
25
|
+
match: (criteria?: ListCriteria) => Promise<T[]>;
|
|
9
26
|
}
|
|
10
27
|
export interface StateSubscriptionOption<T extends ResourceRecord> {
|
|
11
28
|
id?: string | string[];
|
|
12
29
|
_systemId?: string;
|
|
30
|
+
/**
|
|
31
|
+
* Subscribe to a live QUERY instead of to fixed ids.
|
|
32
|
+
*
|
|
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.
|
|
37
|
+
*
|
|
38
|
+
* Unlike an id subscription, this one creates nothing: an empty store yields an empty list
|
|
39
|
+
* rather than a placeholder record.
|
|
40
|
+
*/
|
|
13
41
|
query?: ListCriteria;
|
|
14
42
|
default?: Partial<T>;
|
|
15
43
|
listener: StateListener<T>;
|
package/build/types.d.ts.map
CHANGED
|
@@ -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;
|
|
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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { ListCriteria, ListSort, ResourceRecord } from '@owlmeans/resource';
|
|
2
|
+
/**
|
|
3
|
+
* Whether one record satisfies the criteria.
|
|
4
|
+
*
|
|
5
|
+
* `undefined` as a criteria value is skipped rather than compared — it is what an optional filter
|
|
6
|
+
* looks like when nothing was chosen, and treating it as "must be undefined" makes an unset
|
|
7
|
+
* dropdown filter the list down to nothing.
|
|
8
|
+
*
|
|
9
|
+
* @throws {UnsupportedArgumentError} on an unknown operator.
|
|
10
|
+
*/
|
|
11
|
+
export declare const matchCriteria: <T extends ResourceRecord>(record: T, criteria?: ListCriteria) => boolean;
|
|
12
|
+
/** Every record the criteria accepts, in insertion order. */
|
|
13
|
+
export declare const filterRecords: <T extends ResourceRecord>(records: T[], criteria?: ListCriteria) => T[];
|
|
14
|
+
/**
|
|
15
|
+
* Sort a copy by `ListPager.sort`. `[field, true]` is descending — the same mapping mongo's
|
|
16
|
+
* `order ? -1 : 1` and the postgres builder use, so a pager written for one store orders the
|
|
17
|
+
* same way against another.
|
|
18
|
+
*/
|
|
19
|
+
export declare const sortRecords: <T extends ResourceRecord>(records: T[], sort?: ListSort[]) => T[];
|
|
20
|
+
//# sourceMappingURL=criteria.d.ts.map
|
|
@@ -0,0 +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,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"}
|