@haverstack/core 0.42.0 → 0.44.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.
Files changed (185) hide show
  1. package/README.md +6 -9
  2. package/dist/access.d.ts +36 -34
  3. package/dist/access.d.ts.map +1 -1
  4. package/dist/access.js +51 -100
  5. package/dist/access.js.map +1 -1
  6. package/dist/adapter/combine.d.ts.map +1 -1
  7. package/dist/adapter/combine.js +14 -7
  8. package/dist/adapter/combine.js.map +1 -1
  9. package/dist/adapter/copy.d.ts +27 -0
  10. package/dist/adapter/copy.d.ts.map +1 -0
  11. package/dist/adapter/copy.js +105 -0
  12. package/dist/adapter/copy.js.map +1 -0
  13. package/dist/adapter/index.d.ts +9 -4
  14. package/dist/adapter/index.d.ts.map +1 -1
  15. package/dist/adapter/index.js +6 -3
  16. package/dist/adapter/index.js.map +1 -1
  17. package/dist/adapter/reach.d.ts +14 -0
  18. package/dist/adapter/reach.d.ts.map +1 -0
  19. package/dist/adapter/reach.js +31 -0
  20. package/dist/adapter/reach.js.map +1 -0
  21. package/dist/adapter/seed.d.ts +13 -0
  22. package/dist/adapter/seed.d.ts.map +1 -0
  23. package/dist/adapter/seed.js +26 -0
  24. package/dist/adapter/seed.js.map +1 -0
  25. package/dist/associations/identity.d.ts +18 -42
  26. package/dist/associations/identity.d.ts.map +1 -1
  27. package/dist/associations/identity.js +60 -84
  28. package/dist/associations/identity.js.map +1 -1
  29. package/dist/associations/validation.d.ts +1 -8
  30. package/dist/associations/validation.d.ts.map +1 -1
  31. package/dist/associations/validation.js +3 -30
  32. package/dist/associations/validation.js.map +1 -1
  33. package/dist/collection.d.ts +7 -11
  34. package/dist/collection.d.ts.map +1 -1
  35. package/dist/collection.js +24 -34
  36. package/dist/collection.js.map +1 -1
  37. package/dist/content-match.d.ts +2 -2
  38. package/dist/content-match.js +2 -2
  39. package/dist/errors.d.ts +41 -12
  40. package/dist/errors.d.ts.map +1 -1
  41. package/dist/errors.js +56 -15
  42. package/dist/errors.js.map +1 -1
  43. package/dist/grants.d.ts +18 -6
  44. package/dist/grants.d.ts.map +1 -1
  45. package/dist/grants.js +48 -37
  46. package/dist/grants.js.map +1 -1
  47. package/dist/hash.d.ts +8 -0
  48. package/dist/hash.d.ts.map +1 -0
  49. package/dist/hash.js +14 -0
  50. package/dist/hash.js.map +1 -0
  51. package/dist/index.d.ts +6 -6
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +2 -2
  54. package/dist/index.js.map +1 -1
  55. package/dist/install.d.ts +29 -5
  56. package/dist/install.d.ts.map +1 -1
  57. package/dist/install.js +69 -44
  58. package/dist/install.js.map +1 -1
  59. package/dist/lazy.d.ts +13 -0
  60. package/dist/lazy.d.ts.map +1 -0
  61. package/dist/lazy.js +27 -0
  62. package/dist/lazy.js.map +1 -0
  63. package/dist/merge.d.ts +1 -1
  64. package/dist/merge.js +1 -1
  65. package/dist/query-validation.d.ts +41 -28
  66. package/dist/query-validation.d.ts.map +1 -1
  67. package/dist/query-validation.js +85 -71
  68. package/dist/query-validation.js.map +1 -1
  69. package/dist/record-changes.d.ts +12 -36
  70. package/dist/record-changes.d.ts.map +1 -1
  71. package/dist/record-changes.js +9 -98
  72. package/dist/record-changes.js.map +1 -1
  73. package/dist/schema.d.ts.map +1 -1
  74. package/dist/schema.js +2 -5
  75. package/dist/schema.js.map +1 -1
  76. package/dist/scoped-stack/authority-snapshot.d.ts +37 -0
  77. package/dist/scoped-stack/authority-snapshot.d.ts.map +1 -0
  78. package/dist/scoped-stack/authority-snapshot.js +49 -0
  79. package/dist/scoped-stack/authority-snapshot.js.map +1 -0
  80. package/dist/scoped-stack/authority.d.ts +69 -51
  81. package/dist/scoped-stack/authority.d.ts.map +1 -1
  82. package/dist/scoped-stack/authority.js +189 -153
  83. package/dist/scoped-stack/authority.js.map +1 -1
  84. package/dist/scoped-stack/family-policy.d.ts +59 -0
  85. package/dist/scoped-stack/family-policy.d.ts.map +1 -0
  86. package/dist/scoped-stack/family-policy.js +68 -0
  87. package/dist/scoped-stack/family-policy.js.map +1 -0
  88. package/dist/scoped-stack/scoped-stack.d.ts +73 -86
  89. package/dist/scoped-stack/scoped-stack.d.ts.map +1 -1
  90. package/dist/scoped-stack/scoped-stack.js +279 -337
  91. package/dist/scoped-stack/scoped-stack.js.map +1 -1
  92. package/dist/scoped-stack/subscription.d.ts +14 -33
  93. package/dist/scoped-stack/subscription.d.ts.map +1 -1
  94. package/dist/scoped-stack/subscription.js +16 -57
  95. package/dist/scoped-stack/subscription.js.map +1 -1
  96. package/dist/stack/arguments.d.ts +27 -0
  97. package/dist/stack/arguments.d.ts.map +1 -0
  98. package/dist/stack/arguments.js +53 -0
  99. package/dist/stack/arguments.js.map +1 -0
  100. package/dist/stack/attachments.d.ts +1 -1
  101. package/dist/stack/attachments.js +1 -1
  102. package/dist/stack/changes.d.ts +4 -10
  103. package/dist/stack/changes.d.ts.map +1 -1
  104. package/dist/stack/changes.js +8 -8
  105. package/dist/stack/changes.js.map +1 -1
  106. package/dist/stack/client.d.ts +34 -58
  107. package/dist/stack/client.d.ts.map +1 -1
  108. package/dist/stack/field-rules.d.ts +27 -0
  109. package/dist/stack/field-rules.d.ts.map +1 -0
  110. package/dist/stack/field-rules.js +50 -0
  111. package/dist/stack/field-rules.js.map +1 -0
  112. package/dist/stack/install-app.d.ts +2 -2
  113. package/dist/stack/install-app.d.ts.map +1 -1
  114. package/dist/stack/install-app.js +16 -14
  115. package/dist/stack/install-app.js.map +1 -1
  116. package/dist/stack/integrity.d.ts +9 -53
  117. package/dist/stack/integrity.d.ts.map +1 -1
  118. package/dist/stack/integrity.js +47 -107
  119. package/dist/stack/integrity.js.map +1 -1
  120. package/dist/stack/limits.d.ts +1 -1
  121. package/dist/stack/limits.js +1 -1
  122. package/dist/stack/reads.d.ts +9 -5
  123. package/dist/stack/reads.d.ts.map +1 -1
  124. package/dist/stack/reads.js +24 -4
  125. package/dist/stack/reads.js.map +1 -1
  126. package/dist/stack/stack.d.ts +84 -79
  127. package/dist/stack/stack.d.ts.map +1 -1
  128. package/dist/stack/stack.js +236 -306
  129. package/dist/stack/stack.js.map +1 -1
  130. package/dist/stack/system-types.d.ts.map +1 -1
  131. package/dist/stack/system-types.js +1 -3
  132. package/dist/stack/system-types.js.map +1 -1
  133. package/dist/stack/type-grants.d.ts.map +1 -1
  134. package/dist/stack/type-grants.js +9 -6
  135. package/dist/stack/type-grants.js.map +1 -1
  136. package/dist/stack/write-expectation.d.ts +13 -12
  137. package/dist/stack/write-expectation.d.ts.map +1 -1
  138. package/dist/stack/write-expectation.js.map +1 -1
  139. package/dist/stack/write-gate.d.ts +23 -0
  140. package/dist/stack/write-gate.d.ts.map +1 -0
  141. package/dist/stack/write-gate.js +17 -0
  142. package/dist/stack/write-gate.js.map +1 -0
  143. package/dist/testing.d.ts +37 -24
  144. package/dist/testing.d.ts.map +1 -1
  145. package/dist/testing.js +176 -153
  146. package/dist/testing.js.map +1 -1
  147. package/dist/types/adapter.d.ts +115 -43
  148. package/dist/types/adapter.d.ts.map +1 -1
  149. package/dist/types/associations.d.ts +1 -17
  150. package/dist/types/associations.d.ts.map +1 -1
  151. package/dist/types/associations.js +1 -8
  152. package/dist/types/associations.js.map +1 -1
  153. package/dist/types/capabilities.d.ts +8 -8
  154. package/dist/types/capabilities.d.ts.map +1 -1
  155. package/dist/types/events.d.ts +3 -8
  156. package/dist/types/events.d.ts.map +1 -1
  157. package/dist/types/query.d.ts +4 -4
  158. package/dist/types/system.d.ts +2 -8
  159. package/dist/types/system.d.ts.map +1 -1
  160. package/dist/types/system.js.map +1 -1
  161. package/dist/validate.d.ts +2 -0
  162. package/dist/validate.d.ts.map +1 -1
  163. package/dist/validate.js +2 -1
  164. package/dist/validate.js.map +1 -1
  165. package/dist/wire/body.d.ts +32 -9
  166. package/dist/wire/body.d.ts.map +1 -1
  167. package/dist/wire/body.js +69 -8
  168. package/dist/wire/body.js.map +1 -1
  169. package/dist/wire/index.d.ts +4 -4
  170. package/dist/wire/index.d.ts.map +1 -1
  171. package/dist/wire/index.js +3 -3
  172. package/dist/wire/index.js.map +1 -1
  173. package/dist/wire/record.d.ts +1 -8
  174. package/dist/wire/record.d.ts.map +1 -1
  175. package/dist/wire/record.js +0 -48
  176. package/dist/wire/record.js.map +1 -1
  177. package/dist/wire/request.d.ts +18 -18
  178. package/dist/wire/request.d.ts.map +1 -1
  179. package/dist/wire/request.js +41 -36
  180. package/dist/wire/request.js.map +1 -1
  181. package/package.json +1 -1
  182. package/dist/stack/identity-bindings.d.ts +0 -13
  183. package/dist/stack/identity-bindings.d.ts.map +0 -1
  184. package/dist/stack/identity-bindings.js +0 -36
  185. package/dist/stack/identity-bindings.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.d.ts","sourceRoot":"","sources":["../src/lazy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,qBAAa,IAAI,CAAC,CAAC;IAGL,OAAO,CAAC,QAAQ,CAAC,IAAI;IAFjC,OAAO,CAAC,OAAO,CAA2B;gBAEb,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC;IAEnD,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC;IAUjB,KAAK,IAAI,IAAI;CAGd"}
