@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 shopping cart with a multi-step check
|
|
|
9
9
|
## What You'll Build
|
|
10
10
|
|
|
11
11
|
An e-commerce cart that:
|
|
12
|
+
|
|
12
13
|
- Manages a product catalog
|
|
13
14
|
- Handles cart operations (add, remove, update quantity)
|
|
14
15
|
- Implements a multi-step checkout flow
|
|
@@ -24,7 +25,7 @@ Create the PSF schema for the e-commerce domain:
|
|
|
24
25
|
"$version": "1.0.0",
|
|
25
26
|
"id": "ecommerce-cart",
|
|
26
27
|
"name": "E-commerce Cart",
|
|
27
|
-
|
|
28
|
+
|
|
28
29
|
"models": [
|
|
29
30
|
{
|
|
30
31
|
"name": "Product",
|
|
@@ -121,21 +122,44 @@ interface CartContext {
|
|
|
121
122
|
}
|
|
122
123
|
|
|
123
124
|
// Facts
|
|
124
|
-
export const ItemAddedToCart = defineFact<
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
export const ItemAddedToCart = defineFact<
|
|
126
|
+
'ItemAddedToCart',
|
|
127
|
+
{ productId: string; quantity: number }
|
|
128
|
+
>('ItemAddedToCart');
|
|
129
|
+
export const ItemRemovedFromCart = defineFact<'ItemRemovedFromCart', { productId: string }>(
|
|
130
|
+
'ItemRemovedFromCart'
|
|
131
|
+
);
|
|
132
|
+
export const QuantityUpdated = defineFact<
|
|
133
|
+
'QuantityUpdated',
|
|
134
|
+
{ productId: string; newQuantity: number }
|
|
135
|
+
>('QuantityUpdated');
|
|
127
136
|
export const CheckoutStarted = defineFact<'CheckoutStarted', {}>('CheckoutStarted');
|
|
128
|
-
export const ShippingEntered = defineFact<'ShippingEntered', { address: ShippingAddress }>(
|
|
129
|
-
|
|
130
|
-
|
|
137
|
+
export const ShippingEntered = defineFact<'ShippingEntered', { address: ShippingAddress }>(
|
|
138
|
+
'ShippingEntered'
|
|
139
|
+
);
|
|
140
|
+
export const PaymentProcessed = defineFact<'PaymentProcessed', { success: boolean }>(
|
|
141
|
+
'PaymentProcessed'
|
|
142
|
+
);
|
|
143
|
+
export const OrderPlaced = defineFact<'OrderPlaced', { orderId: string; total: number }>(
|
|
144
|
+
'OrderPlaced'
|
|
145
|
+
);
|
|
131
146
|
export const CartCleared = defineFact<'CartCleared', {}>('CartCleared');
|
|
132
147
|
|
|
133
148
|
// Events
|
|
134
|
-
export const ADD_TO_CART = defineEvent<'ADD_TO_CART', { productId: string; quantity: number }>(
|
|
135
|
-
|
|
136
|
-
|
|
149
|
+
export const ADD_TO_CART = defineEvent<'ADD_TO_CART', { productId: string; quantity: number }>(
|
|
150
|
+
'ADD_TO_CART'
|
|
151
|
+
);
|
|
152
|
+
export const REMOVE_FROM_CART = defineEvent<'REMOVE_FROM_CART', { productId: string }>(
|
|
153
|
+
'REMOVE_FROM_CART'
|
|
154
|
+
);
|
|
155
|
+
export const UPDATE_QUANTITY = defineEvent<
|
|
156
|
+
'UPDATE_QUANTITY',
|
|
157
|
+
{ productId: string; quantity: number }
|
|
158
|
+
>('UPDATE_QUANTITY');
|
|
137
159
|
export const START_CHECKOUT = defineEvent<'START_CHECKOUT', {}>('START_CHECKOUT');
|
|
138
|
-
export const ENTER_SHIPPING = defineEvent<'ENTER_SHIPPING', { address: ShippingAddress }>(
|
|
160
|
+
export const ENTER_SHIPPING = defineEvent<'ENTER_SHIPPING', { address: ShippingAddress }>(
|
|
161
|
+
'ENTER_SHIPPING'
|
|
162
|
+
);
|
|
139
163
|
export const ENTER_PAYMENT = defineEvent<'ENTER_PAYMENT', { method: string }>('ENTER_PAYMENT');
|
|
140
164
|
export const CONFIRM_ORDER = defineEvent<'CONFIRM_ORDER', {}>('CONFIRM_ORDER');
|
|
141
165
|
export const GO_BACK = defineEvent<'GO_BACK', {}>('GO_BACK');
|
|
@@ -148,20 +172,20 @@ const addToCartRule = defineRule<CartContext>({
|
|
|
148
172
|
impl: (state, events) => {
|
|
149
173
|
const event = events.find(ADD_TO_CART.is);
|
|
150
174
|
if (!event) return [];
|
|
151
|
-
|
|
152
|
-
const product = state.context.products.find(p => p.id === event.payload.productId);
|
|
175
|
+
|
|
176
|
+
const product = state.context.products.find((p) => p.id === event.payload.productId);
|
|
153
177
|
if (!product) {
|
|
154
178
|
state.context.lastError = 'Product not found';
|
|
155
179
|
return [];
|
|
156
180
|
}
|
|
157
|
-
|
|
181
|
+
|
|
158
182
|
if (product.stock < event.payload.quantity) {
|
|
159
183
|
state.context.lastError = 'Not enough stock';
|
|
160
184
|
return [];
|
|
161
185
|
}
|
|
162
|
-
|
|
186
|
+
|
|
163
187
|
// Check if already in cart
|
|
164
|
-
const existingItem = state.context.cart.find(i => i.productId === event.payload.productId);
|
|
188
|
+
const existingItem = state.context.cart.find((i) => i.productId === event.payload.productId);
|
|
165
189
|
if (existingItem) {
|
|
166
190
|
existingItem.quantity += event.payload.quantity;
|
|
167
191
|
} else {
|
|
@@ -171,9 +195,14 @@ const addToCartRule = defineRule<CartContext>({
|
|
|
171
195
|
priceAtAdd: product.price,
|
|
172
196
|
});
|
|
173
197
|
}
|
|
174
|
-
|
|
198
|
+
|
|
175
199
|
state.context.lastError = null;
|
|
176
|
-
return [
|
|
200
|
+
return [
|
|
201
|
+
ItemAddedToCart.create({
|
|
202
|
+
productId: event.payload.productId,
|
|
203
|
+
quantity: event.payload.quantity,
|
|
204
|
+
}),
|
|
205
|
+
];
|
|
177
206
|
},
|
|
178
207
|
});
|
|
179
208
|
|
|
@@ -183,10 +212,10 @@ const removeFromCartRule = defineRule<CartContext>({
|
|
|
183
212
|
impl: (state, events) => {
|
|
184
213
|
const event = events.find(REMOVE_FROM_CART.is);
|
|
185
214
|
if (!event) return [];
|
|
186
|
-
|
|
187
|
-
state.context.cart = state.context.cart.filter(i => i.productId !== event.payload.productId);
|
|
215
|
+
|
|
216
|
+
state.context.cart = state.context.cart.filter((i) => i.productId !== event.payload.productId);
|
|
188
217
|
state.context.lastError = null;
|
|
189
|
-
|
|
218
|
+
|
|
190
219
|
return [ItemRemovedFromCart.create({ productId: event.payload.productId })];
|
|
191
220
|
},
|
|
192
221
|
});
|
|
@@ -197,24 +226,31 @@ const updateQuantityRule = defineRule<CartContext>({
|
|
|
197
226
|
impl: (state, events) => {
|
|
198
227
|
const event = events.find(UPDATE_QUANTITY.is);
|
|
199
228
|
if (!event) return [];
|
|
200
|
-
|
|
201
|
-
const item = state.context.cart.find(i => i.productId === event.payload.productId);
|
|
229
|
+
|
|
230
|
+
const item = state.context.cart.find((i) => i.productId === event.payload.productId);
|
|
202
231
|
if (!item) return [];
|
|
203
|
-
|
|
204
|
-
const product = state.context.products.find(p => p.id === event.payload.productId);
|
|
232
|
+
|
|
233
|
+
const product = state.context.products.find((p) => p.id === event.payload.productId);
|
|
205
234
|
if (product && event.payload.quantity > product.stock) {
|
|
206
235
|
state.context.lastError = 'Not enough stock';
|
|
207
236
|
return [];
|
|
208
237
|
}
|
|
209
|
-
|
|
238
|
+
|
|
210
239
|
if (event.payload.quantity <= 0) {
|
|
211
|
-
state.context.cart = state.context.cart.filter(
|
|
240
|
+
state.context.cart = state.context.cart.filter(
|
|
241
|
+
(i) => i.productId !== event.payload.productId
|
|
242
|
+
);
|
|
212
243
|
} else {
|
|
213
244
|
item.quantity = event.payload.quantity;
|
|
214
245
|
}
|
|
215
|
-
|
|
246
|
+
|
|
216
247
|
state.context.lastError = null;
|
|
217
|
-
return [
|
|
248
|
+
return [
|
|
249
|
+
QuantityUpdated.create({
|
|
250
|
+
productId: event.payload.productId,
|
|
251
|
+
newQuantity: event.payload.quantity,
|
|
252
|
+
}),
|
|
253
|
+
];
|
|
218
254
|
},
|
|
219
255
|
});
|
|
220
256
|
|
|
@@ -224,15 +260,15 @@ const startCheckoutRule = defineRule<CartContext>({
|
|
|
224
260
|
impl: (state, events) => {
|
|
225
261
|
const event = events.find(START_CHECKOUT.is);
|
|
226
262
|
if (!event) return [];
|
|
227
|
-
|
|
263
|
+
|
|
228
264
|
if (state.context.cart.length === 0) {
|
|
229
265
|
state.context.lastError = 'Cart is empty';
|
|
230
266
|
return [];
|
|
231
267
|
}
|
|
232
|
-
|
|
268
|
+
|
|
233
269
|
state.context.checkoutStep = 'shipping';
|
|
234
270
|
state.context.lastError = null;
|
|
235
|
-
|
|
271
|
+
|
|
236
272
|
return [CheckoutStarted.create({})];
|
|
237
273
|
},
|
|
238
274
|
});
|
|
@@ -243,11 +279,11 @@ const enterShippingRule = defineRule<CartContext>({
|
|
|
243
279
|
impl: (state, events) => {
|
|
244
280
|
const event = events.find(ENTER_SHIPPING.is);
|
|
245
281
|
if (!event) return [];
|
|
246
|
-
|
|
282
|
+
|
|
247
283
|
state.context.shippingAddress = event.payload.address;
|
|
248
284
|
state.context.checkoutStep = 'payment';
|
|
249
285
|
state.context.lastError = null;
|
|
250
|
-
|
|
286
|
+
|
|
251
287
|
return [ShippingEntered.create({ address: event.payload.address })];
|
|
252
288
|
},
|
|
253
289
|
});
|
|
@@ -258,11 +294,11 @@ const enterPaymentRule = defineRule<CartContext>({
|
|
|
258
294
|
impl: (state, events) => {
|
|
259
295
|
const event = events.find(ENTER_PAYMENT.is);
|
|
260
296
|
if (!event) return [];
|
|
261
|
-
|
|
297
|
+
|
|
262
298
|
state.context.paymentMethod = event.payload.method;
|
|
263
299
|
state.context.checkoutStep = 'confirmation';
|
|
264
300
|
state.context.lastError = null;
|
|
265
|
-
|
|
301
|
+
|
|
266
302
|
return [];
|
|
267
303
|
},
|
|
268
304
|
});
|
|
@@ -273,17 +309,17 @@ const confirmOrderRule = defineRule<CartContext>({
|
|
|
273
309
|
impl: (state, events) => {
|
|
274
310
|
const event = events.find(CONFIRM_ORDER.is);
|
|
275
311
|
if (!event) return [];
|
|
276
|
-
|
|
312
|
+
|
|
277
313
|
if (!state.context.shippingAddress || !state.context.paymentMethod) {
|
|
278
314
|
state.context.lastError = 'Missing checkout information';
|
|
279
315
|
return [];
|
|
280
316
|
}
|
|
281
|
-
|
|
317
|
+
|
|
282
318
|
// Calculate total
|
|
283
319
|
const total = state.context.cart.reduce((sum, item) => {
|
|
284
|
-
return sum +
|
|
320
|
+
return sum + item.priceAtAdd * item.quantity;
|
|
285
321
|
}, 0);
|
|
286
|
-
|
|
322
|
+
|
|
287
323
|
// Create order
|
|
288
324
|
const orderId = `order_${Date.now().toString(36)}`;
|
|
289
325
|
const order: Order = {
|
|
@@ -294,24 +330,24 @@ const confirmOrderRule = defineRule<CartContext>({
|
|
|
294
330
|
shippingAddress: state.context.shippingAddress,
|
|
295
331
|
createdAt: new Date(),
|
|
296
332
|
};
|
|
297
|
-
|
|
333
|
+
|
|
298
334
|
state.context.orders.push(order);
|
|
299
|
-
|
|
335
|
+
|
|
300
336
|
// Update stock
|
|
301
337
|
for (const item of state.context.cart) {
|
|
302
|
-
const product = state.context.products.find(p => p.id === item.productId);
|
|
338
|
+
const product = state.context.products.find((p) => p.id === item.productId);
|
|
303
339
|
if (product) {
|
|
304
340
|
product.stock -= item.quantity;
|
|
305
341
|
}
|
|
306
342
|
}
|
|
307
|
-
|
|
343
|
+
|
|
308
344
|
// Clear cart and reset checkout
|
|
309
345
|
state.context.cart = [];
|
|
310
346
|
state.context.checkoutStep = 'cart';
|
|
311
347
|
state.context.shippingAddress = null;
|
|
312
348
|
state.context.paymentMethod = null;
|
|
313
349
|
state.context.lastError = null;
|
|
314
|
-
|
|
350
|
+
|
|
315
351
|
return [
|
|
316
352
|
PaymentProcessed.create({ success: true }),
|
|
317
353
|
OrderPlaced.create({ orderId, total }),
|
|
@@ -326,14 +362,14 @@ const goBackRule = defineRule<CartContext>({
|
|
|
326
362
|
impl: (state, events) => {
|
|
327
363
|
const event = events.find(GO_BACK.is);
|
|
328
364
|
if (!event) return [];
|
|
329
|
-
|
|
365
|
+
|
|
330
366
|
const stepOrder: CheckoutStep[] = ['cart', 'shipping', 'payment', 'confirmation'];
|
|
331
367
|
const currentIndex = stepOrder.indexOf(state.context.checkoutStep);
|
|
332
|
-
|
|
368
|
+
|
|
333
369
|
if (currentIndex > 0) {
|
|
334
370
|
state.context.checkoutStep = stepOrder[currentIndex - 1];
|
|
335
371
|
}
|
|
336
|
-
|
|
372
|
+
|
|
337
373
|
return [];
|
|
338
374
|
},
|
|
339
375
|
});
|
|
@@ -344,12 +380,12 @@ const clearCartRule = defineRule<CartContext>({
|
|
|
344
380
|
impl: (state, events) => {
|
|
345
381
|
const event = events.find(CLEAR_CART.is);
|
|
346
382
|
if (!event) return [];
|
|
347
|
-
|
|
383
|
+
|
|
348
384
|
state.context.cart = [];
|
|
349
385
|
state.context.checkoutStep = 'cart';
|
|
350
386
|
state.context.shippingAddress = null;
|
|
351
387
|
state.context.paymentMethod = null;
|
|
352
|
-
|
|
388
|
+
|
|
353
389
|
return [CartCleared.create({})];
|
|
354
390
|
},
|
|
355
391
|
});
|
|
@@ -366,7 +402,7 @@ const maxCartItemsConstraint = defineConstraint<CartContext>({
|
|
|
366
402
|
const maxQuantityConstraint = defineConstraint<CartContext>({
|
|
367
403
|
id: 'cart.maxQuantity',
|
|
368
404
|
description: 'Cannot order more than 10 of each item',
|
|
369
|
-
check: (state) => state.context.cart.every(item => item.quantity <= 10),
|
|
405
|
+
check: (state) => state.context.cart.every((item) => item.quantity <= 10),
|
|
370
406
|
errorMessage: 'Cannot order more than 10 of each item',
|
|
371
407
|
severity: 'error',
|
|
372
408
|
});
|
|
@@ -376,7 +412,7 @@ const stockConstraint = defineConstraint<CartContext>({
|
|
|
376
412
|
description: 'Cart items must be in stock',
|
|
377
413
|
check: (state) => {
|
|
378
414
|
for (const item of state.context.cart) {
|
|
379
|
-
const product = state.context.products.find(p => p.id === item.productId);
|
|
415
|
+
const product = state.context.products.find((p) => p.id === item.productId);
|
|
380
416
|
if (!product || product.stock < item.quantity) {
|
|
381
417
|
return false;
|
|
382
418
|
}
|
|
@@ -404,11 +440,46 @@ registry.registerConstraint(stockConstraint);
|
|
|
404
440
|
|
|
405
441
|
// Sample products
|
|
406
442
|
const sampleProducts: Product[] = [
|
|
407
|
-
{
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
443
|
+
{
|
|
444
|
+
id: 'p1',
|
|
445
|
+
name: 'Laptop',
|
|
446
|
+
description: 'High-performance laptop',
|
|
447
|
+
price: 999.99,
|
|
448
|
+
stock: 10,
|
|
449
|
+
imageUrl: '',
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
id: 'p2',
|
|
453
|
+
name: 'Headphones',
|
|
454
|
+
description: 'Wireless headphones',
|
|
455
|
+
price: 149.99,
|
|
456
|
+
stock: 25,
|
|
457
|
+
imageUrl: '',
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
id: 'p3',
|
|
461
|
+
name: 'Keyboard',
|
|
462
|
+
description: 'Mechanical keyboard',
|
|
463
|
+
price: 79.99,
|
|
464
|
+
stock: 50,
|
|
465
|
+
imageUrl: '',
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
id: 'p4',
|
|
469
|
+
name: 'Mouse',
|
|
470
|
+
description: 'Wireless mouse',
|
|
471
|
+
price: 49.99,
|
|
472
|
+
stock: 100,
|
|
473
|
+
imageUrl: '',
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
id: 'p5',
|
|
477
|
+
name: 'Monitor',
|
|
478
|
+
description: '27" 4K monitor',
|
|
479
|
+
price: 399.99,
|
|
480
|
+
stock: 5,
|
|
481
|
+
imageUrl: '',
|
|
482
|
+
},
|
|
412
483
|
];
|
|
413
484
|
|
|
414
485
|
// Engine factory
|
|
@@ -430,7 +501,7 @@ export function createCartEngine() {
|
|
|
430
501
|
|
|
431
502
|
// Helper functions
|
|
432
503
|
export function getCartTotal(context: CartContext): number {
|
|
433
|
-
return context.cart.reduce((sum, item) => sum +
|
|
504
|
+
return context.cart.reduce((sum, item) => sum + item.priceAtAdd * item.quantity, 0);
|
|
434
505
|
}
|
|
435
506
|
|
|
436
507
|
export function getCartItemCount(context: CartContext): number {
|
|
@@ -463,22 +534,24 @@ import {
|
|
|
463
534
|
|
|
464
535
|
async function main() {
|
|
465
536
|
console.log('🛒 E-commerce Cart Demo\n');
|
|
466
|
-
|
|
537
|
+
|
|
467
538
|
const engine = createCartEngine();
|
|
468
|
-
|
|
539
|
+
|
|
469
540
|
// Helper to display cart
|
|
470
541
|
function displayCart() {
|
|
471
542
|
const ctx = engine.getContext();
|
|
472
543
|
console.log('\n📦 Cart:');
|
|
473
544
|
console.log('─'.repeat(50));
|
|
474
|
-
|
|
545
|
+
|
|
475
546
|
if (ctx.cart.length === 0) {
|
|
476
547
|
console.log(' (empty)');
|
|
477
548
|
} else {
|
|
478
549
|
ctx.cart.forEach((item, i) => {
|
|
479
|
-
const product = ctx.products.find(p => p.id === item.productId)!;
|
|
550
|
+
const product = ctx.products.find((p) => p.id === item.productId)!;
|
|
480
551
|
const subtotal = item.quantity * item.priceAtAdd;
|
|
481
|
-
console.log(
|
|
552
|
+
console.log(
|
|
553
|
+
` ${i + 1}. ${product.name} x${item.quantity} @ $${item.priceAtAdd.toFixed(2)} = $${subtotal.toFixed(2)}`
|
|
554
|
+
);
|
|
482
555
|
});
|
|
483
556
|
console.log('─'.repeat(50));
|
|
484
557
|
console.log(` Items: ${getCartItemCount(ctx)}`);
|
|
@@ -486,65 +559,73 @@ async function main() {
|
|
|
486
559
|
}
|
|
487
560
|
console.log('');
|
|
488
561
|
}
|
|
489
|
-
|
|
562
|
+
|
|
490
563
|
// Display products
|
|
491
564
|
console.log('📋 Available Products:');
|
|
492
565
|
engine.getContext().products.forEach((p, i) => {
|
|
493
566
|
console.log(` ${i + 1}. ${p.name} - $${p.price.toFixed(2)} (${p.stock} in stock)`);
|
|
494
567
|
});
|
|
495
|
-
|
|
568
|
+
|
|
496
569
|
displayCart();
|
|
497
|
-
|
|
570
|
+
|
|
498
571
|
// Add items to cart
|
|
499
572
|
console.log('Adding items to cart...');
|
|
500
573
|
engine.dispatch([ADD_TO_CART.create({ productId: 'p1', quantity: 1 })]); // Laptop
|
|
501
574
|
engine.dispatch([ADD_TO_CART.create({ productId: 'p2', quantity: 2 })]); // Headphones x2
|
|
502
575
|
engine.dispatch([ADD_TO_CART.create({ productId: 'p4', quantity: 1 })]); // Mouse
|
|
503
|
-
|
|
576
|
+
|
|
504
577
|
displayCart();
|
|
505
|
-
|
|
578
|
+
|
|
506
579
|
// Update quantity
|
|
507
580
|
console.log('Updating headphones quantity to 3...');
|
|
508
581
|
engine.dispatch([UPDATE_QUANTITY.create({ productId: 'p2', quantity: 3 })]);
|
|
509
|
-
|
|
582
|
+
|
|
510
583
|
displayCart();
|
|
511
|
-
|
|
584
|
+
|
|
512
585
|
// Start checkout
|
|
513
586
|
console.log('Starting checkout...');
|
|
514
587
|
engine.dispatch([START_CHECKOUT.create({})]);
|
|
515
|
-
console.log(
|
|
516
|
-
|
|
588
|
+
console.log(
|
|
589
|
+
`Checkout step: ${engine.getContext().checkoutStep} (${getCheckoutStepNumber(engine.getContext().checkoutStep)}/4)`
|
|
590
|
+
);
|
|
591
|
+
|
|
517
592
|
// Enter shipping
|
|
518
593
|
console.log('\nEntering shipping information...');
|
|
519
|
-
engine.dispatch([
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
594
|
+
engine.dispatch([
|
|
595
|
+
ENTER_SHIPPING.create({
|
|
596
|
+
address: {
|
|
597
|
+
name: 'John Doe',
|
|
598
|
+
street: '123 Main St',
|
|
599
|
+
city: 'San Francisco',
|
|
600
|
+
state: 'CA',
|
|
601
|
+
zip: '94105',
|
|
602
|
+
country: 'USA',
|
|
603
|
+
},
|
|
604
|
+
}),
|
|
605
|
+
]);
|
|
606
|
+
console.log(
|
|
607
|
+
`Checkout step: ${engine.getContext().checkoutStep} (${getCheckoutStepNumber(engine.getContext().checkoutStep)}/4)`
|
|
608
|
+
);
|
|
609
|
+
|
|
531
610
|
// Enter payment
|
|
532
611
|
console.log('\nEntering payment method...');
|
|
533
612
|
engine.dispatch([ENTER_PAYMENT.create({ method: 'credit_card' })]);
|
|
534
|
-
console.log(
|
|
535
|
-
|
|
613
|
+
console.log(
|
|
614
|
+
`Checkout step: ${engine.getContext().checkoutStep} (${getCheckoutStepNumber(engine.getContext().checkoutStep)}/4)`
|
|
615
|
+
);
|
|
616
|
+
|
|
536
617
|
// Confirm order
|
|
537
618
|
console.log('\nConfirming order...');
|
|
538
619
|
const result = engine.step([CONFIRM_ORDER.create({})]);
|
|
539
|
-
|
|
620
|
+
|
|
540
621
|
// Check for order confirmation
|
|
541
|
-
const orderPlaced = result.state.facts.find(f => f.tag === 'OrderPlaced');
|
|
622
|
+
const orderPlaced = result.state.facts.find((f) => f.tag === 'OrderPlaced');
|
|
542
623
|
if (orderPlaced) {
|
|
543
624
|
console.log('✅ Order placed successfully!');
|
|
544
625
|
console.log(` Order ID: ${(orderPlaced.payload as any).orderId}`);
|
|
545
626
|
console.log(` Total: $${(orderPlaced.payload as any).total.toFixed(2)}`);
|
|
546
627
|
}
|
|
547
|
-
|
|
628
|
+
|
|
548
629
|
// Display orders
|
|
549
630
|
console.log('\n📋 Orders:');
|
|
550
631
|
console.log('─'.repeat(50));
|
|
@@ -555,15 +636,15 @@ async function main() {
|
|
|
555
636
|
console.log(` Items: ${order.items.length}`);
|
|
556
637
|
console.log(` Created: ${order.createdAt.toLocaleString()}`);
|
|
557
638
|
});
|
|
558
|
-
|
|
639
|
+
|
|
559
640
|
// Show updated stock
|
|
560
641
|
console.log('\n📦 Updated Stock:');
|
|
561
642
|
engine.getContext().products.forEach((p, i) => {
|
|
562
643
|
console.log(` ${i + 1}. ${p.name} - ${p.stock} in stock`);
|
|
563
644
|
});
|
|
564
|
-
|
|
645
|
+
|
|
565
646
|
displayCart();
|
|
566
|
-
|
|
647
|
+
|
|
567
648
|
console.log('🎉 Done!');
|
|
568
649
|
}
|
|
569
650
|
|
|
@@ -601,9 +682,10 @@ Enforcing business rules:
|
|
|
601
682
|
|
|
602
683
|
```typescript
|
|
603
684
|
const stockConstraint = defineConstraint({
|
|
604
|
-
check: (state) =>
|
|
605
|
-
|
|
606
|
-
|
|
685
|
+
check: (state) =>
|
|
686
|
+
state.context.cart.every(
|
|
687
|
+
(item) => products.find((p) => p.id === item.productId)?.stock >= item.quantity
|
|
688
|
+
),
|
|
607
689
|
});
|
|
608
690
|
```
|
|
609
691
|
|