@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.
- package/FRAMEWORK.md +55 -5
- package/README.md +162 -375
- package/core/codegen/docs-generator.ts +5 -2
- package/core/codegen/index.ts +1 -1
- package/core/db-adapter/index.ts +2 -2
- package/core/db-adapter/sync-engine.ts +17 -6
- package/core/logic-engine/engine.ts +1 -1
- package/core/logic-engine/index.ts +2 -2
- package/core/logic-engine/protocol.ts +1 -1
- package/core/logic-engine/psf-adapter.ts +8 -4
- package/core/logic-engine/rules.ts +1 -1
- package/core/schema-engine/compiler.ts +53 -11
- package/core/schema-engine/generator.ts +17 -7
- package/core/schema-engine/index.ts +2 -2
- package/core/schema-engine/psf.ts +12 -3
- package/core/schema-engine/types.ts +3 -11
- package/core/schema-engine/validator.ts +112 -22
- package/dist/browser/engine-BjdqxeXG.d.ts +333 -0
- package/dist/browser/index.d.ts +3004 -0
- package/dist/browser/index.js +2892 -0
- package/dist/{src → browser}/integrations/svelte.d.ts +19 -17
- package/dist/browser/integrations/svelte.js +298 -0
- package/dist/node/auth-STARLY7I.js +207 -0
- package/dist/node/build-Y7OT5VBF.js +144 -0
- package/dist/node/canvas-UERZHJYW.js +362 -0
- package/dist/node/chunk-DSDC2JWZ.js +256 -0
- package/dist/node/chunk-FXQZXAWF.js +175 -0
- package/dist/node/chunk-N5Y37EUV.js +202 -0
- package/dist/node/chunk-QGM4M3NI.js +37 -0
- package/dist/node/chunk-RJMWCNHR.js +175 -0
- package/dist/node/chunk-SRM3OPPM.js +404 -0
- package/dist/node/chunk-UATVJBNV.js +175 -0
- package/dist/node/chunk-UY7YEBE2.js +159 -0
- package/dist/node/chunk-XCY2VIFX.js +143 -0
- package/dist/node/chunk-YXH4Y7ZZ.js +349 -0
- package/dist/node/cli/index.cjs +215139 -0
- package/dist/node/cli/index.d.cts +1 -0
- package/dist/node/cli/index.d.ts +1 -0
- package/dist/node/cli/index.js +690 -0
- package/dist/node/cloud/index.cjs +1043 -0
- package/dist/node/cloud/index.d.cts +864 -0
- package/dist/node/cloud/index.d.ts +864 -0
- package/dist/node/cloud/index.js +456 -0
- package/dist/node/cloud-AXOK4PSN.js +212 -0
- package/dist/node/component.cjs +374 -0
- package/dist/node/component.d.cts +125 -0
- package/dist/{src/core/component/generator.d.ts → node/component.d.ts} +11 -8
- package/dist/node/component.js +9 -0
- package/dist/node/components/index.cjs +216 -0
- package/dist/node/components/index.d.cts +43 -0
- package/dist/{src → node}/components/index.d.ts +8 -8
- package/dist/node/components/index.js +7 -0
- package/dist/node/create-TRLSVCNQ.js +584 -0
- package/dist/node/dev-PMJZUYGE.js +65 -0
- package/dist/node/engine-1iqLe6_P.d.ts +214 -0
- package/dist/node/engine-CVJobhHm.d.cts +214 -0
- package/dist/node/index.cjs +3247 -0
- package/dist/node/index.d.cts +2579 -0
- package/dist/node/index.d.ts +2579 -0
- package/dist/node/index.js +2098 -0
- package/dist/node/integrations/svelte.cjs +330 -0
- package/dist/node/integrations/svelte.d.cts +309 -0
- package/dist/node/integrations/svelte.d.ts +309 -0
- package/dist/node/integrations/svelte.js +300 -0
- package/dist/node/orchestrate-737TCL5H.js +127 -0
- package/dist/{src/core/protocol.d.ts → node/protocol-Qek7ebBl.d.cts} +11 -10
- package/dist/node/protocol-Qek7ebBl.d.ts +122 -0
- package/dist/node/schema.cjs +200 -0
- package/dist/{src/core/schema/types.d.ts → node/schema.d.cts} +30 -29
- package/dist/node/schema.d.ts +371 -0
- package/dist/node/schema.js +9 -0
- package/dist/{src/runtime/terminal-adapter.d.ts → node/terminal-adapter-07HGftGQ.d.ts} +86 -11
- package/dist/node/terminal-adapter-XLtCjjb_.d.cts +231 -0
- package/dist/node/verify-QRYKRIDU.js +210960 -0
- package/docs/MONETIZATION.md +21 -16
- package/docs/REACTIVE_REDESIGN.md +132 -0
- package/docs/README.md +47 -36
- package/docs/SVELTE_INTEGRATION_STRATEGY.md +68 -0
- package/docs/TERMINAL_NODE.md +27 -24
- package/docs/core/building-extensions.md +58 -61
- package/docs/core/cli-usage.md +59 -59
- package/docs/core/code-canvas-sync.md +28 -16
- package/docs/core/logic-engine.md +77 -82
- package/docs/core/pluresdb-integration.md +29 -39
- package/docs/core/schema-model.md +66 -52
- package/docs/core/ui-generation.md +57 -49
- package/docs/core/what-is-praxis.md +32 -15
- package/docs/guides/canvas.md +21 -5
- package/docs/guides/getting-started.md +13 -7
- package/docs/guides/history-state-pattern.md +65 -51
- package/docs/guides/orchestration.md +46 -32
- package/docs/guides/parallel-state-pattern.md +56 -72
- package/docs/guides/svelte-integration.md +45 -53
- package/docs/tutorials/README.md +16 -0
- package/docs/tutorials/ecommerce-cart.md +177 -95
- package/docs/tutorials/first-app.md +26 -41
- package/docs/tutorials/form-builder.md +191 -138
- package/docs/tutorials/todo-pluresdb.md +71 -69
- package/package.json +58 -23
- package/src/__tests__/actors.test.ts +68 -68
- package/src/__tests__/billing.test.ts +32 -32
- package/src/__tests__/canvas-components.test.ts +94 -73
- package/src/__tests__/cli-create.test.ts +28 -28
- package/src/__tests__/cloud.test.ts +36 -36
- package/src/__tests__/code-canvas-integration.test.ts +132 -141
- package/src/__tests__/docs-generator.test.ts +3 -9
- package/src/__tests__/dsl.test.ts +58 -64
- package/src/__tests__/edge-cases.test.ts +106 -108
- package/src/__tests__/engine.test.ts +51 -25
- package/src/__tests__/generators.test.ts +42 -44
- package/src/__tests__/introspection.test.ts +104 -114
- package/src/__tests__/pluresdb.test.ts +189 -187
- package/src/__tests__/protocol.test.ts +15 -15
- package/src/__tests__/provisioning.test.ts +61 -61
- package/src/__tests__/schema.test.ts +7 -11
- package/src/__tests__/state-docs-integration.test.ts +162 -145
- package/src/__tests__/svelte-integration.test.ts +16 -19
- package/src/__tests__/tauri-integration.test.ts +149 -147
- package/src/__tests__/terminal-node.test.ts +12 -7
- package/src/__tests__/unum-integration.test.ts +68 -68
- package/src/adapters/cli.ts +21 -15
- package/src/cli/commands/auth.ts +82 -78
- package/src/cli/commands/build.ts +29 -27
- package/src/cli/commands/canvas.ts +338 -127
- package/src/cli/commands/cloud.ts +47 -47
- package/src/cli/commands/create.ts +59 -47
- package/src/cli/commands/dev.ts +12 -12
- package/src/cli/commands/generate.ts +29 -40
- package/src/cli/commands/orchestrate.ts +24 -24
- package/src/cli/commands/verify.ts +7 -8
- package/src/cli/index.ts +14 -10
- package/src/cloud/README.md +28 -15
- package/src/cloud/auth.ts +55 -70
- package/src/cloud/billing.ts +59 -58
- package/src/cloud/client.ts +29 -35
- package/src/cloud/index.ts +19 -40
- package/src/cloud/marketplace.ts +69 -78
- package/src/cloud/provisioning.ts +42 -51
- package/src/cloud/relay/endpoints.ts +30 -34
- package/src/cloud/relay/health/index.ts +1 -1
- package/src/cloud/relay/stats/index.ts +1 -1
- package/src/cloud/relay/sync/index.ts +1 -1
- package/src/cloud/relay/usage/index.ts +1 -1
- package/src/cloud/sponsors.ts +31 -34
- package/src/cloud/types.ts +4 -4
- package/src/components/README.md +1 -0
- package/src/components/index.ts +3 -4
- package/src/core/actors.ts +7 -7
- package/src/core/component/generator.ts +10 -28
- package/src/core/engine.ts +51 -24
- package/src/core/introspection.ts +37 -35
- package/src/core/logic/generator.ts +62 -62
- package/src/core/pluresdb/adapter.ts +8 -8
- package/src/core/pluresdb/generator.ts +39 -35
- package/src/core/pluresdb/index.ts +9 -12
- package/src/core/pluresdb/schema-registry.ts +22 -25
- package/src/core/pluresdb/store.ts +57 -57
- package/src/core/protocol.ts +14 -14
- package/src/core/reactive-engine.svelte.ts +65 -0
- package/src/core/reactive-engine.ts +67 -0
- package/src/core/rules.ts +4 -4
- package/src/core/schema/loader.common.ts +150 -0
- package/src/core/schema/loader.ts +19 -149
- package/src/core/schema/normalize.ts +34 -51
- package/src/core/schema/types.ts +47 -11
- package/src/dsl/index.ts +8 -8
- package/src/dsl.ts +11 -17
- package/src/examples/advanced-todo/README.md +58 -40
- package/src/examples/advanced-todo/index.ts +3 -3
- package/src/examples/auth-basic/index.ts +30 -30
- package/src/examples/cart/index.ts +50 -50
- package/src/examples/hero-ecommerce/index.ts +130 -157
- package/src/examples/svelte-counter/index.ts +22 -26
- package/src/flows.ts +6 -17
- package/src/index.browser.ts +204 -0
- package/src/index.ts +37 -42
- package/src/integrations/code-canvas.ts +237 -193
- package/src/integrations/pluresdb.ts +55 -35
- package/src/integrations/state-docs.ts +104 -104
- package/src/integrations/svelte.ts +35 -35
- package/src/integrations/tauri.ts +75 -73
- package/src/integrations/unum.ts +68 -61
- package/src/registry.ts +7 -14
- package/src/runtime/terminal-adapter.ts +31 -26
- package/src/step.ts +10 -16
- package/src/types.ts +1 -1
- package/templates/basic-app/README.md +6 -9
- package/templates/fullstack-app/README.md +10 -0
- package/dist/core/codegen/docs-generator.d.ts +0 -123
- package/dist/core/codegen/docs-generator.d.ts.map +0 -1
- package/dist/core/codegen/docs-generator.js +0 -674
- package/dist/core/codegen/docs-generator.js.map +0 -1
- package/dist/core/codegen/index.d.ts +0 -11
- package/dist/core/codegen/index.d.ts.map +0 -1
- package/dist/core/codegen/index.js +0 -13
- package/dist/core/codegen/index.js.map +0 -1
- package/dist/core/codegen/ts-generator.d.ts +0 -8
- package/dist/core/codegen/ts-generator.d.ts.map +0 -1
- package/dist/core/codegen/ts-generator.js +0 -8
- package/dist/core/codegen/ts-generator.js.map +0 -1
- package/dist/core/db-adapter/index.d.ts +0 -18
- package/dist/core/db-adapter/index.d.ts.map +0 -1
- package/dist/core/db-adapter/index.js +0 -23
- package/dist/core/db-adapter/index.js.map +0 -1
- package/dist/core/db-adapter/sync-engine.d.ts +0 -180
- package/dist/core/db-adapter/sync-engine.d.ts.map +0 -1
- package/dist/core/db-adapter/sync-engine.js +0 -342
- package/dist/core/db-adapter/sync-engine.js.map +0 -1
- package/dist/core/logic-engine/engine.d.ts +0 -8
- package/dist/core/logic-engine/engine.d.ts.map +0 -1
- package/dist/core/logic-engine/engine.js +0 -8
- package/dist/core/logic-engine/engine.js.map +0 -1
- package/dist/core/logic-engine/index.d.ts +0 -16
- package/dist/core/logic-engine/index.d.ts.map +0 -1
- package/dist/core/logic-engine/index.js +0 -16
- package/dist/core/logic-engine/index.js.map +0 -1
- package/dist/core/logic-engine/protocol.d.ts +0 -7
- package/dist/core/logic-engine/protocol.d.ts.map +0 -1
- package/dist/core/logic-engine/protocol.js +0 -7
- package/dist/core/logic-engine/protocol.js.map +0 -1
- package/dist/core/logic-engine/psf-adapter.d.ts +0 -88
- package/dist/core/logic-engine/psf-adapter.d.ts.map +0 -1
- package/dist/core/logic-engine/psf-adapter.js +0 -207
- package/dist/core/logic-engine/psf-adapter.js.map +0 -1
- package/dist/core/logic-engine/rules.d.ts +0 -7
- package/dist/core/logic-engine/rules.d.ts.map +0 -1
- package/dist/core/logic-engine/rules.js +0 -7
- package/dist/core/logic-engine/rules.js.map +0 -1
- package/dist/core/schema-engine/compiler.d.ts +0 -198
- package/dist/core/schema-engine/compiler.d.ts.map +0 -1
- package/dist/core/schema-engine/compiler.js +0 -262
- package/dist/core/schema-engine/compiler.js.map +0 -1
- package/dist/core/schema-engine/generator.d.ts +0 -115
- package/dist/core/schema-engine/generator.d.ts.map +0 -1
- package/dist/core/schema-engine/generator.js +0 -506
- package/dist/core/schema-engine/generator.js.map +0 -1
- package/dist/core/schema-engine/index.d.ts +0 -18
- package/dist/core/schema-engine/index.d.ts.map +0 -1
- package/dist/core/schema-engine/index.js +0 -18
- package/dist/core/schema-engine/index.js.map +0 -1
- package/dist/core/schema-engine/psf.d.ts +0 -612
- package/dist/core/schema-engine/psf.d.ts.map +0 -1
- package/dist/core/schema-engine/psf.js +0 -45
- package/dist/core/schema-engine/psf.js.map +0 -1
- package/dist/core/schema-engine/types.d.ts +0 -10
- package/dist/core/schema-engine/types.d.ts.map +0 -1
- package/dist/core/schema-engine/types.js +0 -7
- package/dist/core/schema-engine/types.js.map +0 -1
- package/dist/core/schema-engine/validator.d.ts +0 -140
- package/dist/core/schema-engine/validator.d.ts.map +0 -1
- package/dist/core/schema-engine/validator.js +0 -407
- package/dist/core/schema-engine/validator.js.map +0 -1
- package/dist/src/adapters/cli.d.ts +0 -43
- package/dist/src/adapters/cli.d.ts.map +0 -1
- package/dist/src/adapters/cli.js +0 -126
- package/dist/src/adapters/cli.js.map +0 -1
- package/dist/src/cli/commands/auth.d.ts +0 -26
- package/dist/src/cli/commands/auth.d.ts.map +0 -1
- package/dist/src/cli/commands/auth.js +0 -233
- package/dist/src/cli/commands/auth.js.map +0 -1
- package/dist/src/cli/commands/build.d.ts +0 -23
- package/dist/src/cli/commands/build.d.ts.map +0 -1
- package/dist/src/cli/commands/build.js +0 -162
- package/dist/src/cli/commands/build.js.map +0 -1
- package/dist/src/cli/commands/canvas.d.ts +0 -23
- package/dist/src/cli/commands/canvas.d.ts.map +0 -1
- package/dist/src/cli/commands/canvas.js +0 -215
- package/dist/src/cli/commands/canvas.js.map +0 -1
- package/dist/src/cli/commands/cloud.d.ts +0 -27
- package/dist/src/cli/commands/cloud.d.ts.map +0 -1
- package/dist/src/cli/commands/cloud.js +0 -232
- package/dist/src/cli/commands/cloud.js.map +0 -1
- package/dist/src/cli/commands/create.d.ts +0 -21
- package/dist/src/cli/commands/create.d.ts.map +0 -1
- package/dist/src/cli/commands/create.js +0 -621
- package/dist/src/cli/commands/create.js.map +0 -1
- package/dist/src/cli/commands/dev.d.ts +0 -21
- package/dist/src/cli/commands/dev.d.ts.map +0 -1
- package/dist/src/cli/commands/dev.js +0 -71
- package/dist/src/cli/commands/dev.js.map +0 -1
- package/dist/src/cli/commands/generate.d.ts +0 -25
- package/dist/src/cli/commands/generate.d.ts.map +0 -1
- package/dist/src/cli/commands/generate.js +0 -168
- package/dist/src/cli/commands/generate.js.map +0 -1
- package/dist/src/cli/commands/orchestrate.d.ts +0 -44
- package/dist/src/cli/commands/orchestrate.d.ts.map +0 -1
- package/dist/src/cli/commands/orchestrate.js +0 -150
- package/dist/src/cli/commands/orchestrate.js.map +0 -1
- package/dist/src/cli/commands/verify.d.ts +0 -10
- package/dist/src/cli/commands/verify.d.ts.map +0 -1
- package/dist/src/cli/commands/verify.js +0 -39
- package/dist/src/cli/commands/verify.js.map +0 -1
- package/dist/src/cli/index.d.ts +0 -8
- package/dist/src/cli/index.d.ts.map +0 -1
- package/dist/src/cli/index.js +0 -226
- package/dist/src/cli/index.js.map +0 -1
- package/dist/src/cloud/auth.d.ts +0 -51
- package/dist/src/cloud/auth.d.ts.map +0 -1
- package/dist/src/cloud/auth.js +0 -194
- package/dist/src/cloud/auth.js.map +0 -1
- package/dist/src/cloud/billing.d.ts +0 -184
- package/dist/src/cloud/billing.d.ts.map +0 -1
- package/dist/src/cloud/billing.js +0 -179
- package/dist/src/cloud/billing.js.map +0 -1
- package/dist/src/cloud/client.d.ts +0 -39
- package/dist/src/cloud/client.d.ts.map +0 -1
- package/dist/src/cloud/client.js +0 -176
- package/dist/src/cloud/client.js.map +0 -1
- package/dist/src/cloud/index.d.ts +0 -44
- package/dist/src/cloud/index.d.ts.map +0 -1
- package/dist/src/cloud/index.js +0 -44
- package/dist/src/cloud/index.js.map +0 -1
- package/dist/src/cloud/marketplace.d.ts +0 -166
- package/dist/src/cloud/marketplace.d.ts.map +0 -1
- package/dist/src/cloud/marketplace.js +0 -159
- package/dist/src/cloud/marketplace.js.map +0 -1
- package/dist/src/cloud/provisioning.d.ts +0 -110
- package/dist/src/cloud/provisioning.d.ts.map +0 -1
- package/dist/src/cloud/provisioning.js +0 -148
- package/dist/src/cloud/provisioning.js.map +0 -1
- package/dist/src/cloud/relay/endpoints.d.ts +0 -62
- package/dist/src/cloud/relay/endpoints.d.ts.map +0 -1
- package/dist/src/cloud/relay/endpoints.js +0 -217
- package/dist/src/cloud/relay/endpoints.js.map +0 -1
- package/dist/src/cloud/relay/health/index.d.ts +0 -5
- package/dist/src/cloud/relay/health/index.d.ts.map +0 -1
- package/dist/src/cloud/relay/health/index.js +0 -9
- package/dist/src/cloud/relay/health/index.js.map +0 -1
- package/dist/src/cloud/relay/stats/index.d.ts +0 -5
- package/dist/src/cloud/relay/stats/index.d.ts.map +0 -1
- package/dist/src/cloud/relay/stats/index.js +0 -9
- package/dist/src/cloud/relay/stats/index.js.map +0 -1
- package/dist/src/cloud/relay/sync/index.d.ts +0 -5
- package/dist/src/cloud/relay/sync/index.d.ts.map +0 -1
- package/dist/src/cloud/relay/sync/index.js +0 -9
- package/dist/src/cloud/relay/sync/index.js.map +0 -1
- package/dist/src/cloud/relay/usage/index.d.ts +0 -5
- package/dist/src/cloud/relay/usage/index.d.ts.map +0 -1
- package/dist/src/cloud/relay/usage/index.js +0 -9
- package/dist/src/cloud/relay/usage/index.js.map +0 -1
- package/dist/src/cloud/sponsors.d.ts +0 -81
- package/dist/src/cloud/sponsors.d.ts.map +0 -1
- package/dist/src/cloud/sponsors.js +0 -130
- package/dist/src/cloud/sponsors.js.map +0 -1
- package/dist/src/cloud/types.d.ts +0 -169
- package/dist/src/cloud/types.d.ts.map +0 -1
- package/dist/src/cloud/types.js +0 -7
- package/dist/src/cloud/types.js.map +0 -1
- package/dist/src/components/index.d.ts.map +0 -1
- package/dist/src/components/index.js +0 -17
- package/dist/src/components/index.js.map +0 -1
- package/dist/src/core/actors.d.ts +0 -95
- package/dist/src/core/actors.d.ts.map +0 -1
- package/dist/src/core/actors.js +0 -158
- package/dist/src/core/actors.js.map +0 -1
- package/dist/src/core/component/generator.d.ts.map +0 -1
- package/dist/src/core/component/generator.js +0 -349
- package/dist/src/core/component/generator.js.map +0 -1
- package/dist/src/core/engine.d.ts +0 -92
- package/dist/src/core/engine.d.ts.map +0 -1
- package/dist/src/core/engine.js +0 -199
- package/dist/src/core/engine.js.map +0 -1
- package/dist/src/core/introspection.d.ts +0 -141
- package/dist/src/core/introspection.d.ts.map +0 -1
- package/dist/src/core/introspection.js +0 -208
- package/dist/src/core/introspection.js.map +0 -1
- package/dist/src/core/logic/generator.d.ts +0 -76
- package/dist/src/core/logic/generator.d.ts.map +0 -1
- package/dist/src/core/logic/generator.js +0 -370
- package/dist/src/core/logic/generator.js.map +0 -1
- package/dist/src/core/pluresdb/adapter.d.ts +0 -72
- package/dist/src/core/pluresdb/adapter.d.ts.map +0 -1
- package/dist/src/core/pluresdb/adapter.js +0 -73
- package/dist/src/core/pluresdb/adapter.js.map +0 -1
- package/dist/src/core/pluresdb/generator.d.ts +0 -58
- package/dist/src/core/pluresdb/generator.d.ts.map +0 -1
- package/dist/src/core/pluresdb/generator.js +0 -191
- package/dist/src/core/pluresdb/generator.js.map +0 -1
- package/dist/src/core/pluresdb/index.d.ts +0 -15
- package/dist/src/core/pluresdb/index.d.ts.map +0 -1
- package/dist/src/core/pluresdb/index.js +0 -11
- package/dist/src/core/pluresdb/index.js.map +0 -1
- package/dist/src/core/pluresdb/schema-registry.d.ts +0 -104
- package/dist/src/core/pluresdb/schema-registry.d.ts.map +0 -1
- package/dist/src/core/pluresdb/schema-registry.js +0 -130
- package/dist/src/core/pluresdb/schema-registry.js.map +0 -1
- package/dist/src/core/pluresdb/store.d.ts +0 -199
- package/dist/src/core/pluresdb/store.d.ts.map +0 -1
- package/dist/src/core/pluresdb/store.js +0 -344
- package/dist/src/core/pluresdb/store.js.map +0 -1
- package/dist/src/core/protocol.d.ts.map +0 -1
- package/dist/src/core/protocol.js +0 -46
- package/dist/src/core/protocol.js.map +0 -1
- package/dist/src/core/rules.d.ts +0 -120
- package/dist/src/core/rules.d.ts.map +0 -1
- package/dist/src/core/rules.js +0 -81
- package/dist/src/core/rules.js.map +0 -1
- package/dist/src/core/schema/loader.d.ts +0 -47
- package/dist/src/core/schema/loader.d.ts.map +0 -1
- package/dist/src/core/schema/loader.js +0 -189
- package/dist/src/core/schema/loader.js.map +0 -1
- package/dist/src/core/schema/normalize.d.ts +0 -72
- package/dist/src/core/schema/normalize.d.ts.map +0 -1
- package/dist/src/core/schema/normalize.js +0 -190
- package/dist/src/core/schema/normalize.js.map +0 -1
- package/dist/src/core/schema/types.d.ts.map +0 -1
- package/dist/src/core/schema/types.js +0 -161
- package/dist/src/core/schema/types.js.map +0 -1
- package/dist/src/dsl/index.d.ts +0 -152
- package/dist/src/dsl/index.d.ts.map +0 -1
- package/dist/src/dsl/index.js +0 -132
- package/dist/src/dsl/index.js.map +0 -1
- package/dist/src/dsl.d.ts +0 -124
- package/dist/src/dsl.d.ts.map +0 -1
- package/dist/src/dsl.js +0 -130
- package/dist/src/dsl.js.map +0 -1
- package/dist/src/examples/advanced-todo/index.d.ts +0 -55
- package/dist/src/examples/advanced-todo/index.d.ts.map +0 -1
- package/dist/src/examples/advanced-todo/index.js +0 -222
- package/dist/src/examples/advanced-todo/index.js.map +0 -1
- package/dist/src/examples/auth-basic/index.d.ts +0 -17
- package/dist/src/examples/auth-basic/index.d.ts.map +0 -1
- package/dist/src/examples/auth-basic/index.js +0 -122
- package/dist/src/examples/auth-basic/index.js.map +0 -1
- package/dist/src/examples/cart/index.d.ts +0 -19
- package/dist/src/examples/cart/index.d.ts.map +0 -1
- package/dist/src/examples/cart/index.js +0 -202
- package/dist/src/examples/cart/index.js.map +0 -1
- package/dist/src/examples/hero-ecommerce/index.d.ts +0 -39
- package/dist/src/examples/hero-ecommerce/index.d.ts.map +0 -1
- package/dist/src/examples/hero-ecommerce/index.js +0 -506
- package/dist/src/examples/hero-ecommerce/index.js.map +0 -1
- package/dist/src/examples/svelte-counter/index.d.ts +0 -31
- package/dist/src/examples/svelte-counter/index.d.ts.map +0 -1
- package/dist/src/examples/svelte-counter/index.js +0 -123
- package/dist/src/examples/svelte-counter/index.js.map +0 -1
- package/dist/src/flows.d.ts +0 -125
- package/dist/src/flows.d.ts.map +0 -1
- package/dist/src/flows.js +0 -160
- package/dist/src/flows.js.map +0 -1
- package/dist/src/index.d.ts +0 -77
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -64
- package/dist/src/index.js.map +0 -1
- package/dist/src/integrations/code-canvas.d.ts +0 -265
- package/dist/src/integrations/code-canvas.d.ts.map +0 -1
- package/dist/src/integrations/code-canvas.js +0 -451
- package/dist/src/integrations/code-canvas.js.map +0 -1
- package/dist/src/integrations/pluresdb.d.ts +0 -117
- package/dist/src/integrations/pluresdb.d.ts.map +0 -1
- package/dist/src/integrations/pluresdb.js +0 -117
- package/dist/src/integrations/pluresdb.js.map +0 -1
- package/dist/src/integrations/state-docs.d.ts +0 -191
- package/dist/src/integrations/state-docs.d.ts.map +0 -1
- package/dist/src/integrations/state-docs.js +0 -515
- package/dist/src/integrations/state-docs.js.map +0 -1
- package/dist/src/integrations/svelte.d.ts.map +0 -1
- package/dist/src/integrations/svelte.js +0 -447
- package/dist/src/integrations/svelte.js.map +0 -1
- package/dist/src/integrations/tauri.d.ts +0 -360
- package/dist/src/integrations/tauri.d.ts.map +0 -1
- package/dist/src/integrations/tauri.js +0 -278
- package/dist/src/integrations/tauri.js.map +0 -1
- package/dist/src/integrations/unum.d.ts +0 -159
- package/dist/src/integrations/unum.d.ts.map +0 -1
- package/dist/src/integrations/unum.js +0 -240
- package/dist/src/integrations/unum.js.map +0 -1
- package/dist/src/registry.d.ts +0 -94
- package/dist/src/registry.d.ts.map +0 -1
- package/dist/src/registry.js +0 -181
- package/dist/src/registry.js.map +0 -1
- package/dist/src/runtime/terminal-adapter.d.ts.map +0 -1
- package/dist/src/runtime/terminal-adapter.js +0 -239
- package/dist/src/runtime/terminal-adapter.js.map +0 -1
- package/dist/src/step.d.ts +0 -34
- package/dist/src/step.d.ts.map +0 -1
- package/dist/src/step.js +0 -111
- package/dist/src/step.js.map +0 -1
- package/dist/src/types.d.ts +0 -63
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -6
- package/dist/src/types.js.map +0 -1
- package/dist/tools/ast-analyzer/src/ast-analyzer.d.ts +0 -8
- package/dist/tools/ast-analyzer/src/ast-analyzer.d.ts.map +0 -1
- package/dist/tools/ast-analyzer/src/ast-analyzer.js +0 -119
- package/dist/tools/ast-analyzer/src/ast-analyzer.js.map +0 -1
- package/dist/tools/cli/commands/index.d.ts +0 -7
- package/dist/tools/cli/commands/index.d.ts.map +0 -1
- package/dist/tools/cli/commands/index.js +0 -7
- package/dist/tools/cli/commands/index.js.map +0 -1
- package/dist/tools/cli/index.d.ts +0 -8
- package/dist/tools/cli/index.d.ts.map +0 -1
- package/dist/tools/cli/index.js +0 -9
- package/dist/tools/cli/index.js.map +0 -1
- package/dist/tools/watcher/index.d.ts +0 -105
- package/dist/tools/watcher/index.d.ts.map +0 -1
- package/dist/tools/watcher/index.js +0 -213
- package/dist/tools/watcher/index.js.map +0 -1
- package/dist/ui/canvas/canvas-projection.d.ts +0 -78
- package/dist/ui/canvas/canvas-projection.d.ts.map +0 -1
- package/dist/ui/canvas/canvas-projection.js +0 -416
- package/dist/ui/canvas/canvas-projection.js.map +0 -1
- package/dist/ui/canvas/canvas-state.d.ts +0 -200
- package/dist/ui/canvas/canvas-state.d.ts.map +0 -1
- package/dist/ui/canvas/canvas-state.js +0 -464
- package/dist/ui/canvas/canvas-state.js.map +0 -1
- package/dist/ui/canvas/components/index.d.ts +0 -95
- package/dist/ui/canvas/components/index.d.ts.map +0 -1
- package/dist/ui/canvas/components/index.js +0 -19
- package/dist/ui/canvas/components/index.js.map +0 -1
- package/dist/ui/canvas/index.d.ts +0 -32
- package/dist/ui/canvas/index.d.ts.map +0 -1
- package/dist/ui/canvas/index.js +0 -32
- package/dist/ui/canvas/index.js.map +0 -1
- package/dist/ui/canvas-inspector/src/server.d.ts +0 -2
- package/dist/ui/canvas-inspector/src/server.d.ts.map +0 -1
- package/dist/ui/canvas-inspector/src/server.js +0 -248
- package/dist/ui/canvas-inspector/src/server.js.map +0 -1
- package/dist/ui/canvas-inspector/src/verify-fsm-implementation.d.ts +0 -5
- package/dist/ui/canvas-inspector/src/verify-fsm-implementation.d.ts.map +0 -1
- package/dist/ui/canvas-inspector/src/verify-fsm-implementation.js +0 -58
- package/dist/ui/canvas-inspector/src/verify-fsm-implementation.js.map +0 -1
- package/dist/ui/svelte-generator/index.d.ts +0 -9
- package/dist/ui/svelte-generator/index.d.ts.map +0 -1
- package/dist/ui/svelte-generator/index.js +0 -11
- package/dist/ui/svelte-generator/index.js.map +0 -1
- package/dist/ui/svelte-generator/psf-generator.d.ts +0 -128
- package/dist/ui/svelte-generator/psf-generator.d.ts.map +0 -1
- package/dist/ui/svelte-generator/psf-generator.js +0 -506
- 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
|
-
{
|
|
67
|
-
|
|
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 }>(
|
|
125
|
-
|
|
126
|
-
|
|
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 }>(
|
|
129
|
-
|
|
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 }>(
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
export const
|
|
136
|
-
|
|
137
|
-
|
|
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 [
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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([
|
|
451
|
-
|
|
452
|
-
|
|
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([
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
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([
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
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([
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
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([
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
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();
|
|
608
|
-
engine.redo();
|
|
660
|
+
engine.undo(); // Reverts to previous state
|
|
661
|
+
engine.redo(); // Moves forward again
|
|
609
662
|
```
|
|
610
663
|
|
|
611
664
|
## Next Steps
|