package/dist/lazy.js ADDED
@@ -0,0 +1,27 @@
1
+ /**
2
+ * A value loaded on first use and shared after — how one operation reads a
3
+ * set at most once. A failed load is not kept, so the next use asks again,
4
+ * and clear() drops the value for a holder that outlives one operation.
5
+ */
6
+ export class Lazy {
7
+ load;
8
+ loading = null;
9
+ constructor(load) {
10
+ this.load = load;
11
+ }
12
+ get() {
13
+ if (this.loading)
14
+ return this.loading;
15
+ const loading = this.load();
16
+ this.loading = loading;
17
+ loading.catch(() => {
18
+ if (this.loading === loading)
19
+ this.loading = null;
20
+ });
21
+ return loading;
22
+ }
23
+ clear() {
24
+ this.loading = null;
25
+ }
26
+ }
27
+ //# sourceMappingURL=lazy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.js","sourceRoot":"","sources":["../src/lazy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,IAAI;IAGc;IAFrB,OAAO,GAAsB,IAAI,CAAC;IAE1C,YAA6B,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEvD,GAAG;QACD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;YACjB,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;gBAAE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpD,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;IACtB,CAAC;CACF"}
package/dist/merge.d.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  * -------------------------------------------------------
4
4
  * Shallow merge-patch semantics for record content: a field set to `null`
