@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
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Collections — typed access to one type family
3
+ * -------------------------------------------------------
4
+ * `client.collection(handle)` returns a `Collection<C>`: every verb that
5
+ * addresses records of the handle's family, each taking and returning the
6
+ * handle's content type with one signature. Implemented once over the
7
+ * public `StackClient` verbs, so `Stack` and `ScopedStack` share it and a
8
+ * collection can do nothing its client could not.
9
+ *
10
+ * The collection's scope is the handle's whole family. Each record is read
11
+ * as stored and migrated in memory to the handle's version, one at a time,
12
+ * so a record the handle cannot represent — one stored at a newer version —
13
+ * is reported as a misfit rather than failing the page it sits on. A
14
+ * content write to a record at an older version commits its migration as a
15
+ * write of its own first. See docs/spec/data-model.md § Type handles.
16
+ */
17
+ import type { MigrationRegistry } from './stack/migrations.js';
18
+ import type { CreateRecordOptions, DeleteRecordOptions, DeleteResult, StackClient } from './stack/client.js';
19
+ import type { ContentOf, ReadonlyTypeSchema, TypeHandle, UnlistedValue } from './type-handle.js';
20
+ import type { AssociationEdit, AuthorityAssociation, ChangeFilter, DataAssociation, IfVersionOptions, NativeSortField, RecordChange, RecordFilter, RecordId, StackQuery, StackType, StackRecord, SubscribeOptions, Unsubscribe } from './types/index.js';
21
+ /**
22
+ * Content `C` as a read returns it: an enum may hold a value the handle
23
+ * does not list, since an enum can widen in place. Never flattens `C`, so
24
+ * an app that names its content with an `interface` keeps that name.
25
+ */
26
+ export type StoredContent<C> = C extends string ? string extends C ? C : C | UnlistedValue : C extends readonly (infer I)[] ? StoredContent<I>[] : C extends object ? {
27
+ [K in keyof C]: StoredContent<C[K]>;
28
+ } : C;
29
+ /**
30
+ * The `contentPatch` content `C` accepts: every field optional, and `null`
31
+ * (removal) only on a field that is optional in `C`.
32
+ */
33
+ export type ContentPatch<C> = {
34
+ [K in keyof C]?: Pick<C, K> extends Required<Pick<C, K>> ? C[K] : Exclude<C[K], undefined> | null;
35
+ };
36
+ /** A record of the collection, migrated to the handle's version. */
37
+ export interface CollectionRecord<C> extends Omit<StackRecord, 'content'> {
38
+ content: StoredContent<C>;
39
+ }
40
+ /**
41
+ * A record in the handle's family that the handle cannot represent. Stored
42
+ * at a version newer than the handle's, it cannot be migrated down.
43
+ */
44
+ export type Misfit = {
45
+ id: RecordId;
46
+ reason: 'newer-version';
47
+ /** Untyped, as stored. */
48
+ record: StackRecord;
49
+ };
50
+ /**
51
+ * A page of a collection. Misfits do not count as records, so a page can
52
+ * hold fewer than `limit` records with a cursor still set: the results end
53
+ * when `cursor` is `null`, not when a page comes back short.
54
+ */
55
+ export type CollectionPage<C> = {
56
+ records: CollectionRecord<C>[];
57
+ misfits: Misfit[];
58
+ cursor: string | null;
59
+ /**
60
+ * Set when records at a version a content filter or sort could not reach
61
+ * match, or may match, the rest of the query. On the first page only,
62
+ * since it depends on the query rather than the page. See
63
+ * docs/spec/data-model.md § Content queries across versions.
64
+ */
65
+ skipped?: {
66
+ older: boolean;
67
+ newer: boolean;
68
+ };
69
+ };
70
+ /**
71
+ * Path typing stops at this depth and accepts any suffix below it, since a
72
+ * recursive path type otherwise exceeds the compiler's instantiation limit.
73
+ * A typing limit, not a query limit: see docs/spec/data-model.md § Nested
74
+ * content paths.
75
+ */
76
+ type PathDepth = [never, 0, 1, 2, 3, 4];
77
+ /** What a filter value can equal: an adapter compares the value a path reaches. */
78
+ type Leaf = string | number | boolean;
79
+ /**
80
+ * Each content path of `V` reached at `P`, paired with the value a filter
81
+ * compares there. An array is matched element-wise, so it is its element.
82
+ * An object never equals a filter value, so its path takes only `null`.
83
+ */
84
+ type PathEntry<P extends string, V, D extends number> = [D] extends [never] ? [P | `${P}.${string}`, Leaf] : V extends readonly (infer E)[] ? unknown extends E ? [P | `${P}.${string}`, Leaf] : PathEntry<P, E, PathDepth[D]> : V extends object ? string extends keyof V ? [P, null] | [`${P}.${string}`, Leaf] : [P, null] | FieldEntry<V, `${P}.`, PathDepth[D]> : [P, V];
85
+ /** `Required<C>[K]` rather than `NonNullable`, which would leak into errors. */
86
+ type FieldEntry<C, Prefix extends string, D extends number> = [D] extends [never] ? [`${Prefix}${string}`, Leaf] : {
87
+ [K in keyof C & string]-?: PathEntry<`${Prefix}${K}`, Required<C>[K], D>;
88
+ }[keyof C & string];
89
+ /**
90
+ * Every content path of `C`: its fields, and dotted paths through declared
91
+ * objects and arrays. Below an `open` object or array, or six segments
92
+ * deep, any suffix is a path.
93
+ */
94
+ export type ContentPathOf<C> = FieldEntry<C, '', 5>[0];
95
+ /** The top-level scalar fields of `C`, the ones a content sort reaches. */
96
+ export type SortableFieldOf<C> = string extends keyof C ? string : {
97
+ [K in keyof C & string]-?: Required<C>[K] extends string | number | boolean ? K : never;
98
+ }[keyof C & string];
99
+ /**
100
+ * A collection reads live records of its own family only, as stored, so
101
+ * none of `typeId`, `baseId`, `includeDeleted`, `presentAt` or the per-Type
102
+ * shapes it generates itself is offered. Content filter keys and the sort
103
+ * field are checked against `C`, and carried to older versions through the
104
+ * migrations. See docs/spec/data-model.md § Type handles.
105
+ */
106
+ export type CollectionQuery<C> = Omit<StackQuery, 'filter' | 'presentAt' | 'sort'> & {
107
+ filter?: Omit<RecordFilter, 'typeId' | 'baseId' | 'includeDeleted' | 'content' | 'contentPresent' | 'contentByType'> & {
108
+ content?: {
109
+ [E in FieldEntry<C, '', 5> as E[0]]?: E[1] | null;
110
+ };
111
+ contentPresent?: ContentPathOf<C>[];
112
+ };
113
+ sort?: {
114
+ field: NativeSortField;
115
+ contentField?: never;
116
+ direction?: 'asc' | 'desc';
117
+ } | {
118
+ field?: never;
119
+ contentField: SortableFieldOf<C>;
120
+ direction?: 'asc' | 'desc';
121
+ };
122
+ };
123
+ /** The family is the collection's, so neither `typeId` nor `baseId` is a filter key. */
124
+ export type CollectionSubscribeOptions = Omit<SubscribeOptions, 'filter'> & {
125
+ filter?: Omit<ChangeFilter, 'typeId' | 'baseId'>;
126
+ };
127
+ /**
128
+ * A change to a record of the family. `record`, when present, is migrated
129
+ * to the handle's version; `typeId` stays the stored one. A change whose
130
+ * record does not fit carries `misfit` instead, and one whose record is a
131
+ * tombstone carries neither.
132
+ */
133
+ export type CollectionChange<C> = Omit<RecordChange, 'record'> & {
134
+ record?: CollectionRecord<C>;
135
+ misfit?: Misfit;
136
+ };
137
+ /**
138
+ * Typed access to one type family. History (`getVersions`, `getVersion`,
139
+ * `getJournal`) spans versions by nature and stays on `StackClient`. See
140
+ * docs/spec/data-model.md § Type handles.
141
+ */
142
+ export interface Collection<C> {
143
+ /** `null` for a missing record, a tombstone, or a record of another family. */
144
+ get(id: RecordId): Promise<CollectionRecord<C> | null>;
145
+ query(query?: CollectionQuery<C>): Promise<CollectionPage<C>>;
146
+ subscribe(handler: (change: CollectionChange<C>) => void, opts?: CollectionSubscribeOptions): Promise<Unsubscribe>;
147
+ create(content: C, opts?: CreateRecordOptions): Promise<CollectionRecord<C>>;
148
+ patchContent(id: RecordId, patch: ContentPatch<C>, opts?: IfVersionOptions): Promise<CollectionRecord<C>>;
149
+ setParent(id: RecordId, parentId: RecordId | null, opts?: IfVersionOptions): Promise<CollectionRecord<C>>;
150
+ setUnlisted(id: RecordId, unlisted: boolean, opts?: IfVersionOptions): Promise<CollectionRecord<C>>;
151
+ editAssociations(id: RecordId, edits: AssociationEdit[], opts?: IfVersionOptions): Promise<CollectionRecord<C>>;
152
+ setAssociations(id: RecordId, associations: DataAssociation[], opts?: IfVersionOptions): Promise<CollectionRecord<C>>;
153
+ editAccess(id: RecordId, edits: AssociationEdit[], opts?: IfVersionOptions): Promise<CollectionRecord<C>>;
154
+ setAccess(id: RecordId, permissions: AuthorityAssociation[], opts?: IfVersionOptions): Promise<CollectionRecord<C>>;
155
+ delete(id: RecordId, opts?: DeleteRecordOptions): Promise<DeleteResult>;
156
+ undelete(id: RecordId, opts?: IfVersionOptions): Promise<CollectionRecord<C>>;
157
+ restoreVersion(id: RecordId, version: number, opts?: IfVersionOptions): Promise<CollectionRecord<C>>;
158
+ }
159
+ /**
160
+ * A record the collection asked for does not fit the handle. Raised only
161
+ * in the app's own process and never on the wire, so it sits outside the
162
+ * `StackError` taxonomy. A write that raises it after writing says so.
163
+ * See docs/spec/wire-format.md § The taxonomy root.
164
+ */
165
+ export declare class MisfitError extends Error {
166
+ readonly reason: Misfit['reason'];
167
+ readonly record: StackRecord;
168
+ constructor(misfit: Misfit, handle: TypeHandle, written?: boolean);
169
+ }
170
+ /**
171
+ * The collection over `handle`, shared by `Stack.collection()` and
172
+ * `ScopedStack.collection()`. `registry` is the opening `Stack`'s, which
173
+ * the app's own process filled. `listTypes` names the family's versions,
174
+ * which `StackClient` does not offer.
175
+ */
176
+ export declare const createCollection: <S extends ReadonlyTypeSchema>(client: StackClient, registry: MigrationRegistry, handle: TypeHandle<S>, listTypes: () => Promise<StackType[]>) => Collection<ContentOf<S>>;
177
+ export {};
178
+ //# sourceMappingURL=collection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,397 @@
1
+ /**
2
+ * Collections — typed access to one type family
3
+ * -------------------------------------------------------
4
+ * `client.collection(handle)` returns a `Collection<C>`: every verb that
5
+ * addresses records of the handle's family, each taking and returning the
6
+ * handle's content type with one signature. Implemented once over the
7
+ * public `StackClient` verbs, so `Stack` and `ScopedStack` share it and a
8
+ * collection can do nothing its client could not.
9
+ *
10
+ * The collection's scope is the handle's whole family. Each record is read
11
+ * as stored and migrated in memory to the handle's version, one at a time,
12
+ * so a record the handle cannot represent — one stored at a newer version —
13
+ * is reported as a misfit rather than failing the page it sits on. A
14
+ * content write to a record at an older version commits its migration as a
15
+ * write of its own first. See docs/spec/data-model.md § Type handles.
16
+ */
17
+ import { StackBadRequestError, StackMigrationError, StackPermissionError } from './errors.js';
18
+ import { baseIdOf, parseTypeId } from './schema.js';
19
+ import { StoredVersionError, WRITE_EXPECTATION } from './stack/write-expectation.js';
20
+ import { translateArm, translateSortKey, UNMATCHABLE, UNTRANSLATABLE, } from './content-translation.js';
21
+ /**
22
+ * A record the collection asked for does not fit the handle. Raised only
23
+ * in the app's own process and never on the wire, so it sits outside the
24
+ * `StackError` taxonomy. A write that raises it after writing says so.
25
+ * See docs/spec/wire-format.md § The taxonomy root.
26
+ */
27
+ export class MisfitError extends Error {
28
+ reason;
29
+ record;
30
+ constructor(misfit, handle, written = false) {
31
+ super(`Record "${misfit.id}" is stored at ${misfit.record.typeId}, newer than ${handle.id}` +
32
+ (written ? '; the write landed.' : '.'));
33
+ this.name = 'MisfitError';
34
+ this.reason = misfit.reason;
35
+ this.record = misfit.record;
36
+ }
37
+ }
38
+ // -------------------------------------------------------
39
+ // Implementation
40
+ // -------------------------------------------------------
41
+ const versionOf = (typeId) => parseTypeId(typeId).version;
42
+ /**
43
+ * A filter's `typeId` would narrow the family to one version, so an untyped
44
+ * caller passing one has it dropped rather than honoured.
45
+ */
46
+ const withoutTypeId = (filter) => {
47
+ const { typeId: _typeId, ...rest } = (filter ?? {});
48
+ return rest;
49
+ };
50
+ /**
51
+ * A filter's content predicate, or undefined when it names no key. Only
52
+ * records stored at the handle's version are guaranteed to hold content in
53
+ * the handle's shape, so a predicate is what has to be translated.
54
+ */
55
+ const contentPredicate = (filter) => {
56
+ const content = Object.keys(filter.content ?? {}).length > 0 ? filter.content : undefined;
57
+ const present = filter.contentPresent?.length ? filter.contentPresent : undefined;
58
+ if (!content && !present)
59
+ return undefined;
60
+ return { ...(content && { content }), ...(present && { contentPresent: present }) };
61
+ };
62
+ /** `filter` without its content predicate, for a query that asks about the rest. */
63
+ const withoutContent = (filter) => {
64
+ const { content: _content, contentPresent: _present, ...rest } = filter;
65
+ return rest;
66
+ };
67
+ /**
68
+ * A content query's cursor: the adapter's, with the versions the first page
69
+ * queried, so a version defined mid-pagination cannot change the arms or
70
+ * the sort a cursor resumes, and a later page lists no types.
71
+ */
72
+ const encodeContentCursor = (versions, cursor) => {
73
+ const bytes = new TextEncoder().encode(JSON.stringify({ v: versions, c: cursor }));
74
+ let binary = '';
75
+ for (const byte of bytes)
76
+ binary += String.fromCharCode(byte);
77
+ return btoa(binary);
78
+ };
79
+ const decodeContentCursor = (raw, handle) => {
80
+ const malformed = () => new StackBadRequestError(`Invalid cursor: malformed "${raw}"`);
81
+ let parsed;
82
+ try {
83
+ const binary = atob(raw);
84
+ const bytes = Uint8Array.from(binary, (char) => char.charCodeAt(0));
85
+ parsed = JSON.parse(new TextDecoder().decode(bytes));
86
+ }
87
+ catch {
88
+ throw malformed();
89
+ }
90
+ const { v, c } = (parsed ?? {});
91
+ if (typeof c !== 'string' ||
92
+ !Array.isArray(v) ||
93
+ !v.every((id) => typeof id === 'string' && parseTypeId(id)?.baseId === handle.baseId)) {
94
+ throw malformed();
95
+ }
96
+ return { versions: v, cursor: c };
97
+ };
98
+ /**
99
+ * The collection over `handle`, shared by `Stack.collection()` and
100
+ * `ScopedStack.collection()`. `registry` is the opening `Stack`'s, which
101
+ * the app's own process filled. `listTypes` names the family's versions,
102
+ * which `StackClient` does not offer.
103
+ */
104
+ export const createCollection = (client, registry, handle, listTypes) => {
105
+ if (handle.migratesFrom !== undefined && !registry.path(handle.migratesFrom, handle.id)) {
106
+ throw new StackMigrationError(`No migration from "${handle.migratesFrom}" to "${handle.id}" was passed to Stack.open().`);
107
+ }
108
+ const writer = client;
109
+ const family = { baseId: handle.baseId };
110
+ const expect = (expectation = family) => ({
111
+ [WRITE_EXPECTATION]: expectation,
112
+ });
113
+ const handleVersion = versionOf(handle.id);
114
+ /**
115
+ * One record of the family, migrated to the handle's version, or the
116
+ * misfit it is. An older record with no migration to bridge the gap is
117
+ * the app's setup, not the record's, and throws.
118
+ */
119
+ const classify = (record) => {
120
+ if (record.typeId === handle.id)
121
+ return { record: record };
122
+ if (versionOf(record.typeId) > handleVersion) {
123
+ return { misfit: { id: record.id, reason: 'newer-version', record } };
124
+ }
125
+ const migrate = registry.path(record.typeId, handle.id);
126
+ if (!migrate) {
127
+ throw new StackMigrationError(`Record "${record.id}" is at "${record.typeId}", and no migration passed to ` +
128
+ `Stack.open() carries it to "${handle.id}".`);
129
+ }
130
+ const content = migrate(record.content);
131
+ return { record: { ...record, typeId: handle.id, content } };
132
+ };
133
+ /** A record a write returned, narrowed as `get()` narrows it. */
134
+ const narrow = (record, written) => {
135
+ const result = classify(record);
136
+ if ('misfit' in result)
137
+ throw new MisfitError(result.misfit, handle, written);
138
+ return result.record;
139
+ };
140
+ /**
141
+ * A content write to a record stored at an older version: commit its
142
+ * migration as a write of its own, fenced to the state the caller read,
143
+ * then apply the write fenced to the version the migration produced. A
144
+ * patch never folds a migration in. See docs/spec/data-model.md § Type
145
+ * migrations.
146
+ */
147
+ const migrateThenPatch = async (stored, patch, opts) => {
148
+ const migrated = classify(stored);
149
+ if ('misfit' in migrated)
150
+ throw new MisfitError(migrated.misfit, handle);
151
+ let committed;
152
+ try {
153
+ committed = await client.commitMigration(stored.id, handle.id, migrated.record.content, {
154
+ ifVersion: stored.version,
155
+ });
156
+ }
157
+ catch (err) {
158
+ if (!(err instanceof StackPermissionError))
159
+ throw err;
160
+ throw new StackPermissionError(`Record "${stored.id}" is stored at ${stored.typeId} and must be migrated to ` +
161
+ `${handle.id} before this write: ${err.message}`);
162
+ }
163
+ const written = await writer.patchContent(stored.id, patch, {
164
+ ...opts,
165
+ ifVersion: committed.version,
166
+ ...expect({ ...family, typeId: handle.id }),
167
+ });
168
+ return narrow(written, true);
169
+ };
170
+ /**
171
+ * Whether any record matches, or may match, `filter`. A scoped page can
172
+ * be empty with a cursor set, and reading on is unbounded, so that page
173
+ * counts as a match.
174
+ */
175
+ const anyMatch = async (filter) => {
176
+ const page = await client.query({ filter, limit: 1 });
177
+ return page.records.length > 0 || page.cursor !== null;
178
+ };
179
+ /** Whether a record stored at one of `typeIds` matches `filter` without its content keys. */
180
+ const anyAt = async (typeIds, filter) => {
181
+ if (typeIds.length === 0)
182
+ return false;
183
+ return anyMatch({ ...withoutContent(filter), typeId: typeIds });
184
+ };
185
+ /**
186
+ * Whether records at an older version hold what its arm left out: each
187
+ * residual is that arm with another source value in place, at its typeId.
188
+ */
189
+ const anyResidual = async (residuals, filter) => {
190
+ const rest = withoutContent(filter);
191
+ const found = await Promise.all(residuals.map((residual) => anyMatch({ ...rest, ...residual })));
192
+ return found.some(Boolean);
193
+ };
194
+ /**
195
+ * A content query as one arm per version it translates to, plus what the
196
+ * first page probes for `skipped`. `pinned` is the versions a first page
197
+ * chose, which a later page reuses. See docs/spec/data-model.md § Content
198
+ * queries across versions.
199
+ */
200
+ const planContentQuery = async (filter, sort, pinned) => {
201
+ const predicate = contentPredicate(filter);
202
+ const sortField = sort?.contentField;
203
+ const { capabilities } = client;
204
+ // Spanning versions takes the per-Type shape of each content key the
205
+ // query carries; an adapter without one gets the handle's version alone.
206
+ const spans = (predicate === undefined || capabilities.filter.contentByType) &&
207
+ (sortField === undefined || capabilities.sort.contentFieldByType);
208
+ const sortKind = (() => {
209
+ const def = sortField === undefined ? undefined : handle.schema[sortField];
210
+ return def && def.kind !== 'array' && def.kind !== 'object' ? def.kind : undefined;
211
+ })();
212
+ const family = (pinned
213
+ ? pinned.map((id) => ({ id, baseId: handle.baseId, version: versionOf(id) }))
214
+ : await listTypes()).filter((type) => type.baseId === handle.baseId && type.version !== handleVersion);
215
+ const arms = { [handle.id]: predicate ?? {} };
216
+ const keys = sortField
217
+ ? { [handle.id]: { field: sortField } }
218
+ : {};
219
+ const narrowed = [];
220
+ const newer = [];
221
+ const residuals = [];
222
+ for (const type of family) {
223
+ if (type.version > handleVersion) {
224
+ newer.push(type.id);
225
+ continue;
226
+ }
227
+ const origins = registry.origins(type.id, handle.id);
228
+ const translated = !predicate
229
+ ? { arm: {}, residuals: [] }
230
+ : origins
231
+ ? translateArm(origins, predicate)
232
+ : UNTRANSLATABLE;
233
+ if (translated === UNMATCHABLE)
234
+ continue;
235
+ const key = sortField === undefined
236
+ ? undefined
237
+ : origins
238
+ ? translateSortKey(origins, sortField, sortKind)
239
+ : UNTRANSLATABLE;
240
+ if (translated === UNTRANSLATABLE || key === UNTRANSLATABLE || !spans) {
241
+ narrowed.push(type.id);
242
+ continue;
243
+ }
244
+ arms[type.id] = translated.arm;
245
+ if (key)
246
+ keys[type.id] = key;
247
+ for (const arm of translated.residuals)
248
+ residuals.push({ ...arm, typeId: type.id });
249
+ }
250
+ const rest = withoutContent(filter);
251
+ const typeIds = Object.keys(arms);
252
+ if (typeIds.length === 1) {
253
+ return {
254
+ query: { filter: { ...filter, typeId: handle.id }, sort },
255
+ versions: typeIds,
256
+ narrowed,
257
+ newer,
258
+ residuals,
259
+ };
260
+ }
261
+ return {
262
+ query: {
263
+ filter: predicate ? { ...rest, contentByType: arms } : { ...rest, typeId: typeIds },
264
+ sort: sortField
265
+ ? { contentFieldByType: keys, ...(sort?.direction && { direction: sort.direction }) }
266
+ : sort,
267
+ },
268
+ versions: typeIds,
269
+ narrowed,
270
+ newer,
271
+ residuals,
272
+ };
273
+ };
274
+ const patchContent = async (id, patch, opts = {}) => {
275
+ try {
276
+ const written = await writer.patchContent(id, patch, {
277
+ ...opts,
278
+ ...expect({ ...family, typeId: handle.id }),
279
+ });
280
+ return narrow(written, true);
281
+ }
282
+ catch (err) {
283
+ if (!(err instanceof StoredVersionError))
284
+ throw err;
285
+ return migrateThenPatch(err.record, patch, opts);
286
+ }
287
+ };
288
+ return {
289
+ async get(id) {
290
+ const record = await client.get(id);
291
+ if (!record || baseIdOf(record.typeId) !== handle.baseId)
292
+ return null;
293
+ return narrow(record, false);
294
+ },
295
+ async query(query = {}) {
296
+ if (query.filter?.includeDeleted) {
297
+ throw new StackBadRequestError('A collection reads live records only; use the untyped query() to include soft-deleted records.');
298
+ }
299
+ // Stripped as well as untyped: either would change which records a
300
+ // page holds, or the shape they arrive in.
301
+ const { presentAt: _presentAt, filter, ...rest } = query;
302
+ // A concrete typeId needs no family lookup; baseId does.
303
+ const { baseId: _baseId, contentByType: _byType, ...unversioned } = withoutTypeId(filter);
304
+ const firstPage = rest.cursor === undefined;
305
+ let records;
306
+ let cursor;
307
+ let skipped;
308
+ if (!contentPredicate(unversioned) && rest.sort?.contentField === undefined) {
309
+ ({ records, cursor } = await client.query({
310
+ ...rest,
311
+ filter: { ...unversioned, baseId: handle.baseId },
312
+ }));
313
+ if (firstPage)
314
+ skipped = { older: false, newer: false };
315
+ }
316
+ else {
317
+ const resumed = firstPage ? undefined : decodeContentCursor(rest.cursor, handle);
318
+ const plan = await planContentQuery(unversioned, rest.sort, resumed?.versions);
319
+ const [page, narrowed, residual, newer] = await Promise.all([
320
+ client.query({ ...rest, cursor: resumed?.cursor, ...plan.query }),
321
+ firstPage && anyAt(plan.narrowed, unversioned),
322
+ firstPage && anyResidual(plan.residuals, unversioned),
323
+ firstPage && anyAt(plan.newer, unversioned),
324
+ ]);
325
+ records = page.records;
326
+ cursor = page.cursor && encodeContentCursor(plan.versions, page.cursor);
327
+ if (firstPage)
328
+ skipped = { older: narrowed || residual, newer };
329
+ }
330
+ const page = {
331
+ records: [],
332
+ misfits: [],
333
+ cursor,
334
+ ...(skipped && { skipped }),
335
+ };
336
+ for (const stored of records) {
337
+ const result = classify(stored);
338
+ if ('misfit' in result)
339
+ page.misfits.push(result.misfit);
340
+ else
341
+ page.records.push(result.record);
342
+ }
343
+ return page;
344
+ },
345
+ subscribe(handler, opts = {}) {
346
+ return client.subscribe((change) => {
347
+ const { record, ...rest } = change;
348
+ // A tombstone's content is `{}` under ScopedStack, so it is never
349
+ // typed as the handle's content on either surface. A record that
350
+ // migrated out of the family matches by its previous typeId.
351
+ if (!record || record.deletedAt || baseIdOf(record.typeId) !== handle.baseId) {
352
+ return handler(rest);
353
+ }
354
+ let result;
355
+ try {
356
+ result = classify(record);
357
+ }
358
+ catch {
359
+ // A missing or failing migration: delivered as wherever the
360
+ // emitter cannot supply the record, and get() says why.
361
+ return handler(rest);
362
+ }
363
+ handler({ ...rest, ...result });
364
+ }, { ...opts, filter: { ...withoutTypeId(opts.filter), baseId: handle.baseId } });
365
+ },
366
+ async create(content, opts) {
367
+ return (await client.create(handle.id, content, opts));
368
+ },
369
+ patchContent: (id, patch, opts) => patchContent(id, patch, opts),
370
+ async setParent(id, parentId, opts) {
371
+ return narrow(await writer.setParent(id, parentId, { ...opts, ...expect() }), true);
372
+ },
373
+ async setUnlisted(id, unlisted, opts) {
374
+ return narrow(await writer.setUnlisted(id, unlisted, { ...opts, ...expect() }), true);
375
+ },
376
+ async editAssociations(id, edits, opts) {
377
+ return narrow(await writer.editAssociations(id, edits, { ...opts, ...expect() }), true);
378
+ },
379
+ async setAssociations(id, associations, opts) {
380
+ return narrow(await writer.setAssociations(id, associations, { ...opts, ...expect() }), true);
381
+ },
382
+ async editAccess(id, edits, opts) {
383
+ return narrow(await writer.editAccess(id, edits, { ...opts, ...expect() }), true);
384
+ },
385
+ async setAccess(id, permissions, opts) {
386
+ return narrow(await writer.setAccess(id, permissions, { ...opts, ...expect() }), true);
387
+ },
388
+ delete: (id, opts) => writer.delete(id, { ...opts, ...expect() }),
389
+ async undelete(id, opts) {
390
+ return narrow(await writer.undelete(id, { ...opts, ...expect() }), true);
391
+ },
392
+ async restoreVersion(id, version, opts) {
393
+ return narrow(await writer.restoreVersion(id, version, { ...opts, ...expect() }), true);
394
+ },
395
+ };
396
+ };
397
+ //# sourceMappingURL=collection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.js","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Content predicates, evaluated in memory
3
+ * -------------------------------------------------------
4
+ * How a `content` filter value and a `contentPresent` path are matched
5
+ * against one content object: element-wise through arrays, with `null`
6
+ * standing for "no value". MemoryAdapter answers queries with it, and a
7
+ * collection decides a constant a migration added the same way, so a key
8
+ * dropped in core matches exactly what an adapter would have matched. See
9
+ * docs/spec/data-model.md § Nested content paths.
10
+ */
11
+ import type { ContentArm } from './types/index.js';
12
+ /**
13
+ * Every value reachable by walking `segments`, spreading arrays at each
14
+ * step — the walk sqlite-shared runs in SQL, so a filter answers the same
15
+ * against either. Empty means the path reaches nothing, which a `null`
16
+ * filter value matches.
17
+ */
18
+ export declare const valuesAtContentPath: (content: Record<string, unknown>, segments: string[]) => unknown[];
19
+ /**
20
+ * Whether `content` satisfies a `content` and `contentPresent` predicate. A
21
+ * `null` filter value means "field absent or null", not "match nothing":
22
+ * plain `===` would miss an absent field (docs/spec/data-model.md § Filter).
23
+ */
24
+ export declare const matchesContent: (content: Record<string, unknown>, predicate: ContentArm) => boolean;
25
+ //# sourceMappingURL=content-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-match.d.ts","sourceRoot":"","sources":["../src/content-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKnD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,UAAU,MAAM,EAAE,KACjB,OAAO,EAeT,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,UAAU,KAAG,OAYtF,CAAC"}