@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
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hero Example: E-Commerce Platform
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* A comprehensive example demonstrating:
|
|
5
5
|
* - Authentication with session management
|
|
6
6
|
* - Shopping cart with discount rules
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
filterFacts,
|
|
23
23
|
ActorManager,
|
|
24
24
|
type Actor,
|
|
25
|
-
} from
|
|
25
|
+
} from '../../index.js';
|
|
26
26
|
|
|
27
27
|
// ============================================================================
|
|
28
28
|
// CONTEXT TYPE
|
|
@@ -32,21 +32,21 @@ interface ECommerceContext {
|
|
|
32
32
|
// Auth
|
|
33
33
|
currentUser: string | null;
|
|
34
34
|
sessionStartTime: number | null;
|
|
35
|
-
|
|
35
|
+
|
|
36
36
|
// Cart
|
|
37
37
|
cart: {
|
|
38
38
|
items: Array<{ productId: string; quantity: number; price: number }>;
|
|
39
39
|
total: number;
|
|
40
40
|
discountApplied: number;
|
|
41
41
|
};
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
// Feature Flags
|
|
44
44
|
features: {
|
|
45
45
|
freeShippingEnabled: boolean;
|
|
46
46
|
loyaltyProgramEnabled: boolean;
|
|
47
47
|
newCheckoutFlowEnabled: boolean;
|
|
48
48
|
};
|
|
49
|
-
|
|
49
|
+
|
|
50
50
|
// Business State
|
|
51
51
|
loyaltyPoints: number;
|
|
52
52
|
orderHistory: string[];
|
|
@@ -57,80 +57,61 @@ interface ECommerceContext {
|
|
|
57
57
|
// ============================================================================
|
|
58
58
|
|
|
59
59
|
// Auth Facts
|
|
60
|
-
const UserLoggedIn = defineFact<
|
|
61
|
-
|
|
62
|
-
);
|
|
63
|
-
const UserLoggedOut = defineFact<"UserLoggedOut", { userId: string }>(
|
|
64
|
-
"UserLoggedOut"
|
|
65
|
-
);
|
|
66
|
-
const SessionExpired = defineFact<"SessionExpired", { userId: string }>(
|
|
67
|
-
"SessionExpired"
|
|
60
|
+
const UserLoggedIn = defineFact<'UserLoggedIn', { userId: string; timestamp: number }>(
|
|
61
|
+
'UserLoggedIn'
|
|
68
62
|
);
|
|
63
|
+
const UserLoggedOut = defineFact<'UserLoggedOut', { userId: string }>('UserLoggedOut');
|
|
64
|
+
const SessionExpired = defineFact<'SessionExpired', { userId: string }>('SessionExpired');
|
|
69
65
|
|
|
70
66
|
// Cart Facts
|
|
71
|
-
const ItemAdded = defineFact<
|
|
72
|
-
|
|
73
|
-
);
|
|
74
|
-
const ItemRemoved = defineFact<"ItemRemoved", { productId: string }>(
|
|
75
|
-
"ItemRemoved"
|
|
67
|
+
const ItemAdded = defineFact<'ItemAdded', { productId: string; quantity: number; price: number }>(
|
|
68
|
+
'ItemAdded'
|
|
76
69
|
);
|
|
77
|
-
const
|
|
78
|
-
|
|
70
|
+
const ItemRemoved = defineFact<'ItemRemoved', { productId: string }>('ItemRemoved');
|
|
71
|
+
const DiscountApplied = defineFact<'DiscountApplied', { amount: number; reason: string }>(
|
|
72
|
+
'DiscountApplied'
|
|
79
73
|
);
|
|
80
|
-
const CartCleared = defineFact<
|
|
74
|
+
const CartCleared = defineFact<'CartCleared', {}>('CartCleared');
|
|
81
75
|
|
|
82
76
|
// Feature Flag Facts
|
|
83
|
-
const FeatureEnabled = defineFact<
|
|
84
|
-
|
|
85
|
-
);
|
|
86
|
-
const FeatureDisabled = defineFact<"FeatureDisabled", { feature: string }>(
|
|
87
|
-
"FeatureDisabled"
|
|
88
|
-
);
|
|
77
|
+
const FeatureEnabled = defineFact<'FeatureEnabled', { feature: string }>('FeatureEnabled');
|
|
78
|
+
const FeatureDisabled = defineFact<'FeatureDisabled', { feature: string }>('FeatureDisabled');
|
|
89
79
|
|
|
90
80
|
// Business Facts
|
|
91
|
-
const LoyaltyPointsAwarded = defineFact<
|
|
92
|
-
|
|
93
|
-
);
|
|
94
|
-
const OrderPlaced = defineFact<"OrderPlaced", { orderId: string; total: number }>(
|
|
95
|
-
"OrderPlaced"
|
|
81
|
+
const LoyaltyPointsAwarded = defineFact<'LoyaltyPointsAwarded', { points: number }>(
|
|
82
|
+
'LoyaltyPointsAwarded'
|
|
96
83
|
);
|
|
84
|
+
const OrderPlaced = defineFact<'OrderPlaced', { orderId: string; total: number }>('OrderPlaced');
|
|
97
85
|
|
|
98
86
|
// ============================================================================
|
|
99
87
|
// EVENTS
|
|
100
88
|
// ============================================================================
|
|
101
89
|
|
|
102
90
|
// Auth Events
|
|
103
|
-
const Login = defineEvent<
|
|
104
|
-
const Logout = defineEvent<
|
|
105
|
-
const CheckSession = defineEvent<
|
|
91
|
+
const Login = defineEvent<'LOGIN', { username: string }>('LOGIN');
|
|
92
|
+
const Logout = defineEvent<'LOGOUT', {}>('LOGOUT');
|
|
93
|
+
const CheckSession = defineEvent<'CHECK_SESSION', {}>('CHECK_SESSION');
|
|
106
94
|
|
|
107
95
|
// Cart Events
|
|
108
|
-
const AddToCart = defineEvent<
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
);
|
|
114
|
-
const
|
|
115
|
-
"APPLY_DISCOUNT"
|
|
116
|
-
);
|
|
117
|
-
const Checkout = defineEvent<"CHECKOUT", {}>("CHECKOUT");
|
|
96
|
+
const AddToCart = defineEvent<
|
|
97
|
+
'ADD_TO_CART',
|
|
98
|
+
{ productId: string; quantity: number; price: number }
|
|
99
|
+
>('ADD_TO_CART');
|
|
100
|
+
const RemoveFromCart = defineEvent<'REMOVE_FROM_CART', { productId: string }>('REMOVE_FROM_CART');
|
|
101
|
+
const ApplyDiscount = defineEvent<'APPLY_DISCOUNT', { code: string }>('APPLY_DISCOUNT');
|
|
102
|
+
const Checkout = defineEvent<'CHECKOUT', {}>('CHECKOUT');
|
|
118
103
|
|
|
119
104
|
// Feature Flag Events
|
|
120
|
-
const EnableFeature = defineEvent<
|
|
121
|
-
|
|
122
|
-
);
|
|
123
|
-
const DisableFeature = defineEvent<"DISABLE_FEATURE", { feature: string }>(
|
|
124
|
-
"DISABLE_FEATURE"
|
|
125
|
-
);
|
|
105
|
+
const EnableFeature = defineEvent<'ENABLE_FEATURE', { feature: string }>('ENABLE_FEATURE');
|
|
106
|
+
const DisableFeature = defineEvent<'DISABLE_FEATURE', { feature: string }>('DISABLE_FEATURE');
|
|
126
107
|
|
|
127
108
|
// ============================================================================
|
|
128
109
|
// AUTH MODULE
|
|
129
110
|
// ============================================================================
|
|
130
111
|
|
|
131
112
|
const loginRule = defineRule<ECommerceContext>({
|
|
132
|
-
id:
|
|
133
|
-
description:
|
|
113
|
+
id: 'auth.login',
|
|
114
|
+
description: 'Process login event',
|
|
134
115
|
impl: (state, events) => {
|
|
135
116
|
const loginEvent = findEvent(events, Login);
|
|
136
117
|
if (!loginEvent) {
|
|
@@ -139,7 +120,7 @@ const loginRule = defineRule<ECommerceContext>({
|
|
|
139
120
|
|
|
140
121
|
state.context.currentUser = loginEvent.payload.username;
|
|
141
122
|
state.context.sessionStartTime = Date.now();
|
|
142
|
-
|
|
123
|
+
|
|
143
124
|
return [
|
|
144
125
|
UserLoggedIn.create({
|
|
145
126
|
userId: loginEvent.payload.username,
|
|
@@ -150,8 +131,8 @@ const loginRule = defineRule<ECommerceContext>({
|
|
|
150
131
|
});
|
|
151
132
|
|
|
152
133
|
const logoutRule = defineRule<ECommerceContext>({
|
|
153
|
-
id:
|
|
154
|
-
description:
|
|
134
|
+
id: 'auth.logout',
|
|
135
|
+
description: 'Process logout event',
|
|
155
136
|
impl: (state, events) => {
|
|
156
137
|
const logoutEvent = findEvent(events, Logout);
|
|
157
138
|
if (!logoutEvent || !state.context.currentUser) {
|
|
@@ -161,7 +142,7 @@ const logoutRule = defineRule<ECommerceContext>({
|
|
|
161
142
|
const userId = state.context.currentUser;
|
|
162
143
|
state.context.currentUser = null;
|
|
163
144
|
state.context.sessionStartTime = null;
|
|
164
|
-
|
|
145
|
+
|
|
165
146
|
// Clear cart on logout
|
|
166
147
|
state.context.cart = {
|
|
167
148
|
items: [],
|
|
@@ -169,16 +150,13 @@ const logoutRule = defineRule<ECommerceContext>({
|
|
|
169
150
|
discountApplied: 0,
|
|
170
151
|
};
|
|
171
152
|
|
|
172
|
-
return [
|
|
173
|
-
UserLoggedOut.create({ userId }),
|
|
174
|
-
CartCleared.create({}),
|
|
175
|
-
];
|
|
153
|
+
return [UserLoggedOut.create({ userId }), CartCleared.create({})];
|
|
176
154
|
},
|
|
177
155
|
});
|
|
178
156
|
|
|
179
157
|
const sessionCheckRule = defineRule<ECommerceContext>({
|
|
180
|
-
id:
|
|
181
|
-
description:
|
|
158
|
+
id: 'auth.checkSession',
|
|
159
|
+
description: 'Check for session expiration (30 minute timeout)',
|
|
182
160
|
impl: (state, events) => {
|
|
183
161
|
const checkEvent = findEvent(events, CheckSession);
|
|
184
162
|
if (!checkEvent || !state.context.currentUser || !state.context.sessionStartTime) {
|
|
@@ -194,10 +172,7 @@ const sessionCheckRule = defineRule<ECommerceContext>({
|
|
|
194
172
|
state.context.sessionStartTime = null;
|
|
195
173
|
state.context.cart = { items: [], total: 0, discountApplied: 0 };
|
|
196
174
|
|
|
197
|
-
return [
|
|
198
|
-
SessionExpired.create({ userId }),
|
|
199
|
-
CartCleared.create({}),
|
|
200
|
-
];
|
|
175
|
+
return [SessionExpired.create({ userId }), CartCleared.create({})];
|
|
201
176
|
}
|
|
202
177
|
|
|
203
178
|
return [];
|
|
@@ -206,8 +181,8 @@ const sessionCheckRule = defineRule<ECommerceContext>({
|
|
|
206
181
|
|
|
207
182
|
const authConstraints = [
|
|
208
183
|
defineConstraint<ECommerceContext>({
|
|
209
|
-
id:
|
|
210
|
-
description:
|
|
184
|
+
id: 'auth.singleSession',
|
|
185
|
+
description: 'Only one user can be logged in at a time',
|
|
211
186
|
impl: () => {
|
|
212
187
|
// This is always valid - just enforced by business logic
|
|
213
188
|
return true;
|
|
@@ -218,7 +193,7 @@ const authConstraints = [
|
|
|
218
193
|
const authModule = defineModule<ECommerceContext>({
|
|
219
194
|
rules: [loginRule, logoutRule, sessionCheckRule],
|
|
220
195
|
constraints: authConstraints,
|
|
221
|
-
meta: { module:
|
|
196
|
+
meta: { module: 'auth', version: '1.0.0' },
|
|
222
197
|
});
|
|
223
198
|
|
|
224
199
|
// ============================================================================
|
|
@@ -226,8 +201,8 @@ const authModule = defineModule<ECommerceContext>({
|
|
|
226
201
|
// ============================================================================
|
|
227
202
|
|
|
228
203
|
const addToCartRule = defineRule<ECommerceContext>({
|
|
229
|
-
id:
|
|
230
|
-
description:
|
|
204
|
+
id: 'cart.addItem',
|
|
205
|
+
description: 'Add item to cart',
|
|
231
206
|
impl: (state, events) => {
|
|
232
207
|
const addEvents = events.filter(AddToCart.is);
|
|
233
208
|
if (!state.context.currentUser || addEvents.length === 0) {
|
|
@@ -242,12 +217,12 @@ const addToCartRule = defineRule<ECommerceContext>({
|
|
|
242
217
|
})
|
|
243
218
|
);
|
|
244
219
|
},
|
|
245
|
-
meta: { dependsOn:
|
|
220
|
+
meta: { dependsOn: 'auth.login' },
|
|
246
221
|
});
|
|
247
222
|
|
|
248
223
|
const removeFromCartRule = defineRule<ECommerceContext>({
|
|
249
|
-
id:
|
|
250
|
-
description:
|
|
224
|
+
id: 'cart.removeItem',
|
|
225
|
+
description: 'Remove item from cart',
|
|
251
226
|
impl: (state, events) => {
|
|
252
227
|
const removeEvent = findEvent(events, RemoveFromCart);
|
|
253
228
|
if (!removeEvent || !state.context.currentUser) {
|
|
@@ -259,8 +234,8 @@ const removeFromCartRule = defineRule<ECommerceContext>({
|
|
|
259
234
|
});
|
|
260
235
|
|
|
261
236
|
const applyDiscountRule = defineRule<ECommerceContext>({
|
|
262
|
-
id:
|
|
263
|
-
description:
|
|
237
|
+
id: 'cart.applyDiscount',
|
|
238
|
+
description: 'Apply discount codes',
|
|
264
239
|
impl: (state, events) => {
|
|
265
240
|
const discountEvent = findEvent(events, ApplyDiscount);
|
|
266
241
|
if (!discountEvent || !state.context.currentUser) {
|
|
@@ -269,18 +244,18 @@ const applyDiscountRule = defineRule<ECommerceContext>({
|
|
|
269
244
|
|
|
270
245
|
const code = discountEvent.payload.code;
|
|
271
246
|
let discount = 0;
|
|
272
|
-
let reason =
|
|
247
|
+
let reason = '';
|
|
273
248
|
|
|
274
249
|
// Discount logic
|
|
275
|
-
if (code ===
|
|
276
|
-
discount = 0.
|
|
277
|
-
reason =
|
|
278
|
-
} else if (code ===
|
|
279
|
-
discount = 0.
|
|
280
|
-
reason =
|
|
281
|
-
} else if (code ===
|
|
250
|
+
if (code === 'SAVE10') {
|
|
251
|
+
discount = 0.1;
|
|
252
|
+
reason = '10% off with code SAVE10';
|
|
253
|
+
} else if (code === 'SAVE20' && state.context.loyaltyPoints > 100) {
|
|
254
|
+
discount = 0.2;
|
|
255
|
+
reason = '20% off for loyal customers';
|
|
256
|
+
} else if (code === 'FREESHIP' && state.context.features.freeShippingEnabled) {
|
|
282
257
|
discount = 0.05;
|
|
283
|
-
reason =
|
|
258
|
+
reason = '5% off with free shipping';
|
|
284
259
|
}
|
|
285
260
|
|
|
286
261
|
if (discount > 0) {
|
|
@@ -292,8 +267,8 @@ const applyDiscountRule = defineRule<ECommerceContext>({
|
|
|
292
267
|
});
|
|
293
268
|
|
|
294
269
|
const updateCartContextRule = defineRule<ECommerceContext>({
|
|
295
|
-
id:
|
|
296
|
-
description:
|
|
270
|
+
id: 'cart.updateContext',
|
|
271
|
+
description: 'Update cart context from facts',
|
|
297
272
|
impl: (state) => {
|
|
298
273
|
const addedItems = filterFacts(state.facts, ItemAdded);
|
|
299
274
|
const removedItems = filterFacts(state.facts, ItemRemoved);
|
|
@@ -334,10 +309,7 @@ const updateCartContextRule = defineRule<ECommerceContext>({
|
|
|
334
309
|
}));
|
|
335
310
|
|
|
336
311
|
// Calculate total
|
|
337
|
-
let total = state.context.cart.items.reduce(
|
|
338
|
-
(sum, item) => sum + item.quantity * item.price,
|
|
339
|
-
0
|
|
340
|
-
);
|
|
312
|
+
let total = state.context.cart.items.reduce((sum, item) => sum + item.quantity * item.price, 0);
|
|
341
313
|
|
|
342
314
|
// Apply discounts
|
|
343
315
|
let totalDiscount = 0;
|
|
@@ -353,8 +325,8 @@ const updateCartContextRule = defineRule<ECommerceContext>({
|
|
|
353
325
|
});
|
|
354
326
|
|
|
355
327
|
const checkoutRule = defineRule<ECommerceContext>({
|
|
356
|
-
id:
|
|
357
|
-
description:
|
|
328
|
+
id: 'cart.checkout',
|
|
329
|
+
description: 'Process checkout',
|
|
358
330
|
impl: (state, events) => {
|
|
359
331
|
const checkoutEvent = findEvent(events, Checkout);
|
|
360
332
|
if (!checkoutEvent || !state.context.currentUser || state.context.cart.items.length === 0) {
|
|
@@ -381,22 +353,19 @@ const checkoutRule = defineRule<ECommerceContext>({
|
|
|
381
353
|
|
|
382
354
|
const cartConstraints = [
|
|
383
355
|
defineConstraint<ECommerceContext>({
|
|
384
|
-
id:
|
|
385
|
-
description:
|
|
356
|
+
id: 'cart.maxItems',
|
|
357
|
+
description: 'Cart cannot exceed 100 items',
|
|
386
358
|
impl: (state) => {
|
|
387
|
-
const totalQuantity = state.context.cart.items.reduce(
|
|
388
|
-
(sum, item) => sum + item.quantity,
|
|
389
|
-
0
|
|
390
|
-
);
|
|
359
|
+
const totalQuantity = state.context.cart.items.reduce((sum, item) => sum + item.quantity, 0);
|
|
391
360
|
return totalQuantity <= 100 || `Cart has ${totalQuantity} items, max is 100`;
|
|
392
361
|
},
|
|
393
362
|
}),
|
|
394
363
|
defineConstraint<ECommerceContext>({
|
|
395
|
-
id:
|
|
396
|
-
description:
|
|
364
|
+
id: 'cart.requiresAuth',
|
|
365
|
+
description: 'Cart operations require authentication',
|
|
397
366
|
impl: (state) => {
|
|
398
367
|
if (state.context.cart.items.length > 0 && !state.context.currentUser) {
|
|
399
|
-
return
|
|
368
|
+
return 'Cart operations require authentication';
|
|
400
369
|
}
|
|
401
370
|
return true;
|
|
402
371
|
},
|
|
@@ -412,7 +381,7 @@ const cartModule = defineModule<ECommerceContext>({
|
|
|
412
381
|
checkoutRule,
|
|
413
382
|
],
|
|
414
383
|
constraints: cartConstraints,
|
|
415
|
-
meta: { module:
|
|
384
|
+
meta: { module: 'cart', version: '1.0.0', dependsOn: ['auth'] },
|
|
416
385
|
});
|
|
417
386
|
|
|
418
387
|
// ============================================================================
|
|
@@ -420,8 +389,8 @@ const cartModule = defineModule<ECommerceContext>({
|
|
|
420
389
|
// ============================================================================
|
|
421
390
|
|
|
422
391
|
const enableFeatureRule = defineRule<ECommerceContext>({
|
|
423
|
-
id:
|
|
424
|
-
description:
|
|
392
|
+
id: 'features.enable',
|
|
393
|
+
description: 'Enable a feature flag',
|
|
425
394
|
impl: (state, events) => {
|
|
426
395
|
const enableEvent = findEvent(events, EnableFeature);
|
|
427
396
|
if (!enableEvent) {
|
|
@@ -429,11 +398,11 @@ const enableFeatureRule = defineRule<ECommerceContext>({
|
|
|
429
398
|
}
|
|
430
399
|
|
|
431
400
|
const feature = enableEvent.payload.feature;
|
|
432
|
-
if (feature ===
|
|
401
|
+
if (feature === 'freeShipping') {
|
|
433
402
|
state.context.features.freeShippingEnabled = true;
|
|
434
|
-
} else if (feature ===
|
|
403
|
+
} else if (feature === 'loyaltyProgram') {
|
|
435
404
|
state.context.features.loyaltyProgramEnabled = true;
|
|
436
|
-
} else if (feature ===
|
|
405
|
+
} else if (feature === 'newCheckoutFlow') {
|
|
437
406
|
state.context.features.newCheckoutFlowEnabled = true;
|
|
438
407
|
}
|
|
439
408
|
|
|
@@ -442,8 +411,8 @@ const enableFeatureRule = defineRule<ECommerceContext>({
|
|
|
442
411
|
});
|
|
443
412
|
|
|
444
413
|
const disableFeatureRule = defineRule<ECommerceContext>({
|
|
445
|
-
id:
|
|
446
|
-
description:
|
|
414
|
+
id: 'features.disable',
|
|
415
|
+
description: 'Disable a feature flag',
|
|
447
416
|
impl: (state, events) => {
|
|
448
417
|
const disableEvent = findEvent(events, DisableFeature);
|
|
449
418
|
if (!disableEvent) {
|
|
@@ -451,11 +420,11 @@ const disableFeatureRule = defineRule<ECommerceContext>({
|
|
|
451
420
|
}
|
|
452
421
|
|
|
453
422
|
const feature = disableEvent.payload.feature;
|
|
454
|
-
if (feature ===
|
|
423
|
+
if (feature === 'freeShipping') {
|
|
455
424
|
state.context.features.freeShippingEnabled = false;
|
|
456
|
-
} else if (feature ===
|
|
425
|
+
} else if (feature === 'loyaltyProgram') {
|
|
457
426
|
state.context.features.loyaltyProgramEnabled = false;
|
|
458
|
-
} else if (feature ===
|
|
427
|
+
} else if (feature === 'newCheckoutFlow') {
|
|
459
428
|
state.context.features.newCheckoutFlowEnabled = false;
|
|
460
429
|
}
|
|
461
430
|
|
|
@@ -466,7 +435,7 @@ const disableFeatureRule = defineRule<ECommerceContext>({
|
|
|
466
435
|
const featureFlagsModule = defineModule<ECommerceContext>({
|
|
467
436
|
rules: [enableFeatureRule, disableFeatureRule],
|
|
468
437
|
constraints: [],
|
|
469
|
-
meta: { module:
|
|
438
|
+
meta: { module: 'featureFlags', version: '1.0.0' },
|
|
470
439
|
});
|
|
471
440
|
|
|
472
441
|
// ============================================================================
|
|
@@ -477,16 +446,18 @@ const featureFlagsModule = defineModule<ECommerceContext>({
|
|
|
477
446
|
* Logging actor - logs important events to console
|
|
478
447
|
*/
|
|
479
448
|
const loggingActor: Actor<ECommerceContext> = {
|
|
480
|
-
id:
|
|
481
|
-
description:
|
|
449
|
+
id: 'logging',
|
|
450
|
+
description: 'Logs important events',
|
|
482
451
|
onStateChange: (state) => {
|
|
483
452
|
const recentFacts = state.facts.slice(-3); // Last 3 facts
|
|
484
453
|
for (const fact of recentFacts) {
|
|
485
|
-
if (fact.tag ===
|
|
454
|
+
if (fact.tag === 'UserLoggedIn' && UserLoggedIn.is(fact)) {
|
|
486
455
|
console.log(` [LOG] User ${fact.payload.userId} logged in`);
|
|
487
|
-
} else if (fact.tag ===
|
|
488
|
-
console.log(
|
|
489
|
-
|
|
456
|
+
} else if (fact.tag === 'OrderPlaced' && OrderPlaced.is(fact)) {
|
|
457
|
+
console.log(
|
|
458
|
+
` [LOG] Order ${fact.payload.orderId} placed for $${fact.payload.total.toFixed(2)}`
|
|
459
|
+
);
|
|
460
|
+
} else if (fact.tag === 'SessionExpired' && SessionExpired.is(fact)) {
|
|
490
461
|
console.log(` [LOG] Session expired for user ${fact.payload.userId}`);
|
|
491
462
|
}
|
|
492
463
|
}
|
|
@@ -497,15 +468,15 @@ const loggingActor: Actor<ECommerceContext> = {
|
|
|
497
468
|
* Analytics actor - tracks metrics
|
|
498
469
|
*/
|
|
499
470
|
const analyticsActor: Actor<ECommerceContext> = {
|
|
500
|
-
id:
|
|
501
|
-
description:
|
|
471
|
+
id: 'analytics',
|
|
472
|
+
description: 'Tracks analytics events',
|
|
502
473
|
onStateChange: (state) => {
|
|
503
474
|
// In a real app, this would send to an analytics service
|
|
504
475
|
const recentFacts = state.facts.slice(-1);
|
|
505
476
|
for (const fact of recentFacts) {
|
|
506
|
-
if (fact.tag ===
|
|
477
|
+
if (fact.tag === 'OrderPlaced' && OrderPlaced.is(fact)) {
|
|
507
478
|
console.log(` [ANALYTICS] Revenue: $${fact.payload.total.toFixed(2)}`);
|
|
508
|
-
} else if (fact.tag ===
|
|
479
|
+
} else if (fact.tag === 'LoyaltyPointsAwarded' && LoyaltyPointsAwarded.is(fact)) {
|
|
509
480
|
console.log(` [ANALYTICS] Loyalty engagement: ${fact.payload.points} points`);
|
|
510
481
|
}
|
|
511
482
|
}
|
|
@@ -518,7 +489,7 @@ const analyticsActor: Actor<ECommerceContext> = {
|
|
|
518
489
|
|
|
519
490
|
function createECommerceEngine() {
|
|
520
491
|
const registry = new PraxisRegistry<ECommerceContext>();
|
|
521
|
-
|
|
492
|
+
|
|
522
493
|
// Register all modules
|
|
523
494
|
registry.registerModule(authModule);
|
|
524
495
|
registry.registerModule(cartModule);
|
|
@@ -558,38 +529,38 @@ function createECommerceEngine() {
|
|
|
558
529
|
// ============================================================================
|
|
559
530
|
|
|
560
531
|
async function runDemo() {
|
|
561
|
-
console.log(
|
|
562
|
-
console.log(
|
|
563
|
-
console.log(
|
|
564
|
-
console.log(
|
|
532
|
+
console.log('='.repeat(70));
|
|
533
|
+
console.log('E-COMMERCE PLATFORM DEMO');
|
|
534
|
+
console.log('Demonstrating: Auth + Cart + Feature Flags + Actors + Constraints');
|
|
535
|
+
console.log('='.repeat(70));
|
|
565
536
|
console.log();
|
|
566
537
|
|
|
567
538
|
const { engine, actorManager } = createECommerceEngine();
|
|
568
539
|
await actorManager.startAll();
|
|
569
540
|
|
|
570
541
|
// Scenario 1: User Login
|
|
571
|
-
console.log(
|
|
572
|
-
console.log(
|
|
573
|
-
let result = engine.step([Login.create({ username:
|
|
542
|
+
console.log('1. User Login');
|
|
543
|
+
console.log('-'.repeat(70));
|
|
544
|
+
let result = engine.step([Login.create({ username: 'alice' })]);
|
|
574
545
|
await actorManager.notifyStateChange(engine.getState());
|
|
575
546
|
console.log(` User: ${engine.getContext().currentUser}`);
|
|
576
547
|
console.log(` Diagnostics: ${result.diagnostics.length} issue(s)`);
|
|
577
548
|
console.log();
|
|
578
549
|
|
|
579
550
|
// Scenario 2: Enable Feature Flag
|
|
580
|
-
console.log(
|
|
581
|
-
console.log(
|
|
582
|
-
result = engine.step([EnableFeature.create({ feature:
|
|
551
|
+
console.log('2. Enable Free Shipping Feature');
|
|
552
|
+
console.log('-'.repeat(70));
|
|
553
|
+
result = engine.step([EnableFeature.create({ feature: 'freeShipping' })]);
|
|
583
554
|
await actorManager.notifyStateChange(engine.getState());
|
|
584
555
|
console.log(` Free Shipping Enabled: ${engine.getContext().features.freeShippingEnabled}`);
|
|
585
556
|
console.log();
|
|
586
557
|
|
|
587
558
|
// Scenario 3: Add Items to Cart
|
|
588
|
-
console.log(
|
|
589
|
-
console.log(
|
|
559
|
+
console.log('3. Add Items to Cart');
|
|
560
|
+
console.log('-'.repeat(70));
|
|
590
561
|
result = engine.step([
|
|
591
|
-
AddToCart.create({ productId:
|
|
592
|
-
AddToCart.create({ productId:
|
|
562
|
+
AddToCart.create({ productId: 'laptop-1', quantity: 1, price: 999.99 }),
|
|
563
|
+
AddToCart.create({ productId: 'mouse-1', quantity: 2, price: 29.99 }),
|
|
593
564
|
]);
|
|
594
565
|
await actorManager.notifyStateChange(engine.getState());
|
|
595
566
|
const cart = engine.getContext().cart;
|
|
@@ -598,17 +569,17 @@ async function runDemo() {
|
|
|
598
569
|
console.log();
|
|
599
570
|
|
|
600
571
|
// Scenario 4: Apply Discount
|
|
601
|
-
console.log(
|
|
602
|
-
console.log(
|
|
603
|
-
result = engine.step([ApplyDiscount.create({ code:
|
|
572
|
+
console.log('4. Apply Discount Code');
|
|
573
|
+
console.log('-'.repeat(70));
|
|
574
|
+
result = engine.step([ApplyDiscount.create({ code: 'SAVE10' })]);
|
|
604
575
|
await actorManager.notifyStateChange(engine.getState());
|
|
605
576
|
console.log(` Discount: ${(engine.getContext().cart.discountApplied * 100).toFixed(0)}%`);
|
|
606
577
|
console.log(` New Total: $${engine.getContext().cart.total.toFixed(2)}`);
|
|
607
578
|
console.log();
|
|
608
579
|
|
|
609
580
|
// Scenario 5: Checkout
|
|
610
|
-
console.log(
|
|
611
|
-
console.log(
|
|
581
|
+
console.log('5. Checkout');
|
|
582
|
+
console.log('-'.repeat(70));
|
|
612
583
|
result = engine.step([Checkout.create({})]);
|
|
613
584
|
await actorManager.notifyStateChange(engine.getState());
|
|
614
585
|
console.log(` Orders Placed: ${engine.getContext().orderHistory.length}`);
|
|
@@ -617,16 +588,18 @@ async function runDemo() {
|
|
|
617
588
|
console.log();
|
|
618
589
|
|
|
619
590
|
// Scenario 6: Add More Items and Checkout Again
|
|
620
|
-
console.log(
|
|
621
|
-
console.log(
|
|
591
|
+
console.log('6. Shop Again with Loyalty Discount');
|
|
592
|
+
console.log('-'.repeat(70));
|
|
622
593
|
engine.step([
|
|
623
|
-
AddToCart.create({ productId:
|
|
624
|
-
ApplyDiscount.create({ code:
|
|
594
|
+
AddToCart.create({ productId: 'keyboard-1', quantity: 1, price: 129.99 }),
|
|
595
|
+
ApplyDiscount.create({ code: 'SAVE20' }), // Requires 100+ loyalty points
|
|
625
596
|
]);
|
|
626
597
|
await actorManager.notifyStateChange(engine.getState());
|
|
627
598
|
console.log(` Total: $${engine.getContext().cart.total.toFixed(2)}`);
|
|
628
|
-
console.log(
|
|
629
|
-
|
|
599
|
+
console.log(
|
|
600
|
+
` Discount Applied: ${(engine.getContext().cart.discountApplied * 100).toFixed(0)}%`
|
|
601
|
+
);
|
|
602
|
+
|
|
630
603
|
result = engine.step([Checkout.create({})]);
|
|
631
604
|
await actorManager.notifyStateChange(engine.getState());
|
|
632
605
|
console.log(` Total Orders: ${engine.getContext().orderHistory.length}`);
|
|
@@ -634,19 +607,19 @@ async function runDemo() {
|
|
|
634
607
|
console.log();
|
|
635
608
|
|
|
636
609
|
// Scenario 7: Logout
|
|
637
|
-
console.log(
|
|
638
|
-
console.log(
|
|
610
|
+
console.log('7. User Logout');
|
|
611
|
+
console.log('-'.repeat(70));
|
|
639
612
|
result = engine.step([Logout.create({})]);
|
|
640
613
|
await actorManager.notifyStateChange(engine.getState());
|
|
641
|
-
console.log(` User: ${engine.getContext().currentUser ??
|
|
614
|
+
console.log(` User: ${engine.getContext().currentUser ?? '(none)'}`);
|
|
642
615
|
console.log(` Session Cleared: ${engine.getContext().sessionStartTime === null}`);
|
|
643
616
|
console.log();
|
|
644
617
|
|
|
645
618
|
await actorManager.stopAll();
|
|
646
619
|
|
|
647
|
-
console.log(
|
|
648
|
-
console.log(
|
|
649
|
-
console.log(
|
|
620
|
+
console.log('='.repeat(70));
|
|
621
|
+
console.log('DEMO COMPLETE');
|
|
622
|
+
console.log('='.repeat(70));
|
|
650
623
|
}
|
|
651
624
|
|
|
652
625
|
// Run demo if executed directly
|