@haverstack/core 0.41.0 → 0.43.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 (317) hide show
  1. package/README.md +124 -64
  2. package/dist/access.d.ts +43 -47
  3. package/dist/access.d.ts.map +1 -1
  4. package/dist/access.js +66 -101
  5. package/dist/access.js.map +1 -1
  6. package/dist/{combine.d.ts → adapter/combine.d.ts} +8 -1
  7. package/dist/adapter/combine.d.ts.map +1 -0
  8. package/dist/{combine.js → adapter/combine.js} +18 -3
  9. package/dist/adapter/combine.js.map +1 -0
  10. package/dist/adapter/index.d.ts +19 -0
  11. package/dist/adapter/index.d.ts.map +1 -0
  12. package/dist/adapter/index.js +16 -0
  13. package/dist/adapter/index.js.map +1 -0
  14. package/dist/adapter/reach.d.ts +14 -0
  15. package/dist/adapter/reach.d.ts.map +1 -0
  16. package/dist/adapter/reach.js +31 -0
  17. package/dist/adapter/reach.js.map +1 -0
  18. package/dist/{sort.d.ts → adapter/sort.d.ts} +20 -20
  19. package/dist/adapter/sort.d.ts.map +1 -0
  20. package/dist/{sort.js → adapter/sort.js} +37 -27
  21. package/dist/adapter/sort.js.map +1 -0
  22. package/dist/associations/identity.d.ts +69 -0
  23. package/dist/associations/identity.d.ts.map +1 -0
  24. package/dist/associations/identity.js +174 -0
  25. package/dist/associations/identity.js.map +1 -0
  26. package/dist/associations/validation.d.ts +83 -0
  27. package/dist/associations/validation.d.ts.map +1 -0
  28. package/dist/associations/validation.js +312 -0
  29. package/dist/associations/validation.js.map +1 -0
  30. package/dist/attachment-records.d.ts +48 -0
  31. package/dist/attachment-records.d.ts.map +1 -0
  32. package/dist/attachment-records.js +52 -0
  33. package/dist/attachment-records.js.map +1 -0
  34. package/dist/collection.d.ts +178 -0
  35. package/dist/collection.d.ts.map +1 -0
  36. package/dist/collection.js +397 -0
  37. package/dist/collection.js.map +1 -0
  38. package/dist/content-match.d.ts +25 -0
  39. package/dist/content-match.d.ts.map +1 -0
  40. package/dist/content-match.js +51 -0
  41. package/dist/content-match.js.map +1 -0
  42. package/dist/content-translation.d.ts +42 -0
  43. package/dist/content-translation.d.ts.map +1 -0
  44. package/dist/content-translation.js +108 -0
  45. package/dist/content-translation.js.map +1 -0
  46. package/dist/did/did.d.ts.map +1 -0
  47. package/dist/{did.js → did/did.js} +3 -4
  48. package/dist/did/did.js.map +1 -0
  49. package/dist/{did-entry.d.ts → did/index.d.ts} +1 -1
  50. package/dist/did/index.d.ts.map +1 -0
  51. package/dist/{did-entry.js → did/index.js} +3 -3
  52. package/dist/did/index.js.map +1 -0
  53. package/dist/errors.d.ts +54 -66
  54. package/dist/errors.d.ts.map +1 -1
  55. package/dist/errors.js +58 -62
  56. package/dist/errors.js.map +1 -1
  57. package/dist/grants.d.ts +20 -44
  58. package/dist/grants.d.ts.map +1 -1
  59. package/dist/grants.js +69 -151
  60. package/dist/grants.js.map +1 -1
  61. package/dist/id.d.ts +13 -31
  62. package/dist/id.d.ts.map +1 -1
  63. package/dist/id.js +13 -31
  64. package/dist/id.js.map +1 -1
  65. package/dist/index.d.ts +13 -9
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +9 -6
  68. package/dist/index.js.map +1 -1
  69. package/dist/install.d.ts +3 -6
  70. package/dist/install.d.ts.map +1 -1
  71. package/dist/install.js +6 -10
  72. package/dist/install.js.map +1 -1
  73. package/dist/lazy.d.ts +13 -0
  74. package/dist/lazy.d.ts.map +1 -0
  75. package/dist/lazy.js +27 -0
  76. package/dist/lazy.js.map +1 -0
  77. package/dist/merge.d.ts +1 -1
  78. package/dist/merge.d.ts.map +1 -1
  79. package/dist/merge.js +6 -12
  80. package/dist/merge.js.map +1 -1
  81. package/dist/migration-steps.d.ts +102 -0
  82. package/dist/migration-steps.d.ts.map +1 -0
  83. package/dist/migration-steps.js +293 -0
  84. package/dist/migration-steps.js.map +1 -0
  85. package/dist/query-validation.d.ts +68 -121
  86. package/dist/query-validation.d.ts.map +1 -1
  87. package/dist/query-validation.js +214 -380
  88. package/dist/query-validation.js.map +1 -1
  89. package/dist/record-changes.d.ts +11 -150
  90. package/dist/record-changes.d.ts.map +1 -1
  91. package/dist/record-changes.js +14 -305
  92. package/dist/record-changes.js.map +1 -1
  93. package/dist/schema.d.ts +18 -7
  94. package/dist/schema.d.ts.map +1 -1
  95. package/dist/schema.js +59 -30
  96. package/dist/schema.js.map +1 -1
  97. package/dist/scoped-stack/authority-snapshot.d.ts +37 -0
  98. package/dist/scoped-stack/authority-snapshot.d.ts.map +1 -0
  99. package/dist/scoped-stack/authority-snapshot.js +49 -0
  100. package/dist/scoped-stack/authority-snapshot.js.map +1 -0
  101. package/dist/scoped-stack/authority.d.ts +169 -0
  102. package/dist/scoped-stack/authority.d.ts.map +1 -0
  103. package/dist/scoped-stack/authority.js +408 -0
  104. package/dist/scoped-stack/authority.js.map +1 -0
  105. package/dist/scoped-stack/family-policy.d.ts +59 -0
  106. package/dist/scoped-stack/family-policy.d.ts.map +1 -0
  107. package/dist/scoped-stack/family-policy.js +68 -0
  108. package/dist/scoped-stack/family-policy.js.map +1 -0
  109. package/dist/scoped-stack/scoped-stack.d.ts +318 -0
  110. package/dist/scoped-stack/scoped-stack.d.ts.map +1 -0
  111. package/dist/scoped-stack/scoped-stack.js +695 -0
  112. package/dist/scoped-stack/scoped-stack.js.map +1 -0
  113. package/dist/scoped-stack/subscription.d.ts +36 -0
  114. package/dist/scoped-stack/subscription.d.ts.map +1 -0
  115. package/dist/scoped-stack/subscription.js +69 -0
  116. package/dist/scoped-stack/subscription.js.map +1 -0
  117. package/dist/stack/arguments.d.ts +27 -0
  118. package/dist/stack/arguments.d.ts.map +1 -0
  119. package/dist/stack/arguments.js +53 -0
  120. package/dist/stack/arguments.js.map +1 -0
  121. package/dist/stack/attachments.d.ts +24 -0
  122. package/dist/stack/attachments.d.ts.map +1 -0
  123. package/dist/stack/attachments.js +113 -0
  124. package/dist/stack/attachments.js.map +1 -0
  125. package/dist/{changes.d.ts → stack/changes.d.ts} +30 -72
  126. package/dist/stack/changes.d.ts.map +1 -0
  127. package/dist/{changes.js → stack/changes.js} +40 -74
  128. package/dist/stack/changes.js.map +1 -0
  129. package/dist/stack/client.d.ts +247 -0
  130. package/dist/stack/client.d.ts.map +1 -0
  131. package/dist/stack/client.js +9 -0
  132. package/dist/stack/client.js.map +1 -0
  133. package/dist/stack/identity-bindings.d.ts.map +1 -0
  134. package/dist/{identity-bindings.js → stack/identity-bindings.js} +5 -14
  135. package/dist/stack/identity-bindings.js.map +1 -0
  136. package/dist/stack/install-app.d.ts +22 -0
  137. package/dist/stack/install-app.d.ts.map +1 -0
  138. package/dist/stack/install-app.js +262 -0
  139. package/dist/stack/install-app.js.map +1 -0
  140. package/dist/stack/integrity.d.ts +94 -0
  141. package/dist/stack/integrity.d.ts.map +1 -0
  142. package/dist/stack/integrity.js +268 -0
  143. package/dist/stack/integrity.js.map +1 -0
  144. package/dist/{limits.d.ts → stack/limits.d.ts} +2 -5
  145. package/dist/stack/limits.d.ts.map +1 -0
  146. package/dist/{limits.js → stack/limits.js} +3 -6
  147. package/dist/stack/limits.js.map +1 -0
  148. package/dist/stack/migrations.d.ts +59 -0
  149. package/dist/stack/migrations.d.ts.map +1 -0
  150. package/dist/stack/migrations.js +141 -0
  151. package/dist/stack/migrations.js.map +1 -0
  152. package/dist/stack/reads.d.ts +69 -0
  153. package/dist/stack/reads.d.ts.map +1 -0
  154. package/dist/stack/reads.js +141 -0
  155. package/dist/stack/reads.js.map +1 -0
  156. package/dist/stack/record-id.d.ts +35 -0
  157. package/dist/stack/record-id.d.ts.map +1 -0
  158. package/dist/stack/record-id.js +82 -0
  159. package/dist/stack/record-id.js.map +1 -0
  160. package/dist/stack/stack.d.ts +444 -0
  161. package/dist/stack/stack.d.ts.map +1 -0
  162. package/dist/stack/stack.js +1339 -0
  163. package/dist/stack/stack.js.map +1 -0
  164. package/dist/stack/system-types.d.ts +16 -0
  165. package/dist/stack/system-types.d.ts.map +1 -0
  166. package/dist/stack/system-types.js +111 -0
  167. package/dist/stack/system-types.js.map +1 -0
  168. package/dist/stack/type-grants.d.ts +20 -0
  169. package/dist/stack/type-grants.d.ts.map +1 -0
  170. package/dist/stack/type-grants.js +69 -0
  171. package/dist/stack/type-grants.js.map +1 -0
  172. package/dist/stack/write-expectation.d.ts +79 -0
  173. package/dist/stack/write-expectation.d.ts.map +1 -0
  174. package/dist/stack/write-expectation.js +71 -0
  175. package/dist/stack/write-expectation.js.map +1 -0
  176. package/dist/stack/write-gate.d.ts +23 -0
  177. package/dist/stack/write-gate.d.ts.map +1 -0
  178. package/dist/stack/write-gate.js +17 -0
  179. package/dist/stack/write-gate.js.map +1 -0
  180. package/dist/testing.d.ts +44 -33
  181. package/dist/testing.d.ts.map +1 -1
  182. package/dist/testing.js +180 -176
  183. package/dist/testing.js.map +1 -1
  184. package/dist/type-handle.d.ts +67 -78
  185. package/dist/type-handle.d.ts.map +1 -1
  186. package/dist/type-handle.js +44 -111
  187. package/dist/type-handle.js.map +1 -1
  188. package/dist/types/adapter.d.ts +282 -0
  189. package/dist/types/adapter.d.ts.map +1 -0
  190. package/dist/types/adapter.js +5 -0
  191. package/dist/types/adapter.js.map +1 -0
  192. package/dist/types/associations.d.ts +140 -0
  193. package/dist/types/associations.d.ts.map +1 -0
  194. package/dist/types/associations.js +6 -0
  195. package/dist/types/associations.js.map +1 -0
  196. package/dist/types/capabilities.d.ts +89 -0
  197. package/dist/types/capabilities.d.ts.map +1 -0
  198. package/dist/types/capabilities.js +5 -0
  199. package/dist/types/capabilities.js.map +1 -0
  200. package/dist/types/events.d.ts +150 -0
  201. package/dist/types/events.d.ts.map +1 -0
  202. package/dist/types/events.js +5 -0
  203. package/dist/types/events.js.map +1 -0
  204. package/dist/types/ids.d.ts +43 -0
  205. package/dist/types/ids.d.ts.map +1 -0
  206. package/dist/types/ids.js +5 -0
  207. package/dist/types/ids.js.map +1 -0
  208. package/dist/types/index.d.ts +19 -0
  209. package/dist/types/index.d.ts.map +1 -0
  210. package/dist/types/index.js +19 -0
  211. package/dist/types/index.js.map +1 -0
  212. package/dist/types/journal.d.ts +47 -0
  213. package/dist/types/journal.d.ts.map +1 -0
  214. package/dist/types/journal.js +5 -0
  215. package/dist/types/journal.js.map +1 -0
  216. package/dist/types/query.d.ts +185 -0
  217. package/dist/types/query.d.ts.map +1 -0
  218. package/dist/types/query.js +10 -0
  219. package/dist/types/query.js.map +1 -0
  220. package/dist/types/records.d.ts +76 -0
  221. package/dist/types/records.d.ts.map +1 -0
  222. package/dist/types/records.js +5 -0
  223. package/dist/types/records.js.map +1 -0
  224. package/dist/types/schema.d.ts +74 -0
  225. package/dist/types/schema.d.ts.map +1 -0
  226. package/dist/types/schema.js +5 -0
  227. package/dist/types/schema.js.map +1 -0
  228. package/dist/types/system.d.ts +161 -0
  229. package/dist/types/system.d.ts.map +1 -0
  230. package/dist/types/system.js +32 -0
  231. package/dist/types/system.js.map +1 -0
  232. package/dist/types/tokens.d.ts +39 -0
  233. package/dist/types/tokens.d.ts.map +1 -0
  234. package/dist/types/tokens.js +5 -0
  235. package/dist/types/tokens.js.map +1 -0
  236. package/dist/validate.d.ts +31 -70
  237. package/dist/validate.d.ts.map +1 -1
  238. package/dist/validate.js +52 -92
  239. package/dist/validate.js.map +1 -1
  240. package/dist/{attachment-download.d.ts → wire/attachment-download.d.ts} +0 -57
  241. package/dist/wire/attachment-download.d.ts.map +1 -0
  242. package/dist/{attachment-download.js → wire/attachment-download.js} +0 -61
  243. package/dist/wire/attachment-download.js.map +1 -0
  244. package/dist/{auth.d.ts → wire/auth.d.ts} +5 -8
  245. package/dist/wire/auth.d.ts.map +1 -0
  246. package/dist/{auth.js → wire/auth.js} +5 -8
  247. package/dist/wire/auth.js.map +1 -0
  248. package/dist/{wire-body.d.ts → wire/body.d.ts} +35 -12
  249. package/dist/wire/body.d.ts.map +1 -0
  250. package/dist/{wire-body.js → wire/body.js} +74 -13
  251. package/dist/wire/body.js.map +1 -0
  252. package/dist/{wire-entry.d.ts → wire/index.d.ts} +12 -12
  253. package/dist/wire/index.d.ts.map +1 -0
  254. package/dist/{wire-entry.js → wire/index.js} +13 -17
  255. package/dist/wire/index.js.map +1 -0
  256. package/dist/wire/record.d.ts +31 -0
  257. package/dist/wire/record.d.ts.map +1 -0
  258. package/dist/{wire-record.js → wire/record.js} +7 -67
  259. package/dist/wire/record.js.map +1 -0
  260. package/dist/{wire-request.d.ts → wire/request.d.ts} +32 -49
  261. package/dist/wire/request.d.ts.map +1 -0
  262. package/dist/{wire-request.js → wire/request.js} +113 -83
  263. package/dist/wire/request.js.map +1 -0
  264. package/package.json +7 -7
  265. package/dist/adapter-entry.d.ts +0 -16
  266. package/dist/adapter-entry.d.ts.map +0 -1
  267. package/dist/adapter-entry.js +0 -14
  268. package/dist/adapter-entry.js.map +0 -1
  269. package/dist/attachment-download.d.ts.map +0 -1
  270. package/dist/attachment-download.js.map +0 -1
  271. package/dist/auth.d.ts.map +0 -1
  272. package/dist/auth.js.map +0 -1
  273. package/dist/changes.d.ts.map +0 -1
  274. package/dist/changes.js.map +0 -1
  275. package/dist/combine.d.ts.map +0 -1
  276. package/dist/combine.js.map +0 -1
  277. package/dist/did-entry.d.ts.map +0 -1
  278. package/dist/did-entry.js.map +0 -1
  279. package/dist/did.d.ts.map +0 -1
  280. package/dist/did.js.map +0 -1
  281. package/dist/identity-bindings.d.ts.map +0 -1
  282. package/dist/identity-bindings.js.map +0 -1
  283. package/dist/limits.d.ts.map +0 -1
  284. package/dist/limits.js.map +0 -1
  285. package/dist/record-id.d.ts +0 -70
  286. package/dist/record-id.d.ts.map +0 -1
  287. package/dist/record-id.js +0 -127
  288. package/dist/record-id.js.map +0 -1
  289. package/dist/scoped-stack.d.ts +0 -549
  290. package/dist/scoped-stack.d.ts.map +0 -1
  291. package/dist/scoped-stack.js +0 -1301
  292. package/dist/scoped-stack.js.map +0 -1
  293. package/dist/sort.d.ts.map +0 -1
  294. package/dist/sort.js.map +0 -1
  295. package/dist/stack-reads.d.ts +0 -38
  296. package/dist/stack-reads.d.ts.map +0 -1
  297. package/dist/stack-reads.js +0 -79
  298. package/dist/stack-reads.js.map +0 -1
  299. package/dist/stack.d.ts +0 -1032
  300. package/dist/stack.d.ts.map +0 -1
  301. package/dist/stack.js +0 -2337
  302. package/dist/stack.js.map +0 -1
  303. package/dist/types.d.ts +0 -1278
  304. package/dist/types.d.ts.map +0 -1
  305. package/dist/types.js +0 -51
  306. package/dist/types.js.map +0 -1
  307. package/dist/wire-body.d.ts.map +0 -1
  308. package/dist/wire-body.js.map +0 -1
  309. package/dist/wire-entry.d.ts.map +0 -1
  310. package/dist/wire-entry.js.map +0 -1
  311. package/dist/wire-record.d.ts +0 -50
  312. package/dist/wire-record.d.ts.map +0 -1
  313. package/dist/wire-record.js.map +0 -1
  314. package/dist/wire-request.d.ts.map +0 -1
  315. package/dist/wire-request.js.map +0 -1
  316. /package/dist/{did.d.ts → did/did.d.ts} +0 -0
  317. /package/dist/{identity-bindings.d.ts → stack/identity-bindings.d.ts} +0 -0
