@earendil-works/chord 1.4.0 → 1.5.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 (820) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/README.md +79 -14
  3. package/dist/cell.d.ts +7 -7
  4. package/dist/cell.d.ts.map +1 -1
  5. package/dist/cell.js.map +1 -1
  6. package/dist/context/index.d.ts +1 -1
  7. package/dist/context/index.d.ts.map +1 -1
  8. package/dist/context/index.js +1 -1
  9. package/dist/context/index.js.map +1 -1
  10. package/dist/contract.d.ts +51 -52
  11. package/dist/contract.d.ts.map +1 -1
  12. package/dist/contract.js +19 -24
  13. package/dist/contract.js.map +1 -1
  14. package/dist/delta/apply-immutable-trusted.js +3 -4
  15. package/dist/delta/apply-immutable-trusted.js.map +1 -1
  16. package/dist/delta/diff.d.ts.map +1 -1
  17. package/dist/delta/diff.js +5 -3
  18. package/dist/delta/diff.js.map +1 -1
  19. package/dist/delta/index.d.ts +9 -1
  20. package/dist/delta/index.d.ts.map +1 -1
  21. package/dist/delta/index.js +15 -11
  22. package/dist/delta/index.js.map +1 -1
  23. package/dist/delta/pending.d.ts +36 -0
  24. package/dist/delta/pending.d.ts.map +1 -0
  25. package/dist/delta/pending.js +143 -0
  26. package/dist/delta/pending.js.map +1 -0
  27. package/dist/delta/tracker.d.ts +12 -0
  28. package/dist/delta/tracker.d.ts.map +1 -1
  29. package/dist/delta/tracker.js +109 -39
  30. package/dist/delta/tracker.js.map +1 -1
  31. package/dist/host.d.ts.map +1 -1
  32. package/dist/host.js +9 -7
  33. package/dist/host.js.map +1 -1
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +1 -0
  37. package/dist/index.js.map +1 -1
  38. package/dist/next/contracts/accepts.d.ts +81 -0
  39. package/dist/next/contracts/accepts.d.ts.map +1 -0
  40. package/dist/next/contracts/accepts.js +123 -0
  41. package/dist/next/contracts/accepts.js.map +1 -0
  42. package/dist/next/contracts/contract.d.ts +121 -0
  43. package/dist/next/contracts/contract.d.ts.map +1 -0
  44. package/dist/next/contracts/contract.js +50 -0
  45. package/dist/next/contracts/contract.js.map +1 -0
  46. package/dist/next/contracts/declare.d.ts +107 -0
  47. package/dist/next/contracts/declare.d.ts.map +1 -0
  48. package/dist/next/contracts/declare.js +136 -0
  49. package/dist/next/contracts/declare.js.map +1 -0
  50. package/dist/next/contracts/evolve.d.ts +92 -0
  51. package/dist/next/contracts/evolve.d.ts.map +1 -0
  52. package/dist/next/contracts/evolve.js +179 -0
  53. package/dist/next/contracts/evolve.js.map +1 -0
  54. package/dist/next/contracts/fingerprint.d.ts +16 -0
  55. package/dist/next/contracts/fingerprint.d.ts.map +1 -0
  56. package/dist/next/contracts/fingerprint.js +50 -0
  57. package/dist/next/contracts/fingerprint.js.map +1 -0
  58. package/dist/next/contracts/history.d.ts +71 -0
  59. package/dist/next/contracts/history.d.ts.map +1 -0
  60. package/dist/next/contracts/history.js +3 -0
  61. package/dist/next/contracts/history.js.map +1 -0
  62. package/dist/next/contracts/host-kind.d.ts +40 -0
  63. package/dist/next/contracts/host-kind.d.ts.map +1 -0
  64. package/dist/next/contracts/host-kind.js +37 -0
  65. package/dist/next/contracts/host-kind.js.map +1 -0
  66. package/dist/next/contracts/index.d.ts +7 -0
  67. package/dist/next/contracts/index.d.ts.map +1 -0
  68. package/dist/next/contracts/index.js +6 -0
  69. package/dist/next/contracts/index.js.map +1 -0
  70. package/dist/next/contracts/internal.d.ts +10 -0
  71. package/dist/next/contracts/internal.d.ts.map +1 -0
  72. package/dist/next/contracts/internal.js +9 -0
  73. package/dist/next/contracts/internal.js.map +1 -0
  74. package/dist/next/contracts/names.d.ts +3 -0
  75. package/dist/next/contracts/names.d.ts.map +1 -0
  76. package/dist/next/contracts/names.js +13 -0
  77. package/dist/next/contracts/names.js.map +1 -0
  78. package/dist/next/contracts/params.d.ts +28 -0
  79. package/dist/next/contracts/params.d.ts.map +1 -0
  80. package/dist/next/contracts/params.js +50 -0
  81. package/dist/next/contracts/params.js.map +1 -0
  82. package/dist/next/contracts/schema.d.ts +102 -0
  83. package/dist/next/contracts/schema.d.ts.map +1 -0
  84. package/dist/next/contracts/schema.js +103 -0
  85. package/dist/next/contracts/schema.js.map +1 -0
  86. package/dist/next/contracts/snapshot.d.ts +16 -0
  87. package/dist/next/contracts/snapshot.d.ts.map +1 -0
  88. package/dist/next/contracts/snapshot.js +167 -0
  89. package/dist/next/contracts/snapshot.js.map +1 -0
  90. package/dist/next/data/args.d.ts +50 -0
  91. package/dist/next/data/args.d.ts.map +1 -0
  92. package/dist/next/data/args.js +83 -0
  93. package/dist/next/data/args.js.map +1 -0
  94. package/dist/next/data/errors.d.ts +73 -0
  95. package/dist/next/data/errors.d.ts.map +1 -0
  96. package/dist/next/data/errors.js +107 -0
  97. package/dist/next/data/errors.js.map +1 -0
  98. package/dist/next/data/failure.d.ts +26 -0
  99. package/dist/next/data/failure.d.ts.map +1 -0
  100. package/dist/next/data/failure.js +72 -0
  101. package/dist/next/data/failure.js.map +1 -0
  102. package/dist/next/data/index.d.ts +4 -0
  103. package/dist/next/data/index.d.ts.map +1 -0
  104. package/dist/next/data/index.js +4 -0
  105. package/dist/next/data/index.js.map +1 -0
  106. package/dist/next/data/internal.d.ts +7 -0
  107. package/dist/next/data/internal.d.ts.map +1 -0
  108. package/dist/next/data/internal.js +8 -0
  109. package/dist/next/data/internal.js.map +1 -0
  110. package/dist/next/data/params.d.ts +20 -0
  111. package/dist/next/data/params.d.ts.map +1 -0
  112. package/dist/next/data/params.js +31 -0
  113. package/dist/next/data/params.js.map +1 -0
  114. package/dist/next/data/principal.d.ts +17 -0
  115. package/dist/next/data/principal.d.ts.map +1 -0
  116. package/dist/next/data/principal.js +41 -0
  117. package/dist/next/data/principal.js.map +1 -0
  118. package/dist/next/data/validator.d.ts +12 -0
  119. package/dist/next/data/validator.d.ts.map +1 -0
  120. package/dist/next/data/validator.js +34 -0
  121. package/dist/next/data/validator.js.map +1 -0
  122. package/dist/next/documents/address-source.d.ts +20 -0
  123. package/dist/next/documents/address-source.d.ts.map +1 -0
  124. package/dist/next/documents/address-source.js +44 -0
  125. package/dist/next/documents/address-source.js.map +1 -0
  126. package/dist/next/documents/definition.d.ts +84 -0
  127. package/dist/next/documents/definition.d.ts.map +1 -0
  128. package/dist/next/documents/definition.js +73 -0
  129. package/dist/next/documents/definition.js.map +1 -0
  130. package/dist/next/documents/documents.d.ts +106 -0
  131. package/dist/next/documents/documents.d.ts.map +1 -0
  132. package/dist/next/documents/documents.js +224 -0
  133. package/dist/next/documents/documents.js.map +1 -0
  134. package/dist/next/documents/fence.d.ts +9 -0
  135. package/dist/next/documents/fence.d.ts.map +1 -0
  136. package/dist/next/documents/fence.js +15 -0
  137. package/dist/next/documents/fence.js.map +1 -0
  138. package/dist/next/documents/handles.d.ts +76 -0
  139. package/dist/next/documents/handles.d.ts.map +1 -0
  140. package/dist/next/documents/handles.js +66 -0
  141. package/dist/next/documents/handles.js.map +1 -0
  142. package/dist/next/documents/index.d.ts +4 -0
  143. package/dist/next/documents/index.d.ts.map +1 -0
  144. package/dist/next/documents/index.js +3 -0
  145. package/dist/next/documents/index.js.map +1 -0
  146. package/dist/next/documents/internal.d.ts +9 -0
  147. package/dist/next/documents/internal.d.ts.map +1 -0
  148. package/dist/next/documents/internal.js +9 -0
  149. package/dist/next/documents/internal.js.map +1 -0
  150. package/dist/next/documents/keyed-slot.d.ts +103 -0
  151. package/dist/next/documents/keyed-slot.d.ts.map +1 -0
  152. package/dist/next/documents/keyed-slot.js +395 -0
  153. package/dist/next/documents/keyed-slot.js.map +1 -0
  154. package/dist/next/documents/line.d.ts +7 -0
  155. package/dist/next/documents/line.d.ts.map +1 -0
  156. package/dist/next/documents/line.js +14 -0
  157. package/dist/next/documents/line.js.map +1 -0
  158. package/dist/next/documents/persistence.d.ts +104 -0
  159. package/dist/next/documents/persistence.d.ts.map +1 -0
  160. package/dist/next/documents/persistence.js +128 -0
  161. package/dist/next/documents/persistence.js.map +1 -0
  162. package/dist/next/documents/residency.d.ts +31 -0
  163. package/dist/next/documents/residency.d.ts.map +1 -0
  164. package/dist/next/documents/residency.js +93 -0
  165. package/dist/next/documents/residency.js.map +1 -0
  166. package/dist/next/documents/slot.d.ts +109 -0
  167. package/dist/next/documents/slot.d.ts.map +1 -0
  168. package/dist/next/documents/slot.js +181 -0
  169. package/dist/next/documents/slot.js.map +1 -0
  170. package/dist/next/documents/transaction.d.ts +133 -0
  171. package/dist/next/documents/transaction.d.ts.map +1 -0
  172. package/dist/next/documents/transaction.js +409 -0
  173. package/dist/next/documents/transaction.js.map +1 -0
  174. package/dist/next/host/activity.d.ts +31 -0
  175. package/dist/next/host/activity.d.ts.map +1 -0
  176. package/dist/next/host/activity.js +40 -0
  177. package/dist/next/host/activity.js.map +1 -0
  178. package/dist/next/host/adapted.d.ts +49 -0
  179. package/dist/next/host/adapted.d.ts.map +1 -0
  180. package/dist/next/host/adapted.js +214 -0
  181. package/dist/next/host/adapted.js.map +1 -0
  182. package/dist/next/host/attempt.d.ts +278 -0
  183. package/dist/next/host/attempt.d.ts.map +1 -0
  184. package/dist/next/host/attempt.js +1072 -0
  185. package/dist/next/host/attempt.js.map +1 -0
  186. package/dist/next/host/backoff.d.ts +29 -0
  187. package/dist/next/host/backoff.d.ts.map +1 -0
  188. package/dist/next/host/backoff.js +69 -0
  189. package/dist/next/host/backoff.js.map +1 -0
  190. package/dist/next/host/ctx.d.ts +47 -0
  191. package/dist/next/host/ctx.d.ts.map +1 -0
  192. package/dist/next/host/ctx.js +108 -0
  193. package/dist/next/host/ctx.js.map +1 -0
  194. package/dist/next/host/deadline.d.ts +12 -0
  195. package/dist/next/host/deadline.d.ts.map +1 -0
  196. package/dist/next/host/deadline.js +40 -0
  197. package/dist/next/host/deadline.js.map +1 -0
  198. package/dist/next/host/dependencies.d.ts +65 -0
  199. package/dist/next/host/dependencies.d.ts.map +1 -0
  200. package/dist/next/host/dependencies.js +115 -0
  201. package/dist/next/host/dependencies.js.map +1 -0
  202. package/dist/next/host/destination.d.ts +48 -0
  203. package/dist/next/host/destination.d.ts.map +1 -0
  204. package/dist/next/host/destination.js +101 -0
  205. package/dist/next/host/destination.js.map +1 -0
  206. package/dist/next/host/facet.d.ts +79 -0
  207. package/dist/next/host/facet.d.ts.map +1 -0
  208. package/dist/next/host/facet.js +55 -0
  209. package/dist/next/host/facet.js.map +1 -0
  210. package/dist/next/host/follow.d.ts +52 -0
  211. package/dist/next/host/follow.d.ts.map +1 -0
  212. package/dist/next/host/follow.js +207 -0
  213. package/dist/next/host/follow.js.map +1 -0
  214. package/dist/next/host/host.d.ts +495 -0
  215. package/dist/next/host/host.d.ts.map +1 -0
  216. package/dist/next/host/host.js +1075 -0
  217. package/dist/next/host/host.js.map +1 -0
  218. package/dist/next/host/index.d.ts +17 -0
  219. package/dist/next/host/index.d.ts.map +1 -0
  220. package/dist/next/host/index.js +6 -0
  221. package/dist/next/host/index.js.map +1 -0
  222. package/dist/next/host/internal.d.ts +10 -0
  223. package/dist/next/host/internal.d.ts.map +1 -0
  224. package/dist/next/host/internal.js +8 -0
  225. package/dist/next/host/internal.js.map +1 -0
  226. package/dist/next/host/members.d.ts +50 -0
  227. package/dist/next/host/members.d.ts.map +1 -0
  228. package/dist/next/host/members.js +107 -0
  229. package/dist/next/host/members.js.map +1 -0
  230. package/dist/next/host/native.d.ts +55 -0
  231. package/dist/next/host/native.d.ts.map +1 -0
  232. package/dist/next/host/native.js +92 -0
  233. package/dist/next/host/native.js.map +1 -0
  234. package/dist/next/host/object.d.ts +290 -0
  235. package/dist/next/host/object.d.ts.map +1 -0
  236. package/dist/next/host/object.js +1127 -0
  237. package/dist/next/host/object.js.map +1 -0
  238. package/dist/next/host/parked.d.ts +23 -0
  239. package/dist/next/host/parked.d.ts.map +1 -0
  240. package/dist/next/host/parked.js +79 -0
  241. package/dist/next/host/parked.js.map +1 -0
  242. package/dist/next/host/presence.d.ts +34 -0
  243. package/dist/next/host/presence.d.ts.map +1 -0
  244. package/dist/next/host/presence.js +117 -0
  245. package/dist/next/host/presence.js.map +1 -0
  246. package/dist/next/host/ref-state.d.ts +53 -0
  247. package/dist/next/host/ref-state.d.ts.map +1 -0
  248. package/dist/next/host/ref-state.js +83 -0
  249. package/dist/next/host/ref-state.js.map +1 -0
  250. package/dist/next/host/reference-keys.d.ts +36 -0
  251. package/dist/next/host/reference-keys.d.ts.map +1 -0
  252. package/dist/next/host/reference-keys.js +168 -0
  253. package/dist/next/host/reference-keys.js.map +1 -0
  254. package/dist/next/host/reference-source.d.ts +65 -0
  255. package/dist/next/host/reference-source.d.ts.map +1 -0
  256. package/dist/next/host/reference-source.js +285 -0
  257. package/dist/next/host/reference-source.js.map +1 -0
  258. package/dist/next/host/reference.d.ts +308 -0
  259. package/dist/next/host/reference.d.ts.map +1 -0
  260. package/dist/next/host/reference.js +775 -0
  261. package/dist/next/host/reference.js.map +1 -0
  262. package/dist/next/host/retry-on.d.ts +28 -0
  263. package/dist/next/host/retry-on.d.ts.map +1 -0
  264. package/dist/next/host/retry-on.js +52 -0
  265. package/dist/next/host/retry-on.js.map +1 -0
  266. package/dist/next/host/revocation.d.ts +16 -0
  267. package/dist/next/host/revocation.d.ts.map +1 -0
  268. package/dist/next/host/revocation.js +27 -0
  269. package/dist/next/host/revocation.js.map +1 -0
  270. package/dist/next/host/root.d.ts +27 -0
  271. package/dist/next/host/root.d.ts.map +1 -0
  272. package/dist/next/host/root.js +68 -0
  273. package/dist/next/host/root.js.map +1 -0
  274. package/dist/next/host/route.d.ts +64 -0
  275. package/dist/next/host/route.d.ts.map +1 -0
  276. package/dist/next/host/route.js +190 -0
  277. package/dist/next/host/route.js.map +1 -0
  278. package/dist/next/host/routines.d.ts +76 -0
  279. package/dist/next/host/routines.d.ts.map +1 -0
  280. package/dist/next/host/routines.js +350 -0
  281. package/dist/next/host/routines.js.map +1 -0
  282. package/dist/next/host/sleep.d.ts +9 -0
  283. package/dist/next/host/sleep.d.ts.map +1 -0
  284. package/dist/next/host/sleep.js +40 -0
  285. package/dist/next/host/sleep.js.map +1 -0
  286. package/dist/next/host/staging.d.ts +94 -0
  287. package/dist/next/host/staging.d.ts.map +1 -0
  288. package/dist/next/host/staging.js +302 -0
  289. package/dist/next/host/staging.js.map +1 -0
  290. package/dist/next/host/unbound.d.ts +30 -0
  291. package/dist/next/host/unbound.d.ts.map +1 -0
  292. package/dist/next/host/unbound.js +67 -0
  293. package/dist/next/host/unbound.js.map +1 -0
  294. package/dist/next/host/uuid.d.ts +3 -0
  295. package/dist/next/host/uuid.d.ts.map +1 -0
  296. package/dist/next/host/uuid.js +38 -0
  297. package/dist/next/host/uuid.js.map +1 -0
  298. package/dist/next/index.d.ts +28 -0
  299. package/dist/next/index.d.ts.map +1 -0
  300. package/dist/next/index.js +18 -0
  301. package/dist/next/index.js.map +1 -0
  302. package/dist/next/jobs/definition.d.ts +96 -0
  303. package/dist/next/jobs/definition.d.ts.map +1 -0
  304. package/dist/next/jobs/definition.js +83 -0
  305. package/dist/next/jobs/definition.js.map +1 -0
  306. package/dist/next/jobs/index.d.ts +5 -0
  307. package/dist/next/jobs/index.d.ts.map +1 -0
  308. package/dist/next/jobs/index.js +3 -0
  309. package/dist/next/jobs/index.js.map +1 -0
  310. package/dist/next/jobs/internal.d.ts +3 -0
  311. package/dist/next/jobs/internal.d.ts.map +1 -0
  312. package/dist/next/jobs/internal.js +4 -0
  313. package/dist/next/jobs/internal.js.map +1 -0
  314. package/dist/next/jobs/job.d.ts +152 -0
  315. package/dist/next/jobs/job.d.ts.map +1 -0
  316. package/dist/next/jobs/job.js +320 -0
  317. package/dist/next/jobs/job.js.map +1 -0
  318. package/dist/next/jobs/persisted.d.ts +38 -0
  319. package/dist/next/jobs/persisted.d.ts.map +1 -0
  320. package/dist/next/jobs/persisted.js +95 -0
  321. package/dist/next/jobs/persisted.js.map +1 -0
  322. package/dist/next/jobs/records.d.ts +231 -0
  323. package/dist/next/jobs/records.d.ts.map +1 -0
  324. package/dist/next/jobs/records.js +869 -0
  325. package/dist/next/jobs/records.js.map +1 -0
  326. package/dist/next/jobs/run-states.d.ts +69 -0
  327. package/dist/next/jobs/run-states.d.ts.map +1 -0
  328. package/dist/next/jobs/run-states.js +228 -0
  329. package/dist/next/jobs/run-states.js.map +1 -0
  330. package/dist/next/jobs/run.d.ts +113 -0
  331. package/dist/next/jobs/run.d.ts.map +1 -0
  332. package/dist/next/jobs/run.js +200 -0
  333. package/dist/next/jobs/run.js.map +1 -0
  334. package/dist/next/jobs/running.d.ts +44 -0
  335. package/dist/next/jobs/running.d.ts.map +1 -0
  336. package/dist/next/jobs/running.js +117 -0
  337. package/dist/next/jobs/running.js.map +1 -0
  338. package/dist/next/jobs/stored.d.ts +63 -0
  339. package/dist/next/jobs/stored.d.ts.map +1 -0
  340. package/dist/next/jobs/stored.js +55 -0
  341. package/dist/next/jobs/stored.js.map +1 -0
  342. package/dist/next/link/binary.d.ts +4 -0
  343. package/dist/next/link/binary.d.ts.map +1 -0
  344. package/dist/next/link/binary.js +534 -0
  345. package/dist/next/link/binary.js.map +1 -0
  346. package/dist/next/link/channel.d.ts +63 -0
  347. package/dist/next/link/channel.d.ts.map +1 -0
  348. package/dist/next/link/channel.js +202 -0
  349. package/dist/next/link/channel.js.map +1 -0
  350. package/dist/next/link/errors.d.ts +7 -0
  351. package/dist/next/link/errors.d.ts.map +1 -0
  352. package/dist/next/link/errors.js +21 -0
  353. package/dist/next/link/errors.js.map +1 -0
  354. package/dist/next/link/index.d.ts +8 -0
  355. package/dist/next/link/index.d.ts.map +1 -0
  356. package/dist/next/link/index.js +8 -0
  357. package/dist/next/link/index.js.map +1 -0
  358. package/dist/next/link/internal.d.ts +9 -0
  359. package/dist/next/link/internal.d.ts.map +1 -0
  360. package/dist/next/link/internal.js +10 -0
  361. package/dist/next/link/internal.js.map +1 -0
  362. package/dist/next/link/ipc.d.ts +22 -0
  363. package/dist/next/link/ipc.d.ts.map +1 -0
  364. package/dist/next/link/ipc.js +64 -0
  365. package/dist/next/link/ipc.js.map +1 -0
  366. package/dist/next/link/link.d.ts +34 -0
  367. package/dist/next/link/link.d.ts.map +1 -0
  368. package/dist/next/link/link.js +87 -0
  369. package/dist/next/link/link.js.map +1 -0
  370. package/dist/next/link/message.d.ts +249 -0
  371. package/dist/next/link/message.d.ts.map +1 -0
  372. package/dist/next/link/message.js +123 -0
  373. package/dist/next/link/message.js.map +1 -0
  374. package/dist/next/link/part.d.ts +80 -0
  375. package/dist/next/link/part.d.ts.map +1 -0
  376. package/dist/next/link/part.js +164 -0
  377. package/dist/next/link/part.js.map +1 -0
  378. package/dist/next/link/text.d.ts +6 -0
  379. package/dist/next/link/text.d.ts.map +1 -0
  380. package/dist/next/link/text.js +335 -0
  381. package/dist/next/link/text.js.map +1 -0
  382. package/dist/next/link/values.d.ts +40 -0
  383. package/dist/next/link/values.d.ts.map +1 -0
  384. package/dist/next/link/values.js +117 -0
  385. package/dist/next/link/values.js.map +1 -0
  386. package/dist/next/link/websocket.d.ts +26 -0
  387. package/dist/next/link/websocket.d.ts.map +1 -0
  388. package/dist/next/link/websocket.js +91 -0
  389. package/dist/next/link/websocket.js.map +1 -0
  390. package/dist/next/registries/contribution.d.ts +50 -0
  391. package/dist/next/registries/contribution.d.ts.map +1 -0
  392. package/dist/next/registries/contribution.js +129 -0
  393. package/dist/next/registries/contribution.js.map +1 -0
  394. package/dist/next/registries/entries.d.ts +18 -0
  395. package/dist/next/registries/entries.d.ts.map +1 -0
  396. package/dist/next/registries/entries.js +42 -0
  397. package/dist/next/registries/entries.js.map +1 -0
  398. package/dist/next/registries/index.d.ts +3 -0
  399. package/dist/next/registries/index.d.ts.map +1 -0
  400. package/dist/next/registries/index.js +5 -0
  401. package/dist/next/registries/index.js.map +1 -0
  402. package/dist/next/registries/internal.d.ts +4 -0
  403. package/dist/next/registries/internal.d.ts.map +1 -0
  404. package/dist/next/registries/internal.js +5 -0
  405. package/dist/next/registries/internal.js.map +1 -0
  406. package/dist/next/registries/record.d.ts +94 -0
  407. package/dist/next/registries/record.d.ts.map +1 -0
  408. package/dist/next/registries/record.js +253 -0
  409. package/dist/next/registries/record.js.map +1 -0
  410. package/dist/next/registries/registry.d.ts +74 -0
  411. package/dist/next/registries/registry.d.ts.map +1 -0
  412. package/dist/next/registries/registry.js +14 -0
  413. package/dist/next/registries/registry.js.map +1 -0
  414. package/dist/next/registries/value.d.ts +48 -0
  415. package/dist/next/registries/value.d.ts.map +1 -0
  416. package/dist/next/registries/value.js +199 -0
  417. package/dist/next/registries/value.js.map +1 -0
  418. package/dist/next/remote/calls.d.ts +25 -0
  419. package/dist/next/remote/calls.d.ts.map +1 -0
  420. package/dist/next/remote/calls.js +62 -0
  421. package/dist/next/remote/calls.js.map +1 -0
  422. package/dist/next/remote/consumer.d.ts +42 -0
  423. package/dist/next/remote/consumer.d.ts.map +1 -0
  424. package/dist/next/remote/consumer.js +343 -0
  425. package/dist/next/remote/consumer.js.map +1 -0
  426. package/dist/next/remote/hold.d.ts +130 -0
  427. package/dist/next/remote/hold.d.ts.map +1 -0
  428. package/dist/next/remote/hold.js +537 -0
  429. package/dist/next/remote/hold.js.map +1 -0
  430. package/dist/next/remote/host-link.d.ts +77 -0
  431. package/dist/next/remote/host-link.d.ts.map +1 -0
  432. package/dist/next/remote/host-link.js +182 -0
  433. package/dist/next/remote/host-link.js.map +1 -0
  434. package/dist/next/remote/internal.d.ts +6 -0
  435. package/dist/next/remote/internal.d.ts.map +1 -0
  436. package/dist/next/remote/internal.js +6 -0
  437. package/dist/next/remote/internal.js.map +1 -0
  438. package/dist/next/remote/path.d.ts +46 -0
  439. package/dist/next/remote/path.d.ts.map +1 -0
  440. package/dist/next/remote/path.js +73 -0
  441. package/dist/next/remote/path.js.map +1 -0
  442. package/dist/next/remote/provider.d.ts +76 -0
  443. package/dist/next/remote/provider.d.ts.map +1 -0
  444. package/dist/next/remote/provider.js +506 -0
  445. package/dist/next/remote/provider.js.map +1 -0
  446. package/dist/next/remote/relay.d.ts +58 -0
  447. package/dist/next/remote/relay.d.ts.map +1 -0
  448. package/dist/next/remote/relay.js +117 -0
  449. package/dist/next/remote/relay.js.map +1 -0
  450. package/dist/next/remote/remote-object.d.ts +133 -0
  451. package/dist/next/remote/remote-object.d.ts.map +1 -0
  452. package/dist/next/remote/remote-object.js +411 -0
  453. package/dist/next/remote/remote-object.js.map +1 -0
  454. package/dist/next/remote/replica.d.ts +59 -0
  455. package/dist/next/remote/replica.d.ts.map +1 -0
  456. package/dist/next/remote/replica.js +125 -0
  457. package/dist/next/remote/replica.js.map +1 -0
  458. package/dist/next/state/batch.d.ts +64 -0
  459. package/dist/next/state/batch.d.ts.map +1 -0
  460. package/dist/next/state/batch.js +163 -0
  461. package/dist/next/state/batch.js.map +1 -0
  462. package/dist/next/state/derive.d.ts +52 -0
  463. package/dist/next/state/derive.d.ts.map +1 -0
  464. package/dist/next/state/derive.js +182 -0
  465. package/dist/next/state/derive.js.map +1 -0
  466. package/dist/next/state/index.d.ts +6 -0
  467. package/dist/next/state/index.d.ts.map +1 -0
  468. package/dist/next/state/index.js +4 -0
  469. package/dist/next/state/index.js.map +1 -0
  470. package/dist/next/state/internal.d.ts +6 -0
  471. package/dist/next/state/internal.d.ts.map +1 -0
  472. package/dist/next/state/internal.js +8 -0
  473. package/dist/next/state/internal.js.map +1 -0
  474. package/dist/next/state/native-source.d.ts +106 -0
  475. package/dist/next/state/native-source.d.ts.map +1 -0
  476. package/dist/next/state/native-source.js +240 -0
  477. package/dist/next/state/native-source.js.map +1 -0
  478. package/dist/next/state/watchable.d.ts +114 -0
  479. package/dist/next/state/watchable.d.ts.map +1 -0
  480. package/dist/next/state/watchable.js +156 -0
  481. package/dist/next/state/watchable.js.map +1 -0
  482. package/dist/next/state/writable.d.ts +32 -0
  483. package/dist/next/state/writable.d.ts.map +1 -0
  484. package/dist/next/state/writable.js +49 -0
  485. package/dist/next/state/writable.js.map +1 -0
  486. package/dist/next/store/adapter.d.ts +67 -0
  487. package/dist/next/store/adapter.d.ts.map +1 -0
  488. package/dist/next/store/adapter.js +118 -0
  489. package/dist/next/store/adapter.js.map +1 -0
  490. package/dist/next/store/allocator.d.ts +17 -0
  491. package/dist/next/store/allocator.d.ts.map +1 -0
  492. package/dist/next/store/allocator.js +30 -0
  493. package/dist/next/store/allocator.js.map +1 -0
  494. package/dist/next/store/applier.d.ts +8 -0
  495. package/dist/next/store/applier.d.ts.map +1 -0
  496. package/dist/next/store/applier.js +375 -0
  497. package/dist/next/store/applier.js.map +1 -0
  498. package/dist/next/store/apply-batch.d.ts +12 -0
  499. package/dist/next/store/apply-batch.d.ts.map +1 -0
  500. package/dist/next/store/apply-batch.js +83 -0
  501. package/dist/next/store/apply-batch.js.map +1 -0
  502. package/dist/next/store/archive.d.ts +32 -0
  503. package/dist/next/store/archive.d.ts.map +1 -0
  504. package/dist/next/store/archive.js +129 -0
  505. package/dist/next/store/archive.js.map +1 -0
  506. package/dist/next/store/backend.d.ts +10 -0
  507. package/dist/next/store/backend.d.ts.map +1 -0
  508. package/dist/next/store/backend.js +15 -0
  509. package/dist/next/store/backend.js.map +1 -0
  510. package/dist/next/store/catalog.d.ts +24 -0
  511. package/dist/next/store/catalog.d.ts.map +1 -0
  512. package/dist/next/store/catalog.js +17 -0
  513. package/dist/next/store/catalog.js.map +1 -0
  514. package/dist/next/store/claims.d.ts +23 -0
  515. package/dist/next/store/claims.d.ts.map +1 -0
  516. package/dist/next/store/claims.js +65 -0
  517. package/dist/next/store/claims.js.map +1 -0
  518. package/dist/next/store/columns.d.ts +77 -0
  519. package/dist/next/store/columns.d.ts.map +1 -0
  520. package/dist/next/store/columns.js +77 -0
  521. package/dist/next/store/columns.js.map +1 -0
  522. package/dist/next/store/engine.d.ts +176 -0
  523. package/dist/next/store/engine.d.ts.map +1 -0
  524. package/dist/next/store/engine.js +283 -0
  525. package/dist/next/store/engine.js.map +1 -0
  526. package/dist/next/store/evaluate.d.ts +17 -0
  527. package/dist/next/store/evaluate.d.ts.map +1 -0
  528. package/dist/next/store/evaluate.js +128 -0
  529. package/dist/next/store/evaluate.js.map +1 -0
  530. package/dist/next/store/export.d.ts +17 -0
  531. package/dist/next/store/export.d.ts.map +1 -0
  532. package/dist/next/store/export.js +200 -0
  533. package/dist/next/store/export.js.map +1 -0
  534. package/dist/next/store/expression.d.ts +150 -0
  535. package/dist/next/store/expression.d.ts.map +1 -0
  536. package/dist/next/store/expression.js +268 -0
  537. package/dist/next/store/expression.js.map +1 -0
  538. package/dist/next/store/import.d.ts +10 -0
  539. package/dist/next/store/import.d.ts.map +1 -0
  540. package/dist/next/store/import.js +276 -0
  541. package/dist/next/store/import.js.map +1 -0
  542. package/dist/next/store/index.d.ts +16 -0
  543. package/dist/next/store/index.d.ts.map +1 -0
  544. package/dist/next/store/index.js +13 -0
  545. package/dist/next/store/index.js.map +1 -0
  546. package/dist/next/store/json-column.d.ts +33 -0
  547. package/dist/next/store/json-column.d.ts.map +1 -0
  548. package/dist/next/store/json-column.js +61 -0
  549. package/dist/next/store/json-column.js.map +1 -0
  550. package/dist/next/store/jsonl.d.ts +9 -0
  551. package/dist/next/store/jsonl.d.ts.map +1 -0
  552. package/dist/next/store/jsonl.js +61 -0
  553. package/dist/next/store/jsonl.js.map +1 -0
  554. package/dist/next/store/outbox.d.ts +26 -0
  555. package/dist/next/store/outbox.d.ts.map +1 -0
  556. package/dist/next/store/outbox.js +80 -0
  557. package/dist/next/store/outbox.js.map +1 -0
  558. package/dist/next/store/query.d.ts +39 -0
  559. package/dist/next/store/query.d.ts.map +1 -0
  560. package/dist/next/store/query.js +97 -0
  561. package/dist/next/store/query.js.map +1 -0
  562. package/dist/next/store/refusal.d.ts +15 -0
  563. package/dist/next/store/refusal.d.ts.map +1 -0
  564. package/dist/next/store/refusal.js +36 -0
  565. package/dist/next/store/refusal.js.map +1 -0
  566. package/dist/next/store/rows.d.ts +80 -0
  567. package/dist/next/store/rows.d.ts.map +1 -0
  568. package/dist/next/store/rows.js +183 -0
  569. package/dist/next/store/rows.js.map +1 -0
  570. package/dist/next/store/schema.d.ts +25 -0
  571. package/dist/next/store/schema.d.ts.map +1 -0
  572. package/dist/next/store/schema.js +115 -0
  573. package/dist/next/store/schema.js.map +1 -0
  574. package/dist/next/store/sql.d.ts +73 -0
  575. package/dist/next/store/sql.d.ts.map +1 -0
  576. package/dist/next/store/sql.js +234 -0
  577. package/dist/next/store/sql.js.map +1 -0
  578. package/dist/next/store/step.d.ts +48 -0
  579. package/dist/next/store/step.d.ts.map +1 -0
  580. package/dist/next/store/step.js +50 -0
  581. package/dist/next/store/step.js.map +1 -0
  582. package/dist/next/store/store.d.ts +161 -0
  583. package/dist/next/store/store.d.ts.map +1 -0
  584. package/dist/next/store/store.js +627 -0
  585. package/dist/next/store/store.js.map +1 -0
  586. package/dist/next/store/table-changes.d.ts +29 -0
  587. package/dist/next/store/table-changes.d.ts.map +1 -0
  588. package/dist/next/store/table-changes.js +102 -0
  589. package/dist/next/store/table-changes.js.map +1 -0
  590. package/dist/next/store/table-evolve.d.ts +74 -0
  591. package/dist/next/store/table-evolve.d.ts.map +1 -0
  592. package/dist/next/store/table-evolve.js +201 -0
  593. package/dist/next/store/table-evolve.js.map +1 -0
  594. package/dist/next/store/table-handle.d.ts +67 -0
  595. package/dist/next/store/table-handle.d.ts.map +1 -0
  596. package/dist/next/store/table-handle.js +101 -0
  597. package/dist/next/store/table-handle.js.map +1 -0
  598. package/dist/next/store/table-history.d.ts +75 -0
  599. package/dist/next/store/table-history.d.ts.map +1 -0
  600. package/dist/next/store/table-history.js +42 -0
  601. package/dist/next/store/table-history.js.map +1 -0
  602. package/dist/next/store/table-migration.d.ts +16 -0
  603. package/dist/next/store/table-migration.d.ts.map +1 -0
  604. package/dist/next/store/table-migration.js +202 -0
  605. package/dist/next/store/table-migration.js.map +1 -0
  606. package/dist/next/store/table-writes.d.ts +125 -0
  607. package/dist/next/store/table-writes.d.ts.map +1 -0
  608. package/dist/next/store/table-writes.js +165 -0
  609. package/dist/next/store/table-writes.js.map +1 -0
  610. package/dist/next/store/table.d.ts +80 -0
  611. package/dist/next/store/table.d.ts.map +1 -0
  612. package/dist/next/store/table.js +103 -0
  613. package/dist/next/store/table.js.map +1 -0
  614. package/dist/next/store/text.d.ts +14 -0
  615. package/dist/next/store/text.d.ts.map +1 -0
  616. package/dist/next/store/text.js +51 -0
  617. package/dist/next/store/text.js.map +1 -0
  618. package/dist/next/store/writes.d.ts +5 -0
  619. package/dist/next/store/writes.d.ts.map +1 -0
  620. package/dist/next/store/writes.js +4 -0
  621. package/dist/next/store/writes.js.map +1 -0
  622. package/dist/next-node/compression.d.ts +7 -0
  623. package/dist/next-node/compression.d.ts.map +1 -0
  624. package/dist/next-node/compression.js +24 -0
  625. package/dist/next-node/compression.js.map +1 -0
  626. package/dist/next-node/http/admission.d.ts +63 -0
  627. package/dist/next-node/http/admission.d.ts.map +1 -0
  628. package/dist/next-node/http/admission.js +134 -0
  629. package/dist/next-node/http/admission.js.map +1 -0
  630. package/dist/next-node/http/authenticate.d.ts +21 -0
  631. package/dist/next-node/http/authenticate.d.ts.map +1 -0
  632. package/dist/next-node/http/authenticate.js +34 -0
  633. package/dist/next-node/http/authenticate.js.map +1 -0
  634. package/dist/next-node/http/cookies.d.ts +24 -0
  635. package/dist/next-node/http/cookies.d.ts.map +1 -0
  636. package/dist/next-node/http/cookies.js +62 -0
  637. package/dist/next-node/http/cookies.js.map +1 -0
  638. package/dist/next-node/http/file.d.ts +23 -0
  639. package/dist/next-node/http/file.d.ts.map +1 -0
  640. package/dist/next-node/http/file.js +94 -0
  641. package/dist/next-node/http/file.js.map +1 -0
  642. package/dist/next-node/http/headers.d.ts +37 -0
  643. package/dist/next-node/http/headers.d.ts.map +1 -0
  644. package/dist/next-node/http/headers.js +129 -0
  645. package/dist/next-node/http/headers.js.map +1 -0
  646. package/dist/next-node/http/http.d.ts +100 -0
  647. package/dist/next-node/http/http.d.ts.map +1 -0
  648. package/dist/next-node/http/http.js +462 -0
  649. package/dist/next-node/http/http.js.map +1 -0
  650. package/dist/next-node/http/incoming.d.ts +19 -0
  651. package/dist/next-node/http/incoming.d.ts.map +1 -0
  652. package/dist/next-node/http/incoming.js +31 -0
  653. package/dist/next-node/http/incoming.js.map +1 -0
  654. package/dist/next-node/http/index.d.ts +11 -0
  655. package/dist/next-node/http/index.d.ts.map +1 -0
  656. package/dist/next-node/http/index.js +12 -0
  657. package/dist/next-node/http/index.js.map +1 -0
  658. package/dist/next-node/http/node.d.ts +78 -0
  659. package/dist/next-node/http/node.d.ts.map +1 -0
  660. package/dist/next-node/http/node.js +291 -0
  661. package/dist/next-node/http/node.js.map +1 -0
  662. package/dist/next-node/http/request.d.ts +54 -0
  663. package/dist/next-node/http/request.d.ts.map +1 -0
  664. package/dist/next-node/http/request.js +116 -0
  665. package/dist/next-node/http/request.js.map +1 -0
  666. package/dist/next-node/http/response.d.ts +63 -0
  667. package/dist/next-node/http/response.d.ts.map +1 -0
  668. package/dist/next-node/http/response.js +202 -0
  669. package/dist/next-node/http/response.js.map +1 -0
  670. package/dist/next-node/http/router.d.ts +114 -0
  671. package/dist/next-node/http/router.d.ts.map +1 -0
  672. package/dist/next-node/http/router.js +261 -0
  673. package/dist/next-node/http/router.js.map +1 -0
  674. package/dist/next-node/http/upgrades.d.ts +58 -0
  675. package/dist/next-node/http/upgrades.d.ts.map +1 -0
  676. package/dist/next-node/http/upgrades.js +184 -0
  677. package/dist/next-node/http/upgrades.js.map +1 -0
  678. package/dist/next-node/plugins/build.d.ts +57 -0
  679. package/dist/next-node/plugins/build.d.ts.map +1 -0
  680. package/dist/next-node/plugins/build.js +334 -0
  681. package/dist/next-node/plugins/build.js.map +1 -0
  682. package/dist/next-node/plugins/discover.d.ts +36 -0
  683. package/dist/next-node/plugins/discover.d.ts.map +1 -0
  684. package/dist/next-node/plugins/discover.js +91 -0
  685. package/dist/next-node/plugins/discover.js.map +1 -0
  686. package/dist/next-node/plugins/evaluate.d.ts +33 -0
  687. package/dist/next-node/plugins/evaluate.d.ts.map +1 -0
  688. package/dist/next-node/plugins/evaluate.js +98 -0
  689. package/dist/next-node/plugins/evaluate.js.map +1 -0
  690. package/dist/next-node/plugins/index.d.ts +9 -0
  691. package/dist/next-node/plugins/index.d.ts.map +1 -0
  692. package/dist/next-node/plugins/index.js +11 -0
  693. package/dist/next-node/plugins/index.js.map +1 -0
  694. package/dist/next-node/plugins/install.d.ts +13 -0
  695. package/dist/next-node/plugins/install.d.ts.map +1 -0
  696. package/dist/next-node/plugins/install.js +37 -0
  697. package/dist/next-node/plugins/install.js.map +1 -0
  698. package/dist/next-node/plugins/plugins.d.ts +135 -0
  699. package/dist/next-node/plugins/plugins.d.ts.map +1 -0
  700. package/dist/next-node/plugins/plugins.js +206 -0
  701. package/dist/next-node/plugins/plugins.js.map +1 -0
  702. package/dist/next-node/plugins/runtime.d.ts +41 -0
  703. package/dist/next-node/plugins/runtime.d.ts.map +1 -0
  704. package/dist/next-node/plugins/runtime.js +136 -0
  705. package/dist/next-node/plugins/runtime.js.map +1 -0
  706. package/dist/next-node/plugins/stack.d.ts +16 -0
  707. package/dist/next-node/plugins/stack.d.ts.map +1 -0
  708. package/dist/next-node/plugins/stack.js +61 -0
  709. package/dist/next-node/plugins/stack.js.map +1 -0
  710. package/dist/next-node/plugins/watcher.d.ts +58 -0
  711. package/dist/next-node/plugins/watcher.d.ts.map +1 -0
  712. package/dist/next-node/plugins/watcher.js +281 -0
  713. package/dist/next-node/plugins/watcher.js.map +1 -0
  714. package/dist/next-node/workers/control.d.ts +83 -0
  715. package/dist/next-node/workers/control.d.ts.map +1 -0
  716. package/dist/next-node/workers/control.js +77 -0
  717. package/dist/next-node/workers/control.js.map +1 -0
  718. package/dist/next-node/workers/index.d.ts +5 -0
  719. package/dist/next-node/workers/index.d.ts.map +1 -0
  720. package/dist/next-node/workers/index.js +7 -0
  721. package/dist/next-node/workers/index.js.map +1 -0
  722. package/dist/next-node/workers/lock.d.ts +21 -0
  723. package/dist/next-node/workers/lock.d.ts.map +1 -0
  724. package/dist/next-node/workers/lock.js +137 -0
  725. package/dist/next-node/workers/lock.js.map +1 -0
  726. package/dist/next-node/workers/main.d.ts +46 -0
  727. package/dist/next-node/workers/main.d.ts.map +1 -0
  728. package/dist/next-node/workers/main.js +230 -0
  729. package/dist/next-node/workers/main.js.map +1 -0
  730. package/dist/next-node/workers/process.d.ts +42 -0
  731. package/dist/next-node/workers/process.d.ts.map +1 -0
  732. package/dist/next-node/workers/process.js +125 -0
  733. package/dist/next-node/workers/process.js.map +1 -0
  734. package/dist/next-node/workers/workers.d.ts +80 -0
  735. package/dist/next-node/workers/workers.d.ts.map +1 -0
  736. package/dist/next-node/workers/workers.js +572 -0
  737. package/dist/next-node/workers/workers.js.map +1 -0
  738. package/dist/object.d.ts +4 -4
  739. package/dist/object.d.ts.map +1 -1
  740. package/dist/object.js +3 -4
  741. package/dist/object.js.map +1 -1
  742. package/dist/output.d.ts +1 -1
  743. package/dist/output.d.ts.map +1 -1
  744. package/dist/output.js +4 -2
  745. package/dist/output.js.map +1 -1
  746. package/dist/remote.d.ts.map +1 -1
  747. package/dist/remote.js +2 -2
  748. package/dist/remote.js.map +1 -1
  749. package/dist/schema.d.ts +8 -4
  750. package/dist/schema.d.ts.map +1 -1
  751. package/dist/schema.js +180 -5
  752. package/dist/schema.js.map +1 -1
  753. package/dist/sqlite/cloudflare.d.ts +2 -0
  754. package/dist/sqlite/cloudflare.d.ts.map +1 -1
  755. package/dist/sqlite/cloudflare.js +10 -0
  756. package/dist/sqlite/cloudflare.js.map +1 -1
  757. package/dist/sqlite/database.d.ts +5 -2
  758. package/dist/sqlite/database.d.ts.map +1 -1
  759. package/dist/sqlite/database.js.map +1 -1
  760. package/dist/sqlite/node.d.ts +4 -1
  761. package/dist/sqlite/node.d.ts.map +1 -1
  762. package/dist/sqlite/node.js +22 -5
  763. package/dist/sqlite/node.js.map +1 -1
  764. package/dist/watch.d.ts +194 -0
  765. package/dist/watch.d.ts.map +1 -0
  766. package/dist/watch.js +383 -0
  767. package/dist/watch.js.map +1 -0
  768. package/dist/wire.d.ts +174 -193
  769. package/dist/wire.d.ts.map +1 -1
  770. package/dist/wire.js +81 -80
  771. package/dist/wire.js.map +1 -1
  772. package/docs/guide.md +15 -15
  773. package/docs/next/benchmarks.md +959 -0
  774. package/docs/next/decisions.md +2957 -0
  775. package/docs/next/dependencies/book.md +1671 -0
  776. package/docs/next/dependencies/index.html +2641 -0
  777. package/docs/next/dependencies/model.md +330 -0
  778. package/docs/next/design.md +2554 -0
  779. package/docs/next/durable-observers/book.md +432 -0
  780. package/docs/next/durable-observers/index.html +517 -0
  781. package/docs/next/flow-control/book.md +333 -0
  782. package/docs/next/flow-control/fold/index.html +265 -0
  783. package/docs/next/flow-control/index.html +548 -0
  784. package/docs/next/flow-control/window/index.html +228 -0
  785. package/docs/next/guide-plugins-hosts/book.md +607 -0
  786. package/docs/next/guide-plugins-hosts/index.html +652 -0
  787. package/docs/next/http-workers/book.md +378 -0
  788. package/docs/next/http-workers/index.html +515 -0
  789. package/docs/next/layer-1.md +311 -0
  790. package/docs/next/layer-2.md +216 -0
  791. package/docs/next/plugin-model/book.md +186 -0
  792. package/docs/next/plugin-model/index.html +310 -0
  793. package/docs/next/plugin-primer/book.md +273 -0
  794. package/docs/next/plugin-primer/index.html +430 -0
  795. package/docs/next/slice-1.md +236 -0
  796. package/docs/next/slice-10.md +285 -0
  797. package/docs/next/slice-11.md +93 -0
  798. package/docs/next/slice-2.md +174 -0
  799. package/docs/next/slice-3a.md +296 -0
  800. package/docs/next/slice-3b.md +197 -0
  801. package/docs/next/slice-4.md +146 -0
  802. package/docs/next/slice-4a.md +418 -0
  803. package/docs/next/slice-4b.md +208 -0
  804. package/docs/next/slice-5.md +281 -0
  805. package/docs/next/slice-6a.md +676 -0
  806. package/docs/next/slice-6b.md +332 -0
  807. package/docs/next/slice-7a.md +130 -0
  808. package/docs/next/slice-7b/book.md +608 -0
  809. package/docs/next/slice-7b/index.html +842 -0
  810. package/docs/next/slice-7b.md +255 -0
  811. package/docs/next/slice-7c.md +165 -0
  812. package/docs/next/slice-8.md +194 -0
  813. package/docs/next/slices.md +230 -0
  814. package/docs/next/store/book.md +665 -0
  815. package/docs/next/store/index.html +861 -0
  816. package/docs/next/store/walkthrough.md +193 -0
  817. package/docs/spec.md +9 -9
  818. package/docs/tutorial.md +26 -25
  819. package/package.json +22 -6
  820. package/src/delta/README.md +69 -0
