@rippling/rippling-sdk 0.2.0-alpha.36 → 0.2.0-alpha.38

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 (232) hide show
  1. package/client.d.mts +7 -1
  2. package/client.d.mts.map +1 -1
  3. package/client.d.ts +7 -1
  4. package/client.d.ts.map +1 -1
  5. package/client.js +7 -1
  6. package/client.js.map +1 -1
  7. package/client.mjs +7 -1
  8. package/client.mjs.map +1 -1
  9. package/examples/manifest/dental-practice-management/dental-practice-management.ts +21 -34
  10. package/examples/manifest/gym-membership-management/gym-membership-management.ts +27 -38
  11. package/examples/manifest/gym-membership-management/manifest.json +1 -1
  12. package/examples/sdui/sdui-crud-todo/sdui-crud-todo.ts +3 -3
  13. package/examples/sdui/sdui-showcase/sdui-showcase.ts +6 -11
  14. package/examples/sdui/sdui-tab-multi-view/sdui-tab-multi-view.ts +14 -24
  15. package/examples/sdui/vote/vote.ts +7 -11
  16. package/internal/utils/log.d.mts.map +1 -1
  17. package/internal/utils/log.d.ts.map +1 -1
  18. package/internal/utils/log.js +2 -0
  19. package/internal/utils/log.js.map +1 -1
  20. package/internal/utils/log.mjs +2 -0
  21. package/internal/utils/log.mjs.map +1 -1
  22. package/lib/manifest/category.d.mts +4 -2
  23. package/lib/manifest/category.d.mts.map +1 -1
  24. package/lib/manifest/category.d.ts +4 -2
  25. package/lib/manifest/category.d.ts.map +1 -1
  26. package/lib/manifest/category.js +2 -2
  27. package/lib/manifest/category.js.map +1 -1
  28. package/lib/manifest/category.mjs +2 -2
  29. package/lib/manifest/category.mjs.map +1 -1
  30. package/lib/manifest/custom-object-field-section.d.mts +4 -0
  31. package/lib/manifest/custom-object-field-section.d.mts.map +1 -1
  32. package/lib/manifest/custom-object-field-section.d.ts +4 -0
  33. package/lib/manifest/custom-object-field-section.d.ts.map +1 -1
  34. package/lib/manifest/custom-object-field-section.js +6 -0
  35. package/lib/manifest/custom-object-field-section.js.map +1 -1
  36. package/lib/manifest/custom-object-field-section.mjs +6 -0
  37. package/lib/manifest/custom-object-field-section.mjs.map +1 -1
  38. package/lib/manifest/custom-object-page-layout.d.mts +23 -13
  39. package/lib/manifest/custom-object-page-layout.d.mts.map +1 -1
  40. package/lib/manifest/custom-object-page-layout.d.ts +23 -13
  41. package/lib/manifest/custom-object-page-layout.d.ts.map +1 -1
  42. package/lib/manifest/custom-object-page-layout.js +122 -9
  43. package/lib/manifest/custom-object-page-layout.js.map +1 -1
  44. package/lib/manifest/custom-object-page-layout.mjs +122 -9
  45. package/lib/manifest/custom-object-page-layout.mjs.map +1 -1
  46. package/lib/manifest/custom-object.d.mts +30 -1
  47. package/lib/manifest/custom-object.d.mts.map +1 -1
  48. package/lib/manifest/custom-object.d.ts +30 -1
  49. package/lib/manifest/custom-object.d.ts.map +1 -1
  50. package/lib/manifest/custom-object.js +15 -1
  51. package/lib/manifest/custom-object.js.map +1 -1
  52. package/lib/manifest/custom-object.mjs +15 -1
  53. package/lib/manifest/custom-object.mjs.map +1 -1
  54. package/lib/manifest/field.d.mts +25 -3
  55. package/lib/manifest/field.d.mts.map +1 -1
  56. package/lib/manifest/field.d.ts +25 -3
  57. package/lib/manifest/field.d.ts.map +1 -1
  58. package/lib/manifest/field.js +28 -2
  59. package/lib/manifest/field.js.map +1 -1
  60. package/lib/manifest/field.mjs +28 -2
  61. package/lib/manifest/field.mjs.map +1 -1
  62. package/lib/manifest/index.d.mts +1 -1
  63. package/lib/manifest/index.d.mts.map +1 -1
  64. package/lib/manifest/index.d.ts +1 -1
  65. package/lib/manifest/index.d.ts.map +1 -1
  66. package/lib/manifest/index.js.map +1 -1
  67. package/lib/manifest/index.mjs.map +1 -1
  68. package/lib/manifest/manifest-builder.d.mts +1 -1
  69. package/lib/manifest/manifest-builder.d.ts +1 -1
  70. package/lib/manifest/manifest-builder.js +1 -1
  71. package/lib/manifest/manifest-builder.mjs +1 -1
  72. package/lib/manifest/manifest-function.d.mts +8 -2
  73. package/lib/manifest/manifest-function.d.mts.map +1 -1
  74. package/lib/manifest/manifest-function.d.ts +8 -2
  75. package/lib/manifest/manifest-function.d.ts.map +1 -1
  76. package/lib/manifest/manifest-function.js +8 -2
  77. package/lib/manifest/manifest-function.js.map +1 -1
  78. package/lib/manifest/manifest-function.mjs +8 -2
  79. package/lib/manifest/manifest-function.mjs.map +1 -1
  80. package/lib/sdui/actions.d.mts.map +1 -1
  81. package/lib/sdui/actions.d.ts.map +1 -1
  82. package/lib/sdui/actions.js +23 -13
  83. package/lib/sdui/actions.js.map +1 -1
  84. package/lib/sdui/actions.mjs +23 -13
  85. package/lib/sdui/actions.mjs.map +1 -1
  86. package/lib/sdui/component.d.mts +28 -11
  87. package/lib/sdui/component.d.mts.map +1 -1
  88. package/lib/sdui/component.d.ts +28 -11
  89. package/lib/sdui/component.d.ts.map +1 -1
  90. package/lib/sdui/component.js +69 -36
  91. package/lib/sdui/component.js.map +1 -1
  92. package/lib/sdui/component.mjs +69 -36
  93. package/lib/sdui/component.mjs.map +1 -1
  94. package/lib/sdui/components.d.mts +1141 -132
  95. package/lib/sdui/components.d.mts.map +1 -1
  96. package/lib/sdui/components.d.ts +1141 -132
  97. package/lib/sdui/components.d.ts.map +1 -1
  98. package/lib/sdui/components.js +834 -206
  99. package/lib/sdui/components.js.map +1 -1
  100. package/lib/sdui/components.mjs +830 -203
  101. package/lib/sdui/components.mjs.map +1 -1
  102. package/lib/sdui/directives.d.mts.map +1 -1
  103. package/lib/sdui/directives.d.ts.map +1 -1
  104. package/lib/sdui/directives.js +4 -1
  105. package/lib/sdui/directives.js.map +1 -1
  106. package/lib/sdui/directives.mjs +4 -1
  107. package/lib/sdui/directives.mjs.map +1 -1
  108. package/lib/sdui/index.d.mts +314 -261
  109. package/lib/sdui/index.d.mts.map +1 -1
  110. package/lib/sdui/index.d.ts +314 -261
  111. package/lib/sdui/index.d.ts.map +1 -1
  112. package/lib/sdui/index.js +255 -204
  113. package/lib/sdui/index.js.map +1 -1
  114. package/lib/sdui/index.mjs +128 -103
  115. package/lib/sdui/index.mjs.map +1 -1
  116. package/lib/sdui/propTypes.d.mts +6330 -0
  117. package/lib/sdui/propTypes.d.mts.map +1 -0
  118. package/lib/sdui/propTypes.d.ts +6330 -0
  119. package/lib/sdui/propTypes.d.ts.map +1 -0
  120. package/lib/sdui/propTypes.js +14 -0
  121. package/lib/sdui/propTypes.js.map +1 -0
  122. package/lib/sdui/propTypes.mjs +13 -0
  123. package/lib/sdui/propTypes.mjs.map +1 -0
  124. package/lib/sdui/render.d.mts +1 -1
  125. package/lib/sdui/render.d.mts.map +1 -1
  126. package/lib/sdui/render.d.ts +1 -1
  127. package/lib/sdui/render.d.ts.map +1 -1
  128. package/lib/sdui/render.js +11 -3
  129. package/lib/sdui/render.js.map +1 -1
  130. package/lib/sdui/render.mjs +11 -3
  131. package/lib/sdui/render.mjs.map +1 -1
  132. package/lib/sdui/state.d.mts.map +1 -1
  133. package/lib/sdui/state.d.ts.map +1 -1
  134. package/lib/sdui/state.js +3 -1
  135. package/lib/sdui/state.js.map +1 -1
  136. package/lib/sdui/state.mjs +3 -1
  137. package/lib/sdui/state.mjs.map +1 -1
  138. package/package.json +1 -1
  139. package/resources/company-legal-entities.d.mts +180 -0
  140. package/resources/company-legal-entities.d.mts.map +1 -0
  141. package/resources/company-legal-entities.d.ts +180 -0
  142. package/resources/company-legal-entities.d.ts.map +1 -0
  143. package/resources/company-legal-entities.js +30 -0
  144. package/resources/company-legal-entities.js.map +1 -0
  145. package/resources/company-legal-entities.mjs +26 -0
  146. package/resources/company-legal-entities.mjs.map +1 -0
  147. package/resources/earning-types.d.mts +1 -6
  148. package/resources/earning-types.d.mts.map +1 -1
  149. package/resources/earning-types.d.ts +1 -6
  150. package/resources/earning-types.d.ts.map +1 -1
  151. package/resources/earning-types.js +1 -1
  152. package/resources/earning-types.mjs +1 -1
  153. package/resources/earnings-inputs.d.mts +1 -1
  154. package/resources/earnings-inputs.d.ts +1 -1
  155. package/resources/earnings-inputs.js +1 -1
  156. package/resources/earnings-inputs.mjs +1 -1
  157. package/resources/index.d.mts +2 -1
  158. package/resources/index.d.mts.map +1 -1
  159. package/resources/index.d.ts +2 -1
  160. package/resources/index.d.ts.map +1 -1
  161. package/resources/index.js +5 -3
  162. package/resources/index.js.map +1 -1
  163. package/resources/index.mjs +2 -1
  164. package/resources/index.mjs.map +1 -1
  165. package/resources/legal-entities.d.mts +1 -1
  166. package/resources/legal-entities.d.mts.map +1 -1
  167. package/resources/legal-entities.d.ts +1 -1
  168. package/resources/legal-entities.d.ts.map +1 -1
  169. package/resources/payroll-runs/index.d.mts +3 -0
  170. package/resources/payroll-runs/index.d.mts.map +1 -0
  171. package/resources/payroll-runs/index.d.ts +3 -0
  172. package/resources/payroll-runs/index.d.ts.map +1 -0
  173. package/resources/payroll-runs/index.js +9 -0
  174. package/resources/payroll-runs/index.js.map +1 -0
  175. package/resources/payroll-runs/index.mjs +4 -0
  176. package/resources/payroll-runs/index.mjs.map +1 -0
  177. package/resources/payroll-runs/payroll-runs.d.mts +199 -0
  178. package/resources/payroll-runs/payroll-runs.d.mts.map +1 -0
  179. package/resources/payroll-runs/payroll-runs.d.ts +199 -0
  180. package/resources/payroll-runs/payroll-runs.d.ts.map +1 -0
  181. package/resources/payroll-runs/payroll-runs.js +40 -0
  182. package/resources/payroll-runs/payroll-runs.js.map +1 -0
  183. package/resources/payroll-runs/payroll-runs.mjs +35 -0
  184. package/resources/payroll-runs/payroll-runs.mjs.map +1 -0
  185. package/resources/payroll-runs/worker-payroll-records.d.mts +200 -0
  186. package/resources/payroll-runs/worker-payroll-records.d.mts.map +1 -0
  187. package/resources/payroll-runs/worker-payroll-records.d.ts +200 -0
  188. package/resources/payroll-runs/worker-payroll-records.d.ts.map +1 -0
  189. package/resources/payroll-runs/worker-payroll-records.js +23 -0
  190. package/resources/payroll-runs/worker-payroll-records.js.map +1 -0
  191. package/resources/payroll-runs/worker-payroll-records.mjs +19 -0
  192. package/resources/payroll-runs/worker-payroll-records.mjs.map +1 -0
  193. package/resources/payroll-runs.d.mts +1 -194
  194. package/resources/payroll-runs.d.mts.map +1 -1
  195. package/resources/payroll-runs.d.ts +1 -194
  196. package/resources/payroll-runs.d.ts.map +1 -1
  197. package/resources/payroll-runs.js +2 -28
  198. package/resources/payroll-runs.js.map +1 -1
  199. package/resources/payroll-runs.mjs +1 -26
  200. package/resources/payroll-runs.mjs.map +1 -1
  201. package/src/client.ts +27 -7
  202. package/src/internal/utils/log.ts +2 -0
  203. package/src/lib/manifest/category.ts +7 -5
  204. package/src/lib/manifest/custom-object-field-section.ts +7 -0
  205. package/src/lib/manifest/custom-object-page-layout.ts +225 -18
  206. package/src/lib/manifest/custom-object.ts +30 -1
  207. package/src/lib/manifest/field.ts +29 -3
  208. package/src/lib/manifest/index.ts +2 -0
  209. package/src/lib/manifest/manifest-builder.ts +1 -1
  210. package/src/lib/manifest/manifest-function.ts +8 -2
  211. package/src/lib/sdui/actions.ts +23 -10
  212. package/src/lib/sdui/component.ts +84 -44
  213. package/src/lib/sdui/components.ts +1627 -212
  214. package/src/lib/sdui/directives.ts +4 -1
  215. package/src/lib/sdui/index.ts +565 -200
  216. package/src/lib/sdui/propTypes.ts +8470 -0
  217. package/src/lib/sdui/render.ts +13 -5
  218. package/src/lib/sdui/state.ts +8 -2
  219. package/src/resources/company-legal-entities.ts +237 -0
  220. package/src/resources/earning-types.ts +1 -7
  221. package/src/resources/earnings-inputs.ts +1 -1
  222. package/src/resources/index.ts +8 -1
  223. package/src/resources/legal-entities.ts +1 -1
  224. package/src/resources/payroll-runs/index.ts +15 -0
  225. package/src/resources/payroll-runs/payroll-runs.ts +270 -0
  226. package/src/resources/payroll-runs/worker-payroll-records.ts +255 -0
  227. package/src/resources/payroll-runs.ts +1 -249
  228. package/src/version.ts +1 -1
  229. package/version.d.mts +1 -1
  230. package/version.d.ts +1 -1
  231. package/version.js +1 -1
  232. package/version.mjs +1 -1