@@ -1,11 +1,10 @@
1
1
  /**
2
- * Query and association validation
2
+ * Query validation
3
3
  * -------------------------------------------------------
4
- * The sanitizers a query passes through before any adapter sees it, plus
5
- * the relationship-target rules an association is held to. Both sides of
6
- * the same job: a discriminated union and a `QuerySort` field are compile-
7
- * time promises, and a server mapping a request body onto either supplies
8
- * raw JSON that no compiler has seen.
4
+ * The sanitizers a query passes through before any adapter sees it. A
5
+ * `QuerySort` field or a filter's discriminated union is a compile-time
6
+ * promise, and a server mapping a request onto either supplies raw JSON
7
+ * that no compiler has seen.
9
8
  *
10
9
  * These live in the invariant layer for the reason validation and
11
10
  * `_config` protection do — so no adapter can forget one. `assertQueryCapabilities`
@@ -16,16 +15,24 @@
16
15
  * the query — one rule, one answer.
17
16
  * See docs/spec/data-model.md § Capability-gated filters.
18
17
  */
19
- import type { ValidationError } from './validate.js';
20
- import type { Association, AssociationEdit, AuthorityAssociation, DataAssociation, GrantGrantee, JournalQuery, VersionsQuery, QuerySort, RecordFilter, RelationshipTarget, StackCapabilities } from './types.js';
18
+ import type { AdapterQuery, PlainQuery, StackQuery, JournalQuery, QuerySort, RecordFilter, StackCapabilities, VersionsQuery } from './types/index.js';
21
19
  /**
22
- * Fail loud rather than silently widen: a filter the adapter can't honor
23
- * would otherwise be dropped, returning an unfiltered superset presented
24
- * as the filtered result. Shared by Stack.query() and
25
- * APIAdapter.queryRecords(). See docs/spec/data-model.md
26
- * § 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.
27
26
  */
