@elaraai/east-ui 1.0.85 → 1.0.87

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 (561) hide show
  1. package/dist/src/buttons/button/index.d.ts +4 -0
  2. package/dist/src/buttons/button/index.d.ts.map +1 -1
  3. package/dist/src/buttons/button/index.js +8 -1
  4. package/dist/src/buttons/button/index.js.map +1 -1
  5. package/dist/src/buttons/button/types.d.ts +6 -5
  6. package/dist/src/buttons/button/types.d.ts.map +1 -1
  7. package/dist/src/buttons/button/types.js.map +1 -1
  8. package/dist/src/buttons/icon-button/index.d.ts +5 -5
  9. package/dist/src/buttons/icon-button/index.d.ts.map +1 -1
  10. package/dist/src/buttons/icon-button/index.js +8 -2
  11. package/dist/src/buttons/icon-button/index.js.map +1 -1
  12. package/dist/src/buttons/icon-button/types.d.ts +8 -12
  13. package/dist/src/buttons/icon-button/types.d.ts.map +1 -1
  14. package/dist/src/buttons/icon-button/types.js +2 -2
  15. package/dist/src/buttons/icon-button/types.js.map +1 -1
  16. package/dist/src/buttons/toggle/index.d.ts +4 -0
  17. package/dist/src/buttons/toggle/index.d.ts.map +1 -1
  18. package/dist/src/buttons/toggle/index.js +6 -1
  19. package/dist/src/buttons/toggle/index.js.map +1 -1
  20. package/dist/src/buttons/toggle/types.d.ts +3 -2
  21. package/dist/src/buttons/toggle/types.d.ts.map +1 -1
  22. package/dist/src/buttons/toggle/types.js.map +1 -1
  23. package/dist/src/charts/chart/index.d.ts.map +1 -1
  24. package/dist/src/charts/chart/index.js +3 -3
  25. package/dist/src/charts/chart/index.js.map +1 -1
  26. package/dist/src/charts/spec/index.d.ts.map +1 -1
  27. package/dist/src/charts/spec/index.js +5 -2
  28. package/dist/src/charts/spec/index.js.map +1 -1
  29. package/dist/src/collections/deck/index.d.ts.map +1 -1
  30. package/dist/src/collections/deck/index.js +2 -2
  31. package/dist/src/collections/deck/index.js.map +1 -1
  32. package/dist/src/collections/index.d.ts +0 -6
  33. package/dist/src/collections/index.d.ts.map +1 -1
  34. package/dist/src/collections/index.js +0 -6
  35. package/dist/src/collections/index.js.map +1 -1
  36. package/dist/src/collections/library/index.d.ts +1 -1
  37. package/dist/src/collections/library/index.d.ts.map +1 -1
  38. package/dist/src/collections/library/index.js +2 -2
  39. package/dist/src/collections/library/index.js.map +1 -1
  40. package/dist/src/collections/schematic/index.d.ts.map +1 -1
  41. package/dist/src/collections/schematic/index.js +2 -2
  42. package/dist/src/collections/schematic/index.js.map +1 -1
  43. package/dist/src/collections/table/index.d.ts +1 -1
  44. package/dist/src/collections/table/index.d.ts.map +1 -1
  45. package/dist/src/collections/table/index.js +2 -2
  46. package/dist/src/collections/table/index.js.map +1 -1
  47. package/dist/src/collections/tree-view/index.d.ts +11 -32
  48. package/dist/src/collections/tree-view/index.d.ts.map +1 -1
  49. package/dist/src/collections/tree-view/index.js +15 -10
  50. package/dist/src/collections/tree-view/index.js.map +1 -1
  51. package/dist/src/component.d.ts +673 -9344
  52. package/dist/src/component.d.ts.map +1 -1
  53. package/dist/src/component.js +5 -259
  54. package/dist/src/component.js.map +1 -1
  55. package/dist/src/contracts/approval.d.ts +6 -8
  56. package/dist/src/contracts/approval.d.ts.map +1 -1
  57. package/dist/src/contracts/approval.js +6 -8
  58. package/dist/src/contracts/approval.js.map +1 -1
  59. package/dist/src/contracts/drag.d.ts +1 -1
  60. package/dist/src/contracts/drag.d.ts.map +1 -1
  61. package/dist/src/contracts/drag.js +4 -5
  62. package/dist/src/contracts/drag.js.map +1 -1
  63. package/dist/src/contracts/editing.d.ts +19 -19
  64. package/dist/src/contracts/editing.js +14 -14
  65. package/dist/src/contracts/fields.d.ts +471 -0
  66. package/dist/src/contracts/fields.d.ts.map +1 -0
  67. package/dist/src/contracts/fields.js +492 -0
  68. package/dist/src/contracts/fields.js.map +1 -0
  69. package/dist/src/contracts/index.d.ts +1 -0
  70. package/dist/src/contracts/index.d.ts.map +1 -1
  71. package/dist/src/contracts/index.js +1 -0
  72. package/dist/src/contracts/index.js.map +1 -1
  73. package/dist/src/contracts/indexed-source.d.ts +118 -0
  74. package/dist/src/contracts/indexed-source.d.ts.map +1 -0
  75. package/dist/src/contracts/indexed-source.js +89 -0
  76. package/dist/src/contracts/indexed-source.js.map +1 -0
  77. package/dist/src/contracts/pick.d.ts +0 -16
  78. package/dist/src/contracts/pick.d.ts.map +1 -1
  79. package/dist/src/contracts/review.d.ts +4 -6
  80. package/dist/src/contracts/review.d.ts.map +1 -1
  81. package/dist/src/contracts/review.js +4 -6
  82. package/dist/src/contracts/review.js.map +1 -1
  83. package/dist/src/contracts/source.d.ts +2 -2
  84. package/dist/src/contracts/source.d.ts.map +1 -1
  85. package/dist/src/contracts/source.js.map +1 -1
  86. package/dist/src/contracts/states.d.ts +1 -3
  87. package/dist/src/contracts/states.d.ts.map +1 -1
  88. package/dist/src/contracts/states.js +1 -3
  89. package/dist/src/contracts/states.js.map +1 -1
  90. package/dist/src/display/editable-chip/index.d.ts +2 -0
  91. package/dist/src/display/editable-chip/index.d.ts.map +1 -1
  92. package/dist/src/display/editable-chip/index.js +4 -1
  93. package/dist/src/display/editable-chip/index.js.map +1 -1
  94. package/dist/src/display/icon/index.d.ts +14 -31
  95. package/dist/src/display/icon/index.d.ts.map +1 -1
  96. package/dist/src/display/icon/index.js +15 -19
  97. package/dist/src/display/icon/index.js.map +1 -1
  98. package/dist/src/display/icon/solid.d.ts +24 -0
  99. package/dist/src/display/icon/solid.d.ts.map +1 -0
  100. package/dist/src/display/icon/solid.js +39 -0
  101. package/dist/src/display/icon/solid.js.map +1 -0
  102. package/dist/src/display/icon/types.d.ts +14 -38
  103. package/dist/src/display/icon/types.d.ts.map +1 -1
  104. package/dist/src/display/icon/types.js +6 -15
  105. package/dist/src/display/icon/types.js.map +1 -1
  106. package/dist/src/display/metric-chip/index.d.ts +2 -0
  107. package/dist/src/display/metric-chip/index.d.ts.map +1 -1
  108. package/dist/src/display/metric-chip/index.js +4 -1
  109. package/dist/src/display/metric-chip/index.js.map +1 -1
  110. package/dist/src/display/stat/index.d.ts +2 -0
  111. package/dist/src/display/stat/index.d.ts.map +1 -1
  112. package/dist/src/display/stat/index.js +4 -1
  113. package/dist/src/display/stat/index.js.map +1 -1
  114. package/dist/src/display/stat/types.d.ts +3 -5
  115. package/dist/src/display/stat/types.d.ts.map +1 -1
  116. package/dist/src/display/stat/types.js +5 -2
  117. package/dist/src/display/stat/types.js.map +1 -1
  118. package/dist/src/feedback/banner/index.d.ts +5 -3
  119. package/dist/src/feedback/banner/index.d.ts.map +1 -1
  120. package/dist/src/feedback/banner/index.js +4 -1
  121. package/dist/src/feedback/banner/index.js.map +1 -1
  122. package/dist/src/feedback/empty-state/index.d.ts +16 -19
  123. package/dist/src/feedback/empty-state/index.d.ts.map +1 -1
  124. package/dist/src/feedback/empty-state/index.js +17 -10
  125. package/dist/src/feedback/empty-state/index.js.map +1 -1
  126. package/dist/src/feedback/status/index.d.ts +5 -3
  127. package/dist/src/feedback/status/index.d.ts.map +1 -1
  128. package/dist/src/feedback/status/index.js +4 -1
  129. package/dist/src/feedback/status/index.js.map +1 -1
  130. package/dist/src/index.d.ts +5 -6
  131. package/dist/src/index.d.ts.map +1 -1
  132. package/dist/src/index.js +12 -11
  133. package/dist/src/index.js.map +1 -1
  134. package/dist/src/internal.d.ts +23 -16
  135. package/dist/src/internal.d.ts.map +1 -1
  136. package/dist/src/internal.js +29 -13
  137. package/dist/src/internal.js.map +1 -1
  138. package/dist/src/navigation/index.d.ts +0 -2
  139. package/dist/src/navigation/index.d.ts.map +1 -1
  140. package/dist/src/navigation/index.js +0 -2
  141. package/dist/src/navigation/index.js.map +1 -1
  142. package/dist/src/navigation/nav-list/index.d.ts +2 -0
  143. package/dist/src/navigation/nav-list/index.d.ts.map +1 -1
  144. package/dist/src/navigation/nav-list/index.js +4 -1
  145. package/dist/src/navigation/nav-list/index.js.map +1 -1
  146. package/dist/src/navigation/nav-list/types.d.ts +3 -14
  147. package/dist/src/navigation/nav-list/types.d.ts.map +1 -1
  148. package/dist/src/navigation/nav-list/types.js.map +1 -1
  149. package/dist/src/overlays/command-palette/index.d.ts +2 -0
  150. package/dist/src/overlays/command-palette/index.d.ts.map +1 -1
  151. package/dist/src/overlays/command-palette/index.js +5 -0
  152. package/dist/src/overlays/command-palette/index.js.map +1 -1
  153. package/dist/src/overlays/command-palette/types.d.ts +0 -8
  154. package/dist/src/overlays/command-palette/types.d.ts.map +1 -1
  155. package/dist/src/pick/index.d.ts +1 -17
  156. package/dist/src/pick/index.d.ts.map +1 -1
  157. package/dist/src/pick/index.js +1 -1
  158. package/dist/src/platform/slice/index.d.ts +1324 -2039
  159. package/dist/src/platform/slice/index.d.ts.map +1 -1
  160. package/dist/src/platform/slice/index.js +55 -74
  161. package/dist/src/platform/slice/index.js.map +1 -1
  162. package/dist/src/platform/slice/local.d.ts +743 -0
  163. package/dist/src/platform/slice/local.d.ts.map +1 -0
  164. package/dist/src/platform/slice/local.js +133 -0
  165. package/dist/src/platform/slice/local.js.map +1 -0
  166. package/dist/src/platform/slice/record-chrome.d.ts +211 -0
  167. package/dist/src/platform/slice/record-chrome.d.ts.map +1 -0
  168. package/dist/src/platform/slice/record-chrome.js +52 -0
  169. package/dist/src/platform/slice/record-chrome.js.map +1 -0
  170. package/dist/src/platform/slice/record-interval.d.ts +24 -0
  171. package/dist/src/platform/slice/record-interval.d.ts.map +1 -0
  172. package/dist/src/platform/slice/record-interval.js +61 -0
  173. package/dist/src/platform/slice/record-interval.js.map +1 -0
  174. package/dist/src/platform/slice/record-plan.d.ts +54 -0
  175. package/dist/src/platform/slice/record-plan.d.ts.map +1 -0
  176. package/dist/src/platform/slice/record-plan.js +139 -0
  177. package/dist/src/platform/slice/record-plan.js.map +1 -0
  178. package/dist/src/platform/slice/record-types.d.ts +2739 -0
  179. package/dist/src/platform/slice/record-types.d.ts.map +1 -0
  180. package/dist/src/platform/slice/record-types.js +209 -0
  181. package/dist/src/platform/slice/record-types.js.map +1 -0
  182. package/dist/src/platform/slice/record.d.ts +109 -0
  183. package/dist/src/platform/slice/record.d.ts.map +1 -0
  184. package/dist/src/platform/slice/record.js +210 -0
  185. package/dist/src/platform/slice/record.js.map +1 -0
  186. package/dist/src/reactive/match.d.ts +4 -6
  187. package/dist/src/reactive/match.d.ts.map +1 -1
  188. package/dist/src/reactive/match.js +4 -6
  189. package/dist/src/reactive/match.js.map +1 -1
  190. package/dist/src/runtime/collections/deck.d.ts.map +1 -1
  191. package/dist/src/runtime/collections/index.d.ts +0 -6
  192. package/dist/src/runtime/collections/index.d.ts.map +1 -1
  193. package/dist/src/runtime/collections/index.js +0 -6
  194. package/dist/src/runtime/collections/index.js.map +1 -1
  195. package/dist/src/runtime/display/icon.d.ts +6 -5
  196. package/dist/src/runtime/display/icon.d.ts.map +1 -1
  197. package/dist/src/runtime/display/icon.js +6 -5
  198. package/dist/src/runtime/display/icon.js.map +1 -1
  199. package/dist/src/runtime/feedback/empty-state.d.ts +5 -5
  200. package/dist/src/runtime/feedback/empty-state.js +5 -5
  201. package/dist/src/runtime/layout/dock.d.ts +2 -1
  202. package/dist/src/runtime/layout/dock.d.ts.map +1 -1
  203. package/dist/src/runtime/layout/dock.js +2 -1
  204. package/dist/src/runtime/layout/dock.js.map +1 -1
  205. package/dist/src/runtime/navigation/index.d.ts +0 -3
  206. package/dist/src/runtime/navigation/index.d.ts.map +1 -1
  207. package/dist/src/runtime/navigation/index.js +0 -3
  208. package/dist/src/runtime/navigation/index.js.map +1 -1
  209. package/dist/src/runtime/reactive/match.d.ts +2 -3
  210. package/dist/src/runtime/reactive/match.d.ts.map +1 -1
  211. package/dist/src/runtime/reactive/match.js +2 -3
  212. package/dist/src/runtime/reactive/match.js.map +1 -1
  213. package/dist/src/runtime/record-slice-source.d.ts +78 -0
  214. package/dist/src/runtime/record-slice-source.d.ts.map +1 -0
  215. package/dist/src/runtime/record-slice-source.js +201 -0
  216. package/dist/src/runtime/record-slice-source.js.map +1 -0
  217. package/dist/src/runtime/record-slice.d.ts +110 -0
  218. package/dist/src/runtime/record-slice.d.ts.map +1 -0
  219. package/dist/src/runtime/record-slice.js +374 -0
  220. package/dist/src/runtime/record-slice.js.map +1 -0
  221. package/dist/src/runtime/slice.d.ts +11 -13
  222. package/dist/src/runtime/slice.d.ts.map +1 -1
  223. package/dist/src/runtime/slice.js +41 -93
  224. package/dist/src/runtime/slice.js.map +1 -1
  225. package/dist/src/shared/plot-gutter.d.ts +1 -1
  226. package/dist/src/shared/plot-gutter.js +1 -1
  227. package/dist/src/shared/resolve-tag.d.ts +23 -0
  228. package/dist/src/shared/resolve-tag.d.ts.map +1 -0
  229. package/dist/src/shared/resolve-tag.js +26 -0
  230. package/dist/src/shared/resolve-tag.js.map +1 -0
  231. package/dist/src/shared/tree.d.ts +1 -1
  232. package/dist/src/shared/tree.js +1 -1
  233. package/dist/src/slice/breakdown/index.d.ts +1 -1
  234. package/dist/src/slice/breakdown/index.d.ts.map +1 -1
  235. package/dist/src/slice/breakdown/index.js +3 -3
  236. package/dist/src/slice/breakdown/index.js.map +1 -1
  237. package/dist/src/slice/cohort/index.d.ts +4 -5
  238. package/dist/src/slice/cohort/index.d.ts.map +1 -1
  239. package/dist/src/slice/cohort/index.js +6 -7
  240. package/dist/src/slice/cohort/index.js.map +1 -1
  241. package/dist/src/slice/filter/index.d.ts +1 -1
  242. package/dist/src/slice/filter/index.d.ts.map +1 -1
  243. package/dist/src/slice/filter/index.js +3 -3
  244. package/dist/src/slice/filter/index.js.map +1 -1
  245. package/dist/src/slice/index.d.ts +20 -2230
  246. package/dist/src/slice/index.d.ts.map +1 -1
  247. package/dist/src/slice/legend/index.d.ts +2 -2
  248. package/dist/src/slice/legend/index.d.ts.map +1 -1
  249. package/dist/src/slice/legend/index.js +4 -4
  250. package/dist/src/slice/legend/index.js.map +1 -1
  251. package/dist/src/slice/rail/index.d.ts +7 -4
  252. package/dist/src/slice/rail/index.d.ts.map +1 -1
  253. package/dist/src/slice/rail/index.js +10 -5
  254. package/dist/src/slice/rail/index.js.map +1 -1
  255. package/dist/src/slice/range/index.d.ts +1 -1
  256. package/dist/src/slice/range/index.d.ts.map +1 -1
  257. package/dist/src/slice/range/index.js +3 -3
  258. package/dist/src/slice/range/index.js.map +1 -1
  259. package/dist/src/slice/record/index.d.ts +171 -0
  260. package/dist/src/slice/record/index.d.ts.map +1 -0
  261. package/dist/src/slice/record/index.js +10 -0
  262. package/dist/src/slice/record/index.js.map +1 -0
  263. package/dist/src/slice/search/index.d.ts +6 -6
  264. package/dist/src/slice/search/index.d.ts.map +1 -1
  265. package/dist/src/slice/search/index.js +7 -7
  266. package/dist/src/slice/search/index.js.map +1 -1
  267. package/dist/src/slice/summary/index.d.ts +1 -1
  268. package/dist/src/slice/summary/index.d.ts.map +1 -1
  269. package/dist/src/slice/summary/index.js +3 -3
  270. package/dist/src/slice/summary/index.js.map +1 -1
  271. package/dist/src/typography/list/index.d.ts +2 -8
  272. package/dist/src/typography/list/index.d.ts.map +1 -1
  273. package/dist/src/typography/list/index.js +4 -1
  274. package/dist/src/typography/list/index.js.map +1 -1
  275. package/dist/src/typography/list/types.d.ts +0 -8
  276. package/dist/src/typography/list/types.d.ts.map +1 -1
  277. package/dist/test/collections/deck.examples.d.ts.map +1 -1
  278. package/dist/test/collections/deck.examples.js +6 -7
  279. package/dist/test/collections/deck.examples.js.map +1 -1
  280. package/dist/test/collections/index.d.ts +0 -1
  281. package/dist/test/collections/index.d.ts.map +1 -1
  282. package/dist/test/collections/index.js +0 -1
  283. package/dist/test/collections/index.js.map +1 -1
  284. package/dist/test/collections/library.examples.d.ts.map +1 -1
  285. package/dist/test/collections/library.examples.js +6 -7
  286. package/dist/test/collections/library.examples.js.map +1 -1
  287. package/dist/test/collections/schematic.examples.d.ts.map +1 -1
  288. package/dist/test/collections/schematic.examples.js +11 -19
  289. package/dist/test/collections/schematic.examples.js.map +1 -1
  290. package/dist/test/collections/tree-view.examples.js +2 -2
  291. package/dist/test/contracts/editing.examples.d.ts +1 -0
  292. package/dist/test/contracts/editing.examples.d.ts.map +1 -1
  293. package/dist/test/contracts/editing.examples.js +37 -6
  294. package/dist/test/contracts/editing.examples.js.map +1 -1
  295. package/dist/test/contracts/fields.examples.d.ts +7 -0
  296. package/dist/test/contracts/fields.examples.d.ts.map +1 -0
  297. package/dist/test/contracts/fields.examples.js +42 -0
  298. package/dist/test/contracts/fields.examples.js.map +1 -0
  299. package/dist/test/display/avatar.examples.d.ts.map +1 -1
  300. package/dist/test/display/avatar.examples.js +3 -3
  301. package/dist/test/display/avatar.examples.js.map +1 -1
  302. package/dist/test/display/icon.examples.d.ts.map +1 -1
  303. package/dist/test/display/icon.examples.js +12 -11
  304. package/dist/test/display/icon.examples.js.map +1 -1
  305. package/dist/test/feedback/empty-state.examples.js +9 -9
  306. package/dist/test/feedback/empty-state.examples.js.map +1 -1
  307. package/dist/test/layout/dock.examples.d.ts +0 -8
  308. package/dist/test/layout/dock.examples.d.ts.map +1 -1
  309. package/dist/test/layout/dock.examples.js +2 -42
  310. package/dist/test/layout/dock.examples.js.map +1 -1
  311. package/dist/test/layout/snap-grid.examples.d.ts.map +1 -1
  312. package/dist/test/layout/snap-grid.examples.js +18 -28
  313. package/dist/test/layout/snap-grid.examples.js.map +1 -1
  314. package/dist/test/navigation/index.d.ts +0 -2
  315. package/dist/test/navigation/index.d.ts.map +1 -1
  316. package/dist/test/navigation/index.js +0 -2
  317. package/dist/test/navigation/index.js.map +1 -1
  318. package/dist/test/navigation/nav-list.examples.js.map +1 -1
  319. package/dist/test/platform/index.d.ts +1 -0
  320. package/dist/test/platform/index.d.ts.map +1 -1
  321. package/dist/test/platform/index.js +1 -0
  322. package/dist/test/platform/index.js.map +1 -1
  323. package/dist/test/platform/slice-local.examples.d.ts +2 -0
  324. package/dist/test/platform/slice-local.examples.d.ts.map +1 -0
  325. package/dist/test/platform/slice-local.examples.js +31 -0
  326. package/dist/test/platform/slice-local.examples.js.map +1 -0
  327. package/dist/test/platform/slice.examples.js +61 -61
  328. package/dist/test/platform/slice.examples.js.map +1 -1
  329. package/dist/test/slice/slice.examples.d.ts +0 -1
  330. package/dist/test/slice/slice.examples.d.ts.map +1 -1
  331. package/dist/test/slice/slice.examples.js +67 -181
  332. package/dist/test/slice/slice.examples.js.map +1 -1
  333. package/package.json +4 -4
  334. package/dist/src/collections/board/index.d.ts +0 -855
  335. package/dist/src/collections/board/index.d.ts.map +0 -1
  336. package/dist/src/collections/board/index.js +0 -416
  337. package/dist/src/collections/board/index.js.map +0 -1
  338. package/dist/src/collections/board/types.d.ts +0 -111
  339. package/dist/src/collections/board/types.d.ts.map +0 -1
  340. package/dist/src/collections/board/types.js +0 -89
  341. package/dist/src/collections/board/types.js.map +0 -1
  342. package/dist/src/collections/calendar/index.d.ts +0 -446
  343. package/dist/src/collections/calendar/index.d.ts.map +0 -1
  344. package/dist/src/collections/calendar/index.js +0 -287
  345. package/dist/src/collections/calendar/index.js.map +0 -1
  346. package/dist/src/collections/calendar/types.d.ts +0 -338
  347. package/dist/src/collections/calendar/types.d.ts.map +0 -1
  348. package/dist/src/collections/calendar/types.js +0 -206
  349. package/dist/src/collections/calendar/types.js.map +0 -1
  350. package/dist/src/collections/flowchart/index.d.ts +0 -430
  351. package/dist/src/collections/flowchart/index.d.ts.map +0 -1
  352. package/dist/src/collections/flowchart/index.js +0 -292
  353. package/dist/src/collections/flowchart/index.js.map +0 -1
  354. package/dist/src/collections/flowchart/types.d.ts +0 -333
  355. package/dist/src/collections/flowchart/types.d.ts.map +0 -1
  356. package/dist/src/collections/flowchart/types.js +0 -263
  357. package/dist/src/collections/flowchart/types.js.map +0 -1
  358. package/dist/src/collections/plan/assemble.d.ts +0 -2274
  359. package/dist/src/collections/plan/assemble.d.ts.map +0 -1
  360. package/dist/src/collections/plan/assemble.js +0 -210
  361. package/dist/src/collections/plan/assemble.js.map +0 -1
  362. package/dist/src/collections/plan/builders.d.ts +0 -765
  363. package/dist/src/collections/plan/builders.d.ts.map +0 -1
  364. package/dist/src/collections/plan/builders.js +0 -673
  365. package/dist/src/collections/plan/builders.js.map +0 -1
  366. package/dist/src/collections/plan/factories.d.ts +0 -512
  367. package/dist/src/collections/plan/factories.d.ts.map +0 -1
  368. package/dist/src/collections/plan/factories.js +0 -539
  369. package/dist/src/collections/plan/factories.js.map +0 -1
  370. package/dist/src/collections/plan/index.d.ts +0 -324
  371. package/dist/src/collections/plan/index.d.ts.map +0 -1
  372. package/dist/src/collections/plan/index.js +0 -193
  373. package/dist/src/collections/plan/index.js.map +0 -1
  374. package/dist/src/collections/plan/ir.d.ts +0 -2490
  375. package/dist/src/collections/plan/ir.d.ts.map +0 -1
  376. package/dist/src/collections/plan/ir.js +0 -107
  377. package/dist/src/collections/plan/ir.js.map +0 -1
  378. package/dist/src/collections/plan/pick.d.ts +0 -133
  379. package/dist/src/collections/plan/pick.d.ts.map +0 -1
  380. package/dist/src/collections/plan/pick.js +0 -208
  381. package/dist/src/collections/plan/pick.js.map +0 -1
  382. package/dist/src/collections/plan/root.d.ts +0 -297
  383. package/dist/src/collections/plan/root.d.ts.map +0 -1
  384. package/dist/src/collections/plan/root.js +0 -427
  385. package/dist/src/collections/plan/root.js.map +0 -1
  386. package/dist/src/collections/plan/series.d.ts +0 -13887
  387. package/dist/src/collections/plan/series.d.ts.map +0 -1
  388. package/dist/src/collections/plan/series.js +0 -1710
  389. package/dist/src/collections/plan/series.js.map +0 -1
  390. package/dist/src/collections/plan/types.d.ts +0 -12612
  391. package/dist/src/collections/plan/types.d.ts.map +0 -1
  392. package/dist/src/collections/plan/types.js +0 -1345
  393. package/dist/src/collections/plan/types.js.map +0 -1
  394. package/dist/src/collections/roster/index.d.ts +0 -787
  395. package/dist/src/collections/roster/index.d.ts.map +0 -1
  396. package/dist/src/collections/roster/index.js +0 -325
  397. package/dist/src/collections/roster/index.js.map +0 -1
  398. package/dist/src/collections/roster/types.d.ts +0 -97
  399. package/dist/src/collections/roster/types.d.ts.map +0 -1
  400. package/dist/src/collections/roster/types.js +0 -72
  401. package/dist/src/collections/roster/types.js.map +0 -1
  402. package/dist/src/collections/sheet/bridge.d.ts +0 -376
  403. package/dist/src/collections/sheet/bridge.d.ts.map +0 -1
  404. package/dist/src/collections/sheet/bridge.js +0 -773
  405. package/dist/src/collections/sheet/bridge.js.map +0 -1
  406. package/dist/src/collections/sheet/columns.d.ts +0 -410
  407. package/dist/src/collections/sheet/columns.d.ts.map +0 -1
  408. package/dist/src/collections/sheet/columns.js +0 -99
  409. package/dist/src/collections/sheet/columns.js.map +0 -1
  410. package/dist/src/collections/sheet/context-bridge.d.ts +0 -48
  411. package/dist/src/collections/sheet/context-bridge.d.ts.map +0 -1
  412. package/dist/src/collections/sheet/context-bridge.js +0 -216
  413. package/dist/src/collections/sheet/context-bridge.js.map +0 -1
  414. package/dist/src/collections/sheet/draft-bridge.d.ts +0 -37
  415. package/dist/src/collections/sheet/draft-bridge.d.ts.map +0 -1
  416. package/dist/src/collections/sheet/draft-bridge.js +0 -153
  417. package/dist/src/collections/sheet/draft-bridge.js.map +0 -1
  418. package/dist/src/collections/sheet/drafts.d.ts +0 -14
  419. package/dist/src/collections/sheet/drafts.d.ts.map +0 -1
  420. package/dist/src/collections/sheet/drafts.js +0 -14
  421. package/dist/src/collections/sheet/drafts.js.map +0 -1
  422. package/dist/src/collections/sheet/editing-bridge.d.ts +0 -36
  423. package/dist/src/collections/sheet/editing-bridge.d.ts.map +0 -1
  424. package/dist/src/collections/sheet/editing-bridge.js +0 -196
  425. package/dist/src/collections/sheet/editing-bridge.js.map +0 -1
  426. package/dist/src/collections/sheet/editing-types.d.ts +0 -268
  427. package/dist/src/collections/sheet/editing-types.d.ts.map +0 -1
  428. package/dist/src/collections/sheet/editing-types.js +0 -34
  429. package/dist/src/collections/sheet/editing-types.js.map +0 -1
  430. package/dist/src/collections/sheet/edits.d.ts +0 -37
  431. package/dist/src/collections/sheet/edits.d.ts.map +0 -1
  432. package/dist/src/collections/sheet/edits.js +0 -31
  433. package/dist/src/collections/sheet/edits.js.map +0 -1
  434. package/dist/src/collections/sheet/group.d.ts +0 -165
  435. package/dist/src/collections/sheet/group.d.ts.map +0 -1
  436. package/dist/src/collections/sheet/group.js +0 -52
  437. package/dist/src/collections/sheet/group.js.map +0 -1
  438. package/dist/src/collections/sheet/index.d.ts +0 -351
  439. package/dist/src/collections/sheet/index.d.ts.map +0 -1
  440. package/dist/src/collections/sheet/index.js +0 -208
  441. package/dist/src/collections/sheet/index.js.map +0 -1
  442. package/dist/src/collections/sheet/link.d.ts +0 -398
  443. package/dist/src/collections/sheet/link.d.ts.map +0 -1
  444. package/dist/src/collections/sheet/link.js +0 -228
  445. package/dist/src/collections/sheet/link.js.map +0 -1
  446. package/dist/src/collections/sheet/registers.d.ts +0 -278
  447. package/dist/src/collections/sheet/registers.d.ts.map +0 -1
  448. package/dist/src/collections/sheet/registers.js +0 -268
  449. package/dist/src/collections/sheet/registers.js.map +0 -1
  450. package/dist/src/collections/sheet/root.d.ts +0 -328
  451. package/dist/src/collections/sheet/root.d.ts.map +0 -1
  452. package/dist/src/collections/sheet/root.js +0 -432
  453. package/dist/src/collections/sheet/root.js.map +0 -1
  454. package/dist/src/collections/sheet/seed-bridge.d.ts +0 -14
  455. package/dist/src/collections/sheet/seed-bridge.d.ts.map +0 -1
  456. package/dist/src/collections/sheet/seed-bridge.js +0 -51
  457. package/dist/src/collections/sheet/seed-bridge.js.map +0 -1
  458. package/dist/src/collections/sheet/sub-rows.d.ts +0 -249
  459. package/dist/src/collections/sheet/sub-rows.d.ts.map +0 -1
  460. package/dist/src/collections/sheet/sub-rows.js +0 -222
  461. package/dist/src/collections/sheet/sub-rows.js.map +0 -1
  462. package/dist/src/collections/sheet/transactions.d.ts +0 -76
  463. package/dist/src/collections/sheet/transactions.d.ts.map +0 -1
  464. package/dist/src/collections/sheet/transactions.js +0 -40
  465. package/dist/src/collections/sheet/transactions.js.map +0 -1
  466. package/dist/src/collections/sheet/types.d.ts +0 -14992
  467. package/dist/src/collections/sheet/types.d.ts.map +0 -1
  468. package/dist/src/collections/sheet/types.js +0 -1061
  469. package/dist/src/collections/sheet/types.js.map +0 -1
  470. package/dist/src/navigation/app/index.d.ts +0 -150
  471. package/dist/src/navigation/app/index.d.ts.map +0 -1
  472. package/dist/src/navigation/app/index.js +0 -191
  473. package/dist/src/navigation/app/index.js.map +0 -1
  474. package/dist/src/navigation/pages/index.d.ts +0 -165
  475. package/dist/src/navigation/pages/index.d.ts.map +0 -1
  476. package/dist/src/navigation/pages/index.js +0 -152
  477. package/dist/src/navigation/pages/index.js.map +0 -1
  478. package/dist/src/navigation/pages/types.d.ts +0 -111
  479. package/dist/src/navigation/pages/types.d.ts.map +0 -1
  480. package/dist/src/navigation/pages/types.js +0 -101
  481. package/dist/src/navigation/pages/types.js.map +0 -1
  482. package/dist/src/runtime/collections/board.d.ts +0 -73
  483. package/dist/src/runtime/collections/board.d.ts.map +0 -1
  484. package/dist/src/runtime/collections/board.js +0 -68
  485. package/dist/src/runtime/collections/board.js.map +0 -1
  486. package/dist/src/runtime/collections/calendar.d.ts +0 -54
  487. package/dist/src/runtime/collections/calendar.d.ts.map +0 -1
  488. package/dist/src/runtime/collections/calendar.js +0 -54
  489. package/dist/src/runtime/collections/calendar.js.map +0 -1
  490. package/dist/src/runtime/collections/flowchart.d.ts +0 -58
  491. package/dist/src/runtime/collections/flowchart.d.ts.map +0 -1
  492. package/dist/src/runtime/collections/flowchart.js +0 -54
  493. package/dist/src/runtime/collections/flowchart.js.map +0 -1
  494. package/dist/src/runtime/collections/plan.d.ts +0 -181
  495. package/dist/src/runtime/collections/plan.d.ts.map +0 -1
  496. package/dist/src/runtime/collections/plan.js +0 -186
  497. package/dist/src/runtime/collections/plan.js.map +0 -1
  498. package/dist/src/runtime/collections/roster.d.ts +0 -60
  499. package/dist/src/runtime/collections/roster.d.ts.map +0 -1
  500. package/dist/src/runtime/collections/roster.js +0 -59
  501. package/dist/src/runtime/collections/roster.js.map +0 -1
  502. package/dist/src/runtime/collections/sheet.d.ts +0 -122
  503. package/dist/src/runtime/collections/sheet.d.ts.map +0 -1
  504. package/dist/src/runtime/collections/sheet.js +0 -73
  505. package/dist/src/runtime/collections/sheet.js.map +0 -1
  506. package/dist/src/runtime/navigation/app.d.ts +0 -52
  507. package/dist/src/runtime/navigation/app.d.ts.map +0 -1
  508. package/dist/src/runtime/navigation/app.js +0 -53
  509. package/dist/src/runtime/navigation/app.js.map +0 -1
  510. package/dist/src/runtime/navigation/pages.d.ts +0 -50
  511. package/dist/src/runtime/navigation/pages.d.ts.map +0 -1
  512. package/dist/src/runtime/navigation/pages.js +0 -52
  513. package/dist/src/runtime/navigation/pages.js.map +0 -1
  514. package/dist/src/runtime/navigation/route.d.ts +0 -46
  515. package/dist/src/runtime/navigation/route.d.ts.map +0 -1
  516. package/dist/src/runtime/navigation/route.js +0 -47
  517. package/dist/src/runtime/navigation/route.js.map +0 -1
  518. package/dist/test/collections/board.examples.d.ts +0 -18
  519. package/dist/test/collections/board.examples.d.ts.map +0 -1
  520. package/dist/test/collections/board.examples.js +0 -297
  521. package/dist/test/collections/board.examples.js.map +0 -1
  522. package/dist/test/collections/calendar.examples.d.ts +0 -5
  523. package/dist/test/collections/calendar.examples.d.ts.map +0 -1
  524. package/dist/test/collections/calendar.examples.js +0 -147
  525. package/dist/test/collections/calendar.examples.js.map +0 -1
  526. package/dist/test/collections/flowchart.examples.d.ts +0 -17
  527. package/dist/test/collections/flowchart.examples.d.ts.map +0 -1
  528. package/dist/test/collections/flowchart.examples.js +0 -243
  529. package/dist/test/collections/flowchart.examples.js.map +0 -1
  530. package/dist/test/collections/plan.examples.d.ts +0 -200
  531. package/dist/test/collections/plan.examples.d.ts.map +0 -1
  532. package/dist/test/collections/plan.examples.js +0 -3665
  533. package/dist/test/collections/plan.examples.js.map +0 -1
  534. package/dist/test/collections/roster.examples.d.ts +0 -26
  535. package/dist/test/collections/roster.examples.d.ts.map +0 -1
  536. package/dist/test/collections/roster.examples.js +0 -237
  537. package/dist/test/collections/roster.examples.js.map +0 -1
  538. package/dist/test/collections/sheet-link.examples.d.ts +0 -7
  539. package/dist/test/collections/sheet-link.examples.d.ts.map +0 -1
  540. package/dist/test/collections/sheet-link.examples.js +0 -41
  541. package/dist/test/collections/sheet-link.examples.js.map +0 -1
  542. package/dist/test/collections/sheet-transactions.examples.d.ts +0 -7
  543. package/dist/test/collections/sheet-transactions.examples.d.ts.map +0 -1
  544. package/dist/test/collections/sheet-transactions.examples.js +0 -58
  545. package/dist/test/collections/sheet-transactions.examples.js.map +0 -1
  546. package/dist/test/collections/sheet.examples.d.ts +0 -96
  547. package/dist/test/collections/sheet.examples.d.ts.map +0 -1
  548. package/dist/test/collections/sheet.examples.js +0 -1040
  549. package/dist/test/collections/sheet.examples.js.map +0 -1
  550. package/dist/test/navigation/app.examples.d.ts +0 -22
  551. package/dist/test/navigation/app.examples.d.ts.map +0 -1
  552. package/dist/test/navigation/app.examples.js +0 -136
  553. package/dist/test/navigation/app.examples.js.map +0 -1
  554. package/dist/test/navigation/pages.examples.d.ts +0 -13
  555. package/dist/test/navigation/pages.examples.d.ts.map +0 -1
  556. package/dist/test/navigation/pages.examples.js +0 -113
  557. package/dist/test/navigation/pages.examples.js.map +0 -1
  558. package/dist/test/navigation/route.examples.d.ts +0 -13
  559. package/dist/test/navigation/route.examples.d.ts.map +0 -1
  560. package/dist/test/navigation/route.examples.js +0 -69
  561. package/dist/test/navigation/route.examples.js.map +0 -1