@@ -2,8 +2,14 @@
2
2
  * Defines a serverless function and registers it with the manifest.
3
3
  *
4
4
  * A `ManifestFunction` packages TypeScript handler code that runs on Rippling's
5
- * serverless infrastructure. Functions are the backing implementation for
6
- * {@link SduiPage} surfaces. The handler must export `onRipplingEvent`.
5
+ * serverless infrastructure. The handler must export `onRipplingEvent`.
6
+ *
7
+ * Functions have two primary uses:
8
+ * 1. **Authoring SDUI for Custom Apps** — the function returns an SDUI spec
9
+ * (built with `@rippling/sdui-builder`) that renders as a page tab. Wrap the
10
+ * function in an {@link SduiPage} and reference it from an {@link App}.
11
+ * 2. **Workflow / event handlers** — functions invoked from rules, automations,
12
+ * or callbacks that do not render UI.
7
13
  *
8
14
  * This class is named `ManifestFunction` to avoid collision with the JavaScript
9
15
  * built-in `Function`. It is also re-exported as `Function` from the barrel for
@@ -1 +1 @@
1
- {"version":3,"file":"manifest-function.mjs","sourceRoot":"","sources":["../../src/lib/manifest/manifest-function.ts"],"names":[],"mappings":"AAkEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,OAAO,gBAAgB;IAU3B;;;OAGG;IACH,YAAY,KAAoB,EAAE,KAA4B;QAC5D,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAClD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,kBAAkB,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;QACvC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,MAAM;QACJ,MAAM,SAAS,GAAwB;YACrC,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;QACF,IAAI,IAAI,CAAC,YAAY;YAAE,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;QACpE,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACrD,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;YAAE,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAC/E,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI;YAAE,SAAS,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC/F,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI;YAAE,SAAS,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;QACtF,IAAI,IAAI,CAAC,QAAQ;YAAE,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
1
+ {"version":3,"file":"manifest-function.mjs","sourceRoot":"","sources":["../../src/lib/manifest/manifest-function.ts"],"names":[],"mappings":"AAkEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,OAAO,gBAAgB;IAU3B;;;OAGG;IACH,YAAY,KAAoB,EAAE,KAA4B;QAC5D,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC;QAC5C,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,YAAY,CAAC;QACxC,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC,iBAAiB,CAAC;QAClD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,kBAAkB,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAC3F,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,cAAc,CAAC;QAC5C,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC;QACvC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,MAAM;QACJ,MAAM,SAAS,GAAwB;YACrC,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC;QACF,IAAI,IAAI,CAAC,YAAY;YAAE,SAAS,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;QACpE,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;QACrD,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;YAAE,SAAS,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;QAC/E,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI;YAAE,SAAS,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC/F,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI;YAAE,SAAS,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC;QACtF,IAAI,IAAI,CAAC,QAAQ;YAAE,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;QAChD,OAAO,SAAS,CAAC;IACnB,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.mts","sourceRoot":"","sources":["../../src/lib/sdui/actions.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,aAAa,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC7D,OAAO,CAAC,EAAE,aAAa,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC5D;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAE/D;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CAM5F;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAElE;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,aAAa,CAQf;AAED,wBAAgB,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CAEnF;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAEtE;AAED,wBAAgB,QAAQ,CAAC,SAAS,SAAoB,GAAG,aAAa,CAErE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAExD;AAED,wBAAgB,UAAU,IAAI,aAAa,CAE1C"}
1
+ {"version":3,"file":"actions.d.mts","sourceRoot":"","sources":["../../src/lib/sdui/actions.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,aAAa,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC7D,OAAO,CAAC,EAAE,aAAa,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC5D;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAE/D;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CAO5F;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAKlE;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,aAAa,CAiBf;AAED,wBAAgB,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CAEnF;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAEtE;AAED,wBAAgB,QAAQ,CAAC,SAAS,SAAoB,GAAG,aAAa,CAErE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAExD;AAED,wBAAgB,UAAU,IAAI,aAAa,CAE1C"}
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/lib/sdui/actions.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,aAAa,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC7D,OAAO,CAAC,EAAE,aAAa,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC5D;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAE/D;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CAM5F;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAElE;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,aAAa,CAQf;AAED,wBAAgB,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CAEnF;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAEtE;AAED,wBAAgB,QAAQ,CAAC,SAAS,SAAoB,GAAG,aAAa,CAErE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAExD;AAED,wBAAgB,UAAU,IAAI,aAAa,CAE1C"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/lib/sdui/actions.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,aAAa,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAC7D,OAAO,CAAC,EAAE,aAAa,GAAG;QAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC5D;AAED,wBAAgB,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAE/D;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CAO5F;AAED,wBAAgB,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,aAAa,CAKlE;AAED,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,aAAa,CAiBf;AAED,wBAAgB,GAAG,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CAEnF;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAEtE;AAED,wBAAgB,QAAQ,CAAC,SAAS,SAAoB,GAAG,aAAa,CAErE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAExD;AAED,wBAAgB,UAAU,IAAI,aAAa,CAE1C"}
@@ -14,25 +14,35 @@ function set(ref, value) {
14
14
  return { action: 'setState', params: { statePath: (0, state_1.extractPath)(ref), value } };
15
15
  }
16
16
  function push(ref, value, opts) {
17
- const params = { statePath: (0, state_1.extractPath)(ref), value };
18
- if (opts?.clear) {
19
- params['clearStatePath'] = (0, state_1.extractPath)(opts.clear);
20
- }
17
+ const params = {
18
+ statePath: (0, state_1.extractPath)(ref),
19
+ value,
20
+ ...(opts?.clear ? { clearStatePath: (0, state_1.extractPath)(opts.clear) } : {}),
21
+ };
21
22
  return { action: 'pushState', params };
22
23
  }
23
24
  function remove(ref, index) {
24
- return { action: 'removeState', params: { statePath: (0, state_1.extractPath)(ref), index } };
25
+ return {
26
+ action: 'removeState',
27
+ params: { statePath: (0, state_1.extractPath)(ref), index },
28
+ };
25
29
  }
26
30
  function callFunction(functionId, action, opts) {
27
31
  const { responsePath, onSuccess, onError, ...rest } = opts || {};
28
- const params = { functionId, action, ...rest };
29
- if (responsePath !== undefined)
30
- params['responsePath'] = responsePath;
31
- const binding = { action: 'triggerFunction', params };
32
- if (onSuccess)
33
- binding.onSuccess = onSuccess;
34
- if (onError)
35
- binding.onError = onError;
32
+ // Spread rest FIRST so explicit functionId/action always win if opts
33
+ // happens to carry colliding keys.
34
+ const params = {
35
+ ...rest,
36
+ functionId,
37
+ action,
38
+ ...(responsePath !== undefined ? { responsePath } : {}),
39
+ };
40
+ const binding = {
41
+ action: 'triggerFunction',
42
+ params,
43
+ ...(onSuccess ? { onSuccess: onSuccess } : {}),
44
+ ...(onError ? { onError: onError } : {}),
45
+ };
36
46
  return binding;
37
47
  }
38
48
  function nav(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/lib/sdui/actions.ts"],"names":[],"mappings":";;AASA,kBAEC;AAED,oBAMC;AAED,wBAEC;AAED,oCAYC;AAED,kBAEC;AAED,wBAEC;AAED,4BAEC;AAED,8BAEC;AAED,gCAEC;AAzDD,sCAAsC;AAStC,SAAgB,GAAG,CAAC,GAAY,EAAE,KAAc;IAC9C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAA,mBAAW,EAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAChF,CAAC;AAED,SAAgB,IAAI,CAAC,GAAY,EAAE,KAAc,EAAE,IAA0B;IAC3E,MAAM,MAAM,GAA4B,EAAE,SAAS,EAAE,IAAA,mBAAW,EAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IAC/E,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAA,mBAAW,EAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC;AAED,SAAgB,MAAM,CAAC,GAAY,EAAE,KAAc;IACjD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAA,mBAAW,EAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AACnF,CAAC;AAED,SAAgB,YAAY,CAC1B,UAAkB,EAClB,MAAc,EACd,IAA8B;IAE9B,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IACjE,MAAM,MAAM,GAA4B,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;IACxE,IAAI,YAAY,KAAK,SAAS;QAAE,MAAM,CAAC,cAAc,CAAC,GAAG,YAAY,CAAC;IACtE,MAAM,OAAO,GAAkB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC;IACrE,IAAI,SAAS;QAAE,OAAO,CAAC,SAAS,GAAG,SAA0B,CAAC;IAC9D,IAAI,OAAO;QAAE,OAAO,CAAC,OAAO,GAAG,OAAwB,CAAC;IACxD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,GAAG,CAAC,MAAgD;IAClE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,SAAgB,MAAM,CAAC,OAAe,EAAE,OAAe;IACrD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;AACtE,CAAC;AAED,SAAgB,QAAQ,CAAC,SAAS,GAAG,iBAAiB;IACpD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED,SAAgB,SAAS,CAAC,OAAe;IACvC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;AACtD,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/lib/sdui/actions.ts"],"names":[],"mappings":";;AASA,kBAEC;AAED,oBAOC;AAED,wBAKC;AAED,oCAqBC;AAED,kBAEC;AAED,wBAEC;AAED,4BAEC;AAED,8BAEC;AAED,gCAEC;AAtED,sCAAsC;AAStC,SAAgB,GAAG,CAAC,GAAY,EAAE,KAAc;IAC9C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,IAAA,mBAAW,EAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAChF,CAAC;AAED,SAAgB,IAAI,CAAC,GAAY,EAAE,KAAc,EAAE,IAA0B;IAC3E,MAAM,MAAM,GAA4B;QACtC,SAAS,EAAE,IAAA,mBAAW,EAAC,GAAG,CAAC;QAC3B,KAAK;QACL,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAA,mBAAW,EAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC;AAED,SAAgB,MAAM,CAAC,GAAY,EAAE,KAAc;IACjD,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,EAAE,SAAS,EAAE,IAAA,mBAAW,EAAC,GAAG,CAAC,EAAE,KAAK,EAAE;KAC/C,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAC1B,UAAkB,EAClB,MAAc,EACd,IAA8B;IAE9B,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IACjE,qEAAqE;IACrE,mCAAmC;IACnC,MAAM,MAAM,GAA4B;QACtC,GAAG,IAAI;QACP,UAAU;QACV,MAAM;QACN,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC;IACF,MAAM,OAAO,GAAkB;QAC7B,MAAM,EAAE,iBAAiB;QACzB,MAAM;QACN,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAA0B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAwB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,GAAG,CAAC,MAAgD;IAClE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,SAAgB,MAAM,CAAC,OAAe,EAAE,OAAe;IACrD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;AACtE,CAAC;AAED,SAAgB,QAAQ,CAAC,SAAS,GAAG,iBAAiB;IACpD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED,SAAgB,SAAS,CAAC,OAAe;IACvC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;AACtD,CAAC;AAED,SAAgB,UAAU;IACxB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC"}
@@ -3,25 +3,35 @@ export function set(ref, value) {
3
3
  return { action: 'setState', params: { statePath: extractPath(ref), value } };
4
4
  }
5
5
  export function push(ref, value, opts) {
6
- const params = { statePath: extractPath(ref), value };
7
- if (opts?.clear) {
8
- params['clearStatePath'] = extractPath(opts.clear);
9
- }
6
+ const params = {
7
+ statePath: extractPath(ref),
8
+ value,
9
+ ...(opts?.clear ? { clearStatePath: extractPath(opts.clear) } : {}),
10
+ };
10
11
  return { action: 'pushState', params };
11
12
  }
12
13
  export function remove(ref, index) {
13
- return { action: 'removeState', params: { statePath: extractPath(ref), index } };
14
+ return {
15
+ action: 'removeState',
16
+ params: { statePath: extractPath(ref), index },
17
+ };
14
18
  }
15
19
  export function callFunction(functionId, action, opts) {
16
20
  const { responsePath, onSuccess, onError, ...rest } = opts || {};
17
- const params = { functionId, action, ...rest };
18
- if (responsePath !== undefined)
19
- params['responsePath'] = responsePath;
20
- const binding = { action: 'triggerFunction', params };
21
- if (onSuccess)
22
- binding.onSuccess = onSuccess;
23
- if (onError)
24
- binding.onError = onError;
21
+ // Spread rest FIRST so explicit functionId/action always win if opts
22
+ // happens to carry colliding keys.
23
+ const params = {
24
+ ...rest,
25
+ functionId,
26
+ action,
27
+ ...(responsePath !== undefined ? { responsePath } : {}),
28
+ };
29
+ const binding = {
30
+ action: 'triggerFunction',
31
+ params,
32
+ ...(onSuccess ? { onSuccess: onSuccess } : {}),
33
+ ...(onError ? { onError: onError } : {}),
34
+ };
25
35
  return binding;
26
36
  }
27
37
  export function nav(config) {
@@ -1 +1 @@
1
- {"version":3,"file":"actions.mjs","sourceRoot":"","sources":["../../src/lib/sdui/actions.ts"],"names":[],"mappings":"OAAO,EAAE,WAAW,EAAE;AAStB,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,KAAc;IAC9C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAY,EAAE,KAAc,EAAE,IAA0B;IAC3E,MAAM,MAAM,GAA4B,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC;IAC/E,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,gBAAgB,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAY,EAAE,KAAc;IACjD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,UAAkB,EAClB,MAAc,EACd,IAA8B;IAE9B,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IACjE,MAAM,MAAM,GAA4B,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC;IACxE,IAAI,YAAY,KAAK,SAAS;QAAE,MAAM,CAAC,cAAc,CAAC,GAAG,YAAY,CAAC;IACtE,MAAM,OAAO,GAAkB,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,CAAC;IACrE,IAAI,SAAS;QAAE,OAAO,CAAC,SAAS,GAAG,SAA0B,CAAC;IAC9D,IAAI,OAAO;QAAE,OAAO,CAAC,OAAO,GAAG,OAAwB,CAAC;IACxD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,MAAgD;IAClE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE,OAAe;IACrD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,SAAS,GAAG,iBAAiB;IACpD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"actions.mjs","sourceRoot":"","sources":["../../src/lib/sdui/actions.ts"],"names":[],"mappings":"OAAO,EAAE,WAAW,EAAE;AAStB,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,KAAc;IAC9C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,GAAY,EAAE,KAAc,EAAE,IAA0B;IAC3E,MAAM,MAAM,GAA4B;QACtC,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC;QAC3B,KAAK;QACL,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpE,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,GAAY,EAAE,KAAc;IACjD,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE;KAC/C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,UAAkB,EAClB,MAAc,EACd,IAA8B;IAE9B,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IACjE,qEAAqE;IACrE,mCAAmC;IACnC,MAAM,MAAM,GAA4B;QACtC,GAAG,IAAI;QACP,UAAU;QACV,MAAM;QACN,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxD,CAAC;IACF,MAAM,OAAO,GAAkB;QAC7B,MAAM,EAAE,iBAAiB;QACzB,MAAM;QACN,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAA0B,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAwB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1D,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,MAAgD;IAClE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE,OAAe;IACrD,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,SAAS,GAAG,iBAAiB;IACpD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClC,CAAC"}
@@ -1,20 +1,28 @@
1
1
  /**
2
2
  * component() — creates a stateful component boundary.
3
3
  *
4
- * Provides ctx.useState (scoped local state) and ctx.useEffect (onMount actions).
5
- * The returned element is automatically wrapped with _LocalStateProvider in the rendered spec.
4
+ * Provides ctx.localState (scoped local state slot) and ctx.onMount (an
5
+ * action that fires once when the component mounts on the client). The
6
+ * runtime handles state setup and mount firing; consumers don't need to
7
+ * know how the wrapping is implemented.
8
+ *
9
+ * NOTE: these are NOT React hooks. The factory runs ONCE at spec-build
10
+ * time, producing a JSON description of the UI. `localState` returns a
11
+ * path-builder proxy (not a [value, setter] tuple); `onMount` registers
12
+ * a JSON action that fires on first client render (not an effect that
13
+ * re-runs).
6
14
  *
7
15
  * Usage:
8
16
  * function MembersGrid(props) {
9
17
  * return component((ctx) => {
10
- * const local = ctx.useState({ data: [], loading: true })
11
- * ctx.useEffect(fetchAction)
12
- * return { element: DataGrid({ ... }), refresh: fetchAction }
18
+ * const local = ctx.localState({ data: [], loading: true })
19
+ * ctx.onMount(fetchAction)
20
+ * return { element: DataGrid({ ... }) }
13
21
  * })
14
22
  * }
15
23
  */
16
- import type { SpecNode } from "./components.mjs";
17
24
  import type { ActionBinding } from "./actions.mjs";
25
+ import type { SpecNode } from "./components.mjs";
18
26
  export declare function _resetIdCounter(): void;
19
27
  export interface StateScope {
20
28
  /** Read state value: { $state: "/auto_xxx/field" } */
@@ -27,14 +35,23 @@ export interface StateScope {
27
35
  readonly $path: string;
28
36
  }
29
37
  interface ComponentContext {
30
- /** Declare scoped local state. Returns a proxy for reading/binding. */
31
- useState<T extends Record<string, unknown>>(initial: T): StateScope;
32
- /** Register an action to fire on mount (when element becomes visible). */
33
- useEffect(action: ActionBinding | ActionBinding[]): void;
38
+ /**
39
+ * Declare a scoped local state slot. Returns a path-builder proxy whose
40
+ * property accesses produce `{ $state: '/path' }` references for reading
41
+ * and `.$bind` for two-way binding. Not a React hook — runs once when
42
+ * the factory is invoked, never returns `[value, setter]`.
43
+ */
44
+ localState<T extends Record<string, unknown>>(initial: T): StateScope;
45
+ /**
46
+ * Register a JSON action to fire once when the component mounts on the
47
+ * client. Not a React effect — does not re-run, has no dependency
48
+ * tracking. Pass an `ActionBinding` (e.g. from `set(...)`, `callFunction(...)`)
49
+ * or an array of them.
50
+ */
51
+ onMount(action: ActionBinding | ActionBinding[]): void;
34
52
  }
35
53
  interface ComponentResult {
36
54
  element: SpecNode;
37
- [key: string]: any;
38
55
  }
39
56
  export declare function component(factory: (ctx: ComponentContext) => ComponentResult): ComponentResult;
40
57
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"component.d.mts","sourceRoot":"","sources":["../../src/lib/sdui/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;OAEI,KAAK,EAAE,QAAQ,EAAE;OACjB,KAAK,EAAE,aAAa,EAAE;AAQ7B,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,MAAM,WAAW,UAAU;IACzB,sDAAsD;IACtD,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,sBAAsB;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,gBAAgB;IACxB,uEAAuE;IACvE,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;IACpE,0EAA0E;IAC1E,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,EAAE,GAAG,IAAI,CAAC;CAC1D;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,QAAQ,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAkBD,wBAAgB,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,eAAe,GAAG,eAAe,CAuD9F"}
1
+ {"version":3,"file":"component.d.mts","sourceRoot":"","sources":["../../src/lib/sdui/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;OAEI,KAAK,EAAE,aAAa,EAAE;OACtB,KAAK,EAAE,QAAQ,EAAE;AAaxB,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,MAAM,WAAW,UAAU;IACzB,sDAAsD;IACtD,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,sBAAsB;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,gBAAgB;IACxB;;;;;OAKG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;IAEtE;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,EAAE,GAAG,IAAI,CAAC;CACxD;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,QAAQ,CAAC;CACnB;AAkBD,wBAAgB,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,eAAe,GAAG,eAAe,CAwE9F"}
@@ -1,20 +1,28 @@
1
1
  /**
2
2
  * component() — creates a stateful component boundary.
3
3
  *
4
- * Provides ctx.useState (scoped local state) and ctx.useEffect (onMount actions).
5
- * The returned element is automatically wrapped with _LocalStateProvider in the rendered spec.
4
+ * Provides ctx.localState (scoped local state slot) and ctx.onMount (an
5
+ * action that fires once when the component mounts on the client). The
6
+ * runtime handles state setup and mount firing; consumers don't need to
7
+ * know how the wrapping is implemented.
8
+ *
9
+ * NOTE: these are NOT React hooks. The factory runs ONCE at spec-build
10
+ * time, producing a JSON description of the UI. `localState` returns a
11
+ * path-builder proxy (not a [value, setter] tuple); `onMount` registers
12
+ * a JSON action that fires on first client render (not an effect that
13
+ * re-runs).
6
14
  *
7
15
  * Usage:
8
16
  * function MembersGrid(props) {
9
17
  * return component((ctx) => {
10
- * const local = ctx.useState({ data: [], loading: true })
11
- * ctx.useEffect(fetchAction)
12
- * return { element: DataGrid({ ... }), refresh: fetchAction }
18
+ * const local = ctx.localState({ data: [], loading: true })
19
+ * ctx.onMount(fetchAction)
20
+ * return { element: DataGrid({ ... }) }
13
21
  * })
14
22
  * }
15
23
  */
16
- import type { SpecNode } from "./components.js";
17
24
  import type { ActionBinding } from "./actions.js";
25
+ import type { SpecNode } from "./components.js";
18
26
  export declare function _resetIdCounter(): void;
19
27
  export interface StateScope {
20
28
  /** Read state value: { $state: "/auto_xxx/field" } */
@@ -27,14 +35,23 @@ export interface StateScope {
27
35
  readonly $path: string;
28
36
  }
29
37
  interface ComponentContext {
30
- /** Declare scoped local state. Returns a proxy for reading/binding. */
31
- useState<T extends Record<string, unknown>>(initial: T): StateScope;
32
- /** Register an action to fire on mount (when element becomes visible). */
33
- useEffect(action: ActionBinding | ActionBinding[]): void;
38
+ /**
39
+ * Declare a scoped local state slot. Returns a path-builder proxy whose
40
+ * property accesses produce `{ $state: '/path' }` references for reading
41
+ * and `.$bind` for two-way binding. Not a React hook — runs once when
42
+ * the factory is invoked, never returns `[value, setter]`.
43
+ */
44
+ localState<T extends Record<string, unknown>>(initial: T): StateScope;
45
+ /**
46
+ * Register a JSON action to fire once when the component mounts on the
47
+ * client. Not a React effect — does not re-run, has no dependency
48
+ * tracking. Pass an `ActionBinding` (e.g. from `set(...)`, `callFunction(...)`)
49
+ * or an array of them.
50
+ */
51
+ onMount(action: ActionBinding | ActionBinding[]): void;
34
52
  }
35
53
  interface ComponentResult {
36
54
  element: SpecNode;
37
- [key: string]: any;
38
55
  }
39
56
  export declare function component(factory: (ctx: ComponentContext) => ComponentResult): ComponentResult;
40
57
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/lib/sdui/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;OAEI,KAAK,EAAE,QAAQ,EAAE;OACjB,KAAK,EAAE,aAAa,EAAE;AAQ7B,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,MAAM,WAAW,UAAU;IACzB,sDAAsD;IACtD,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,sBAAsB;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,gBAAgB;IACxB,uEAAuE;IACvE,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;IACpE,0EAA0E;IAC1E,SAAS,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,EAAE,GAAG,IAAI,CAAC;CAC1D;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,QAAQ,CAAC;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAkBD,wBAAgB,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,eAAe,GAAG,eAAe,CAuD9F"}
1
+ {"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/lib/sdui/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;OAEI,KAAK,EAAE,aAAa,EAAE;OACtB,KAAK,EAAE,QAAQ,EAAE;AAaxB,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,MAAM,WAAW,UAAU;IACzB,sDAAsD;IACtD,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5B,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,sBAAsB;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,gBAAgB;IACxB;;;;;OAKG;IACH,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;IAEtE;;;;;OAKG;IACH,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,aAAa,EAAE,GAAG,IAAI,CAAC;CACxD;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,QAAQ,CAAC;CACnB;AAkBD,wBAAgB,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,eAAe,GAAG,eAAe,CAwE9F"}
@@ -2,15 +2,23 @@
2
2
  /**
3
3
  * component() — creates a stateful component boundary.
4
4
  *
5
- * Provides ctx.useState (scoped local state) and ctx.useEffect (onMount actions).
6
- * The returned element is automatically wrapped with _LocalStateProvider in the rendered spec.
5
+ * Provides ctx.localState (scoped local state slot) and ctx.onMount (an
6
+ * action that fires once when the component mounts on the client). The
7
+ * runtime handles state setup and mount firing; consumers don't need to
8
+ * know how the wrapping is implemented.
9
+ *
10
+ * NOTE: these are NOT React hooks. The factory runs ONCE at spec-build
11
+ * time, producing a JSON description of the UI. `localState` returns a
12
+ * path-builder proxy (not a [value, setter] tuple); `onMount` registers
13
+ * a JSON action that fires on first client render (not an effect that
14
+ * re-runs).
7
15
  *
8
16
  * Usage:
9
17
  * function MembersGrid(props) {
10
18
  * return component((ctx) => {
11
- * const local = ctx.useState({ data: [], loading: true })
12
- * ctx.useEffect(fetchAction)
13
- * return { element: DataGrid({ ... }), refresh: fetchAction }
19
+ * const local = ctx.localState({ data: [], loading: true })
20
+ * ctx.onMount(fetchAction)
21
+ * return { element: DataGrid({ ... }) }
14
22
  * })
15
23
  * }
16
24
  */
@@ -18,8 +26,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
26
  exports._resetIdCounter = _resetIdCounter;
19
27
  exports.component = component;
20
28
  let _idCounter = 0;
29
+ // Counter-only IDs (no Date.now()) so the same factory body produces the
30
+ // same paths across runs. The counter is monotonic per process; calling
31
+ // `_resetIdCounter()` (tests only) brings it back to 0 so snapshot tests
32
+ // stay stable.
21
33
  function generateId() {
22
- return `auto_${(++_idCounter).toString(36)}_${Date.now().toString(36)}`;
34
+ _idCounter += 1;
35
+ return `auto_${_idCounter.toString(36)}`;
23
36
  }
24
37
  // Reset counter (for testing)
25
38
  function _resetIdCounter() {
@@ -45,51 +58,71 @@ function createScopeProxy(basePath) {
45
58
  return new Proxy({}, handler);
46
59
  }
47
60
  function component(factory) {
48
- let localState = null;
49
- let mountAction = null;
61
+ const states = [];
62
+ const mountActions = [];
50
63
  const ctx = {
51
- useState(initial) {
64
+ localState(initial) {
52
65
  const path = `/${generateId()}`;
53
- localState = { path, initial };
66
+ states.push({ path, initial });
54
67
  return createScopeProxy(path);
55
68
  },
56
- useEffect(action) {
57
- mountAction = action;
69
+ onMount(action) {
70
+ mountActions.push(action);
58
71
  },
59
72
  };
60
73
  const result = factory(ctx);
61
- // Capture state after factory execution (TS can't track closure mutations)
62
- const capturedState = localState;
63
- const capturedMount = mountAction;
64
- // If no local state and no effects, return as-is
65
- if (!capturedState && !capturedMount) {
74
+ // No state, no effects return as-is.
75
+ if (states.length === 0 && mountActions.length === 0) {
66
76
  return result;
67
77
  }
68
- // Wrap element with _LocalStateProvider
69
- const providerProps = {};
70
- if (capturedState) {
71
- providerProps['statePath'] = capturedState.path;
72
- providerProps['initialValue'] = capturedState.initial;
78
+ // Collapse zero/one/many mount actions for the single onMountAction slot
79
+ // on the innermost wrapper.
80
+ let combinedMount;
81
+ if (mountActions.length === 1) {
82
+ combinedMount = mountActions[0];
73
83
  }
74
- if (capturedMount) {
75
- providerProps['onMountAction'] = capturedMount;
84
+ else if (mountActions.length > 1) {
85
+ combinedMount = mountActions.flatMap((a) => (Array.isArray(a) ? a : [a]));
76
86
  }
77
- const wrapper = {
78
- type: '_LocalStateProvider',
79
- props: providerProps,
80
- children: [result.element],
81
- };
82
- // Attach the local state to the spec's state tree
83
- // The render() function will collect this via a special marker
84
- if (capturedState) {
85
- wrapper._localStateRegistration = {
86
- path: capturedState.path,
87
- initial: capturedState.initial,
87
+ let wrapped = result.element;
88
+ if (states.length === 0) {
89
+ // Mount-only: a single state-provider wrapper carries onMountAction.
90
+ wrapped = {
91
+ type: '_LocalStateProvider',
92
+ props: combinedMount ? { onMountAction: combinedMount } : {},
93
+ children: [wrapped],
88
94
  };
89
95
  }
96
+ else {
97
+ // One state-provider wrapper per localState() call, nested
98
+ // innermost-first. Mount actions attach to the innermost wrapper so
99
+ // every state slot is initialized before any action fires.
100
+ for (let i = states.length - 1; i >= 0; i--) {
101
+ const state = states[i];
102
+ if (state) {
103
+ const isInnermost = i === states.length - 1;
104
+ const props = {
105
+ statePath: state.path,
106
+ initialValue: state.initial,
107
+ ...(isInnermost && combinedMount ? { onMountAction: combinedMount } : {}),
108
+ };
109
+ const wrapper = {
110
+ type: '_LocalStateProvider',
111
+ props,
112
+ children: [wrapped],
113
+ };
114
+ // render() picks up this marker to populate spec.state.
115
+ wrapper._localStateRegistration = {
116
+ path: state.path,
117
+ initial: state.initial,
118
+ };
119
+ wrapped = wrapper;
120
+ }
121
+ }
122
+ }
90
123
  return {
91
124
  ...result,
92
- element: wrapper,
125
+ element: wrapped,
93
126
  };
94
127
  }
95
128
  //# sourceMappingURL=component.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/lib/sdui/component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/lib/sdui/component.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,34 @@
1
1
  /**
2
2
  * component() — creates a stateful component boundary.
3
3
  *
4
- * Provides ctx.useState (scoped local state) and ctx.useEffect (onMount actions).
5
- * The returned element is automatically wrapped with _LocalStateProvider in the rendered spec.
4
+ * Provides ctx.localState (scoped local state slot) and ctx.onMount (an
5
+ * action that fires once when the component mounts on the client). The
6
+ * runtime handles state setup and mount firing; consumers don't need to
7
+ * know how the wrapping is implemented.
8
+ *
9
+ * NOTE: these are NOT React hooks. The factory runs ONCE at spec-build
10
+ * time, producing a JSON description of the UI. `localState` returns a
11
+ * path-builder proxy (not a [value, setter] tuple); `onMount` registers
12
+ * a JSON action that fires on first client render (not an effect that
13
+ * re-runs).
6
14
  *
7
15
  * Usage:
8
16
  * function MembersGrid(props) {
9
17
  * return component((ctx) => {
10
- * const local = ctx.useState({ data: [], loading: true })
11
- * ctx.useEffect(fetchAction)
12
- * return { element: DataGrid({ ... }), refresh: fetchAction }
18
+ * const local = ctx.localState({ data: [], loading: true })
19
+ * ctx.onMount(fetchAction)
20
+ * return { element: DataGrid({ ... }) }
13
21
  * })
14
22
  * }
15
23
  */
16
24
  let _idCounter = 0;
25
+ // Counter-only IDs (no Date.now()) so the same factory body produces the
26
+ // same paths across runs. The counter is monotonic per process; calling
27
+ // `_resetIdCounter()` (tests only) brings it back to 0 so snapshot tests
28
+ // stay stable.
17
29
  function generateId() {
18
- return `auto_${(++_idCounter).toString(36)}_${Date.now().toString(36)}`;
30
+ _idCounter += 1;
31
+ return `auto_${_idCounter.toString(36)}`;
19
32
  }
20
33
  // Reset counter (for testing)
21
34
  export function _resetIdCounter() {
@@ -41,51 +54,71 @@ function createScopeProxy(basePath) {
41
54
  return new Proxy({}, handler);
42
55
  }
43
56
  export function component(factory) {
44
- let localState = null;
45
- let mountAction = null;
57
+ const states = [];
58
+ const mountActions = [];
46
59
  const ctx = {
47
- useState(initial) {
60
+ localState(initial) {
48
61
  const path = `/${generateId()}`;
49
- localState = { path, initial };
62
+ states.push({ path, initial });
50
63
  return createScopeProxy(path);
51
64
  },
52
- useEffect(action) {
53
- mountAction = action;
65
+ onMount(action) {
66
+ mountActions.push(action);
54
67
  },
55
68
  };
56
69
  const result = factory(ctx);
57
- // Capture state after factory execution (TS can't track closure mutations)
58
- const capturedState = localState;
59
- const capturedMount = mountAction;
60
- // If no local state and no effects, return as-is
61
- if (!capturedState && !capturedMount) {
70
+ // No state, no effects return as-is.
71
+ if (states.length === 0 && mountActions.length === 0) {
62
72
  return result;
63
73
  }
64
- // Wrap element with _LocalStateProvider
65
- const providerProps = {};
66
- if (capturedState) {
67
- providerProps['statePath'] = capturedState.path;
68
- providerProps['initialValue'] = capturedState.initial;
74
+ // Collapse zero/one/many mount actions for the single onMountAction slot
75
+ // on the innermost wrapper.
76
+ let combinedMount;
77
+ if (mountActions.length === 1) {
78
+ combinedMount = mountActions[0];
69
79
  }
70
- if (capturedMount) {
71
- providerProps['onMountAction'] = capturedMount;
80
+ else if (mountActions.length > 1) {
81
+ combinedMount = mountActions.flatMap((a) => (Array.isArray(a) ? a : [a]));
72
82
  }
73
- const wrapper = {
74
- type: '_LocalStateProvider',
75
- props: providerProps,
76
- children: [result.element],
77
- };
78
- // Attach the local state to the spec's state tree
79
- // The render() function will collect this via a special marker
80
- if (capturedState) {
81
- wrapper._localStateRegistration = {
82
- path: capturedState.path,
83
- initial: capturedState.initial,
83
+ let wrapped = result.element;
84
+ if (states.length === 0) {
85
+ // Mount-only: a single state-provider wrapper carries onMountAction.
86
+ wrapped = {
87
+ type: '_LocalStateProvider',
88
+ props: combinedMount ? { onMountAction: combinedMount } : {},
89
+ children: [wrapped],
84
90
  };
85
91
  }
92
+ else {
93
+ // One state-provider wrapper per localState() call, nested
94
+ // innermost-first. Mount actions attach to the innermost wrapper so
95
+ // every state slot is initialized before any action fires.
96
+ for (let i = states.length - 1; i >= 0; i--) {
97
+ const state = states[i];
98
+ if (state) {
99
+ const isInnermost = i === states.length - 1;
100
+ const props = {
101
+ statePath: state.path,
102
+ initialValue: state.initial,
103
+ ...(isInnermost && combinedMount ? { onMountAction: combinedMount } : {}),
104
+ };
105
+ const wrapper = {
106
+ type: '_LocalStateProvider',
107
+ props,
108
+ children: [wrapped],
109
+ };
110
+ // render() picks up this marker to populate spec.state.
111
+ wrapper._localStateRegistration = {
112
+ path: state.path,
113
+ initial: state.initial,
114
+ };
115
+ wrapped = wrapper;
116
+ }
117
+ }
118
+ }
86
119
  return {
87
120
  ...result,
88
- element: wrapper,
121
+ element: wrapped,
89
122
  };
90
123
  }
91
124
  //# sourceMappingURL=component.mjs.map