@issuegraph/store 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -128,6 +128,16 @@ An optional `EdgeGuard` sits beside it for refusals that need to see the graph
128
128
  type EdgeGuard = (context: { mutation; current; next }) => InvalidReason | undefined;
129
129
  ```
130
130
 
131
+ `current` is the **newest document the source has answered with**, which is the landed one
132
+ except after a conflict: the conflict's `upstream` is newer than anything landed, so it is
133
+ what the guard is shown until the next answer that lands replaces it. A verdict reached on
134
+ the pre-conflict document would admit an edit that closes a loop on the source's own document
135
+ (the edge the upstream added, with the one queued behind it), and an adapter applies what it
136
+ is handed. Only the guard reads the newer copy: the order and the drawn edges keep reading
137
+ `landed`, and so do the store's own structural refusals — a duplicate or a vanished edge is a
138
+ question the source answers itself, with a document the store adopts, so letting that
139
+ dispatch through is what repairs the store's copy.
140
+
131
141
  ---
132
142
 
133
143
  ## The order can be trusted, structurally
@@ -174,13 +184,15 @@ it, split by what the answer needs to see:
174
184
 
175
185
  - the store itself, for what is visible in the edit — a self-edge, a reference the document
176
186
  does not hold, an exact duplicate, a retype to the kind the edge already has, a flip on a
177
- symmetric relationship;
187
+ symmetric relationship, and a second reference on a single-valued field (`cardinality`:
188
+ every relationship field but `blocked-by` holds one, §4.3 — the one writer rule of the
189
+ format that needs no graph walk, so it is refused here rather than once per host);
178
190
  - your `EdgeGuard`, for anything needing the graph.
179
191
 
180
192
  ## A failed write is marked, never reverted
181
193
 
182
194
  The user's work stays on the canvas. `retry` re-dispatches it, and on a conflict you get the
183
- two single-step resolutions below. **Nothing auto-merges, nothing auto-reverts, and nothing
195
+ resolutions below. **Nothing auto-merges, nothing auto-reverts, and nothing
184
196
  times out** — `discardMine` is the only call that removes an optimistic edit, and a person has
185
197
  to make it.
186
198
 
@@ -188,32 +200,38 @@ to make it.
188
200
 
189
201
  A conflict's `upstream` is **for display, and is never adopted** — it is the "view diff" half
190
202
  of the choice, and a reading of the past: a conflict can sit on screen for as long as a person
191
- takes to read it.
192
-
193
- The store ships the two single-step resolutions and **not** the composite:
194
-
195
- ```ts
196
- store.discardMine(id); // drop the overlay; adopts nothing
197
- store.retry(id); // re-dispatch, unchanged
198
- ```
203
+ takes to read it. The one other thing it is used for is the guard: it is the newest document
204
+ the source has answered with, so an edit proposed or queued after the conflict is shown to
205
+ your `EdgeGuard` against it rather than against the copy the source has said it no longer
206
+ holds (see "The deriver" above). Shown, not adopted — the order does not move for it, and a
207
+ `retry` is still re-dispatched unchanged.
199
208
 
200
- **"Retry on latest" is yours to compose**, and the two lines are the point:
209
+ The store ships three resolutions:
201
210
 
202
211
  ```ts
