@elaraai/e3-ui 1.0.86 → 1.0.88

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 (385) hide show
  1. package/dist/src/bind/data-indexed.d.ts +159 -0
  2. package/dist/src/bind/data-indexed.d.ts.map +1 -0
  3. package/dist/src/bind/data-indexed.js +105 -0
  4. package/dist/src/bind/data-indexed.js.map +1 -0
  5. package/dist/src/bind/data.d.ts +5 -3
  6. package/dist/src/bind/data.d.ts.map +1 -1
  7. package/dist/src/bind/data.js +6 -0
  8. package/dist/src/bind/data.js.map +1 -1
  9. package/dist/src/bind/record.d.ts +34 -23
  10. package/dist/src/bind/record.d.ts.map +1 -1
  11. package/dist/src/bind/record.js +46 -19
  12. package/dist/src/bind/record.js.map +1 -1
  13. package/dist/src/calendar/index.d.ts +2923 -0
  14. package/dist/src/calendar/index.d.ts.map +1 -0
  15. package/dist/src/calendar/index.js +135 -0
  16. package/dist/src/calendar/index.js.map +1 -0
  17. package/dist/src/decision/queue.d.ts +3 -3
  18. package/dist/src/decision/queue.d.ts.map +1 -1
  19. package/dist/src/decision/queue.js +2 -2
  20. package/dist/src/decision/queue.js.map +1 -1
  21. package/dist/src/decision/types.d.ts +4 -0
  22. package/dist/src/decision/types.d.ts.map +1 -1
  23. package/dist/src/decision/types.js +4 -0
  24. package/dist/src/decision/types.js.map +1 -1
  25. package/dist/src/flowchart/canvas.d.ts +114 -0
  26. package/dist/src/flowchart/canvas.d.ts.map +1 -0
  27. package/dist/src/flowchart/canvas.js +84 -0
  28. package/dist/src/flowchart/canvas.js.map +1 -0
  29. package/dist/src/flowchart/flowchart.d.ts +79 -0
  30. package/dist/src/flowchart/flowchart.d.ts.map +1 -0
  31. package/dist/src/flowchart/flowchart.js +9 -0
  32. package/dist/src/flowchart/flowchart.js.map +1 -0
  33. package/dist/src/flowchart/index.d.ts +305 -0
  34. package/dist/src/flowchart/index.d.ts.map +1 -0
  35. package/dist/src/flowchart/index.js +267 -0
  36. package/dist/src/flowchart/index.js.map +1 -0
  37. package/dist/src/flowchart/library.d.ts +720 -0
  38. package/dist/src/flowchart/library.d.ts.map +1 -0
  39. package/dist/src/flowchart/library.js +611 -0
  40. package/dist/src/flowchart/library.js.map +1 -0
  41. package/dist/src/flowchart/over.d.ts +234 -0
  42. package/dist/src/flowchart/over.d.ts.map +1 -0
  43. package/dist/src/flowchart/over.js +220 -0
  44. package/dist/src/flowchart/over.js.map +1 -0
  45. package/dist/src/flowchart/patch.d.ts +64 -0
  46. package/dist/src/flowchart/patch.d.ts.map +1 -0
  47. package/dist/src/flowchart/patch.js +67 -0
  48. package/dist/src/flowchart/patch.js.map +1 -0
  49. package/dist/src/flowchart/payload.d.ts +8220 -0
  50. package/dist/src/flowchart/payload.d.ts.map +1 -0
  51. package/dist/src/flowchart/payload.js +521 -0
  52. package/dist/src/flowchart/payload.js.map +1 -0
  53. package/dist/src/flowchart/types.d.ts +393 -0
  54. package/dist/src/flowchart/types.d.ts.map +1 -0
  55. package/dist/src/flowchart/types.js +216 -0
  56. package/dist/src/flowchart/types.js.map +1 -0
  57. package/dist/src/flowchart/values.d.ts +267 -0
  58. package/dist/src/flowchart/values.d.ts.map +1 -0
  59. package/dist/src/flowchart/values.js +216 -0
  60. package/dist/src/flowchart/values.js.map +1 -0
  61. package/dist/src/flowchart/window.d.ts +521 -0
  62. package/dist/src/flowchart/window.d.ts.map +1 -0
  63. package/dist/src/flowchart/window.js +69 -0
  64. package/dist/src/flowchart/window.js.map +1 -0
  65. package/dist/src/index.d.ts +25 -1
  66. package/dist/src/index.d.ts.map +1 -1
  67. package/dist/src/index.js +48 -1
  68. package/dist/src/index.js.map +1 -1
  69. package/dist/src/internal.d.ts +35 -3
  70. package/dist/src/internal.d.ts.map +1 -1
  71. package/dist/src/internal.js +72 -3
  72. package/dist/src/internal.js.map +1 -1
  73. package/dist/src/plan/assemble.d.ts +2224 -0
  74. package/dist/src/plan/assemble.d.ts.map +1 -0
  75. package/dist/src/plan/assemble.js +210 -0
  76. package/dist/src/plan/assemble.js.map +1 -0
  77. package/dist/src/plan/builders.d.ts +790 -0
  78. package/dist/src/plan/builders.d.ts.map +1 -0
  79. package/dist/src/plan/builders.js +749 -0
  80. package/dist/src/plan/builders.js.map +1 -0
  81. package/dist/src/plan/event-rows.d.ts +2565 -0
  82. package/dist/src/plan/event-rows.d.ts.map +1 -0
  83. package/dist/src/plan/event-rows.js +689 -0
  84. package/dist/src/plan/event-rows.js.map +1 -0
  85. package/dist/src/plan/factories.d.ts +458 -0
  86. package/dist/src/plan/factories.d.ts.map +1 -0
  87. package/dist/src/plan/factories.js +484 -0
  88. package/dist/src/plan/factories.js.map +1 -0
  89. package/dist/src/plan/index.d.ts +672 -0
  90. package/dist/src/plan/index.d.ts.map +1 -0
  91. package/dist/src/plan/index.js +532 -0
  92. package/dist/src/plan/index.js.map +1 -0
  93. package/dist/src/plan/ir.d.ts +2594 -0
  94. package/dist/src/plan/ir.d.ts.map +1 -0
  95. package/dist/src/plan/ir.js +78 -0
  96. package/dist/src/plan/ir.js.map +1 -0
  97. package/dist/src/plan/library.d.ts +772 -0
  98. package/dist/src/plan/library.d.ts.map +1 -0
  99. package/dist/src/plan/library.js +424 -0
  100. package/dist/src/plan/library.js.map +1 -0
  101. package/dist/src/plan/ordered-source.d.ts +27 -0
  102. package/dist/src/plan/ordered-source.d.ts.map +1 -0
  103. package/dist/src/plan/ordered-source.js +48 -0
  104. package/dist/src/plan/ordered-source.js.map +1 -0
  105. package/dist/src/plan/over.d.ts +247 -0
  106. package/dist/src/plan/over.d.ts.map +1 -0
  107. package/dist/src/plan/over.js +266 -0
  108. package/dist/src/plan/over.js.map +1 -0
  109. package/dist/src/plan/pick.d.ts +78 -0
  110. package/dist/src/plan/pick.d.ts.map +1 -0
  111. package/dist/src/plan/pick.js +146 -0
  112. package/dist/src/plan/pick.js.map +1 -0
  113. package/dist/src/plan/plan.d.ts +11611 -0
  114. package/dist/src/plan/plan.d.ts.map +1 -0
  115. package/dist/src/plan/plan.js +428 -0
  116. package/dist/src/plan/plan.js.map +1 -0
  117. package/dist/src/plan/refs.d.ts +218 -0
  118. package/dist/src/plan/refs.d.ts.map +1 -0
  119. package/dist/src/plan/refs.js +226 -0
  120. package/dist/src/plan/refs.js.map +1 -0
  121. package/dist/src/plan/root.d.ts +290 -0
  122. package/dist/src/plan/root.d.ts.map +1 -0
  123. package/dist/src/plan/root.js +463 -0
  124. package/dist/src/plan/root.js.map +1 -0
  125. package/dist/src/plan/series.d.ts +13554 -0
  126. package/dist/src/plan/series.d.ts.map +1 -0
  127. package/dist/src/plan/series.js +1921 -0
  128. package/dist/src/plan/series.js.map +1 -0
  129. package/dist/src/plan/types.d.ts +12400 -0
  130. package/dist/src/plan/types.d.ts.map +1 -0
  131. package/dist/src/plan/types.js +1335 -0
  132. package/dist/src/plan/types.js.map +1 -0
  133. package/dist/src/roster/coverage.d.ts +240 -0
  134. package/dist/src/roster/coverage.d.ts.map +1 -0
  135. package/dist/src/roster/coverage.js +109 -0
  136. package/dist/src/roster/coverage.js.map +1 -0
  137. package/dist/src/roster/index.d.ts +4028 -0
  138. package/dist/src/roster/index.d.ts.map +1 -0
  139. package/dist/src/roster/index.js +115 -0
  140. package/dist/src/roster/index.js.map +1 -0
  141. package/dist/src/roster/library.d.ts +106 -0
  142. package/dist/src/roster/library.d.ts.map +1 -0
  143. package/dist/src/roster/library.js +78 -0
  144. package/dist/src/roster/library.js.map +1 -0
  145. package/dist/src/roster/people.d.ts +50 -0
  146. package/dist/src/roster/people.d.ts.map +1 -0
  147. package/dist/src/roster/people.js +32 -0
  148. package/dist/src/roster/people.js.map +1 -0
  149. package/dist/src/roster/rules.d.ts +275 -0
  150. package/dist/src/roster/rules.d.ts.map +1 -0
  151. package/dist/src/roster/rules.js +162 -0
  152. package/dist/src/roster/rules.js.map +1 -0
  153. package/dist/src/roster/types.d.ts +672 -0
  154. package/dist/src/roster/types.d.ts.map +1 -0
  155. package/dist/src/roster/types.js +248 -0
  156. package/dist/src/roster/types.js.map +1 -0
  157. package/dist/src/roster/visibility.d.ts +66 -0
  158. package/dist/src/roster/visibility.d.ts.map +1 -0
  159. package/dist/src/roster/visibility.js +25 -0
  160. package/dist/src/roster/visibility.js.map +1 -0
  161. package/dist/src/schedule/days.d.ts +54 -0
  162. package/dist/src/schedule/days.d.ts.map +1 -0
  163. package/dist/src/schedule/days.js +68 -0
  164. package/dist/src/schedule/days.js.map +1 -0
  165. package/dist/src/schedule/events.d.ts +433 -0
  166. package/dist/src/schedule/events.d.ts.map +1 -0
  167. package/dist/src/schedule/events.js +851 -0
  168. package/dist/src/schedule/events.js.map +1 -0
  169. package/dist/src/schedule/index.d.ts +150 -0
  170. package/dist/src/schedule/index.d.ts.map +1 -0
  171. package/dist/src/schedule/index.js +132 -0
  172. package/dist/src/schedule/index.js.map +1 -0
  173. package/dist/src/schedule/library.d.ts +70 -0
  174. package/dist/src/schedule/library.d.ts.map +1 -0
  175. package/dist/src/schedule/library.js +102 -0
  176. package/dist/src/schedule/library.js.map +1 -0
  177. package/dist/src/schedule/patch.d.ts +74 -0
  178. package/dist/src/schedule/patch.d.ts.map +1 -0
  179. package/dist/src/schedule/patch.js +68 -0
  180. package/dist/src/schedule/patch.js.map +1 -0
  181. package/dist/src/schedule/record-window.d.ts +189 -0
  182. package/dist/src/schedule/record-window.d.ts.map +1 -0
  183. package/dist/src/schedule/record-window.js +95 -0
  184. package/dist/src/schedule/record-window.js.map +1 -0
  185. package/dist/src/schedule/resources.d.ts +165 -0
  186. package/dist/src/schedule/resources.d.ts.map +1 -0
  187. package/dist/src/schedule/resources.js +234 -0
  188. package/dist/src/schedule/resources.js.map +1 -0
  189. package/dist/src/schedule/templates.d.ts +47 -0
  190. package/dist/src/schedule/templates.d.ts.map +1 -0
  191. package/dist/src/schedule/templates.js +61 -0
  192. package/dist/src/schedule/templates.js.map +1 -0
  193. package/dist/src/schedule/types.d.ts +1677 -0
  194. package/dist/src/schedule/types.d.ts.map +1 -0
  195. package/dist/src/schedule/types.js +374 -0
  196. package/dist/src/schedule/types.js.map +1 -0
  197. package/dist/src/schedule/window.d.ts +154 -0
  198. package/dist/src/schedule/window.d.ts.map +1 -0
  199. package/dist/src/schedule/window.js +363 -0
  200. package/dist/src/schedule/window.js.map +1 -0
  201. package/dist/src/sheet/bridge.d.ts +385 -0
  202. package/dist/src/sheet/bridge.d.ts.map +1 -0
  203. package/dist/src/sheet/bridge.js +809 -0
  204. package/dist/src/sheet/bridge.js.map +1 -0
  205. package/dist/src/sheet/columns.d.ts +410 -0
  206. package/dist/src/sheet/columns.d.ts.map +1 -0
  207. package/dist/src/sheet/columns.js +99 -0
  208. package/dist/src/sheet/columns.js.map +1 -0
  209. package/dist/src/sheet/context-bridge.d.ts +48 -0
  210. package/dist/src/sheet/context-bridge.d.ts.map +1 -0
  211. package/dist/src/sheet/context-bridge.js +216 -0
  212. package/dist/src/sheet/context-bridge.js.map +1 -0
  213. package/dist/src/sheet/draft-bridge.d.ts +37 -0
  214. package/dist/src/sheet/draft-bridge.d.ts.map +1 -0
  215. package/dist/src/sheet/draft-bridge.js +153 -0
  216. package/dist/src/sheet/draft-bridge.js.map +1 -0
  217. package/dist/src/sheet/drafts.d.ts +14 -0
  218. package/dist/src/sheet/drafts.d.ts.map +1 -0
  219. package/dist/src/sheet/drafts.js +14 -0
  220. package/dist/src/sheet/drafts.js.map +1 -0
  221. package/dist/src/sheet/editing-bridge.d.ts +40 -0
  222. package/dist/src/sheet/editing-bridge.d.ts.map +1 -0
  223. package/dist/src/sheet/editing-bridge.js +231 -0
  224. package/dist/src/sheet/editing-bridge.js.map +1 -0
  225. package/dist/src/sheet/editing-types.d.ts +268 -0
  226. package/dist/src/sheet/editing-types.d.ts.map +1 -0
  227. package/dist/src/sheet/editing-types.js +34 -0
  228. package/dist/src/sheet/editing-types.js.map +1 -0
  229. package/dist/src/sheet/edits.d.ts +37 -0
  230. package/dist/src/sheet/edits.d.ts.map +1 -0
  231. package/dist/src/sheet/edits.js +31 -0
  232. package/dist/src/sheet/edits.js.map +1 -0
  233. package/dist/src/sheet/fields.d.ts +693 -0
  234. package/dist/src/sheet/fields.d.ts.map +1 -0
  235. package/dist/src/sheet/fields.js +280 -0
  236. package/dist/src/sheet/fields.js.map +1 -0
  237. package/dist/src/sheet/group.d.ts +165 -0
  238. package/dist/src/sheet/group.d.ts.map +1 -0
  239. package/dist/src/sheet/group.js +52 -0
  240. package/dist/src/sheet/group.js.map +1 -0
  241. package/dist/src/sheet/index.d.ts +542 -0
  242. package/dist/src/sheet/index.d.ts.map +1 -0
  243. package/dist/src/sheet/index.js +387 -0
  244. package/dist/src/sheet/index.js.map +1 -0
  245. package/dist/src/sheet/library.d.ts +284 -0
  246. package/dist/src/sheet/library.d.ts.map +1 -0
  247. package/dist/src/sheet/library.js +259 -0
  248. package/dist/src/sheet/library.js.map +1 -0
  249. package/dist/src/sheet/link.d.ts +398 -0
  250. package/dist/src/sheet/link.d.ts.map +1 -0
  251. package/dist/src/sheet/link.js +228 -0
  252. package/dist/src/sheet/link.js.map +1 -0
  253. package/dist/src/sheet/record.d.ts +75 -0
  254. package/dist/src/sheet/record.d.ts.map +1 -0
  255. package/dist/src/sheet/record.js +128 -0
  256. package/dist/src/sheet/record.js.map +1 -0
  257. package/dist/src/sheet/registers.d.ts +681 -0
  258. package/dist/src/sheet/registers.d.ts.map +1 -0
  259. package/dist/src/sheet/registers.js +671 -0
  260. package/dist/src/sheet/registers.js.map +1 -0
  261. package/dist/src/sheet/root.d.ts +329 -0
  262. package/dist/src/sheet/root.d.ts.map +1 -0
  263. package/dist/src/sheet/root.js +511 -0
  264. package/dist/src/sheet/root.js.map +1 -0
  265. package/dist/src/sheet/seed-bridge.d.ts +14 -0
  266. package/dist/src/sheet/seed-bridge.d.ts.map +1 -0
  267. package/dist/src/sheet/seed-bridge.js +51 -0
  268. package/dist/src/sheet/seed-bridge.js.map +1 -0
  269. package/dist/src/sheet/sheet.d.ts +11819 -0
  270. package/dist/src/sheet/sheet.d.ts.map +1 -0
  271. package/dist/src/sheet/sheet.js +236 -0
  272. package/dist/src/sheet/sheet.js.map +1 -0
  273. package/dist/src/sheet/sub-rows.d.ts +299 -0
  274. package/dist/src/sheet/sub-rows.d.ts.map +1 -0
  275. package/dist/src/sheet/sub-rows.js +272 -0
  276. package/dist/src/sheet/sub-rows.js.map +1 -0
  277. package/dist/src/sheet/templates.d.ts +161 -0
  278. package/dist/src/sheet/templates.d.ts.map +1 -0
  279. package/dist/src/sheet/templates.js +122 -0
  280. package/dist/src/sheet/templates.js.map +1 -0
  281. package/dist/src/sheet/transactions.d.ts +76 -0
  282. package/dist/src/sheet/transactions.d.ts.map +1 -0
  283. package/dist/src/sheet/transactions.js +40 -0
  284. package/dist/src/sheet/transactions.js.map +1 -0
  285. package/dist/src/sheet/types.d.ts +15226 -0
  286. package/dist/src/sheet/types.d.ts.map +1 -0
  287. package/dist/src/sheet/types.js +1070 -0
  288. package/dist/src/sheet/types.js.map +1 -0
  289. package/dist/src/sheet/views.d.ts +29 -0
  290. package/dist/src/sheet/views.d.ts.map +1 -0
  291. package/dist/src/sheet/views.js +43 -0
  292. package/dist/src/sheet/views.js.map +1 -0
  293. package/dist/src/studio/component.d.ts.map +1 -1
  294. package/dist/src/studio/component.js +11 -8
  295. package/dist/src/studio/component.js.map +1 -1
  296. package/dist/src/utils/derive.d.ts +134 -8
  297. package/dist/src/utils/derive.d.ts.map +1 -1
  298. package/dist/src/utils/derive.js +409 -7
  299. package/dist/src/utils/derive.js.map +1 -1
  300. package/dist/src/utils/ordered-source.d.ts +38 -0
  301. package/dist/src/utils/ordered-source.d.ts.map +1 -0
  302. package/dist/src/utils/ordered-source.js +45 -0
  303. package/dist/src/utils/ordered-source.js.map +1 -0
  304. package/dist/src/utils/row-inspector.d.ts +36 -0
  305. package/dist/src/utils/row-inspector.d.ts.map +1 -0
  306. package/dist/src/utils/row-inspector.js +49 -0
  307. package/dist/src/utils/row-inspector.js.map +1 -0
  308. package/dist/test/bind/data/data.examples.d.ts +21 -19
  309. package/dist/test/bind/data/data.examples.d.ts.map +1 -1
  310. package/dist/test/bind/data/data.examples.js +122 -122
  311. package/dist/test/bind/data/data.examples.js.map +1 -1
  312. package/dist/test/bind/record/record.examples.d.ts.map +1 -1
  313. package/dist/test/bind/record/record.examples.js +9 -9
  314. package/dist/test/bind/record/record.examples.js.map +1 -1
  315. package/dist/test/calendar/calendar-records.examples.d.ts +228 -0
  316. package/dist/test/calendar/calendar-records.examples.d.ts.map +1 -0
  317. package/dist/test/calendar/calendar-records.examples.js +91 -0
  318. package/dist/test/calendar/calendar-records.examples.js.map +1 -0
  319. package/dist/test/calendar/calendar.examples.d.ts +776 -0
  320. package/dist/test/calendar/calendar.examples.d.ts.map +1 -0
  321. package/dist/test/calendar/calendar.examples.js +336 -0
  322. package/dist/test/calendar/calendar.examples.js.map +1 -0
  323. package/dist/test/decision/journal.examples.d.ts +28 -28
  324. package/dist/test/decision/journal.examples.d.ts.map +1 -1
  325. package/dist/test/decision/journal.examples.js +4 -4
  326. package/dist/test/decision/journal.examples.js.map +1 -1
  327. package/dist/test/decision/queue.examples.d.ts.map +1 -1
  328. package/dist/test/decision/queue.examples.js +5 -7
  329. package/dist/test/decision/queue.examples.js.map +1 -1
  330. package/dist/test/flowchart/flowchart.examples.d.ts +3713 -0
  331. package/dist/test/flowchart/flowchart.examples.d.ts.map +1 -0
  332. package/dist/test/flowchart/flowchart.examples.js +465 -0
  333. package/dist/test/flowchart/flowchart.examples.js.map +1 -0
  334. package/dist/test/plan/plan-events.examples.d.ts +3666 -0
  335. package/dist/test/plan/plan-events.examples.d.ts.map +1 -0
  336. package/dist/test/plan/plan-events.examples.js +773 -0
  337. package/dist/test/plan/plan-events.examples.js.map +1 -0
  338. package/dist/test/plan/plan-records.examples.d.ts +3 -0
  339. package/dist/test/plan/plan-records.examples.d.ts.map +1 -0
  340. package/dist/test/plan/plan-records.examples.js +45 -0
  341. package/dist/test/plan/plan-records.examples.js.map +1 -0
  342. package/dist/test/plan/plan-windows.examples.d.ts +588 -0
  343. package/dist/test/plan/plan-windows.examples.d.ts.map +1 -0
  344. package/dist/test/plan/plan-windows.examples.js +170 -0
  345. package/dist/test/plan/plan-windows.examples.js.map +1 -0
  346. package/dist/test/plan/plan.examples.d.ts +8095 -0
  347. package/dist/test/plan/plan.examples.d.ts.map +1 -0
  348. package/dist/test/plan/plan.examples.js +2500 -0
  349. package/dist/test/plan/plan.examples.js.map +1 -0
  350. package/dist/test/roster/domain.examples.d.ts +367 -0
  351. package/dist/test/roster/domain.examples.d.ts.map +1 -0
  352. package/dist/test/roster/domain.examples.js +72 -0
  353. package/dist/test/roster/domain.examples.js.map +1 -0
  354. package/dist/test/roster/roster-records.examples.d.ts +729 -0
  355. package/dist/test/roster/roster-records.examples.d.ts.map +1 -0
  356. package/dist/test/roster/roster-records.examples.js +86 -0
  357. package/dist/test/roster/roster-records.examples.js.map +1 -0
  358. package/dist/test/roster/roster.examples.d.ts +750 -0
  359. package/dist/test/roster/roster.examples.d.ts.map +1 -0
  360. package/dist/test/roster/roster.examples.js +198 -0
  361. package/dist/test/roster/roster.examples.js.map +1 -0
  362. package/dist/test/roster/warehouse.d.ts +87 -0
  363. package/dist/test/roster/warehouse.d.ts.map +1 -0
  364. package/dist/test/roster/warehouse.js +883 -0
  365. package/dist/test/roster/warehouse.js.map +1 -0
  366. package/dist/test/sheet/sheet-link.examples.d.ts +7 -0
  367. package/dist/test/sheet/sheet-link.examples.d.ts.map +1 -0
  368. package/dist/test/sheet/sheet-link.examples.js +41 -0
  369. package/dist/test/sheet/sheet-link.examples.js.map +1 -0
  370. package/dist/test/sheet/sheet-records.examples.d.ts +421 -0
  371. package/dist/test/sheet/sheet-records.examples.d.ts.map +1 -0
  372. package/dist/test/sheet/sheet-records.examples.js +79 -0
  373. package/dist/test/sheet/sheet-records.examples.js.map +1 -0
  374. package/dist/test/sheet/sheet-transactions.examples.d.ts +7 -0
  375. package/dist/test/sheet/sheet-transactions.examples.d.ts.map +1 -0
  376. package/dist/test/sheet/sheet-transactions.examples.js +58 -0
  377. package/dist/test/sheet/sheet-transactions.examples.js.map +1 -0
  378. package/dist/test/sheet/sheet.examples.d.ts +5562 -0
  379. package/dist/test/sheet/sheet.examples.d.ts.map +1 -0
  380. package/dist/test/sheet/sheet.examples.js +1178 -0
  381. package/dist/test/sheet/sheet.examples.js.map +1 -0
  382. package/dist/test/studio/studio.examples.d.ts.map +1 -1
  383. package/dist/test/studio/studio.examples.js +11 -11
  384. package/dist/test/studio/studio.examples.js.map +1 -1
  385. package/package.json +12 -9