5
5
  * removes it, any other value replaces it, and omitted fields are retained.
6
- * Shared by Stack.mutate() (for client-side validation) and every
6
+ * Shared by Stack.patchContent() (for client-side validation) and every
7
7
  * StackRecordAdapter's patchContent() implementation, so a patch produces
8
8
  * the same merged content everywhere it's applied.
9
9
  */
package/dist/merge.js CHANGED
@@ -3,7 +3,7 @@
3
3
  * -------------------------------------------------------
4
4
  * Shallow merge-patch semantics for record content: a field set to `null`
5
5
  * removes it, any other value replaces it, and omitted fields are retained.
6
- * Shared by Stack.mutate() (for client-side validation) and every
6
+ * Shared by Stack.patchContent() (for client-side validation) and every
7
7
  * StackRecordAdapter's patchContent() implementation, so a patch produces
8
8
  * the same merged content everywhere it's applied.
9
9
  */
@@ -15,15 +15,16 @@
15
15
  * the query — one rule, one answer.
16
16
  * See docs/spec/data-model.md § Capability-gated filters.
17
17
  */
18
- import type { JournalQuery, QuerySort, RecordFilter, StackCapabilities, VersionsQuery } from './types/index.js';
18
+ import type { AdapterQuery, PlainQuery, StackQuery, JournalQuery, QuerySort, RecordFilter, StackCapabilities, VersionsQuery } from './types/index.js';
19
19
  /**
20
- * Fail loud rather than silently widen: a filter the adapter can't honor
21
- * would otherwise be dropped, returning an unfiltered superset presented
22
- * as the filtered result. Shared by Stack.query() and
23
- * APIAdapter.queryRecords(). See docs/spec/data-model.md
24
- * § Capability-gated filters.
20
+ * Fail loud rather than silently widen or reorder: a filter or sort the
21
+ * adapter can't honor would otherwise be dropped, answering with some
22
+ * other result, which a caller reading one bounded page cannot detect.
23
+ * Every refusal names the capability. The companion to resolveQuery(),
24
+ * which refuses the query's own shape; every entry point runs both. See
25
+ * docs/spec/data-model.md § Capability-gated filters.
25
26
  */
26
- export declare function assertQueryCapabilities(filter: RecordFilter | undefined, capabilities: Pick<StackCapabilities, 'filter'>): void;
27
+ export declare function assertQueryCapabilities(query: AdapterQuery, capabilities: Pick<StackCapabilities, 'filter' | 'sort'>): void;
27
28
  /**
28
29
  * Hold `filter.contentByType` to a split along Types: at least one arm,
29
30
  * each pinned to a TypeId and flat, and never beside a top-level content
@@ -54,24 +55,38 @@ export declare function parseContentFilterKey(key: string): string[];
54
55
  * any untrusted caller. See docs/spec/data-model.md § Sorting and pagination.
55
56
  */
56
57
  export declare function assertValidSort(sort: QuerySort | undefined): void;
58
+ /** The page a query reads when it names no `limit`. */
59
+ export declare const DEFAULT_QUERY_LIMIT = 50;
60
+ /** The largest page a query reads, whatever it asks for. */
61
+ export declare const MAX_QUERY_LIMIT = 1000;
57
62
  /**
58
- * The sort every adapter receives: a named sort with no `direction` is
59
- * ascending, resolved here so no adapter carries its own default. No sort
60
- * stays absent — the adapter's unsorted order is `createdAt` newest first,
61
- * and an explicit sort would be re-checked against the server's declared
62
- * `sort.fields`. See docs/spec/data-model.md § Sorting and pagination.
63
+ * The query an adapter receives: its shape checked, and every default
64
+ * resolved so no adapter carries one — a named sort runs ascending, no
65
+ * sort is `createdAt` newest first, and the page is DEFAULT_QUERY_LIMIT
66
+ * up to MAX_QUERY_LIMIT. Shape refusals name no capability; see
67
+ * assertQueryCapabilities() for those that do. See docs/spec/data-model.md
68
+ * § Sorting and pagination.
63
69
  */
64
- export declare function normalizeSort(sort: QuerySort | undefined): (QuerySort & {
65
- direction: 'asc' | 'desc';
66
- }) | undefined;
70
+ export declare function resolveQuery(query: PlainQuery): AdapterQuery;
71
+ /** A query split where it enters `Stack`; see splitQuery(). */
72
+ export type SplitQuery = {
73
+ query: AdapterQuery;
74
+ presentAt?: StackQuery['presentAt'];
75
+ };
67
76
  /**
68
- * Fail loud rather than silently reorder: an adapter that can't honor the
69
- * requested sort would otherwise answer in some other order, which a
70
- * caller paging a bounded window has no way to notice. The companion to
71
- * assertQueryCapabilities(), split from it because a sort is not a filter
72
- * — see docs/spec/data-model.md § Capability-gated filters.
77
+ * Split a query at the door into what an adapter sees, resolved, and
78
+ * `presentAt`, which `Stack` applies to the results. Every check runs
79
+ * here, before the adapter is asked. See docs/spec/data-model.md
80
+ * § Sorting and pagination.
73
81
  */