203
- await store.rehydrate();
204
- if (store.getSnapshot().hydrationError) return; // do not retry unconfirmed
205
- if (store.getSnapshot().writes.some((w) => w.mutationId === id)) store.retry(id);
212
+ store.discardMine(id); // drop the overlay; adopts nothing
213
+ store.retry(id); // re-dispatch, unchanged, against the document as it stands
214
+ store.retryOnLatest(id); // re-read the document, then re-dispatch, unchanged, against what it confirmed
206
215
  ```
207
216
 
208
- That is deliberate, and it is the one place this package asks you to write something it could
209
- have written for you. Both calls above read state and act on it with no `await` in between, so
210
- neither can be overtaken. The composite has an `await` in the middle, and everything that can
211
- happen during it — the read failing, the user discarding, the user pressing again — is a
212
- decision about *user intent* that the caller holding the await can make and the store cannot.
213
- What a store-owned version would need — a resolution reservation, or cancellation on the
214
- port — and why it belongs with the editor layer instead, is
215
- [issue #7](https://github.com/autnmy/issuegraph/issues/7). The adapter is the authority on the current document; the store asks it
216
- rather than keeping a guess about how stale its own copy has become.
217
+ `discardMine` and `retry` read the record and act on it with no `await` in between, so neither
218
+ can be overtaken. `retryOnLatest` has a read in the middle, and everything that can happen
219
+ during it — the read failing, the user discarding, the user pressing again — is a decision
220
+ about *user intent*. The store settles all three by **reserving the edit before the read**:
221
+ the record is `pending` from the call on, and a pending edit is one `discardMine` and a second
222
+ press decline to touch, exactly as they do while any write is in flight. The read and the
223
+ re-dispatch then run as **one queued operation**, so nothing can be queued between them:
224
+
225
+ - the read **fails** — the record is restored exactly as it was, `upstream` and all, nothing is
226
+ dispatched, and `hydrationError` says why. The conflict is still there to try again;
227
+ - the read **confirms** a document that no longer admits the edit — it is refused `invalid`
228
+ against that document and never dispatched;
229
+ - otherwise the edit goes out against the confirmed document, with the guard judging it there.
230
+
231
+ That reservation is what the store used to lack, and why the composition once had to live in
232
+ the host — [issue #7](https://github.com/autnmy/issuegraph/issues/7) is the record of the three
233
+ defects a hand-rolled version drew. The adapter is the authority on the current document; the
234
+ store asks it rather than keeping a guess about how stale its own copy has become.
217
235
 
218
236
  `lastChange` belongs to the edit that is **current when it lands**. Two edits proposed before
219
237
  the first settles means the first's summary would otherwise be written after the second began,
package/dist/model.d.ts CHANGED
@@ -69,14 +69,15 @@ export interface GraphDocument {
69
69
  /**
70
70
  * The identity of an edge, as a pure function of its content.
71
71
  *
72
- * References are percent-encoded before joining, so the separator cannot appear
73
- * inside a reference: `encodeURIComponent` escapes `|`, which means no reference
74
- * — however a tracker spells it — can forge the identity of a different edge.
72
+ * THE RULE ITSELF LIVES IN `@issuegraph/core`, and this is deliberately a thin
73
+ * delegation rather than a second implementation. The viewer stamps the same
74
+ * identity on a `together-with` connector so a click can name an edge, and it
75
+ * cannot depend on this package — so the format had to move to the one layer
76
+ * both already depend on. Two spellings of an identity is how a host comes to
77
+ * hold an id that matches no `StoredEdge`.
75
78
  *
76
- * The two symmetric kinds (§4.3.4, §4.3.7) sort their endpoints, so the two
77
- * spellings of one relationship collapse to one identity. The directed kinds do
78
- * not, because for them the direction IS the fact: `A blocked-by B` and
79
- * `B blocked-by A` are opposite claims about which issue may start.
79
+ * Kept as a named export because it is the store's vocabulary — callers here
80
+ * think in `EdgeKind` and `IssueRef`, not in the format's field names.
80
81
  */
81
82
  export declare function edgeId(kind: EdgeKind, from: IssueRef, to: IssueRef): EdgeId;
82
83
  /** An edge with its identity filled in from its content. */
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAwB,MAAM,kBAAkB,CAAC;AAEvF;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,mFAAmF;AACnF,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC;AAEjC;;;;;;;;GAQG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,oFAAoF;AACpF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;CACvB;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;CACvC;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,MAAM,CAG3E;AAED,4DAA4D;AAC5D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,UAAU,CAEjF;AAED,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEpF;AAED,gEAAgE;AAChE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAExE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,SAAS,UAAU,EAAE,EAAE,CAAC,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAOvF"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAgB,MAAM,kBAAkB,CAAC;AAE/E;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,mFAAmF;AACnF,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC;AAEjC;;;;;;;;GAQG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC;AAE5B,oFAAoF;AACpF,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;CACvB;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;CACvC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,MAAM,CAE3E;AAED,4DAA4D;AAC5D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,UAAU,CAEjF;AAED,gFAAgF;AAChF,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAEpF;AAED,gEAAgE;AAChE,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,GAAG,OAAO,CAExE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,SAAS,UAAU,EAAE,EAAE,CAAC,EAAE,SAAS,UAAU,EAAE,GAAG,OAAO,CAOvF"}
package/dist/model.js CHANGED
@@ -7,22 +7,22 @@
7
7
  *
8
8
  * @see https://github.com/autnmy/issuegraph/blob/main/SPEC.md
9
9
  */
10
- import { isSymmetricEdgeField } from '@issuegraph/core';
10
+ import { edgeIdentity } from '@issuegraph/core';
11
11
  /**
12
12
  * The identity of an edge, as a pure function of its content.
13
13
  *
14
- * References are percent-encoded before joining, so the separator cannot appear
15
- * inside a reference: `encodeURIComponent` escapes `|`, which means no reference
16
- * — however a tracker spells it — can forge the identity of a different edge.
14
+ * THE RULE ITSELF LIVES IN `@issuegraph/core`, and this is deliberately a thin
15
+ * delegation rather than a second implementation. The viewer stamps the same
16
+ * identity on a `together-with` connector so a click can name an edge, and it
17
+ * cannot depend on this package — so the format had to move to the one layer
18
+ * both already depend on. Two spellings of an identity is how a host comes to
19
+ * hold an id that matches no `StoredEdge`.
17
20
  *
18
- * The two symmetric kinds (§4.3.4, §4.3.7) sort their endpoints, so the two
19
- * spellings of one relationship collapse to one identity. The directed kinds do
20
- * not, because for them the direction IS the fact: `A blocked-by B` and
21
- * `B blocked-by A` are opposite claims about which issue may start.
21
+ * Kept as a named export because it is the store's vocabulary — callers here
22
+ * think in `EdgeKind` and `IssueRef`, not in the format's field names.
22
23
  */
23
24
  export function edgeId(kind, from, to) {
24
- const [first, second] = isSymmetricEdgeField(kind) && to < from ? [to, from] : [from, to];
25
- return `${kind}|${encodeURIComponent(first)}|${encodeURIComponent(second)}`;
25
+ return edgeIdentity(kind, from, to);
26
26
  }
27
27
  /** An edge with its identity filled in from its content. */
28
28
  export function makeEdge(kind, from, to) {
package/dist/model.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAiC,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAmEvF;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,IAAc,EAAE,EAAY;IACjE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1F,OAAO,GAAG,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;AAC9E,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,QAAQ,CAAC,IAAc,EAAE,IAAc,EAAE,EAAY;IACnE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACxD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,QAAQ,CAAC,QAAuB,EAAE,EAAU;IAC1D,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,QAAQ,CAAC,QAAuB,EAAE,GAAa;IAC7D,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CAAC,CAAwB,EAAE,CAAwB;IAC5E,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAiC,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAmE/E;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,IAAc,EAAE,EAAY;IACjE,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,QAAQ,CAAC,IAAc,EAAE,IAAc,EAAE,EAAY;IACnE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AACxD,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,QAAQ,CAAC,QAAuB,EAAE,EAAU;IAC1D,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,QAAQ,CAAC,QAAuB,EAAE,GAAa;IAC7D,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,WAAW,CAAC,CAAwB,EAAE,CAAwB;IAC5E,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -76,8 +76,17 @@ export interface InvalidReason {
76
76
  * `guard-failed` is the opposite case — the guard threw, so no verdict was
77
77
  * reached at all. It refuses rather than proceeding, because an unknown verdict
78
78
  * is not permission to write.
79
+ *
80
+ * `cardinality` is a rule of the FORMAT rather than of the store's own
81
+ * structure: every relationship field but `blocked-by` holds one reference
82
+ * (§4.3, `EDGE_CARDINALITY`). It is refused here all the same, because it is
83
+ * visible from the edit and the document alone — the same test that puts
84
+ * `duplicate-edge` here rather than in a guard. Left to hosts, the rule was
85
+ * enforced once per host on one route to a write each, and an adapter that
86
+ * enforced it reported a format rule as an upstream rejection on a write that
87
+ * never left the client (issue #11).
79
88
  */
80
- export declare const INVALID_CODES: readonly ["self-edge", "unknown-issue", "unknown-edge", "duplicate-edge", "unchanged-kind", "symmetric-edge", "would-cycle", "guard-failed"];
89
+ export declare const INVALID_CODES: readonly ["self-edge", "unknown-issue", "unknown-edge", "duplicate-edge", "unchanged-kind", "symmetric-edge", "cardinality", "would-cycle", "guard-failed"];
81
90
  /** A refusal code. */
82
91
  export type InvalidCode = (typeof INVALID_CODES)[number];
83
92
  //# sourceMappingURL=mutation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../src/mutation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,yEAMb,CAAC;AAEZ,mCAAmC;AACnC,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAIrD,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAE7D;AAED,0EAA0E;AAC1E,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAClG;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAC/E;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAEtE,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,8IASf,CAAC;AAEZ,sBAAsB;AACtB,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"mutation.d.ts","sourceRoot":"","sources":["../src/mutation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE7D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,yEAMb,CAAC;AAEZ,mCAAmC;AACnC,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAIrD,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,SAAS,CAE7D;AAED,0EAA0E;AAC1E,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC;AAEhC;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;CAAE,GAClG;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE,GAC/E;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,+EAA+E;AAC/E,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC;AAEtE,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,aAAa,6JAUf,CAAC;AAEZ,sBAAsB;AACtB,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC"}
package/dist/mutation.js CHANGED
@@ -44,6 +44,15 @@ export function isEdgeState(value) {
44
44
  * `guard-failed` is the opposite case — the guard threw, so no verdict was
45
45
  * reached at all. It refuses rather than proceeding, because an unknown verdict
46
46
  * is not permission to write.
47
+ *
48
+ * `cardinality` is a rule of the FORMAT rather than of the store's own
49
+ * structure: every relationship field but `blocked-by` holds one reference
50
+ * (§4.3, `EDGE_CARDINALITY`). It is refused here all the same, because it is
51
+ * visible from the edit and the document alone — the same test that puts
52
+ * `duplicate-edge` here rather than in a guard. Left to hosts, the rule was
53
+ * enforced once per host on one route to a write each, and an adapter that
54
+ * enforced it reported a format rule as an upstream rejection on a write that
55
+ * never left the client (issue #11).
47
56
  */
48
57
  export const INVALID_CODES = Object.freeze([
49
58
  'self-edge',
@@ -52,6 +61,7 @@ export const INVALID_CODES = Object.freeze([
52
61
  'duplicate-edge',
53
62
  'unchanged-kind',
54
63
  'symmetric-edge',
64
+ 'cardinality',
55
65
  'would-cycle',
56
66
  'guard-failed',
57
67
  ]);
@@ -1 +1 @@
1
- {"version":3,"file":"mutation.js","sourceRoot":"","sources":["../src/mutation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,UAAU;IACV,eAAe;IACf,SAAS;IACT,QAAQ;IACR,UAAU;CACF,CAAC,CAAC;AAKZ,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAS,WAAW,CAAC,CAAC;AAEzE,mDAAmD;AACnD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AA+BD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,WAAW;IACX,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,aAAa;IACb,cAAc;CACN,CAAC,CAAC"}
1
+ {"version":3,"file":"mutation.js","sourceRoot":"","sources":["../src/mutation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,UAAU;IACV,eAAe;IACf,SAAS;IACT,QAAQ;IACR,UAAU;CACF,CAAC,CAAC;AAKZ,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAS,WAAW,CAAC,CAAC;AAEzE,mDAAmD;AACnD,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,OAAO,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnC,CAAC;AA+BD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC;IACzC,WAAW;IACX,eAAe;IACf,cAAc;IACd,gBAAgB;IAChB,gBAAgB;IAChB,gBAAgB;IAChB,aAAa;IACb,aAAa;IACb,cAAc;CACN,CAAC,CAAC"}
package/dist/source.d.ts CHANGED
@@ -122,7 +122,18 @@ export type OrderDeriver = (document: GraphDocument) => readonly OrderRow[];
122
122
  /** What a guard is shown. Both documents, so it need not recompute either. */
123
123
  export interface EdgeGuardContext {
124
124
  readonly mutation: Mutation;
125
- /** The landed document, before the edit. */
125
+ /**
126
+ * The newest authoritative document the source has answered with, before
127
+ * the edit.
128
+ *
129
+ * That is the landed document — except after a `conflict`, whose `upstream`
130
+ * is newer than anything landed and is what the guard sees until the next
131
+ * answer that lands replaces it. A verdict reached on the pre-conflict
132
+ * document would admit an edit that closes a loop on the source's own
133
+ * document, and a source applies what it is handed. The store's structural
134
+ * refusals keep reading the landed document: those are questions the source
135
+ * answers itself, and its answer is adopted.
136
+ */
126
137
  readonly current: GraphDocument;
127
138
  /** The document the edit would produce, if it landed. */
128
139
  readonly next: GraphDocument;
@@ -1 +1 @@
1
- {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAClC,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACvD;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GACtB;IACE;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC,GACD;IACE;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC,GACD;IACE,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC,CAAC;AAEN,kEAAkE;AAClE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,SAAS,QAAQ,EAAE,CAAC;AAE5E,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,4CAA4C;IAC5C,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,aAAa,GAAG,SAAS,CAAC"}
1
+ {"version":3,"file":"source.d.ts","sourceRoot":"","sources":["../src/source.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,UAAU;IACzB,4EAA4E;IAC5E,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC;IAClC,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACvD;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GACtB;IACE;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC,GACD;IACE;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC,GACD;IACE,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GACD;IACE;;;;;;;OAOG;IACH,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;CAClC,CAAC;AAEN,kEAAkE;AAClE,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,mEAAmE;IACnE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,oEAAoE;IACpE,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,SAAS,QAAQ,EAAE,CAAC;AAE5E,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,yDAAyD;IACzD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;CAC9B;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,aAAa,GAAG,SAAS,CAAC"}
package/dist/store.d.ts CHANGED
@@ -100,6 +100,22 @@ export interface Store {
100
100
  propose(proposal: Proposal): ProposalHandle;
101
101
  /** Re-dispatch an unsettled edit, unchanged, against the document as it stands. */
102
102
  retry(mutationId: MutationId): ProposalHandle;
103
+ /**
104
+ * Re-read the document from the source, then re-dispatch an unsettled edit,
105
+ * unchanged, against what that read confirmed — as ONE queued operation.
106
+ *
107
+ * The edit is reserved synchronously: it is `pending` from this call on, so
108
+ * `discardMine` and a second press are no-ops until it settles, exactly as
109
+ * they are for `retry`. A refresh that fails restores the record as it was
110
+ * and dispatches nothing; `hydrationError` says why. See the README's
111
+ * "Resolving a conflict".
112
+ *
113
+ * Accepts any record `retry` accepts — `conflict`, `failed` or `invalid` —
114
+ * and reaches its verdict only after the read, so an edit refused for a
115
+ * reason no document can change (a self-edge) costs one read before it is
116
+ * refused again.
117
+ */
118
+ retryOnLatest(mutationId: MutationId): ProposalHandle;
103
119
  /**
104
120
  * Drop an unsettled edit's overlay. The only call that removes the user's
105
121
  * work, and it adopts nothing. See the README's "Resolving a conflict".
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/store.js CHANGED
@@ -104,6 +104,40 @@ function messageOf(thrown) {
104
104
  export function createStore(config) {
105
105
  const { source, derive, guard } = config;
106
106
  let landed = EMPTY_DOCUMENT;
107
+ /**
108
+ * THE NEWEST AUTHORITATIVE DOCUMENT THE SOURCE HAS ANSWERED WITH, which is
109
+ * `landed` except after a `conflict`.
110
+ *
111
+ * A conflict carries the document as the source holds it, and the store
112
+ * adopts none of it — the order must not move for an edit that did not land,
113
+ * and the README's "Resolving a conflict" says why the upstream is for
114
+ * display. But it is also the one thing the store has been TOLD about the
115
+ * source's document since it last read one, and it is strictly newer than
116
+ * `landed`. Validating against `landed` after it arrives means checking an
117
+ * edit against a document the source has just said it no longer holds: a
118
+ * queued edit whose legality depends on the upstream's change — the very
119
+ * edge it added closing a cycle with this one — is admitted by a guard shown
120
+ * the pre-conflict graph, and lands against a source that has moved
121
+ * ([#12](https://github.com/autnmy/issuegraph/issues/12)).
122
+ *
123
+ * So the GUARD reads THIS document, and nothing else does. The deriver and
124
+ * the projection keep reading `landed`, which is what keeps "optimistic
125
+ * re-ordering is not allowed" a property of the structure. The structural
126
+ * refusals keep reading `landed` too, for a different reason: they ask
127
+ * questions the source answers for itself — a duplicate comes back
128
+ * `unchanged`, a vanished edge comes back `rejected` or `unchanged` — and the
129
+ * answer is adopted, so a dispatch the store lets through is what repairs
130
+ * its copy. Refusing those against a document the snapshot cannot show would
131
+ * draw an edge the user can see as `unknown-edge`, with nothing to do but
132
+ * wait for a re-read nothing prompts. A cycle is the question the source
133
+ * does NOT answer — an adapter applies what it is handed — which is why the
134
+ * guard is the one reader that must not be shown the stale copy. Every
135
+ * `adopt` sets both documents; only the conflict arm moves this one alone.
136
+ * The queue runs one authoritative operation at a time, so this is monotone
137
+ * in the order the source answered — no freshness counter, which is the
138
+ * bookkeeping #7 records as wrong three times over.
139
+ */
140
+ let newest = EMPTY_DOCUMENT;
107
141
  let status = 'idle';
108
142
  let hydrationError;
109
143
  let records = [];
@@ -150,6 +184,9 @@ export function createStore(config) {
150
184
  edges: sameEdgeSet(landed.edges, next.edges) ? landed.edges : own(next.edges),
151
185
  };
152
186
  landed = adopted;
187
+ // An authoritative answer supersedes a conflict's upstream: what landed is
188
+ // now the newest thing the source has said.
189
+ newest = adopted;
153
190
  }
154
191
  /**
155
192
  * Rebuild the snapshot, reusing every slice that has not changed, and notify
@@ -278,6 +315,12 @@ export function createStore(config) {
278
315
  /**
279
316
  * Why this edit cannot happen — structurally, then by the injected guard.
280
317
  *
318
+ * The structural check reads `landed` and the guard reads `newest` — the
319
+ * document the source most recently answered with, which a conflict can
320
+ * make newer than anything landed. The split is deliberate and the note on
321
+ * `newest` says why: the source corrects a structural mistake with an answer
322
+ * the store adopts, and a cycle it never corrects at all.
323
+ *
281
324
  * A guard that throws reached no verdict, and an unknown verdict is not
282
325
  * permission to write: it refuses, fail-closed, with the thrown message as
283
326
  * the reason. Letting it escape would strand the whole dispatch queue behind
@@ -290,7 +333,7 @@ export function createStore(config) {
290
333
  if (guard === undefined)
291
334
  return undefined;
292
335
  try {
293
- return guard({ mutation, current: landed, next: nextDocument(landed, mutation) });
336
+ return guard({ mutation, current: newest, next: nextDocument(newest, mutation) });
294
337
  }
295
338
  catch (thrown) {
296
339
  return { code: 'guard-failed', message: messageOf(thrown) };
@@ -345,15 +388,15 @@ export function createStore(config) {
345
388
  break;
346
389
  }
347
390
  case 'conflict': {
348
- putRecord({
349
- mutationId: mutation.mutationId,
350
- mutation,
351
- state: 'conflict',
352
- // Taken on rather than retained by reference: it is exposed through
353
- // `snapshot.writes`, so a consumer must not be able to edit the
354
- // adapter's own arrays through it.
355
- upstream: ownDocument(result.upstream),
356
- });
391
+ // Taken on rather than retained by reference: it is exposed through
392
+ // `snapshot.writes`, so a consumer must not be able to edit the
393
+ // adapter's own arrays through it.
394
+ const upstream = ownDocument(result.upstream);
395
+ putRecord({ mutationId: mutation.mutationId, mutation, state: 'conflict', upstream });
396
+ // NOT adopted — `landed` and the order stay where they are. But it is
397
+ // the newest document the source has answered with, so it is what the
398
+ // guard is next shown, until an answer that lands replaces it.
399
+ newest = upstream;
357
400
  break;
358
401
  }
359
402
  }
@@ -367,7 +410,8 @@ export function createStore(config) {
367
410
  * a fact about the adapter not being called, not just about the colour of the
368
411
  * edge, and that is what the tests assert.
369
412
  */
370
- function start(mutation) {
413
+ function start(task) {
414
+ const { mutation } = task;
371
415
  // The summary is evidence for ONE edit, and the contract is that it lasts
372
416
  // until the next edit or an explicit dismissal. Clearing it here is what
373
417
  // makes that true: left standing, a host would show the previous edit's
@@ -375,20 +419,32 @@ export function createStore(config) {
375
419
  lastChange = undefined;
376
420
  currentProposal = mutation.mutationId;
377
421
  const settled = new Promise((resolve) => settlers.set(mutation.mutationId, resolve));
378
- const refusal = refusalFor(mutation);
422
+ // THE VERDICT IS REACHED AGAINST THE DOCUMENT THE EDIT WILL BE DISPATCHED
423
+ // AGAINST. For a direct dispatch that is `landed` as it stands, so a refused
424
+ // edit is recorded here and never enters the queue. For a resolve it is the
425
+ // document the refresh will confirm, which does not exist yet — asking now
426
+ // would refuse or admit the edit on the very copy the user asked to look
427
+ // past. Its verdict waits for the queue's re-check, where every edit is
428
+ // asked again anyway.
429
+ const refusal = task.kind === 'dispatch' ? refusalFor(mutation) : undefined;
379
430
  if (refusal !== undefined) {
380
431
  putRecord({ mutationId: mutation.mutationId, mutation, state: 'invalid', reason: refusal });
381
432
  settle(mutation.mutationId);
382
433
  publish();
383
434
  return { mutationId: mutation.mutationId, settled };
384
435
  }
436
+ // THIS IS THE RESERVATION, for a resolve as much as for a dispatch. A
437
+ // `pending` record is one `discardMine` and `retry` decline to touch, so
438
+ // from here until the edit settles nothing can act on it — including across
439
+ // the refresh a resolve is about to wait on. That is what lets the store
440
+ // own a resolution that spans an await: the intent was captured before it.
385
441
  putRecord({ mutationId: mutation.mutationId, mutation, state: 'pending' });
386
442
  // ENQUEUE BEFORE NOTIFYING. `publish` runs subscribers synchronously, so a
387
443
  // subscriber proposing a follow-up re-enters here — and if the queue does
388
444
  // not yet hold this edit, the nested one takes its place in line and goes
389
445
  // out first. Two edits on the same edge then apply in the reverse of the
390
446
  // order the user made them.
391
- queue.push({ kind: 'dispatch', mutation });
447
+ queue.push(task);
392
448
  publish();
393
449
  void drain();
394
450
  return { mutationId: mutation.mutationId, settled };
@@ -397,12 +453,13 @@ export function createStore(config) {
397
453
  * Run the queue, one authoritative operation at a time — dispatches and
398
454
  * document reads alike, since both answer with a document.
399
455
  *
400
- * An edit that WAITED is re-checked before it goes out, because `landed` may
401
- * have moved under it — a sibling edit can delete the relationship this one
402
- * retypes, and dispatching against a document that no longer admits it would
403
- * defeat "refused before any write". An edit that did not wait keeps the
404
- * verdict `start` already reached, so the guard is called once per edit in
405
- * the ordinary case and twice only when the document genuinely moved.
456
+ * An edit that WAITED is re-checked before it goes out, because the document
457
+ * may have moved under it — a sibling edit can delete the relationship this
458
+ * one retypes, and a sibling's CONFLICT can carry an upstream that closes a
459
+ * cycle with it — and dispatching against a document that no longer admits
460
+ * it would defeat "refused before any write". Every edit is re-checked here
461
+ * whether or not it waited; the comment at the check says why. A resolve is
462
+ * checked here for the FIRST time, against the document its read confirmed.
406
463
  */
407
464
  async function drain() {
408
465
  if (draining)
@@ -411,10 +468,34 @@ export function createStore(config) {
411
468
  try {
412
469
  for (let next = queue.shift(); next !== undefined; next = queue.shift()) {
413
470
  if (next.kind === 'load') {
414
- next.done(await runLoad(next.first));
471
+ const ok = await runLoad(next.first);
472
+ publish();
473
+ next.done(ok);
415
474
  continue;
416
475
  }
476
+ if (next.kind === 'resolve') {
477
+ const ok = await runLoad(false);
478
+ if (!ok) {
479
+ // THE READ FAILED, SO NOTHING IS CONFIRMED, and the edit does not
480
+ // go out: the `continue` below is what makes the two halves one
481
+ // operation. The record goes back to exactly what it was when the
482
+ // resolution was reserved — a conflict keeps its `upstream` for
483
+ // view-diff — and `hydrationError`, set by the read, says why. Not
484
+ // downgraded to `failed`: that would throw away the one document
485
+ // the user can still compare against.
486
+ putRecord(next.prior);
487
+ settle(next.mutation.mutationId);
488
+ }
489
+ // ONE TRANSITION, whichever way the read went. The restore rides the
490
+ // same publish as the read's outcome, so no subscriber can observe
491
+ // "refresh failed, edit still in flight" as a state of its own.
492
+ publish();
493
+ if (!ok)
494
+ continue;
495
+ }
417
496
  // ALWAYS re-checked, not only when something is known to have moved.
497
+ // For a resolve this is the FIRST check, and against the document the
498
+ // read just confirmed — which is the point of resolving.
418
499
  // Knowing that needs bookkeeping about document freshness, and every
419
500
  // version of that bookkeeping this store has had was wrong in a way
420
501
  // nobody could see. `refusalFor` is pure and cheap; asking it twice
@@ -449,8 +530,16 @@ export function createStore(config) {
449
530
  function noop(mutationId) {
450
531
  return { mutationId, settled: Promise.resolve() };
451
532
  }
452
- /** Read the document. Only ever called from the queue. */
453
- /** Read the document. Resolves `true` when the read succeeded. */
533
+ /**
534
+ * Read the document. Only ever called from the queue. Resolves `true` when
535
+ * the read succeeded.
536
+ *
537
+ * PUBLISHES NOTHING AT THE END, on purpose: the caller decides what else
538
+ * belongs in the same transition. A resolve whose read failed restores its
539
+ * record before publishing, so the outcome of the read and the restored edit
540
+ * arrive together. (The `hydrating` publish on a first load is a transition
541
+ * of its own, before the read starts.)
542
+ */
454
543
  async function runLoad(first) {
455
544
  if (first) {
456
545
  status = 'hydrating';
@@ -470,10 +559,8 @@ export function createStore(config) {
470
559
  // first load that never produced one reports `failed`.
471
560
  if (first)
472
561
  status = 'failed';
473
- publish();
474
562
  return false;
475
563
  }
476
- publish();
477
564
  return true;
478
565
  }
479
566
  return {
@@ -495,19 +582,26 @@ export function createStore(config) {
495
582
  // A per-store counter, not a random identifier: identities only have to
496
583
  // be unique within one store, and a deterministic one keeps every test
497
584
  // that reads a mutation id reproducible.
498
- return start({ ...proposal, mutationId: `m${sequence}` });
585
+ return start({ kind: 'dispatch', mutation: { ...proposal, mutationId: `m${sequence}` } });
499
586
  },
500
587
  retry(mutationId) {
501
588
  const record = recordFor(mutationId);
502
589
  if (record === undefined || record.state === 'pending')
503
590
  return noop(mutationId);
504
- return start(record.mutation);
591
+ return start({ kind: 'dispatch', mutation: record.mutation });
592
+ },
593
+ retryOnLatest(mutationId) {
594
+ const record = recordFor(mutationId);
595
+ if (record === undefined || record.state === 'pending')
596
+ return noop(mutationId);
597
+ return start({ kind: 'resolve', mutation: record.mutation, prior: record });
505
598
  },
506
599
  /**
507
600
  * Single-step on purpose: it reads the record and acts on it with no
508
- * `await` in between, so nothing can change underneath it. A resolution
509
- * that had to refresh first could not have that property, which is why the
510
- * store does not offer one.
601
+ * `await` in between, so nothing can change underneath it. The resolution
602
+ * that has to refresh first gets the same property by reserving the edit
603
+ * BEFORE its refresh — the record is `pending` from that call on, which is
604
+ * exactly the state this declines to touch.
511
605
  */
512
606
  discardMine(mutationId) {
513
607
  const record = recordFor(mutationId);
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAKL,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAoB,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAwC,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AA4GhE,6EAA6E;AAC7E,6EAA6E;AAC7E,SAAS;AACT,MAAM,cAAc,GAAkB,MAAM,CAAC,MAAM,CAAC;IAClD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;CACzB,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAS,GAAG,CAAI,IAAkB;IAChC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,mFAAmF;AACnF,SAAS,WAAW,CAAC,QAAuB;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC;AAED;;;;;;GAMG;AACH,SAAS,OAAO,CAAC,IAAyB;IACxC,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AACD,MAAM,aAAa,GAA6B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElE,SAAS,SAAS,CAAC,MAAe;IAChC,OAAO,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,MAAmB;IAC7C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAEzC,IAAI,MAAM,GAAkB,cAAc,CAAC;IAC3C,IAAI,MAAM,GAAoB,MAAM,CAAC;IACrC,IAAI,cAAkC,CAAC;IACvC,IAAI,OAAO,GAA2B,EAAE,CAAC;IACzC,IAAI,SAAS,GAAsB,EAAE,CAAC;IACtC,IAAI,IAAI,GAAwB,EAAE,CAAC;IACnC,IAAI,UAAmC,CAAC;IACxC,IAAI,UAA8B,CAAC;IACnC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB;;;;;;;OAOG;IACH,IAAI,eAAuC,CAAC;IAuB5C,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEnD,MAAM,OAAO,GAAkB;QAC7B,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,KAAK;QACpB,SAAS,EAAE,aAAa;QACxB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAChE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC;QACpB,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC;KAC1B,CAAC;IACF,IAAI,SAAS,GAAkB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEtD;;;;;;;;OAQG;IACH,SAAS,KAAK,CAAC,IAAmB;QAChC,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAChF,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;SAC9E,CAAC;QACF,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,OAAO;QACd,wEAAwE;QACxE,4EAA4E;QAC5E,0EAA0E;QAC1E,oEAAoE;QACpE,0EAA0E;QAC1E,uDAAuD;QACvD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACnE,MAAM,eAAe,GAAgB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAE9E,yEAAyE;QACzE,wEAAwE;QACxE,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC;YAC7D,CAAC,CAAC,SAAS,CAAC,SAAS;YACrB,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvB,2EAA2E;QAC3E,0EAA0E;QAC1E,wEAAwE;QACxE,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACtF,MAAM,KAAK,GACT,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,eAAe,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;YAC9E,CAAC,CAAC,SAAS,CAAC,KAAK;YACjB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAElG,MAAM,SAAS,GACb,SAAS,CAAC,MAAM,KAAK,MAAM;YAC3B,SAAS,CAAC,cAAc,KAAK,cAAc;YAC3C,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAClC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK;YACjC,SAAS,CAAC,SAAS,KAAK,SAAS;YACjC,SAAS,CAAC,KAAK,KAAK,KAAK;YACzB,SAAS,CAAC,MAAM,KAAK,MAAM;YAC3B,SAAS,CAAC,UAAU,KAAK,UAAU;YACnC,SAAS,CAAC,UAAU,KAAK,UAAU;YACnC,SAAS,CAAC,SAAS,KAAK,QAAQ,CAAC;QACnC,IAAI,SAAS;YAAE,OAAO;QAEtB,oEAAoE;QACpE,yEAAyE;QACzE,wCAAwC;QACxC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YACxB,MAAM;YACN,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;YAC3D,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,SAAS;YACT,KAAK;YACL,MAAM;YACN,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;YACnD,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;YACnD,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QACH,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,yEAAyE;QACzE,4EAA4E;QAC5E,uEAAuE;QACvE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,QAAQ,EAAE,CAAC;YACb,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,cAAc,CAAC,GAAG,EAAE;oBAClB,MAAM,MAAM,CAAC;gBACf,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,QAAQ,CAAC,KAA2B;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC;QACtB,IAAI,IAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,wEAAwE;QACxE,0EAA0E;QAC1E,yEAAyE;QACzE,yEAAyE;QACzE,4CAA4C;QAC5C,MAAM,UAAU,GAAG,UAAU,KAAK,SAAS,CAAC;QAC5C,UAAU,GAAG,SAAS,CAAC;QACvB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,0EAA0E;QAC1E,4EAA4E;QAC5E,kDAAkD;QAClD,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,KAAK,eAAe,CAAC;QAC9E,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS;YAAE,UAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACtG,CAAC;IAED,SAAS,SAAS,CAAC,UAAsB;QACvC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IACpE,CAAC;IAED,SAAS,SAAS,CAAC,IAAiB;QAClC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS;YAChD,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC;YACpB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,SAAS,UAAU,CAAC,UAAsB;QACxC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IACzE,CAAC;IAED,SAAS,MAAM,CAAC,UAAsB;QACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACzC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;IAED;;;;;;;OAOG;IACH,SAAS,UAAU,CAAC,QAAkB;QACpC,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,UAAU,CAAC;QAChD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,KAAK,UAAU,QAAQ,CAAC,QAAkB;QACxC,IAAI,MAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,wEAAwE;YACxE,0EAA0E;YAC1E,+DAA+D;YAC/D,SAAS,CAAC;gBACR,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,QAAQ;gBACR,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;aAC1B,CAAC,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvB,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAChC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnB,MAAM;YACR,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,yEAAyE;gBACzE,uEAAuE;gBACvE,oEAAoE;gBACpE,EAAE;gBACF,yEAAyE;gBACzE,sEAAsE;gBACtE,kEAAkE;gBAClE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvB,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAChC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpB,MAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,SAAS,CAAC;oBACR,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,QAAQ;oBACR,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,MAAM,CAAC,MAAM;iBACtB,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,SAAS,CAAC;oBACR,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,QAAQ;oBACR,KAAK,EAAE,UAAU;oBACjB,oEAAoE;oBACpE,gEAAgE;oBAChE,mCAAmC;oBACnC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;iBACvC,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;;;OAMG;IACH,SAAS,KAAK,CAAC,QAAkB;QAC/B,0EAA0E;QAC1E,yEAAyE;QACzE,wEAAwE;QACxE,uDAAuD;QACvD,UAAU,GAAG,SAAS,CAAC;QACvB,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3F,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,SAAS,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5F,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;QACtD,CAAC;QAED,SAAS,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3E,2EAA2E;QAC3E,0EAA0E;QAC1E,0EAA0E;QAC1E,yEAAyE;QACzE,4BAA4B;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3C,OAAO,EAAE,CAAC;QACV,KAAK,KAAK,EAAE,CAAC;QACb,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;IACtD,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,UAAU,KAAK;QAClB,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC;YACH,KAAK,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,KAAK,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;gBACxE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACzB,IAAI,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;oBACrC,SAAS;gBACX,CAAC;gBACD,qEAAqE;gBACrE,qEAAqE;gBACrE,oEAAoE;gBACpE,oEAAoE;gBACpE,8DAA8D;gBAC9D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC1C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,SAAS,CAAC;wBACR,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;wBACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,KAAK,EAAE,SAAS;wBAChB,MAAM,EAAE,OAAO;qBAChB,CAAC,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACjC,OAAO,EAAE,CAAC;oBACV,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,SAAS,IAAI,CAAC,KAAc;QAC1B,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACtC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACnD,KAAK,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,SAAS,IAAI,CAAC,UAAsB;QAClC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IACpD,CAAC;IAED,0DAA0D;IAC1D,kEAAkE;IAClE,KAAK,UAAU,OAAO,CAAC,KAAc;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,WAAW,CAAC;YACrB,cAAc,GAAG,SAAS,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACxC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChB,MAAM,GAAG,OAAO,CAAC;YACjB,cAAc,GAAG,SAAS,CAAC;YAC3B,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YACnC,0EAA0E;YAC1E,uDAAuD;YACvD,IAAI,KAAK;gBAAE,MAAM,GAAG,QAAQ,CAAC;YAC7B,OAAO,EAAE,CAAC;YACV,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,EAAE,CAAC;QACV,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS;QAE5B,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,SAAS,EAAE,KAAK,IAAI,EAAE;YACpB,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,QAAQ;YACd,QAAQ,IAAI,CAAC,CAAC;YACd,wEAAwE;YACxE,uEAAuE;YACvE,yCAAyC;YACzC,OAAO,KAAK,CAAC,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,IAAI,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,KAAK,CAAC,UAAU;YACd,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;YAChF,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QAED;;;;;WAKG;QACH,WAAW,CAAC,UAAU;YACpB,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO;YAC/D,UAAU,CAAC,UAAU,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,CAAC,OAAO;YACZ,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,aAAa;YACX,UAAU,GAAG,SAAS,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAKL,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAoB,SAAS,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAwC,UAAU,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAwHhE,6EAA6E;AAC7E,6EAA6E;AAC7E,SAAS;AACT,MAAM,cAAc,GAAkB,MAAM,CAAC,MAAM,CAAC;IAClD,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;CACzB,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,SAAS,GAAG,CAAI,IAAkB;IAChC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,mFAAmF;AACnF,SAAS,WAAW,CAAC,QAAuB;IAC1C,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACrF,CAAC;AAED;;;;;;GAMG;AACH,SAAS,OAAO,CAAC,IAAyB;IACxC,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AACD,MAAM,aAAa,GAA6B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElE,SAAS,SAAS,CAAC,MAAe;IAChC,OAAO,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACnE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,MAAmB;IAC7C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IAEzC,IAAI,MAAM,GAAkB,cAAc,CAAC;IAC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,IAAI,MAAM,GAAkB,cAAc,CAAC;IAC3C,IAAI,MAAM,GAAoB,MAAM,CAAC;IACrC,IAAI,cAAkC,CAAC;IACvC,IAAI,OAAO,GAA2B,EAAE,CAAC;IACzC,IAAI,SAAS,GAAsB,EAAE,CAAC;IACtC,IAAI,IAAI,GAAwB,EAAE,CAAC;IACnC,IAAI,UAAmC,CAAC;IACxC,IAAI,UAA8B,CAAC;IACnC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB;;;;;;;OAOG;IACH,IAAI,eAAuC,CAAC;IA+B5C,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEnD,MAAM,OAAO,GAAkB;QAC7B,MAAM;QACN,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,MAAM,CAAC,KAAK;QACpB,SAAS,EAAE,aAAa;QACxB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;QAChE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC;QACpB,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC;KAC1B,CAAC;IACF,IAAI,SAAS,GAAkB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEtD;;;;;;;;OAQG;IACH,SAAS,KAAK,CAAC,IAAmB;QAChC,MAAM,OAAO,GAAG;YACd,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YAChF,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;SAC9E,CAAC;QACF,MAAM,GAAG,OAAO,CAAC;QACjB,2EAA2E;QAC3E,4CAA4C;QAC5C,MAAM,GAAG,OAAO,CAAC;IACnB,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,OAAO;QACd,wEAAwE;QACxE,4EAA4E;QAC5E,0EAA0E;QAC1E,oEAAoE;QACpE,0EAA0E;QAC1E,uDAAuD;QACvD,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QACnE,MAAM,eAAe,GAAgB,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAE9E,yEAAyE;QACzE,wEAAwE;QACxE,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC;YAC7D,CAAC,CAAC,SAAS,CAAC,SAAS;YACrB,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvB,2EAA2E;QAC3E,0EAA0E;QAC1E,wEAAwE;QACxE,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACtF,MAAM,KAAK,GACT,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,eAAe,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS;YAC9E,CAAC,CAAC,SAAS,CAAC,KAAK;YACjB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAElG,MAAM,SAAS,GACb,SAAS,CAAC,MAAM,KAAK,MAAM;YAC3B,SAAS,CAAC,cAAc,KAAK,cAAc;YAC3C,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;YAClC,SAAS,CAAC,MAAM,KAAK,MAAM,CAAC,KAAK;YACjC,SAAS,CAAC,SAAS,KAAK,SAAS;YACjC,SAAS,CAAC,KAAK,KAAK,KAAK;YACzB,SAAS,CAAC,MAAM,KAAK,MAAM;YAC3B,SAAS,CAAC,UAAU,KAAK,UAAU;YACnC,SAAS,CAAC,UAAU,KAAK,UAAU;YACnC,SAAS,CAAC,SAAS,KAAK,QAAQ,CAAC;QACnC,IAAI,SAAS;YAAE,OAAO;QAEtB,oEAAoE;QACpE,yEAAyE;QACzE,wCAAwC;QACxC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;YACxB,MAAM;YACN,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;YAC3D,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,SAAS;YACT,KAAK;YACL,MAAM;YACN,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;YACnD,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;YACnD,SAAS,EAAE,QAAQ;SACpB,CAAC,CAAC;QACH,YAAY,CAAC,SAAS,CAAC,CAAC;QACxB,yEAAyE;QACzE,4EAA4E;QAC5E,uEAAuE;QACvE,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,QAAQ,EAAE,CAAC;YACb,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,cAAc,CAAC,GAAG,EAAE;oBAClB,MAAM,MAAM,CAAC;gBACf,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,SAAS,QAAQ,CAAC,KAA2B;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC;QACtB,IAAI,IAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,wEAAwE;QACxE,0EAA0E;QAC1E,yEAAyE;QACzE,yEAAyE;QACzE,4CAA4C;QAC5C,MAAM,UAAU,GAAG,UAAU,KAAK,SAAS,CAAC;QAC5C,UAAU,GAAG,SAAS,CAAC;QACvB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACrB,0EAA0E;QAC1E,4EAA4E;QAC5E,kDAAkD;QAClD,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,KAAK,eAAe,CAAC;QAC9E,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS;YAAE,UAAU,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IACtG,CAAC;IAED,SAAS,SAAS,CAAC,UAAsB;QACvC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IACpE,CAAC;IAED,SAAS,SAAS,CAAC,IAAiB;QAClC,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,SAAS;YAChD,CAAC,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,CAAC;YACpB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,SAAS,UAAU,CAAC,UAAsB;QACxC,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IACzE,CAAC;IAED,SAAS,MAAM,CAAC,UAAsB;QACpC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACzC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,SAAS,UAAU,CAAC,QAAkB;QACpC,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvD,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,UAAU,CAAC;QAChD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1C,IAAI,CAAC;YACH,OAAO,KAAK,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,KAAK,UAAU,QAAQ,CAAC,QAAkB;QACxC,IAAI,MAAsB,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,wEAAwE;YACxE,0EAA0E;YAC1E,+DAA+D;YAC/D,SAAS,CAAC;gBACR,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,QAAQ;gBACR,KAAK,EAAE,QAAQ;gBACf,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC;aAC1B,CAAC,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,SAAS,CAAC,CAAC,CAAC;gBACf,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvB,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAChC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACnB,MAAM;YACR,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACjB,yEAAyE;gBACzE,uEAAuE;gBACvE,oEAAoE;gBACpE,EAAE;gBACF,yEAAyE;gBACzE,sEAAsE;gBACtE,kEAAkE;gBAClE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvB,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAChC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpB,MAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,SAAS,CAAC;oBACR,UAAU,EAAE,QAAQ,CAAC,UAAU;oBAC/B,QAAQ;oBACR,KAAK,EAAE,QAAQ;oBACf,MAAM,EAAE,MAAM,CAAC,MAAM;iBACtB,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;YACD,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,oEAAoE;gBACpE,gEAAgE;gBAChE,mCAAmC;gBACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC9C,SAAS,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACtF,sEAAsE;gBACtE,sEAAsE;gBACtE,+DAA+D;gBAC/D,MAAM,GAAG,QAAQ,CAAC;gBAClB,MAAM;YACR,CAAC;QACH,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;;;;;OAMG;IACH,SAAS,KAAK,CAAC,IAAc;QAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAC1B,0EAA0E;QAC1E,yEAAyE;QACzE,wEAAwE;QACxE,uDAAuD;QACvD,UAAU,GAAG,SAAS,CAAC;QACvB,eAAe,GAAG,QAAQ,CAAC,UAAU,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3F,0EAA0E;QAC1E,6EAA6E;QAC7E,4EAA4E;QAC5E,2EAA2E;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,sBAAsB;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC5E,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,SAAS,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YAC5F,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;QACtD,CAAC;QAED,sEAAsE;QACtE,yEAAyE;QACzE,4EAA4E;QAC5E,yEAAyE;QACzE,2EAA2E;QAC3E,SAAS,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3E,2EAA2E;QAC3E,0EAA0E;QAC1E,0EAA0E;QAC1E,yEAAyE;QACzE,4BAA4B;QAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,OAAO,EAAE,CAAC;QACV,KAAK,KAAK,EAAE,CAAC;QACb,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC;IACtD,CAAC;IAED;;;;;;;;;;;OAWG;IACH,KAAK,UAAU,KAAK;QAClB,IAAI,QAAQ;YAAE,OAAO;QACrB,QAAQ,GAAG,IAAI,CAAC;QAChB,IAAI,CAAC;YACH,KAAK,IAAI,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,IAAI,KAAK,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;gBACxE,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACzB,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACrC,OAAO,EAAE,CAAC;oBACV,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACd,SAAS;gBACX,CAAC;gBACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;oBAC5B,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC;oBAChC,IAAI,CAAC,EAAE,EAAE,CAAC;wBACR,kEAAkE;wBAClE,gEAAgE;wBAChE,kEAAkE;wBAClE,gEAAgE;wBAChE,mEAAmE;wBACnE,iEAAiE;wBACjE,sCAAsC;wBACtC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACtB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACnC,CAAC;oBACD,qEAAqE;oBACrE,mEAAmE;oBACnE,gEAAgE;oBAChE,OAAO,EAAE,CAAC;oBACV,IAAI,CAAC,EAAE;wBAAE,SAAS;gBACpB,CAAC;gBACD,qEAAqE;gBACrE,sEAAsE;gBACtE,yDAAyD;gBACzD,qEAAqE;gBACrE,oEAAoE;gBACpE,oEAAoE;gBACpE,8DAA8D;gBAC9D,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC1C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,SAAS,CAAC;wBACR,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;wBACpC,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,KAAK,EAAE,SAAS;wBAChB,MAAM,EAAE,OAAO;qBAChB,CAAC,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;oBACjC,OAAO,EAAE,CAAC;oBACV,SAAS;gBACX,CAAC;gBACD,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;IAED,0EAA0E;IAC1E,SAAS,IAAI,CAAC,KAAc;QAC1B,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACtC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACnD,KAAK,KAAK,EAAE,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,SAAS,IAAI,CAAC,UAAsB;QAClC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IACpD,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,UAAU,OAAO,CAAC,KAAc;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,GAAG,WAAW,CAAC;YACrB,cAAc,GAAG,SAAS,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACxC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAChB,MAAM,GAAG,OAAO,CAAC;YACjB,cAAc,GAAG,SAAS,CAAC;YAC3B,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;YACnC,0EAA0E;YAC1E,uDAAuD;YACvD,IAAI,KAAK;gBAAE,MAAM,GAAG,QAAQ,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,SAAS;QAE5B,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,SAAS,EAAE,KAAK,IAAI,EAAE;YACpB,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;QAED,OAAO,CAAC,QAAQ;YACd,QAAQ,IAAI,CAAC,CAAC;YACd,wEAAwE;YACxE,uEAAuE;YACvE,yCAAyC;YACzC,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,UAAU,EAAE,IAAI,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5F,CAAC;QAED,KAAK,CAAC,UAAU;YACd,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;YAChF,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,aAAa,CAAC,UAAU;YACtB,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;YAChF,OAAO,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED;;;;;;WAMG;QACH,WAAW,CAAC,UAAU;YACpB,MAAM,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;gBAAE,OAAO;YAC/D,UAAU,CAAC,UAAU,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,CAAC,OAAO;YACZ,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;YACzB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,aAAa;YACX,UAAU,GAAG,SAAS,CAAC;YACvB,OAAO,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"validity.d.ts","sourceRoot":"","sources":["../src/validity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EACL,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,UAAU,EAIhB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE7D;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAejG;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,UAAU,CA2BrF;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,aAAa,CASvF;AAMD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,QAAQ,GACjB,aAAa,GAAG,SAAS,CA2C3B"}
1
+ {"version":3,"file":"validity.d.ts","sourceRoot":"","sources":["../src/validity.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EACL,KAAK,MAAM,EACX,KAAK,aAAa,EAClB,KAAK,UAAU,EAIhB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE7D;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAejG;AAED,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,UAAU,CA2BrF;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,GAAG,aAAa,CASvF;AAkDD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,QAAQ,GACjB,aAAa,GAAG,SAAS,CA2C3B"}
package/dist/validity.js CHANGED
@@ -11,7 +11,7 @@
11
11
  * belongs with the derivation so the package family has one of it. Both halves
12
12
  * produce the same refusal, and neither ever reaches `dispatch`.
13
13
  */
14
- import { isSymmetricEdgeField } from '@issuegraph/core';
14
+ import { EDGE_CARDINALITY, isSymmetricEdgeField } from '@issuegraph/core';
15
15
  import { findEdge, hasIssue, makeEdge, } from "./model.js";
16
16
  /** The edge an edit produces, or `undefined` for one that produces none. */
17
17
  export function resultingEdge(document, mutation) {
@@ -74,6 +74,45 @@ export function nextDocument(document, mutation) {
74
74
  function refuse(code, message) {
75
75
  return { code, message };
76
76
  }
77
+ /**
78
+ * Why this edit would give a single-valued field a second reference (§4.3).
79
+ *
80
+ * `blocked-by` is the only list; every other relationship field holds ONE
81
+ * reference, because a writer joins a group or names a canonical by pointing
82
+ * at one member. Two references is not a richer document but an ambiguous one
83
+ * — a reader resolves it by whichever it saw last.
84
+ *
85
+ * Asked of the RESULTING edge rather than of the operation, so a retype into an
86
+ * occupied field, and a flip whose new carrier is occupied, are refused exactly
87
+ * like a create — and the edge a retype or flip REPLACES is excluded, because
88
+ * it is on its way out. The carrier is `from` as written, for the symmetric
89
+ * kinds too: the field lives on one issue's frontmatter, and joining a group
90
+ * from a free carrier is how a writer joins one.
91
+ *
92
+ * It lives HERE, beside the other structural refusals, and not in a host's
93
+ * guard or adapter. It needs the edit and the document and no graph walk, which
94
+ * is this file's criterion, and the vocabulary it reads is the one
95
+ * `@issuegraph/core` already fixes. A rule enforced at a call site covers one
96
+ * route to a write and misses `retry` and the queued re-check; one enforced by
97
+ * an adapter comes back `failed` — "refused upstream" — on a write that never
98
+ * left the client (issue #11). A structural refusal reaches every route.
99
+ */
100
+ function cardinalityRefusal(document, mutation) {
101
+ const resulting = resultingEdge(document, mutation);
102
+ if (resulting === undefined || EDGE_CARDINALITY[resulting.kind] !== 'single')
103
+ return undefined;
104
+ const replaced = mutation.op === 'create' ? undefined : mutation.edgeId;
105
+ // `resulting.id` is never held by the time this runs — the duplicate refusal
106
+ // went first — but excluding it keeps this function true on its own rather
107
+ // than true because of the order `structuralRefusal` happens to call it in.
108
+ const held = document.edges.find((edge) => edge.kind === resulting.kind &&
109
+ edge.from === resulting.from &&
110
+ edge.id !== resulting.id &&
111
+ edge.id !== replaced);
112
+ if (held === undefined)
113
+ return undefined;
114
+ return refuse('cardinality', `${held.from} already carries ${held.kind} ${held.to}, and ${held.kind} holds one reference.`);
115
+ }
77
116
  /**
78
117
  * Why this edit cannot happen, from the edit and the document alone.
79
118
  *
@@ -94,7 +133,7 @@ export function structuralRefusal(document, mutation) {
94
133
  if (findEdge(document, produced.id) !== undefined) {
95
134
  return refuse('duplicate-edge', `${mutation.from} is already ${mutation.kind} ${mutation.to}.`);
96
135
  }
97
- return undefined;
136
+ return cardinalityRefusal(document, mutation);
98
137
  }
99
138
  const edge = findEdge(document, mutation.edgeId);
100
139
  if (edge === undefined) {
@@ -120,6 +159,6 @@ export function structuralRefusal(document, mutation) {
120
159
  if (produced !== undefined && produced.id !== edge.id && findEdge(document, produced.id) !== undefined) {
121
160
  return refuse('duplicate-edge', `${produced.from} is already ${produced.kind} ${produced.to}.`);
122
161
  }
123
- return undefined;
162
+ return cardinalityRefusal(document, mutation);
124
163
  }
125
164
  //# sourceMappingURL=validity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validity.js","sourceRoot":"","sources":["../src/validity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validity.js","sourceRoot":"","sources":["../src/validity.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@issuegraph/store",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "A framework-free client store for an Issuegraph document, plus the data-source port a host plugs its tracker into. Renders edits optimistically, dispatches every mutation outward, and never re-evaluates the selection order until the write lands.",
5
5
  "keywords": [
6
6
  "issuegraph",
@@ -42,7 +42,7 @@
42
42
  "node": ">=18"
43
43
  },
44
44
  "dependencies": {
45
- "@issuegraph/core": "^0.1.0"
45
+ "@issuegraph/core": "^0.1.2"
46
46
  },
47
47
  "devDependencies": {
48
48
  "@types/node": "^22.18.0",