@@ -0,0 +1,671 @@
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
+ * `Sheet.register` and `Sheet.driver` — registers are the grammar's
7
+ * vocabulary, projected from the host's rows through accessors reified once
8
+ * (Plan's `derive` move, `Sheet Spec.md` §3.3). There is no attribute bag:
9
+ * a value another declaration needs is read off a TYPED row by an accessor.
10
+ *
11
+ * @packageDocumentation
12
+ */
13
+ import { East, Expr, ArrayType, DictType, FunctionType, OptionType, SetType, StringType, StructType, none, } from "@elaraai/east";
14
+ import { StatusValueType } from "@elaraai/east-ui";
15
+ import { SheetRegisterMemberType } from "./types.js";
16
+ import { SheetRegisterMembersType } from "./link.js";
17
+ /** Fold duplicate keys, keeping the FIRST occurrence in declaration order. */
18
+ const dedupeMembers = East.function([SheetRegisterMembersType], SheetRegisterMembersType, ($, ms) => {
19
+ const out = $.let([], SheetRegisterMembersType);
20
+ const seen = $.let(new Set(), SetType(StringType));
21
+ $.for(ms, ($2, m, _i, _label) => {
22
+ $2.if(seen.has(m.key).not(), ($3) => {
23
+ $3(seen.insert(m.key));
24
+ $3(out.pushLast(m));
25
+ });
26
+ });
27
+ return out;
28
+ });
29
+ /**
30
+ * Projects the host's rows into register members — `Sheet.register.members`.
31
+ *
32
+ * @remarks
33
+ * The accessors are reified ONCE into a describe function which the map
34
+ * then CALLS (`shared/reify.ts`, `EAST_UI_PROP_PATTERNS.md`). Duplicate keys
35
+ * fold, first occurrence wins — a countable-by-attribute kind (`"CNC router"`
36
+ * from every machine of that family) declares one member per distinct value.
37
+ *
38
+ * @typeParam T - The data's element type
39
+ * @param data - The rows — an `Array<T>` or a `Dict<String, T>` value or expression
40
+ * @param config - The accessors ({@link SheetMembersConfig})
41
+ * @returns The members, as an expression
42
+ *
43
+ * @example
44
+ * ```tsx
45
+ * // .tsx file with the `@jsxImportSource @elaraai/e3-ui` pragma
46
+ * import { ArrayType, DateTimeType, East, FloatType, IntegerType, OptionType, StringType, StructType, none, some, variant } from "@elaraai/east";
47
+ * import { Box, Format, Reactive, Slice, State, UIComponentType } from "@elaraai/east-ui";
48
+ * import { Data, Sheet } from "@elaraai/e3-ui";
49
+ * import e3 from "@elaraai/e3";
50
+ *
51
+ * export const StressJob = StructType({
52
+ * id: StringType, start: OptionType(DateTimeType), activity: StringType, notes: StringType,
53
+ * stations: Sheet.Types.Link, status: StringType, qty: OptionType(FloatType),
54
+ * });
55
+ * export const sheetStressJobCount = e3.input("sheet_stress_job_count", IntegerType, variant("value", 2000n));
56
+ * export const generateStressJobs = East.function([IntegerType], ArrayType(StressJob), ($, count) => {
57
+ * const activities = $.const(["Routing", "Spraying", "Wrapping", "Set-up", "Maintenance"], ArrayType(StringType));
58
+ * const words = $.const(["PLANNED", "RELEASED", "COMPLETE"], ArrayType(StringType));
59
+ * const codes = $.const(["R2140", "R2141", "R2145", "P3210", "A7301"], ArrayType(StringType));
60
+ * const first = $.const(new Date("2026-01-05T00:00:00Z"), DateTimeType);
61
+ * const noMembers = $.const([], ArrayType(Sheet.Types.Member));
62
+ * const blank = $.const(none, OptionType(FloatType));
63
+ * return East.Array.generate(count, StressJob, (_$, i) => ({
64
+ * id: East.str`S${i}`,
65
+ * start: some(first.addDays(i.divide(4n))),
66
+ * activity: activities.get(i.remainder(5n)),
67
+ * notes: i.remainder(7n).equal(0n).ifElse((_$2) => "urgent — inspect before delivery", (_$2) => East.str`batch ${i.add(100n)}`),
68
+ * // Routing runs name a count of routers; the rest a machine by code.
69
+ * stations: i.remainder(5n).equal(0n).ifElse(
70
+ * (_$2) => East.value({ from: noMembers, to: [variant("counted", { n: i.remainder(3n).add(2n), key: "CNC router" })] }, Sheet.Types.Link),
71
+ * (_$2) => East.value({ from: noMembers, to: [variant("identified", { key: codes.get(i.remainder(5n)) })] }, Sheet.Types.Link)),
72
+ * status: words.get(i.remainder(3n)),
73
+ * qty: i.remainder(11n).equal(0n).ifElse((_$2) => blank, (_$2) => East.value(some(i.multiply(7n).toFloat().add(50.0)), OptionType(FloatType))),
74
+ * }));
75
+ * });
76
+ * export const sheetStressJobs = e3.task("sheet_stress_jobs", [sheetStressJobCount], generateStressJobs);
77
+ *
78
+ * const sheet = East.function([], UIComponentType, (_$) => (
79
+ * <Reactive>{$ => {
80
+ * const MachineType = StructType({ code: StringType, family: StringType });
81
+ * // Two thousand jobs an e3 task generates — made where data is made.
82
+ * const jobs = $.let(Data.bind(sheetStressJobs));
83
+ * const count = $.let(jobs.read().length());
84
+ * const machines = $.const([
85
+ * { code: "R2140", family: "CNC router" }, { code: "R2141", family: "CNC router" }, { code: "R2145", family: "CNC router" },
86
+ * { code: "P3210", family: "4-side planer" }, { code: "A7301", family: "assembly bench" },
87
+ * ], ArrayType(MachineType));
88
+ * // The work centres are searched through their display form — `3 x CNC router`, `A7301` — not their `.east` text.
89
+ * const slice = $.let(Slice.bind("sheet_stress_slice", jobs.read(), {
90
+ * fields: {
91
+ * activity: { label: "Activity", hints: ["Routing", "Spraying", "Wrapping", "Set-up", "Maintenance"] },
92
+ * notes: { label: "Notes" },
93
+ * stations: { label: "Work centres", text: r => Sheet.link.print(r.stations) },
94
+ * status: { label: "Status" },
95
+ * },
96
+ * search: ["activity", "notes", "stations"],
97
+ * }));
98
+ * const views = $.let(State.bind([ArrayType(Sheet.Types.View)], "sheet_stress_views", [
99
+ * { id: "spraying", name: "SPRAYING", narrowing: Slice.state({ search: some("spraying") }), context: 1n, reveals: [], folds: new Map() },
100
+ * { id: "routers", name: "ROUTERS", narrowing: Slice.state({ search: some("router") }), context: 0n, reveals: [], folds: new Map() },
101
+ * { id: "urgent", name: "URGENT", narrowing: Slice.state({ search: some("urgent") }), context: 0n, reveals: [], folds: new Map() },
102
+ * ]));
103
+ * return (
104
+ * <Box height="480px">
105
+ * <Sheet
106
+ * data={jobs}
107
+ * id="id"
108
+ * name="stress"
109
+ * registers={{
110
+ * stations: Sheet.register.concat([
111
+ * Sheet.register.members(machines, { kind: "machine", key: m => m.code, label: m => m.code, meta: m => some(m.family) }),
112
+ * Sheet.register.members(machines, { kind: "family", key: m => m.family, label: m => m.family, meta: _m => some("family") }),
113
+ * ]),
114
+ * }}
115
+ * columns={{
116
+ * start: Sheet.column.date(StressJob, { header: "Start", width: "96px" }),
117
+ * activity: Sheet.column.text(StressJob, { header: "Activity", width: "160px" }),
118
+ * notes: Sheet.column.text(StressJob, { header: "Notes", sub: "free text", width: "240px" }),
119
+ * stations: Sheet.column.set(StressJob, "stations", { header: "Work centres", sub: "3 x router · machine", width: "220px",
120
+ * members: [{ kind: "machine", identified: true }, { kind: "family", countable: true, resolvesTo: "machine" }] }),
121
+ * status: Sheet.column.text(StressJob, { header: "Status", width: "120px" }),
122
+ * qty: Sheet.column.quantity(StressJob, { header: "Qty", width: "112px", format: Format.Number({ maximumFractionDigits: 0n }) }),
123
+ * }}
124
+ * slice={slice} affordances={["search", "filter"]}
125
+ * views={views} activeView={some("spraying")}
126
+ * readOnly
127
+ * footer={[{ text: East.str`${count} rows · virtualised` }]}
128
+ * />
129
+ * </Box>
130
+ * );
131
+ * }}</Reactive>
132
+ * ));
133
+ * ```
134
+ */
135
+ export function createMembers(data, config) {
136
+ const expr = East.value(data);
137
+ // The data is an Array or a Dict whatever the cast above says: widen to
138
+ // read its real East type.
139
+ const t = Expr.type(expr);
140
+ if (t.type !== "Array" && t.type !== "Dict") {
141
+ throw new Error(`Sheet.register.members: data must be an Array or a Dict<String, T> — got a ${t.type}`);
142
+ }
143
+ if (t.type === "Dict" && t.key.type !== "String") {
144
+ throw new Error("Sheet.register.members: a keyed register must be a Dict<String, T> — its keys ride to the accessors as the second argument");
145
+ }
146
+ const elem = t.value;
147
+ const cfg = config;
148
+ const describe = East.function([elem, StringType], SheetRegisterMemberType, (_$, v, k) => ({
149
+ key: cfg.key(v, k),
150
+ label: cfg.label(v, k),
151
+ kind: cfg.kind,
152
+ aliases: cfg.aliases !== undefined ? cfg.aliases(v, k) : East.value([], ArrayType(StringType)),
153
+ meta: cfg.meta !== undefined ? cfg.meta(v, k) : East.value(none, OptionType(StringType)),
154
+ parent: cfg.parent !== undefined ? cfg.parent(v, k) : East.value(none, OptionType(StringType)),
155
+ tone: cfg.tone !== undefined ? cfg.tone(v, k) : East.value(none, OptionType(StatusValueType)),
156
+ }));
157
+ const list = t.type === "Dict"
158
+ ? expr.toArray((_$, v, k) => describe(v, k))
159
+ : expr.map((_$, v, i) => describe(v, East.print(i)));
160
+ return dedupeMembers(list);
161
+ }
162
+ /**
163
+ * Joins member sets of different kinds into one register — `Sheet.register.concat`.
164
+ *
165
+ * @param parts - The member sets, in order
166
+ * @returns The concatenated members
167
+ */
168
+ export function concatMembers(parts) {
169
+ if (parts.length === 0)
170
+ return East.value([], SheetRegisterMembersType);
171
+ return parts.slice(1).reduce((acc, p) => acc.concat(p), parts[0]);
172
+ }
173
+ /**
174
+ * Declares the driver — `Sheet.driver(column, data, { key, label })`: the
175
+ * `lookup` column whose member decides what the row does, with its data,
176
+ * so `D` reaches every `uom` / `sides` accessor and `ctx.driver` (§3.3).
177
+ *
178
+ * @typeParam D - The driver's row type (inferred from `data`)
179
+ * @param column - The driver column's key
180
+ * @param data - The driver rows — an `Array<D>` value or expression
181
+ * @param config - The accessors ({@link SheetDriverConfig})
182
+ * @returns The driver declaration the `driver` prop takes
183
+ *
184
+ * @example
185
+ * ```tsx
186
+ * // .tsx file with the `@jsxImportSource @elaraai/e3-ui` pragma
187
+ * import { ArrayType, DateTimeType, DictType, East, FloatType, IntegerType, OptionType, StringType, StructType, none, some, variant } from "@elaraai/east";
188
+ * import { Box, Format, Reactive, Slice, State, StatusValueType, UIComponentType } from "@elaraai/east-ui";
189
+ * import { Data, Record, Sheet } from "@elaraai/e3-ui";
190
+ * import e3 from "@elaraai/e3";
191
+ *
192
+ * export const WorkshopActivity = StructType({
193
+ * name: StringType, uom: StringType, days: IntegerType, rate: FloatType, family: StringType, sides: Sheet.Types.Sides,
194
+ * });
195
+ * export const WorkshopMachine = StructType({ family: StringType, bay: StringType });
196
+ * export const WorkshopStatus = StructType({ word: StringType, tone: StatusValueType });
197
+ * export const WorkshopOperation = StructType({
198
+ * activity: StringType, // the driver: an activity's name
199
+ * start: OptionType(DateTimeType),
200
+ * end: OptionType(DateTimeType),
201
+ * qty: OptionType(FloatType), // in the activity's unit
202
+ * machines: Sheet.Types.Link, // work centres, from → to
203
+ * notes: StringType,
204
+ * created_by: StringType, // no column: the inspector shows it
205
+ * });
206
+ * export const WorkshopOrder = StructType({
207
+ * name: StringType,
208
+ * customer: StringType,
209
+ * due: OptionType(DateTimeType),
210
+ * status: StringType, // a word of the statuses register
211
+ * ops: ArrayType(WorkshopOperation),
212
+ * });
213
+ * export const sheetWorkshopActivities = e3.input("sheet_workshop_activities", ArrayType(WorkshopActivity), variant("value", [
214
+ * { name: "Panel cutting", uom: "panels", days: 1n, rate: 12.0, family: "beam saw", sides: variant("both", null) },
215
+ * { name: "Edge banding", uom: "metres", days: 1n, rate: 60.0, family: "edge bander", sides: variant("both", null) },
216
+ * { name: "CNC routing", uom: "panels", days: 2n, rate: 6.0, family: "CNC router", sides: variant("both", null) },
217
+ * { name: "Drilling", uom: "panels", days: 1n, rate: 10.0, family: "CNC router", sides: variant("both", null) },
218
+ * { name: "Sanding", uom: "panels", days: 1n, rate: 20.0, family: "", sides: variant("in", null) },
219
+ * { name: "Assembly", uom: "units", days: 2n, rate: 2.0, family: "assembly bench", sides: variant("both", null) },
220
+ * { name: "Spray finish", uom: "doors", days: 3n, rate: 8.0, family: "spray booth", sides: variant("both", null) },
221
+ * { name: "Wrapping", uom: "units", days: 1n, rate: 10.0, family: "", sides: variant("in", null) },
222
+ * { name: "Delivery", uom: "loads", days: 1n, rate: 1.0, family: "", sides: variant("from", null) },
223
+ * ]));
224
+ * export const sheetWorkshopMachines = e3.record("sheet_workshop_machines", DictType(StringType, WorkshopMachine), new Map([
225
+ * ["S101", { family: "beam saw", bay: "Bay 1" }],
226
+ * ["S102", { family: "beam saw", bay: "Bay 1" }],
227
+ * ["S103", { family: "beam saw", bay: "Bay 1" }],
228
+ * ["E201", { family: "edge bander", bay: "Bay 2" }],
229
+ * ["E202", { family: "edge bander", bay: "Bay 2" }],
230
+ * ["R301", { family: "CNC router", bay: "Bay 3" }],
231
+ * ["R302", { family: "CNC router", bay: "Bay 3" }],
232
+ * ["R303", { family: "CNC router", bay: "Bay 3" }],
233
+ * ["F401", { family: "spray booth", bay: "Bay 4" }],
234
+ * ["F402", { family: "spray booth", bay: "Bay 4" }],
235
+ * ["A701", { family: "assembly bench", bay: "Bay 7" }],
236
+ * ["A702", { family: "assembly bench", bay: "Bay 7" }],
237
+ * ]));
238
+ * export const sheetWorkshopOrders = e3.record("sheet_workshop_orders", DictType(StringType, WorkshopOrder), new Map([
239
+ * ["WO-2201", { name: "WO-2201 · Kitchen, oak", customer: "Quillfeather Interiors", due: some(new Date("2026-10-23T00:00:00Z")), status: "RELEASED", ops: [
240
+ * { activity: "Panel cutting", start: some(new Date("2026-10-12T00:00:00Z")), end: some(new Date("2026-10-13T00:00:00Z")), qty: some(48.0),
241
+ * machines: { from: [variant("identified", { key: "S101" })], to: [variant("identified", { key: "E201" })] }, notes: "Oak veneered board", created_by: "planner" },
242
+ * { activity: "Edge banding", start: some(new Date("2026-10-14T00:00:00Z")), end: some(new Date("2026-10-15T00:00:00Z")), qty: some(120.0),
243
+ * machines: { from: [variant("identified", { key: "E201" })], to: [variant("identified", { key: "R301" })] }, notes: "", created_by: "planner" },
244
+ * { activity: "CNC routing", start: some(new Date("2026-10-15T00:00:00Z")), end: some(new Date("2026-10-17T00:00:00Z")), qty: some(48.0),
245
+ * machines: { from: [variant("identified", { key: "R301" })], to: [variant("identified", { key: "A701" })] }, notes: "Hinge cups and handle slots", created_by: "planner" },
246
+ * { activity: "Assembly", start: none, end: none, qty: some(12.0),
247
+ * machines: { from: [], to: [variant("identified", { key: "A701" })] }, notes: "Twelve carcasses", created_by: "planner" },
248
+ * { activity: "Spray finish", start: none, end: none, qty: some(24.0),
249
+ * machines: { from: [], to: [variant("identified", { key: "F401" })] }, notes: "Matt lacquer", created_by: "planner" },
250
+ * ] }],
251
+ * ["WO-2202", { name: "WO-2202 · Wardrobes, ash", customer: "Marrowby Lettings", due: some(new Date("2026-10-30T00:00:00Z")), status: "PLANNED", ops: [
252
+ * { activity: "Panel cutting", start: some(new Date("2026-10-13T00:00:00Z")), end: some(new Date("2026-10-14T00:00:00Z")), qty: some(36.0),
253
+ * machines: { from: [variant("identified", { key: "S102" })], to: [variant("identified", { key: "E202" })] }, notes: "", created_by: "planner" },
254
+ * { activity: "Edge banding", start: none, end: none, qty: some(90.0),
255
+ * machines: { from: [variant("identified", { key: "E202" })], to: [] }, notes: "", created_by: "planner" },
256
+ * { activity: "Drilling", start: none, end: none, qty: some(36.0),
257
+ * machines: { from: [], to: [variant("identified", { key: "R302" })] }, notes: "Hinge and shelf pins", created_by: "planner" },
258
+ * { activity: "Assembly", start: none, end: none, qty: some(6.0),
259
+ * machines: { from: [], to: [variant("identified", { key: "A702" })] }, notes: "", created_by: "planner" },
260
+ * ] }],
261
+ * ["WO-2203", { name: "WO-2203 · Vanity unit, walnut", customer: "Tallowmere Homes", due: some(new Date("2026-11-02T00:00:00Z")), status: "PLANNED", ops: [
262
+ * { activity: "Panel cutting", start: none, end: none, qty: some(12.0),
263
+ * machines: { from: [], to: [variant("identified", { key: "S101" })] }, notes: "", created_by: "planner" },
264
+ * { activity: "CNC routing", start: none, end: none, qty: some(12.0),
265
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "CNC router" })] }, notes: "Basin cut-out", created_by: "planner" },
266
+ * { activity: "Spray finish", start: none, end: none, qty: some(4.0),
267
+ * machines: { from: [], to: [variant("identified", { key: "F402" })] }, notes: "", created_by: "planner" },
268
+ * { activity: "Assembly", start: none, end: none, qty: some(2.0),
269
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
270
+ * ] }],
271
+ * ["WO-2204", { name: "WO-2204 · Shelving, birch", customer: "Pebblecombe School", due: some(new Date("2026-10-20T00:00:00Z")), status: "ON HOLD", ops: [
272
+ * { activity: "Panel cutting", start: none, end: none, qty: some(60.0),
273
+ * machines: { from: [], to: [variant("counted", { n: 2n, key: "beam saw" })] }, notes: "Awaiting board delivery", created_by: "planner" },
274
+ * { activity: "Edge banding", start: none, end: none, qty: some(150.0),
275
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
276
+ * { activity: "Sanding", start: none, end: none, qty: some(60.0),
277
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
278
+ * ] }],
279
+ * ["WO-2205", { name: "WO-2205 · Office fit-out, maple", customer: "", due: none, status: "PLANNED", ops: [
280
+ * { activity: "Panel cutting", start: none, end: none, qty: some(80.0),
281
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
282
+ * { activity: "CNC routing", start: none, end: none, qty: some(40.0),
283
+ * machines: { from: [], to: [] }, notes: "Cable ports", created_by: "planner" },
284
+ * { activity: "Assembly", start: none, end: none, qty: some(10.0),
285
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
286
+ * { activity: "Wrapping", start: none, end: none, qty: some(10.0),
287
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
288
+ * { activity: "Delivery", start: none, end: none, qty: some(2.0),
289
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
290
+ * ] }],
291
+ * ["WO-2206", { name: "WO-2206 · Kitchen, painted", customer: "Orrisdale Cottages", due: some(new Date("2026-11-06T00:00:00Z")), status: "PLANNED", ops: [
292
+ * { activity: "Panel cutting", start: none, end: none, qty: some(30.0),
293
+ * machines: { from: [], to: [variant("identified", { key: "S103" })] }, notes: "", created_by: "planner" },
294
+ * { activity: "Edge banding", start: none, end: none, qty: some(70.0),
295
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "edge bander" })] }, notes: "", created_by: "planner" },
296
+ * { activity: "Spray finish", start: none, end: none, qty: some(18.0),
297
+ * machines: { from: [], to: [variant("identified", { key: "F401" })] }, notes: "Primer, then two coats", created_by: "planner" },
298
+ * { activity: "Assembly", start: none, end: none, qty: some(8.0),
299
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
300
+ * { activity: "Wrapping", start: none, end: none, qty: some(8.0),
301
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
302
+ * { activity: "Delivery", start: none, end: none, qty: some(1.0),
303
+ * machines: { from: [], to: [] }, notes: "", created_by: "planner" },
304
+ * ] }],
305
+ * ]));
306
+ * export const sheetWorkshopOrdersPatch = e3.mutation.patch(sheetWorkshopOrders);
307
+ * const workshopRecommend = East.asyncPlatform(
308
+ * "sheet_workshop_recommend",
309
+ * [Sheet.Types.DraftContext(WorkshopOrder, "ops", WorkshopActivity)],
310
+ * ArrayType(Sheet.Types.Proposal(WorkshopOperation)),
311
+ * { optional: true },
312
+ * );
313
+ *
314
+ * const sheet = East.function([], UIComponentType, (_$) => (
315
+ * <Reactive>{$ => {
316
+ * const orders = $.let(Record.bind(sheetWorkshopOrders, [sheetWorkshopOrdersPatch]));
317
+ * const machines = $.let(Record.bind(sheetWorkshopMachines, []));
318
+ * const activities = $.let(Data.bind(sheetWorkshopActivities));
319
+ * const views = $.let(State.bind([ArrayType(Sheet.Types.View)], "sheet.workshop.views", []));
320
+ * const statuses = $.let([
321
+ * { word: "PLANNED", tone: variant("neutral", null) },
322
+ * { word: "RELEASED", tone: variant("info", null) },
323
+ * { word: "ON HOLD", tone: variant("warning", null) },
324
+ * ], ArrayType(WorkshopStatus));
325
+ * const BayType = StructType({ name: StringType, aliases: ArrayType(StringType) });
326
+ * const bays = $.let([
327
+ * { name: "Bay 1", aliases: ["b1", "saw bay"] },
328
+ * { name: "Bay 2", aliases: ["b2", "banding bay"] },
329
+ * { name: "Bay 3", aliases: ["b3", "router bay"] },
330
+ * { name: "Bay 4", aliases: ["b4", "spray bay"] },
331
+ * { name: "Bay 7", aliases: ["b7", "assembly bay"] },
332
+ * ], ArrayType(BayType));
333
+ * // Every operation of every order: what the slice searches and filters — the work centres by their display text.
334
+ * const operations = $.let(orders.read().toArray((_$, o) => o.ops).flatMap((_$, ops) => ops));
335
+ * const slice = $.let(Slice.bind("sheet_workshop", operations, {
336
+ * fields: {
337
+ * activity: { label: "Activity", hints: ["Panel cutting", "Edge banding", "CNC routing", "Drilling", "Sanding", "Assembly", "Spray finish", "Wrapping", "Delivery"] },
338
+ * notes: { label: "Notes" },
339
+ * machines: { label: "Work centres", text: o => Sheet.link.print(o.machines) },
340
+ * },
341
+ * search: ["activity", "notes", "machines"],
342
+ * }));
343
+ * const Ctx = Sheet.Types.DraftContext(WorkshopOrder, "ops", WorkshopActivity);
344
+ * const DateFill = OptionType(Sheet.Types.Fill(DateTimeType));
345
+ * const FloatFill = OptionType(Sheet.Types.Fill(FloatType));
346
+ * const TextFill = OptionType(Sheet.Types.Fill(StringType));
347
+ * const LinkFill = OptionType(Sheet.Types.Fill(Sheet.Types.Link));
348
+ * const Counted = OptionType(Sheet.Types.Counted);
349
+ * const Proposals = ArrayType(Sheet.Types.Proposal(WorkshopOperation));
350
+ * // derive — End = start + the activity's days.
351
+ * const endFromStart = $.const(East.function([Ctx], DateFill, ($, ctx) => {
352
+ * const noFill = $.const(none, DateFill);
353
+ * return ctx.row.start.match({
354
+ * value: (_$, supplied) => supplied.match({
355
+ * none: () => noFill,
356
+ * some: (_$, start) => ctx.driver.match({
357
+ * none: () => noFill,
358
+ * some: (_$, a) => some({ value: start.addDays(a.days), meta: East.str`+${a.days}d · ${a.name}` }),
359
+ * }),
360
+ * }),
361
+ * }, () => noFill);
362
+ * }));
363
+ * // sequence — the day after the last dated line above; else next Monday.
364
+ * const nextSlot = $.const(East.function([Ctx], DateFill, ($, ctx) => {
365
+ * const dated = $.let(ctx.rows.slice(0n, ctx.rowIndex).filter((_$, r) => r.start.hasTag("value").and(() => r.start.unwrap("value").hasTag("some"))));
366
+ * return dated.length().greater(0n).ifElse(
367
+ * ($2) => {
368
+ * const last = $2.let(dated.get(dated.length().subtract(1n)));
369
+ * return East.value(some({ value: last.start.unwrap("value").unwrap("some").addDays(1n), meta: "the day after the line above" }), DateFill);
370
+ * },
371
+ * ($2) => {
372
+ * const daysToMonday = $2.let(East.value(8n, IntegerType).subtract(ctx.today.getDayOfWeek()).remainder(7n));
373
+ * const monday = $2.let(ctx.today.addDays(daysToMonday.equal(0n).ifElse((_$) => 7n, (_$) => daysToMonday)));
374
+ * return East.value(some({ value: monday, meta: "next Monday" }), DateFill);
375
+ * });
376
+ * }));
377
+ * // history — the quantity of the last like operation in the order.
378
+ * const lastQuantity = $.const(East.function([Ctx], FloatFill, ($, ctx) => {
379
+ * const noFill = $.const(none, FloatFill);
380
+ * return ctx.row.activity.match({
381
+ * value: ($, activity) => {
382
+ * const similar = $.let(ctx.rows.slice(0n, ctx.rowIndex).filter((_$, r) =>
383
+ * r.activity.hasTag("value").and(() => r.activity.unwrap("value").equal(activity))
384
+ * .and(() => r.qty.hasTag("value")).and(() => r.qty.unwrap("value").hasTag("some"))));
385
+ * return similar.size().equal(0n).ifElse(() => noFill, ($) => {
386
+ * const row = $.let(similar.get(similar.size().subtract(1n)));
387
+ * return some({ value: row.qty.unwrap("value").unwrap("some"), meta: "the last like operation's quantity" });
388
+ * });
389
+ * },
390
+ * }, () => noFill);
391
+ * }));
392
+ * // default — a shift's worth at the activity's rate.
393
+ * const shiftQuantity = $.const(East.function([Ctx], FloatFill, ($, ctx) => {
394
+ * const noFill = $.const(none, FloatFill);
395
+ * return ctx.driver.match({
396
+ * none: (_$) => noFill,
397
+ * some: (_$, a) => East.value(some({ value: a.rate.multiply(8.0), meta: East.str`${a.rate}/h × 8 h` }), FloatFill),
398
+ * });
399
+ * }));
400
+ * // phrase — the notes, from the supplied quantity and the activity's unit.
401
+ * const phrase = $.const(East.function([Ctx], TextFill, ($, ctx) => {
402
+ * const noFill = $.const(none, TextFill);
403
+ * return ctx.row.qty.hasTag("value").and(() => ctx.row.qty.unwrap("value").hasTag("some")).ifElse(($) => {
404
+ * const qty = $.const(ctx.row.qty.unwrap("value").unwrap("some"));
405
+ * return ctx.driver.match({
406
+ * none: (_$) => noFill,
407
+ * some: (_$, a) => East.value(some({ value: East.str`${qty} ${a.uom} · ${a.name}`, meta: "phrasing from the supplied activity and quantity" }), TextFill),
408
+ * });
409
+ * }, () => noFill);
410
+ * }));
411
+ * // The arity rule — one machine of the activity's family for every sixty units.
412
+ * const impliedMachines = $.const(East.function([Ctx], Counted, ($, ctx) => {
413
+ * const noCount = $.const(none, Counted);
414
+ * $.if(ctx.row.qty.hasTag("value").not(), ($) => { $.return(noCount); });
415
+ * const supplied = $.const(ctx.row.qty.unwrap("value"));
416
+ * $.if(supplied.hasTag("some").not(), ($) => { $.return(noCount); });
417
+ * const qty = $.const(supplied.unwrap("some"));
418
+ * // ⌈qty ÷ 60⌉ by hand — `toInteger` refuses a fraction.
419
+ * const share = $.let(qty.divide(60.0));
420
+ * const frac = $.let(share.remainder(1.0));
421
+ * const needed = $.let(frac.equal(0.0).ifElse((_$) => share, (_$) => share.subtract(frac).add(1.0)).toInteger());
422
+ * return ctx.driver.match({
423
+ * none: (_$) => noCount,
424
+ * some: (_$, a) => a.family.equal("").or(() => qty.greater(0.0).not()).ifElse(
425
+ * (_$2) => noCount,
426
+ * (_$2) => East.value(some({ n: needed, key: a.family }), Counted)),
427
+ * });
428
+ * }));
429
+ * // capacity — the machines the quantity implies, counted.
430
+ * const capacity = $.const(East.function([Ctx], LinkFill, ($, ctx) => {
431
+ * const noFill = $.const(none, LinkFill);
432
+ * const noMembers = $.const([], ArrayType(Sheet.Types.Member));
433
+ * const implied = $.const(impliedMachines);
434
+ * return implied(ctx).match({
435
+ * none: (_$) => noFill,
436
+ * some: (_$, c) => East.value(some({ value: { from: [variant("counted", { n: c.n, key: c.key })], to: noMembers }, meta: "capacity · from the quantity" }), LinkFill),
437
+ * });
438
+ * }));
439
+ * // history — the work centres of the last like operation in the order.
440
+ * const lastMachines = $.const(East.function([Ctx], LinkFill, ($, ctx) => {
441
+ * const noFill = $.const(none, LinkFill);
442
+ * return ctx.row.activity.match({
443
+ * value: ($, activity) => {
444
+ * const similar = $.let(ctx.rows.slice(0n, ctx.rowIndex).filter((_$, r) =>
445
+ * r.activity.hasTag("value").and(() => r.activity.unwrap("value").equal(activity)).and(() => r.machines.hasTag("value"))));
446
+ * return similar.size().equal(0n).ifElse(() => noFill, ($) => {
447
+ * const link = $.let(similar.get(similar.size().subtract(1n)).machines.unwrap("value"));
448
+ * return link.from.size().add(link.to.size()).equal(0n).ifElse(
449
+ * () => noFill, () => some({ value: link, meta: "the work centres of the last like operation" }));
450
+ * });
451
+ * },
452
+ * }, () => noFill);
453
+ * }));
454
+ * // A member check — a machine on the From half runs the operation, so it is of the activity's family.
455
+ * const familyOf = $.let(activities.read().toDict((_$, a) => a.name, (_$, a) => a.family));
456
+ * const machineDict = $.let(machines.read());
457
+ * const familyFits = $.const(East.function([Sheet.Types.CheckContext(WorkshopOrder, "ops")], OptionType(StringType), ($, c) => {
458
+ * const noFlag = $.const(none, OptionType(StringType));
459
+ * return c.half.match({
460
+ * to: (_$) => noFlag,
461
+ * from: (_$) => c.member.match({
462
+ * identified: (_$2, m) => c.row.activity.match({
463
+ * value: (_$3, activity) => familyOf.has(activity)
464
+ * .and(() => familyOf.get(activity).equal("").not())
465
+ * .and(() => machineDict.has(m.key))
466
+ * .and(() => machineDict.get(m.key).family.equal(familyOf.get(activity)).not())
467
+ * .ifElse(
468
+ * (_$4) => East.value(some(East.str`${m.key} is a ${machineDict.get(m.key).family}, not a ${familyOf.get(activity)}`), OptionType(StringType)),
469
+ * (_$4) => noFlag),
470
+ * }, (_$3) => noFlag),
471
+ * }, (_$2) => noFlag),
472
+ * });
473
+ * }));
474
+ * // A pattern — panels cut are banded, then routed.
475
+ * const followUps = $.const(East.function([Ctx], Proposals, ($, ctx) => {
476
+ * const empty = $.const([], Proposals);
477
+ * return ctx.row.activity.hasTag("value")
478
+ * .and(() => ctx.row.activity.unwrap("value").equal("Panel cutting"))
479
+ * .and(() => ctx.row.end.hasTag("value"))
480
+ * .and(() => ctx.row.end.unwrap("value").hasTag("some")).ifElse(($) => {
481
+ * const end = $.const(ctx.row.end.unwrap("value").unwrap("some"));
482
+ * return $.const([
483
+ * { patch: Sheet.patch(WorkshopOperation, { activity: "Edge banding", start: some(end), end: some(end.addDays(1n)), notes: "Band the cut panels" }), meta: "edge banding after the cut" },
484
+ * { patch: Sheet.patch(WorkshopOperation, { activity: "CNC routing", start: some(end.addDays(1n)), end: some(end.addDays(3n)), notes: "Route the banded panels" }), meta: "routing · end +1…+3 d" },
485
+ * ], Proposals);
486
+ * }, () => empty);
487
+ * }));
488
+ * // Learned from the order — what followed this activity in it, after how long.
489
+ * const lastFollower = $.const(East.function([Ctx], Proposals, ($, ctx) => {
490
+ * const empty = $.const([], Proposals);
491
+ * return ctx.row.activity.hasTag("value")
492
+ * .and(() => ctx.row.start.hasTag("value"))
493
+ * .and(() => ctx.row.start.unwrap("value").hasTag("some")).ifElse(($) => {
494
+ * const activity = $.const(ctx.row.activity.unwrap("value"));
495
+ * const start = $.const(ctx.row.start.unwrap("value").unwrap("some"));
496
+ * const dated = $.const(ctx.rows.filter((_$, r) => r.start.hasTag("value")
497
+ * .and(() => r.start.unwrap("value").hasTag("some"))
498
+ * .and(() => r.activity.hasTag("value"))));
499
+ * const upper = $.const(dated.size().greater(1n).ifElse(() => dated.size().subtract(1n), () => 0n));
500
+ * const pairs = $.const(East.Array.range(0n, upper).filter((_$, i) =>
501
+ * dated.get(i).activity.unwrap("value").equal(activity)
502
+ * .and(() => dated.get(i.add(1n)).activity.unwrap("value").equal(activity).not())));
503
+ * return pairs.size().equal(0n).ifElse(() => empty, ($) => {
504
+ * const index = $.const(pairs.get(pairs.size().subtract(1n)));
505
+ * const from = $.const(dated.get(index));
506
+ * const next = $.const(dated.get(index.add(1n)));
507
+ * const gap = $.const(next.start.unwrap("value").unwrap("some").toEpochMilliseconds()
508
+ * .subtract(from.start.unwrap("value").unwrap("some").toEpochMilliseconds()));
509
+ * return $.const([{ patch: Sheet.patch(WorkshopOperation, { activity: next.activity.unwrap("value"), start: some(start.addMilliseconds(gap)) }),
510
+ * meta: "follower learned from the order" }], Proposals);
511
+ * });
512
+ * }, () => empty);
513
+ * }));
514
+ * // A model — an ASYNC proposer; the strip shows a pending chip, and a newer context cancels the wait.
515
+ * const modelProposals = $.const(East.asyncFunction([Ctx], Proposals, ($, ctx) => {
516
+ * const result = $.let([], Proposals);
517
+ * $.try(($) => { $.assign(result, workshopRecommend(ctx)); }).catch(($, message) => {
518
+ * // The showcase has no model behind it; any other failure still reaches the sheet's provider diagnostic.
519
+ * $.if(message.notEqual("Platform function 'sheet_workshop_recommend' is not available"), ($) => { $.error(message); });
520
+ * });
521
+ * return result;
522
+ * }));
523
+ * // The operations each kind of order starts with: the group templates' lines.
524
+ * const kitchen = $.let([
525
+ * { activity: "Panel cutting", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
526
+ * { activity: "Edge banding", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
527
+ * { activity: "Assembly", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
528
+ * { activity: "Spray finish", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
529
+ * ], ArrayType(WorkshopOperation));
530
+ * const wardrobe = $.let([
531
+ * { activity: "Panel cutting", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
532
+ * { activity: "Edge banding", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
533
+ * { activity: "Drilling", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
534
+ * { activity: "Assembly", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
535
+ * ], ArrayType(WorkshopOperation));
536
+ * const vanity = $.let([
537
+ * { activity: "Panel cutting", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
538
+ * { activity: "CNC routing", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
539
+ * { activity: "Spray finish", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
540
+ * { activity: "Assembly", start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "" },
541
+ * ], ArrayType(WorkshopOperation));
542
+ * // A new operation's and a new order's defaults, and the check every order passes before Save.
543
+ * const newRow = $.const(East.function([Sheet.Types.NewRow], Sheet.Types.Patch(WorkshopOperation), () =>
544
+ * Sheet.patch(WorkshopOperation, { start: none, end: none, qty: none, machines: { from: [], to: [] }, notes: "", created_by: "planner" })));
545
+ * const newGroup = $.const(East.function([Sheet.Types.NewGroup], Sheet.Types.Patch(WorkshopOrder), () =>
546
+ * Sheet.patch(WorkshopOrder, { status: "PLANNED", due: none, ops: [] })));
547
+ * const readyOrder = $.const(East.function([Sheet.Types.DraftGroup(WorkshopOrder, "ops")], Sheet.Types.Readiness, ($, order) => {
548
+ * $.if(order.customer.hasTag("value").and(() => order.customer.unwrap("value").length().equal(0n)), $ => {
549
+ * $.return(East.value(variant("incomplete", [{ field: "customer", message: "Name the customer" }]), Sheet.Types.Readiness));
550
+ * });
551
+ * return East.value(variant("ready", null), Sheet.Types.Readiness);
552
+ * }));
553
+ * return (
554
+ * <Box height="760px">
555
+ * <Sheet
556
+ * record={orders}
557
+ * group={Sheet.group(WorkshopOrder, "ops", {
558
+ * title: "name", sub: o => o.customer, noun: { singular: "order", plural: "orders" },
559
+ * cells: { activity: Sheet.group.cell.enum(WorkshopOrder, "statuses", "status"),
560
+ * end: Sheet.group.cell.date(WorkshopOrder, "due") },
561
+ * })}
562
+ * driver={Sheet.driver("activity", activities.read(), { key: a => a.name, label: a => a.name, meta: a => some(a.uom) })}
563
+ * registers={{
564
+ * machines: Sheet.register.concat([
565
+ * // A Dict's key rides as the accessors' second argument.
566
+ * Sheet.register.members(machines.read(), { kind: "machine", key: (_m, code) => code, label: (_m, code) => code,
567
+ * meta: m => some(m.family), parent: m => some(m.bay) }),
568
+ * Sheet.register.members(bays, { kind: "bay", key: b => b.name, label: b => b.name, aliases: b => b.aliases,
569
+ * meta: _b => some("bay") }),
570
+ * // Every machine names a family — duplicate keys fold, the first wins.
571
+ * Sheet.register.members(machines.read(), { kind: "family", key: m => m.family, label: m => m.family,
572
+ * meta: _m => some("family") }),
573
+ * ]),
574
+ * statuses: Sheet.register.members(statuses, { kind: "status", key: s => s.word, label: s => s.word, tone: s => some(s.tone) }),
575
+ * }}
576
+ * columns={{
577
+ * activity: Sheet.column.lookup(WorkshopOperation, { header: "Activity", width: "160px" }),
578
+ * start: Sheet.column.date(WorkshopOperation, { header: "Start", width: "96px", fill: [nextSlot] }),
579
+ * end: Sheet.column.date(WorkshopOperation, { header: "End", sub: "start + days", width: "96px",
580
+ * base: "start", fill: [endFromStart] }),
581
+ * qty: Sheet.column.quantity(WorkshopOperation, WorkshopActivity, { header: "Qty", sub: "unit per activity",
582
+ * width: "104px", uom: a => a.uom, format: Format.Number({ maximumFractionDigits: 0n }), fill: [lastQuantity, shiftQuantity] }),
583
+ * machines: Sheet.column.link(WorkshopOperation, WorkshopActivity, "machines", {
584
+ * header: "Work centres", sub: "from → to · 2 x edge bander", width: "300px",
585
+ * members: [{ kind: "machine", identified: true },
586
+ * { kind: "bay", countable: true, resolvesTo: "machine" },
587
+ * { kind: "family", countable: true, resolvesTo: "machine" }],
588
+ * multiple: { forms: ["N x kind", "kind x N"], ops: ["x", "X", "*", "×"], appliesTo: "countable" },
589
+ * sides: { value: a => a.sides, locks: { from: { to: "external", in: "in place" }, to: { from: "external" } } },
590
+ * arity: Sheet.link.arity("from", impliedMachines),
591
+ * check: [Sheet.link.check.exists(), familyFits],
592
+ * fill: [lastMachines, capacity] }),
593
+ * notes: Sheet.column.text(WorkshopOperation, { header: "Notes", width: "240px", fill: [phrase] }),
594
+ * }}
595
+ * suggest={{ ahead: 2n, triggers: ["activity", "start", "end", "qty", "notes", "machines"],
596
+ * propose: [followUps, modelProposals, lastFollower] }}
597
+ * // The inspector pane: every field of an operation; created_by, which no column shows, read only.
598
+ * inspector
599
+ * fields={{ created_by: Sheet.field.readonly() }}
600
+ * templates={{
601
+ * groups: [
602
+ * { key: "kitchen", name: "Kitchen order", group: "Orders",
603
+ * values: Sheet.patch(WorkshopOrder, { status: "PLANNED", due: none, ops: kitchen }) },
604
+ * { key: "wardrobe", name: "Wardrobe order", group: "Orders",
605
+ * values: Sheet.patch(WorkshopOrder, { status: "PLANNED", due: none, ops: wardrobe }) },
606
+ * { key: "vanity", name: "Vanity unit", group: "Orders",
607
+ * values: Sheet.patch(WorkshopOrder, { status: "PLANNED", due: none, ops: vanity }) },
608
+ * ],
609
+ * rows: [
610
+ * { key: "cut", name: "Panel cutting", group: "Operations",
611
+ * values: Sheet.patch(WorkshopOperation, { activity: "Panel cutting",
612
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "beam saw" })] } }) },
613
+ * { key: "edge", name: "Edge banding", group: "Operations",
614
+ * values: Sheet.patch(WorkshopOperation, { activity: "Edge banding",
615
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "edge bander" })] } }) },
616
+ * { key: "route", name: "CNC routing", group: "Operations",
617
+ * values: Sheet.patch(WorkshopOperation, { activity: "CNC routing",
618
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "CNC router" })] } }) },
619
+ * { key: "sand", name: "Sanding", group: "Operations",
620
+ * values: Sheet.patch(WorkshopOperation, { activity: "Sanding" }) },
621
+ * { key: "spray", name: "Spray finish", group: "Operations",
622
+ * values: Sheet.patch(WorkshopOperation, { activity: "Spray finish",
623
+ * machines: { from: [], to: [variant("counted", { n: 1n, key: "spray booth" })] } }) },
624
+ * { key: "assemble", name: "Assembly", group: "Operations",
625
+ * values: Sheet.patch(WorkshopOperation, { activity: "Assembly" }) },
626
+ * { key: "wrap", name: "Wrapping", group: "Dispatch",
627
+ * values: Sheet.patch(WorkshopOperation, { activity: "Wrapping" }) },
628
+ * { key: "deliver", name: "Delivery", group: "Dispatch",
629
+ * values: Sheet.patch(WorkshopOperation, { activity: "Delivery" }) },
630
+ * ],
631
+ * }}
632
+ * library={[
633
+ * Sheet.library.rows(),
634
+ * // The statuses an order takes: a card dropped on an order's band sets its status.
635
+ * Sheet.library.tab(statuses, { name: "Statuses", icon: "flag",
636
+ * key: s => s.word, label: s => s.word, drop: s => Sheet.patch(WorkshopOrder, { status: s.word }) }),
637
+ * Sheet.library.columns(),
638
+ * ]}
639
+ * newRow={newRow}
640
+ * newGroup={newGroup}
641
+ * ready={{ group: readyOrder }}
642
+ * slice={slice} affordances={["search", "filter"]}
643
+ * views={views}
644
+ * footer={[{ text: East.str`${operations.size()} operations` }]}
645
+ * name="workshop"
646
+ * />
647
+ * </Box>
648
+ * );
649
+ * }}</Reactive>
650
+ * ));
651
+ * ```
652
+ */
653
+ export function createDriver(column, data, config) {
654
+ const expr = East.value(data);
655
+ const t = Expr.type(expr);
656
+ if (t.type !== "Array" || t.value.type !== "Struct") {
657
+ throw new Error(`Sheet.driver("${column}"): data must be an Array of structs — got a ${t.type}`);
658
+ }
659
+ const rowType = t.value;
660
+ const cfg = config;
661
+ const keyFn = East.function([rowType], StringType, (_$, d) => cfg.key(d));
662
+ const members = createMembers(expr, {
663
+ kind: column,
664
+ key: (d) => keyFn(d),
665
+ label: (d) => cfg.label(d),
666
+ ...(cfg.aliases !== undefined ? { aliases: (d) => cfg.aliases(d) } : {}),
667
+ ...(cfg.meta !== undefined ? { meta: (d) => cfg.meta(d) } : {}),
668
+ });
669
+ return { column, rowType, data: expr, keyFn, members };
670
+ }
671
+ //# sourceMappingURL=registers.js.map