28
- 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;
28
+ /**
29
+ * Hold `filter.contentByType` to a split along Types: at least one arm,
30
+ * each pinned to a TypeId and flat, and never beside a top-level content
31
+ * predicate, whose relation to the arms would be ambiguous. A map that
32
+ * could arrive empty would match everything once it crossed the wire. See
33
+ * docs/spec/data-model.md § Content by type.
34
+ */
35
+ export declare function assertValidContentByType(filter: RecordFilter | undefined): void;
29
36
  /**
30
37
  * Whether a single-segment content filter can be pushed down to the
31
38
  * adapter. Callers that read a content field pair this with an in-memory
@@ -42,101 +49,44 @@ export declare function filtersContent(features: Pick<StackCapabilities, 'filter
42
49
  */
43
50
  export declare function parseContentFilterKey(key: string): string[];
44
51
  /**
45
- * Reject a sort whose field or direction is outside the closed set the
46
- * types promise. `QuerySort` is typed `'asc' | 'desc'`, but a type is not a
47
- * runtime guard: a server mapping `?direction=` onto a query, or a
48
- * delegated app calling query(), supplies a raw string. A SQLite record
49
- * adapter interpolates the direction straight into `ORDER BY`, so an
50
- * unvalidated value there is a SQL-injection sink reachable from every
51
- * untrusted caller. Validating in the invariant layer — the same reason
52
- * emission and _config protection live here — means no adapter can forget
53
- * it. See docs/spec/data-model.md § Sorting and pagination.
52
+ * Reject a sort outside the closed set the types promise. A type is not a
53
+ * runtime guard, and a SQLite adapter interpolates the direction straight
54
+ * into `ORDER BY`, so an unvalidated one is an injection sink reachable by
55
+ * any untrusted caller. See docs/spec/data-model.md § Sorting and pagination.
54
56
  */
