@plures/praxis 1.0.3 → 1.1.1

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 (530) hide show
  1. package/FRAMEWORK.md +55 -5
  2. package/README.md +162 -375
  3. package/core/codegen/docs-generator.ts +5 -2
  4. package/core/codegen/index.ts +1 -1
  5. package/core/db-adapter/index.ts +2 -2
  6. package/core/db-adapter/sync-engine.ts +17 -6
  7. package/core/logic-engine/engine.ts +1 -1
  8. package/core/logic-engine/index.ts +2 -2
  9. package/core/logic-engine/protocol.ts +1 -1
  10. package/core/logic-engine/psf-adapter.ts +8 -4
  11. package/core/logic-engine/rules.ts +1 -1
  12. package/core/schema-engine/compiler.ts +53 -11
  13. package/core/schema-engine/generator.ts +17 -7
  14. package/core/schema-engine/index.ts +2 -2
  15. package/core/schema-engine/psf.ts +12 -3
  16. package/core/schema-engine/types.ts +3 -11
  17. package/core/schema-engine/validator.ts +112 -22
  18. package/dist/browser/engine-BjdqxeXG.d.ts +333 -0
  19. package/dist/browser/index.d.ts +3004 -0
  20. package/dist/browser/index.js +2892 -0
  21. package/dist/{src → browser}/integrations/svelte.d.ts +19 -17
  22. package/dist/browser/integrations/svelte.js +298 -0
  23. package/dist/node/auth-STARLY7I.js +207 -0
  24. package/dist/node/build-Y7OT5VBF.js +144 -0
  25. package/dist/node/canvas-UERZHJYW.js +362 -0
  26. package/dist/node/chunk-DSDC2JWZ.js +256 -0
  27. package/dist/node/chunk-FXQZXAWF.js +175 -0
  28. package/dist/node/chunk-N5Y37EUV.js +202 -0
  29. package/dist/node/chunk-QGM4M3NI.js +37 -0
  30. package/dist/node/chunk-RJMWCNHR.js +175 -0
  31. package/dist/node/chunk-SRM3OPPM.js +404 -0
  32. package/dist/node/chunk-UATVJBNV.js +175 -0
  33. package/dist/node/chunk-UY7YEBE2.js +159 -0
  34. package/dist/node/chunk-XCY2VIFX.js +143 -0
  35. package/dist/node/chunk-YXH4Y7ZZ.js +349 -0
  36. package/dist/node/cli/index.cjs +215139 -0
  37. package/dist/node/cli/index.d.cts +1 -0
  38. package/dist/node/cli/index.d.ts +1 -0
  39. package/dist/node/cli/index.js +690 -0
  40. package/dist/node/cloud/index.cjs +1043 -0
  41. package/dist/node/cloud/index.d.cts +864 -0
  42. package/dist/node/cloud/index.d.ts +864 -0
  43. package/dist/node/cloud/index.js +456 -0
  44. package/dist/node/cloud-AXOK4PSN.js +212 -0
  45. package/dist/node/component.cjs +374 -0
  46. package/dist/node/component.d.cts +125 -0
  47. package/dist/{src/core/component/generator.d.ts → node/component.d.ts} +11 -8
  48. package/dist/node/component.js +9 -0
  49. package/dist/node/components/index.cjs +216 -0
  50. package/dist/node/components/index.d.cts +43 -0
  51. package/dist/{src → node}/components/index.d.ts +8 -8
  52. package/dist/node/components/index.js +7 -0
  53. package/dist/node/create-TRLSVCNQ.js +584 -0
  54. package/dist/node/dev-PMJZUYGE.js +65 -0
  55. package/dist/node/engine-1iqLe6_P.d.ts +214 -0
  56. package/dist/node/engine-CVJobhHm.d.cts +214 -0
  57. package/dist/node/index.cjs +3247 -0
  58. package/dist/node/index.d.cts +2579 -0
  59. package/dist/node/index.d.ts +2579 -0
  60. package/dist/node/index.js +2098 -0
  61. package/dist/node/integrations/svelte.cjs +330 -0
  62. package/dist/node/integrations/svelte.d.cts +309 -0
  63. package/dist/node/integrations/svelte.d.ts +309 -0
  64. package/dist/node/integrations/svelte.js +300 -0
  65. package/dist/node/orchestrate-737TCL5H.js +127 -0
  66. package/dist/{src/core/protocol.d.ts → node/protocol-Qek7ebBl.d.cts} +11 -10
  67. package/dist/node/protocol-Qek7ebBl.d.ts +122 -0
  68. package/dist/node/schema.cjs +200 -0
  69. package/dist/{src/core/schema/types.d.ts → node/schema.d.cts} +30 -29
  70. package/dist/node/schema.d.ts +371 -0
  71. package/dist/node/schema.js +9 -0
  72. package/dist/{src/runtime/terminal-adapter.d.ts → node/terminal-adapter-07HGftGQ.d.ts} +86 -11
  73. package/dist/node/terminal-adapter-XLtCjjb_.d.cts +231 -0
  74. package/dist/node/verify-QRYKRIDU.js +210960 -0
  75. package/docs/MONETIZATION.md +21 -16
  76. package/docs/REACTIVE_REDESIGN.md +132 -0
  77. package/docs/README.md +47 -36
  78. package/docs/SVELTE_INTEGRATION_STRATEGY.md +68 -0
  79. package/docs/TERMINAL_NODE.md +27 -24
  80. package/docs/core/building-extensions.md +58 -61
  81. package/docs/core/cli-usage.md +59 -59
  82. package/docs/core/code-canvas-sync.md +28 -16
  83. package/docs/core/logic-engine.md +77 -82
  84. package/docs/core/pluresdb-integration.md +29 -39
  85. package/docs/core/schema-model.md +66 -52
  86. package/docs/core/ui-generation.md +57 -49
  87. package/docs/core/what-is-praxis.md +32 -15
  88. package/docs/guides/canvas.md +21 -5
  89. package/docs/guides/getting-started.md +13 -7
  90. package/docs/guides/history-state-pattern.md +65 -51
  91. package/docs/guides/orchestration.md +46 -32
  92. package/docs/guides/parallel-state-pattern.md +56 -72
  93. package/docs/guides/svelte-integration.md +45 -53
  94. package/docs/tutorials/README.md +16 -0
  95. package/docs/tutorials/ecommerce-cart.md +177 -95
  96. package/docs/tutorials/first-app.md +26 -41
  97. package/docs/tutorials/form-builder.md +191 -138
  98. package/docs/tutorials/todo-pluresdb.md +71 -69
  99. package/package.json +58 -23
  100. package/src/__tests__/actors.test.ts +68 -68
  101. package/src/__tests__/billing.test.ts +32 -32
  102. package/src/__tests__/canvas-components.test.ts +94 -73
  103. package/src/__tests__/cli-create.test.ts +28 -28
  104. package/src/__tests__/cloud.test.ts +36 -36
  105. package/src/__tests__/code-canvas-integration.test.ts +132 -141
  106. package/src/__tests__/docs-generator.test.ts +3 -9
  107. package/src/__tests__/dsl.test.ts +58 -64
  108. package/src/__tests__/edge-cases.test.ts +106 -108
  109. package/src/__tests__/engine.test.ts +51 -25
  110. package/src/__tests__/generators.test.ts +42 -44
  111. package/src/__tests__/introspection.test.ts +104 -114
  112. package/src/__tests__/pluresdb.test.ts +189 -187
  113. package/src/__tests__/protocol.test.ts +15 -15
  114. package/src/__tests__/provisioning.test.ts +61 -61
  115. package/src/__tests__/schema.test.ts +7 -11
  116. package/src/__tests__/state-docs-integration.test.ts +162 -145
  117. package/src/__tests__/svelte-integration.test.ts +16 -19
  118. package/src/__tests__/tauri-integration.test.ts +149 -147
  119. package/src/__tests__/terminal-node.test.ts +12 -7
  120. package/src/__tests__/unum-integration.test.ts +68 -68
  121. package/src/adapters/cli.ts +21 -15
  122. package/src/cli/commands/auth.ts +82 -78
  123. package/src/cli/commands/build.ts +29 -27
  124. package/src/cli/commands/canvas.ts +338 -127
  125. package/src/cli/commands/cloud.ts +47 -47
  126. package/src/cli/commands/create.ts +59 -47
  127. package/src/cli/commands/dev.ts +12 -12
  128. package/src/cli/commands/generate.ts +29 -40
  129. package/src/cli/commands/orchestrate.ts +24 -24
  130. package/src/cli/commands/verify.ts +7 -8
  131. package/src/cli/index.ts +14 -10
  132. package/src/cloud/README.md +28 -15
  133. package/src/cloud/auth.ts +55 -70
  134. package/src/cloud/billing.ts +59 -58
  135. package/src/cloud/client.ts +29 -35
  136. package/src/cloud/index.ts +19 -40
  137. package/src/cloud/marketplace.ts +69 -78
  138. package/src/cloud/provisioning.ts +42 -51
  139. package/src/cloud/relay/endpoints.ts +30 -34
  140. package/src/cloud/relay/health/index.ts +1 -1
  141. package/src/cloud/relay/stats/index.ts +1 -1
  142. package/src/cloud/relay/sync/index.ts +1 -1
  143. package/src/cloud/relay/usage/index.ts +1 -1
  144. package/src/cloud/sponsors.ts +31 -34
  145. package/src/cloud/types.ts +4 -4
  146. package/src/components/README.md +1 -0
  147. package/src/components/index.ts +3 -4
  148. package/src/core/actors.ts +7 -7
  149. package/src/core/component/generator.ts +10 -28
  150. package/src/core/engine.ts +51 -24
  151. package/src/core/introspection.ts +37 -35
  152. package/src/core/logic/generator.ts +62 -62
  153. package/src/core/pluresdb/adapter.ts +8 -8
  154. package/src/core/pluresdb/generator.ts +39 -35
  155. package/src/core/pluresdb/index.ts +9 -12
  156. package/src/core/pluresdb/schema-registry.ts +22 -25
  157. package/src/core/pluresdb/store.ts +57 -57
  158. package/src/core/protocol.ts +14 -14
  159. package/src/core/reactive-engine.svelte.ts +65 -0
  160. package/src/core/reactive-engine.ts +67 -0
  161. package/src/core/rules.ts +4 -4
  162. package/src/core/schema/loader.common.ts +150 -0
  163. package/src/core/schema/loader.ts +19 -149
  164. package/src/core/schema/normalize.ts +34 -51
  165. package/src/core/schema/types.ts +47 -11
  166. package/src/dsl/index.ts +8 -8
  167. package/src/dsl.ts +11 -17
  168. package/src/examples/advanced-todo/README.md +58 -40
  169. package/src/examples/advanced-todo/index.ts +3 -3
  170. package/src/examples/auth-basic/index.ts +30 -30
  171. package/src/examples/cart/index.ts +50 -50
  172. package/src/examples/hero-ecommerce/index.ts +130 -157
  173. package/src/examples/svelte-counter/index.ts +22 -26
  174. package/src/flows.ts +6 -17
  175. package/src/index.browser.ts +204 -0
  176. package/src/index.ts +37 -42
  177. package/src/integrations/code-canvas.ts +237 -193
  178. package/src/integrations/pluresdb.ts +55 -35
  179. package/src/integrations/state-docs.ts +104 -104
  180. package/src/integrations/svelte.ts +35 -35
  181. package/src/integrations/tauri.ts +75 -73
  182. package/src/integrations/unum.ts +68 -61
  183. package/src/registry.ts +7 -14
  184. package/src/runtime/terminal-adapter.ts +31 -26
  185. package/src/step.ts +10 -16
  186. package/src/types.ts +1 -1
  187. package/templates/basic-app/README.md +6 -9
  188. package/templates/fullstack-app/README.md +10 -0
  189. package/dist/core/codegen/docs-generator.d.ts +0 -123
  190. package/dist/core/codegen/docs-generator.d.ts.map +0 -1
  191. package/dist/core/codegen/docs-generator.js +0 -674
  192. package/dist/core/codegen/docs-generator.js.map +0 -1
  193. package/dist/core/codegen/index.d.ts +0 -11
  194. package/dist/core/codegen/index.d.ts.map +0 -1
  195. package/dist/core/codegen/index.js +0 -13
  196. package/dist/core/codegen/index.js.map +0 -1
  197. package/dist/core/codegen/ts-generator.d.ts +0 -8
  198. package/dist/core/codegen/ts-generator.d.ts.map +0 -1
  199. package/dist/core/codegen/ts-generator.js +0 -8
  200. package/dist/core/codegen/ts-generator.js.map +0 -1
  201. package/dist/core/db-adapter/index.d.ts +0 -18
  202. package/dist/core/db-adapter/index.d.ts.map +0 -1
  203. package/dist/core/db-adapter/index.js +0 -23
  204. package/dist/core/db-adapter/index.js.map +0 -1
  205. package/dist/core/db-adapter/sync-engine.d.ts +0 -180
  206. package/dist/core/db-adapter/sync-engine.d.ts.map +0 -1
  207. package/dist/core/db-adapter/sync-engine.js +0 -342
  208. package/dist/core/db-adapter/sync-engine.js.map +0 -1
  209. package/dist/core/logic-engine/engine.d.ts +0 -8
  210. package/dist/core/logic-engine/engine.d.ts.map +0 -1
  211. package/dist/core/logic-engine/engine.js +0 -8
  212. package/dist/core/logic-engine/engine.js.map +0 -1
  213. package/dist/core/logic-engine/index.d.ts +0 -16
  214. package/dist/core/logic-engine/index.d.ts.map +0 -1
  215. package/dist/core/logic-engine/index.js +0 -16
  216. package/dist/core/logic-engine/index.js.map +0 -1
  217. package/dist/core/logic-engine/protocol.d.ts +0 -7
  218. package/dist/core/logic-engine/protocol.d.ts.map +0 -1
  219. package/dist/core/logic-engine/protocol.js +0 -7
  220. package/dist/core/logic-engine/protocol.js.map +0 -1
  221. package/dist/core/logic-engine/psf-adapter.d.ts +0 -88
  222. package/dist/core/logic-engine/psf-adapter.d.ts.map +0 -1
  223. package/dist/core/logic-engine/psf-adapter.js +0 -207
  224. package/dist/core/logic-engine/psf-adapter.js.map +0 -1
  225. package/dist/core/logic-engine/rules.d.ts +0 -7
  226. package/dist/core/logic-engine/rules.d.ts.map +0 -1
  227. package/dist/core/logic-engine/rules.js +0 -7
  228. package/dist/core/logic-engine/rules.js.map +0 -1
  229. package/dist/core/schema-engine/compiler.d.ts +0 -198
  230. package/dist/core/schema-engine/compiler.d.ts.map +0 -1
  231. package/dist/core/schema-engine/compiler.js +0 -262
  232. package/dist/core/schema-engine/compiler.js.map +0 -1
  233. package/dist/core/schema-engine/generator.d.ts +0 -115
  234. package/dist/core/schema-engine/generator.d.ts.map +0 -1
  235. package/dist/core/schema-engine/generator.js +0 -506
  236. package/dist/core/schema-engine/generator.js.map +0 -1
  237. package/dist/core/schema-engine/index.d.ts +0 -18
  238. package/dist/core/schema-engine/index.d.ts.map +0 -1
  239. package/dist/core/schema-engine/index.js +0 -18
  240. package/dist/core/schema-engine/index.js.map +0 -1
  241. package/dist/core/schema-engine/psf.d.ts +0 -612
  242. package/dist/core/schema-engine/psf.d.ts.map +0 -1
  243. package/dist/core/schema-engine/psf.js +0 -45
  244. package/dist/core/schema-engine/psf.js.map +0 -1
  245. package/dist/core/schema-engine/types.d.ts +0 -10
  246. package/dist/core/schema-engine/types.d.ts.map +0 -1
  247. package/dist/core/schema-engine/types.js +0 -7
  248. package/dist/core/schema-engine/types.js.map +0 -1
  249. package/dist/core/schema-engine/validator.d.ts +0 -140
  250. package/dist/core/schema-engine/validator.d.ts.map +0 -1
  251. package/dist/core/schema-engine/validator.js +0 -407
  252. package/dist/core/schema-engine/validator.js.map +0 -1
  253. package/dist/src/adapters/cli.d.ts +0 -43
  254. package/dist/src/adapters/cli.d.ts.map +0 -1
  255. package/dist/src/adapters/cli.js +0 -126
  256. package/dist/src/adapters/cli.js.map +0 -1
  257. package/dist/src/cli/commands/auth.d.ts +0 -26
  258. package/dist/src/cli/commands/auth.d.ts.map +0 -1
  259. package/dist/src/cli/commands/auth.js +0 -233
  260. package/dist/src/cli/commands/auth.js.map +0 -1
  261. package/dist/src/cli/commands/build.d.ts +0 -23
  262. package/dist/src/cli/commands/build.d.ts.map +0 -1
  263. package/dist/src/cli/commands/build.js +0 -162
  264. package/dist/src/cli/commands/build.js.map +0 -1
  265. package/dist/src/cli/commands/canvas.d.ts +0 -23
  266. package/dist/src/cli/commands/canvas.d.ts.map +0 -1
  267. package/dist/src/cli/commands/canvas.js +0 -215
  268. package/dist/src/cli/commands/canvas.js.map +0 -1
  269. package/dist/src/cli/commands/cloud.d.ts +0 -27
  270. package/dist/src/cli/commands/cloud.d.ts.map +0 -1
  271. package/dist/src/cli/commands/cloud.js +0 -232
  272. package/dist/src/cli/commands/cloud.js.map +0 -1
  273. package/dist/src/cli/commands/create.d.ts +0 -21
  274. package/dist/src/cli/commands/create.d.ts.map +0 -1
  275. package/dist/src/cli/commands/create.js +0 -621
  276. package/dist/src/cli/commands/create.js.map +0 -1
  277. package/dist/src/cli/commands/dev.d.ts +0 -21
  278. package/dist/src/cli/commands/dev.d.ts.map +0 -1
  279. package/dist/src/cli/commands/dev.js +0 -71
  280. package/dist/src/cli/commands/dev.js.map +0 -1
  281. package/dist/src/cli/commands/generate.d.ts +0 -25
  282. package/dist/src/cli/commands/generate.d.ts.map +0 -1
  283. package/dist/src/cli/commands/generate.js +0 -168
  284. package/dist/src/cli/commands/generate.js.map +0 -1
  285. package/dist/src/cli/commands/orchestrate.d.ts +0 -44
  286. package/dist/src/cli/commands/orchestrate.d.ts.map +0 -1
  287. package/dist/src/cli/commands/orchestrate.js +0 -150
  288. package/dist/src/cli/commands/orchestrate.js.map +0 -1
  289. package/dist/src/cli/commands/verify.d.ts +0 -10
  290. package/dist/src/cli/commands/verify.d.ts.map +0 -1
  291. package/dist/src/cli/commands/verify.js +0 -39
  292. package/dist/src/cli/commands/verify.js.map +0 -1
  293. package/dist/src/cli/index.d.ts +0 -8
  294. package/dist/src/cli/index.d.ts.map +0 -1
  295. package/dist/src/cli/index.js +0 -226
  296. package/dist/src/cli/index.js.map +0 -1
  297. package/dist/src/cloud/auth.d.ts +0 -51
  298. package/dist/src/cloud/auth.d.ts.map +0 -1
  299. package/dist/src/cloud/auth.js +0 -194
  300. package/dist/src/cloud/auth.js.map +0 -1
  301. package/dist/src/cloud/billing.d.ts +0 -184
  302. package/dist/src/cloud/billing.d.ts.map +0 -1
  303. package/dist/src/cloud/billing.js +0 -179
  304. package/dist/src/cloud/billing.js.map +0 -1
  305. package/dist/src/cloud/client.d.ts +0 -39
  306. package/dist/src/cloud/client.d.ts.map +0 -1
  307. package/dist/src/cloud/client.js +0 -176
  308. package/dist/src/cloud/client.js.map +0 -1
  309. package/dist/src/cloud/index.d.ts +0 -44
  310. package/dist/src/cloud/index.d.ts.map +0 -1
  311. package/dist/src/cloud/index.js +0 -44
  312. package/dist/src/cloud/index.js.map +0 -1
  313. package/dist/src/cloud/marketplace.d.ts +0 -166
  314. package/dist/src/cloud/marketplace.d.ts.map +0 -1
  315. package/dist/src/cloud/marketplace.js +0 -159
  316. package/dist/src/cloud/marketplace.js.map +0 -1
  317. package/dist/src/cloud/provisioning.d.ts +0 -110
  318. package/dist/src/cloud/provisioning.d.ts.map +0 -1
  319. package/dist/src/cloud/provisioning.js +0 -148
  320. package/dist/src/cloud/provisioning.js.map +0 -1
  321. package/dist/src/cloud/relay/endpoints.d.ts +0 -62
  322. package/dist/src/cloud/relay/endpoints.d.ts.map +0 -1
  323. package/dist/src/cloud/relay/endpoints.js +0 -217
  324. package/dist/src/cloud/relay/endpoints.js.map +0 -1
  325. package/dist/src/cloud/relay/health/index.d.ts +0 -5
  326. package/dist/src/cloud/relay/health/index.d.ts.map +0 -1
  327. package/dist/src/cloud/relay/health/index.js +0 -9
  328. package/dist/src/cloud/relay/health/index.js.map +0 -1
  329. package/dist/src/cloud/relay/stats/index.d.ts +0 -5
  330. package/dist/src/cloud/relay/stats/index.d.ts.map +0 -1
  331. package/dist/src/cloud/relay/stats/index.js +0 -9
  332. package/dist/src/cloud/relay/stats/index.js.map +0 -1
  333. package/dist/src/cloud/relay/sync/index.d.ts +0 -5
  334. package/dist/src/cloud/relay/sync/index.d.ts.map +0 -1
  335. package/dist/src/cloud/relay/sync/index.js +0 -9
  336. package/dist/src/cloud/relay/sync/index.js.map +0 -1
  337. package/dist/src/cloud/relay/usage/index.d.ts +0 -5
  338. package/dist/src/cloud/relay/usage/index.d.ts.map +0 -1
  339. package/dist/src/cloud/relay/usage/index.js +0 -9
  340. package/dist/src/cloud/relay/usage/index.js.map +0 -1
  341. package/dist/src/cloud/sponsors.d.ts +0 -81
  342. package/dist/src/cloud/sponsors.d.ts.map +0 -1
  343. package/dist/src/cloud/sponsors.js +0 -130
  344. package/dist/src/cloud/sponsors.js.map +0 -1
  345. package/dist/src/cloud/types.d.ts +0 -169
  346. package/dist/src/cloud/types.d.ts.map +0 -1
  347. package/dist/src/cloud/types.js +0 -7
  348. package/dist/src/cloud/types.js.map +0 -1
  349. package/dist/src/components/index.d.ts.map +0 -1
  350. package/dist/src/components/index.js +0 -17
  351. package/dist/src/components/index.js.map +0 -1
  352. package/dist/src/core/actors.d.ts +0 -95
  353. package/dist/src/core/actors.d.ts.map +0 -1
  354. package/dist/src/core/actors.js +0 -158
  355. package/dist/src/core/actors.js.map +0 -1
  356. package/dist/src/core/component/generator.d.ts.map +0 -1
  357. package/dist/src/core/component/generator.js +0 -349
  358. package/dist/src/core/component/generator.js.map +0 -1
  359. package/dist/src/core/engine.d.ts +0 -92
  360. package/dist/src/core/engine.d.ts.map +0 -1
  361. package/dist/src/core/engine.js +0 -199
  362. package/dist/src/core/engine.js.map +0 -1
  363. package/dist/src/core/introspection.d.ts +0 -141
  364. package/dist/src/core/introspection.d.ts.map +0 -1
  365. package/dist/src/core/introspection.js +0 -208
  366. package/dist/src/core/introspection.js.map +0 -1
  367. package/dist/src/core/logic/generator.d.ts +0 -76
  368. package/dist/src/core/logic/generator.d.ts.map +0 -1
  369. package/dist/src/core/logic/generator.js +0 -370
  370. package/dist/src/core/logic/generator.js.map +0 -1
  371. package/dist/src/core/pluresdb/adapter.d.ts +0 -72
  372. package/dist/src/core/pluresdb/adapter.d.ts.map +0 -1
  373. package/dist/src/core/pluresdb/adapter.js +0 -73
  374. package/dist/src/core/pluresdb/adapter.js.map +0 -1
  375. package/dist/src/core/pluresdb/generator.d.ts +0 -58
  376. package/dist/src/core/pluresdb/generator.d.ts.map +0 -1
  377. package/dist/src/core/pluresdb/generator.js +0 -191
  378. package/dist/src/core/pluresdb/generator.js.map +0 -1
  379. package/dist/src/core/pluresdb/index.d.ts +0 -15
  380. package/dist/src/core/pluresdb/index.d.ts.map +0 -1
  381. package/dist/src/core/pluresdb/index.js +0 -11
  382. package/dist/src/core/pluresdb/index.js.map +0 -1
  383. package/dist/src/core/pluresdb/schema-registry.d.ts +0 -104
  384. package/dist/src/core/pluresdb/schema-registry.d.ts.map +0 -1
  385. package/dist/src/core/pluresdb/schema-registry.js +0 -130
  386. package/dist/src/core/pluresdb/schema-registry.js.map +0 -1
  387. package/dist/src/core/pluresdb/store.d.ts +0 -199
  388. package/dist/src/core/pluresdb/store.d.ts.map +0 -1
  389. package/dist/src/core/pluresdb/store.js +0 -344
  390. package/dist/src/core/pluresdb/store.js.map +0 -1
  391. package/dist/src/core/protocol.d.ts.map +0 -1
  392. package/dist/src/core/protocol.js +0 -46
  393. package/dist/src/core/protocol.js.map +0 -1
  394. package/dist/src/core/rules.d.ts +0 -120
  395. package/dist/src/core/rules.d.ts.map +0 -1
  396. package/dist/src/core/rules.js +0 -81
  397. package/dist/src/core/rules.js.map +0 -1
  398. package/dist/src/core/schema/loader.d.ts +0 -47
  399. package/dist/src/core/schema/loader.d.ts.map +0 -1
  400. package/dist/src/core/schema/loader.js +0 -189
  401. package/dist/src/core/schema/loader.js.map +0 -1
  402. package/dist/src/core/schema/normalize.d.ts +0 -72
  403. package/dist/src/core/schema/normalize.d.ts.map +0 -1
  404. package/dist/src/core/schema/normalize.js +0 -190
  405. package/dist/src/core/schema/normalize.js.map +0 -1
  406. package/dist/src/core/schema/types.d.ts.map +0 -1
  407. package/dist/src/core/schema/types.js +0 -161
  408. package/dist/src/core/schema/types.js.map +0 -1
  409. package/dist/src/dsl/index.d.ts +0 -152
  410. package/dist/src/dsl/index.d.ts.map +0 -1
  411. package/dist/src/dsl/index.js +0 -132
  412. package/dist/src/dsl/index.js.map +0 -1
  413. package/dist/src/dsl.d.ts +0 -124
  414. package/dist/src/dsl.d.ts.map +0 -1
  415. package/dist/src/dsl.js +0 -130
  416. package/dist/src/dsl.js.map +0 -1
  417. package/dist/src/examples/advanced-todo/index.d.ts +0 -55
  418. package/dist/src/examples/advanced-todo/index.d.ts.map +0 -1
  419. package/dist/src/examples/advanced-todo/index.js +0 -222
  420. package/dist/src/examples/advanced-todo/index.js.map +0 -1
  421. package/dist/src/examples/auth-basic/index.d.ts +0 -17
  422. package/dist/src/examples/auth-basic/index.d.ts.map +0 -1
  423. package/dist/src/examples/auth-basic/index.js +0 -122
  424. package/dist/src/examples/auth-basic/index.js.map +0 -1
  425. package/dist/src/examples/cart/index.d.ts +0 -19
  426. package/dist/src/examples/cart/index.d.ts.map +0 -1
  427. package/dist/src/examples/cart/index.js +0 -202
  428. package/dist/src/examples/cart/index.js.map +0 -1
  429. package/dist/src/examples/hero-ecommerce/index.d.ts +0 -39
  430. package/dist/src/examples/hero-ecommerce/index.d.ts.map +0 -1
  431. package/dist/src/examples/hero-ecommerce/index.js +0 -506
  432. package/dist/src/examples/hero-ecommerce/index.js.map +0 -1
  433. package/dist/src/examples/svelte-counter/index.d.ts +0 -31
  434. package/dist/src/examples/svelte-counter/index.d.ts.map +0 -1
  435. package/dist/src/examples/svelte-counter/index.js +0 -123
  436. package/dist/src/examples/svelte-counter/index.js.map +0 -1
  437. package/dist/src/flows.d.ts +0 -125
  438. package/dist/src/flows.d.ts.map +0 -1
  439. package/dist/src/flows.js +0 -160
  440. package/dist/src/flows.js.map +0 -1
  441. package/dist/src/index.d.ts +0 -77
  442. package/dist/src/index.d.ts.map +0 -1
  443. package/dist/src/index.js +0 -64
  444. package/dist/src/index.js.map +0 -1
  445. package/dist/src/integrations/code-canvas.d.ts +0 -265
  446. package/dist/src/integrations/code-canvas.d.ts.map +0 -1
  447. package/dist/src/integrations/code-canvas.js +0 -451
  448. package/dist/src/integrations/code-canvas.js.map +0 -1
  449. package/dist/src/integrations/pluresdb.d.ts +0 -117
  450. package/dist/src/integrations/pluresdb.d.ts.map +0 -1
  451. package/dist/src/integrations/pluresdb.js +0 -117
  452. package/dist/src/integrations/pluresdb.js.map +0 -1
  453. package/dist/src/integrations/state-docs.d.ts +0 -191
  454. package/dist/src/integrations/state-docs.d.ts.map +0 -1
  455. package/dist/src/integrations/state-docs.js +0 -515
  456. package/dist/src/integrations/state-docs.js.map +0 -1
  457. package/dist/src/integrations/svelte.d.ts.map +0 -1
  458. package/dist/src/integrations/svelte.js +0 -447
  459. package/dist/src/integrations/svelte.js.map +0 -1
  460. package/dist/src/integrations/tauri.d.ts +0 -360
  461. package/dist/src/integrations/tauri.d.ts.map +0 -1
  462. package/dist/src/integrations/tauri.js +0 -278
  463. package/dist/src/integrations/tauri.js.map +0 -1
  464. package/dist/src/integrations/unum.d.ts +0 -159
  465. package/dist/src/integrations/unum.d.ts.map +0 -1
  466. package/dist/src/integrations/unum.js +0 -240
  467. package/dist/src/integrations/unum.js.map +0 -1
  468. package/dist/src/registry.d.ts +0 -94
  469. package/dist/src/registry.d.ts.map +0 -1
  470. package/dist/src/registry.js +0 -181
  471. package/dist/src/registry.js.map +0 -1
  472. package/dist/src/runtime/terminal-adapter.d.ts.map +0 -1
  473. package/dist/src/runtime/terminal-adapter.js +0 -239
  474. package/dist/src/runtime/terminal-adapter.js.map +0 -1
  475. package/dist/src/step.d.ts +0 -34
  476. package/dist/src/step.d.ts.map +0 -1
  477. package/dist/src/step.js +0 -111
  478. package/dist/src/step.js.map +0 -1
  479. package/dist/src/types.d.ts +0 -63
  480. package/dist/src/types.d.ts.map +0 -1
  481. package/dist/src/types.js +0 -6
  482. package/dist/src/types.js.map +0 -1
  483. package/dist/tools/ast-analyzer/src/ast-analyzer.d.ts +0 -8
  484. package/dist/tools/ast-analyzer/src/ast-analyzer.d.ts.map +0 -1
  485. package/dist/tools/ast-analyzer/src/ast-analyzer.js +0 -119
  486. package/dist/tools/ast-analyzer/src/ast-analyzer.js.map +0 -1
  487. package/dist/tools/cli/commands/index.d.ts +0 -7
  488. package/dist/tools/cli/commands/index.d.ts.map +0 -1
  489. package/dist/tools/cli/commands/index.js +0 -7
  490. package/dist/tools/cli/commands/index.js.map +0 -1
  491. package/dist/tools/cli/index.d.ts +0 -8
  492. package/dist/tools/cli/index.d.ts.map +0 -1
  493. package/dist/tools/cli/index.js +0 -9
  494. package/dist/tools/cli/index.js.map +0 -1
  495. package/dist/tools/watcher/index.d.ts +0 -105
  496. package/dist/tools/watcher/index.d.ts.map +0 -1
  497. package/dist/tools/watcher/index.js +0 -213
  498. package/dist/tools/watcher/index.js.map +0 -1
  499. package/dist/ui/canvas/canvas-projection.d.ts +0 -78
  500. package/dist/ui/canvas/canvas-projection.d.ts.map +0 -1
  501. package/dist/ui/canvas/canvas-projection.js +0 -416
  502. package/dist/ui/canvas/canvas-projection.js.map +0 -1
  503. package/dist/ui/canvas/canvas-state.d.ts +0 -200
  504. package/dist/ui/canvas/canvas-state.d.ts.map +0 -1
  505. package/dist/ui/canvas/canvas-state.js +0 -464
  506. package/dist/ui/canvas/canvas-state.js.map +0 -1
  507. package/dist/ui/canvas/components/index.d.ts +0 -95
  508. package/dist/ui/canvas/components/index.d.ts.map +0 -1
  509. package/dist/ui/canvas/components/index.js +0 -19
  510. package/dist/ui/canvas/components/index.js.map +0 -1
  511. package/dist/ui/canvas/index.d.ts +0 -32
  512. package/dist/ui/canvas/index.d.ts.map +0 -1
  513. package/dist/ui/canvas/index.js +0 -32
  514. package/dist/ui/canvas/index.js.map +0 -1
  515. package/dist/ui/canvas-inspector/src/server.d.ts +0 -2
  516. package/dist/ui/canvas-inspector/src/server.d.ts.map +0 -1
  517. package/dist/ui/canvas-inspector/src/server.js +0 -248
  518. package/dist/ui/canvas-inspector/src/server.js.map +0 -1
  519. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.d.ts +0 -5
  520. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.d.ts.map +0 -1
  521. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.js +0 -58
  522. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.js.map +0 -1
  523. package/dist/ui/svelte-generator/index.d.ts +0 -9
  524. package/dist/ui/svelte-generator/index.d.ts.map +0 -1
  525. package/dist/ui/svelte-generator/index.js +0 -11
  526. package/dist/ui/svelte-generator/index.js.map +0 -1
  527. package/dist/ui/svelte-generator/psf-generator.d.ts +0 -128
  528. package/dist/ui/svelte-generator/psf-generator.d.ts.map +0 -1
  529. package/dist/ui/svelte-generator/psf-generator.js +0 -506
  530. package/dist/ui/svelte-generator/psf-generator.js.map +0 -1