@@ -1,773 +0,0 @@
1
- /**
2
- * Copyright (c) 2025 Elara AI Pty Ltd
3
- * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
- */
5
- /**
6
- * The typed bridge (`Sheet Spec.md` §4.8) — factory internals, both arms.
7
- *
8
- * Everything the author writes is typed over the host's row `R` and the
9
- * driver's row `D`; everything on the wire is closed. This module joins the
10
- * two with compiled East functions that capture only data, bind handles and
11
- * the author's functions:
12
- *
13
- * - `projectRow` — `R` → the wire cells (the same projection the row source
14
- * uses, so `encode` and `make` cannot disagree);
15
- * - `rowById` — the REAL source row by id: the captured collection or bind
16
- * handle on the inline arm, the source's `page` at the row's offset on the
17
- * paged arm. Built ONCE per sheet and shared by every wrapper;
18
- * - `draftDecode` — current cells over the existing field draft, preserving
19
- * hidden values and retaining missing/invalid input without domain defaults;
20
- * - `bridgeCtx` — the wire context to `Sheet.Types.DraftContext(R, D)`;
21
- * - `bridgeReady` — a readiness batch to one `DraftContext` per check, its
22
- * rows built once (#882);
23
- * - the wrappers — a fill provider, a proposer, an arity rule, a member
24
- * check, an options rule, a custom kind's parse / print — each the
25
- * author's typed function inside its closed wire twin;
26
- * - the rule cells and sub rows (#844) — a column's `level` / `actual` /
27
- * `detail` accessors and the `subRows` mappers, each compiled once and
28
- * called inside the row projection.
29
- *
30
- * On a GROUPED sheet (#740) the source row is the group `P` and the columns
31
- * are declared over the line `L` its lines field holds: `projectRow` /
32
- * `draftRow` / the patch run over `L`, `rowById` returns the group, and the
33
- * group half of the bridge ({@link SheetGroupBridge}) projects the group's
34
- * summary cells and ordered children. Internal child keys preserve identity
35
- * during local editing; the author's child arrays remain positional. A
36
- * source with LOOSE rows between its groups (#846) holds entries
37
- * `Sheet.Types.Entry(P, "lines")`: `rowById` returns the entry, a draft is
38
- * the entry's draft, and a loose row decodes as a row of `L` whose id is its
39
- * own.
40
- *
41
- * The bridge is the one place a string ever names a field: inside the
42
- * factory, against the column list it has already validated.
43
- *
44
- * @packageDocumentation
45
- */
46
- import { East, Expr, ArrayType, AsyncFunctionType, BooleanType, DateTimeType, DictType, FloatType, FunctionType, IntegerType, NullType, OptionType, StringType, StructType, isTypeEqual, variant, some, none, } from "@elaraai/east";
47
- import { SheetCellType, SheetLinkType, SheetRowType, SheetLineType, SheetContextType, SheetReadyBatchType, SheetFillType, SheetProposalType, SheetProviderType, SheetProposerType, SheetCheckContextType, SheetCheckType, SheetCountedType, SheetHalfType, SheetContextTypeFor, SheetCheckContextTypeFor, SheetPatchTypeFor, SheetProposalTypeFor, SheetGroupContextTypeFor, SheetGroupCheckContextTypeFor, SheetDateLevelType, SheetSubRowType, SheetOptionsRuleType, sheetLinesOf, sheetRuleCell, } from "./types.js";
48
- import { resolveTag } from "../plan/builders.js";
49
- import { SheetMembersType, SheetRegisterMembersType, parseLink, EMPTY_LINK } from "./link.js";
50
- import { buildDraftRowDecoder, buildDraftGroupDecoder, buildDraftEntryDecoder } from "./draft-bridge.js";
51
- import { buildDraftContextBridge, buildDraftBase, buildReadyContexts } from "./context-bridge.js";
52
- import { SheetDraftEntryTypeFor, SheetDraftGroupTypeFor } from "./drafts.js";
53
- import { SheetDraftTypeFor } from "./transactions.js";
54
- /** The wire cells dictionary type. */
55
- export const SheetCellsType = DictType(StringType, SheetCellType);
56
- /** The East type of an erased expression (`Expr.type` cannot infer through `ExprType<EastType>`). */
57
- function typeOf(e) {
58
- return Expr.type(e);
59
- }
60
- /** Whether a type is `Option<T>` — a variant of exactly `none: Null` and `some`. */
61
- export function optionPayload(t) {
62
- const v = t;
63
- if (v.type !== "Variant" || v.cases === undefined)
64
- return undefined;
65
- const keys = Object.keys(v.cases);
66
- if (keys.length !== 2 || v.cases["none"] === undefined || v.cases["some"] === undefined)
67
- return undefined;
68
- if (v.cases["none"].type !== "Null")
69
- return undefined;
70
- return v.cases["some"];
71
- }
72
- /** The cell arm a primitive payload lands in, or `undefined` for a type no cell holds. */
73
- export function cellTagOf(t) {
74
- if (isTypeEqual(t, SheetLinkType))
75
- return "Link";
76
- switch (t.type) {
77
- case "String": return "String";
78
- case "DateTime": return "DateTime";
79
- case "Float": return "Float";
80
- case "Integer": return "Integer";
81
- case "Boolean": return "Boolean";
82
- default: return undefined;
83
- }
84
- }
85
- const SCALAR_PAYLOAD = {
86
- text: StringType, lookup: StringType, reference: StringType, enum: StringType, stamped: StringType,
87
- date: DateTimeType, quantity: FloatType, integer: IntegerType,
88
- };
89
- /** Compile one rule accessor and check its payload — `String` or `DateTime`, or its Option. */
90
- function ruleCell(key, rule, rowType, accessor, tag) {
91
- const fn = East.function([rowType], undefined, (_$, r) => accessor(r));
92
- const out = Expr.type(fn).output;
93
- const payload = optionPayload(out);
94
- const unwrapped = payload ?? out;
95
- if (cellTagOf(unwrapped) !== tag) {
96
- throw new Error(`Sheet: column "${key}" has a \`${rule}\` rule returning ${describeType(out)} — it must return ${tag} or Option<${tag}>`);
97
- }
98
- return { key: sheetRuleCell(rule, key), fn, tag, optional: payload !== undefined };
99
- }
100
- /**
101
- * The unrendered cells a column's rules project (#844) — `detail` on any
102
- * column, `level` and `actual` on a date column.
103
- */
104
- function ruleCellsOf(key, kind, cfg, rowType) {
105
- const out = [];
106
- if (cfg.detail !== undefined)
107
- out.push(ruleCell(key, "detail", rowType, cfg.detail, "String"));
108
- if (kind !== "date") {
109
- if (cfg.level !== undefined || cfg.actual !== undefined) {
110
- throw new Error(`Sheet: column "${key}" is a ${kind} column — \`level\` and \`actual\` are date-column rules`);
111
- }
112
- return out;
113
- }
114
- if (cfg.level !== undefined) {
115
- const level = cfg.level;
116
- const fn = East.function([rowType], StringType, (_$, r) => resolveTag(level(r), SheetDateLevelType).match({
117
- week: (_$2) => "week",
118
- day: (_$2) => "day",
119
- range: (_$2) => "range",
120
- time: (_$2) => "time",
121
- }));
122
- out.push({ key: sheetRuleCell("level", key), fn, tag: "String", optional: false });
123
- }
124
- if (cfg.actual !== undefined)
125
- out.push(ruleCell(key, "actual", rowType, cfg.actual, "DateTime"));
126
- return out;
127
- }
128
- /**
129
- * Describe one column against the row type — the build-time refusals of
130
- * §3.12 live here, every one naming the column and the remedy.
131
- *
132
- * @param key - The column key
133
- * @param col - The built column
134
- * @param rowType - The host's row type
135
- * @returns The column's metadata
136
- * @throws Error naming the column when the kind cannot sit on the field
137
- */
138
- export function describeColumn(key, col, rowType) {
139
- const meta = describeKind(key, col, rowType);
140
- const ruleCells = ruleCellsOf(key, col.kind, col.config, rowType);
141
- if (col.config.options !== undefined && col.kind !== "enum" && col.kind !== "lookup" && col.kind !== "link") {
142
- throw new Error(`Sheet: column "${key}" is a ${col.kind} column — an \`options\` rule narrows an enum, lookup or link column's members`);
143
- }
144
- return ruleCells.length > 0 ? { ...meta, ruleCells } : meta;
145
- }
146
- /** {@link describeColumn}'s kind-by-kind half. */
147
- function describeKind(key, col, rowType) {
148
- const fields = rowType.fields;
149
- const fieldType = fields[key];
150
- if (fieldType === undefined) {
151
- throw new Error(`Sheet: column "${key}" is not a field of the row type — the columns map is keyed by the row's fields (${Object.keys(fields).join(", ")})`);
152
- }
153
- const cfg = col.config;
154
- const kind = col.kind;
155
- const payloadOf = optionPayload(fieldType);
156
- const optional = payloadOf !== undefined;
157
- const unwrapped = payloadOf ?? fieldType;
158
- // A derived read — the projection decides the payload; the field is free.
159
- if (cfg.value !== undefined && kind !== "set" && kind !== "link" && kind !== "stamped" && kind !== "custom") {
160
- const payloadType = SCALAR_PAYLOAD[kind];
161
- const derived = East.function([rowType], undefined, (_$, r) => cfg.value(r));
162
- const out = Expr.type(derived).output;
163
- const outPayload = optionPayload(out);
164
- const outUnwrapped = outPayload ?? out;
165
- if (!isTypeEqual(outUnwrapped, payloadType)) {
166
- throw new Error(`Sheet: column "${key}" is a ${kind} column whose \`value\` projection returns ${outUnwrapped.type} — a ${kind} column's projection must return ${payloadType.type} or its Option`);
167
- }
168
- return {
169
- key, field: key, kind, config: cfg, fieldType, optional, payloadType,
170
- cellTag: cellTagOf(payloadType), editable: false,
171
- derived, derivedOptional: outPayload !== undefined,
172
- ...(col.register !== undefined ? { register: col.register } : {}),
173
- ...(col.driverType !== undefined ? { driverType: col.driverType } : {}),
174
- };
175
- }
176
- if (kind === "set" || kind === "link") {
177
- let form;
178
- let ownHalf;
179
- let otherField;
180
- if (isTypeEqual(fieldType, SheetLinkType) || isTypeEqual(unwrapped, SheetLinkType)) {
181
- form = "link";
182
- }
183
- else if (isTypeEqual(fieldType, SheetMembersType)) {
184
- form = "array";
185
- if (kind === "set") {
186
- ownHalf = "to";
187
- }
188
- else if (cfg.to !== undefined && cfg.from === undefined) {
189
- ownHalf = "from";
190
- otherField = cfg.to;
191
- }
192
- else if (cfg.from !== undefined && cfg.to === undefined) {
193
- ownHalf = "to";
194
- otherField = cfg.from;
195
- }
196
- else {
197
- throw new Error(`Sheet: link column "${key}" sits on an Array<Member> field, so it must name the OTHER half's field — \`to: "…"\` when this field holds the from members, \`from: "…"\` when it holds the to members`);
198
- }
199
- const otherType = otherField !== undefined ? fields[otherField] : undefined;
200
- if (otherField !== undefined && (otherType === undefined || !isTypeEqual(otherType, SheetMembersType))) {
201
- throw new Error(`Sheet: link column "${key}" names "${otherField}" as its other half, but that is not an Array<Sheet.Types.Member> field of the row`);
202
- }
203
- }
204
- else if (unwrapped.type === "String") {
205
- form = "string";
206
- }
207
- else {
208
- throw new Error(`Sheet: ${kind} column "${key}" must sit on a Sheet.Types.Link, Array<Sheet.Types.Member> or String field — got ${fieldType.type}`);
209
- }
210
- return {
211
- key, field: key, kind, config: cfg, fieldType, optional: form === "link" ? isTypeEqual(unwrapped, SheetLinkType) && optional : optional,
212
- payloadType: SheetLinkType, cellTag: "Link", editable: cfg.editable !== false,
213
- form,
214
- ...(ownHalf !== undefined ? { ownHalf } : {}),
215
- ...(otherField !== undefined ? { otherField } : {}),
216
- ...(col.register !== undefined ? { register: col.register } : {}),
217
- ...(col.driverType !== undefined ? { driverType: col.driverType } : {}),
218
- };
219
- }
220
- if (kind === "custom") {
221
- const parseFn = East.value(cfg.parse);
222
- const parseType = typeOf(parseFn);
223
- const parsed = optionPayload(parseType.output);
224
- if (parsed === undefined) {
225
- throw new Error(`Sheet: custom column "${key}" has a \`parse\` whose output is not an Option — it must return Option<payload>, \`none\` meaning unrecognised`);
226
- }
227
- if (!isTypeEqual(parsed, unwrapped)) {
228
- throw new Error(`Sheet: custom column "${key}" parses to ${parsed.type} but sits on a ${unwrapped.type} field — the payload must be the field's type (or its Option's)`);
229
- }
230
- const tag = cellTagOf(parsed);
231
- if (tag === undefined) {
232
- throw new Error(`Sheet: custom column "${key}" has payload ${parsed.type}, which no cell holds — use String, Integer, Float, DateTime, Boolean or Sheet.Types.Link`);
233
- }
234
- return { key, field: key, kind, config: cfg, fieldType, optional, payloadType: parsed, cellTag: tag, editable: cfg.editable !== false };
235
- }
236
- const payloadType = SCALAR_PAYLOAD[kind];
237
- if (!isTypeEqual(unwrapped, payloadType)) {
238
- throw new Error(`Sheet: ${kind} column "${key}" must sit on a ${payloadType.type} or Option<${payloadType.type}> field — got ${fieldType.type}`);
239
- }
240
- return {
241
- key, field: key, kind, config: cfg, fieldType, optional, payloadType,
242
- cellTag: cellTagOf(payloadType),
243
- editable: kind !== "stamped" && cfg.editable !== false,
244
- ...(col.register !== undefined ? { register: col.register } : {}),
245
- ...(col.driverType !== undefined ? { driverType: col.driverType } : {}),
246
- };
247
- }
248
- /**
249
- * Describe one band cell against the GROUP's row type (#740) — a column
250
- * declared over the group's field, keyed by the line column it sits under.
251
- *
252
- * @param cellKey - The line column the cell sits under, or `$title`
253
- * @param cell - The built band cell
254
- * @param groupType - The group's row type
255
- * @returns The cell's metadata
256
- * @throws Error naming the band cell when the kind cannot sit on the field, or is not a band kind
257
- */
258
- export function describeGroupCell(cellKey, cell, groupType) {
259
- if (cell.kind === "lookup" || cell.kind === "set" || cell.kind === "link" || cell.kind === "custom") {
260
- throw new Error(`Sheet: band cell "${cellKey}" is a ${cell.kind} cell — a band draws text, date, quantity, integer, reference, enum and stamped cells only`);
261
- }
262
- let meta;
263
- try {
264
- meta = describeColumn(cell.field, { kind: cell.kind, config: cell.config, ...(cell.register !== undefined ? { register: cell.register } : {}) }, groupType);
265
- }
266
- catch (e) {
267
- throw new Error(`Sheet: band cell "${cellKey}" — ${e.message.replace(/^Sheet: /, "")}`);
268
- }
269
- return { ...meta, key: cellKey, field: cell.field };
270
- }
271
- // ============================================================================
272
- // Cells — payload ↔ cell (the static-tag moves)
273
- // ============================================================================
274
- /** A payload value as a cell. */
275
- export function cellOfPayload(tag, v) {
276
- return East.value(variant(tag, v), SheetCellType);
277
- }
278
- /** The blank cell. */
279
- export const NULL_CELL = East.value(variant("Null", null), SheetCellType);
280
- /** A field VALUE (the payload or its Option) as a cell, by the column's static shape. */
281
- function cellOfFieldValue(tag, v, optional) {
282
- if (!optional)
283
- return cellOfPayload(tag, v);
284
- return v.match({
285
- some: (_$, x) => cellOfPayload(tag, x),
286
- none: (_$) => NULL_CELL,
287
- });
288
- }
289
- /**
290
- * The cell of a column for one row — the projection `make` and `encode`
291
- * share. `members` is the column's register (bound in the caller's block)
292
- * for the `String` link form.
293
- */
294
- function projectCell(meta, r, members) {
295
- const row = r;
296
- if (meta.derived !== undefined) {
297
- return cellOfFieldValue(meta.cellTag, meta.derived(r), meta.derivedOptional === true);
298
- }
299
- const fv = row[meta.field];
300
- if (meta.form === undefined)
301
- return cellOfFieldValue(meta.cellTag, fv, meta.optional);
302
- if (meta.form === "link")
303
- return cellOfFieldValue(meta.cellTag, fv, meta.optional);
304
- if (meta.form === "array") {
305
- const half = fv;
306
- const empty = East.value([], SheetMembersType);
307
- const other = meta.otherField !== undefined ? row[meta.otherField] : empty;
308
- const link = meta.ownHalf === "from"
309
- ? East.value({ from: half, to: other }, SheetLinkType)
310
- : East.value({ from: other, to: half }, SheetLinkType);
311
- return cellOfPayload("Link", link);
312
- }
313
- // The String form — the grammar parses it on read; blank text is the blank cell.
314
- const parse = (text) => text.trim().length().equal(0n).ifElse((_$) => NULL_CELL, (_$) => cellOfPayload("Link", parseLink(text, members ?? East.value([], SheetRegisterMembersType))));
315
- if (!meta.optional)
316
- return parse(fv);
317
- return fv.match({
318
- some: (_$, s) => parse(s),
319
- none: (_$) => NULL_CELL,
320
- });
321
- }
322
- /**
323
- * The id of a row — the id field; on a source with loose rows (#846) the id
324
- * field of whichever arm the entry holds.
325
- */
326
- function idOf(r, idField) {
327
- if (idField === undefined)
328
- throw new Error("Sheet: a positional source needs `id` — the String field that identifies a row");
329
- if (Expr.type(r).type === "Variant") {
330
- return r.match({
331
- group: (_$, g) => g[idField],
332
- row: (_$, l) => l[idField],
333
- });
334
- }
335
- return r[idField];
336
- }
337
- /**
338
- * Compile the bridge for one sheet.
339
- *
340
- * @param input - The root's resolved declaration
341
- * @returns The bridge
342
- */
343
- export function buildBridge(input) {
344
- const { rowType, idField, metas, registers, driver, source, group: groupInput, subRows } = input;
345
- const driverType = driver !== undefined ? driver.rowType : NullType;
346
- // A grouped sheet's columns are declared over the LINE type; its source
347
- // rows are groups — or, with loose rows between them (#846), entries of a
348
- // group or a row of the line type. A flat sheet's line type is its row type.
349
- const loose = rowType.type === "Variant";
350
- const groupType = loose ? rowType.cases.group : rowType;
351
- const shape = groupInput !== undefined ? sheetLinesOf(groupType, groupInput.linesField) : undefined;
352
- const lineType = shape?.lineType ?? groupType;
353
- const lineIdField = shape === undefined ? idField : undefined;
354
- const ctxType = (groupInput !== undefined
355
- ? SheetGroupContextTypeFor(groupType, groupInput.linesField, driverType)
356
- : SheetContextTypeFor(lineType, driverType));
357
- const checkCtxType = (groupInput !== undefined
358
- ? SheetGroupCheckContextTypeFor(groupType, groupInput.linesField)
359
- : SheetCheckContextTypeFor(lineType));
360
- const patchType = SheetPatchTypeFor(lineType);
361
- const proposalType = SheetProposalTypeFor(lineType);
362
- // L → the wire cells. Registers are bound ONCE per body for the String
363
- // link form (the capture rule: data, never a spliced expression).
364
- const stringFormRegisters = [...new Set(metas.filter((m) => m.form === "string" && m.register !== undefined).map((m) => m.register))];
365
- const projectRow = East.function([lineType], SheetCellsType, ($, r) => {
366
- const cells = $.let(new Map(), SheetCellsType);
367
- const bound = new Map();
368
- for (const name of stringFormRegisters) {
369
- bound.set(name, $.const(registers[name], SheetRegisterMembersType));
370
- }
371
- for (const m of metas) {
372
- $(cells.insert(m.key, projectCell(m, r, m.register !== undefined ? bound.get(m.register) : undefined)));
373
- for (const rc of m.ruleCells ?? []) {
374
- const rule = $.const(rc.fn);
375
- $(cells.insert(rc.key, cellOfFieldValue(rc.tag, rule(r), rc.optional)));
376
- }
377
- }
378
- return cells;
379
- });
380
- const projectSubRows = buildSubRowProjection(lineType, subRows);
381
- // (id, offset) → the real source row. Inline, the row at its offset
382
- // answers first — the renderer reads a resident row where it sits — and
383
- // otherwise the nearest match outward from there, so a row that a local
384
- // edit shifted is found in the steps it moved: a read is never a scan of
385
- // the collection, which made every context and every readiness check
386
- // quadratic in the rows (#859). The search starts inside the rows, so a
387
- // stale offset still finds the row.
388
- const rowById = source.kind === "inline"
389
- ? East.function([StringType, IntegerType], OptionType(rowType), ($, id, offset) => {
390
- const rows = $.const(source.rows, ArrayType(rowType));
391
- const size = $.let(rows.size());
392
- const start = $.let(offset.less(0n).ifElse(() => 0n, () => offset.greaterEqual(size).ifElse(() => size.subtract(1n), () => offset)));
393
- const step = $.let(0n);
394
- $.while(start.subtract(step).greaterEqual(0n).or(() => start.add(step).less(size)), ($2) => {
395
- const below = $2.let(start.subtract(step));
396
- $2.if(below.greaterEqual(0n), ($3) => {
397
- const r = $3.let(rows.get(below));
398
- $3.if(idOf(r, idField).equal(id), ($4) => { $4.return(East.value(some(r), OptionType(rowType))); });
399
- });
400
- const above = $2.let(start.add(step));
401
- $2.if(step.greater(0n).and(() => above.less(size)), ($3) => {
402
- const r = $3.let(rows.get(above));
403
- $3.if(idOf(r, idField).equal(id), ($4) => { $4.return(East.value(some(r), OptionType(rowType))); });
404
- });
405
- $2.assign(step, step.add(1n));
406
- });
407
- return East.value(none, OptionType(rowType));
408
- })
409
- : East.function([StringType, IntegerType], OptionType(rowType), ($, id, offset) => {
410
- const src = $.const(source.source);
411
- const noRow = $.const(none, OptionType(rowType));
412
- return src.page(offset, 1n).match({
413
- none: (_$) => noRow,
414
- some: (_$, win) => source.keyed
415
- ? win.tryGet(id)
416
- : win.firstMap((_$2, r) => idOf(r, idField).equal(id).ifElse((_$3) => East.value(some(r), OptionType(rowType)), (_$3) => East.value(none, OptionType(rowType)))),
417
- });
418
- });
419
- // The driver lookup — the driver data folded once into a dictionary; a
420
- // driverless sheet's lookup is always `none` (its `D` is `Null`).
421
- const lookupDriver = driver !== undefined
422
- ? East.function([StringType], OptionType(driverType), ($, k) => {
423
- const dict = $.const(driver.data.toDict((_$, d) => driver.keyFn(d), (_$, d) => d), DictType(StringType, driverType));
424
- return dict.tryGet(k);
425
- })
426
- : East.function([StringType], OptionType(driverType), ($, _k) => $.const(none, OptionType(driverType)));
427
- // The drafts: a line's cells over its draft (no id — a line's identity is
428
- // its place), and on a source with loose rows (#846) a loose row's, whose
429
- // id field is its own.
430
- const draftRow = buildDraftRowDecoder(lineType, metas, registers, lineIdField);
431
- const looseRow = loose ? buildDraftRowDecoder(lineType, metas, registers, idField) : undefined;
432
- const decodeGroup = groupInput !== undefined
433
- ? buildDraftGroupDecoder(groupType, groupInput.linesField, groupInput.cellMetas, draftRow, registers, idField)
434
- : undefined;
435
- const flatDraft = SheetDraftTypeFor(groupType);
436
- const draftDecode = (decodeGroup === undefined
437
- ? East.function([SheetRowType, OptionType(flatDraft), OptionType(SheetRowType)], flatDraft, ($, row, base, _previous) => {
438
- const decode = $.const(draftRow);
439
- return decode(row.id, row.cells, base);
440
- })
441
- : looseRow !== undefined && groupInput !== undefined
442
- ? buildDraftEntryDecoder(rowType, groupInput.linesField, decodeGroup, looseRow)
443
- : decodeGroup);
444
- // The group half (#740).
445
- const group = groupInput !== undefined && shape !== undefined && decodeGroup !== undefined
446
- ? { ...buildGroupBridge(groupType, groupInput, projectRow, projectSubRows), groupType, loose, decodeGroup, decodeLoose: looseRow }
447
- : undefined;
448
- const bridgeCtx = buildDraftContextBridge(rowType, lineType, groupInput?.linesField, ctxType, driverType, rowById, draftDecode, draftRow, lookupDriver, looseRow);
449
- const bridgeReady = buildReadyContexts(rowType, groupInput?.linesField, ctxType, driverType, rowById, draftDecode, lookupDriver, loose);
450
- const encodePatch = buildPatchCells(lineType, metas, registers);
451
- return {
452
- rowType, lineType, driverType, ctxType, checkCtxType, patchType, proposalType,
453
- projectRow, projectSubRows, draftDecode, draftRow,
454
- rowById: rowById,
455
- bridgeCtx: bridgeCtx,
456
- bridgeReady,
457
- encodePatch, seedCells: buildPatchCells(lineType, metas, registers, false),
458
- ...(group !== undefined ? { group } : {}),
459
- };
460
- }
461
- /** Project supplied constructor/proposal fields without inventing a complete row. @internal */
462
- export function buildPatchCells(rowType, metas, registers, editableOnly = true) {
463
- const patchType = SheetPatchTypeFor(rowType);
464
- const fields = rowType.fields;
465
- const stringFormRegisters = [...new Set(metas.filter(m => m.form === "string" && m.register !== undefined).map(m => m.register))];
466
- return East.function([patchType], SheetCellsType, ($, patch) => {
467
- const cells = $.let(new Map(), SheetCellsType);
468
- const p = patch;
469
- const bound = new Map();
470
- for (const name of stringFormRegisters) {
471
- bound.set(name, $.const(registers[name], SheetRegisterMembersType));
472
- }
473
- for (const m of metas) {
474
- if ((editableOnly && !m.editable) || m.derived !== undefined)
475
- continue;
476
- if (m.form === "array") {
477
- // The other half is `none` when the column names no other field.
478
- const otherKey = m.otherField;
479
- const own = $.let(p[m.field], OptionType(SheetMembersType));
480
- const other = $.let((otherKey !== undefined ? p[otherKey] : none), OptionType(SheetMembersType));
481
- $.if(own.hasTag("some").or(() => other.hasTag("some")), ($2) => {
482
- const empty = $2.const([], SheetMembersType);
483
- const ownVal = $2.let(own.match({ some: (_$, v) => v, none: (_$) => empty }), SheetMembersType);
484
- const otherVal = $2.let(other.match({ some: (_$, v) => v, none: (_$) => empty }), SheetMembersType);
485
- const link = m.ownHalf === "from"
486
- ? $2.let({ from: ownVal, to: otherVal }, SheetLinkType)
487
- : $2.let({ from: otherVal, to: ownVal }, SheetLinkType);
488
- $2(cells.insert(m.key, cellOfPayload("Link", link)));
489
- });
490
- continue;
491
- }
492
- const field = $.let(p[m.field], OptionType(fields[m.field]));
493
- $.if(field.hasTag("some"), ($2) => {
494
- const v = $2.let(field.unwrap("some"), fields[m.field]);
495
- const asRow = { [m.field]: v };
496
- $2(cells.insert(m.key, projectCell(m, asRow, m.register !== undefined ? bound.get(m.register) : undefined)));
497
- });
498
- }
499
- return cells;
500
- });
501
- }
502
- // ============================================================================
503
- // Sub rows (#844)
504
- // ============================================================================
505
- /**
506
- * Compile the sub-row sources into one projection over the line type: each
507
- * mapper is compiled ONCE as `East.function([L, T], SubRow)` and called in
508
- * an eager map over its field; the sources concatenate in declaration order.
509
- *
510
- * @param lineType - The type the columns are built over
511
- * @param subRows - The `subRows` declaration, if any
512
- * @returns `L` → its sub rows
513
- * @throws Error when the declaration was built over another type, or a key is not an array field
514
- */
515
- export function buildSubRowProjection(lineType, subRows) {
516
- const fields = lineType.fields;
517
- const mappers = [];
518
- if (subRows !== undefined) {
519
- if (!isTypeEqual(subRows.rowType, lineType)) {
520
- throw new Error("Sheet: `subRows` was built over a different type than the columns — pass the columns' type (a grouped sheet: the line type) to `Sheet.subRows(…)`");
521
- }
522
- for (const [field, map] of Object.entries(subRows.sources)) {
523
- if (map === undefined)
524
- continue;
525
- const t = fields[field];
526
- if (t === undefined || t.type !== "Array" || t.value === undefined) {
527
- throw new Error(`Sheet: \`subRows\` names "${field}", which is ${t === undefined ? "not a field of the row type" : `a ${t.type} field`} — a sub-row source must be an Array field`);
528
- }
529
- mappers.push({ field, fn: East.function([lineType, t.value], SheetSubRowType, (_$, row, item) => map(item, row)) });
530
- }
531
- }
532
- return East.function([lineType], ArrayType(SheetSubRowType), ($, r) => {
533
- const row = r;
534
- let all = $.const([], ArrayType(SheetSubRowType));
535
- for (const m of mappers) {
536
- const map = $.const(m.fn);
537
- const part = $.let(row[m.field].map((_$2, x) => map(r, x)), ArrayType(SheetSubRowType));
538
- all = mappers[0] === m ? part : $.let(all.concat(part), ArrayType(SheetSubRowType));
539
- }
540
- return all;
541
- });
542
- }
543
- // ============================================================================
544
- // The group half (#740)
545
- // ============================================================================
546
- /**
547
- * Compile a group's summary cells and ordered children into wire rows.
548
- *
549
- * @param rowType - The group's row type
550
- * @param input - The child field and summary cell metadata
551
- * @param projectRow - Child row to wire cells
552
- * @param projectSubRows - Child row to its sub rows
553
- * @returns The group half
554
- */
555
- function buildGroupBridge(rowType, input, projectRow, projectSubRows) {
556
- const { linesField, cellMetas } = input;
557
- const linesType = rowType.fields[linesField];
558
- const projectGroupCells = East.function([rowType], SheetCellsType, ($, p) => {
559
- const cells = $.let(new Map(), SheetCellsType);
560
- for (const m of cellMetas)
561
- $(cells.insert(m.key, projectCell(m, p, undefined)));
562
- return cells;
563
- });
564
- const projectLines = East.function([rowType], ArrayType(SheetLineType), ($, p) => {
565
- const project = $.const(projectRow);
566
- const subRowsOf = $.const(projectSubRows);
567
- const lines = $.const(p[linesField], linesType);
568
- return lines.map((_$, line, index) => East.value({ key: East.print(index), cells: project(line), subRows: subRowsOf(line) }, SheetLineType));
569
- });
570
- return { linesField, cellMetas, projectGroupCells, projectLines };
571
- }
572
- // ============================================================================
573
- // Wrappers — the author's typed functions inside their wire twins
574
- // ============================================================================
575
- /** Whether an East function value is asynchronous. */
576
- export function isAsyncFunction(fn) {
577
- return typeOf(fn).type === "AsyncFunction";
578
- }
579
- /** Pin an author function value and check its East input type against the bridge's context type. */
580
- function pinProvider(bridge, fn, where, expectedOutput) {
581
- const expr = East.value(fn);
582
- const t = typeOf(expr);
583
- if (t.type !== "Function" && t.type !== "AsyncFunction") {
584
- throw new Error(`Sheet: ${where} must be an East.function or East.asyncFunction — got a ${t.type}`);
585
- }
586
- const inputs = t.inputs ?? [];
587
- if (inputs.length !== 1 || !isTypeEqual(inputs[0], bridge.ctxType)) {
588
- throw new Error(`Sheet: ${where} must take exactly this sheet's context — ${contextName(bridge)} — as its one argument; a function written over another row or driver type cannot run here`);
589
- }
590
- if (t.output === undefined || !isTypeEqual(t.output, expectedOutput)) {
591
- throw new Error(`Sheet: ${where} returns the wrong type — it must return ${describeType(expectedOutput)}`);
592
- }
593
- return { fn: expr, async: t.type === "AsyncFunction" };
594
- }
595
- /** How this sheet's context is spelt, for a refusal message. */
596
- function contextName(bridge) {
597
- const driver = isTypeEqual(bridge.driverType, NullType) ? "" : ", DriverType";
598
- return bridge.group !== undefined
599
- ? `Sheet.Types.DraftContext(GroupType, "${bridge.group.linesField}"${driver})`
600
- : `Sheet.Types.DraftContext(RowType${driver})`;
601
- }
602
- /** A short description of an East type for a refusal message. */
603
- function describeType(t) {
604
- const payload = optionPayload(t);
605
- if (payload !== undefined)
606
- return `Option<${describeType(payload)}>`;
607
- if (t.type === "Struct")
608
- return `{ ${Object.entries(t.fields).map(([k, f]) => `${k}: ${describeType(f)}`).join(", ")} }`;
609
- if (t.type === "Array")
610
- return `Array<${describeType(t.value)}>`;
611
- return t.type;
612
- }
613
- /**
614
- * Wrap a fill provider — `Sheet.Types.DraftContext(R, D)` → `Option<Fill(T)>` —
615
- * into the wire provider variant (sync or async by the function's type).
616
- */
617
- export function wrapProvider(bridge, meta, fn, index) {
618
- const fillType = StructType({ value: meta.payloadType, meta: StringType });
619
- const { fn: author, async } = pinProvider(bridge, fn, `column "${meta.key}" fill provider #${index + 1}`, OptionType(fillType));
620
- const body = ($, ctx) => {
621
- const a = $.const(author);
622
- const bc = $.const(bridge.bridgeCtx);
623
- const typed = $.let(bc(ctx), bridge.ctxType);
624
- return a(typed).match({
625
- none: (_$) => East.value(none, OptionType(SheetFillType)),
626
- some: (_$, f) => East.value(some({ value: cellOfPayload(meta.cellTag, f.value), meta: f.meta }), OptionType(SheetFillType)),
627
- });
628
- };
629
- const wire = async
630
- ? East.asyncFunction([SheetContextType], OptionType(SheetFillType), body)
631
- : East.function([SheetContextType], OptionType(SheetFillType), body);
632
- return East.value(variant(async ? "async" : "sync", wire), SheetProviderType);
633
- }
634
- /**
635
- * Wrap a row proposer — `Sheet.Types.DraftContext(R, D)` → `Array<Proposal(R)>` —
636
- * into the wire proposer variant.
637
- */
638
- export function wrapProposer(bridge, fn, index) {
639
- const { fn: author, async } = pinProvider(bridge, fn, `suggest.propose #${index + 1}`, ArrayType(bridge.proposalType));
640
- const body = ($, ctx) => {
641
- const a = $.const(author);
642
- const bc = $.const(bridge.bridgeCtx);
643
- const enc = $.const(bridge.encodePatch);
644
- const typed = $.let(bc(ctx), bridge.ctxType);
645
- return a(typed).map((_$, p) => East.value({ cells: enc(p.patch), meta: p.meta }, SheetProposalType));
646
- };
647
- const wire = async
648
- ? East.asyncFunction([SheetContextType], ArrayType(SheetProposalType), body)
649
- : East.function([SheetContextType], ArrayType(SheetProposalType), body);
650
- return East.value(variant(async ? "async" : "sync", wire), SheetProposerType);
651
- }
652
- /** Wrap an arity rule — `Sheet.Types.DraftContext(R, D)` → `Option<Counted>`. */
653
- export function wrapArity(bridge, meta, fn) {
654
- const { fn: author, async } = pinProvider(bridge, fn, `column "${meta.key}" arity rule`, OptionType(SheetCountedType));
655
- if (async)
656
- throw new Error(`Sheet: column "${meta.key}" arity rule must be synchronous — the strip reads it while the half is edited`);
657
- return East.function([SheetContextType], OptionType(SheetCountedType), ($, ctx) => {
658
- const a = $.const(author);
659
- const bc = $.const(bridge.bridgeCtx);
660
- return a(bc(ctx));
661
- });
662
- }
663
- /**
664
- * Wrap an options rule (#844) — `Sheet.Types.DraftContext(R, D)` →
665
- * `Option<Array<String>>` — into the wire rule. Synchronous: the menu reads
666
- * it as the cell opens.
667
- */
668
- export function wrapOptions(bridge, meta, fn) {
669
- const { fn: author, async } = pinProvider(bridge, fn, `column "${meta.key}" options rule`, OptionType(ArrayType(StringType)));
670
- if (async)
671
- throw new Error(`Sheet: column "${meta.key}" options rule must be synchronous — the menu reads it as the cell opens`);
672
- return East.function([SheetContextType], OptionType(ArrayType(StringType)), ($, ctx) => {
673
- const a = $.const(author);
674
- const bc = $.const(bridge.bridgeCtx);
675
- return a(bc(ctx));
676
- });
677
- }
678
- /** Wrap an author member check — `Sheet.Types.CheckContext(R)` → `Option<String>` — into the `custom` check arm. */
679
- export function wrapCheck(bridge, meta, fn, index) {
680
- const expr = East.value(fn);
681
- const t = typeOf(expr);
682
- if (t.type !== "Function" || (t.inputs ?? []).length !== 1 || !isTypeEqual(t.inputs[0], bridge.checkCtxType) ||
683
- t.output === undefined || !isTypeEqual(t.output, OptionType(StringType))) {
684
- const spelt = bridge.group !== undefined ? `Sheet.Types.CheckContext(GroupType, "${bridge.group.linesField}")` : "Sheet.Types.CheckContext(RowType)";
685
- throw new Error(`Sheet: column "${meta.key}" check #${index + 1} must be an East.function over ${spelt} returning Option<String>`);
686
- }
687
- const groupHalf = bridge.group;
688
- const field = groupHalf?.linesField;
689
- const entryDraft = SheetDraftEntryTypeFor(bridge.rowType, field);
690
- const draftType = (groupHalf === undefined ? entryDraft : SheetDraftGroupTypeFor(groupHalf.groupType, groupHalf.linesField));
691
- const rowDraft = SheetDraftTypeFor(bridge.lineType);
692
- const base = buildDraftBase(bridge.rowType, field, bridge.rowById);
693
- const wire = East.function([SheetCheckContextType], OptionType(StringType), ($, c) => {
694
- const a = $.const(expr);
695
- const read = $.const(base);
696
- const dec = $.const(bridge.draftRow);
697
- const original = $.const(read(c.drafts, c.rowId, c.offset), OptionType(entryDraft));
698
- if (field === undefined || groupHalf === undefined) {
699
- const row = $.const(dec(c.rowId, c.row, original));
700
- return a($.const({ rowIndex: c.rowIndex, row, group: none, half: c.half, member: c.member }, bridge.checkCtxType));
701
- }
702
- const decGroup = $.const(groupHalf.decodeGroup);
703
- /** A line's check: the line over its prior draft in its group, the group decoded over the wire group row. */
704
- const lineCheck = ($2, own) => {
705
- const group = $2.const(c.group.match({
706
- none: () => own,
707
- some: (_$, wire) => some(decGroup(wire, own, some(wire))),
708
- }), OptionType(draftType));
709
- const prior = $2.const(group.match({
710
- none: () => none,
711
- some: (_$, value) => {
712
- const children = value[field];
713
- return c.rowIndex.greaterEqual(0n).and(() => c.rowIndex.less(children.size())).ifElse(() => some(children.get(c.rowIndex)), () => none);
714
- },
715
- }), OptionType(rowDraft));
716
- const row = $2.const(dec("", c.row, prior));
717
- return a($2.const({ rowIndex: c.rowIndex, row, group, half: c.half, member: c.member }, bridge.checkCtxType));
718
- };
719
- const decLoose = groupHalf.decodeLoose;
720
- if (decLoose === undefined)
721
- return lineCheck($, original);
722
- // A source with loose rows (#846): the entry's arms. A loose row has
723
- // no line address — its own cells over its own draft, and no group.
724
- const entry = original;
725
- const decodeLoose = $.const(decLoose);
726
- return c.line.match({
727
- some: ($2) => {
728
- const own = $2.const(entry.match({ none: () => none, some: (_$, e) => e.match({ group: (_$3, g) => some(g), row: () => none }) }), OptionType(draftType));
729
- return lineCheck($2, own);
730
- },
731
- none: ($2) => {
732
- const own = $2.const(entry.match({ none: () => none, some: (_$, e) => e.match({ row: (_$3, r) => some(r), group: () => none }) }), OptionType(rowDraft));
733
- const row = $2.const(decodeLoose(c.rowId, c.row, own));
734
- return a($2.const({ rowIndex: c.rowIndex, row, group: none, half: c.half, member: c.member }, bridge.checkCtxType));
735
- },
736
- });
737
- });
738
- return East.value(variant("custom", wire), SheetCheckType);
739
- }
740
- /** Wrap a custom kind's `parse` — `(text, Context(R, D))` → `Option<P>` — into the wire parse. */
741
- export function wrapCustomParse(bridge, meta, fn) {
742
- const expr = East.value(fn);
743
- const t = typeOf(expr);
744
- const inputs = t.inputs ?? [];
745
- if (t.type !== "Function" || inputs.length !== 2 || !isTypeEqual(inputs[0], StringType) || !isTypeEqual(inputs[1], bridge.ctxType)) {
746
- throw new Error(`Sheet: custom column "${meta.key}" \`parse\` must be an East.function over (String, ${contextName(bridge)}) returning Option<payload>`);
747
- }
748
- return East.function([StringType, SheetContextType], OptionType(SheetCellType), ($, text, ctx) => {
749
- const a = $.const(expr);
750
- const bc = $.const(bridge.bridgeCtx);
751
- return a(text, bc(ctx)).match({
752
- none: (_$) => East.value(none, OptionType(SheetCellType)),
753
- some: (_$, v) => East.value(some(cellOfPayload(meta.cellTag, v)), OptionType(SheetCellType)),
754
- });
755
- });
756
- }
757
- /** Wrap a custom kind's `print` — `P` → `String` — into the wire print. */
758
- export function wrapCustomPrint(meta, fn) {
759
- const expr = East.value(fn);
760
- const t = typeOf(expr);
761
- const inputs = t.inputs ?? [];
762
- if (t.type !== "Function" || inputs.length !== 1 || !isTypeEqual(inputs[0], meta.payloadType) ||
763
- t.output === undefined || !isTypeEqual(t.output, StringType)) {
764
- throw new Error(`Sheet: custom column "${meta.key}" \`print\` must be an East.function over the payload (${describeType(meta.payloadType)}) returning String`);
765
- }
766
- return East.function([SheetCellType], StringType, ($, cell) => {
767
- const a = $.const(expr);
768
- return cell.match({ [meta.cellTag]: (_$, v) => a(v) }, (_$) => East.value("", StringType));
769
- });
770
- }
771
- /** Re-exported for the root's driver-typed refusals. */
772
- export { SheetHalfType, BooleanType, AsyncFunctionType, EMPTY_LINK };
773
- //# sourceMappingURL=bridge.js.map