55
57
  export declare function assertValidSort(sort: QuerySort | undefined): void;
56
- /**
57
- * The sort every adapter receives: a named sort with no `direction` is
58
- * ascending, resolved here so no adapter carries its own default. No sort
59
- * stays absent — the adapter's unsorted order is `createdAt` newest first,
60
- * and an explicit sort would be re-checked against the server's declared
61
- * `sort.fields`. See docs/spec/data-model.md § Sorting and pagination.
62
- */
63
- export declare function normalizeSort(sort: QuerySort | undefined): (QuerySort & {
64
- direction: 'asc' | 'desc';
65
- }) | undefined;
66
- /**
67
- * Fail loud rather than silently reorder: an adapter that can't honor the
68
- * requested sort would otherwise answer in some other order, which a
69
- * caller paging a bounded window has no way to notice. The companion to
70
- * assertQueryCapabilities(), split from it because a sort is not a filter
71
- * — see docs/spec/data-model.md § Capability-gated filters.
72
- */
73
- export declare function assertSortCapability(sort: QuerySort | undefined, capabilities: Pick<StackCapabilities, 'sort'>): void;
74
- /** Every key each relationship target arm defines. */
75
- export declare const TARGET_KEYS: Record<RelationshipTarget['kind'], readonly string[]>;
76
- /** Every key each grantee arm defines, the default tier included. */
77
- export declare const GRANTEE_KEYS: Record<GrantGrantee['kind'], readonly string[]>;
78
- /**
79
- * The keys of `value` its arm does not define. An element carrying one is
80
- * refused rather than stored: an adapter keeps only the keys it has
81
- * columns for, so the rest would answer 200 and then vanish.
82
- * See docs/spec/data-model.md § Associations.
83
- */
84
- export declare function unknownKeys(value: object, keys: readonly string[]): string[];
85
- /** unknownKeys() as a refusal. 400, not 422: the key addresses nothing. */
86
- export declare function assertKnownKeys(value: object, keys: readonly string[], path: string): void;
87
- /**
88
- * Reject a relationship target outside the closed set the types promise.
89
- * A discriminated union is not a runtime guard — a server mapping a
90
- * request body onto an association supplies raw JSON — and an
91
- * unrecognized kind would otherwise be stored under the one arm that
92
- * names a Record in this stack. See docs/spec/data-model.md
93
- * § Relationship targets.
94
- *
95
- * A key the element's kind does not define is thrown as a 400 rather than
96
- * collected, at every depth: it addresses nothing, the way an unknown key
97
- * on a request body does. See docs/spec/data-model.md § Associations.
98
- */
99
- export declare function validateAssociation(association: Association, path?: string): ValidationError[];
100
- /**
101
- * Refuse an authority element reaching the data half of the partition.
102
- * The two share a table, a delta shape and a durability tier; they never
103
- * share a call, because an app editing tags would otherwise be able to
104
- * replace an ACL it was never shown. Thrown rather than collected: the
105
- * caller named the wrong surface, not a malformed value, and the verb it
106
- * wanted is `grantAccess()`/`revokeAccess()`.
107
- *
108
- * Lives here, in the invariant layer, so an unscoped `Stack`, an import
109
- * and a server mapping a request body are all held to it.
110
- * See docs/spec/access-control.md § Record-level permissions.
111
- */
112
- export declare function assertDataAssociations(associations: readonly Association[], surface: string): asserts associations is DataAssociation[];
113
- /**
114
- * The mirror of assertDataAssociations(): the `permissions` surface takes
115
- * authority kinds alone, so a tag routed through it is refused rather than
116
- * quietly becoming an ACL entry the `associations` projection never shows.
117
- */
118
- export declare function assertAuthorityAssociations(permissions: readonly Association[], surface: string): asserts permissions is AuthorityAssociation[];
119
- /** validateAssociation() over a create's `associations` array. */
120
- /**
121
- * Every association in a list, plus the one rule a list has that a single
122
- * association does not: **identities are distinct**. A list naming one
123
- * identity twice describes a state no store can hold — an adapter keys
124
- * associations by identity, so the second entry displaces the first — and
125
- * which of the two the record ends up with is a question the caller did
126
- * not mean to ask. Refused rather than collapsed, for the reason an empty
127
- * change set is refused: every way of producing one is a caller bug.
128
- * See docs/spec/data-model.md § Associations.
129
- */
130
- export declare function validateAssociations(associations: Association[] | undefined, path?: string): ValidationError[];
131
- /**
132
- * Hold an association edit list to the rules every verb shares: non-empty,
133
- * every element a known `op` over a well-formed association, one surface,
134
- * and each identity named once — a list that both removes and adds one
135
- * identity is the same ambiguity as naming it twice. `repoint` is the
136
- * journal's word, never a request. Asked of the whole list before anything
137
- * is read or written. See docs/spec/data-model.md § Mutations.
138
- */
139
- export declare function assertAssociationEdits(changes: unknown, surface: string, half: 'data' | 'authority'): asserts changes is AssociationEdit[];
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;
62
+ /**
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.
69
+ */
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
+ };
76
+ /**
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.
81
+ */
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;
140
90
  /**
141
91
  * Reject an association filter that names neither of its halves, or whose
142
92
  * relationship target is malformed. `RelatedToFilter` and `AttachmentFilter`
@@ -145,6 +95,12 @@ export declare function assertAssociationEdits(changes: unknown, surface: string
145
95
  * any association of that kind. See docs/spec/data-model.md § Filter.
146
96
  */
