@plures/praxis 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (534) hide show
  1. package/FRAMEWORK.md +55 -5
  2. package/LICENSE +21 -21
  3. package/README.md +162 -375
  4. package/core/codegen/docs-generator.ts +5 -2
  5. package/core/codegen/index.ts +1 -1
  6. package/core/codegen/ts-generator.ts +15 -15
  7. package/core/db-adapter/index.ts +2 -2
  8. package/core/db-adapter/sync-engine.ts +17 -6
  9. package/core/logic-engine/engine.ts +1 -1
  10. package/core/logic-engine/index.ts +2 -2
  11. package/core/logic-engine/protocol.ts +1 -1
  12. package/core/logic-engine/psf-adapter.ts +8 -4
  13. package/core/logic-engine/rules.ts +1 -1
  14. package/core/schema-engine/compiler.ts +53 -11
  15. package/core/schema-engine/generator.ts +17 -7
  16. package/core/schema-engine/index.ts +2 -2
  17. package/core/schema-engine/psf.ts +12 -3
  18. package/core/schema-engine/types.ts +3 -11
  19. package/core/schema-engine/validator.ts +112 -22
  20. package/dist/browser/engine-BjdqxeXG.d.ts +333 -0
  21. package/dist/browser/index.d.ts +3004 -0
  22. package/dist/browser/index.js +2892 -0
  23. package/dist/{src → browser}/integrations/svelte.d.ts +19 -17
  24. package/dist/browser/integrations/svelte.js +298 -0
  25. package/dist/node/auth-STARLY7I.js +207 -0
  26. package/dist/node/build-Y7OT5VBF.js +144 -0
  27. package/dist/node/canvas-UERZHJYW.js +362 -0
  28. package/dist/node/chunk-DSDC2JWZ.js +256 -0
  29. package/dist/node/chunk-FXQZXAWF.js +175 -0
  30. package/dist/node/chunk-N5Y37EUV.js +202 -0
  31. package/dist/node/chunk-QGM4M3NI.js +37 -0
  32. package/dist/node/chunk-RJMWCNHR.js +175 -0
  33. package/dist/node/chunk-SRM3OPPM.js +404 -0
  34. package/dist/node/chunk-UATVJBNV.js +175 -0
  35. package/dist/node/chunk-UY7YEBE2.js +159 -0
  36. package/dist/node/chunk-XCY2VIFX.js +143 -0
  37. package/dist/node/chunk-YXH4Y7ZZ.js +349 -0
  38. package/dist/node/cli/index.cjs +217418 -0
  39. package/dist/node/cli/index.d.cts +1 -0
  40. package/dist/node/cli/index.d.ts +1 -0
  41. package/dist/node/cli/index.js +690 -0
  42. package/dist/node/cloud/index.cjs +1043 -0
  43. package/dist/node/cloud/index.d.cts +864 -0
  44. package/dist/node/cloud/index.d.ts +864 -0
  45. package/dist/node/cloud/index.js +456 -0
  46. package/dist/node/cloud-AXOK4PSN.js +212 -0
  47. package/dist/node/component.cjs +374 -0
  48. package/dist/node/component.d.cts +125 -0
  49. package/dist/{src/core/component/generator.d.ts → node/component.d.ts} +11 -8
  50. package/dist/node/component.js +9 -0
  51. package/dist/node/components/index.cjs +216 -0
  52. package/dist/node/components/index.d.cts +43 -0
  53. package/dist/{src → node}/components/index.d.ts +8 -8
  54. package/dist/node/components/index.js +7 -0
  55. package/dist/node/create-TRLSVCNQ.js +584 -0
  56. package/dist/node/dev-PMJZUYGE.js +65 -0
  57. package/dist/node/engine-1iqLe6_P.d.ts +214 -0
  58. package/dist/node/engine-CVJobhHm.d.cts +214 -0
  59. package/dist/node/index.cjs +3247 -0
  60. package/dist/node/index.d.cts +2579 -0
  61. package/dist/node/index.d.ts +2579 -0
  62. package/dist/node/index.js +2098 -0
  63. package/dist/node/integrations/svelte.cjs +330 -0
  64. package/dist/node/integrations/svelte.d.cts +309 -0
  65. package/dist/node/integrations/svelte.d.ts +309 -0
  66. package/dist/node/integrations/svelte.js +300 -0
  67. package/dist/node/orchestrate-737TCL5H.js +127 -0
  68. package/dist/{src/core/protocol.d.ts → node/protocol-Qek7ebBl.d.cts} +11 -10
  69. package/dist/node/protocol-Qek7ebBl.d.ts +122 -0
  70. package/dist/node/schema.cjs +200 -0
  71. package/dist/{src/core/schema/types.d.ts → node/schema.d.cts} +30 -29
  72. package/dist/node/schema.d.ts +371 -0
  73. package/dist/node/schema.js +9 -0
  74. package/dist/{src/runtime/terminal-adapter.d.ts → node/terminal-adapter-07HGftGQ.d.ts} +86 -11
  75. package/dist/node/terminal-adapter-XLtCjjb_.d.cts +231 -0
  76. package/dist/node/verify-YBZ7W24H.js +213239 -0
  77. package/docs/MONETIZATION.md +21 -16
  78. package/docs/REACTIVE_REDESIGN.md +132 -0
  79. package/docs/README.md +47 -36
  80. package/docs/SVELTE_INTEGRATION_STRATEGY.md +68 -0
  81. package/docs/TERMINAL_NODE.md +27 -24
  82. package/docs/core/building-extensions.md +58 -61
  83. package/docs/core/cli-usage.md +59 -59
  84. package/docs/core/code-canvas-sync.md +28 -16
  85. package/docs/core/logic-engine.md +77 -82
  86. package/docs/core/pluresdb-integration.md +29 -39
  87. package/docs/core/schema-model.md +66 -52
  88. package/docs/core/ui-generation.md +57 -49
  89. package/docs/core/what-is-praxis.md +32 -15
  90. package/docs/guides/canvas.md +21 -5
  91. package/docs/guides/getting-started.md +13 -7
  92. package/docs/guides/history-state-pattern.md +65 -51
  93. package/docs/guides/orchestration.md +46 -32
  94. package/docs/guides/parallel-state-pattern.md +56 -72
  95. package/docs/guides/svelte-integration.md +45 -53
  96. package/docs/tutorials/README.md +16 -0
  97. package/docs/tutorials/ecommerce-cart.md +177 -95
  98. package/docs/tutorials/first-app.md +26 -41
  99. package/docs/tutorials/form-builder.md +191 -138
  100. package/docs/tutorials/todo-pluresdb.md +71 -69
  101. package/package.json +132 -97
  102. package/src/__tests__/actors.test.ts +68 -68
  103. package/src/__tests__/billing.test.ts +32 -32
  104. package/src/__tests__/canvas-components.test.ts +94 -73
  105. package/src/__tests__/cli-create.test.ts +28 -28
  106. package/src/__tests__/cloud.test.ts +36 -36
  107. package/src/__tests__/code-canvas-integration.test.ts +132 -141
  108. package/src/__tests__/docs-generator.test.ts +3 -9
  109. package/src/__tests__/dsl.test.ts +58 -64
  110. package/src/__tests__/edge-cases.test.ts +106 -108
  111. package/src/__tests__/engine.test.ts +51 -25
  112. package/src/__tests__/generators.test.ts +42 -44
  113. package/src/__tests__/introspection.test.ts +104 -114
  114. package/src/__tests__/pluresdb.test.ts +189 -187
  115. package/src/__tests__/protocol.test.ts +15 -15
  116. package/src/__tests__/provisioning.test.ts +61 -61
  117. package/src/__tests__/schema.test.ts +7 -11
  118. package/src/__tests__/state-docs-integration.test.ts +162 -145
  119. package/src/__tests__/svelte-integration.test.ts +16 -19
  120. package/src/__tests__/tauri-integration.test.ts +149 -147
  121. package/src/__tests__/terminal-node.test.ts +12 -7
  122. package/src/__tests__/unum-integration.test.ts +68 -68
  123. package/src/adapters/cli.ts +21 -15
  124. package/src/cli/commands/auth.ts +82 -78
  125. package/src/cli/commands/build.ts +29 -27
  126. package/src/cli/commands/canvas.ts +338 -127
  127. package/src/cli/commands/cloud.ts +47 -47
  128. package/src/cli/commands/create.ts +59 -47
  129. package/src/cli/commands/dev.ts +12 -12
  130. package/src/cli/commands/generate.ts +29 -40
  131. package/src/cli/commands/orchestrate.ts +24 -24
  132. package/src/cli/commands/verify.ts +7 -8
  133. package/src/cli/index.ts +14 -10
  134. package/src/cloud/README.md +28 -15
  135. package/src/cloud/auth.ts +55 -70
  136. package/src/cloud/billing.ts +59 -58
  137. package/src/cloud/client.ts +29 -35
  138. package/src/cloud/index.ts +19 -40
  139. package/src/cloud/marketplace.ts +69 -78
  140. package/src/cloud/provisioning.ts +42 -51
  141. package/src/cloud/relay/endpoints.ts +30 -34
  142. package/src/cloud/relay/health/index.ts +1 -1
  143. package/src/cloud/relay/stats/index.ts +1 -1
  144. package/src/cloud/relay/sync/index.ts +1 -1
  145. package/src/cloud/relay/usage/index.ts +1 -1
  146. package/src/cloud/sponsors.ts +31 -34
  147. package/src/cloud/types.ts +4 -4
  148. package/src/components/README.md +1 -0
  149. package/src/components/TerminalNode.svelte +457 -457
  150. package/src/components/index.ts +3 -4
  151. package/src/core/actors.ts +7 -7
  152. package/src/core/component/generator.ts +10 -28
  153. package/src/core/engine.ts +51 -24
  154. package/src/core/introspection.ts +37 -35
  155. package/src/core/logic/generator.ts +62 -62
  156. package/src/core/pluresdb/adapter.ts +8 -8
  157. package/src/core/pluresdb/generator.ts +39 -35
  158. package/src/core/pluresdb/index.ts +9 -12
  159. package/src/core/pluresdb/schema-registry.ts +22 -25
  160. package/src/core/pluresdb/store.ts +57 -57
  161. package/src/core/protocol.ts +14 -14
  162. package/src/core/reactive-engine.svelte.ts +65 -0
  163. package/src/core/reactive-engine.ts +67 -0
  164. package/src/core/rules.ts +4 -4
  165. package/src/core/schema/loader.common.ts +150 -0
  166. package/src/core/schema/loader.ts +19 -149
  167. package/src/core/schema/normalize.ts +34 -51
  168. package/src/core/schema/types.ts +47 -11
  169. package/src/dsl/index.ts +8 -8
  170. package/src/dsl.ts +11 -17
  171. package/src/examples/advanced-todo/App.svelte +506 -506
  172. package/src/examples/advanced-todo/README.md +58 -40
  173. package/src/examples/advanced-todo/index.ts +3 -3
  174. package/src/examples/auth-basic/index.ts +30 -30
  175. package/src/examples/cart/index.ts +50 -50
  176. package/src/examples/hero-ecommerce/index.ts +130 -157
  177. package/src/examples/svelte-counter/index.ts +22 -26
  178. package/src/flows.ts +6 -17
  179. package/src/index.browser.ts +204 -0
  180. package/src/index.ts +37 -42
  181. package/src/integrations/code-canvas.ts +237 -193
  182. package/src/integrations/pluresdb.ts +55 -35
  183. package/src/integrations/state-docs.ts +104 -104
  184. package/src/integrations/svelte.ts +35 -35
  185. package/src/integrations/tauri.ts +75 -73
  186. package/src/integrations/unum.ts +68 -61
  187. package/src/registry.ts +7 -14
  188. package/src/runtime/terminal-adapter.ts +31 -26
  189. package/src/step.ts +10 -16
  190. package/src/types.ts +1 -1
  191. package/templates/basic-app/README.md +6 -9
  192. package/templates/fullstack-app/README.md +10 -0
  193. package/dist/core/codegen/docs-generator.d.ts +0 -123
  194. package/dist/core/codegen/docs-generator.d.ts.map +0 -1
  195. package/dist/core/codegen/docs-generator.js +0 -674
  196. package/dist/core/codegen/docs-generator.js.map +0 -1
  197. package/dist/core/codegen/index.d.ts +0 -11
  198. package/dist/core/codegen/index.d.ts.map +0 -1
  199. package/dist/core/codegen/index.js +0 -13
  200. package/dist/core/codegen/index.js.map +0 -1
  201. package/dist/core/codegen/ts-generator.d.ts +0 -8
  202. package/dist/core/codegen/ts-generator.d.ts.map +0 -1
  203. package/dist/core/codegen/ts-generator.js +0 -8
  204. package/dist/core/codegen/ts-generator.js.map +0 -1
  205. package/dist/core/db-adapter/index.d.ts +0 -18
  206. package/dist/core/db-adapter/index.d.ts.map +0 -1
  207. package/dist/core/db-adapter/index.js +0 -23
  208. package/dist/core/db-adapter/index.js.map +0 -1
  209. package/dist/core/db-adapter/sync-engine.d.ts +0 -180
  210. package/dist/core/db-adapter/sync-engine.d.ts.map +0 -1
  211. package/dist/core/db-adapter/sync-engine.js +0 -342
  212. package/dist/core/db-adapter/sync-engine.js.map +0 -1
  213. package/dist/core/logic-engine/engine.d.ts +0 -8
  214. package/dist/core/logic-engine/engine.d.ts.map +0 -1
  215. package/dist/core/logic-engine/engine.js +0 -8
  216. package/dist/core/logic-engine/engine.js.map +0 -1
  217. package/dist/core/logic-engine/index.d.ts +0 -16
  218. package/dist/core/logic-engine/index.d.ts.map +0 -1
  219. package/dist/core/logic-engine/index.js +0 -16
  220. package/dist/core/logic-engine/index.js.map +0 -1
  221. package/dist/core/logic-engine/protocol.d.ts +0 -7
  222. package/dist/core/logic-engine/protocol.d.ts.map +0 -1
  223. package/dist/core/logic-engine/protocol.js +0 -7
  224. package/dist/core/logic-engine/protocol.js.map +0 -1
  225. package/dist/core/logic-engine/psf-adapter.d.ts +0 -88
  226. package/dist/core/logic-engine/psf-adapter.d.ts.map +0 -1
  227. package/dist/core/logic-engine/psf-adapter.js +0 -207
  228. package/dist/core/logic-engine/psf-adapter.js.map +0 -1
  229. package/dist/core/logic-engine/rules.d.ts +0 -7
  230. package/dist/core/logic-engine/rules.d.ts.map +0 -1
  231. package/dist/core/logic-engine/rules.js +0 -7
  232. package/dist/core/logic-engine/rules.js.map +0 -1
  233. package/dist/core/schema-engine/compiler.d.ts +0 -198
  234. package/dist/core/schema-engine/compiler.d.ts.map +0 -1
  235. package/dist/core/schema-engine/compiler.js +0 -262
  236. package/dist/core/schema-engine/compiler.js.map +0 -1
  237. package/dist/core/schema-engine/generator.d.ts +0 -115
  238. package/dist/core/schema-engine/generator.d.ts.map +0 -1
  239. package/dist/core/schema-engine/generator.js +0 -506
  240. package/dist/core/schema-engine/generator.js.map +0 -1
  241. package/dist/core/schema-engine/index.d.ts +0 -18
  242. package/dist/core/schema-engine/index.d.ts.map +0 -1
  243. package/dist/core/schema-engine/index.js +0 -18
  244. package/dist/core/schema-engine/index.js.map +0 -1
  245. package/dist/core/schema-engine/psf.d.ts +0 -612
  246. package/dist/core/schema-engine/psf.d.ts.map +0 -1
  247. package/dist/core/schema-engine/psf.js +0 -45
  248. package/dist/core/schema-engine/psf.js.map +0 -1
  249. package/dist/core/schema-engine/types.d.ts +0 -10
  250. package/dist/core/schema-engine/types.d.ts.map +0 -1
  251. package/dist/core/schema-engine/types.js +0 -7
  252. package/dist/core/schema-engine/types.js.map +0 -1
  253. package/dist/core/schema-engine/validator.d.ts +0 -140
  254. package/dist/core/schema-engine/validator.d.ts.map +0 -1
  255. package/dist/core/schema-engine/validator.js +0 -407
  256. package/dist/core/schema-engine/validator.js.map +0 -1
  257. package/dist/src/adapters/cli.d.ts +0 -43
  258. package/dist/src/adapters/cli.d.ts.map +0 -1
  259. package/dist/src/adapters/cli.js +0 -126
  260. package/dist/src/adapters/cli.js.map +0 -1
  261. package/dist/src/cli/commands/auth.d.ts +0 -26
  262. package/dist/src/cli/commands/auth.d.ts.map +0 -1
  263. package/dist/src/cli/commands/auth.js +0 -233
  264. package/dist/src/cli/commands/auth.js.map +0 -1
  265. package/dist/src/cli/commands/build.d.ts +0 -23
  266. package/dist/src/cli/commands/build.d.ts.map +0 -1
  267. package/dist/src/cli/commands/build.js +0 -162
  268. package/dist/src/cli/commands/build.js.map +0 -1
  269. package/dist/src/cli/commands/canvas.d.ts +0 -23
  270. package/dist/src/cli/commands/canvas.d.ts.map +0 -1
  271. package/dist/src/cli/commands/canvas.js +0 -215
  272. package/dist/src/cli/commands/canvas.js.map +0 -1
  273. package/dist/src/cli/commands/cloud.d.ts +0 -27
  274. package/dist/src/cli/commands/cloud.d.ts.map +0 -1
  275. package/dist/src/cli/commands/cloud.js +0 -232
  276. package/dist/src/cli/commands/cloud.js.map +0 -1
  277. package/dist/src/cli/commands/create.d.ts +0 -21
  278. package/dist/src/cli/commands/create.d.ts.map +0 -1
  279. package/dist/src/cli/commands/create.js +0 -621
  280. package/dist/src/cli/commands/create.js.map +0 -1
  281. package/dist/src/cli/commands/dev.d.ts +0 -21
  282. package/dist/src/cli/commands/dev.d.ts.map +0 -1
  283. package/dist/src/cli/commands/dev.js +0 -71
  284. package/dist/src/cli/commands/dev.js.map +0 -1
  285. package/dist/src/cli/commands/generate.d.ts +0 -25
  286. package/dist/src/cli/commands/generate.d.ts.map +0 -1
  287. package/dist/src/cli/commands/generate.js +0 -168
  288. package/dist/src/cli/commands/generate.js.map +0 -1
  289. package/dist/src/cli/commands/orchestrate.d.ts +0 -44
  290. package/dist/src/cli/commands/orchestrate.d.ts.map +0 -1
  291. package/dist/src/cli/commands/orchestrate.js +0 -150
  292. package/dist/src/cli/commands/orchestrate.js.map +0 -1
  293. package/dist/src/cli/commands/verify.d.ts +0 -10
  294. package/dist/src/cli/commands/verify.d.ts.map +0 -1
  295. package/dist/src/cli/commands/verify.js +0 -39
  296. package/dist/src/cli/commands/verify.js.map +0 -1
  297. package/dist/src/cli/index.d.ts +0 -8
  298. package/dist/src/cli/index.d.ts.map +0 -1
  299. package/dist/src/cli/index.js +0 -226
  300. package/dist/src/cli/index.js.map +0 -1
  301. package/dist/src/cloud/auth.d.ts +0 -51
  302. package/dist/src/cloud/auth.d.ts.map +0 -1
  303. package/dist/src/cloud/auth.js +0 -194
  304. package/dist/src/cloud/auth.js.map +0 -1
  305. package/dist/src/cloud/billing.d.ts +0 -184
  306. package/dist/src/cloud/billing.d.ts.map +0 -1
  307. package/dist/src/cloud/billing.js +0 -179
  308. package/dist/src/cloud/billing.js.map +0 -1
  309. package/dist/src/cloud/client.d.ts +0 -39
  310. package/dist/src/cloud/client.d.ts.map +0 -1
  311. package/dist/src/cloud/client.js +0 -176
  312. package/dist/src/cloud/client.js.map +0 -1
  313. package/dist/src/cloud/index.d.ts +0 -44
  314. package/dist/src/cloud/index.d.ts.map +0 -1
  315. package/dist/src/cloud/index.js +0 -44
  316. package/dist/src/cloud/index.js.map +0 -1
  317. package/dist/src/cloud/marketplace.d.ts +0 -166
  318. package/dist/src/cloud/marketplace.d.ts.map +0 -1
  319. package/dist/src/cloud/marketplace.js +0 -159
  320. package/dist/src/cloud/marketplace.js.map +0 -1
  321. package/dist/src/cloud/provisioning.d.ts +0 -110
  322. package/dist/src/cloud/provisioning.d.ts.map +0 -1
  323. package/dist/src/cloud/provisioning.js +0 -148
  324. package/dist/src/cloud/provisioning.js.map +0 -1
  325. package/dist/src/cloud/relay/endpoints.d.ts +0 -62
  326. package/dist/src/cloud/relay/endpoints.d.ts.map +0 -1
  327. package/dist/src/cloud/relay/endpoints.js +0 -217
  328. package/dist/src/cloud/relay/endpoints.js.map +0 -1
  329. package/dist/src/cloud/relay/health/index.d.ts +0 -5
  330. package/dist/src/cloud/relay/health/index.d.ts.map +0 -1
  331. package/dist/src/cloud/relay/health/index.js +0 -9
  332. package/dist/src/cloud/relay/health/index.js.map +0 -1
  333. package/dist/src/cloud/relay/stats/index.d.ts +0 -5
  334. package/dist/src/cloud/relay/stats/index.d.ts.map +0 -1
  335. package/dist/src/cloud/relay/stats/index.js +0 -9
  336. package/dist/src/cloud/relay/stats/index.js.map +0 -1
  337. package/dist/src/cloud/relay/sync/index.d.ts +0 -5
  338. package/dist/src/cloud/relay/sync/index.d.ts.map +0 -1
  339. package/dist/src/cloud/relay/sync/index.js +0 -9
  340. package/dist/src/cloud/relay/sync/index.js.map +0 -1
  341. package/dist/src/cloud/relay/usage/index.d.ts +0 -5
  342. package/dist/src/cloud/relay/usage/index.d.ts.map +0 -1
  343. package/dist/src/cloud/relay/usage/index.js +0 -9
  344. package/dist/src/cloud/relay/usage/index.js.map +0 -1
  345. package/dist/src/cloud/sponsors.d.ts +0 -81
  346. package/dist/src/cloud/sponsors.d.ts.map +0 -1
  347. package/dist/src/cloud/sponsors.js +0 -130
  348. package/dist/src/cloud/sponsors.js.map +0 -1
  349. package/dist/src/cloud/types.d.ts +0 -169
  350. package/dist/src/cloud/types.d.ts.map +0 -1
  351. package/dist/src/cloud/types.js +0 -7
  352. package/dist/src/cloud/types.js.map +0 -1
  353. package/dist/src/components/index.d.ts.map +0 -1
  354. package/dist/src/components/index.js +0 -17
  355. package/dist/src/components/index.js.map +0 -1
  356. package/dist/src/core/actors.d.ts +0 -95
  357. package/dist/src/core/actors.d.ts.map +0 -1
  358. package/dist/src/core/actors.js +0 -158
  359. package/dist/src/core/actors.js.map +0 -1
  360. package/dist/src/core/component/generator.d.ts.map +0 -1
  361. package/dist/src/core/component/generator.js +0 -349
  362. package/dist/src/core/component/generator.js.map +0 -1
  363. package/dist/src/core/engine.d.ts +0 -92
  364. package/dist/src/core/engine.d.ts.map +0 -1
  365. package/dist/src/core/engine.js +0 -199
  366. package/dist/src/core/engine.js.map +0 -1
  367. package/dist/src/core/introspection.d.ts +0 -141
  368. package/dist/src/core/introspection.d.ts.map +0 -1
  369. package/dist/src/core/introspection.js +0 -208
  370. package/dist/src/core/introspection.js.map +0 -1
  371. package/dist/src/core/logic/generator.d.ts +0 -76
  372. package/dist/src/core/logic/generator.d.ts.map +0 -1
  373. package/dist/src/core/logic/generator.js +0 -370
  374. package/dist/src/core/logic/generator.js.map +0 -1
  375. package/dist/src/core/pluresdb/adapter.d.ts +0 -72
  376. package/dist/src/core/pluresdb/adapter.d.ts.map +0 -1
  377. package/dist/src/core/pluresdb/adapter.js +0 -73
  378. package/dist/src/core/pluresdb/adapter.js.map +0 -1
  379. package/dist/src/core/pluresdb/generator.d.ts +0 -58
  380. package/dist/src/core/pluresdb/generator.d.ts.map +0 -1
  381. package/dist/src/core/pluresdb/generator.js +0 -191
  382. package/dist/src/core/pluresdb/generator.js.map +0 -1
  383. package/dist/src/core/pluresdb/index.d.ts +0 -15
  384. package/dist/src/core/pluresdb/index.d.ts.map +0 -1
  385. package/dist/src/core/pluresdb/index.js +0 -11
  386. package/dist/src/core/pluresdb/index.js.map +0 -1
  387. package/dist/src/core/pluresdb/schema-registry.d.ts +0 -104
  388. package/dist/src/core/pluresdb/schema-registry.d.ts.map +0 -1
  389. package/dist/src/core/pluresdb/schema-registry.js +0 -130
  390. package/dist/src/core/pluresdb/schema-registry.js.map +0 -1
  391. package/dist/src/core/pluresdb/store.d.ts +0 -199
  392. package/dist/src/core/pluresdb/store.d.ts.map +0 -1
  393. package/dist/src/core/pluresdb/store.js +0 -344
  394. package/dist/src/core/pluresdb/store.js.map +0 -1
  395. package/dist/src/core/protocol.d.ts.map +0 -1
  396. package/dist/src/core/protocol.js +0 -46
  397. package/dist/src/core/protocol.js.map +0 -1
  398. package/dist/src/core/rules.d.ts +0 -120
  399. package/dist/src/core/rules.d.ts.map +0 -1
  400. package/dist/src/core/rules.js +0 -81
  401. package/dist/src/core/rules.js.map +0 -1
  402. package/dist/src/core/schema/loader.d.ts +0 -47
  403. package/dist/src/core/schema/loader.d.ts.map +0 -1
  404. package/dist/src/core/schema/loader.js +0 -189
  405. package/dist/src/core/schema/loader.js.map +0 -1
  406. package/dist/src/core/schema/normalize.d.ts +0 -72
  407. package/dist/src/core/schema/normalize.d.ts.map +0 -1
  408. package/dist/src/core/schema/normalize.js +0 -190
  409. package/dist/src/core/schema/normalize.js.map +0 -1
  410. package/dist/src/core/schema/types.d.ts.map +0 -1
  411. package/dist/src/core/schema/types.js +0 -161
  412. package/dist/src/core/schema/types.js.map +0 -1
  413. package/dist/src/dsl/index.d.ts +0 -152
  414. package/dist/src/dsl/index.d.ts.map +0 -1
  415. package/dist/src/dsl/index.js +0 -132
  416. package/dist/src/dsl/index.js.map +0 -1
  417. package/dist/src/dsl.d.ts +0 -124
  418. package/dist/src/dsl.d.ts.map +0 -1
  419. package/dist/src/dsl.js +0 -130
  420. package/dist/src/dsl.js.map +0 -1
  421. package/dist/src/examples/advanced-todo/index.d.ts +0 -55
  422. package/dist/src/examples/advanced-todo/index.d.ts.map +0 -1
  423. package/dist/src/examples/advanced-todo/index.js +0 -222
  424. package/dist/src/examples/advanced-todo/index.js.map +0 -1
  425. package/dist/src/examples/auth-basic/index.d.ts +0 -17
  426. package/dist/src/examples/auth-basic/index.d.ts.map +0 -1
  427. package/dist/src/examples/auth-basic/index.js +0 -122
  428. package/dist/src/examples/auth-basic/index.js.map +0 -1
  429. package/dist/src/examples/cart/index.d.ts +0 -19
  430. package/dist/src/examples/cart/index.d.ts.map +0 -1
  431. package/dist/src/examples/cart/index.js +0 -202
  432. package/dist/src/examples/cart/index.js.map +0 -1
  433. package/dist/src/examples/hero-ecommerce/index.d.ts +0 -39
  434. package/dist/src/examples/hero-ecommerce/index.d.ts.map +0 -1
  435. package/dist/src/examples/hero-ecommerce/index.js +0 -506
  436. package/dist/src/examples/hero-ecommerce/index.js.map +0 -1
  437. package/dist/src/examples/svelte-counter/index.d.ts +0 -31
  438. package/dist/src/examples/svelte-counter/index.d.ts.map +0 -1
  439. package/dist/src/examples/svelte-counter/index.js +0 -123
  440. package/dist/src/examples/svelte-counter/index.js.map +0 -1
  441. package/dist/src/flows.d.ts +0 -125
  442. package/dist/src/flows.d.ts.map +0 -1
  443. package/dist/src/flows.js +0 -160
  444. package/dist/src/flows.js.map +0 -1
  445. package/dist/src/index.d.ts +0 -77
  446. package/dist/src/index.d.ts.map +0 -1
  447. package/dist/src/index.js +0 -64
  448. package/dist/src/index.js.map +0 -1
  449. package/dist/src/integrations/code-canvas.d.ts +0 -265
  450. package/dist/src/integrations/code-canvas.d.ts.map +0 -1
  451. package/dist/src/integrations/code-canvas.js +0 -451
  452. package/dist/src/integrations/code-canvas.js.map +0 -1
  453. package/dist/src/integrations/pluresdb.d.ts +0 -117
  454. package/dist/src/integrations/pluresdb.d.ts.map +0 -1
  455. package/dist/src/integrations/pluresdb.js +0 -117
  456. package/dist/src/integrations/pluresdb.js.map +0 -1
  457. package/dist/src/integrations/state-docs.d.ts +0 -191
  458. package/dist/src/integrations/state-docs.d.ts.map +0 -1
  459. package/dist/src/integrations/state-docs.js +0 -515
  460. package/dist/src/integrations/state-docs.js.map +0 -1
  461. package/dist/src/integrations/svelte.d.ts.map +0 -1
  462. package/dist/src/integrations/svelte.js +0 -447
  463. package/dist/src/integrations/svelte.js.map +0 -1
  464. package/dist/src/integrations/tauri.d.ts +0 -360
  465. package/dist/src/integrations/tauri.d.ts.map +0 -1
  466. package/dist/src/integrations/tauri.js +0 -278
  467. package/dist/src/integrations/tauri.js.map +0 -1
  468. package/dist/src/integrations/unum.d.ts +0 -159
  469. package/dist/src/integrations/unum.d.ts.map +0 -1
  470. package/dist/src/integrations/unum.js +0 -240
  471. package/dist/src/integrations/unum.js.map +0 -1
  472. package/dist/src/registry.d.ts +0 -94
  473. package/dist/src/registry.d.ts.map +0 -1
  474. package/dist/src/registry.js +0 -181
  475. package/dist/src/registry.js.map +0 -1
  476. package/dist/src/runtime/terminal-adapter.d.ts.map +0 -1
  477. package/dist/src/runtime/terminal-adapter.js +0 -239
  478. package/dist/src/runtime/terminal-adapter.js.map +0 -1
  479. package/dist/src/step.d.ts +0 -34
  480. package/dist/src/step.d.ts.map +0 -1
  481. package/dist/src/step.js +0 -111
  482. package/dist/src/step.js.map +0 -1
  483. package/dist/src/types.d.ts +0 -63
  484. package/dist/src/types.d.ts.map +0 -1
  485. package/dist/src/types.js +0 -6
  486. package/dist/src/types.js.map +0 -1
  487. package/dist/tools/ast-analyzer/src/ast-analyzer.d.ts +0 -8
  488. package/dist/tools/ast-analyzer/src/ast-analyzer.d.ts.map +0 -1
  489. package/dist/tools/ast-analyzer/src/ast-analyzer.js +0 -119
  490. package/dist/tools/ast-analyzer/src/ast-analyzer.js.map +0 -1
  491. package/dist/tools/cli/commands/index.d.ts +0 -7
  492. package/dist/tools/cli/commands/index.d.ts.map +0 -1
  493. package/dist/tools/cli/commands/index.js +0 -7
  494. package/dist/tools/cli/commands/index.js.map +0 -1
  495. package/dist/tools/cli/index.d.ts +0 -8
  496. package/dist/tools/cli/index.d.ts.map +0 -1
  497. package/dist/tools/cli/index.js +0 -9
  498. package/dist/tools/cli/index.js.map +0 -1
  499. package/dist/tools/watcher/index.d.ts +0 -105
  500. package/dist/tools/watcher/index.d.ts.map +0 -1
  501. package/dist/tools/watcher/index.js +0 -213
  502. package/dist/tools/watcher/index.js.map +0 -1
  503. package/dist/ui/canvas/canvas-projection.d.ts +0 -78
  504. package/dist/ui/canvas/canvas-projection.d.ts.map +0 -1
  505. package/dist/ui/canvas/canvas-projection.js +0 -416
  506. package/dist/ui/canvas/canvas-projection.js.map +0 -1
  507. package/dist/ui/canvas/canvas-state.d.ts +0 -200
  508. package/dist/ui/canvas/canvas-state.d.ts.map +0 -1
  509. package/dist/ui/canvas/canvas-state.js +0 -464
  510. package/dist/ui/canvas/canvas-state.js.map +0 -1
  511. package/dist/ui/canvas/components/index.d.ts +0 -95
  512. package/dist/ui/canvas/components/index.d.ts.map +0 -1
  513. package/dist/ui/canvas/components/index.js +0 -19
  514. package/dist/ui/canvas/components/index.js.map +0 -1
  515. package/dist/ui/canvas/index.d.ts +0 -32
  516. package/dist/ui/canvas/index.d.ts.map +0 -1
  517. package/dist/ui/canvas/index.js +0 -32
  518. package/dist/ui/canvas/index.js.map +0 -1
  519. package/dist/ui/canvas-inspector/src/server.d.ts +0 -2
  520. package/dist/ui/canvas-inspector/src/server.d.ts.map +0 -1
  521. package/dist/ui/canvas-inspector/src/server.js +0 -248
  522. package/dist/ui/canvas-inspector/src/server.js.map +0 -1
  523. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.d.ts +0 -5
  524. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.d.ts.map +0 -1
  525. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.js +0 -58
  526. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.js.map +0 -1
  527. package/dist/ui/svelte-generator/index.d.ts +0 -9
  528. package/dist/ui/svelte-generator/index.d.ts.map +0 -1
  529. package/dist/ui/svelte-generator/index.js +0 -11
  530. package/dist/ui/svelte-generator/index.js.map +0 -1
  531. package/dist/ui/svelte-generator/psf-generator.d.ts +0 -128
  532. package/dist/ui/svelte-generator/psf-generator.d.ts.map +0 -1
  533. package/dist/ui/svelte-generator/psf-generator.js +0 -506
  534. 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