74
- export declare function assertSortCapability(sort: QuerySort | undefined, capabilities: Pick<StackCapabilities, 'sort'>): void;
82
+ export declare function splitQuery(query: StackQuery): SplitQuery;
83
+ /**
84
+ * Hold a window bound — a page size, a cursor position — to an integer
85
+ * at or above `min`, the one shape every adapter reads alike: a negative
86
+ * `limit` drops entries from a JS slice but empties or lifts a SQL
87
+ * `LIMIT`. See docs/spec/data-model.md § Sorting and pagination.
88
+ */
89
+ export declare function assertWindowInteger(value: number | undefined, label: string, min: 0 | 1): void;
75
90
  /**
76
91
  * Reject an association filter that names neither of its halves, or whose
77
92
  * relationship target is malformed. `RelatedToFilter` and `AttachmentFilter`
@@ -95,16 +110,14 @@ export declare function assertValidBaseIdFilter(filter: {
95
110
  baseId?: string | string[];
96
111
  } | undefined): void;
97
112
  /**
98
- * Hold a journal window to a shape both adapters honor identically: a
99
- * negative `limit` drops the newest entry from a JS slice but reads as no
100
- * ceiling in SQLite. No ceiling is imposed — omitting `limit` reads the
101
- * whole log by contract, which a clamp would silently truncate.
113
+ * A journal window: `afterSeq` 0 is the start of the log. No ceiling is
114
+ * imposed — omitting `limit` reads the whole log by contract, which a
115
+ * clamp would silently truncate.
102
116
  */
103
117
  export declare function assertValidJournalQuery(query: JournalQuery | undefined): void;
104
118
  /**
105
- * Refuse a `getVersions()` window the adapters would read differently, as
106
- * assertValidJournalQuery() does for the journal. No ceiling is imposed:
107
- * omitting `limit` reads every version by contract.
119
+ * A `getVersions()` window. No ceiling is imposed: omitting `limit` reads
120
+ * every version by contract.
108
121
  */
109
122
  export declare function assertValidVersionsQuery(query: VersionsQuery | undefined): void;
110
123
  //# sourceMappingURL=query-validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-validation.d.ts","sourceRoot":"","sources":["../src/query-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAWH,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,YAAY,GAAG,SAAS,EAChC,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAC9C,IAAI,CAsDN;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAgD/E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAEnF;AAKD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAwB3D;AAaD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAsBjE;AAsDD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,GAAG,SAAS,GAC1B,CAAC,SAAS,GAAG;IAAE,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,CAAC,GAAG,SAAS,CAKzD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,GAAG,SAAS,EAC3B,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,GAC5C,IAAI,CAiCN;AAED;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAmBpF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKrE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,GAAG,IAAI,CAOhG;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAW7E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAW/E"}