147
97
  export declare function assertValidAssociationFilters(filter: RecordFilter | undefined): void;
98
+ /**
99
+ * Refuse a `baseId` argument that cannot name a type family, as an
100
+ * argument error prefixed with the `surface` it was passed to. See
101
+ * familyIdProblem().
102
+ */
103
+ export declare function assertFamilyId(baseId: unknown, surface: string): void;
148
104
  /**
149
105
  * Refuse a `baseId` carrying an `@version` suffix. A family filter resolves
150
106
  * against registered families, so a TypeId there would match nothing and
@@ -154,23 +110,14 @@ export declare function assertValidBaseIdFilter(filter: {
154
110
  baseId?: string | string[];
155
111
  } | undefined): void;
156
112
  /**
157
- * Hold a journal window to the shape both adapters can honor identically.
158
- *
159
- * Unvalidated, a negative `limit` diverges rather than failing: a JS
160
- * `slice(0, -1)` drops the newest entry, while SQLite reads a negative
161
- * LIMIT as "no ceiling" and returns the whole log. Neither is what the
162
- * caller asked for, and the disagreement is invisible until a stack
163
- * changes adapters. Refuse at the surface so no adapter has to guess.
164
- *
165
- * No ceiling is imposed: unlike a query, omitting `limit` reads the whole
166
- * log by contract, so a clamp would silently truncate exactly the caller
167
- * reconstructing an association's full history.
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.
168
116
  */
169
117
  export declare function assertValidJournalQuery(query: JournalQuery | undefined): void;
170
118
  /**
171
- * Refuse a `getVersions()` window the adapters would read differently, as
172
- * assertValidJournalQuery() does for the journal. No ceiling is imposed:
173
- * omitting `limit` reads every version by contract.
119
+ * A `getVersions()` window. No ceiling is imposed: omitting `limit` reads
120
+ * every version by contract.
174
121
  */
175
122
  export declare function assertValidVersionsQuery(query: VersionsQuery | undefined): void;
176
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":"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"}
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"}