@@ -0,0 +1,129 @@
1
+ // Archives and recorded commits as they cross a trust boundary (slice 6a §13, slice 6b §1.6; decisions "Export archives
2
+ // are operations", "Writes carry their versions; archives are lossless"): the parts an export yields and an import
3
+ // takes, their order, and the compiled schemas every imported part and every applied write is checked against first.
4
+ import { arr, bool, int, lit, map, num, obj, opt, str, union, unknown, } from "../contracts/index.js";
5
+ import { invalid, validatorFor } from "../data/internal.js";
6
+ /** The archive format `export` writes; `import` takes this one only. */
7
+ export const ARCHIVE_FORMAT = 1;
8
+ /** An integer from `min` up to 2^53 - 1: seqs, ids, versions and counts stay exact (a seq after 2^53 would repeat). */
9
+ function safe(min) {
10
+ return int({ min, max: Number.MAX_SAFE_INTEGER });
11
+ }
12
+ const version = safe(1);
13
+ const column = obj({
14
+ type: union([lit("str"), lit("int"), lit("num"), lit("bool"), lit("json")]),
15
+ optional: opt(lit(true)),
16
+ default: opt(union([str(), num(), bool()])),
17
+ version: opt(version),
18
+ fingerprint: opt(str()),
19
+ });
20
+ const versions = map(version);
21
+ const TABLE = obj({
22
+ kind: lit("table"),
23
+ table: str(),
24
+ version,
25
+ state: union([lit("ready"), lit("migrating")]),
26
+ columns: map(column),
27
+ key: arr(str()),
28
+ fingerprint: str(),
29
+ });
30
+ const PUT = obj({
31
+ kind: lit("put"),
32
+ table: str(),
33
+ row: map(unknown()),
34
+ version,
35
+ columns: versions,
36
+ });
37
+ const INDEX = obj({ kind: lit("index"), table: str(), name: str(), columns: arr(str()) });
38
+ const RECORD = obj({
39
+ id: safe(1),
40
+ owner: str(),
41
+ namespace: str(),
42
+ kind: str(),
43
+ // Absent for a singleton.
44
+ key: opt(str()),
45
+ history: union([lit("none"), lit("latest"), lit("rewindable")]),
46
+ createdAt: safe(1),
47
+ retiredAt: opt(safe(1)),
48
+ meta: opt(str()),
49
+ revision: safe(1),
50
+ version,
51
+ fingerprint: str(),
52
+ });
53
+ const BASE = obj({ version, fingerprint: str(), value: unknown() });
54
+ /** A delta's ops; their shapes are checked where they are applied. */
55
+ const ops = arr(unknown());
56
+ const REVISION = obj({
57
+ kind: lit("document.revision"),
58
+ id: safe(1),
59
+ seq: safe(1),
60
+ content: union([obj({ kind: lit("base"), version, value: unknown() }), obj({ kind: lit("delta"), version, ops })]),
61
+ });
62
+ const PART = union([
63
+ obj({ kind: lit("manifest"), format: safe(1), schema: safe(1), lastSeq: safe(0), nextId: safe(1) }),
64
+ TABLE,
65
+ PUT,
66
+ INDEX,
67
+ obj({ kind: lit("document.create"), record: RECORD }),
68
+ REVISION,
69
+ obj({ kind: lit("end"), writes: safe(0) }),
70
+ ]);
71
+ const count = safe(0);
72
+ const edit = union([
73
+ obj({ kind: lit("rename"), from: str(), to: str() }),
74
+ obj({ kind: lit("add"), name: str(), column }),
75
+ obj({ kind: lit("drop"), name: str() }),
76
+ obj({ kind: lit("json"), name: str(), column }),
77
+ ]);
78
+ const key = map(union([str(), num(), bool()]));
79
+ /** One recorded write of a commit (a batch's); `where` and `set` nodes are checked by the applier. */
80
+ const WRITE = union([
81
+ TABLE,
82
+ PUT,
83
+ INDEX,
84
+ obj({ kind: lit("dropIndex"), table: str(), name: str() }),
85
+ obj({ kind: lit("alter"), table: str(), version, edit }),
86
+ obj({ kind: lit("update"), table: str(), key, set: unknown(), columns: versions, count, version: opt(version) }),
87
+ obj({ kind: lit("delete"), table: str(), key, count }),
88
+ obj({
89
+ kind: lit("updateWhere"),
90
+ table: str(),
91
+ where: unknown(),
92
+ set: unknown(),
93
+ columns: versions,
94
+ count,
95
+ version: opt(version),
96
+ }),
97
+ obj({ kind: lit("deleteWhere"), table: str(), where: unknown(), count }),
98
+ obj({ kind: lit("document.create"), record: RECORD, base: BASE }),
99
+ obj({
100
+ kind: lit("document.change"),
101
+ id: safe(1),
102
+ revision: safe(1),
103
+ content: union([
104
+ obj({ kind: lit("base"), version, fingerprint: str(), value: unknown() }),
105
+ obj({ kind: lit("delta"), version, ops }),
106
+ ]),
107
+ }),
108
+ obj({ kind: lit("document.retire"), id: safe(1), revision: safe(1) }),
109
+ ]);
110
+ const PART_SCHEMA = { schema: PART };
111
+ const WRITE_SCHEMA = { schema: WRITE };
112
+ /** Checks one imported part against the archive schema (a trust boundary); `invalid/args` naming its position. */
113
+ export function checkPart(part, position, context) {
114
+ context.telemetry.metrics?.counter("chord.data.validations").add(1);
115
+ if (!validatorFor(PART_SCHEMA, context).check(part)) {
116
+ throw invalid("args", `import: part ${position}: not an archive part`);
117
+ }
118
+ // The check above establishes the type.
119
+ return part;
120
+ }
121
+ /** Checks one write of a batch's commit against the write schema (a trust boundary); `what` names its place. */
122
+ export function checkWrite(write, what, context) {
123
+ context.telemetry.metrics?.counter("chord.data.validations").add(1);
124
+ if (!validatorFor(WRITE_SCHEMA, context).check(write))
125
+ throw invalid("args", `${what}: not a store write`);
126
+ // The check above establishes the type, the nodes aside (the applier checks them).
127
+ return write;
128
+ }
129
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/next/store/archive.ts"],"names":[],"mappings":"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","sourcesContent":["// Archives and recorded commits as they cross a trust boundary (slice 6a §13, slice 6b §1.6; decisions \"Export archives\n// are operations\", \"Writes carry their versions; archives are lossless\"): the parts an export yields and an import\n// takes, their order, and the compiled schemas every imported part and every applied write is checked against first.\n\nimport type { Context } from \"../../context/index.ts\";\nimport {\n\tarr,\n\tbool,\n\ttype IntegerSchema,\n\tint,\n\tlit,\n\tmap,\n\tnum,\n\tobj,\n\topt,\n\tstr,\n\tunion,\n\tunknown,\n} from \"../contracts/index.ts\";\nimport { invalid, validatorFor } from \"../data/internal.ts\";\nimport type { DocumentWrite } from \"./engine.ts\";\nimport type { TableWrite } from \"./table-writes.ts\";\nimport type { StoreWrite } from \"./writes.ts\";\n\n/** The archive format `export` writes; `import` takes this one only. */\nexport const ARCHIVE_FORMAT = 1;\n\n/** The first part: the format, the store's schema version, its `lastSeq` and the allocator's next id (rule 24, D3). */\nexport type ArchiveManifest = {\n\treadonly kind: \"manifest\";\n\treadonly format: number;\n\treadonly schema: number;\n\treadonly lastSeq: number;\n\treadonly nextId: number;\n};\n\n/**\n * One part of an archive, in this order: the manifest; per table (by SQL name) its `table` write, its `put`s and its\n * `index` writes; per document record (by id, live and retired) its `document.create` without a base, then its kept\n * revisions in seq order; `end` with the count of the parts between.\n */\nexport type ArchivePart =\n\t| ArchiveManifest\n\t| Extract<TableWrite, { readonly kind: \"table\" | \"put\" | \"index\" }>\n\t| Extract<DocumentWrite, { readonly kind: \"document.create\" | \"document.revision\" }>\n\t| { readonly kind: \"end\"; readonly writes: number };\n\n/** An integer from `min` up to 2^53 - 1: seqs, ids, versions and counts stay exact (a seq after 2^53 would repeat). */\nfunction safe(min: number): IntegerSchema {\n\treturn int({ min, max: Number.MAX_SAFE_INTEGER });\n}\n\nconst version = safe(1);\n\nconst column = obj({\n\ttype: union([lit(\"str\"), lit(\"int\"), lit(\"num\"), lit(\"bool\"), lit(\"json\")]),\n\toptional: opt(lit(true)),\n\tdefault: opt(union([str(), num(), bool()])),\n\tversion: opt(version),\n\tfingerprint: opt(str()),\n});\n\nconst versions = map(version);\n\nconst TABLE = obj({\n\tkind: lit(\"table\"),\n\ttable: str(),\n\tversion,\n\tstate: union([lit(\"ready\"), lit(\"migrating\")]),\n\tcolumns: map(column),\n\tkey: arr(str()),\n\tfingerprint: str(),\n});\n\nconst PUT = obj({\n\tkind: lit(\"put\"),\n\ttable: str(),\n\trow: map(unknown()),\n\tversion,\n\tcolumns: versions,\n});\n\nconst INDEX = obj({ kind: lit(\"index\"), table: str(), name: str(), columns: arr(str()) });\n\nconst RECORD = obj({\n\tid: safe(1),\n\towner: str(),\n\tnamespace: str(),\n\tkind: str(),\n\t// Absent for a singleton.\n\tkey: opt(str()),\n\thistory: union([lit(\"none\"), lit(\"latest\"), lit(\"rewindable\")]),\n\tcreatedAt: safe(1),\n\tretiredAt: opt(safe(1)),\n\tmeta: opt(str()),\n\trevision: safe(1),\n\tversion,\n\tfingerprint: str(),\n});\n\nconst BASE = obj({ version, fingerprint: str(), value: unknown() });\n\n/** A delta's ops; their shapes are checked where they are applied. */\nconst ops = arr(unknown());\n\nconst REVISION = obj({\n\tkind: lit(\"document.revision\"),\n\tid: safe(1),\n\tseq: safe(1),\n\tcontent: union([obj({ kind: lit(\"base\"), version, value: unknown() }), obj({ kind: lit(\"delta\"), version, ops })]),\n});\n\nconst PART = union([\n\tobj({ kind: lit(\"manifest\"), format: safe(1), schema: safe(1), lastSeq: safe(0), nextId: safe(1) }),\n\tTABLE,\n\tPUT,\n\tINDEX,\n\tobj({ kind: lit(\"document.create\"), record: RECORD }),\n\tREVISION,\n\tobj({ kind: lit(\"end\"), writes: safe(0) }),\n]);\n\nconst count = safe(0);\n\nconst edit = union([\n\tobj({ kind: lit(\"rename\"), from: str(), to: str() }),\n\tobj({ kind: lit(\"add\"), name: str(), column }),\n\tobj({ kind: lit(\"drop\"), name: str() }),\n\tobj({ kind: lit(\"json\"), name: str(), column }),\n]);\n\nconst key = map(union([str(), num(), bool()]));\n\n/** One recorded write of a commit (a batch's); `where` and `set` nodes are checked by the applier. */\nconst WRITE = union([\n\tTABLE,\n\tPUT,\n\tINDEX,\n\tobj({ kind: lit(\"dropIndex\"), table: str(), name: str() }),\n\tobj({ kind: lit(\"alter\"), table: str(), version, edit }),\n\tobj({ kind: lit(\"update\"), table: str(), key, set: unknown(), columns: versions, count, version: opt(version) }),\n\tobj({ kind: lit(\"delete\"), table: str(), key, count }),\n\tobj({\n\t\tkind: lit(\"updateWhere\"),\n\t\ttable: str(),\n\t\twhere: unknown(),\n\t\tset: unknown(),\n\t\tcolumns: versions,\n\t\tcount,\n\t\tversion: opt(version),\n\t}),\n\tobj({ kind: lit(\"deleteWhere\"), table: str(), where: unknown(), count }),\n\tobj({ kind: lit(\"document.create\"), record: RECORD, base: BASE }),\n\tobj({\n\t\tkind: lit(\"document.change\"),\n\t\tid: safe(1),\n\t\trevision: safe(1),\n\t\tcontent: union([\n\t\t\tobj({ kind: lit(\"base\"), version, fingerprint: str(), value: unknown() }),\n\t\t\tobj({ kind: lit(\"delta\"), version, ops }),\n\t\t]),\n\t}),\n\tobj({ kind: lit(\"document.retire\"), id: safe(1), revision: safe(1) }),\n]);\n\nconst PART_SCHEMA = { schema: PART };\n\nconst WRITE_SCHEMA = { schema: WRITE };\n\n/** Checks one imported part against the archive schema (a trust boundary); `invalid/args` naming its position. */\nexport function checkPart(part: unknown, position: number, context: Context): ArchivePart {\n\tcontext.telemetry.metrics?.counter(\"chord.data.validations\").add(1);\n\tif (!validatorFor(PART_SCHEMA, context).check(part)) {\n\t\tthrow invalid(\"args\", `import: part ${position}: not an archive part`);\n\t}\n\t// The check above establishes the type.\n\treturn part as ArchivePart;\n}\n\n/** Checks one write of a batch's commit against the write schema (a trust boundary); `what` names its place. */\nexport function checkWrite(write: unknown, what: string, context: Context): StoreWrite {\n\tcontext.telemetry.metrics?.counter(\"chord.data.validations\").add(1);\n\tif (!validatorFor(WRITE_SCHEMA, context).check(write)) throw invalid(\"args\", `${what}: not a store write`);\n\t// The check above establishes the type, the nodes aside (the applier checks them).\n\treturn write as StoreWrite;\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { SqliteDatabase } from "../../sqlite/index.ts";
2
+ /** A backend for `openStore` and `importStore`: opaque to apps, owned by the store once given to it. */
3
+ export declare class Backend {
4
+ /** The database the store runs its SQL on. */
5
+ readonly db: SqliteDatabase;
6
+ constructor(db: SqliteDatabase);
7
+ }
8
+ /** A backend over a SQLite database (`openNodeSqliteDatabase(path)`, a Durable Object's storage, `:memory:` in tests). */
9
+ export declare function sqliteBackend(db: SqliteDatabase): Backend;
10
+ //# sourceMappingURL=backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../../../src/next/store/backend.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,wGAAwG;AACxG,qBAAa,OAAO;IACnB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAE5B,YAAY,EAAE,EAAE,cAAc,EAE7B;CACD;AAED,0HAA0H;AAC1H,wBAAgB,aAAa,CAAC,EAAE,EAAE,cAAc,GAAG,OAAO,CAEzD"}
@@ -0,0 +1,15 @@
1
+ // Store backends (slice 6a §2): what a store runs on. One kind today, any `SqliteDatabase` (Node through
2
+ // `chord/sqlite/node`, Durable Objects through `chord/sqlite/cloudflare`); its interface is internal to the store.
3
+ /** A backend for `openStore` and `importStore`: opaque to apps, owned by the store once given to it. */
4
+ export class Backend {
5
+ /** The database the store runs its SQL on. */
6
+ db;
7
+ constructor(db) {
8
+ this.db = db;
9
+ }
10
+ }
11
+ /** A backend over a SQLite database (`openNodeSqliteDatabase(path)`, a Durable Object's storage, `:memory:` in tests). */
12
+ export function sqliteBackend(db) {
13
+ return new Backend(db);
14
+ }
15
+ //# sourceMappingURL=backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend.js","sourceRoot":"","sources":["../../../src/next/store/backend.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,mHAAmH;AAInH,wGAAwG;AACxG,MAAM,OAAO,OAAO;IACnB,8CAA8C;IACrC,EAAE,CAAiB;IAE5B,YAAY,EAAkB;QAC7B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,CAAC;CACD;AAED,0HAA0H;AAC1H,MAAM,UAAU,aAAa,CAAC,EAAkB;IAC/C,OAAO,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC","sourcesContent":["// Store backends (slice 6a §2): what a store runs on. One kind today, any `SqliteDatabase` (Node through\n// `chord/sqlite/node`, Durable Objects through `chord/sqlite/cloudflare`); its interface is internal to the store.\n\nimport type { SqliteDatabase } from \"../../sqlite/index.ts\";\n\n/** A backend for `openStore` and `importStore`: opaque to apps, owned by the store once given to it. */\nexport class Backend {\n\t/** The database the store runs its SQL on. */\n\treadonly db: SqliteDatabase;\n\n\tconstructor(db: SqliteDatabase) {\n\t\tthis.db = db;\n\t}\n}\n\n/** A backend over a SQLite database (`openNodeSqliteDatabase(path)`, a Durable Object's storage, `:memory:` in tests). */\nexport function sqliteBackend(db: SqliteDatabase): Backend {\n\treturn new Backend(db);\n}\n"]}
@@ -0,0 +1,24 @@
1
+ import type { SqliteExecutor } from "../../sqlite/index.ts";
2
+ import type { ColumnRecord } from "./columns.ts";
3
+ import type { Step } from "./step.ts";
4
+ /** A table as the store records it, by its SQL name. */
5
+ export type TableRecord = {
6
+ readonly table: string;
7
+ readonly version: number;
8
+ /** `migrating` while an eager migration of `version` runs (slice 6a §9). */
9
+ readonly state: "ready" | "migrating";
10
+ readonly columns: {
11
+ readonly [name: string]: ColumnRecord;
12
+ };
13
+ readonly key: readonly string[];
14
+ readonly fingerprint: string;
15
+ /** Index definitions by name: their declared columns (the key is appended when rendered). */
16
+ readonly indexes: {
17
+ readonly [name: string]: readonly string[];
18
+ };
19
+ };
20
+ /** Every recorded table, by SQL name. */
21
+ export declare function readCatalog(executor: SqliteExecutor): Promise<Map<string, TableRecord>>;
22
+ /** Writes the table records `step` changed, once each, inside its backend transaction. */
23
+ export declare function writeCatalog(step: Step): Promise<void>;
24
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/next/store/catalog.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,wDAAwD;AACxD,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAAA;KAAE,CAAC;IAC5D,QAAQ,CAAC,GAAG,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,OAAO,EAAE;QAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;CACjE,CAAC;AAEF,yCAAyC;AACzC,wBAAsB,WAAW,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAK7F;AAED,0FAA0F;AAC1F,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5D"}
@@ -0,0 +1,17 @@
1
+ // The catalog (slice 6a §2, §5): the table definitions the store records (version, state, columns, key, fingerprint,
2
+ // indexes), read once at open, changed only by `table`, `index`, `dropIndex` and `alter` writes inside a step, and in
3
+ // memory again only after `COMMIT` returned.
4
+ import { TABLES } from "./schema.js";
5
+ /** Every recorded table, by SQL name. */
6
+ export async function readCatalog(executor) {
7
+ const rows = await executor.all(`SELECT name, definition FROM ${TABLES.tables}`);
8
+ return new Map(rows.map(({ name, definition }) => [name, JSON.parse(definition)]));
9
+ }
10
+ /** Writes the table records `step` changed, once each, inside its backend transaction. */
11
+ export async function writeCatalog(step) {
12
+ for (const [name, record] of step.tables) {
13
+ const definition = JSON.stringify(record);
14
+ await step.run(`INSERT OR REPLACE INTO ${TABLES.tables} (name, definition) VALUES (?, ?)`, name, definition);
15
+ }
16
+ }
17
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/next/store/catalog.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,sHAAsH;AACtH,6CAA6C;AAI7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAgBrC,yCAAyC;AACzC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAwB;IACzD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,CAC9B,gCAAgC,MAAM,CAAC,MAAM,EAAE,CAC/C,CAAC;IACF,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAgB,CAAC,CAAC,CAAC,CAAC;AACnG,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAU;IAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,IAAI,CAAC,GAAG,CAAC,0BAA0B,MAAM,CAAC,MAAM,mCAAmC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAC9G,CAAC;AACF,CAAC","sourcesContent":["// The catalog (slice 6a §2, §5): the table definitions the store records (version, state, columns, key, fingerprint,\n// indexes), read once at open, changed only by `table`, `index`, `dropIndex` and `alter` writes inside a step, and in\n// memory again only after `COMMIT` returned.\n\nimport type { SqliteExecutor } from \"../../sqlite/index.ts\";\nimport type { ColumnRecord } from \"./columns.ts\";\nimport { TABLES } from \"./schema.ts\";\nimport type { Step } from \"./step.ts\";\n\n/** A table as the store records it, by its SQL name. */\nexport type TableRecord = {\n\treadonly table: string;\n\treadonly version: number;\n\t/** `migrating` while an eager migration of `version` runs (slice 6a §9). */\n\treadonly state: \"ready\" | \"migrating\";\n\treadonly columns: { readonly [name: string]: ColumnRecord };\n\treadonly key: readonly string[];\n\treadonly fingerprint: string;\n\t/** Index definitions by name: their declared columns (the key is appended when rendered). */\n\treadonly indexes: { readonly [name: string]: readonly string[] };\n};\n\n/** Every recorded table, by SQL name. */\nexport async function readCatalog(executor: SqliteExecutor): Promise<Map<string, TableRecord>> {\n\tconst rows = await executor.all<{ readonly name: string; readonly definition: string }>(\n\t\t`SELECT name, definition FROM ${TABLES.tables}`,\n\t);\n\treturn new Map(rows.map(({ name, definition }) => [name, JSON.parse(definition) as TableRecord]));\n}\n\n/** Writes the table records `step` changed, once each, inside its backend transaction. */\nexport async function writeCatalog(step: Step): Promise<void> {\n\tfor (const [name, record] of step.tables) {\n\t\tconst definition = JSON.stringify(record);\n\t\tawait step.run(`INSERT OR REPLACE INTO ${TABLES.tables} (name, definition) VALUES (?, ?)`, name, definition);\n\t}\n}\n"]}
@@ -0,0 +1,23 @@
1
+ /** Who holds claims: named in the refusal of a second claim. */
2
+ export type Claimant = {
3
+ readonly label: string;
4
+ };
5
+ /** A store's claims, by key; one claimant per key. */
6
+ export declare class Claims {
7
+ #private;
8
+ /** Whether any claimant holds a claim (batch apply is refused then: its memory would go stale). */
9
+ get held(): boolean;
10
+ /** Claims table `table` (its SQL name) for `claimant`; held by another: `invalid/args`. */
11
+ table(table: string, claimant: Claimant): void;
12
+ /** Claims the documents of `owner` in `namespace` for `claimant`; held by another: `invalid/args`. */
13
+ documents(owner: string, namespace: string, claimant: Claimant): void;
14
+ /** Throws as `table` would for `claimant`, claiming nothing (a reload's staging checks its declarations). */
15
+ assertTable(table: string, claimant: Claimant): void;
16
+ /** Throws as `documents` would for `claimant`, claiming nothing. */
17
+ assertDocuments(owner: string, namespace: string, claimant: Claimant): void;
18
+ /** Refuses every claim (`invalid/args`) until the returned unlock: a batch applies meanwhile. */
19
+ lock(): () => void;
20
+ /** Releases every claim `claimant` holds. */
21
+ release(claimant: Claimant): void;
22
+ }
23
+ //# sourceMappingURL=claims.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claims.d.ts","sourceRoot":"","sources":["../../../src/next/store/claims.ts"],"names":[],"mappings":"AAOA,gEAAgE;AAChE,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAElD,sDAAsD;AACtD,qBAAa,MAAM;;IAMlB,mGAAmG;IACnG,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,2FAA2F;IAC3F,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAE7C;IAED,sGAAsG;IACtG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAEpE;IAED,6GAA6G;IAC7G,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAEnD;IAED,oEAAoE;IACpE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAE1E;IAED,iGAAiG;IACjG,IAAI,IAAI,MAAM,IAAI,CAKjB;IAED,6CAA6C;IAC7C,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAGhC;CAkBD"}
@@ -0,0 +1,65 @@
1
+ // Claims (slice 6b "owner names and claims", "claims per table and per document namespace"): what can collide in a
2
+ // store is claimed once, in memory: a table by its SQL name, documents by `(owner, namespace)`. A claim is held by its
3
+ // claimant (an object, a `StoreStorage`) until its end releases every claim it holds. While a batch applies, nothing
4
+ // is claimed: batch apply and owners exclude each other both ways.
5
+ import { invalid } from "../data/internal.js";
6
+ /** A store's claims, by key; one claimant per key. */
7
+ export class Claims {
8
+ #holders = new Map();
9
+ #keys = new Map();
10
+ /** Whether a batch applies now: no claim is taken meanwhile. */
11
+ #locked = false;
12
+ /** Whether any claimant holds a claim (batch apply is refused then: its memory would go stale). */
13
+ get held() {
14
+ return this.#keys.size > 0;
15
+ }
16
+ /** Claims table `table` (its SQL name) for `claimant`; held by another: `invalid/args`. */
17
+ table(table, claimant) {
18
+ this.#claim(`table ${JSON.stringify(table)}`, claimant);
19
+ }
20
+ /** Claims the documents of `owner` in `namespace` for `claimant`; held by another: `invalid/args`. */
21
+ documents(owner, namespace, claimant) {
22
+ this.#claim(`documents ${JSON.stringify([owner, namespace])}`, claimant);
23
+ }
24
+ /** Throws as `table` would for `claimant`, claiming nothing (a reload's staging checks its declarations). */
25
+ assertTable(table, claimant) {
26
+ this.#assert(`table ${JSON.stringify(table)}`, claimant);
27
+ }
28
+ /** Throws as `documents` would for `claimant`, claiming nothing. */
29
+ assertDocuments(owner, namespace, claimant) {
30
+ this.#assert(`documents ${JSON.stringify([owner, namespace])}`, claimant);
31
+ }
32
+ /** Refuses every claim (`invalid/args`) until the returned unlock: a batch applies meanwhile. */
33
+ lock() {
34
+ this.#locked = true;
35
+ return () => {
36
+ this.#locked = false;
37
+ };
38
+ }
39
+ /** Releases every claim `claimant` holds. */
40
+ release(claimant) {
41
+ for (const key of this.#keys.get(claimant) ?? [])
42
+ this.#holders.delete(key);
43
+ this.#keys.delete(claimant);
44
+ }
45
+ #claim(key, claimant) {
46
+ this.#assert(key, claimant);
47
+ if (this.#holders.get(key) === claimant)
48
+ return;
49
+ this.#holders.set(key, claimant);
50
+ const keys = this.#keys.get(claimant);
51
+ if (keys === undefined)
52
+ this.#keys.set(claimant, [key]);
53
+ else
54
+ keys.push(key);
55
+ }
56
+ /** Refuses `key` to `claimant` while a batch applies or another claimant holds it. */
57
+ #assert(key, claimant) {
58
+ if (this.#locked)
59
+ throw invalid("args", `store: ${key} cannot be claimed while a batch applies`);
60
+ const holder = this.#holders.get(key);
61
+ if (holder !== undefined && holder !== claimant)
62
+ throw invalid("args", `store: ${key} is claimed by ${holder.label}`);
63
+ }
64
+ }
65
+ //# sourceMappingURL=claims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claims.js","sourceRoot":"","sources":["../../../src/next/store/claims.ts"],"names":[],"mappings":"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","sourcesContent":["// Claims (slice 6b \"owner names and claims\", \"claims per table and per document namespace\"): what can collide in a\n// store is claimed once, in memory: a table by its SQL name, documents by `(owner, namespace)`. A claim is held by its\n// claimant (an object, a `StoreStorage`) until its end releases every claim it holds. While a batch applies, nothing\n// is claimed: batch apply and owners exclude each other both ways.\n\nimport { invalid } from \"../data/internal.ts\";\n\n/** Who holds claims: named in the refusal of a second claim. */\nexport type Claimant = { readonly label: string };\n\n/** A store's claims, by key; one claimant per key. */\nexport class Claims {\n\treadonly #holders = new Map<string, Claimant>();\n\treadonly #keys = new Map<Claimant, string[]>();\n\t/** Whether a batch applies now: no claim is taken meanwhile. */\n\t#locked = false;\n\n\t/** Whether any claimant holds a claim (batch apply is refused then: its memory would go stale). */\n\tget held(): boolean {\n\t\treturn this.#keys.size > 0;\n\t}\n\n\t/** Claims table `table` (its SQL name) for `claimant`; held by another: `invalid/args`. */\n\ttable(table: string, claimant: Claimant): void {\n\t\tthis.#claim(`table ${JSON.stringify(table)}`, claimant);\n\t}\n\n\t/** Claims the documents of `owner` in `namespace` for `claimant`; held by another: `invalid/args`. */\n\tdocuments(owner: string, namespace: string, claimant: Claimant): void {\n\t\tthis.#claim(`documents ${JSON.stringify([owner, namespace])}`, claimant);\n\t}\n\n\t/** Throws as `table` would for `claimant`, claiming nothing (a reload's staging checks its declarations). */\n\tassertTable(table: string, claimant: Claimant): void {\n\t\tthis.#assert(`table ${JSON.stringify(table)}`, claimant);\n\t}\n\n\t/** Throws as `documents` would for `claimant`, claiming nothing. */\n\tassertDocuments(owner: string, namespace: string, claimant: Claimant): void {\n\t\tthis.#assert(`documents ${JSON.stringify([owner, namespace])}`, claimant);\n\t}\n\n\t/** Refuses every claim (`invalid/args`) until the returned unlock: a batch applies meanwhile. */\n\tlock(): () => void {\n\t\tthis.#locked = true;\n\t\treturn () => {\n\t\t\tthis.#locked = false;\n\t\t};\n\t}\n\n\t/** Releases every claim `claimant` holds. */\n\trelease(claimant: Claimant): void {\n\t\tfor (const key of this.#keys.get(claimant) ?? []) this.#holders.delete(key);\n\t\tthis.#keys.delete(claimant);\n\t}\n\n\t#claim(key: string, claimant: Claimant): void {\n\t\tthis.#assert(key, claimant);\n\t\tif (this.#holders.get(key) === claimant) return;\n\t\tthis.#holders.set(key, claimant);\n\t\tconst keys = this.#keys.get(claimant);\n\t\tif (keys === undefined) this.#keys.set(claimant, [key]);\n\t\telse keys.push(key);\n\t}\n\n\t/** Refuses `key` to `claimant` while a batch applies or another claimant holds it. */\n\t#assert(key: string, claimant: Claimant): void {\n\t\tif (this.#locked) throw invalid(\"args\", `store: ${key} cannot be claimed while a batch applies`);\n\t\tconst holder = this.#holders.get(key);\n\t\tif (holder !== undefined && holder !== claimant)\n\t\t\tthrow invalid(\"args\", `store: ${key} is claimed by ${holder.label}`);\n\t}\n}\n"]}
@@ -0,0 +1,77 @@
1
+ import type { BooleanSchema, IntegerSchema, NumberSchema, Schema, Static, StringSchema } from "../contracts/index.ts";
2
+ import { type Optional } from "../contracts/schema.ts";
3
+ import { JsonColumn, type JsonColumnSchema } from "./json-column.ts";
4
+ /** A schema a table column takes. */
5
+ export type ColumnSchema = ScalarSchema | JsonColumnSchema<unknown> | Optional<ScalarSchema | JsonColumnSchema<unknown>>;
6
+ type ScalarSchema = StringSchema | IntegerSchema | NumberSchema | BooleanSchema;
7
+ /** A table's `columns`: a flat record of column schemas. */
8
+ export type Columns = {
9
+ readonly [name: string]: ColumnSchema;
10
+ };
11
+ /** A column's type in the store. */
12
+ export type ColumnType = "str" | "int" | "num" | "bool" | "json";
13
+ /** The store type of column schema `S`. */
14
+ export type ColumnTypeOf<S> = S extends Optional<infer I> ? ColumnTypeOf<I> : S extends StringSchema ? "str" : S extends IntegerSchema ? "int" : S extends NumberSchema ? "num" : S extends BooleanSchema ? "bool" : "json";
15
+ /** The value type of column schema `S` (without `undefined` for an `opt(...)` one). */
16
+ export type ValueOf<S> = S extends Optional<infer I> ? ValueOf<I> : S extends Schema ? Static<S> : never;
17
+ /** The names of the columns that are not `opt(...)`. */
18
+ type RequiredNames<C extends Columns> = {
19
+ [K in keyof C]: C[K] extends Optional ? never : K;
20
+ }[keyof C];
21
+ /** The names of the columns with a declared default. */
22
+ type DefaultedNames<C extends Columns> = {
23
+ [K in keyof C]: C[K] extends {
24
+ readonly default: unknown;
25
+ } ? K : never;
26
+ }[keyof C];
27
+ /** A row as reads return it: every non-`opt` column, the `opt(...)` ones when not `NULL`. */
28
+ export type RowOf<C extends Columns> = {
29
+ [K in RequiredNames<C>]: ValueOf<C[K]>;
30
+ } & {
31
+ [K in Exclude<keyof C, RequiredNames<C>>]?: ValueOf<C[K]>;
32
+ };
33
+ /** A row as `put` takes it: as read, the columns with a default may be left out (rule 15). */
34
+ export type PutRowOf<C extends Columns> = {
35
+ [K in Exclude<RequiredNames<C>, DefaultedNames<C>>]: ValueOf<C[K]>;
36
+ } & {
37
+ [K in Exclude<keyof C, Exclude<RequiredNames<C>, DefaultedNames<C>>>]?: ValueOf<C[K]>;
38
+ };
39
+ /** The columns a key, an index or an `orderBy` may use: non-`opt` `str` or `int`. */
40
+ export type OrderColumn<C extends Columns> = {
41
+ [K in keyof C]: C[K] extends Optional ? never : C[K] extends StringSchema | IntegerSchema ? K : never;
42
+ }[keyof C] & string;
43
+ /** A column of the store: its name, type, nullability and default; a `json(...)` one with its definition. */
44
+ export type Column = {
45
+ readonly name: string;
46
+ readonly type: "str" | "int" | "num" | "bool";
47
+ readonly optional: boolean;
48
+ readonly default: string | number | boolean | undefined;
49
+ } | {
50
+ readonly name: string;
51
+ readonly type: "json";
52
+ readonly optional: boolean;
53
+ readonly json: JsonColumn;
54
+ };
55
+ /** A column as the `table` write records it (slice 6a §5): what a replica needs without the plugin's code. */
56
+ export type ColumnRecord = {
57
+ readonly type: ColumnType;
58
+ readonly optional?: true;
59
+ readonly default?: string | number | boolean;
60
+ /** A `json(...)` column's version and schema fingerprint. */
61
+ readonly version?: number;
62
+ readonly fingerprint?: string;
63
+ };
64
+ /** The column name rule (decision "Restricted names"). */
65
+ export declare const COLUMN_NAME: RegExp;
66
+ /**
67
+ * The columns of `columns` in declaration order, checked (declaration policy: JavaScript callers reach it): names
68
+ * `[A-Za-z_][A-Za-z0-9_]*` without two equal ignoring ASCII case, only the helpers' types, no bounds or patterns (a
69
+ * bulk `set` could not keep them), a default of the column's type and not on an `opt(...)` column.
70
+ */
71
+ export declare function describeColumns(columns: Columns, table: string): Column[];
72
+ /** Throws unless `name` follows the column name rule (declaration policy); `what` names the table or the edit. */
73
+ export declare function checkColumnName(name: string, what: string): void;
74
+ /** The record of `column` in the `table` write. */
75
+ export declare function columnRecord(column: Column): ColumnRecord;
76
+ export {};
77
+ //# sourceMappingURL=columns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns.d.ts","sourceRoot":"","sources":["../../../src/next/store/columns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ // Table columns (decisions "Flat columns", "Nullable columns and the `set` form", "Restricted names"): the restricted
2
+ // subset of L1's helpers a table's `columns` take (`str int num bool`, `opt(...)` of them, `json(...)`, defaults),
3
+ // their types for rows, keys and column references, and the column descriptors and records the store keeps.
4
+ import { isOptional } from "../contracts/schema.js";
5
+ import { JsonColumn } from "./json-column.js";
6
+ import { storedText } from "./text.js";
7
+ /** The column name rule (decision "Restricted names"). */
8
+ export const COLUMN_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
9
+ /**
10
+ * The columns of `columns` in declaration order, checked (declaration policy: JavaScript callers reach it): names
11
+ * `[A-Za-z_][A-Za-z0-9_]*` without two equal ignoring ASCII case, only the helpers' types, no bounds or patterns (a
12
+ * bulk `set` could not keep them), a default of the column's type and not on an `opt(...)` column.
13
+ */
14
+ export function describeColumns(columns, table) {
15
+ const seen = new Set();
16
+ return Object.entries(columns).map(([name, schema]) => {
17
+ checkColumnName(name, table);
18
+ const folded = name.toLowerCase();
19
+ if (seen.has(folded))
20
+ throw new Error(`${table}: column "${name}" differs from another only in case`);
21
+ seen.add(folded);
22
+ return describeColumn(name, schema, `${table}: column "${name}"`);
23
+ });
24
+ }
25
+ /** Throws unless `name` follows the column name rule (declaration policy); `what` names the table or the edit. */
26
+ export function checkColumnName(name, what) {
27
+ if (!COLUMN_NAME.test(name))
28
+ throw new Error(`${what}: column "${name}": expected [A-Za-z_][A-Za-z0-9_]*`);
29
+ }
30
+ const SCALAR_TYPES = {
31
+ string: "str",
32
+ integer: "int",
33
+ number: "num",
34
+ boolean: "bool",
35
+ };
36
+ function describeColumn(name, column, what) {
37
+ const optional = isOptional(column);
38
+ // Declaration policy: a JavaScript caller may pass any schema, so its fields are read as unknown data.
39
+ const fields = (optional ? column.schema : column);
40
+ const json = fields.json;
41
+ if (json instanceof JsonColumn)
42
+ return { name, type: "json", optional, json };
43
+ const type = SCALAR_TYPES[String(fields.type)];
44
+ if (type === undefined)
45
+ throw new Error(`${what}: expected str(), int(), num(), bool(), opt(...) or json(...)`);
46
+ for (const key of Object.keys(fields)) {
47
+ if (key !== "type" && key !== "default")
48
+ throw new Error(`${what}: "${key}" is not supported in a table column`);
49
+ }
50
+ const value = fields.default;
51
+ if (value !== undefined) {
52
+ if (optional)
53
+ throw new Error(`${what}: an opt(...) column has no default`);
54
+ checkDefault(type, value, what);
55
+ }
56
+ return { name, type, optional, default: value };
57
+ }
58
+ function checkDefault(type, value, what) {
59
+ const valid = type === "str"
60
+ ? typeof value === "string" && storedText(value, what) === value
61
+ : type === "int"
62
+ ? Number.isSafeInteger(value)
63
+ : type === "num"
64
+ ? typeof value === "number" && Number.isFinite(value)
65
+ : typeof value === "boolean";
66
+ if (!valid)
67
+ throw new Error(`${what}: the default ${JSON.stringify(value)} is not a ${type} value`);
68
+ }
69
+ /** The record of `column` in the `table` write. */
70
+ export function columnRecord(column) {
71
+ const optional = column.optional ? { optional: true } : {};
72
+ if (column.type === "json") {
73
+ return { type: "json", ...optional, version: column.json.version, fingerprint: column.json.fingerprint };
74
+ }
75
+ return { type: column.type, ...optional, ...(column.default === undefined ? {} : { default: column.default }) };
76
+ }
77
+ //# sourceMappingURL=columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"columns.js","sourceRoot":"","sources":["../../../src/next/store/columns.ts"],"names":[],"mappings":"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","sourcesContent":["// Table columns (decisions \"Flat columns\", \"Nullable columns and the `set` form\", \"Restricted names\"): the restricted\n// subset of L1's helpers a table's `columns` take (`str int num bool`, `opt(...)` of them, `json(...)`, defaults),\n// their types for rows, keys and column references, and the column descriptors and records the store keeps.\n\nimport type { BooleanSchema, IntegerSchema, NumberSchema, Schema, Static, StringSchema } from \"../contracts/index.ts\";\nimport { isOptional, type Optional } from \"../contracts/schema.ts\";\nimport { JsonColumn, type JsonColumnSchema } from \"./json-column.ts\";\nimport { storedText } from \"./text.ts\";\n\n/** A schema a table column takes. */\nexport type ColumnSchema =\n\t| ScalarSchema\n\t| JsonColumnSchema<unknown>\n\t| Optional<ScalarSchema | JsonColumnSchema<unknown>>;\n\ntype ScalarSchema = StringSchema | IntegerSchema | NumberSchema | BooleanSchema;\n\n/** A table's `columns`: a flat record of column schemas. */\nexport type Columns = { readonly [name: string]: ColumnSchema };\n\n/** A column's type in the store. */\nexport type ColumnType = \"str\" | \"int\" | \"num\" | \"bool\" | \"json\";\n\n/** The store type of column schema `S`. */\nexport type ColumnTypeOf<S> = S extends Optional<infer I>\n\t? ColumnTypeOf<I>\n\t: S extends StringSchema\n\t\t? \"str\"\n\t\t: S extends IntegerSchema\n\t\t\t? \"int\"\n\t\t\t: S extends NumberSchema\n\t\t\t\t? \"num\"\n\t\t\t\t: S extends BooleanSchema\n\t\t\t\t\t? \"bool\"\n\t\t\t\t\t: \"json\";\n\n/** The value type of column schema `S` (without `undefined` for an `opt(...)` one). */\nexport type ValueOf<S> = S extends Optional<infer I> ? ValueOf<I> : S extends Schema ? Static<S> : never;\n\n/** The names of the columns that are not `opt(...)`. */\ntype RequiredNames<C extends Columns> = { [K in keyof C]: C[K] extends Optional ? never : K }[keyof C];\n\n/** The names of the columns with a declared default. */\ntype DefaultedNames<C extends Columns> = {\n\t[K in keyof C]: C[K] extends { readonly default: unknown } ? K : never;\n}[keyof C];\n\n/** A row as reads return it: every non-`opt` column, the `opt(...)` ones when not `NULL`. */\nexport type RowOf<C extends Columns> = { [K in RequiredNames<C>]: ValueOf<C[K]> } & {\n\t[K in Exclude<keyof C, RequiredNames<C>>]?: ValueOf<C[K]>;\n};\n\n/** A row as `put` takes it: as read, the columns with a default may be left out (rule 15). */\nexport type PutRowOf<C extends Columns> = { [K in Exclude<RequiredNames<C>, DefaultedNames<C>>]: ValueOf<C[K]> } & {\n\t[K in Exclude<keyof C, Exclude<RequiredNames<C>, DefaultedNames<C>>>]?: ValueOf<C[K]>;\n};\n\n/** The columns a key, an index or an `orderBy` may use: non-`opt` `str` or `int`. */\nexport type OrderColumn<C extends Columns> = {\n\t[K in keyof C]: C[K] extends Optional ? never : C[K] extends StringSchema | IntegerSchema ? K : never;\n}[keyof C] &\n\tstring;\n\n/** A column of the store: its name, type, nullability and default; a `json(...)` one with its definition. */\nexport type Column =\n\t| {\n\t\t\treadonly name: string;\n\t\t\treadonly type: \"str\" | \"int\" | \"num\" | \"bool\";\n\t\t\treadonly optional: boolean;\n\t\t\treadonly default: string | number | boolean | undefined;\n\t }\n\t| { readonly name: string; readonly type: \"json\"; readonly optional: boolean; readonly json: JsonColumn };\n\n/** A column as the `table` write records it (slice 6a §5): what a replica needs without the plugin's code. */\nexport type ColumnRecord = {\n\treadonly type: ColumnType;\n\treadonly optional?: true;\n\treadonly default?: string | number | boolean;\n\t/** A `json(...)` column's version and schema fingerprint. */\n\treadonly version?: number;\n\treadonly fingerprint?: string;\n};\n\n/** The column name rule (decision \"Restricted names\"). */\nexport const COLUMN_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/**\n * The columns of `columns` in declaration order, checked (declaration policy: JavaScript callers reach it): names\n * `[A-Za-z_][A-Za-z0-9_]*` without two equal ignoring ASCII case, only the helpers' types, no bounds or patterns (a\n * bulk `set` could not keep them), a default of the column's type and not on an `opt(...)` column.\n */\nexport function describeColumns(columns: Columns, table: string): Column[] {\n\tconst seen = new Set<string>();\n\treturn Object.entries(columns).map(([name, schema]) => {\n\t\tcheckColumnName(name, table);\n\t\tconst folded = name.toLowerCase();\n\t\tif (seen.has(folded)) throw new Error(`${table}: column \"${name}\" differs from another only in case`);\n\t\tseen.add(folded);\n\t\treturn describeColumn(name, schema, `${table}: column \"${name}\"`);\n\t});\n}\n\n/** Throws unless `name` follows the column name rule (declaration policy); `what` names the table or the edit. */\nexport function checkColumnName(name: string, what: string): void {\n\tif (!COLUMN_NAME.test(name)) throw new Error(`${what}: column \"${name}\": expected [A-Za-z_][A-Za-z0-9_]*`);\n}\n\nconst SCALAR_TYPES: { readonly [type: string]: \"str\" | \"int\" | \"num\" | \"bool\" } = {\n\tstring: \"str\",\n\tinteger: \"int\",\n\tnumber: \"num\",\n\tboolean: \"bool\",\n};\n\nfunction describeColumn(name: string, column: ColumnSchema, what: string): Column {\n\tconst optional = isOptional(column);\n\t// Declaration policy: a JavaScript caller may pass any schema, so its fields are read as unknown data.\n\tconst fields = (optional ? column.schema : column) as { readonly [key: string]: unknown };\n\tconst json = fields.json;\n\tif (json instanceof JsonColumn) return { name, type: \"json\", optional, json };\n\tconst type = SCALAR_TYPES[String(fields.type)];\n\tif (type === undefined) throw new Error(`${what}: expected str(), int(), num(), bool(), opt(...) or json(...)`);\n\tfor (const key of Object.keys(fields)) {\n\t\tif (key !== \"type\" && key !== \"default\") throw new Error(`${what}: \"${key}\" is not supported in a table column`);\n\t}\n\tconst value = fields.default;\n\tif (value !== undefined) {\n\t\tif (optional) throw new Error(`${what}: an opt(...) column has no default`);\n\t\tcheckDefault(type, value, what);\n\t}\n\treturn { name, type, optional, default: value as string | number | boolean | undefined };\n}\n\nfunction checkDefault(type: \"str\" | \"int\" | \"num\" | \"bool\", value: unknown, what: string): void {\n\tconst valid =\n\t\ttype === \"str\"\n\t\t\t? typeof value === \"string\" && storedText(value, what) === value\n\t\t\t: type === \"int\"\n\t\t\t\t? Number.isSafeInteger(value)\n\t\t\t\t: type === \"num\"\n\t\t\t\t\t? typeof value === \"number\" && Number.isFinite(value)\n\t\t\t\t\t: typeof value === \"boolean\";\n\tif (!valid) throw new Error(`${what}: the default ${JSON.stringify(value)} is not a ${type} value`);\n}\n\n/** The record of `column` in the `table` write. */\nexport function columnRecord(column: Column): ColumnRecord {\n\tconst optional = column.optional ? { optional: true as const } : {};\n\tif (column.type === \"json\") {\n\t\treturn { type: \"json\", ...optional, version: column.json.version, fingerprint: column.json.fingerprint };\n\t}\n\treturn { type: column.type, ...optional, ...(column.default === undefined ? {} : { default: column.default }) };\n}\n"]}