1
+ {"version":3,"file":"query-validation.d.ts","sourceRoot":"","sources":["../src/query-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAYH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EAEV,UAAU,EACV,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACd,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,YAAY,EACnB,YAAY,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,GAAG,MAAM,CAAC,GACvD,IAAI,CAGN;AA0DD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAgD/E;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,QAAQ,CAAC,GAAG,OAAO,CAEnF;AAUD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAqB3D;AAaD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,IAAI,CAsBjE;AAsDD,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,KAAK,CAAC;AAEtC,4DAA4D;AAC5D,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,CAc5D;AAED,+DAA+D;AAC/D,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,CAAC,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC;CACrC,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAMxD;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,CAO9F;AAmCD;;;;;;GAMG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAmBpF;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAKrE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAAE,GAAG,SAAS,GAAG,IAAI,CAOhG;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAG7E;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI,CAG/E"}
@@ -18,16 +18,21 @@
18
18
  import { ARGUMENTS_INVALID, StackBadRequestError, StackValidationError } from './errors.js';
19
19
  import { familyIdProblem, parseTypeId } from './schema.js';
20
20
  import { targetErrors } from './associations/validation.js';
21
- import { CONTENT_SEGMENT_METACHARACTERS, SEGMENT_METACHARACTER_RE, isPlainObject, } from './validate.js';
21
+ import { CONTENT_SEGMENT_METACHARACTERS, MAX_VALIDATION_DEPTH, SEGMENT_METACHARACTER_RE, isPlainObject, } from './validate.js';
22
22
  import { NATIVE_SORT_FIELDS } from './types/index.js';
23
23
  /**
24
- * Fail loud rather than silently widen: a filter the adapter can't honor
25
- * would otherwise be dropped, returning an unfiltered superset presented
26
- * as the filtered result. Shared by Stack.query() and
27
- * APIAdapter.queryRecords(). See docs/spec/data-model.md
28
- * § Capability-gated filters.
24
+ * Fail loud rather than silently widen or reorder: a filter or sort the
25
+ * adapter can't honor would otherwise be dropped, answering with some
26
+ * other result, which a caller reading one bounded page cannot detect.
27
+ * Every refusal names the capability. The companion to resolveQuery(),
28
+ * which refuses the query's own shape; every entry point runs both. See
29
+ * docs/spec/data-model.md § Capability-gated filters.
29
30
  */
30
- export function assertQueryCapabilities(filter, capabilities) {
31
+ export function assertQueryCapabilities(query, capabilities) {
32
+ assertFilterCapability(query.filter, capabilities);
33
+ assertSortCapability(query.sort, capabilities);
34
+ }
35
+ function assertFilterCapability(filter, capabilities) {
31
36
  const { content: reach, contentPresent, contentByType, search } = capabilities.filter;
32
37
  if (filter?.search && !search) {
33
38
  throw new StackBadRequestError('Query uses filter.search, but this adapter does not declare the filter.search capability.', 'filter.search');
@@ -49,12 +54,9 @@ export function assertQueryCapabilities(filter, capabilities) {
49
54
  : 'filter.content';
50
55
  throw new StackBadRequestError(`Query uses ${used}, but this adapter declares filter.content: "none".`, 'filter.content');
51
56
  }
52
- if (arms.length > contentByType) {
53
- throw new StackBadRequestError(contentByType === 0
54
- ? 'Query uses filter.contentByType, but this adapter does not declare the ' +
55
- 'filter.contentByType capability.'
56
- : `Query uses ${arms.length} filter.contentByType arms, but this adapter takes at ` +
57
- `most ${contentByType}.`, 'filter.contentByType');
57
+ if (arms.length > 0 && !contentByType) {
58
+ throw new StackBadRequestError('Query uses filter.contentByType, but this adapter does not declare the ' +
59
+ 'filter.contentByType capability.', 'filter.contentByType');
58
60
  }
59
61
  if (present.length > 0 && !contentPresent) {
60
62
  throw new StackBadRequestError('Query uses filter.contentPresent, but this adapter does not declare the ' +
@@ -122,8 +124,13 @@ export function assertValidContentByType(filter) {
122
124
  export function filtersContent(features) {
123
125
  return features.filter.content !== 'none';
124
126
  }
125
- /** The longest path both SQLite engines can execute — see the spec link below. */
126
- const MAX_CONTENT_PATH_SEGMENTS = 32;
127
+ /**
128
+ * The longest path that can reach a stored value: a top-level field sits at
129
+ * depth 0 and each segment descends one level, so a path past this reaches
130
+ * nothing a write accepts. See docs/spec/data-model.md § Nested content
131
+ * paths.
132
+ */
133
+ const MAX_CONTENT_PATH_SEGMENTS = MAX_VALIDATION_DEPTH + 1;
127
134
  /**
128
135
  * Split a content filter key into path segments. Write-time validation
129
136
  * keeps stored field names free of the path metacharacters, but a filter
@@ -132,9 +139,6 @@ const MAX_CONTENT_PATH_SEGMENTS = 32;
132
139
  */
133
140
  export function parseContentFilterKey(key) {
134
141
  const segments = key.split('.');
135
- // A SQLite adapter spends two json_each joins per segment against a
136
- // 64-table join limit, so a path past the cap is one the engine could
137
- // not execute. See docs/spec/data-model.md § Nested content paths.
138
142
  if (segments.length > MAX_CONTENT_PATH_SEGMENTS) {
139
143
  throw new StackBadRequestError(`Invalid content filter path "${key}": at most ${MAX_CONTENT_PATH_SEGMENTS} segments.`);
140
144
  }
@@ -168,8 +172,8 @@ export function assertValidSort(sort) {
168
172
  if (!sort)
169
173
  return;
170
174
  const named = [sort.field, sort.contentField, sort.contentFieldByType].filter((member) => member !== undefined);
171
- if (named.length > 1) {
172
- throw new StackBadRequestError('A sort names one of a native field, a content field or a content field per type.');
175
+ if (named.length !== 1) {
176
+ throw new StackBadRequestError('A sort names exactly one of a native field, a content field or a content field per type.');
173
177
  }
174
178
  if (sort.field !== undefined && !VALID_SORT_FIELDS.has(sort.field)) {
175
179
  throw new StackBadRequestError(`Invalid sort field "${sort.field}": expected one of ${NATIVE_SORT_FIELDS.join(', ')}.`);
@@ -223,36 +227,64 @@ const assertValidSortByType = (byType) => {
223
227
  }
224
228
  }
225
229
  };
230
+ /** The page a query reads when it names no `limit`. */
231
+ export const DEFAULT_QUERY_LIMIT = 50;
232
+ /** The largest page a query reads, whatever it asks for. */
233
+ export const MAX_QUERY_LIMIT = 1000;
226
234
  /**
227
- * The sort every adapter receives: a named sort with no `direction` is
228
- * ascending, resolved here so no adapter carries its own default. No sort
229
- * stays absent — the adapter's unsorted order is `createdAt` newest first,
230
- * and an explicit sort would be re-checked against the server's declared
231
- * `sort.fields`. See docs/spec/data-model.md § Sorting and pagination.
235
+ * The query an adapter receives: its shape checked, and every default
236
+ * resolved so no adapter carries one — a named sort runs ascending, no
237
+ * sort is `createdAt` newest first, and the page is DEFAULT_QUERY_LIMIT
238
+ * up to MAX_QUERY_LIMIT. Shape refusals name no capability; see
239
+ * assertQueryCapabilities() for those that do. See docs/spec/data-model.md
240
+ * § Sorting and pagination.
232
241
  */
233
- export function normalizeSort(sort) {
234
- if (!sort)
235
- return undefined;
236
- return { ...sort, direction: sort.direction ?? 'asc' };
242
+ export function resolveQuery(query) {
243
+ const { sort, limit, ...rest } = query;
244
+ assertValidBaseIdFilter(query.filter);
245
+ assertValidContentByType(query.filter);
246
+ assertValidSort(sort);
247
+ assertWindowInteger(limit, 'limit', 1);
248
+ assertValidAssociationFilters(query.filter);
249
+ return {
250
+ ...rest,
251
+ sort: sort
252
+ ? { ...sort, direction: sort.direction ?? 'asc' }
253
+ : { field: 'createdAt', direction: 'desc' },
254
+ limit: Math.min(limit ?? DEFAULT_QUERY_LIMIT, MAX_QUERY_LIMIT),
255
+ };
237
256
  }
238
257
  /**
239
- * Fail loud rather than silently reorder: an adapter that can't honor the
240
- * requested sort would otherwise answer in some other order, which a
241
- * caller paging a bounded window has no way to notice. The companion to
242
- * assertQueryCapabilities(), split from it because a sort is not a filter
243
- * — see docs/spec/data-model.md § Capability-gated filters.
258
+ * Split a query at the door into what an adapter sees, resolved, and
259
+ * `presentAt`, which `Stack` applies to the results. Every check runs
260
+ * here, before the adapter is asked. See docs/spec/data-model.md
261
+ * § Sorting and pagination.
244
262
  */
245
- export function assertSortCapability(sort, capabilities) {
246
- if (!sort)
263
+ export function splitQuery(query) {
264
+ const { presentAt, ...plain } = query;
265
+ return {
266
+ query: resolveQuery(plain),
267
+ ...(presentAt !== undefined && { presentAt }),
268
+ };
269
+ }
270
+ /**
271
+ * Hold a window bound — a page size, a cursor position — to an integer
272
+ * at or above `min`, the one shape every adapter reads alike: a negative
273
+ * `limit` drops entries from a JS slice but empties or lifts a SQL
274
+ * `LIMIT`. See docs/spec/data-model.md § Sorting and pagination.
275
+ */
276
+ export function assertWindowInteger(value, label, min) {
277
+ if (value === undefined)
247
278
  return;
279
+ if (!Number.isInteger(value) || value < min) {
280
+ throw new StackBadRequestError(`Invalid ${label} ${String(value)}: expected ${min === 0 ? 'a non-negative' : 'a positive'} integer.`);
281
+ }
282
+ }
283
+ function assertSortCapability(sort, capabilities) {
248
284
  if (sort.contentFieldByType !== undefined) {
249
- const keys = Object.keys(sort.contentFieldByType).length;
250
- const cap = capabilities.sort.contentFieldByType;
251
- if (keys > cap) {
252
- throw new StackBadRequestError(cap === 0
253
- ? 'Query uses sort.contentFieldByType, but this adapter does not declare the ' +
254
- 'sort.contentFieldByType capability.'
255
- : `Query uses ${keys} sort.contentFieldByType keys, but this adapter takes at most ${cap}.`, 'sort.contentFieldByType');
285
+ if (!capabilities.sort.contentFieldByType) {
286
+ throw new StackBadRequestError('Query uses sort.contentFieldByType, but this adapter does not declare the ' +
287
+ 'sort.contentFieldByType capability.', 'sort.contentFieldByType');
256
288
  }
257
289
  return;
258
290
  }
@@ -263,7 +295,7 @@ export function assertSortCapability(sort, capabilities) {
263
295
  }
264
296
  return;
265
297
  }
266
- const field = sort.field ?? 'createdAt';
298
+ const { field } = sort;
267
299
  if (!capabilities.sort.fields.includes(field)) {
268
300
  throw new StackBadRequestError(`Query sorts by "${field}", which this adapter does not declare in sort.fields.`, 'sort.fields');
269
301
  }
@@ -321,38 +353,20 @@ export function assertValidBaseIdFilter(filter) {
321
353
  throw new StackValidationError(errors, ARGUMENTS_INVALID);
322
354
  }
323
355
  /**
324
- * Hold a journal window to a shape both adapters honor identically: a
325
- * negative `limit` drops the newest entry from a JS slice but reads as no
326
- * ceiling in SQLite. No ceiling is imposed — omitting `limit` reads the
327
- * whole log by contract, which a clamp would silently truncate.
356
+ * A journal window: `afterSeq` 0 is the start of the log. No ceiling is
357
+ * imposed — omitting `limit` reads the whole log by contract, which a
358
+ * clamp would silently truncate.
328
359
  */
329
360
  export function assertValidJournalQuery(query) {
330
- if (!query)
331
- return;
332
- for (const key of ['afterSeq', 'limit']) {
333
- const value = query[key];
334
- if (value === undefined)
335
- continue;
336
- if (!Number.isInteger(value) || value < 0) {
337
- throw new StackBadRequestError(`Invalid journal ${key} ${String(value)}: expected a non-negative integer.`);
338
- }
339
- }
361
+ assertWindowInteger(query?.afterSeq, 'journal afterSeq', 0);
362
+ assertWindowInteger(query?.limit, 'journal limit', 1);
340
363
  }
341
364
  /**
342
- * Refuse a `getVersions()` window the adapters would read differently, as
343
- * assertValidJournalQuery() does for the journal. No ceiling is imposed:
344
- * omitting `limit` reads every version by contract.
365
+ * A `getVersions()` window. No ceiling is imposed: omitting `limit` reads
366
+ * every version by contract.
345
367
  */
346
368
  export function assertValidVersionsQuery(query) {
347
- if (!query)
348
- return;
349
- for (const key of ['beforeVersion', 'limit']) {
350
- const value = query[key];
351
- if (value === undefined)
352
- continue;
353
- if (!Number.isInteger(value) || value < 1) {
354
- throw new StackBadRequestError(`Invalid versions ${key} ${String(value)}: expected a positive integer.`);
355
- }
356
- }
369
+ assertWindowInteger(query?.beforeVersion, 'versions beforeVersion', 1);
370
+ assertWindowInteger(query?.limit, 'versions limit', 1);
357
371
  }
358
372
  //# sourceMappingURL=query-validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-validation.js","sourceRoot":"","sources":["../src/query-validation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-validation.js","sourceRoot":"","sources":["../src/query-validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,OAAO,EACL,8BAA8B,EAC9B,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAatD;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CACrC,KAAmB,EACnB,YAAwD;IAExD,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACnD,oBAAoB,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,sBAAsB,CAC7B,MAAgC,EAChC,YAA+C;IAE/C,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC;IACtF,IAAI,MAAM,EAAE,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,IAAI,oBAAoB,CAC5B,2FAA2F,EAC3F,eAAe,CAChB,CAAC;IACJ,CAAC;IACD,yEAAyE;IACzE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC1E,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,IAAI,GACR,IAAI,CAAC,MAAM,GAAG,CAAC;YACb,CAAC,CAAC,sBAAsB;YACxB,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO;gBACtC,CAAC,CAAC,uBAAuB;gBACzB,CAAC,CAAC,gBAAgB,CAAC;QACzB,MAAM,IAAI,oBAAoB,CAC5B,cAAc,IAAI,qDAAqD,EACvE,gBAAgB,CACjB,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,IAAI,oBAAoB,CAC5B,yEAAyE;YACvE,kCAAkC,EACpC,sBAAsB,CACvB,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QAC1C,MAAM,IAAI,oBAAoB,CAC5B,0EAA0E;YACxE,mCAAmC,EACrC,uBAAuB,CACxB,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;QACxC,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YAC9D,MAAM,IAAI,oBAAoB,CAC5B,uCAAuC,GAAG,+BAA+B;gBACvE,oBAAoB,KAAK,IAAI,EAC/B,gBAAgB,CACjB,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAgC;IACvE,MAAM,IAAI,GAAY,MAAM,EAAE,aAAa,CAAC;IAC5C,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,oBAAoB,CAAC,qDAAqD,CAAC,CAAC;IACxF,CAAC;IACD,IAAI,MAAO,CAAC,OAAO,KAAK,SAAS,IAAI,MAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QAC1E,MAAM,IAAI,oBAAoB,CAC5B,uFAAuF,CACxF,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,oBAAoB,CAC5B,6BAA6B,MAAM,8BAA8B,CAClE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,oBAAoB,CAAC,yBAAyB,MAAM,uBAAuB,CAAC,CAAC;QACzF,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,gBAAgB,EAAE,CAAC;gBAClD,MAAM,IAAI,oBAAoB,CAC5B,yBAAyB,MAAM,kDAAkD,GAAG,IAAI,CACzF,CAAC;YACJ,CAAC;QACH,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,oBAAoB,CAC5B,yBAAyB,MAAM,+BAA+B,CAC/D,CAAC;QACJ,CAAC;QACD,IACE,GAAG,CAAC,cAAc,KAAK,SAAS;YAChC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;gBACjC,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,EAChE,CAAC;YACD,MAAM,IAAI,oBAAoB,CAC5B,yBAAyB,MAAM,gDAAgD,CAChF,CAAC;QACJ,CAAC;QACD,KAAK,MAAM,GAAG,IAAI;YAChB,GAAG,MAAM,CAAC,IAAI,CAAE,GAAG,CAAC,OAA+C,IAAI,EAAE,CAAC;YAC1E,GAAG,CAAE,GAAG,CAAC,cAAuC,IAAI,EAAE,CAAC;SACxD,EAAE,CAAC;YACF,qBAAqB,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,QAA2C;IACxE,OAAO,QAAQ,CAAC,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC;AAC5C,CAAC;AAED;;;;;GAKG;AACH,MAAM,yBAAyB,GAAG,oBAAoB,GAAG,CAAC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,QAAQ,CAAC,MAAM,GAAG,yBAAyB,EAAE,CAAC;QAChD,MAAM,IAAI,oBAAoB,CAC5B,gCAAgC,GAAG,cAAc,yBAAyB,YAAY,CACvF,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;YACnB,MAAM,IAAI,oBAAoB,CAC5B,gCAAgC,GAAG,oCAAoC,CACxE,CAAC;QACJ,CAAC;QACD,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,oBAAoB,CAC5B,gCAAgC,GAAG,qCAAqC;gBACtE,GAAG,8BAA8B,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CACjD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC,kBAAkB,CAAC,CAAC;AAE3E,yDAAyD;AACzD,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AAEvD;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,IAA2B;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAC3E,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,CACjC,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,oBAAoB,CAC5B,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,oBAAoB,CAC5B,uBAAuB,IAAI,CAAC,KAAK,sBAAsB,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACxF,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;QAAE,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5E,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS;QAAE,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1F,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/E,MAAM,IAAI,oBAAoB,CAC5B,2BAA2B,IAAI,CAAC,SAAS,8BAA8B,CACxE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,CAAC,KAAc,EAAQ,EAAE;IACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,IAAI,oBAAoB,CAAC,gDAAgD,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,qBAAqB,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,oBAAoB,CAC5B,+BAA+B,KAAK,2CAA2C,CAChF,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,qBAAqB,GAAG,CAAC,MAAe,EAAQ,EAAE;IACtD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,oBAAoB,CAAC,wDAAwD,CAAC,CAAC;IAC3F,CAAC;IACD,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,oBAAoB,CAC5B,gCAAgC,MAAM,8BAA8B,CACrE,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,EAAE,CAAC;YACzE,MAAM,IAAI,oBAAoB,CAC5B,4BAA4B,MAAM,oCAAoC,CACvE,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAA2C,CAAC;QACrE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;YACzB,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;aAAM,IACL,KAAK,KAAK,IAAI;YACd,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EACtD,CAAC;YACD,MAAM,IAAI,oBAAoB,CAC5B,4BAA4B,MAAM,qDAAqD,CACxF,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,uDAAuD;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC;IACvC,uBAAuB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtC,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACvC,6BAA6B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO;QACL,GAAG,IAAI;QACP,IAAI,EAAE,IAAI;YACR,CAAC,CAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,KAAK,EAAkB;YAClE,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE;QAC7C,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,mBAAmB,EAAE,eAAe,CAAC;KAC/D,CAAC;AACJ,CAAC;AAQD;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC;IACtC,OAAO;QACL,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;QAC1B,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAyB,EAAE,KAAa,EAAE,GAAU;IACtF,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO;IAChC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;QAC5C,MAAM,IAAI,oBAAoB,CAC5B,WAAW,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,WAAW,CACtG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAC3B,IAAiB,EACjB,YAA6C;IAE7C,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1C,MAAM,IAAI,oBAAoB,CAC5B,4EAA4E;gBAC1E,qCAAqC,EACvC,yBAAyB,CAC1B,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACpC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,MAAM,IAAI,oBAAoB,CAC5B,wFAAwF;gBACtF,aAAa,EACf,mBAAmB,CACpB,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,MAAM,IAAI,oBAAoB,CAC5B,mBAAmB,KAAK,wDAAwD,EAChF,aAAa,CACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,6BAA6B,CAAC,MAAgC;IAC5E,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,CAAC;IACtC,IAAI,UAAU,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACpF,MAAM,IAAI,oBAAoB,CAC5B,mGAAmG,CACpG,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,EAAE,SAAS,CAAC;IACpC,IAAI,CAAC,SAAS;QAAE,OAAO;IACvB,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACpE,MAAM,IAAI,oBAAoB,CAC5B,oGAAoG,CACrG,CAAC;IACJ,CAAC;IACD,IAAI,SAAS,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO;IAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,EAAE,yBAAyB,EAAE;QACvE,kBAAkB,EAAE,IAAI;KACzB,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,MAAe,EAAE,OAAe;IAC7D,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjD,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,oBAAoB,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAkD;IACxF,IAAI,MAAM,EAAE,MAAM,KAAK,SAAS;QAAE,OAAO;IACzC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SAC5E,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;SAC/C,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;SACtC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AACnF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAA+B;IACrE,mBAAmB,CAAC,KAAK,EAAE,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;IAC5D,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAgC;IACvE,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,wBAAwB,EAAE,CAAC,CAAC,CAAC;IACvE,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -3,52 +3,28 @@
3
3
  * -------------------------------------------------------
4
4
  * Two jobs that share one question — what does this Record actually say?
5
5
  *
6
- * The change-set helpers answer it against a proposed write, so the no-op
7
- * decision and a change event's `ops` are the same comparison and can never
8
- * disagree. The projections answer it against a reader: a soft-deleted
9
- * Record is its tombstone, and a journal entry names the ACL it moved
10
- * only to a reader who could have moved it.
6
+ * The write helpers answer it against a proposed write: whether a patch
7
+ * moved content, and whether the ops a write reports bump its version.
8
+ * The projections answer it against a reader: a soft-deleted Record is its
9
+ * tombstone, and a journal entry names the ACL it moved only to a reader
10
+ * who could have moved it.
11
11
  *
12
12
  * See docs/spec/events.md § The event shape and docs/spec/versioning.md
13
13
  * § The tombstone is literal.
14
14
  */
15
- import type { ChangeOp, RecordChangeSet, RecordJournalEntry, StackRecord } from './types/index.js';
15
+ import type { ChangeOp, RecordJournalEntry, StackRecord } from './types/index.js';
16
16
  /**
17
- * A change set has to name at least one aspect. Refused rather than read
18
- * as a no-op: it addresses nothing, so there is nothing it could have
19
- * failed to satisfy, and every way of producing one is a caller bug —
20
- * typically a conditional that built an empty object.
21
- * See docs/spec/data-model.md § Mutations.
22
- */
23
- export declare function assertNonEmptyChangeSet(changes: RecordChangeSet): void;
24
- /**
25
- * Which aspects a change set actually moves, against the record as it
26
- * stands. A key naming the value a record already holds contributes
27
- * nothing. `merged` is the content the patch produces, computed once by the
28
- * caller that had to validate it anyway.
29
- */
30
- export declare function changeSetOps(existing: StackRecord, changes: RecordChangeSet, merged: Record<string, unknown> | undefined): ChangeOp[];
31
- /**
32
- * Whether a change set's ops advance `version`/`updatedAt` at all. After the
17
+ * Whether a write's ops advance `version`/`updatedAt` at all. After the
33
18
  * no-bump set above, this is `patch` and the whole-record verbs.
34
19
  */
35
20
  export declare function bumpsVersion(ops: ChangeOp[]): boolean;
36
21
  /**
37
- * Whether `ifVersion` applies to a change set. A set naming only keys from
38
- * the no-precondition list above carries none; any other aspect named
39
- * restores the guard over the whole call. Read off the keys the caller
40
- * wrote rather than the ops the set turns out to move, so a stale caller is
41
- * told its version is stale whatever its patch says.
42
- */
43
- export declare function takesIfVersion(changes: RecordChangeSet): boolean;
44
- /**
45
- * The change set narrowed to the aspects that actually moved. An adapter is
46
- * handed this rather than what the caller wrote, so restating an aspect
47
- * cannot rewrite it: `unlisted: true` on an already-unlisted record would
48
- * otherwise drag `unlistedAt` forward with no op reporting it. Every key an
49
- * adapter receives is one it must write.
22
+ * Whether a merge patch produced the content already held, compared by
23
+ * serialization: a patch preserves the order of every key it does not name.
24
+ * A pure reordering is the one false "change", costing an empty version
25
+ * rather than a wrong answer.
50
26
  */
51
- export declare function effectiveChanges(changes: RecordChangeSet, ops: ChangeOp[]): RecordChangeSet;
27
+ export declare function contentEqual(a: Record<string, unknown>, b: Record<string, unknown>): boolean;
52
28
  /** A soft-deleted Record presented as its tombstone; anything else untouched. */
53
29
  export declare const presentDeleted: (record: StackRecord) => StackRecord;
54
30
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"record-changes.d.ts","sourceRoot":"","sources":["../src/record-changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,KAAK,EAEV,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAE1B;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAOtE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC1C,QAAQ,EAAE,CA2BZ;AAiBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,CAErD;AAcD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAIhE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,eAAe,CAU3F;AAgCD,iFAAiF;AACjF,eAAO,MAAM,cAAc,GAAI,QAAQ,WAAW,KAAG,WACJ,CAAC;AAWlD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,kBAAkB,GAAG,kBAAkB,CAKrF"}
1
+ {"version":3,"file":"record-changes.d.ts","sourceRoot":"","sources":["../src/record-changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAEV,QAAQ,EACR,kBAAkB,EAClB,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAgB1B;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,OAAO,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAE5F;AAsBD,iFAAiF;AACjF,eAAO,MAAM,cAAc,GAAI,QAAQ,WAAW,KAAG,WACJ,CAAC;AAWlD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,kBAAkB,GAAG,kBAAkB,CAKrF"}