@@ -9,6 +9,7 @@ This tutorial walks you through building a dynamic form builder application. You
9
9
  ## What You'll Build
10
10
 
11
11
  A form builder that allows users to:
12
+
12
13
  - Create new forms with a name and description
13
14
  - Add various field types (text, number, select, checkbox, etc.)
14
15
  - Configure field properties (label, required, validation)
@@ -63,8 +64,14 @@ The form builder schema is available at `examples/form-builder/schema.psf.json`.
63
64
  {
64
65
  "events": [
65
66
  { "tag": "CreateForm", "payload": { "name": "string" } },
66
- { "tag": "AddField", "payload": { "formId": "string", "fieldType": "string", "label": "string" } },
67
- { "tag": "UpdateField", "payload": { "fieldId": "string", "label": "string", "required": "boolean" } },
67
+ {
68
+ "tag": "AddField",
69
+ "payload": { "formId": "string", "fieldType": "string", "label": "string" }
70
+ },
71
+ {
72
+ "tag": "UpdateField",
73
+ "payload": { "fieldId": "string", "label": "string", "required": "boolean" }
74
+ },
68
75
  { "tag": "ReorderFields", "payload": { "formId": "string", "fieldOrder": "string[]" } },
69
76
  { "tag": "SubmitForm", "payload": { "formId": "string", "data": "object" } }
70
77
  ]
@@ -121,20 +128,48 @@ interface FormBuilderContext {
121
128
  }
122
129
 
123
130
  // Facts
124
- export const FormCreated = defineFact<'FormCreated', { formId: string; name: string }>('FormCreated');
125
- export const FieldAdded = defineFact<'FieldAdded', { formId: string; fieldId: string; fieldType: string }>('FieldAdded');
126
- export const FieldRemoved = defineFact<'FieldRemoved', { formId: string; fieldId: string }>('FieldRemoved');
131
+ export const FormCreated = defineFact<'FormCreated', { formId: string; name: string }>(
132
+ 'FormCreated'
133
+ );
134
+ export const FieldAdded = defineFact<
135
+ 'FieldAdded',
136
+ { formId: string; fieldId: string; fieldType: string }
137
+ >('FieldAdded');
138
+ export const FieldRemoved = defineFact<'FieldRemoved', { formId: string; fieldId: string }>(
139
+ 'FieldRemoved'
140
+ );
127
141
  export const FieldUpdated = defineFact<'FieldUpdated', { fieldId: string }>('FieldUpdated');
128
- export const FormSubmitted = defineFact<'FormSubmitted', { formId: string; submissionId: string }>('FormSubmitted');
129
- export const ValidationFailed = defineFact<'ValidationFailed', { formId: string; errors: Array<{ fieldId: string; message: string }> }>('ValidationFailed');
142
+ export const FormSubmitted = defineFact<'FormSubmitted', { formId: string; submissionId: string }>(
143
+ 'FormSubmitted'
144
+ );
145
+ export const ValidationFailed = defineFact<
146
+ 'ValidationFailed',
147
+ { formId: string; errors: Array<{ fieldId: string; message: string }> }
148
+ >('ValidationFailed');
130
149
 
131
150
  // Events
132
- export const CREATE_FORM = defineEvent<'CREATE_FORM', { name: string; description?: string }>('CREATE_FORM');
133
- export const ADD_FIELD = defineEvent<'ADD_FIELD', { formId: string; fieldType: string; label: string; required?: boolean }>('ADD_FIELD');
134
- export const REMOVE_FIELD = defineEvent<'REMOVE_FIELD', { formId: string; fieldId: string }>('REMOVE_FIELD');
135
- export const UPDATE_FIELD = defineEvent<'UPDATE_FIELD', { fieldId: string; updates: Partial<FormField> }>('UPDATE_FIELD');
136
- export const REORDER_FIELDS = defineEvent<'REORDER_FIELDS', { formId: string; fieldOrder: string[] }>('REORDER_FIELDS');
137
- export const SUBMIT_FORM = defineEvent<'SUBMIT_FORM', { formId: string; data: Record<string, any> }>('SUBMIT_FORM');
151
+ export const CREATE_FORM = defineEvent<'CREATE_FORM', { name: string; description?: string }>(
152
+ 'CREATE_FORM'
153
+ );
154
+ export const ADD_FIELD = defineEvent<
155
+ 'ADD_FIELD',
156
+ { formId: string; fieldType: string; label: string; required?: boolean }
157
+ >('ADD_FIELD');
158
+ export const REMOVE_FIELD = defineEvent<'REMOVE_FIELD', { formId: string; fieldId: string }>(
159
+ 'REMOVE_FIELD'
160
+ );
161
+ export const UPDATE_FIELD = defineEvent<
162
+ 'UPDATE_FIELD',
163
+ { fieldId: string; updates: Partial<FormField> }
164
+ >('UPDATE_FIELD');
165
+ export const REORDER_FIELDS = defineEvent<
166
+ 'REORDER_FIELDS',
167
+ { formId: string; fieldOrder: string[] }
168
+ >('REORDER_FIELDS');
169
+ export const SUBMIT_FORM = defineEvent<
170
+ 'SUBMIT_FORM',
171
+ { formId: string; data: Record<string, any> }
172
+ >('SUBMIT_FORM');
138
173
  export const SELECT_FORM = defineEvent<'SELECT_FORM', { formId: string }>('SELECT_FORM');
139
174
  export const SELECT_FIELD = defineEvent<'SELECT_FIELD', { fieldId: string | null }>('SELECT_FIELD');
140
175
 
@@ -145,10 +180,10 @@ const createFormRule = defineRule<FormBuilderContext>({
145
180
  impl: (state, events) => {
146
181
  const event = events.find(CREATE_FORM.is);
147
182
  if (!event) return [];
148
-
183
+
149
184
  const now = new Date();
150
185
  const formId = `form_${Date.now().toString(36)}`;
151
-
186
+
152
187
  const form: Form = {
153
188
  id: formId,
154
189
  name: event.payload.name,
@@ -157,10 +192,10 @@ const createFormRule = defineRule<FormBuilderContext>({
157
192
  createdAt: now,
158
193
  updatedAt: now,
159
194
  };
160
-
195
+
161
196
  state.context.forms.push(form);
162
197
  state.context.activeFormId = formId;
163
-
198
+
164
199
  return [FormCreated.create({ formId, name: event.payload.name })];
165
200
  },
166
201
  });
@@ -171,10 +206,10 @@ const addFieldRule = defineRule<FormBuilderContext>({
171
206
  impl: (state, events) => {
172
207
  const event = events.find(ADD_FIELD.is);
173
208
  if (!event) return [];
174
-
175
- const form = state.context.forms.find(f => f.id === event.payload.formId);
209
+
210
+ const form = state.context.forms.find((f) => f.id === event.payload.formId);
176
211
  if (!form) return [];
177
-
212
+
178
213
  const fieldId = `field_${Date.now().toString(36)}`;
179
214
  const field: FormField = {
180
215
  id: fieldId,
@@ -183,16 +218,18 @@ const addFieldRule = defineRule<FormBuilderContext>({
183
218
  required: event.payload.required ?? false,
184
219
  order: form.fields.length,
185
220
  };
186
-
221
+
187
222
  form.fields.push(field);
188
223
  form.updatedAt = new Date();
189
224
  state.context.selectedFieldId = fieldId;
190
-
191
- return [FieldAdded.create({
192
- formId: event.payload.formId,
193
- fieldId,
194
- fieldType: event.payload.fieldType
195
- })];
225
+
226
+ return [
227
+ FieldAdded.create({
228
+ formId: event.payload.formId,
229
+ fieldId,
230
+ fieldType: event.payload.fieldType,
231
+ }),
232
+ ];
196
233
  },
197
234
  });
198
235
 
@@ -202,22 +239,22 @@ const removeFieldRule = defineRule<FormBuilderContext>({
202
239
  impl: (state, events) => {
203
240
  const event = events.find(REMOVE_FIELD.is);
204
241
  if (!event) return [];
205
-
206
- const form = state.context.forms.find(f => f.id === event.payload.formId);
242
+
243
+ const form = state.context.forms.find((f) => f.id === event.payload.formId);
207
244
  if (!form) return [];
208
-
209
- form.fields = form.fields.filter(f => f.id !== event.payload.fieldId);
245
+
246
+ form.fields = form.fields.filter((f) => f.id !== event.payload.fieldId);
210
247
  form.updatedAt = new Date();
211
-
248
+
212
249
  // Reorder remaining fields
213
250
  form.fields.forEach((field, index) => {
214
251
  field.order = index;
215
252
  });
216
-
253
+
217
254
  if (state.context.selectedFieldId === event.payload.fieldId) {
218
255
  state.context.selectedFieldId = null;
219
256
  }
220
-
257
+
221
258
  return [FieldRemoved.create({ formId: event.payload.formId, fieldId: event.payload.fieldId })];
222
259
  },
223
260
  });
@@ -228,16 +265,16 @@ const updateFieldRule = defineRule<FormBuilderContext>({
228
265
  impl: (state, events) => {
229
266
  const event = events.find(UPDATE_FIELD.is);
230
267
  if (!event) return [];
231
-
268
+
232
269
  for (const form of state.context.forms) {
233
- const field = form.fields.find(f => f.id === event.payload.fieldId);
270
+ const field = form.fields.find((f) => f.id === event.payload.fieldId);
234
271
  if (field) {
235
272
  Object.assign(field, event.payload.updates);
236
273
  form.updatedAt = new Date();
237
274
  return [FieldUpdated.create({ fieldId: event.payload.fieldId })];
238
275
  }
239
276
  }
240
-
277
+
241
278
  return [];
242
279
  },
243
280
  });
@@ -248,13 +285,13 @@ const reorderFieldsRule = defineRule<FormBuilderContext>({
248
285
  impl: (state, events) => {
249
286
  const event = events.find(REORDER_FIELDS.is);
250
287
  if (!event) return [];
251
-
252
- const form = state.context.forms.find(f => f.id === event.payload.formId);
288
+
289
+ const form = state.context.forms.find((f) => f.id === event.payload.formId);
253
290
  if (!form) return [];
254
-
291
+
255
292
  // Create a map of field id to field
256
- const fieldMap = new Map(form.fields.map(f => [f.id, f]));
257
-
293
+ const fieldMap = new Map(form.fields.map((f) => [f.id, f]));
294
+
258
295
  // Reorder based on new order
259
296
  form.fields = event.payload.fieldOrder
260
297
  .map((id, index) => {
@@ -266,9 +303,9 @@ const reorderFieldsRule = defineRule<FormBuilderContext>({
266
303
  return null;
267
304
  })
268
305
  .filter((f): f is FormField => f !== null);
269
-
306
+
270
307
  form.updatedAt = new Date();
271
-
308
+
272
309
  return [];
273
310
  },
274
311
  });
@@ -279,13 +316,13 @@ const submitFormRule = defineRule<FormBuilderContext>({
279
316
  impl: (state, events) => {
280
317
  const event = events.find(SUBMIT_FORM.is);
281
318
  if (!event) return [];
282
-
283
- const form = state.context.forms.find(f => f.id === event.payload.formId);
319
+
320
+ const form = state.context.forms.find((f) => f.id === event.payload.formId);
284
321
  if (!form) return [];
285
-
322
+
286
323
  // Validate required fields
287
324
  const errors: Array<{ fieldId: string; message: string }> = [];
288
-
325
+
289
326
  for (const field of form.fields) {
290
327
  if (field.required) {
291
328
  const value = event.payload.data[field.id];
@@ -293,7 +330,7 @@ const submitFormRule = defineRule<FormBuilderContext>({
293
330
  errors.push({ fieldId: field.id, message: `${field.label} is required` });
294
331
  }
295
332
  }
296
-
333
+
297
334
  // Type-specific validation
298
335
  if (field.type === 'email' && event.payload.data[field.id]) {
299
336
  const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
@@ -301,18 +338,18 @@ const submitFormRule = defineRule<FormBuilderContext>({
301
338
  errors.push({ fieldId: field.id, message: 'Invalid email address' });
302
339
  }
303
340
  }
304
-
341
+
305
342
  if (field.type === 'number' && event.payload.data[field.id]) {
306
343
  if (isNaN(Number(event.payload.data[field.id]))) {
307
344
  errors.push({ fieldId: field.id, message: 'Must be a number' });
308
345
  }
309
346
  }
310
347
  }
311
-
348
+
312
349
  if (errors.length > 0) {
313
350
  return [ValidationFailed.create({ formId: event.payload.formId, errors })];
314
351
  }
315
-
352
+
316
353
  // Create submission
317
354
  const submissionId = `sub_${Date.now().toString(36)}`;
318
355
  const submission: FormSubmission = {
@@ -321,9 +358,9 @@ const submitFormRule = defineRule<FormBuilderContext>({
321
358
  data: event.payload.data,
322
359
  submittedAt: new Date(),
323
360
  };
324
-
361
+
325
362
  state.context.submissions.push(submission);
326
-
363
+
327
364
  return [FormSubmitted.create({ formId: event.payload.formId, submissionId })];
328
365
  },
329
366
  });
@@ -334,10 +371,10 @@ const selectFormRule = defineRule<FormBuilderContext>({
334
371
  impl: (state, events) => {
335
372
  const event = events.find(SELECT_FORM.is);
336
373
  if (!event) return [];
337
-
374
+
338
375
  state.context.activeFormId = event.payload.formId;
339
376
  state.context.selectedFieldId = null;
340
-
377
+
341
378
  return [];
342
379
  },
343
380
  });
@@ -348,9 +385,9 @@ const selectFieldRule = defineRule<FormBuilderContext>({
348
385
  impl: (state, events) => {
349
386
  const event = events.find(SELECT_FIELD.is);
350
387
  if (!event) return [];
351
-
388
+
352
389
  state.context.selectedFieldId = event.payload.fieldId;
353
-
390
+
354
391
  return [];
355
392
  },
356
393
  });
@@ -361,7 +398,7 @@ const uniqueFieldIdsConstraint = defineConstraint<FormBuilderContext>({
361
398
  description: 'All field IDs must be unique within a form',
362
399
  check: (state) => {
363
400
  for (const form of state.context.forms) {
364
- const ids = form.fields.map(f => f.id);
401
+ const ids = form.fields.map((f) => f.id);
365
402
  if (ids.length !== new Set(ids).size) {
366
403
  return false;
367
404
  }
@@ -376,7 +413,7 @@ const maxFieldsConstraint = defineConstraint<FormBuilderContext>({
376
413
  id: 'form.maxFields',
377
414
  description: 'Form cannot have more than 50 fields',
378
415
  check: (state) => {
379
- return state.context.forms.every(form => form.fields.length <= 50);
416
+ return state.context.forms.every((form) => form.fields.length <= 50);
380
417
  },
381
418
  errorMessage: 'Form cannot have more than 50 fields',
382
419
  severity: 'error',
@@ -413,13 +450,13 @@ export function createFormBuilderEngine() {
413
450
  // Helper functions
414
451
  export function getActiveForm(context: FormBuilderContext): Form | null {
415
452
  if (!context.activeFormId) return null;
416
- return context.forms.find(f => f.id === context.activeFormId) || null;
453
+ return context.forms.find((f) => f.id === context.activeFormId) || null;
417
454
  }
418
455
 
419
456
  export function getSelectedField(context: FormBuilderContext): FormField | null {
420
457
  if (!context.selectedFieldId) return null;
421
458
  for (const form of context.forms) {
422
- const field = form.fields.find(f => f.id === context.selectedFieldId);
459
+ const field = form.fields.find((f) => f.id === context.selectedFieldId);
423
460
  if (field) return field;
424
461
  }
425
462
  return null;
@@ -442,65 +479,77 @@ import {
442
479
 
443
480
  async function main() {
444
481
  console.log('🛠️ Form Builder Demo\n');
445
-
482
+
446
483
  const engine = createFormBuilderEngine();
447
-
484
+
448
485
  // Create a contact form
449
486
  console.log('Creating contact form...');
450
- engine.dispatch([CREATE_FORM.create({
451
- name: 'Contact Form',
452
- description: 'Get in touch with us'
453
- })]);
454
-
487
+ engine.dispatch([
488
+ CREATE_FORM.create({
489
+ name: 'Contact Form',
490
+ description: 'Get in touch with us',
491
+ }),
492
+ ]);
493
+
455
494
  const form = getActiveForm(engine.getContext());
456
495
  if (!form) throw new Error('Form not created');
457
-
496
+
458
497
  console.log(`✅ Created form: ${form.name}\n`);
459
-
498
+
460
499
  // Add fields
461
500
  console.log('Adding fields...');
462
-
463
- engine.dispatch([ADD_FIELD.create({
464
- formId: form.id,
465
- fieldType: 'text',
466
- label: 'Full Name',
467
- required: true
468
- })]);
469
-
470
- engine.dispatch([ADD_FIELD.create({
471
- formId: form.id,
472
- fieldType: 'email',
473
- label: 'Email Address',
474
- required: true
475
- })]);
476
-
477
- engine.dispatch([ADD_FIELD.create({
478
- formId: form.id,
479
- fieldType: 'select',
480
- label: 'Subject',
481
- required: true
482
- })]);
483
-
484
- engine.dispatch([ADD_FIELD.create({
485
- formId: form.id,
486
- fieldType: 'textarea',
487
- label: 'Message',
488
- required: true
489
- })]);
490
-
501
+
502
+ engine.dispatch([
503
+ ADD_FIELD.create({
504
+ formId: form.id,
505
+ fieldType: 'text',
506
+ label: 'Full Name',
507
+ required: true,
508
+ }),
509
+ ]);
510
+
511
+ engine.dispatch([
512
+ ADD_FIELD.create({
513
+ formId: form.id,
514
+ fieldType: 'email',
515
+ label: 'Email Address',
516
+ required: true,
517
+ }),
518
+ ]);
519
+
520
+ engine.dispatch([
521
+ ADD_FIELD.create({
522
+ formId: form.id,
523
+ fieldType: 'select',
524
+ label: 'Subject',
525
+ required: true,
526
+ }),
527
+ ]);
528
+
529
+ engine.dispatch([
530
+ ADD_FIELD.create({
531
+ formId: form.id,
532
+ fieldType: 'textarea',
533
+ label: 'Message',
534
+ required: true,
535
+ }),
536
+ ]);
537
+
491
538
  // Update the select field with options
492
539
  const updatedForm = getActiveForm(engine.getContext())!;
493
- const subjectField = updatedForm.fields.find(f => f.label === 'Subject');
540
+ const subjectField = updatedForm.fields.find((f) => f.label === 'Subject');
494
541
  if (subjectField) {
495
- engine.dispatch([UPDATE_FIELD.create({
496
- fieldId: subjectField.id,
497
- updates: {
498
- options: ['General Inquiry', 'Support', 'Feedback', 'Other'],
499
- placeholder: 'Select a subject',
500
- },
501
- })]);
542
+ engine.dispatch([
543
+ UPDATE_FIELD.create({
544
+ fieldId: subjectField.id,
545
+ updates: {
546
+ options: ['General Inquiry', 'Support', 'Feedback', 'Other'],
547
+ placeholder: 'Select a subject',
548
+ },
549
+ }),
550
+ ]);
502
551
  }
503
-
552
+
504
553
  // Display form structure
505
554
  const finalForm = getActiveForm(engine.getContext())!;
506
555
  console.log('\n📋 Form Structure:');
@@ -509,7 +558,7 @@ async function main() {
509
558
  console.log(`Description: ${finalForm.description || 'N/A'}`);
510
559
  console.log(`Fields: ${finalForm.fields.length}`);
511
560
  console.log('');
512
-
561
+
513
562
  finalForm.fields.forEach((field, i) => {
514
563
  const required = field.required ? '*' : '';
515
564
  console.log(` ${i + 1}. [${field.type}] ${field.label}${required}`);
@@ -518,56 +567,60 @@ async function main() {
518
567
  }
519
568
  });
520
569
  console.log('─'.repeat(50));
521
-
570
+
522
571
  // Test form submission - with validation error
523
572
  console.log('\n📝 Testing form submission (incomplete data)...');
524
- const result1 = engine.step([SUBMIT_FORM.create({
525
- formId: form.id,
526
- data: {
527
- [finalForm.fields[0].id]: 'John Doe',
528
- // Missing email, subject, message
529
- },
530
- })]);
531
-
532
- const validationFailed = result1.state.facts.find(f => f.tag === 'ValidationFailed');
573
+ const result1 = engine.step([
574
+ SUBMIT_FORM.create({
575
+ formId: form.id,
576
+ data: {
577
+ [finalForm.fields[0].id]: 'John Doe',
578
+ // Missing email, subject, message
579
+ },
580
+ }),
581
+ ]);
582
+
583
+ const validationFailed = result1.state.facts.find((f) => f.tag === 'ValidationFailed');
533
584
  if (validationFailed) {
534
585
  console.log('❌ Validation failed:');
535
586
  (validationFailed.payload as any).errors.forEach((err: any) => {
536
587
  console.log(` - ${err.message}`);
537
588
  });
538
589
  }
539
-
590
+
540
591
  // Test form submission - successful
541
592
  console.log('\n📝 Testing form submission (complete data)...');
542
- const result2 = engine.step([SUBMIT_FORM.create({
543
- formId: form.id,
544
- data: {
545
- [finalForm.fields[0].id]: 'John Doe',
546
- [finalForm.fields[1].id]: 'john@example.com',
547
- [finalForm.fields[2].id]: 'Support',
548
- [finalForm.fields[3].id]: 'I need help with my account.',
549
- },
550
- })]);
551
-
552
- const submitted = result2.state.facts.find(f => f.tag === 'FormSubmitted');
593
+ const result2 = engine.step([
594
+ SUBMIT_FORM.create({
595
+ formId: form.id,
596
+ data: {
597
+ [finalForm.fields[0].id]: 'John Doe',
598
+ [finalForm.fields[1].id]: 'john@example.com',
599
+ [finalForm.fields[2].id]: 'Support',
600
+ [finalForm.fields[3].id]: 'I need help with my account.',
601
+ },
602
+ }),
603
+ ]);
604
+
605
+ const submitted = result2.state.facts.find((f) => f.tag === 'FormSubmitted');
553
606
  if (submitted) {
554
607
  console.log('✅ Form submitted successfully!');
555
608
  console.log(` Submission ID: ${(submitted.payload as any).submissionId}`);
556
609
  }
557
-
610
+
558
611
  // Show submissions
559
612
  console.log('\n📊 Submissions:');
560
613
  const ctx = engine.getContext();
561
614
  ctx.submissions.forEach((sub, i) => {
562
615
  console.log(` ${i + 1}. Submitted at ${sub.submittedAt.toLocaleString()}`);
563
616
  });
564
-
617
+
565
618
  // Demonstrate undo
566
619
  console.log('\n⏪ Demonstrating undo...');
567
620
  console.log(` Before undo: ${ctx.submissions.length} submissions`);
568
621
  engine.undo();
569
622
  console.log(` After undo: ${engine.getContext().submissions.length} submissions`);
570
-
623
+
571
624
  console.log('\n🎉 Done!');
572
625
  }
573
626
 
@@ -581,7 +634,7 @@ main().catch(console.error);
581
634
  When updating nested structures like fields within a form:
582
635
 
583
636
  ```typescript
584
- const form = state.context.forms.find(f => f.id === formId);
637
+ const form = state.context.forms.find((f) => f.id === formId);
585
638
  if (form) {
586
639
  form.fields.push(newField);
587
640
  form.updatedAt = new Date();
@@ -604,8 +657,8 @@ return [FormSubmitted.create({ formId, submissionId })];
604
657
  Undo/redo works automatically with `enableHistory: true`:
605
658
 
606
659
  ```typescript
607
- engine.undo(); // Reverts to previous state
608
- engine.redo(); // Moves forward again
660
+ engine.undo(); // Reverts to previous state
661
+ engine.redo(); // Moves forward again
609
662
  ```
610
663
 
611
664
  ## Next Steps