@plures/praxis 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FRAMEWORK.md +55 -5
- package/LICENSE +21 -21
- package/README.md +162 -375
- package/core/codegen/docs-generator.ts +5 -2
- package/core/codegen/index.ts +1 -1
- package/core/codegen/ts-generator.ts +15 -15
- 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 +217418 -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-YBZ7W24H.js +213239 -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 +132 -96
- 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 +49 -0
- package/src/cli/index.ts +21 -2
- 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/TerminalNode.svelte +457 -457
- 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/App.svelte +506 -506
- 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/index.d.ts +0 -8
- package/dist/src/cli/index.d.ts.map +0 -1
- package/dist/src/cli/index.js +0 -211
- 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/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/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
|
@@ -5,6 +5,7 @@ A comprehensive example demonstrating Praxis's Svelte 5 integration with history
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
7
|
### Core Functionality
|
|
8
|
+
|
|
8
9
|
- ✅ Add, complete, and remove todos
|
|
9
10
|
- ✅ Filter by all, active, or completed
|
|
10
11
|
- ✅ Complete all todos at once
|
|
@@ -12,6 +13,7 @@ A comprehensive example demonstrating Praxis's Svelte 5 integration with history
|
|
|
12
13
|
- ✅ Real-time statistics
|
|
13
14
|
|
|
14
15
|
### Advanced Features
|
|
16
|
+
|
|
15
17
|
- 🔄 **Undo/Redo**: Full history tracking with keyboard shortcuts
|
|
16
18
|
- 🕰️ **Time-Travel Debugging**: Navigate through state snapshots
|
|
17
19
|
- ⚡ **Svelte 5 Runes**: Modern reactive API
|
|
@@ -21,12 +23,14 @@ A comprehensive example demonstrating Praxis's Svelte 5 integration with history
|
|
|
21
23
|
## Architecture
|
|
22
24
|
|
|
23
25
|
### State Management
|
|
26
|
+
|
|
24
27
|
- **Engine**: Praxis logic engine managing todo state
|
|
25
28
|
- **Rules**: Pure functions handling events
|
|
26
29
|
- **Facts**: Immutable history of what happened
|
|
27
30
|
- **Context**: Current application state
|
|
28
31
|
|
|
29
32
|
### Svelte Integration
|
|
33
|
+
|
|
30
34
|
- **usePraxisEngine**: Main composable with history support
|
|
31
35
|
- **Reactive Derivations**: Computed values with `$:` syntax
|
|
32
36
|
- **Event Dispatching**: Type-safe event handling
|
|
@@ -71,7 +75,7 @@ export function createTodoEngine() {
|
|
|
71
75
|
const registry = new PraxisRegistry<TodoContext>();
|
|
72
76
|
registry.registerRule(addTodoRule);
|
|
73
77
|
// ... register more rules
|
|
74
|
-
|
|
78
|
+
|
|
75
79
|
return createPraxisEngine({
|
|
76
80
|
initialContext: { todos: [], filter: 'all', nextId: 1 },
|
|
77
81
|
registry,
|
|
@@ -127,6 +131,7 @@ node dist/examples/advanced-todo/index.js
|
|
|
127
131
|
```
|
|
128
132
|
|
|
129
133
|
Output:
|
|
134
|
+
|
|
130
135
|
```
|
|
131
136
|
=== Advanced Todo Example ===
|
|
132
137
|
|
|
@@ -157,11 +162,13 @@ Output:
|
|
|
157
162
|
To use the Svelte component in your app:
|
|
158
163
|
|
|
159
164
|
1. Install dependencies:
|
|
165
|
+
|
|
160
166
|
```bash
|
|
161
167
|
npm install @plures/praxis svelte@^5.0.0
|
|
162
168
|
```
|
|
163
169
|
|
|
164
170
|
2. Import and use the component:
|
|
171
|
+
|
|
165
172
|
```svelte
|
|
166
173
|
<script>
|
|
167
174
|
import TodoApp from '@plures/praxis/examples/advanced-todo/App.svelte';
|
|
@@ -179,7 +186,7 @@ Or create your own component using the engine:
|
|
|
179
186
|
|
|
180
187
|
const engine = createTodoEngine();
|
|
181
188
|
const { context, dispatch } = usePraxisEngine(engine);
|
|
182
|
-
|
|
189
|
+
|
|
183
190
|
let text = '';
|
|
184
191
|
</script>
|
|
185
192
|
|
|
@@ -226,9 +233,15 @@ const addTodoRule = defineRule({
|
|
|
226
233
|
// - Testable
|
|
227
234
|
const event = findEvent(events, AddTodo);
|
|
228
235
|
if (!event) return [];
|
|
229
|
-
|
|
230
|
-
state.context.todos.push({
|
|
231
|
-
|
|
236
|
+
|
|
237
|
+
state.context.todos.push({
|
|
238
|
+
/* ... */
|
|
239
|
+
});
|
|
240
|
+
return [
|
|
241
|
+
TodoAdded.create({
|
|
242
|
+
/* ... */
|
|
243
|
+
}),
|
|
244
|
+
];
|
|
232
245
|
},
|
|
233
246
|
});
|
|
234
247
|
```
|
|
@@ -240,8 +253,8 @@ const addTodoRule = defineRule({
|
|
|
240
253
|
const facts = engine.getFacts();
|
|
241
254
|
|
|
242
255
|
// Find specific facts
|
|
243
|
-
const added = facts.filter(f => f.tag === 'TodoAdded');
|
|
244
|
-
const toggled = facts.filter(f => f.tag === 'TodoToggled');
|
|
256
|
+
const added = facts.filter((f) => f.tag === 'TodoAdded');
|
|
257
|
+
const toggled = facts.filter((f) => f.tag === 'TodoToggled');
|
|
245
258
|
|
|
246
259
|
// Facts enable:
|
|
247
260
|
// - Audit trails
|
|
@@ -270,10 +283,10 @@ const { undo, redo, snapshots, goToSnapshot } = usePraxisEngine(engine, {
|
|
|
270
283
|
});
|
|
271
284
|
|
|
272
285
|
// Navigate history
|
|
273
|
-
undo();
|
|
274
|
-
redo();
|
|
275
|
-
goToSnapshot(5);
|
|
276
|
-
console.log(snapshots);
|
|
286
|
+
undo(); // Go back
|
|
287
|
+
redo(); // Go forward
|
|
288
|
+
goToSnapshot(5); // Jump to specific snapshot
|
|
289
|
+
console.log(snapshots); // View all snapshots
|
|
277
290
|
```
|
|
278
291
|
|
|
279
292
|
## Testing
|
|
@@ -287,7 +300,7 @@ describe('Todo Engine', () => {
|
|
|
287
300
|
it('should add todos', () => {
|
|
288
301
|
const engine = createTodoEngine();
|
|
289
302
|
engine.step([AddTodo.create({ text: 'Test todo' })]);
|
|
290
|
-
|
|
303
|
+
|
|
291
304
|
const context = engine.getContext();
|
|
292
305
|
expect(context.todos.length).toBe(1);
|
|
293
306
|
expect(context.todos[0].text).toBe('Test todo');
|
|
@@ -296,10 +309,10 @@ describe('Todo Engine', () => {
|
|
|
296
309
|
it('should toggle todos', () => {
|
|
297
310
|
const engine = createTodoEngine();
|
|
298
311
|
engine.step([AddTodo.create({ text: 'Test' })]);
|
|
299
|
-
|
|
312
|
+
|
|
300
313
|
const context = engine.getContext();
|
|
301
314
|
const todoId = context.todos[0].id;
|
|
302
|
-
|
|
315
|
+
|
|
303
316
|
engine.step([ToggleTodo.create({ id: todoId })]);
|
|
304
317
|
expect(engine.getContext().todos[0].completed).toBe(true);
|
|
305
318
|
});
|
|
@@ -309,55 +322,60 @@ describe('Todo Engine', () => {
|
|
|
309
322
|
## Performance Tips
|
|
310
323
|
|
|
311
324
|
1. **Batch Events**: Dispatch multiple events at once
|
|
325
|
+
|
|
312
326
|
```typescript
|
|
313
|
-
dispatch(
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
327
|
+
dispatch(
|
|
328
|
+
[
|
|
329
|
+
AddTodo.create({ text: 'Todo 1' }),
|
|
330
|
+
AddTodo.create({ text: 'Todo 2' }),
|
|
331
|
+
AddTodo.create({ text: 'Todo 3' }),
|
|
332
|
+
],
|
|
333
|
+
'Batch Add'
|
|
334
|
+
);
|
|
318
335
|
```
|
|
319
336
|
|
|
320
337
|
2. **Limit History**: Adjust history size based on needs
|
|
338
|
+
|
|
321
339
|
```typescript
|
|
322
340
|
usePraxisEngine(engine, { maxHistorySize: 20 });
|
|
323
341
|
```
|
|
324
342
|
|
|
325
343
|
3. **Selective Subscriptions**: Use derived stores for specific values
|
|
326
344
|
```typescript
|
|
327
|
-
const count = createDerivedStore(engine, ctx => ctx.todos.length);
|
|
345
|
+
const count = createDerivedStore(engine, (ctx) => ctx.todos.length);
|
|
328
346
|
```
|
|
329
347
|
|
|
330
348
|
## Comparison with Other Libraries
|
|
331
349
|
|
|
332
350
|
### vs. Redux + Redux Toolkit
|
|
333
351
|
|
|
334
|
-
| Feature
|
|
335
|
-
|
|
336
|
-
| State Updates
|
|
337
|
-
| Side Effects
|
|
338
|
-
| Time-Travel
|
|
339
|
-
| TypeScript
|
|
340
|
-
| Learning Curve | Medium
|
|
352
|
+
| Feature | Redux + RTK | Praxis |
|
|
353
|
+
| -------------- | ------------ | --------- |
|
|
354
|
+
| State Updates | Reducers | Rules |
|
|
355
|
+
| Side Effects | Thunks/Sagas | Actors |
|
|
356
|
+
| Time-Travel | DevTools | Built-in |
|
|
357
|
+
| TypeScript | Good | Excellent |
|
|
358
|
+
| Learning Curve | Medium | Low |
|
|
341
359
|
|
|
342
360
|
### vs. XState
|
|
343
361
|
|
|
344
|
-
| Feature
|
|
345
|
-
|
|
346
|
-
| State Machines
|
|
362
|
+
| Feature | XState | Praxis |
|
|
363
|
+
| ------------------ | -------------- | --------------------- |
|
|
364
|
+
| State Machines | Native | Engine-based |
|
|
347
365
|
| Svelte Integration | @xstate/svelte | @plures/praxis/svelte |
|
|
348
|
-
| History States
|
|
349
|
-
| Visual Tools
|
|
350
|
-
| Learning Curve
|
|
366
|
+
| History States | Built-in | Pattern-based |
|
|
367
|
+
| Visual Tools | Stately | State-Docs (planned) |
|
|
368
|
+
| Learning Curve | High | Medium |
|
|
351
369
|
|
|
352
370
|
### vs. Svelte Stores
|
|
353
371
|
|
|
354
|
-
| Feature
|
|
355
|
-
|
|
356
|
-
| Simplicity
|
|
357
|
-
| Structure
|
|
358
|
-
| Time-Travel | Manual
|
|
359
|
-
| Rules/Logic | Manual
|
|
360
|
-
| TypeScript
|
|
372
|
+
| Feature | Svelte Stores | Praxis |
|
|
373
|
+
| ----------- | ------------- | --------- |
|
|
374
|
+
| Simplicity | Very High | High |
|
|
375
|
+
| Structure | Manual | Built-in |
|
|
376
|
+
| Time-Travel | Manual | Built-in |
|
|
377
|
+
| Rules/Logic | Manual | Built-in |
|
|
378
|
+
| TypeScript | Good | Excellent |
|
|
361
379
|
|
|
362
380
|
## Next Steps
|
|
363
381
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Advanced Svelte 5 Integration Example
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Demonstrates the new Svelte 5 runes support with history state pattern.
|
|
5
5
|
* This example shows a todo app with undo/redo and time-travel debugging.
|
|
6
6
|
*/
|
|
@@ -254,8 +254,8 @@ function runExample() {
|
|
|
254
254
|
|
|
255
255
|
// Change filter
|
|
256
256
|
console.log('3. Filtering to active todos:');
|
|
257
|
-
engine.step([SetFilter.create({ filter: 'active' })])
|
|
258
|
-
|
|
257
|
+
engine.step([SetFilter.create({ filter: 'active' })]);
|
|
258
|
+
|
|
259
259
|
const context3 = engine.getContext();
|
|
260
260
|
const filtered = getFilteredTodos(context3.todos, context3.filter);
|
|
261
261
|
console.log(` Filter: ${context3.filter}`);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Auth Basic Example
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Demonstrates basic authentication logic with login/logout using Praxis.
|
|
5
5
|
* Shows how to define facts, events, rules, and constraints.
|
|
6
6
|
*/
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
defineConstraint,
|
|
15
15
|
findEvent,
|
|
16
16
|
filterFacts,
|
|
17
|
-
} from
|
|
17
|
+
} from '../../index.js';
|
|
18
18
|
|
|
19
19
|
// Define the context type
|
|
20
20
|
interface AuthContext {
|
|
@@ -23,21 +23,21 @@ interface AuthContext {
|
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
// Define facts
|
|
26
|
-
const UserLoggedIn = defineFact<
|
|
27
|
-
|
|
26
|
+
const UserLoggedIn = defineFact<'UserLoggedIn', { userId: string; timestamp: number }>(
|
|
27
|
+
'UserLoggedIn'
|
|
28
28
|
);
|
|
29
|
-
const UserLoggedOut = defineFact<
|
|
30
|
-
|
|
29
|
+
const UserLoggedOut = defineFact<'UserLoggedOut', { userId: string; timestamp: number }>(
|
|
30
|
+
'UserLoggedOut'
|
|
31
31
|
);
|
|
32
32
|
|
|
33
33
|
// Define events
|
|
34
|
-
const Login = defineEvent<
|
|
35
|
-
const Logout = defineEvent<
|
|
34
|
+
const Login = defineEvent<'LOGIN', { username: string; password: string }>('LOGIN');
|
|
35
|
+
const Logout = defineEvent<'LOGOUT', {}>('LOGOUT');
|
|
36
36
|
|
|
37
37
|
// Define rules
|
|
38
38
|
const loginRule = defineRule<AuthContext>({
|
|
39
|
-
id:
|
|
40
|
-
description:
|
|
39
|
+
id: 'auth.login',
|
|
40
|
+
description: 'Process login event and create UserLoggedIn fact',
|
|
41
41
|
impl: (_state, events) => {
|
|
42
42
|
const loginEvent = findEvent(events, Login);
|
|
43
43
|
if (!loginEvent) {
|
|
@@ -51,8 +51,8 @@ const loginRule = defineRule<AuthContext>({
|
|
|
51
51
|
});
|
|
52
52
|
|
|
53
53
|
const logoutRule = defineRule<AuthContext>({
|
|
54
|
-
id:
|
|
55
|
-
description:
|
|
54
|
+
id: 'auth.logout',
|
|
55
|
+
description: 'Process logout event and create UserLoggedOut fact',
|
|
56
56
|
impl: (state, events) => {
|
|
57
57
|
const logoutEvent = findEvent(events, Logout);
|
|
58
58
|
if (!logoutEvent || !state.context.currentUser) {
|
|
@@ -69,8 +69,8 @@ const logoutRule = defineRule<AuthContext>({
|
|
|
69
69
|
});
|
|
70
70
|
|
|
71
71
|
const updateContextRule = defineRule<AuthContext>({
|
|
72
|
-
id:
|
|
73
|
-
description:
|
|
72
|
+
id: 'auth.updateContext',
|
|
73
|
+
description: 'Update context based on login/logout facts',
|
|
74
74
|
impl: (state, _events) => {
|
|
75
75
|
// This rule updates context based on facts (side effect on context)
|
|
76
76
|
const loginFacts = filterFacts(state.facts, UserLoggedIn);
|
|
@@ -95,8 +95,8 @@ const updateContextRule = defineRule<AuthContext>({
|
|
|
95
95
|
|
|
96
96
|
// Define constraints
|
|
97
97
|
const singleSessionConstraint = defineConstraint<AuthContext>({
|
|
98
|
-
id:
|
|
99
|
-
description:
|
|
98
|
+
id: 'auth.singleSession',
|
|
99
|
+
description: 'Only one user can be logged in at a time',
|
|
100
100
|
impl: (state) => {
|
|
101
101
|
const loginFacts = filterFacts(state.facts, UserLoggedIn);
|
|
102
102
|
const logoutFacts = filterFacts(state.facts, UserLoggedOut);
|
|
@@ -127,31 +127,31 @@ function createAuthEngine() {
|
|
|
127
127
|
|
|
128
128
|
// Example usage
|
|
129
129
|
function runExample() {
|
|
130
|
-
console.log(
|
|
130
|
+
console.log('=== Auth Basic Example ===\n');
|
|
131
131
|
|
|
132
132
|
const engine = createAuthEngine();
|
|
133
133
|
|
|
134
134
|
// Login
|
|
135
|
-
console.log(
|
|
136
|
-
let result = engine.step([Login.create({ username:
|
|
137
|
-
console.log(
|
|
138
|
-
console.log(
|
|
139
|
-
console.log(
|
|
135
|
+
console.log('1. User logs in:');
|
|
136
|
+
let result = engine.step([Login.create({ username: 'alice', password: 'secret123' })]);
|
|
137
|
+
console.log(' Context:', engine.getContext());
|
|
138
|
+
console.log(' Facts:', result.state.facts);
|
|
139
|
+
console.log(' Diagnostics:', result.diagnostics);
|
|
140
140
|
console.log();
|
|
141
141
|
|
|
142
142
|
// Try to login again (should violate constraint)
|
|
143
|
-
console.log(
|
|
144
|
-
result = engine.step([Login.create({ username:
|
|
145
|
-
console.log(
|
|
146
|
-
console.log(
|
|
143
|
+
console.log('2. Another user tries to log in:');
|
|
144
|
+
result = engine.step([Login.create({ username: 'bob', password: 'secret456' })]);
|
|
145
|
+
console.log(' Context:', engine.getContext());
|
|
146
|
+
console.log(' Diagnostics:', result.diagnostics);
|
|
147
147
|
console.log();
|
|
148
148
|
|
|
149
149
|
// Logout
|
|
150
|
-
console.log(
|
|
150
|
+
console.log('3. User logs out:');
|
|
151
151
|
result = engine.step([Logout.create({})]);
|
|
152
|
-
console.log(
|
|
153
|
-
console.log(
|
|
154
|
-
console.log(
|
|
152
|
+
console.log(' Context:', engine.getContext());
|
|
153
|
+
console.log(' Facts (last 3):', result.state.facts.slice(-3));
|
|
154
|
+
console.log(' Diagnostics:', result.diagnostics);
|
|
155
155
|
console.log();
|
|
156
156
|
}
|
|
157
157
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Cart Example
|
|
3
|
-
*
|
|
3
|
+
*
|
|
4
4
|
* Demonstrates shopping cart logic with flows and derived state.
|
|
5
5
|
* Shows how to manage complex state with multiple rules and constraints.
|
|
6
6
|
*/
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
defineModule,
|
|
16
16
|
findEvent,
|
|
17
17
|
filterFacts,
|
|
18
|
-
} from
|
|
18
|
+
} from '../../index.js';
|
|
19
19
|
|
|
20
20
|
// Define the context type
|
|
21
21
|
interface CartContext {
|
|
@@ -25,25 +25,26 @@ interface CartContext {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
// Define facts
|
|
28
|
-
const ItemAdded = defineFact<
|
|
29
|
-
|
|
28
|
+
const ItemAdded = defineFact<'ItemAdded', { productId: string; quantity: number; price: number }>(
|
|
29
|
+
'ItemAdded'
|
|
30
30
|
);
|
|
31
|
-
const ItemRemoved = defineFact<
|
|
32
|
-
const DiscountApplied = defineFact<
|
|
33
|
-
const CartCleared = defineFact<
|
|
31
|
+
const ItemRemoved = defineFact<'ItemRemoved', { productId: string }>('ItemRemoved');
|
|
32
|
+
const DiscountApplied = defineFact<'DiscountApplied', { percentage: number }>('DiscountApplied');
|
|
33
|
+
const CartCleared = defineFact<'CartCleared', {}>('CartCleared');
|
|
34
34
|
|
|
35
35
|
// Define events
|
|
36
|
-
const AddToCart = defineEvent<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
const
|
|
36
|
+
const AddToCart = defineEvent<
|
|
37
|
+
'ADD_TO_CART',
|
|
38
|
+
{ productId: string; quantity: number; price: number }
|
|
39
|
+
>('ADD_TO_CART');
|
|
40
|
+
const RemoveFromCart = defineEvent<'REMOVE_FROM_CART', { productId: string }>('REMOVE_FROM_CART');
|
|
41
|
+
const ApplyDiscount = defineEvent<'APPLY_DISCOUNT', { code: string }>('APPLY_DISCOUNT');
|
|
42
|
+
const ClearCart = defineEvent<'CLEAR_CART', {}>('CLEAR_CART');
|
|
42
43
|
|
|
43
44
|
// Define rules
|
|
44
45
|
const addToCartRule = defineRule<CartContext>({
|
|
45
|
-
id:
|
|
46
|
-
description:
|
|
46
|
+
id: 'cart.addItem',
|
|
47
|
+
description: 'Add item to cart',
|
|
47
48
|
impl: (_state, events) => {
|
|
48
49
|
const addEvents = events.filter(AddToCart.is);
|
|
49
50
|
return addEvents.map((event) =>
|
|
@@ -57,8 +58,8 @@ const addToCartRule = defineRule<CartContext>({
|
|
|
57
58
|
});
|
|
58
59
|
|
|
59
60
|
const removeFromCartRule = defineRule<CartContext>({
|
|
60
|
-
id:
|
|
61
|
-
description:
|
|
61
|
+
id: 'cart.removeItem',
|
|
62
|
+
description: 'Remove item from cart',
|
|
62
63
|
impl: (_state, events) => {
|
|
63
64
|
const removeEvent = findEvent(events, RemoveFromCart);
|
|
64
65
|
if (!removeEvent) {
|
|
@@ -69,8 +70,8 @@ const removeFromCartRule = defineRule<CartContext>({
|
|
|
69
70
|
});
|
|
70
71
|
|
|
71
72
|
const applyDiscountRule = defineRule<CartContext>({
|
|
72
|
-
id:
|
|
73
|
-
description:
|
|
73
|
+
id: 'cart.applyDiscount',
|
|
74
|
+
description: 'Apply discount code',
|
|
74
75
|
impl: (state, events) => {
|
|
75
76
|
const discountEvent = findEvent(events, ApplyDiscount);
|
|
76
77
|
if (!discountEvent || state.context.discountApplied) {
|
|
@@ -78,7 +79,7 @@ const applyDiscountRule = defineRule<CartContext>({
|
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
// Simple discount logic: "SAVE10" = 10% off
|
|
81
|
-
const percentage = discountEvent.payload.code ===
|
|
82
|
+
const percentage = discountEvent.payload.code === 'SAVE10' ? 10 : 0;
|
|
82
83
|
if (percentage > 0) {
|
|
83
84
|
return [DiscountApplied.create({ percentage })];
|
|
84
85
|
}
|
|
@@ -87,8 +88,8 @@ const applyDiscountRule = defineRule<CartContext>({
|
|
|
87
88
|
});
|
|
88
89
|
|
|
89
90
|
const clearCartRule = defineRule<CartContext>({
|
|
90
|
-
id:
|
|
91
|
-
description:
|
|
91
|
+
id: 'cart.clear',
|
|
92
|
+
description: 'Clear cart',
|
|
92
93
|
impl: (_state, events) => {
|
|
93
94
|
const clearEvent = findEvent(events, ClearCart);
|
|
94
95
|
if (!clearEvent) {
|
|
@@ -99,8 +100,8 @@ const clearCartRule = defineRule<CartContext>({
|
|
|
99
100
|
});
|
|
100
101
|
|
|
101
102
|
const updateCartContextRule = defineRule<CartContext>({
|
|
102
|
-
id:
|
|
103
|
-
description:
|
|
103
|
+
id: 'cart.updateContext',
|
|
104
|
+
description: 'Update cart context based on facts',
|
|
104
105
|
impl: (state, _events) => {
|
|
105
106
|
const addedItems = filterFacts(state.facts, ItemAdded);
|
|
106
107
|
const removedItems = filterFacts(state.facts, ItemRemoved);
|
|
@@ -145,10 +146,7 @@ const updateCartContextRule = defineRule<CartContext>({
|
|
|
145
146
|
}));
|
|
146
147
|
|
|
147
148
|
// Calculate total
|
|
148
|
-
let total = state.context.items.reduce(
|
|
149
|
-
(sum, item) => sum + item.quantity * item.price,
|
|
150
|
-
0
|
|
151
|
-
);
|
|
149
|
+
let total = state.context.items.reduce((sum, item) => sum + item.quantity * item.price, 0);
|
|
152
150
|
|
|
153
151
|
// Apply discount if any
|
|
154
152
|
if (discountFacts.length > 0) {
|
|
@@ -165,8 +163,8 @@ const updateCartContextRule = defineRule<CartContext>({
|
|
|
165
163
|
|
|
166
164
|
// Define constraints
|
|
167
165
|
const maxItemsConstraint = defineConstraint<CartContext>({
|
|
168
|
-
id:
|
|
169
|
-
description:
|
|
166
|
+
id: 'cart.maxItems',
|
|
167
|
+
description: 'Cart cannot exceed 100 items',
|
|
170
168
|
impl: (state) => {
|
|
171
169
|
const totalQuantity = state.context.items.reduce((sum, item) => sum + item.quantity, 0);
|
|
172
170
|
return totalQuantity <= 100 || `Cart has ${totalQuantity} items, maximum is 100`;
|
|
@@ -174,10 +172,12 @@ const maxItemsConstraint = defineConstraint<CartContext>({
|
|
|
174
172
|
});
|
|
175
173
|
|
|
176
174
|
const maxTotalConstraint = defineConstraint<CartContext>({
|
|
177
|
-
id:
|
|
178
|
-
description:
|
|
175
|
+
id: 'cart.maxTotal',
|
|
176
|
+
description: 'Cart total cannot exceed $10,000',
|
|
179
177
|
impl: (state) => {
|
|
180
|
-
return
|
|
178
|
+
return (
|
|
179
|
+
state.context.total <= 10000 || `Cart total $${state.context.total} exceeds maximum $10,000`
|
|
180
|
+
);
|
|
181
181
|
},
|
|
182
182
|
});
|
|
183
183
|
|
|
@@ -191,7 +191,7 @@ const cartModule = defineModule<CartContext>({
|
|
|
191
191
|
updateCartContextRule,
|
|
192
192
|
],
|
|
193
193
|
constraints: [maxItemsConstraint, maxTotalConstraint],
|
|
194
|
-
meta: { version:
|
|
194
|
+
meta: { version: '1.0.0' },
|
|
195
195
|
});
|
|
196
196
|
|
|
197
197
|
// Create and configure the engine
|
|
@@ -213,41 +213,41 @@ function createCartEngine() {
|
|
|
213
213
|
|
|
214
214
|
// Example usage
|
|
215
215
|
function runExample() {
|
|
216
|
-
console.log(
|
|
216
|
+
console.log('=== Cart Example ===\n');
|
|
217
217
|
|
|
218
218
|
const engine = createCartEngine();
|
|
219
219
|
|
|
220
220
|
// Add items
|
|
221
|
-
console.log(
|
|
221
|
+
console.log('1. Add items to cart:');
|
|
222
222
|
engine.step([
|
|
223
|
-
AddToCart.create({ productId:
|
|
224
|
-
AddToCart.create({ productId:
|
|
223
|
+
AddToCart.create({ productId: 'prod-1', quantity: 2, price: 29.99 }),
|
|
224
|
+
AddToCart.create({ productId: 'prod-2', quantity: 1, price: 49.99 }),
|
|
225
225
|
]);
|
|
226
|
-
console.log(
|
|
226
|
+
console.log(' Cart:', engine.getContext());
|
|
227
227
|
console.log();
|
|
228
228
|
|
|
229
229
|
// Apply discount
|
|
230
|
-
console.log(
|
|
231
|
-
engine.step([ApplyDiscount.create({ code:
|
|
232
|
-
console.log(
|
|
230
|
+
console.log('2. Apply discount code:');
|
|
231
|
+
engine.step([ApplyDiscount.create({ code: 'SAVE10' })]);
|
|
232
|
+
console.log(' Cart:', engine.getContext());
|
|
233
233
|
console.log();
|
|
234
234
|
|
|
235
235
|
// Remove item
|
|
236
|
-
console.log(
|
|
237
|
-
engine.step([RemoveFromCart.create({ productId:
|
|
238
|
-
console.log(
|
|
236
|
+
console.log('3. Remove an item:');
|
|
237
|
+
engine.step([RemoveFromCart.create({ productId: 'prod-1' })]);
|
|
238
|
+
console.log(' Cart:', engine.getContext());
|
|
239
239
|
console.log();
|
|
240
240
|
|
|
241
241
|
// Add more items
|
|
242
|
-
console.log(
|
|
243
|
-
engine.step([AddToCart.create({ productId:
|
|
244
|
-
console.log(
|
|
242
|
+
console.log('4. Add more items:');
|
|
243
|
+
engine.step([AddToCart.create({ productId: 'prod-3', quantity: 3, price: 15.99 })]);
|
|
244
|
+
console.log(' Cart:', engine.getContext());
|
|
245
245
|
console.log();
|
|
246
246
|
|
|
247
247
|
// Clear cart
|
|
248
|
-
console.log(
|
|
248
|
+
console.log('5. Clear cart:');
|
|
249
249
|
engine.step([ClearCart.create({})]);
|
|
250
|
-
console.log(
|
|
250
|
+
console.log(' Cart:', engine.getContext());
|
|
251
251
|
console.log();
|
|
252
252
|
}
|
|
253
253
|
|