@haverstack/core 0.40.0 → 0.42.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 (287) hide show
  1. package/README.md +121 -59
  2. package/dist/access.d.ts +34 -36
  3. package/dist/access.d.ts.map +1 -1
  4. package/dist/access.js +65 -42
  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} +7 -0
  9. package/dist/adapter/combine.js.map +1 -0
  10. package/dist/{adapter-entry.d.ts → adapter/index.d.ts} +6 -5
  11. package/dist/adapter/index.d.ts.map +1 -0
  12. package/dist/{adapter-entry.js → adapter/index.js} +5 -4
  13. package/dist/adapter/index.js.map +1 -0
  14. package/dist/{sort.d.ts → adapter/sort.d.ts} +20 -20
  15. package/dist/adapter/sort.d.ts.map +1 -0
  16. package/dist/{sort.js → adapter/sort.js} +37 -27
  17. package/dist/adapter/sort.js.map +1 -0
  18. package/dist/associations/identity.d.ts +93 -0
  19. package/dist/associations/identity.d.ts.map +1 -0
  20. package/dist/associations/identity.js +198 -0
  21. package/dist/associations/identity.js.map +1 -0
  22. package/dist/associations/validation.d.ts +90 -0
  23. package/dist/associations/validation.d.ts.map +1 -0
  24. package/dist/associations/validation.js +339 -0
  25. package/dist/associations/validation.js.map +1 -0
  26. package/dist/attachment-records.d.ts +48 -0
  27. package/dist/attachment-records.d.ts.map +1 -0
  28. package/dist/attachment-records.js +52 -0
  29. package/dist/attachment-records.js.map +1 -0
  30. package/dist/collection.d.ts +182 -0
  31. package/dist/collection.d.ts.map +1 -0
  32. package/dist/collection.js +407 -0
  33. package/dist/collection.js.map +1 -0
  34. package/dist/content-match.d.ts +25 -0
  35. package/dist/content-match.d.ts.map +1 -0
  36. package/dist/content-match.js +51 -0
  37. package/dist/content-match.js.map +1 -0
  38. package/dist/content-translation.d.ts +42 -0
  39. package/dist/content-translation.d.ts.map +1 -0
  40. package/dist/content-translation.js +108 -0
  41. package/dist/content-translation.js.map +1 -0
  42. package/dist/did/did.d.ts.map +1 -0
  43. package/dist/{did.js → did/did.js} +3 -4
  44. package/dist/did/did.js.map +1 -0
  45. package/dist/{did-entry.d.ts → did/index.d.ts} +1 -1
  46. package/dist/did/index.d.ts.map +1 -0
  47. package/dist/{did-entry.js → did/index.js} +3 -3
  48. package/dist/did/index.js.map +1 -0
  49. package/dist/errors.d.ts +36 -63
  50. package/dist/errors.d.ts.map +1 -1
  51. package/dist/errors.js +35 -58
  52. package/dist/errors.js.map +1 -1
  53. package/dist/grants.d.ts +20 -43
  54. package/dist/grants.d.ts.map +1 -1
  55. package/dist/grants.js +71 -134
  56. package/dist/grants.js.map +1 -1
  57. package/dist/id.d.ts +13 -31
  58. package/dist/id.d.ts.map +1 -1
  59. package/dist/id.js +13 -31
  60. package/dist/id.js.map +1 -1
  61. package/dist/index.d.ts +14 -8
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +9 -5
  64. package/dist/index.js.map +1 -1
  65. package/dist/install.d.ts +141 -0
  66. package/dist/install.d.ts.map +1 -0
  67. package/dist/install.js +219 -0
  68. package/dist/install.js.map +1 -0
  69. package/dist/merge.d.ts.map +1 -1
  70. package/dist/merge.js +5 -11
  71. package/dist/merge.js.map +1 -1
  72. package/dist/migration-steps.d.ts +102 -0
  73. package/dist/migration-steps.d.ts.map +1 -0
  74. package/dist/migration-steps.js +293 -0
  75. package/dist/migration-steps.js.map +1 -0
  76. package/dist/query-validation.d.ts +28 -94
  77. package/dist/query-validation.d.ts.map +1 -1
  78. package/dist/query-validation.js +156 -336
  79. package/dist/query-validation.js.map +1 -1
  80. package/dist/record-changes.d.ts +2 -117
  81. package/dist/record-changes.d.ts.map +1 -1
  82. package/dist/record-changes.js +10 -212
  83. package/dist/record-changes.js.map +1 -1
  84. package/dist/schema.d.ts +18 -7
  85. package/dist/schema.d.ts.map +1 -1
  86. package/dist/schema.js +59 -30
  87. package/dist/schema.js.map +1 -1
  88. package/dist/scoped-stack/authority.d.ts +156 -0
  89. package/dist/scoped-stack/authority.d.ts.map +1 -0
  90. package/dist/scoped-stack/authority.js +384 -0
  91. package/dist/scoped-stack/authority.js.map +1 -0
  92. package/dist/scoped-stack/scoped-stack.d.ts +338 -0
  93. package/dist/scoped-stack/scoped-stack.d.ts.map +1 -0
  94. package/dist/scoped-stack/scoped-stack.js +776 -0
  95. package/dist/scoped-stack/scoped-stack.js.map +1 -0
  96. package/dist/scoped-stack/subscription.d.ts +55 -0
  97. package/dist/scoped-stack/subscription.d.ts.map +1 -0
  98. package/dist/scoped-stack/subscription.js +110 -0
  99. package/dist/scoped-stack/subscription.js.map +1 -0
  100. package/dist/stack/attachments.d.ts +24 -0
  101. package/dist/stack/attachments.d.ts.map +1 -0
  102. package/dist/stack/attachments.js +113 -0
  103. package/dist/stack/attachments.js.map +1 -0
  104. package/dist/{changes.d.ts → stack/changes.d.ts} +29 -65
  105. package/dist/stack/changes.d.ts.map +1 -0
  106. package/dist/{changes.js → stack/changes.js} +32 -66
  107. package/dist/stack/changes.js.map +1 -0
  108. package/dist/stack/client.d.ts +271 -0
  109. package/dist/stack/client.d.ts.map +1 -0
  110. package/dist/stack/client.js +9 -0
  111. package/dist/stack/client.js.map +1 -0
  112. package/dist/stack/identity-bindings.d.ts.map +1 -0
  113. package/dist/{identity-bindings.js → stack/identity-bindings.js} +8 -14
  114. package/dist/stack/identity-bindings.js.map +1 -0
  115. package/dist/stack/install-app.d.ts +22 -0
  116. package/dist/stack/install-app.d.ts.map +1 -0
  117. package/dist/stack/install-app.js +260 -0
  118. package/dist/stack/install-app.js.map +1 -0
  119. package/dist/stack/integrity.d.ts +94 -0
  120. package/dist/stack/integrity.d.ts.map +1 -0
  121. package/dist/stack/integrity.js +268 -0
  122. package/dist/stack/integrity.js.map +1 -0
  123. package/dist/{limits.d.ts → stack/limits.d.ts} +2 -5
  124. package/dist/stack/limits.d.ts.map +1 -0
  125. package/dist/{limits.js → stack/limits.js} +3 -6
  126. package/dist/stack/limits.js.map +1 -0
  127. package/dist/stack/migrations.d.ts +59 -0
  128. package/dist/stack/migrations.d.ts.map +1 -0
  129. package/dist/stack/migrations.js +141 -0
  130. package/dist/stack/migrations.js.map +1 -0
  131. package/dist/{stack-reads.d.ts → stack/reads.d.ts} +33 -6
  132. package/dist/stack/reads.d.ts.map +1 -0
  133. package/dist/{stack-reads.js → stack/reads.js} +49 -7
  134. package/dist/stack/reads.js.map +1 -0
  135. package/dist/stack/record-id.d.ts +35 -0
  136. package/dist/stack/record-id.d.ts.map +1 -0
  137. package/dist/stack/record-id.js +82 -0
  138. package/dist/stack/record-id.js.map +1 -0
  139. package/dist/stack/stack.d.ts +438 -0
  140. package/dist/stack/stack.d.ts.map +1 -0
  141. package/dist/stack/stack.js +1366 -0
  142. package/dist/stack/stack.js.map +1 -0
  143. package/dist/stack/system-types.d.ts +16 -0
  144. package/dist/stack/system-types.d.ts.map +1 -0
  145. package/dist/stack/system-types.js +111 -0
  146. package/dist/stack/system-types.js.map +1 -0
  147. package/dist/stack/type-grants.d.ts +20 -0
  148. package/dist/stack/type-grants.d.ts.map +1 -0
  149. package/dist/stack/type-grants.js +69 -0
  150. package/dist/stack/type-grants.js.map +1 -0
  151. package/dist/stack/write-expectation.d.ts +78 -0
  152. package/dist/stack/write-expectation.d.ts.map +1 -0
  153. package/dist/stack/write-expectation.js +71 -0
  154. package/dist/stack/write-expectation.js.map +1 -0
  155. package/dist/testing.d.ts +21 -26
  156. package/dist/testing.d.ts.map +1 -1
  157. package/dist/testing.js +50 -70
  158. package/dist/testing.js.map +1 -1
  159. package/dist/type-handle.d.ts +67 -78
  160. package/dist/type-handle.d.ts.map +1 -1
  161. package/dist/type-handle.js +44 -111
  162. package/dist/type-handle.js.map +1 -1
  163. package/dist/types/adapter.d.ts +223 -0
  164. package/dist/types/adapter.d.ts.map +1 -0
  165. package/dist/types/adapter.js +5 -0
  166. package/dist/types/adapter.js.map +1 -0
  167. package/dist/types/associations.d.ts +156 -0
  168. package/dist/types/associations.d.ts.map +1 -0
  169. package/dist/types/associations.js +13 -0
  170. package/dist/types/associations.js.map +1 -0
  171. package/dist/types/capabilities.d.ts +89 -0
  172. package/dist/types/capabilities.d.ts.map +1 -0
  173. package/dist/types/capabilities.js +5 -0
  174. package/dist/types/capabilities.js.map +1 -0
  175. package/dist/types/events.d.ts +155 -0
  176. package/dist/types/events.d.ts.map +1 -0
  177. package/dist/types/events.js +5 -0
  178. package/dist/types/events.js.map +1 -0
  179. package/dist/types/ids.d.ts +43 -0
  180. package/dist/types/ids.d.ts.map +1 -0
  181. package/dist/types/ids.js +5 -0
  182. package/dist/types/ids.js.map +1 -0
  183. package/dist/types/index.d.ts +19 -0
  184. package/dist/types/index.d.ts.map +1 -0
  185. package/dist/types/index.js +19 -0
  186. package/dist/types/index.js.map +1 -0
  187. package/dist/types/journal.d.ts +47 -0
  188. package/dist/types/journal.d.ts.map +1 -0
  189. package/dist/types/journal.js +5 -0
  190. package/dist/types/journal.js.map +1 -0
  191. package/dist/types/query.d.ts +185 -0
  192. package/dist/types/query.d.ts.map +1 -0
  193. package/dist/types/query.js +10 -0
  194. package/dist/types/query.js.map +1 -0
  195. package/dist/types/records.d.ts +76 -0
  196. package/dist/types/records.d.ts.map +1 -0
  197. package/dist/types/records.js +5 -0
  198. package/dist/types/records.js.map +1 -0
  199. package/dist/types/schema.d.ts +74 -0
  200. package/dist/types/schema.d.ts.map +1 -0
  201. package/dist/types/schema.js +5 -0
  202. package/dist/types/schema.js.map +1 -0
  203. package/dist/types/system.d.ts +161 -0
  204. package/dist/types/system.d.ts.map +1 -0
  205. package/dist/types/system.js +32 -0
  206. package/dist/types/system.js.map +1 -0
  207. package/dist/types/tokens.d.ts +39 -0
  208. package/dist/types/tokens.d.ts.map +1 -0
  209. package/dist/types/tokens.js +5 -0
  210. package/dist/types/tokens.js.map +1 -0
  211. package/dist/validate.d.ts +29 -70
  212. package/dist/validate.d.ts.map +1 -1
  213. package/dist/validate.js +65 -97
  214. package/dist/validate.js.map +1 -1
  215. package/dist/{attachment-download.d.ts → wire/attachment-download.d.ts} +0 -57
  216. package/dist/wire/attachment-download.d.ts.map +1 -0
  217. package/dist/{attachment-download.js → wire/attachment-download.js} +0 -61
  218. package/dist/wire/attachment-download.js.map +1 -0
  219. package/dist/{auth.d.ts → wire/auth.d.ts} +5 -8
  220. package/dist/wire/auth.d.ts.map +1 -0
  221. package/dist/{auth.js → wire/auth.js} +5 -8
  222. package/dist/wire/auth.js.map +1 -0
  223. package/dist/{wire-body.d.ts → wire/body.d.ts} +13 -5
  224. package/dist/wire/body.d.ts.map +1 -0
  225. package/dist/{wire-body.js → wire/body.js} +65 -7
  226. package/dist/wire/body.js.map +1 -0
  227. package/dist/{wire-entry.d.ts → wire/index.d.ts} +12 -12
  228. package/dist/wire/index.d.ts.map +1 -0
  229. package/dist/{wire-entry.js → wire/index.js} +13 -17
  230. package/dist/wire/index.js.map +1 -0
  231. package/dist/{wire-record.d.ts → wire/record.d.ts} +10 -22
  232. package/dist/wire/record.d.ts.map +1 -0
  233. package/dist/{wire-record.js → wire/record.js} +12 -24
  234. package/dist/wire/record.js.map +1 -0
  235. package/dist/{wire-request.d.ts → wire/request.d.ts} +20 -37
  236. package/dist/wire/request.d.ts.map +1 -0
  237. package/dist/{wire-request.js → wire/request.js} +79 -54
  238. package/dist/wire/request.js.map +1 -0
  239. package/package.json +7 -7
  240. package/dist/adapter-entry.d.ts.map +0 -1
  241. package/dist/adapter-entry.js.map +0 -1
  242. package/dist/attachment-download.d.ts.map +0 -1
  243. package/dist/attachment-download.js.map +0 -1
  244. package/dist/auth.d.ts.map +0 -1
  245. package/dist/auth.js.map +0 -1
  246. package/dist/changes.d.ts.map +0 -1
  247. package/dist/changes.js.map +0 -1
  248. package/dist/combine.d.ts.map +0 -1
  249. package/dist/combine.js.map +0 -1
  250. package/dist/did-entry.d.ts.map +0 -1
  251. package/dist/did-entry.js.map +0 -1
  252. package/dist/did.d.ts.map +0 -1
  253. package/dist/did.js.map +0 -1
  254. package/dist/identity-bindings.d.ts.map +0 -1
  255. package/dist/identity-bindings.js.map +0 -1
  256. package/dist/limits.d.ts.map +0 -1
  257. package/dist/limits.js.map +0 -1
  258. package/dist/record-id.d.ts +0 -70
  259. package/dist/record-id.d.ts.map +0 -1
  260. package/dist/record-id.js +0 -127
  261. package/dist/record-id.js.map +0 -1
  262. package/dist/scoped-stack.d.ts +0 -532
  263. package/dist/scoped-stack.d.ts.map +0 -1
  264. package/dist/scoped-stack.js +0 -1219
  265. package/dist/scoped-stack.js.map +0 -1
  266. package/dist/sort.d.ts.map +0 -1
  267. package/dist/sort.js.map +0 -1
  268. package/dist/stack-reads.d.ts.map +0 -1
  269. package/dist/stack-reads.js.map +0 -1
  270. package/dist/stack.d.ts +0 -971
  271. package/dist/stack.d.ts.map +0 -1
  272. package/dist/stack.js +0 -2012
  273. package/dist/stack.js.map +0 -1
  274. package/dist/types.d.ts +0 -1250
  275. package/dist/types.d.ts.map +0 -1
  276. package/dist/types.js +0 -49
  277. package/dist/types.js.map +0 -1
  278. package/dist/wire-body.d.ts.map +0 -1
  279. package/dist/wire-body.js.map +0 -1
  280. package/dist/wire-entry.d.ts.map +0 -1
  281. package/dist/wire-entry.js.map +0 -1
  282. package/dist/wire-record.d.ts.map +0 -1
  283. package/dist/wire-record.js.map +0 -1
  284. package/dist/wire-request.d.ts.map +0 -1
  285. package/dist/wire-request.js.map +0 -1
  286. /package/dist/{did.d.ts → did/did.d.ts} +0 -0
  287. /package/dist/{identity-bindings.d.ts → stack/identity-bindings.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EACV,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,WAAW,EACZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjG,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,YAAY,EAGZ,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,SAAS,EAET,WAAW,EACX,gBAAgB,EAChB,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAM1B;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,GAC3C,MAAM,SAAS,CAAC,GACd,CAAC,GACD,CAAC,GAAG,aAAa,GACnB,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAC5B,aAAa,CAAC,CAAC,CAAC,EAAE,GAClB,CAAC,SAAS,MAAM,GACd;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GACvC,CAAC,CAAC;AAEV;;;GAGG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;KAC3B,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,IAAI;CAClG,CAAC;AAEF,oEAAoE;AACpE,MAAM,WAAW,gBAAgB,CAAC,CAAC,CAAE,SAAQ,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC;IACvE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,QAAQ,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,0BAA0B;IAC1B,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC9B,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;;;;OAKG;IACH,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;CAC9C,CAAC;AAEF;;;;;GAKG;AACH,KAAK,SAAS,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAExC,mFAAmF;AACnF,KAAK,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtC;;;;GAIG;AACH,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACvE,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,EAAE,EAAE,IAAI,CAAC,GAC5B,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAC5B,OAAO,SAAS,CAAC,GACf,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI,MAAM,EAAE,EAAE,IAAI,CAAC,GAC5B,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAC/B,CAAC,SAAS,MAAM,GACd,MAAM,SAAS,MAAM,CAAC,GACpB,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,MAAM,EAAE,EAAE,IAAI,CAAC,GACpC,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAClD,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEf,gFAAgF;AAChF,KAAK,UAAU,CAAC,CAAC,EAAE,MAAM,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAC7E,CAAC,GAAG,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,GAC5B;KACG,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;CACzE,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAExB;;;;GAIG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEvD,2EAA2E;AAC3E,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,MAAM,SAAS,MAAM,CAAC,GACnD,MAAM,GACN;KACG,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,CAAC,GAAG,KAAK;CACxF,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;AAExB;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC,GAAG;IACnF,MAAM,CAAC,EAAE,IAAI,CACX,YAAY,EACZ,QAAQ,GAAG,QAAQ,GAAG,gBAAgB,GAAG,SAAS,GAAG,gBAAgB,GAAG,eAAe,CACxF,GAAG;QACF,OAAO,CAAC,EAAE;aAAG,CAAC,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;SAAE,CAAC;QAChE,cAAc,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;KACrC,CAAC;IACF,IAAI,CAAC,EACD;QAAE,KAAK,EAAE,eAAe,CAAC;QAAC,YAAY,CAAC,EAAE,KAAK,CAAC;QAAC,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,GAC5E;QACE,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;QACjC,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;KAC5B,CAAC;CACP,CAAC;AAEF,wFAAwF;AACxF,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,GAAG;IAC1E,MAAM,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC;CAClD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG;IAC/D,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,GAAG;IAC3E,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;CAChC,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,+EAA+E;IAC/E,GAAG,CAAC,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvD,KAAK,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,SAAS,CACP,OAAO,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,IAAI,EAC9C,IAAI,CAAC,EAAE,0BAA0B,GAChC,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,CACJ,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAC/B,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,YAAY,CACV,EAAE,EAAE,QAAQ,EACZ,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EACtB,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,iBAAiB,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,oBAAoB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9F,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxE,QAAQ,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,cAAc,CACZ,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;CACjC;AAED;;;;;GAKG;AACH,qBAAa,WAAY,SAAQ,KAAK;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;gBAEjB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,UAAQ;CAShE;AAuED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,SAAS,kBAAkB,EAC3D,QAAQ,WAAW,EACnB,UAAU,iBAAiB,EAC3B,QAAQ,UAAU,CAAC,CAAC,CAAC,EACrB,WAAW,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,KACpC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CA8VzB,CAAC"}
@@ -0,0 +1,407 @@
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 migrateThenMutate = async (stored, changes, 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.mutate(stored.id, changes, {
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
+ // A version past the adapter's cap is narrowed, newest kept first:
205
+ // the older a version, the fewer apps still write it.
206
+ const filterCap = predicate === undefined
207
+ ? Infinity
208
+ : capabilities.filter.content === 'none'
209
+ ? 0
210
+ : capabilities.filter.contentByType;
211
+ const sortCap = sortField === undefined ? Infinity : capabilities.sort.contentFieldByType;
212
+ const cap = Math.min(filterCap, sortCap);
213
+ const sortKind = (() => {
214
+ const def = sortField === undefined ? undefined : handle.schema[sortField];
215
+ return def && def.kind !== 'array' && def.kind !== 'object' ? def.kind : undefined;
216
+ })();
217
+ const family = (pinned
218
+ ? pinned.map((id) => ({ id, baseId: handle.baseId, version: versionOf(id) }))
219
+ : await listTypes())
220
+ .filter((type) => type.baseId === handle.baseId && type.version !== handleVersion)
221
+ .sort((a, b) => b.version - a.version);
222
+ const arms = { [handle.id]: predicate ?? {} };
223
+ const keys = sortField
224
+ ? { [handle.id]: { field: sortField } }
225
+ : {};
226
+ const narrowed = [];
227
+ const newer = [];
228
+ const residuals = [];
229
+ for (const type of family) {
230
+ if (type.version > handleVersion) {
231
+ newer.push(type.id);
232
+ continue;
233
+ }
234
+ const origins = registry.origins(type.id, handle.id);
235
+ const translated = !predicate
236
+ ? { arm: {}, residuals: [] }
237
+ : origins
238
+ ? translateArm(origins, predicate)
239
+ : UNTRANSLATABLE;
240
+ if (translated === UNMATCHABLE)
241
+ continue;
242
+ const key = sortField === undefined
243
+ ? undefined
244
+ : origins
245
+ ? translateSortKey(origins, sortField, sortKind)
246
+ : UNTRANSLATABLE;
247
+ if (translated === UNTRANSLATABLE ||
248
+ key === UNTRANSLATABLE ||
249
+ Object.keys(arms).length >= cap) {
250
+ narrowed.push(type.id);
251
+ continue;
252
+ }
253
+ arms[type.id] = translated.arm;
254
+ if (key)
255
+ keys[type.id] = key;
256
+ for (const arm of translated.residuals)
257
+ residuals.push({ ...arm, typeId: type.id });
258
+ }
259
+ const rest = withoutContent(filter);
260
+ const typeIds = Object.keys(arms);
261
+ if (typeIds.length === 1) {
262
+ return {
263
+ query: { filter: { ...filter, typeId: handle.id }, sort },
264
+ versions: typeIds,
265
+ narrowed,
266
+ newer,
267
+ residuals,
268
+ };
269
+ }
270
+ return {
271
+ query: {
272
+ filter: predicate ? { ...rest, contentByType: arms } : { ...rest, typeId: typeIds },
273
+ sort: sortField
274
+ ? { contentFieldByType: keys, ...(sort?.direction && { direction: sort.direction }) }
275
+ : sort,
276
+ },
277
+ versions: typeIds,
278
+ narrowed,
279
+ newer,
280
+ residuals,
281
+ };
282
+ };
283
+ const mutate = async (id, changes, opts = {}) => {
284
+ try {
285
+ const written = await writer.mutate(id, changes, {
286
+ ...opts,
287
+ ...expect({ ...family, typeId: handle.id }),
288
+ });
289
+ return narrow(written, true);
290
+ }
291
+ catch (err) {
292
+ if (!(err instanceof StoredVersionError))
293
+ throw err;
294
+ return migrateThenMutate(err.record, changes, opts);
295
+ }
296
+ };
297
+ return {
298
+ async get(id) {
299
+ const record = await client.get(id);
300
+ if (!record || baseIdOf(record.typeId) !== handle.baseId)
301
+ return null;
302
+ return narrow(record, false);
303
+ },
304
+ async query(query = {}) {
305
+ if (query.filter?.includeDeleted) {
306
+ throw new StackBadRequestError('A collection reads live records only; use the untyped query() to include soft-deleted records.');
307
+ }
308
+ // Stripped as well as untyped: either would change which records a
309
+ // page holds, or the shape they arrive in.
310
+ const { presentAt: _presentAt, filter, ...rest } = query;
311
+ // A concrete typeId needs no family lookup; baseId does.
312
+ const { baseId: _baseId, contentByType: _byType, ...unversioned } = withoutTypeId(filter);
313
+ const firstPage = rest.cursor === undefined;
314
+ let records;
315
+ let cursor;
316
+ let skipped;
317
+ if (!contentPredicate(unversioned) && rest.sort?.contentField === undefined) {
318
+ ({ records, cursor } = await client.query({
319
+ ...rest,
320
+ filter: { ...unversioned, baseId: handle.baseId },
321
+ }));
322
+ if (firstPage)
323
+ skipped = { older: false, newer: false };
324
+ }
325
+ else {
326
+ const resumed = firstPage ? undefined : decodeContentCursor(rest.cursor, handle);
327
+ const plan = await planContentQuery(unversioned, rest.sort, resumed?.versions);
328
+ const [page, narrowed, residual, newer] = await Promise.all([
329
+ client.query({ ...rest, cursor: resumed?.cursor, ...plan.query }),
330
+ firstPage && anyAt(plan.narrowed, unversioned),
331
+ firstPage && anyResidual(plan.residuals, unversioned),
332
+ firstPage && anyAt(plan.newer, unversioned),
333
+ ]);
334
+ records = page.records;
335
+ cursor = page.cursor && encodeContentCursor(plan.versions, page.cursor);
336
+ if (firstPage)
337
+ skipped = { older: narrowed || residual, newer };
338
+ }
339
+ const page = {
340
+ records: [],
341
+ misfits: [],
342
+ cursor,
343
+ ...(skipped && { skipped }),
344
+ };
345
+ for (const stored of records) {
346
+ const result = classify(stored);
347
+ if ('misfit' in result)
348
+ page.misfits.push(result.misfit);
349
+ else
350
+ page.records.push(result.record);
351
+ }
352
+ return page;
353
+ },
354
+ subscribe(handler, opts = {}) {
355
+ return client.subscribe((change) => {
356
+ const { record, ...rest } = change;
357
+ // A tombstone's content is `{}` under ScopedStack, so it is never
358
+ // typed as the handle's content on either surface. A record that
359
+ // migrated out of the family matches by its previous typeId.
360
+ if (!record || record.deletedAt || baseIdOf(record.typeId) !== handle.baseId) {
361
+ return handler(rest);
362
+ }
363
+ let result;
364
+ try {
365
+ result = classify(record);
366
+ }
367
+ catch {
368
+ // A missing or failing migration: delivered as wherever the
369
+ // emitter cannot supply the record, and get() says why.
370
+ return handler(rest);
371
+ }
372
+ handler({ ...rest, ...result });
373
+ }, { ...opts, filter: { ...withoutTypeId(opts.filter), baseId: handle.baseId } });
374
+ },
375
+ async create(content, opts) {
376
+ return (await client.create(handle.id, content, opts));
377
+ },
378
+ mutate: (id, changes, opts) => mutate(id, changes, opts),
379
+ patchContent: (id, patch, opts) => mutate(id, { contentPatch: patch }, opts),
380
+ async associate(id, associations) {
381
+ return narrow(await writer.associate(id, associations, expect()), true);
382
+ },
383
+ async dissociate(id, associations) {
384
+ return narrow(await writer.dissociate(id, associations, expect()), true);
385
+ },
386
+ async amendAssociations(id, changes) {
387
+ return narrow(await writer.amendAssociations(id, changes, expect()), true);
388
+ },
389
+ async grantAccess(id, permissions) {
390
+ return narrow(await writer.grantAccess(id, permissions, expect()), true);
391
+ },
392
+ async revokeAccess(id, permissions) {
393
+ return narrow(await writer.revokeAccess(id, permissions, expect()), true);
394
+ },
395
+ async amendAccess(id, changes) {
396
+ return narrow(await writer.amendAccess(id, changes, expect()), true);
397
+ },
398
+ delete: (id, opts) => writer.delete(id, { ...opts, ...expect() }),
399
+ async undelete(id, opts) {
400
+ return narrow(await writer.undelete(id, { ...opts, ...expect() }), true);
401
+ },
402
+ async restoreVersion(id, version, opts) {
403
+ return narrow(await writer.restoreVersion(id, version, { ...opts, ...expect() }), true);
404
+ },
405
+ };
406
+ };
407
+ //# 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 — sqlite-shared's contentPathExists() walk, so a filter answers the
15
+ * same 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"}
@@ -0,0 +1,51 @@
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 { parseContentFilterKey } from './query-validation.js';
12
+ /** An array stands for its elements; anything else stands for itself. */
13
+ const spreadValue = (value) => (Array.isArray(value) ? value : [value]);
14
+ /**
15
+ * Every value reachable by walking `segments`, spreading arrays at each
16
+ * step — sqlite-shared's contentPathExists() walk, so a filter answers the
17
+ * same against either. Empty means the path reaches nothing, which a `null`
18
+ * filter value matches.
19
+ */
20
+ export const valuesAtContentPath = (content, segments) => {
21
+ let current = [content];
22
+ for (const segment of segments) {
23
+ const next = [];
24
+ for (const value of current) {
25
+ for (const item of spreadValue(value)) {
26
+ if (typeof item !== 'object' || item === null || Array.isArray(item))
27
+ continue;
28
+ if (Object.hasOwn(item, segment))
29
+ next.push(item[segment]);
30
+ }
31
+ }
32
+ current = next;
33
+ }
34
+ // The leaf spreads too, so a filter on `tags` matches a record whose
35
+ // `tags` array contains the value.
36
+ return current.flatMap(spreadValue);
37
+ };
38
+ /**
39
+ * Whether `content` satisfies a `content` and `contentPresent` predicate. A
40
+ * `null` filter value means "field absent or null", not "match nothing":
41
+ * plain `===` would miss an absent field (docs/spec/data-model.md § Filter).
42
+ */
43
+ export const matchesContent = (content, predicate) => Object.entries(predicate.content ?? {}).every(([key, value]) => {
44
+ const found = valuesAtContentPath(content, parseContentFilterKey(key));
45
+ if (value === null || value === undefined) {
46
+ return found.length === 0 || found.some((v) => v === null || v === undefined);
47
+ }
48
+ return found.some((v) => v === value);
49
+ }) &&
50
+ (predicate.contentPresent ?? []).every((key) => valuesAtContentPath(content, parseContentFilterKey(key)).some((v) => v !== null && v !== undefined));
51
+ //# sourceMappingURL=content-match.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-match.js","sourceRoot":"","sources":["../src/content-match.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,yEAAyE;AACzE,MAAM,WAAW,GAAG,CAAC,KAAc,EAAa,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAE5F;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAAgC,EAChC,QAAkB,EACP,EAAE;IACb,IAAI,OAAO,GAAc,CAAC,OAAO,CAAC,CAAC;IACnC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAc,EAAE,CAAC;QAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC/E,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAE,IAAgC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1F,CAAC;QACH,CAAC;QACD,OAAO,GAAG,IAAI,CAAC;IACjB,CAAC;IACD,qEAAqE;IACrE,mCAAmC;IACnC,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAgC,EAAE,SAAqB,EAAW,EAAE,CACjG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;IAC7D,MAAM,KAAK,GAAG,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;AACxC,CAAC,CAAC;IACF,CAAC,SAAS,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAC7C,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CACrC,CACF,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Content queries across versions
3
+ * -------------------------------------------------------
4
+ * A collection's content filter and sort are written in its handle's
5
+ * shape, and an adapter matches content as stored. These functions rewrite
6
+ * one predicate or sort field into an older version's shape, through the
7
+ * field origins a migration chain declares, or say why they cannot: an arm
8
+ * no record at that version can match is dropped, and one that does not
9
+ * translate is narrowed. See docs/spec/data-model.md § Content queries
10
+ * across versions.
11
+ */
12
+ import type { FieldOrigins } from './migration-steps.js';
13
+ import type { ContentArm, ContentSortKey, ScalarFieldKind } from './types/index.js';
14
+ /** No record at the version can match, so its arm is dropped without a skip. */
15
+ export declare const UNMATCHABLE = "unmatchable";
16
+ /** The version is narrowed: left out of the query, and reported if it matches the rest. */
17
+ export declare const UNTRANSLATABLE = "untranslatable";
18
+ type Untranslated = typeof UNMATCHABLE | typeof UNTRANSLATABLE;
19
+ /**
20
+ * An older version's arm, and the arms it leaves out: when two older
21
+ * values map to the one a key asks for, the arm asks for the first and
22
+ * each other one becomes a residual, which the first page probes for
23
+ * `skipped.older` rather than narrowing the version outright.
24
+ */
25
+ export type TranslatedArm = {
26
+ arm: ContentArm;
27
+ residuals: ContentArm[];
28
+ };
29
+ /**
30
+ * `predicate`, written in the handle's shape, as the arm for the version
31
+ * `origins` describes. A key is translated by its top-level field: the
32
+ * rest of its path is kept, since steps reach top-level fields only.
33
+ */
34
+ export declare const translateArm: (origins: FieldOrigins, predicate: ContentArm) => TranslatedArm | Untranslated;
35
+ /**
36
+ * What a record at the version `origins` describes orders by, for a sort
37
+ * on the handle's `field` of `kind`. A remapped field is narrowed, since
38
+ * remapped values don't keep their order.
39
+ */
40
+ export declare const translateSortKey: (origins: FieldOrigins, field: string, kind: ScalarFieldKind | undefined) => ContentSortKey | typeof UNTRANSLATABLE;
41
+ export {};
42
+ //# sourceMappingURL=content-translation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-translation.d.ts","sourceRoot":"","sources":["../src/content-translation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEpF,gFAAgF;AAChF,eAAO,MAAM,WAAW,gBAAgB,CAAC;AACzC,2FAA2F;AAC3F,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C,KAAK,YAAY,GAAG,OAAO,WAAW,GAAG,OAAO,cAAc,CAAC;AAwB/D;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG;IAAE,GAAG,EAAE,UAAU,CAAC;IAAC,SAAS,EAAE,UAAU,EAAE,CAAA;CAAE,CAAC;AAEzE;;;;GAIG;AACH,eAAO,MAAM,YAAY,GACvB,SAAS,YAAY,EACrB,WAAW,UAAU,KACpB,aAAa,GAAG,YAmDlB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,SAAS,YAAY,EACrB,OAAO,MAAM,EACb,MAAM,eAAe,GAAG,SAAS,KAChC,cAAc,GAAG,OAAO,cAM1B,CAAC"}