@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 @@
1
+ {"version":3,"file":"declare.d.ts","sourceRoot":"","sources":["../../../src/next/contracts/declare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ // Declarations: `remote(...)` and `local(...)`, the checks every declared version passes, and the reading of
2
+ // untyped declaration input.
3
+ import { createContract, LOCAL, } from "./contract.js";
4
+ import { materialize } from "./fingerprint.js";
5
+ import { checkName } from "./names.js";
6
+ import { readParams } from "./params.js";
7
+ import { KeyedMember, Method } from "./schema.js";
8
+ import { snapshotArguments, snapshotSchema } from "./snapshot.js";
9
+ /** Declares a remote contract: per-principal variants of state and methods. */
10
+ export function remote(name, declaration) {
11
+ // Declaration policy: JavaScript callers reach every check below.
12
+ checkName(name, "A contract name");
13
+ checkKeys(declaration, ["version", "params", "hostAddress", "variants"], name);
14
+ const variants = entriesOf(declaration.variants, `${name}.variants`);
15
+ if (variants.length === 0)
16
+ throw new Error(`${name}.variants: at least one variant is required`);
17
+ const { hostAddress } = declaration;
18
+ if (typeof hostAddress !== "function")
19
+ throw new Error(`${name}.hostAddress: expected a function of the params`);
20
+ const read = variants.map(([variant, members]) => [variant, readVariant(members, `${name}.${variant}`)]);
21
+ // The host address gets the checked params of this contract.
22
+ return declare("remote", name, declaration, new Map(read), hostAddress);
23
+ }
24
+ /**
25
+ * Declares a local contract: one flat map of members, where a schema is state, `method(...)` a method and
26
+ * `keyed(schema)` a keyed state member.
27
+ */
28
+ export function local(name, declaration) {
29
+ // Declaration policy: JavaScript callers reach every check below.
30
+ checkName(name, "A contract name");
31
+ checkKeys(declaration, ["version", "params", "members"], name);
32
+ const state = new Map();
33
+ const methods = new Map();
34
+ const keyed = new Map();
35
+ for (const [member, value] of entriesOf(declaration.members, `${name}.${LOCAL}`)) {
36
+ const path = `${name}.${LOCAL}.${member}`;
37
+ if (value instanceof Method)
38
+ methods.set(member, readMethod(value, path));
39
+ else if (value instanceof KeyedMember)
40
+ keyed.set(member, snapshotSchema(value.schema, path));
41
+ else
42
+ state.set(member, snapshotSchema(value, path));
43
+ }
44
+ return declare("local", name, declaration, new Map([[LOCAL, { state, methods, keyed }]]));
45
+ }
46
+ function readVariant(source, path) {
47
+ checkKeys(source, ["state", "methods"], path);
48
+ const { state = {}, methods = {} } = source;
49
+ const stateEntries = entriesOf(state, `${path}.state`).map(([member, schema]) => {
50
+ if (schema instanceof Method)
51
+ throw new Error(`${path}.state.${member}: a method belongs in methods`);
52
+ if (schema instanceof KeyedMember) {
53
+ throw new Error(`${path}.state.${member}: keyed members are only in local contracts`);
54
+ }
55
+ return [member, snapshotSchema(schema, `${path}.state.${member}`)];
56
+ });
57
+ const methodEntries = entriesOf(methods, `${path}.methods`).map(([member, method]) => {
58
+ if (!(method instanceof Method))
59
+ throw new Error(`${path}.methods.${member}: expected method(...)`);
60
+ return [member, readMethod(method, `${path}.methods.${member}`)];
61
+ });
62
+ return { state: new Map(stateEntries), methods: new Map(methodEntries), keyed: new Map() };
63
+ }
64
+ /** One method declaration as Chord-owned snapshots; its arguments must be closed. */
65
+ export function readMethod(method, path) {
66
+ return {
67
+ args: snapshotArguments(method.args, `${path}.args`),
68
+ result: snapshotSchema(method.result, `${path}.result`),
69
+ };
70
+ }
71
+ function declare(kind, name, declaration, variants, hostAddress) {
72
+ const { version } = declaration;
73
+ if (!Number.isSafeInteger(version) || version < 1)
74
+ throw new Error(`${name}.version: expected a positive integer`);
75
+ const kinds = new Map();
76
+ checkMembers(variants, kinds, (variant, member, memberKind) => memberPath(name, kind, variant, member, memberKind));
77
+ const params = readParams(entriesOf(declaration.params, `${name}.params`), `${name}.params`);
78
+ const versions = [materialize(kind, params, version, variants, [])];
79
+ return createContract({ kind, name, params, hostAddress, versions, kinds });
80
+ }
81
+ /**
82
+ * Checks the members of every variant: a name keeps one kind across variants and the whole history (`kinds`, updated
83
+ * here), a method one signature across variants.
84
+ */
85
+ export function checkMembers(variants, kinds, path) {
86
+ const signatures = new Map();
87
+ for (const [variant, { state, methods, keyed }] of variants) {
88
+ for (const member of state.keys())
89
+ recordKind(kinds, member, "state", path(variant, member, "state"));
90
+ for (const member of keyed.keys())
91
+ recordKind(kinds, member, "keyed", path(variant, member, "keyed"));
92
+ for (const [member, { args, result }] of methods) {
93
+ recordKind(kinds, member, "method", path(variant, member, "method"));
94
+ const signature = JSON.stringify([args.normal, result.normal]);
95
+ if ((signatures.get(member) ?? signature) !== signature) {
96
+ throw new Error(`${path(variant, member, "method")}: a method has the same signature in every variant`);
97
+ }
98
+ signatures.set(member, signature);
99
+ }
100
+ }
101
+ }
102
+ function recordKind(kinds, member, kind, path) {
103
+ if (RESERVED_MEMBERS.has(member))
104
+ throw new Error(`${path}: "${member}" is reserved: a reference has it`);
105
+ const known = kinds.get(member);
106
+ if (known !== undefined && known !== kind) {
107
+ throw new Error(`${path}: "${member}" is a ${known} member; its kind never changes`);
108
+ }
109
+ kinds.set(member, kind);
110
+ }
111
+ /**
112
+ * Names a reference has itself (`release`, `variant`, and `state` and `retry` with failures), and `then`, which would
113
+ * make an awaited reference thenable.
114
+ */
115
+ const RESERVED_MEMBERS = new Set(["then", "release", "variant", "state", "retry"]);
116
+ /** The path of a member in errors: `notes.editor.methods.add`, `info.members.clear`. */
117
+ export function memberPath(base, kind, variant, member, memberKind) {
118
+ if (kind === "local")
119
+ return `${base}.${LOCAL}.${member}`;
120
+ return `${base}.${variant}.${memberKind === "state" ? "state" : "methods"}.${member}`;
121
+ }
122
+ /** Refuses a non-object and unknown keys. */
123
+ export function checkKeys(source, allowed, path) {
124
+ for (const [key] of entriesOf(source, path)) {
125
+ if (!allowed.includes(key))
126
+ throw new Error(`${path}: unknown key "${key}"`);
127
+ }
128
+ }
129
+ /** The entries of an object; anything else is refused. */
130
+ export function entriesOf(source, path) {
131
+ if (typeof source !== "object" || source === null || Array.isArray(source)) {
132
+ throw new Error(`${path}: expected an object`);
133
+ }
134
+ return Object.entries(source);
135
+ }
136
+ //# sourceMappingURL=declare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"declare.js","sourceRoot":"","sources":["../../../src/next/contracts/declare.ts"],"names":[],"mappings":"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","sourcesContent":["// Declarations: `remote(...)` and `local(...)`, the checks every declared version passes, and the reading of\n// untyped declaration input.\n\nimport {\n\ttype Contract,\n\tcreateContract,\n\ttype HostAddress,\n\ttype Kind,\n\tLOCAL,\n\ttype MemberKind,\n\ttype MethodData,\n\ttype VariantData,\n} from \"./contract.ts\";\nimport { materialize } from \"./fingerprint.ts\";\nimport type { MemberNames, MethodAt, VariantShape } from \"./history.ts\";\nimport type { Address } from \"./host-kind.ts\";\nimport { checkName } from \"./names.ts\";\nimport { type Params, type RequiredFields, readParams } from \"./params.ts\";\nimport { KeyedMember, Method, type Schema, type Static } from \"./schema.ts\";\nimport { type Snapshot, snapshotArguments, snapshotSchema } from \"./snapshot.ts\";\n\ntype VariantDeclaration = {\n\treadonly state?: { readonly [member: string]: Schema };\n\treadonly methods?: { readonly [member: string]: Method };\n};\n\ntype VariantDeclarations = { readonly [variant: string]: VariantDeclaration };\n\ntype RemoteVariants<D extends VariantDeclarations> = {\n\t[V in keyof D]: {\n\t\tstate: D[V][\"state\"] extends object ? D[V][\"state\"] : Record<never, never>;\n\t\tmethods: D[V][\"methods\"] extends object ? D[V][\"methods\"] : Record<never, never>;\n\t};\n};\n\ntype LocalVariants<M extends { readonly [member: string]: LocalMember }> = {\n\t[LOCAL]: {\n\t\tstate: { [K in keyof M as M[K] extends Method | KeyedMember ? never : K]: Exclude<M[K], Method | KeyedMember> };\n\t\tmethods: { [K in keyof M as M[K] extends Method ? K : never]: Extract<M[K], Method> };\n\t\tkeyed: { [K in keyof M as M[K] extends KeyedMember ? K : never]: SchemaOf<M[K]> };\n\t};\n};\n\n/** A local contract's member: a state schema, `method(...)` or `keyed(schema)`. */\ntype LocalMember = Schema | Method | KeyedMember;\n\ntype SchemaOf<M> = M extends KeyedMember<infer S> ? S : never;\n\n/** D11: a member name has one kind in every variant, a method one signature; no keyed members. */\ntype SameMembers<D extends VariantDeclarations, V extends { [variant: string]: VariantShape } = RemoteVariants<D>> = {\n\t[X in keyof D]: {\n\t\tstate?: {\n\t\t\t// Keyed members are only in local contracts (slice 6a §12).\n\t\t\t[M in keyof D[X][\"state\"]]: M extends MemberNames<V, \"methods\">\n\t\t\t\t? never\n\t\t\t\t: D[X][\"state\"][M] extends KeyedMember\n\t\t\t\t\t? never\n\t\t\t\t\t: D[X][\"state\"][M];\n\t\t};\n\t\tmethods?: {\n\t\t\t[M in keyof D[X][\"methods\"]]: M extends MemberNames<V, \"state\">\n\t\t\t\t? never\n\t\t\t\t: [MethodAt<V, M>] extends [D[X][\"methods\"][M]]\n\t\t\t\t\t? D[X][\"methods\"][M]\n\t\t\t\t\t: never;\n\t\t};\n\t};\n};\n\n/** Declares a remote contract: per-principal variants of state and methods. */\nexport function remote<\n\tconst N extends string,\n\tconst P extends Params,\n\tconst V extends number,\n\tconst D extends VariantDeclarations,\n>(\n\tname: N,\n\tdeclaration: {\n\t\treadonly version: V;\n\t\treadonly params: P & NoInfer<RequiredFields<P>>;\n\t\t/** The address of the host serving an object for these params; never part of the fingerprint. */\n\t\treadonly hostAddress: (params: { [F in keyof P]: Static<P[F]> }) => Address;\n\t\treadonly variants: D & NoInfer<SameMembers<D>>;\n\t},\n): Contract<{\n\tkind: \"remote\";\n\tname: N;\n\tparams: P;\n\thistory: [{ version: `${V}`; variants: RemoteVariants<D>; changes: never }];\n}> {\n\t// Declaration policy: JavaScript callers reach every check below.\n\tcheckName(name, \"A contract name\");\n\tcheckKeys(declaration, [\"version\", \"params\", \"hostAddress\", \"variants\"], name);\n\tconst variants = entriesOf(declaration.variants, `${name}.variants`);\n\tif (variants.length === 0) throw new Error(`${name}.variants: at least one variant is required`);\n\tconst { hostAddress } = declaration;\n\tif (typeof hostAddress !== \"function\") throw new Error(`${name}.hostAddress: expected a function of the params`);\n\tconst read = variants.map(([variant, members]) => [variant, readVariant(members, `${name}.${variant}`)] as const);\n\t// The host address gets the checked params of this contract.\n\treturn declare(\"remote\", name, declaration, new Map(read), hostAddress as HostAddress);\n}\n\n/**\n * Declares a local contract: one flat map of members, where a schema is state, `method(...)` a method and\n * `keyed(schema)` a keyed state member.\n */\nexport function local<\n\tconst N extends string,\n\tconst P extends Params,\n\tconst V extends number,\n\tconst M extends { readonly [member: string]: LocalMember },\n>(\n\tname: N,\n\tdeclaration: { readonly version: V; readonly params: P & NoInfer<RequiredFields<P>>; readonly members: M },\n): Contract<{\n\tkind: \"local\";\n\tname: N;\n\tparams: P;\n\thistory: [{ version: `${V}`; variants: LocalVariants<M>; changes: never }];\n}> {\n\t// Declaration policy: JavaScript callers reach every check below.\n\tcheckName(name, \"A contract name\");\n\tcheckKeys(declaration, [\"version\", \"params\", \"members\"], name);\n\tconst state = new Map<string, Snapshot>();\n\tconst methods = new Map<string, MethodData>();\n\tconst keyed = new Map<string, Snapshot>();\n\tfor (const [member, value] of entriesOf(declaration.members, `${name}.${LOCAL}`)) {\n\t\tconst path = `${name}.${LOCAL}.${member}`;\n\t\tif (value instanceof Method) methods.set(member, readMethod(value, path));\n\t\telse if (value instanceof KeyedMember) keyed.set(member, snapshotSchema(value.schema, path));\n\t\telse state.set(member, snapshotSchema(value, path));\n\t}\n\treturn declare(\"local\", name, declaration, new Map([[LOCAL, { state, methods, keyed }]]));\n}\n\nfunction readVariant(source: unknown, path: string): VariantData {\n\tcheckKeys(source, [\"state\", \"methods\"], path);\n\tconst { state = {}, methods = {} } = source as VariantDeclaration;\n\tconst stateEntries = entriesOf(state, `${path}.state`).map(([member, schema]) => {\n\t\tif (schema instanceof Method) throw new Error(`${path}.state.${member}: a method belongs in methods`);\n\t\tif (schema instanceof KeyedMember) {\n\t\t\tthrow new Error(`${path}.state.${member}: keyed members are only in local contracts`);\n\t\t}\n\t\treturn [member, snapshotSchema(schema, `${path}.state.${member}`)] as const;\n\t});\n\tconst methodEntries = entriesOf(methods, `${path}.methods`).map(([member, method]) => {\n\t\tif (!(method instanceof Method)) throw new Error(`${path}.methods.${member}: expected method(...)`);\n\t\treturn [member, readMethod(method, `${path}.methods.${member}`)] as const;\n\t});\n\treturn { state: new Map(stateEntries), methods: new Map(methodEntries), keyed: new Map() };\n}\n\n/** One method declaration as Chord-owned snapshots; its arguments must be closed. */\nexport function readMethod(method: Method, path: string): MethodData {\n\treturn {\n\t\targs: snapshotArguments(method.args, `${path}.args`),\n\t\tresult: snapshotSchema(method.result, `${path}.result`),\n\t};\n}\n\nfunction declare<C extends Contract>(\n\tkind: Kind,\n\tname: string,\n\tdeclaration: { readonly version: number; readonly params: unknown },\n\tvariants: ReadonlyMap<string, VariantData>,\n\thostAddress?: HostAddress,\n): C {\n\tconst { version } = declaration;\n\tif (!Number.isSafeInteger(version) || version < 1) throw new Error(`${name}.version: expected a positive integer`);\n\tconst kinds = new Map<string, MemberKind>();\n\tcheckMembers(variants, kinds, (variant, member, memberKind) => memberPath(name, kind, variant, member, memberKind));\n\tconst params = readParams(entriesOf(declaration.params, `${name}.params`), `${name}.params`);\n\tconst versions = [materialize(kind, params, version, variants, [])];\n\treturn createContract({ kind, name, params, hostAddress, versions, kinds });\n}\n\n/**\n * Checks the members of every variant: a name keeps one kind across variants and the whole history (`kinds`, updated\n * here), a method one signature across variants.\n */\nexport function checkMembers(\n\tvariants: ReadonlyMap<string, VariantData>,\n\tkinds: Map<string, MemberKind>,\n\tpath: (variant: string, member: string, kind: MemberKind) => string,\n): void {\n\tconst signatures = new Map<string, string>();\n\tfor (const [variant, { state, methods, keyed }] of variants) {\n\t\tfor (const member of state.keys()) recordKind(kinds, member, \"state\", path(variant, member, \"state\"));\n\t\tfor (const member of keyed.keys()) recordKind(kinds, member, \"keyed\", path(variant, member, \"keyed\"));\n\t\tfor (const [member, { args, result }] of methods) {\n\t\t\trecordKind(kinds, member, \"method\", path(variant, member, \"method\"));\n\t\t\tconst signature = JSON.stringify([args.normal, result.normal]);\n\t\t\tif ((signatures.get(member) ?? signature) !== signature) {\n\t\t\t\tthrow new Error(`${path(variant, member, \"method\")}: a method has the same signature in every variant`);\n\t\t\t}\n\t\t\tsignatures.set(member, signature);\n\t\t}\n\t}\n}\n\nfunction recordKind(kinds: Map<string, MemberKind>, member: string, kind: MemberKind, path: string): void {\n\tif (RESERVED_MEMBERS.has(member)) throw new Error(`${path}: \"${member}\" is reserved: a reference has it`);\n\tconst known = kinds.get(member);\n\tif (known !== undefined && known !== kind) {\n\t\tthrow new Error(`${path}: \"${member}\" is a ${known} member; its kind never changes`);\n\t}\n\tkinds.set(member, kind);\n}\n\n/**\n * Names a reference has itself (`release`, `variant`, and `state` and `retry` with failures), and `then`, which would\n * make an awaited reference thenable.\n */\nconst RESERVED_MEMBERS: ReadonlySet<string> = new Set([\"then\", \"release\", \"variant\", \"state\", \"retry\"]);\n\n/** The path of a member in errors: `notes.editor.methods.add`, `info.members.clear`. */\nexport function memberPath(base: string, kind: Kind, variant: string, member: string, memberKind: MemberKind): string {\n\tif (kind === \"local\") return `${base}.${LOCAL}.${member}`;\n\treturn `${base}.${variant}.${memberKind === \"state\" ? \"state\" : \"methods\"}.${member}`;\n}\n\n/** Refuses a non-object and unknown keys. */\nexport function checkKeys(source: unknown, allowed: readonly string[], path: string): void {\n\tfor (const [key] of entriesOf(source, path)) {\n\t\tif (!allowed.includes(key)) throw new Error(`${path}: unknown key \"${key}\"`);\n\t}\n}\n\n/** The entries of an object; anything else is refused. */\nexport function entriesOf(source: unknown, path: string): [string, unknown][] {\n\tif (typeof source !== \"object\" || source === null || Array.isArray(source)) {\n\t\tthrow new Error(`${path}: expected an object`);\n\t}\n\treturn Object.entries(source);\n}\n"]}
@@ -0,0 +1,92 @@
1
+ import { type Contract, type ContractShape, type CurrentVariants, type Kind, LOCAL, type ShapeOf } from "./contract.ts";
2
+ import type { Change, CurrentStep, Increment, MemberNames, MethodAt, Variants, VariantsWith } from "./history.ts";
3
+ import { Method, type Schema } from "./schema.ts";
4
+ /** Method edits, the same for both kinds: each changes the method in every variant that has it. */
5
+ interface MethodEditor<K extends Kind, V extends Variants, C extends Change> {
6
+ /** Type only: the variants after the edits so far. */
7
+ readonly "~variants"?: V;
8
+ /** Type only: the changes made by the edits so far. */
9
+ readonly "~changes"?: C;
10
+ args<M extends MemberNames<V, "methods">, A extends Schema>(member: M, args: A): Editor<K, Put<V, VariantsWith<V, M>, "methods", M, Method<A, MethodAt<V, M>["result"]>>, C | [VariantsWith<V, M>, M, "args"]>;
11
+ result<M extends MemberNames<V, "methods">, R extends Schema>(member: M, result: R): Editor<K, Put<V, VariantsWith<V, M>, "methods", M, Method<MethodAt<V, M>["args"], R>>, C | [VariantsWith<V, M>, M, "result"]>;
12
+ method<M extends MemberNames<V, "methods">, A extends Schema, R extends Schema>(member: M, args: A, result: R): Editor<K, Put<V, VariantsWith<V, M>, "methods", M, Method<A, R>>, C | [VariantsWith<V, M>, M, "args" | "result"]>;
13
+ removeMethod<M extends MemberNames<V, "methods">>(member: M): Editor<K, Drop<V, keyof V, "methods", M>, C>;
14
+ }
15
+ /** Edits of a remote contract. */
16
+ interface RemoteEditor<V extends Variants, C extends Change> extends MethodEditor<"remote", V, C> {
17
+ state<X extends keyof V & string, M extends keyof V[X]["state"] & string, S extends Schema>(variant: X, member: M, schema: S): RemoteEditor<Put<V, X, "state", M, S>, C | [X, M, "state"]>;
18
+ addState<X extends keyof V & string, const M extends string, S extends Schema>(variant: X, member: M, schema: S): RemoteEditor<Put<V, X, "state", M, S>, C | [X, M, "state"]>;
19
+ removeState<X extends keyof V & string, M extends keyof V[X]["state"] & string>(variant: X, member: M): RemoteEditor<Drop<V, X, "state", M>, C>;
20
+ addMethod<X extends keyof V & string, const M extends string, A extends Schema, R extends Schema>(variant: X, member: M, args: A, result: R): RemoteEditor<Put<V, X, "methods", M, Method<A, R>>, C | [X, M, "args" | "result"]>;
21
+ }
22
+ /** Edits of a local contract: like remote ones, without a variant. */
23
+ interface LocalEditor<V extends Variants, C extends Change> extends MethodEditor<"local", V, C> {
24
+ state<M extends keyof V[Local]["state"] & string, S extends Schema>(member: M, schema: S): LocalEditor<Put<V, Local, "state", M, S>, C | [Local, M, "state"]>;
25
+ addState<const M extends string, S extends Schema>(member: M, schema: S): LocalEditor<Put<V, Local, "state", M, S>, C | [Local, M, "state"]>;
26
+ removeState<M extends keyof V[Local]["state"] & string>(member: M): LocalEditor<Drop<V, Local, "state", M>, C>;
27
+ addMethod<const M extends string, A extends Schema, R extends Schema>(member: M, args: A, result: R): LocalEditor<Put<V, Local, "methods", M, Method<A, R>>, C | [Local, M, "args" | "result"]>;
28
+ /** Changes keyed member `member`'s schema (slice 7b: an older consumer reads each key mapped, or is refused). */
29
+ keyed<M extends KeyedNames<V> & string, S extends Schema>(member: M, schema: S): LocalEditor<PutKeyed<V, M, S>, C | [Local, M, "keyed"]>;
30
+ addKeyed<const M extends string, S extends Schema>(member: M, schema: S): LocalEditor<PutKeyed<V, M, S>, C | [Local, M, "keyed"]>;
31
+ removeKeyed<M extends KeyedNames<V> & string>(member: M): LocalEditor<DropKeyed<V, M>, C>;
32
+ }
33
+ /** The local variant's keyed member names. */
34
+ type KeyedNames<V extends Variants> = keyof NonNullable<V[Local]["keyed"]>;
35
+ /** The local variant with keyed member `M` set to `T`. */
36
+ type PutKeyed<V extends Variants, M extends string, T> = {
37
+ [Y in keyof V]: Y extends Local ? {
38
+ [S in keyof V[Y] | "keyed"]: S extends "keyed" ? {
39
+ [K in keyof NonNullable<V[Y]["keyed"]> | M]: K extends M ? T : NonNullable<V[Y]["keyed"]>[K];
40
+ } : V[Y][S & keyof V[Y]];
41
+ } : V[Y];
42
+ };
43
+ /** The local variant without keyed member `M`. */
44
+ type DropKeyed<V extends Variants, M extends string> = {
45
+ [Y in keyof V]: Y extends Local ? {
46
+ [S in keyof V[Y]]: S extends "keyed" ? Omit<NonNullable<V[Y]["keyed"]>, M> : V[Y][S];
47
+ } : V[Y];
48
+ };
49
+ type Local = typeof LOCAL;
50
+ type Editor<K extends Kind, V extends Variants, C extends Change> = K extends "remote" ? RemoteEditor<V, C> : LocalEditor<V, C>;
51
+ type EditorOf<C extends Contract> = Editor<ShapeOf<C>["kind"], CurrentVariants<C>, never>;
52
+ /** Variants `X` with member `M` of `Side` set to `T`. */
53
+ type Put<V extends Variants, X, Side extends EditedSide, M extends string, T> = {
54
+ [Y in keyof V]: Y extends X ? {
55
+ [S in keyof V[Y]]: S extends Side ? {
56
+ [K in keyof V[Y][S] | M]: K extends M ? T : V[Y][S][K];
57
+ } : V[Y][S];
58
+ } : V[Y];
59
+ };
60
+ /** Variants `X` without member `M` of `Side`. */
61
+ type Drop<V extends Variants, X, Side extends EditedSide, M extends string> = {
62
+ [Y in keyof V]: Y extends X ? {
63
+ [S in keyof V[Y]]: S extends Side ? Omit<V[Y][S], M> : V[Y][S];
64
+ } : V[Y];
65
+ };
66
+ /** The sides of a variant that `Put` and `Drop` edit (keyed members have their own, `PutKeyed` and `DropKeyed`). */
67
+ type EditedSide = "state" | "methods";
68
+ type Evolved<S extends ContractShape, E extends MethodEditor<S["kind"], Variants, Change>> = {
69
+ kind: S["kind"];
70
+ name: S["name"];
71
+ params: S["params"];
72
+ history: [
73
+ ...S["history"],
74
+ {
75
+ version: Increment<CurrentStep<S["history"]>["version"]>;
76
+ variants: NonNullable<E["~variants"]>;
77
+ changes: NonNullable<E["~changes"]>;
78
+ }
79
+ ];
80
+ };
81
+ /**
82
+ * Appends the next version (`previous.version + 1`) with the edits `edit` makes; `edit` must return the editor it was
83
+ * given. Params and the variant set never change: a change to either is a new history base.
84
+ */
85
+ export declare function evolve<C extends Contract, E extends MethodEditor<ShapeOf<C>["kind"], Variants, Change>>(previous: C, edit: (editor: EditorOf<C>) => E): Contract<Evolved<ShapeOf<C>, E>>;
86
+ /**
87
+ * Runs `edit` on `editor` (contracts' and tables' rule): an edit returning anything but the editor it was given throws
88
+ * (`what` names the call).
89
+ */
90
+ export declare function editWith<E>(editor: E, edit: (editor: E) => unknown, what: string): void;
91
+ export {};
92
+ //# sourceMappingURL=evolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evolve.d.ts","sourceRoot":"","sources":["../../../src/next/contracts/evolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ // Evolution: `evolve(previous, (e) => e...)` appends the next version of a history with structured edits.
2
+ import { contractData, createContract, LOCAL, } from "./contract.js";
3
+ import { checkMembers, memberPath, readMethod } from "./declare.js";
4
+ import { materialize } from "./fingerprint.js";
5
+ import { Method } from "./schema.js";
6
+ import { snapshotArguments, snapshotSchema } from "./snapshot.js";
7
+ /**
8
+ * Appends the next version (`previous.version + 1`) with the edits `edit` makes; `edit` must return the editor it was
9
+ * given. Params and the variant set never change: a change to either is a new history base.
10
+ */
11
+ export function evolve(previous, edit) {
12
+ const draft = new Draft(contractData(previous));
13
+ const editor = draft.kind === "local" ? localEditor(draft) : draft;
14
+ // The editor interfaces track the edits in the types; at runtime every edit returns the same editor.
15
+ editWith(editor, edit, `${draft.path}: evolve`);
16
+ return createContract(draft.next());
17
+ }
18
+ /**
19
+ * Runs `edit` on `editor` (contracts' and tables' rule): an edit returning anything but the editor it was given throws
20
+ * (`what` names the call).
21
+ */
22
+ export function editWith(editor, edit, what) {
23
+ if (edit(editor) !== editor)
24
+ throw new Error(`${what} must return the editor it was given`);
25
+ }
26
+ /** The next version under construction, and the remote editor. Every edit is checked as it is made. */
27
+ class Draft {
28
+ kind;
29
+ path;
30
+ /** What edits return: the draft itself, or the local editor wrapping it. */
31
+ editor = this;
32
+ #data;
33
+ #version;
34
+ #variants;
35
+ #kinds;
36
+ #changes = [];
37
+ constructor(data) {
38
+ const current = data.versions.at(-1);
39
+ this.kind = data.kind;
40
+ this.#data = data;
41
+ this.#version = current.version + 1;
42
+ this.path = `${data.name} v${this.#version}`;
43
+ this.#variants = new Map([...current.variants].map(([name, { state, methods, keyed }]) => [
44
+ name,
45
+ { state: new Map(state), methods: new Map(methods), keyed: new Map(keyed) },
46
+ ]));
47
+ this.#kinds = new Map(data.kinds);
48
+ }
49
+ state(variant, member, schema) {
50
+ if (!this.#variant(variant).state.has(member)) {
51
+ throw new Error(`${this.#path(variant, member, "state")}: no such state member`);
52
+ }
53
+ return this.#putState(variant, member, schema);
54
+ }
55
+ addState(variant, member, schema) {
56
+ this.#refuseDeclared(variant, member, "state");
57
+ return this.#putState(variant, member, schema);
58
+ }
59
+ removeState(variant, member) {
60
+ if (!this.#variant(variant).state.delete(member)) {
61
+ throw new Error(`${this.#path(variant, member, "state")}: no such state member`);
62
+ }
63
+ return this.editor;
64
+ }
65
+ args(member, args) {
66
+ return this.#changeMethod(member, args, undefined);
67
+ }
68
+ result(member, result) {
69
+ return this.#changeMethod(member, undefined, result);
70
+ }
71
+ method(member, args, result) {
72
+ return this.#changeMethod(member, args, result);
73
+ }
74
+ addMethod(variant, member, args, result) {
75
+ this.#refuseDeclared(variant, member, "method");
76
+ this.#variant(variant).methods.set(member, readMethod(new Method(args, result), this.#path(variant, member, "method")));
77
+ this.#changes.push([variant, member, "args"], [variant, member, "result"]);
78
+ return this.#checked();
79
+ }
80
+ keyed(variant, member, schema) {
81
+ if (!this.#variant(variant).keyed.has(member)) {
82
+ throw new Error(`${this.#path(variant, member, "keyed")}: no such keyed member`);
83
+ }
84
+ return this.#putKeyed(variant, member, schema);
85
+ }
86
+ addKeyed(variant, member, schema) {
87
+ this.#refuseDeclared(variant, member, "keyed");
88
+ return this.#putKeyed(variant, member, schema);
89
+ }
90
+ removeKeyed(variant, member) {
91
+ if (!this.#variant(variant).keyed.delete(member)) {
92
+ throw new Error(`${this.#path(variant, member, "keyed")}: no such keyed member`);
93
+ }
94
+ return this.editor;
95
+ }
96
+ removeMethod(member) {
97
+ for (const variant of this.#variantsWith(member))
98
+ this.#variant(variant).methods.delete(member);
99
+ return this.editor;
100
+ }
101
+ /** The contract data with this version appended. */
102
+ next() {
103
+ const { kind, params, versions } = this.#data;
104
+ const version = materialize(kind, params, this.#version, this.#variants, this.#changes);
105
+ return { ...this.#data, versions: [...versions, version], kinds: this.#kinds };
106
+ }
107
+ #putState(variant, member, schema) {
108
+ this.#variant(variant).state.set(member, snapshotSchema(schema, this.#path(variant, member, "state")));
109
+ this.#changes.push([variant, member, "state"]);
110
+ return this.#checked();
111
+ }
112
+ #putKeyed(variant, member, schema) {
113
+ this.#variant(variant).keyed.set(member, snapshotSchema(schema, this.#path(variant, member, "keyed")));
114
+ this.#changes.push([variant, member, "keyed"]);
115
+ return this.#checked();
116
+ }
117
+ /** Changes the given sides of a method in every variant that has it. */
118
+ #changeMethod(member, args, result) {
119
+ const variants = this.#variantsWith(member);
120
+ const path = this.#path(variants[0], member, "method");
121
+ const newArgs = args === undefined ? undefined : snapshotArguments(args, `${path}.args`);
122
+ const newResult = result === undefined ? undefined : snapshotSchema(result, `${path}.result`);
123
+ for (const variant of variants) {
124
+ const { methods } = this.#variant(variant);
125
+ const old = methods.get(member);
126
+ methods.set(member, { args: newArgs ?? old.args, result: newResult ?? old.result });
127
+ if (newArgs !== undefined)
128
+ this.#changes.push([variant, member, "args"]);
129
+ if (newResult !== undefined)
130
+ this.#changes.push([variant, member, "result"]);
131
+ }
132
+ return this.#checked();
133
+ }
134
+ #variant(variant) {
135
+ const found = this.#variants.get(variant);
136
+ if (found === undefined) {
137
+ throw new Error(`${this.path}.${variant}: unknown variant (the variant set never changes)`);
138
+ }
139
+ return found;
140
+ }
141
+ #variantsWith(member) {
142
+ const variants = [...this.#variants].filter(([, { methods }]) => methods.has(member)).map(([variant]) => variant);
143
+ if (variants.length === 0)
144
+ throw new Error(`${this.path}: no method "${member}"`);
145
+ return variants;
146
+ }
147
+ #refuseDeclared(variant, member, kind) {
148
+ const { state, methods, keyed } = this.#variant(variant);
149
+ if (state.has(member) || methods.has(member) || keyed.has(member)) {
150
+ throw new Error(`${this.#path(variant, member, kind)}: already declared`);
151
+ }
152
+ }
153
+ #path(variant, member, kind) {
154
+ return memberPath(this.path, this.kind, variant, member, kind);
155
+ }
156
+ /** A member's kind never changes, also not after a removal; a method keeps one signature across variants. */
157
+ #checked() {
158
+ checkMembers(this.#variants, this.#kinds, (variant, member, kind) => this.#path(variant, member, kind));
159
+ return this.editor;
160
+ }
161
+ }
162
+ /** The local editor: the draft's edits with the variant filled in. */
163
+ function localEditor(draft) {
164
+ draft.editor = {
165
+ state: (member, schema) => draft.state(LOCAL, member, schema),
166
+ addState: (member, schema) => draft.addState(LOCAL, member, schema),
167
+ removeState: (member) => draft.removeState(LOCAL, member),
168
+ addMethod: (member, args, result) => draft.addMethod(LOCAL, member, args, result),
169
+ args: (member, args) => draft.args(member, args),
170
+ result: (member, result) => draft.result(member, result),
171
+ method: (member, args, result) => draft.method(member, args, result),
172
+ removeMethod: (member) => draft.removeMethod(member),
173
+ keyed: (member, schema) => draft.keyed(LOCAL, member, schema),
174
+ addKeyed: (member, schema) => draft.addKeyed(LOCAL, member, schema),
175
+ removeKeyed: (member) => draft.removeKeyed(LOCAL, member),
176
+ };
177
+ return draft.editor;
178
+ }
179
+ //# sourceMappingURL=evolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evolve.js","sourceRoot":"","sources":["../../../src/next/contracts/evolve.ts"],"names":[],"mappings":"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","sourcesContent":["// Evolution: `evolve(previous, (e) => e...)` appends the next version of a history with structured edits.\n\nimport {\n\ttype Contract,\n\ttype ContractData,\n\ttype ContractShape,\n\ttype CurrentVariants,\n\tcontractData,\n\tcreateContract,\n\ttype Kind,\n\tLOCAL,\n\ttype MemberKind,\n\ttype MethodData,\n\ttype ShapeOf,\n} from \"./contract.ts\";\nimport { checkMembers, memberPath, readMethod } from \"./declare.ts\";\nimport { materialize } from \"./fingerprint.ts\";\nimport type { Change, CurrentStep, Increment, MemberNames, MethodAt, Variants, VariantsWith } from \"./history.ts\";\nimport { Method, type Schema } from \"./schema.ts\";\nimport { type Snapshot, snapshotArguments, snapshotSchema } from \"./snapshot.ts\";\n\n/** Method edits, the same for both kinds: each changes the method in every variant that has it. */\ninterface MethodEditor<K extends Kind, V extends Variants, C extends Change> {\n\t/** Type only: the variants after the edits so far. */\n\treadonly \"~variants\"?: V;\n\t/** Type only: the changes made by the edits so far. */\n\treadonly \"~changes\"?: C;\n\targs<M extends MemberNames<V, \"methods\">, A extends Schema>(\n\t\tmember: M,\n\t\targs: A,\n\t): Editor<\n\t\tK,\n\t\tPut<V, VariantsWith<V, M>, \"methods\", M, Method<A, MethodAt<V, M>[\"result\"]>>,\n\t\tC | [VariantsWith<V, M>, M, \"args\"]\n\t>;\n\tresult<M extends MemberNames<V, \"methods\">, R extends Schema>(\n\t\tmember: M,\n\t\tresult: R,\n\t): Editor<\n\t\tK,\n\t\tPut<V, VariantsWith<V, M>, \"methods\", M, Method<MethodAt<V, M>[\"args\"], R>>,\n\t\tC | [VariantsWith<V, M>, M, \"result\"]\n\t>;\n\tmethod<M extends MemberNames<V, \"methods\">, A extends Schema, R extends Schema>(\n\t\tmember: M,\n\t\targs: A,\n\t\tresult: R,\n\t): Editor<K, Put<V, VariantsWith<V, M>, \"methods\", M, Method<A, R>>, C | [VariantsWith<V, M>, M, \"args\" | \"result\"]>;\n\tremoveMethod<M extends MemberNames<V, \"methods\">>(member: M): Editor<K, Drop<V, keyof V, \"methods\", M>, C>;\n}\n\n/** Edits of a remote contract. */\ninterface RemoteEditor<V extends Variants, C extends Change> extends MethodEditor<\"remote\", V, C> {\n\tstate<X extends keyof V & string, M extends keyof V[X][\"state\"] & string, S extends Schema>(\n\t\tvariant: X,\n\t\tmember: M,\n\t\tschema: S,\n\t): RemoteEditor<Put<V, X, \"state\", M, S>, C | [X, M, \"state\"]>;\n\taddState<X extends keyof V & string, const M extends string, S extends Schema>(\n\t\tvariant: X,\n\t\tmember: M,\n\t\tschema: S,\n\t): RemoteEditor<Put<V, X, \"state\", M, S>, C | [X, M, \"state\"]>;\n\tremoveState<X extends keyof V & string, M extends keyof V[X][\"state\"] & string>(\n\t\tvariant: X,\n\t\tmember: M,\n\t): RemoteEditor<Drop<V, X, \"state\", M>, C>;\n\taddMethod<X extends keyof V & string, const M extends string, A extends Schema, R extends Schema>(\n\t\tvariant: X,\n\t\tmember: M,\n\t\targs: A,\n\t\tresult: R,\n\t): RemoteEditor<Put<V, X, \"methods\", M, Method<A, R>>, C | [X, M, \"args\" | \"result\"]>;\n}\n\n/** Edits of a local contract: like remote ones, without a variant. */\ninterface LocalEditor<V extends Variants, C extends Change> extends MethodEditor<\"local\", V, C> {\n\tstate<M extends keyof V[Local][\"state\"] & string, S extends Schema>(\n\t\tmember: M,\n\t\tschema: S,\n\t): LocalEditor<Put<V, Local, \"state\", M, S>, C | [Local, M, \"state\"]>;\n\taddState<const M extends string, S extends Schema>(\n\t\tmember: M,\n\t\tschema: S,\n\t): LocalEditor<Put<V, Local, \"state\", M, S>, C | [Local, M, \"state\"]>;\n\tremoveState<M extends keyof V[Local][\"state\"] & string>(member: M): LocalEditor<Drop<V, Local, \"state\", M>, C>;\n\taddMethod<const M extends string, A extends Schema, R extends Schema>(\n\t\tmember: M,\n\t\targs: A,\n\t\tresult: R,\n\t): LocalEditor<Put<V, Local, \"methods\", M, Method<A, R>>, C | [Local, M, \"args\" | \"result\"]>;\n\t/** Changes keyed member `member`'s schema (slice 7b: an older consumer reads each key mapped, or is refused). */\n\tkeyed<M extends KeyedNames<V> & string, S extends Schema>(\n\t\tmember: M,\n\t\tschema: S,\n\t): LocalEditor<PutKeyed<V, M, S>, C | [Local, M, \"keyed\"]>;\n\taddKeyed<const M extends string, S extends Schema>(\n\t\tmember: M,\n\t\tschema: S,\n\t): LocalEditor<PutKeyed<V, M, S>, C | [Local, M, \"keyed\"]>;\n\tremoveKeyed<M extends KeyedNames<V> & string>(member: M): LocalEditor<DropKeyed<V, M>, C>;\n}\n\n/** The local variant's keyed member names. */\ntype KeyedNames<V extends Variants> = keyof NonNullable<V[Local][\"keyed\"]>;\n\n/** The local variant with keyed member `M` set to `T`. */\ntype PutKeyed<V extends Variants, M extends string, T> = {\n\t[Y in keyof V]: Y extends Local\n\t\t? {\n\t\t\t\t[S in keyof V[Y] | \"keyed\"]: S extends \"keyed\"\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t[K in keyof NonNullable<V[Y][\"keyed\"]> | M]: K extends M ? T : NonNullable<V[Y][\"keyed\"]>[K];\n\t\t\t\t\t\t}\n\t\t\t\t\t: V[Y][S & keyof V[Y]];\n\t\t\t}\n\t\t: V[Y];\n};\n\n/** The local variant without keyed member `M`. */\ntype DropKeyed<V extends Variants, M extends string> = {\n\t[Y in keyof V]: Y extends Local\n\t\t? { [S in keyof V[Y]]: S extends \"keyed\" ? Omit<NonNullable<V[Y][\"keyed\"]>, M> : V[Y][S] }\n\t\t: V[Y];\n};\n\ntype Local = typeof LOCAL;\n\ntype Editor<K extends Kind, V extends Variants, C extends Change> = K extends \"remote\"\n\t? RemoteEditor<V, C>\n\t: LocalEditor<V, C>;\n\ntype EditorOf<C extends Contract> = Editor<ShapeOf<C>[\"kind\"], CurrentVariants<C>, never>;\n\n/** Variants `X` with member `M` of `Side` set to `T`. */\ntype Put<V extends Variants, X, Side extends EditedSide, M extends string, T> = {\n\t[Y in keyof V]: Y extends X\n\t\t? {\n\t\t\t\t[S in keyof V[Y]]: S extends Side ? { [K in keyof V[Y][S] | M]: K extends M ? T : V[Y][S][K] } : V[Y][S];\n\t\t\t}\n\t\t: V[Y];\n};\n\n/** Variants `X` without member `M` of `Side`. */\ntype Drop<V extends Variants, X, Side extends EditedSide, M extends string> = {\n\t[Y in keyof V]: Y extends X ? { [S in keyof V[Y]]: S extends Side ? Omit<V[Y][S], M> : V[Y][S] } : V[Y];\n};\n\n/** The sides of a variant that `Put` and `Drop` edit (keyed members have their own, `PutKeyed` and `DropKeyed`). */\ntype EditedSide = \"state\" | \"methods\";\n\ntype Evolved<S extends ContractShape, E extends MethodEditor<S[\"kind\"], Variants, Change>> = {\n\tkind: S[\"kind\"];\n\tname: S[\"name\"];\n\tparams: S[\"params\"];\n\thistory: [\n\t\t...S[\"history\"],\n\t\t{\n\t\t\tversion: Increment<CurrentStep<S[\"history\"]>[\"version\"]>;\n\t\t\tvariants: NonNullable<E[\"~variants\"]>;\n\t\t\tchanges: NonNullable<E[\"~changes\"]>;\n\t\t},\n\t];\n};\n\n/**\n * Appends the next version (`previous.version + 1`) with the edits `edit` makes; `edit` must return the editor it was\n * given. Params and the variant set never change: a change to either is a new history base.\n */\nexport function evolve<C extends Contract, E extends MethodEditor<ShapeOf<C>[\"kind\"], Variants, Change>>(\n\tprevious: C,\n\tedit: (editor: EditorOf<C>) => E,\n): Contract<Evolved<ShapeOf<C>, E>> {\n\tconst draft = new Draft(contractData(previous));\n\tconst editor = draft.kind === \"local\" ? localEditor(draft) : draft;\n\t// The editor interfaces track the edits in the types; at runtime every edit returns the same editor.\n\teditWith(editor as unknown as EditorOf<C>, edit, `${draft.path}: evolve`);\n\treturn createContract(draft.next());\n}\n\n/**\n * Runs `edit` on `editor` (contracts' and tables' rule): an edit returning anything but the editor it was given throws\n * (`what` names the call).\n */\nexport function editWith<E>(editor: E, edit: (editor: E) => unknown, what: string): void {\n\tif (edit(editor) !== editor) throw new Error(`${what} must return the editor it was given`);\n}\n\n/** A variant under construction. */\ntype DraftVariant = {\n\treadonly state: Map<string, Snapshot>;\n\treadonly methods: Map<string, MethodData>;\n\treadonly keyed: Map<string, Snapshot>;\n};\n\n/** The next version under construction, and the remote editor. Every edit is checked as it is made. */\nclass Draft {\n\treadonly kind: Kind;\n\treadonly path: string;\n\t/** What edits return: the draft itself, or the local editor wrapping it. */\n\teditor: object = this;\n\treadonly #data: ContractData;\n\treadonly #version: number;\n\treadonly #variants: Map<string, DraftVariant>;\n\treadonly #kinds: Map<string, MemberKind>;\n\treadonly #changes: Change[] = [];\n\n\tconstructor(data: ContractData) {\n\t\tconst current = data.versions.at(-1)!;\n\t\tthis.kind = data.kind;\n\t\tthis.#data = data;\n\t\tthis.#version = current.version + 1;\n\t\tthis.path = `${data.name} v${this.#version}`;\n\t\tthis.#variants = new Map(\n\t\t\t[...current.variants].map(([name, { state, methods, keyed }]) => [\n\t\t\t\tname,\n\t\t\t\t{ state: new Map(state), methods: new Map(methods), keyed: new Map(keyed) },\n\t\t\t]),\n\t\t);\n\t\tthis.#kinds = new Map(data.kinds);\n\t}\n\n\tstate(variant: string, member: string, schema: Schema): object {\n\t\tif (!this.#variant(variant).state.has(member)) {\n\t\t\tthrow new Error(`${this.#path(variant, member, \"state\")}: no such state member`);\n\t\t}\n\t\treturn this.#putState(variant, member, schema);\n\t}\n\n\taddState(variant: string, member: string, schema: Schema): object {\n\t\tthis.#refuseDeclared(variant, member, \"state\");\n\t\treturn this.#putState(variant, member, schema);\n\t}\n\n\tremoveState(variant: string, member: string): object {\n\t\tif (!this.#variant(variant).state.delete(member)) {\n\t\t\tthrow new Error(`${this.#path(variant, member, \"state\")}: no such state member`);\n\t\t}\n\t\treturn this.editor;\n\t}\n\n\targs(member: string, args: Schema): object {\n\t\treturn this.#changeMethod(member, args, undefined);\n\t}\n\n\tresult(member: string, result: Schema): object {\n\t\treturn this.#changeMethod(member, undefined, result);\n\t}\n\n\tmethod(member: string, args: Schema, result: Schema): object {\n\t\treturn this.#changeMethod(member, args, result);\n\t}\n\n\taddMethod(variant: string, member: string, args: Schema, result: Schema): object {\n\t\tthis.#refuseDeclared(variant, member, \"method\");\n\t\tthis.#variant(variant).methods.set(\n\t\t\tmember,\n\t\t\treadMethod(new Method(args, result), this.#path(variant, member, \"method\")),\n\t\t);\n\t\tthis.#changes.push([variant, member, \"args\"], [variant, member, \"result\"]);\n\t\treturn this.#checked();\n\t}\n\n\tkeyed(variant: string, member: string, schema: Schema): object {\n\t\tif (!this.#variant(variant).keyed.has(member)) {\n\t\t\tthrow new Error(`${this.#path(variant, member, \"keyed\")}: no such keyed member`);\n\t\t}\n\t\treturn this.#putKeyed(variant, member, schema);\n\t}\n\n\taddKeyed(variant: string, member: string, schema: Schema): object {\n\t\tthis.#refuseDeclared(variant, member, \"keyed\");\n\t\treturn this.#putKeyed(variant, member, schema);\n\t}\n\n\tremoveKeyed(variant: string, member: string): object {\n\t\tif (!this.#variant(variant).keyed.delete(member)) {\n\t\t\tthrow new Error(`${this.#path(variant, member, \"keyed\")}: no such keyed member`);\n\t\t}\n\t\treturn this.editor;\n\t}\n\n\tremoveMethod(member: string): object {\n\t\tfor (const variant of this.#variantsWith(member)) this.#variant(variant).methods.delete(member);\n\t\treturn this.editor;\n\t}\n\n\t/** The contract data with this version appended. */\n\tnext(): ContractData {\n\t\tconst { kind, params, versions } = this.#data;\n\t\tconst version = materialize(kind, params, this.#version, this.#variants, this.#changes);\n\t\treturn { ...this.#data, versions: [...versions, version], kinds: this.#kinds };\n\t}\n\n\t#putState(variant: string, member: string, schema: Schema): object {\n\t\tthis.#variant(variant).state.set(member, snapshotSchema(schema, this.#path(variant, member, \"state\")));\n\t\tthis.#changes.push([variant, member, \"state\"]);\n\t\treturn this.#checked();\n\t}\n\n\t#putKeyed(variant: string, member: string, schema: Schema): object {\n\t\tthis.#variant(variant).keyed.set(member, snapshotSchema(schema, this.#path(variant, member, \"keyed\")));\n\t\tthis.#changes.push([variant, member, \"keyed\"]);\n\t\treturn this.#checked();\n\t}\n\n\t/** Changes the given sides of a method in every variant that has it. */\n\t#changeMethod(member: string, args: Schema | undefined, result: Schema | undefined): object {\n\t\tconst variants = this.#variantsWith(member);\n\t\tconst path = this.#path(variants[0]!, member, \"method\");\n\t\tconst newArgs = args === undefined ? undefined : snapshotArguments(args, `${path}.args`);\n\t\tconst newResult = result === undefined ? undefined : snapshotSchema(result, `${path}.result`);\n\t\tfor (const variant of variants) {\n\t\t\tconst { methods } = this.#variant(variant);\n\t\t\tconst old = methods.get(member)!;\n\t\t\tmethods.set(member, { args: newArgs ?? old.args, result: newResult ?? old.result });\n\t\t\tif (newArgs !== undefined) this.#changes.push([variant, member, \"args\"]);\n\t\t\tif (newResult !== undefined) this.#changes.push([variant, member, \"result\"]);\n\t\t}\n\t\treturn this.#checked();\n\t}\n\n\t#variant(variant: string): DraftVariant {\n\t\tconst found = this.#variants.get(variant);\n\t\tif (found === undefined) {\n\t\t\tthrow new Error(`${this.path}.${variant}: unknown variant (the variant set never changes)`);\n\t\t}\n\t\treturn found;\n\t}\n\n\t#variantsWith(member: string): string[] {\n\t\tconst variants = [...this.#variants].filter(([, { methods }]) => methods.has(member)).map(([variant]) => variant);\n\t\tif (variants.length === 0) throw new Error(`${this.path}: no method \"${member}\"`);\n\t\treturn variants;\n\t}\n\n\t#refuseDeclared(variant: string, member: string, kind: MemberKind): void {\n\t\tconst { state, methods, keyed } = this.#variant(variant);\n\t\tif (state.has(member) || methods.has(member) || keyed.has(member)) {\n\t\t\tthrow new Error(`${this.#path(variant, member, kind)}: already declared`);\n\t\t}\n\t}\n\n\t#path(variant: string, member: string, kind: MemberKind): string {\n\t\treturn memberPath(this.path, this.kind, variant, member, kind);\n\t}\n\n\t/** A member's kind never changes, also not after a removal; a method keeps one signature across variants. */\n\t#checked(): object {\n\t\tcheckMembers(this.#variants, this.#kinds, (variant, member, kind) => this.#path(variant, member, kind));\n\t\treturn this.editor;\n\t}\n}\n\n/** The local editor: the draft's edits with the variant filled in. */\nfunction localEditor(draft: Draft): object {\n\tdraft.editor = {\n\t\tstate: (member: string, schema: Schema) => draft.state(LOCAL, member, schema),\n\t\taddState: (member: string, schema: Schema) => draft.addState(LOCAL, member, schema),\n\t\tremoveState: (member: string) => draft.removeState(LOCAL, member),\n\t\taddMethod: (member: string, args: Schema, result: Schema) => draft.addMethod(LOCAL, member, args, result),\n\t\targs: (member: string, args: Schema) => draft.args(member, args),\n\t\tresult: (member: string, result: Schema) => draft.result(member, result),\n\t\tmethod: (member: string, args: Schema, result: Schema) => draft.method(member, args, result),\n\t\tremoveMethod: (member: string) => draft.removeMethod(member),\n\t\tkeyed: (member: string, schema: Schema) => draft.keyed(LOCAL, member, schema),\n\t\taddKeyed: (member: string, schema: Schema) => draft.addKeyed(LOCAL, member, schema),\n\t\tremoveKeyed: (member: string) => draft.removeKeyed(LOCAL, member),\n\t};\n\treturn draft.editor;\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import type { JsonValue } from "../../json.ts";
2
+ import { type Kind, type VariantData, type VersionData } from "./contract.ts";
3
+ import type { Change } from "./history.ts";
4
+ import type { ParamsData } from "./params.ts";
5
+ /** Version of the normal form; changing the normal form changes it and is a link-protocol change. */
6
+ export declare const NORMAL_FORM_VERSION = 2;
7
+ /**
8
+ * Materializes a version with its fingerprint: `hash64` of `JSON.stringify({ normalFormVersion, value })` over the
9
+ * normal form `{ kind: "remote", params, variants }` or `{ kind: "local", params, members }`.
10
+ */
11
+ export declare function materialize(kind: Kind, params: ParamsData, version: number, variants: ReadonlyMap<string, VariantData>, changes: readonly Change[]): VersionData;
12
+ /** `hash64` of `JSON.stringify({ normalFormVersion, value: normal })`: the fingerprint of a normal form. */
13
+ export declare function fingerprintOf(normal: JsonValue): string;
14
+ /** 16 hex characters from two 32-bit FNV-1a lanes (different offset bases and primes) over the UTF-8 bytes. */
15
+ export declare function hash64(text: string): string;
16
+ //# sourceMappingURL=fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../../src/next/contracts/fingerprint.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,KAAK,IAAI,EAAS,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,qGAAqG;AACrG,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC;;;GAGG;AACH,wBAAgB,WAAW,CAC1B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,EAC1C,OAAO,EAAE,SAAS,MAAM,EAAE,GACxB,WAAW,CAUb;AAED,4GAA4G;AAC5G,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAEvD;AAoBD,+GAA+G;AAC/G,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ3C"}
@@ -0,0 +1,50 @@
1
+ // Fingerprints: the normal form of a contract version and its portable 64-bit hash. Not a security boundary.
2
+ import { LOCAL } from "./contract.js";
3
+ /** Version of the normal form; changing the normal form changes it and is a link-protocol change. */
4
+ export const NORMAL_FORM_VERSION = 2;
5
+ /**
6
+ * Materializes a version with its fingerprint: `hash64` of `JSON.stringify({ normalFormVersion, value })` over the
7
+ * normal form `{ kind: "remote", params, variants }` or `{ kind: "local", params, members }`.
8
+ */
9
+ export function materialize(kind, params, version, variants, changes) {
10
+ const normal = kind === "local"
11
+ ? { kind, params: params.normal, members: variantNormal(variants.get(LOCAL)) }
12
+ : {
13
+ kind,
14
+ params: params.normal,
15
+ variants: sortedDict([...variants].map(([name, v]) => [name, variantNormal(v)])),
16
+ };
17
+ return { version, fingerprint: fingerprintOf(normal), variants, changes };
18
+ }
19
+ /** `hash64` of `JSON.stringify({ normalFormVersion, value: normal })`: the fingerprint of a normal form. */
20
+ export function fingerprintOf(normal) {
21
+ return hash64(JSON.stringify({ normalFormVersion: NORMAL_FORM_VERSION, value: normal }));
22
+ }
23
+ /**
24
+ * Members as a sorted dictionary of `{ state }`, `{ args, result }` or `{ keyed }` (slice 6a §12: a node of its own,
25
+ * so contracts without keyed members keep their fingerprints and `NORMAL_FORM_VERSION` stays).
26
+ */
27
+ function variantNormal({ state, methods, keyed }) {
28
+ return sortedDict([
29
+ ...[...state].map(([member, schema]) => [member, { state: schema.normal }]),
30
+ ...[...keyed].map(([member, schema]) => [member, { keyed: schema.normal }]),
31
+ ...[...methods].map(([member, { args, result }]) => [member, { args: args.normal, result: result.normal }]),
32
+ ]);
33
+ }
34
+ function sortedDict(entries) {
35
+ return Object.fromEntries(entries.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));
36
+ }
37
+ /** 16 hex characters from two 32-bit FNV-1a lanes (different offset bases and primes) over the UTF-8 bytes. */
38
+ export function hash64(text) {
39
+ let low = 0x811c9dc5;
40
+ let high = 0xcbf29ce4;
41
+ for (const byte of new TextEncoder().encode(text)) {
42
+ low = Math.imul(low ^ byte, 0x01000193);
43
+ high = Math.imul(high ^ byte, 0x01000197);
44
+ }
45
+ return hex(high) + hex(low);
46
+ }
47
+ function hex(lane) {
48
+ return (lane >>> 0).toString(16).padStart(8, "0");
49
+ }
50
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../src/next/contracts/fingerprint.ts"],"names":[],"mappings":"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","sourcesContent":["// Fingerprints: the normal form of a contract version and its portable 64-bit hash. Not a security boundary.\n\nimport type { JsonValue } from \"../../json.ts\";\nimport { type Kind, LOCAL, type VariantData, type VersionData } from \"./contract.ts\";\nimport type { Change } from \"./history.ts\";\nimport type { ParamsData } from \"./params.ts\";\n\n/** Version of the normal form; changing the normal form changes it and is a link-protocol change. */\nexport const NORMAL_FORM_VERSION = 2;\n\n/**\n * Materializes a version with its fingerprint: `hash64` of `JSON.stringify({ normalFormVersion, value })` over the\n * normal form `{ kind: \"remote\", params, variants }` or `{ kind: \"local\", params, members }`.\n */\nexport function materialize(\n\tkind: Kind,\n\tparams: ParamsData,\n\tversion: number,\n\tvariants: ReadonlyMap<string, VariantData>,\n\tchanges: readonly Change[],\n): VersionData {\n\tconst normal: JsonValue =\n\t\tkind === \"local\"\n\t\t\t? { kind, params: params.normal, members: variantNormal(variants.get(LOCAL)!) }\n\t\t\t: {\n\t\t\t\t\tkind,\n\t\t\t\t\tparams: params.normal,\n\t\t\t\t\tvariants: sortedDict([...variants].map(([name, v]) => [name, variantNormal(v)])),\n\t\t\t\t};\n\treturn { version, fingerprint: fingerprintOf(normal), variants, changes };\n}\n\n/** `hash64` of `JSON.stringify({ normalFormVersion, value: normal })`: the fingerprint of a normal form. */\nexport function fingerprintOf(normal: JsonValue): string {\n\treturn hash64(JSON.stringify({ normalFormVersion: NORMAL_FORM_VERSION, value: normal }));\n}\n\n/**\n * Members as a sorted dictionary of `{ state }`, `{ args, result }` or `{ keyed }` (slice 6a §12: a node of its own,\n * so contracts without keyed members keep their fingerprints and `NORMAL_FORM_VERSION` stays).\n */\nfunction variantNormal({ state, methods, keyed }: VariantData): JsonValue {\n\treturn sortedDict([\n\t\t...[...state].map(([member, schema]) => [member, { state: schema.normal }] as const),\n\t\t...[...keyed].map(([member, schema]) => [member, { keyed: schema.normal }] as const),\n\t\t...[...methods].map(\n\t\t\t([member, { args, result }]) => [member, { args: args.normal, result: result.normal }] as const,\n\t\t),\n\t]);\n}\n\nfunction sortedDict(entries: (readonly [string, JsonValue])[]): JsonValue {\n\treturn Object.fromEntries(entries.sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0)));\n}\n\n/** 16 hex characters from two 32-bit FNV-1a lanes (different offset bases and primes) over the UTF-8 bytes. */\nexport function hash64(text: string): string {\n\tlet low = 0x811c9dc5;\n\tlet high = 0xcbf29ce4;\n\tfor (const byte of new TextEncoder().encode(text)) {\n\t\tlow = Math.imul(low ^ byte, 0x01000193);\n\t\thigh = Math.imul(high ^ byte, 0x01000197);\n\t}\n\treturn hex(high) + hex(low);\n}\n\nfunction hex(lane: number): string {\n\treturn (lane >>> 0).toString(16).padStart(8, \"0\");\n}\n"]}