@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
|
@@ -10,18 +10,18 @@ flowchart LR
|
|
|
10
10
|
PSF[schema.psf.json]
|
|
11
11
|
TS[TypeScript Files]
|
|
12
12
|
end
|
|
13
|
-
|
|
13
|
+
|
|
14
14
|
subgraph Sync["Sync Engine"]
|
|
15
15
|
Parser[PSF Parser]
|
|
16
16
|
Generator[Code Generator]
|
|
17
17
|
Watcher[File Watcher]
|
|
18
18
|
end
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
subgraph Canvas["CodeCanvas (Visual)"]
|
|
21
21
|
Visual[Visual Editor]
|
|
22
22
|
Preview[Live Preview]
|
|
23
23
|
end
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
PSF <--> Parser
|
|
26
26
|
Parser <--> Visual
|
|
27
27
|
Visual --> Generator
|
|
@@ -48,6 +48,7 @@ flowchart LR
|
|
|
48
48
|
### Hybrid Workflow
|
|
49
49
|
|
|
50
50
|
Work in both modes simultaneously:
|
|
51
|
+
|
|
51
52
|
- Use Canvas for visual design and high-level structure
|
|
52
53
|
- Use code editor for detailed logic and fine-tuning
|
|
53
54
|
- Changes sync automatically in both directions
|
|
@@ -75,23 +76,23 @@ export const config: CanvasConfig = {
|
|
|
75
76
|
sync: {
|
|
76
77
|
// Enable bidirectional sync
|
|
77
78
|
enabled: true,
|
|
78
|
-
|
|
79
|
+
|
|
79
80
|
// Watch for file changes
|
|
80
81
|
watchFiles: true,
|
|
81
|
-
|
|
82
|
+
|
|
82
83
|
// Debounce time for file changes (ms)
|
|
83
84
|
debounce: 500,
|
|
84
|
-
|
|
85
|
+
|
|
85
86
|
// How to handle conflicts
|
|
86
|
-
conflictResolution: 'ask',
|
|
87
|
-
|
|
87
|
+
conflictResolution: 'ask', // 'ask' | 'canvas' | 'code' | 'merge'
|
|
88
|
+
|
|
88
89
|
// Auto-regenerate code on Canvas changes
|
|
89
90
|
autoGenerate: true,
|
|
90
|
-
|
|
91
|
+
|
|
91
92
|
// Files to generate
|
|
92
93
|
generateTargets: ['types', 'components', 'docs'],
|
|
93
94
|
},
|
|
94
|
-
|
|
95
|
+
|
|
95
96
|
// Code generation settings
|
|
96
97
|
generation: {
|
|
97
98
|
output: './src/generated',
|
|
@@ -109,11 +110,13 @@ export const config: CanvasConfig = {
|
|
|
109
110
|
With `watchFiles: true`, changes sync in real-time:
|
|
110
111
|
|
|
111
112
|
**Code → Canvas:**
|
|
113
|
+
|
|
112
114
|
- Edit `schema.psf.json` in VS Code
|
|
113
115
|
- Save the file
|
|
114
116
|
- Canvas updates within 500ms (configurable debounce)
|
|
115
117
|
|
|
116
118
|
**Canvas → Code:**
|
|
119
|
+
|
|
117
120
|
- Make changes in Canvas visual editor
|
|
118
121
|
- Click "Save" or auto-save triggers
|
|
119
122
|
- `schema.psf.json` updates immediately
|
|
@@ -140,18 +143,21 @@ Shows a dialog to choose which version to keep:
|
|
|
140
143
|
#### `'canvas'`
|
|
141
144
|
|
|
142
145
|
Canvas changes always win:
|
|
146
|
+
|
|
143
147
|
- Canvas overwrites code changes
|
|
144
148
|
- Safe when primarily designing visually
|
|
145
149
|
|
|
146
150
|
#### `'code'`
|
|
147
151
|
|
|
148
152
|
Code changes always win:
|
|
153
|
+
|
|
149
154
|
- Code overwrites Canvas changes
|
|
150
155
|
- Safe when primarily coding
|
|
151
156
|
|
|
152
157
|
#### `'merge'`
|
|
153
158
|
|
|
154
159
|
Attempts to merge changes:
|
|
160
|
+
|
|
155
161
|
- Works for independent changes (different models, components)
|
|
156
162
|
- Conflicts still require manual resolution
|
|
157
163
|
|
|
@@ -235,7 +241,7 @@ canvas.on('sync:complete', (result) => {
|
|
|
235
241
|
canvas.on('sync:conflict', (conflict) => {
|
|
236
242
|
console.log('Conflict:', conflict);
|
|
237
243
|
// Handle conflict programmatically
|
|
238
|
-
conflict.resolve('canvas');
|
|
244
|
+
conflict.resolve('canvas'); // or 'code' or custom merge
|
|
239
245
|
});
|
|
240
246
|
```
|
|
241
247
|
|
|
@@ -319,11 +325,13 @@ When merging branches with schema changes:
|
|
|
319
325
|
Choose whether to commit generated files:
|
|
320
326
|
|
|
321
327
|
**Commit generated files:**
|
|
328
|
+
|
|
322
329
|
- ✅ Works without build step
|
|
323
330
|
- ✅ Code review shows generated changes
|
|
324
331
|
- ❌ More merge conflicts
|
|
325
332
|
|
|
326
333
|
**.gitignore generated files:**
|
|
334
|
+
|
|
327
335
|
- ✅ Cleaner commits
|
|
328
336
|
- ✅ Fewer conflicts
|
|
329
337
|
- ❌ Requires build step
|
|
@@ -365,11 +373,13 @@ Add to your project README:
|
|
|
365
373
|
## Development
|
|
366
374
|
|
|
367
375
|
### Visual Development
|
|
376
|
+
|
|
368
377
|
\`\`\`bash
|
|
369
378
|
praxis canvas ./src/schema.psf.json
|
|
370
379
|
\`\`\`
|
|
371
380
|
|
|
372
381
|
### Code Generation
|
|
382
|
+
|
|
373
383
|
\`\`\`bash
|
|
374
384
|
praxis generate --schema ./src/schema.psf.json
|
|
375
385
|
\`\`\`
|
|
@@ -380,11 +390,13 @@ praxis generate --schema ./src/schema.psf.json
|
|
|
380
390
|
### Sync Not Working
|
|
381
391
|
|
|
382
392
|
1. **Check Canvas is running:**
|
|
393
|
+
|
|
383
394
|
```bash
|
|
384
395
|
praxis canvas status
|
|
385
396
|
```
|
|
386
397
|
|
|
387
398
|
2. **Check file watcher:**
|
|
399
|
+
|
|
388
400
|
```bash
|
|
389
401
|
praxis canvas --debug
|
|
390
402
|
```
|
|
@@ -427,15 +439,15 @@ const handler = createSyncHandler({
|
|
|
427
439
|
// Called when code changes
|
|
428
440
|
onCodeChange: async (schema) => {
|
|
429
441
|
// Custom logic before Canvas update
|
|
430
|
-
return schema;
|
|
442
|
+
return schema; // Transformed schema
|
|
431
443
|
},
|
|
432
|
-
|
|
444
|
+
|
|
433
445
|
// Called when Canvas changes
|
|
434
446
|
onCanvasChange: async (schema) => {
|
|
435
447
|
// Custom logic before code update
|
|
436
|
-
return schema;
|
|
448
|
+
return schema; // Transformed schema
|
|
437
449
|
},
|
|
438
|
-
|
|
450
|
+
|
|
439
451
|
// Custom conflict resolution
|
|
440
452
|
onConflict: async (local, remote) => {
|
|
441
453
|
// Return merged schema
|
|
@@ -457,7 +469,7 @@ const watcher = createPSFWatcher('./schema.psf.json');
|
|
|
457
469
|
watcher.on('change', async (schema) => {
|
|
458
470
|
// Update external system (e.g., database, API)
|
|
459
471
|
await updateExternalSystem(schema);
|
|
460
|
-
|
|
472
|
+
|
|
461
473
|
// Notify other tools
|
|
462
474
|
eventBus.emit('schema-updated', schema);
|
|
463
475
|
});
|
|
@@ -12,7 +12,9 @@ Facts are typed propositions about your domain. They represent "what is true" or
|
|
|
12
12
|
import { defineFact } from '@plures/praxis';
|
|
13
13
|
|
|
14
14
|
// Define a fact type
|
|
15
|
-
const UserLoggedIn = defineFact<'UserLoggedIn', { userId: string; timestamp: number }>(
|
|
15
|
+
const UserLoggedIn = defineFact<'UserLoggedIn', { userId: string; timestamp: number }>(
|
|
16
|
+
'UserLoggedIn'
|
|
17
|
+
);
|
|
16
18
|
|
|
17
19
|
// Create a fact instance
|
|
18
20
|
const fact = UserLoggedIn.create({ userId: 'user-123', timestamp: Date.now() });
|
|
@@ -25,12 +27,12 @@ if (UserLoggedIn.is(someFact)) {
|
|
|
25
27
|
|
|
26
28
|
#### Fact Properties
|
|
27
29
|
|
|
28
|
-
| Property
|
|
29
|
-
|
|
30
|
-
| `tag`
|
|
31
|
-
| `payload`
|
|
32
|
-
| `timestamp` | number | When the fact was created
|
|
33
|
-
| `metadata`
|
|
30
|
+
| Property | Type | Description |
|
|
31
|
+
| ----------- | ------ | ----------------------------------- |
|
|
32
|
+
| `tag` | string | Unique identifier for the fact type |
|
|
33
|
+
| `payload` | object | Data associated with the fact |
|
|
34
|
+
| `timestamp` | number | When the fact was created |
|
|
35
|
+
| `metadata` | object | Optional additional metadata |
|
|
34
36
|
|
|
35
37
|
### Events
|
|
36
38
|
|
|
@@ -62,39 +64,41 @@ const loginRule = defineRule<AuthContext>({
|
|
|
62
64
|
impl: (state, events) => {
|
|
63
65
|
const loginEvent = events.find(Login.is);
|
|
64
66
|
if (!loginEvent) return [];
|
|
65
|
-
|
|
67
|
+
|
|
66
68
|
// Validate credentials (pure logic only)
|
|
67
|
-
const user = state.context.users.find(u =>
|
|
68
|
-
|
|
69
|
-
);
|
|
70
|
-
|
|
69
|
+
const user = state.context.users.find((u) => u.username === loginEvent.payload.username);
|
|
70
|
+
|
|
71
71
|
if (user) {
|
|
72
72
|
// Modify state (within the pure function)
|
|
73
73
|
state.context.currentUser = user;
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
// Return facts to emit
|
|
76
|
-
return [
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
return [
|
|
77
|
+
UserLoggedIn.create({
|
|
78
|
+
userId: user.id,
|
|
79
|
+
timestamp: Date.now(),
|
|
80
|
+
}),
|
|
81
|
+
];
|
|
80
82
|
}
|
|
81
|
-
|
|
82
|
-
return [
|
|
83
|
-
|
|
84
|
-
|
|
83
|
+
|
|
84
|
+
return [
|
|
85
|
+
LoginFailed.create({
|
|
86
|
+
reason: 'Invalid credentials',
|
|
87
|
+
}),
|
|
88
|
+
];
|
|
85
89
|
},
|
|
86
90
|
});
|
|
87
91
|
```
|
|
88
92
|
|
|
89
93
|
#### Rule Properties
|
|
90
94
|
|
|
91
|
-
| Property
|
|
92
|
-
|
|
93
|
-
| `id`
|
|
94
|
-
| `description` | string
|
|
95
|
-
| `impl`
|
|
96
|
-
| `priority`
|
|
97
|
-
| `triggers`
|
|
95
|
+
| Property | Type | Required | Description |
|
|
96
|
+
| ------------- | -------- | -------- | ----------------------------------- |
|
|
97
|
+
| `id` | string | Yes | Unique rule identifier |
|
|
98
|
+
| `description` | string | Yes | What the rule does |
|
|
99
|
+
| `impl` | function | Yes | Pure function implementation |
|
|
100
|
+
| `priority` | number | No | Execution order (higher = first) |
|
|
101
|
+
| `triggers` | string[] | No | Event types that activate this rule |
|
|
98
102
|
|
|
99
103
|
### Constraints
|
|
100
104
|
|
|
@@ -114,13 +118,13 @@ const positiveBalance = defineConstraint<BankContext>({
|
|
|
114
118
|
|
|
115
119
|
#### Constraint Properties
|
|
116
120
|
|
|
117
|
-
| Property
|
|
118
|
-
|
|
119
|
-
| `id`
|
|
120
|
-
| `description`
|
|
121
|
-
| `check`
|
|
122
|
-
| `errorMessage` | string
|
|
123
|
-
| `severity`
|
|
121
|
+
| Property | Type | Required | Description |
|
|
122
|
+
| -------------- | -------- | -------- | ---------------------------- |
|
|
123
|
+
| `id` | string | Yes | Unique constraint identifier |
|
|
124
|
+
| `description` | string | Yes | What the constraint ensures |
|
|
125
|
+
| `check` | function | Yes | Returns true if valid |
|
|
126
|
+
| `errorMessage` | string | Yes | Error when violated |
|
|
127
|
+
| `severity` | string | Yes | `error` or `warning` |
|
|
124
128
|
|
|
125
129
|
## Creating an Engine
|
|
126
130
|
|
|
@@ -155,20 +159,20 @@ const engine = createPraxisEngine({
|
|
|
155
159
|
const engine = createPraxisEngine({
|
|
156
160
|
// Required: Initial application state
|
|
157
161
|
initialContext: { count: 0 },
|
|
158
|
-
|
|
162
|
+
|
|
159
163
|
// Required: Registry with rules and constraints
|
|
160
164
|
registry,
|
|
161
|
-
|
|
165
|
+
|
|
162
166
|
// Optional: Enable history for undo/redo
|
|
163
167
|
enableHistory: true,
|
|
164
168
|
maxHistorySize: 100,
|
|
165
|
-
|
|
169
|
+
|
|
166
170
|
// Optional: Custom reducer for state transitions
|
|
167
171
|
reducer: (state, event) => {
|
|
168
172
|
// Custom state transition logic
|
|
169
173
|
return state;
|
|
170
174
|
},
|
|
171
|
-
|
|
175
|
+
|
|
172
176
|
// Optional: Middleware
|
|
173
177
|
middleware: [
|
|
174
178
|
(state, events, next) => {
|
|
@@ -176,7 +180,7 @@ const engine = createPraxisEngine({
|
|
|
176
180
|
const result = next(state, events);
|
|
177
181
|
console.log('After:', result);
|
|
178
182
|
return result;
|
|
179
|
-
}
|
|
183
|
+
},
|
|
180
184
|
],
|
|
181
185
|
});
|
|
182
186
|
```
|
|
@@ -207,20 +211,20 @@ For more control, use the step function directly:
|
|
|
207
211
|
```typescript
|
|
208
212
|
const result = engine.step([Login.create({ username: 'alice', password: 'secret' })]);
|
|
209
213
|
|
|
210
|
-
console.log(result.state.context);
|
|
211
|
-
console.log(result.state.facts);
|
|
212
|
-
console.log(result.effects);
|
|
213
|
-
console.log(result.violations);
|
|
214
|
+
console.log(result.state.context); // Updated context
|
|
215
|
+
console.log(result.state.facts); // Emitted facts
|
|
216
|
+
console.log(result.effects); // Side effects to execute
|
|
217
|
+
console.log(result.violations); // Constraint violations
|
|
214
218
|
```
|
|
215
219
|
|
|
216
220
|
### Step Result
|
|
217
221
|
|
|
218
|
-
| Property
|
|
219
|
-
|
|
222
|
+
| Property | Type | Description |
|
|
223
|
+
| --------------- | ------ | ------------------------- |
|
|
220
224
|
| `state.context` | object | Updated application state |
|
|
221
|
-
| `state.facts`
|
|
222
|
-
| `effects`
|
|
223
|
-
| `violations`
|
|
225
|
+
| `state.facts` | array | Facts emitted by rules |
|
|
226
|
+
| `effects` | array | Side effects to execute |
|
|
227
|
+
| `violations` | array | Constraint violations |
|
|
224
228
|
|
|
225
229
|
## State Management
|
|
226
230
|
|
|
@@ -233,9 +237,9 @@ const state1 = engine.getState();
|
|
|
233
237
|
engine.dispatch([Increment.create({})]);
|
|
234
238
|
const state2 = engine.getState();
|
|
235
239
|
|
|
236
|
-
console.log(state1 === state2);
|
|
237
|
-
console.log(state1.context.count);
|
|
238
|
-
console.log(state2.context.count);
|
|
240
|
+
console.log(state1 === state2); // false
|
|
241
|
+
console.log(state1.context.count); // 0
|
|
242
|
+
console.log(state2.context.count); // 1
|
|
239
243
|
```
|
|
240
244
|
|
|
241
245
|
### Subscriptions
|
|
@@ -263,18 +267,18 @@ const engine = createPraxisEngine({
|
|
|
263
267
|
enableHistory: true,
|
|
264
268
|
});
|
|
265
269
|
|
|
266
|
-
engine.dispatch([Increment.create({})]);
|
|
267
|
-
engine.dispatch([Increment.create({})]);
|
|
270
|
+
engine.dispatch([Increment.create({})]); // count: 1
|
|
271
|
+
engine.dispatch([Increment.create({})]); // count: 2
|
|
268
272
|
|
|
269
|
-
engine.undo();
|
|
270
|
-
engine.redo();
|
|
273
|
+
engine.undo(); // count: 1
|
|
274
|
+
engine.redo(); // count: 2
|
|
271
275
|
|
|
272
276
|
// Access history
|
|
273
277
|
const snapshots = engine.getSnapshots();
|
|
274
|
-
console.log(snapshots.length);
|
|
278
|
+
console.log(snapshots.length); // 3 (initial + 2 changes)
|
|
275
279
|
|
|
276
280
|
// Go to specific snapshot
|
|
277
|
-
engine.goToSnapshot(0);
|
|
281
|
+
engine.goToSnapshot(0); // count: 0
|
|
278
282
|
```
|
|
279
283
|
|
|
280
284
|
## Rule Execution
|
|
@@ -318,7 +322,7 @@ Facts emitted by rules can trigger other rules:
|
|
|
318
322
|
const loginRule = defineRule({
|
|
319
323
|
id: 'auth.login',
|
|
320
324
|
triggers: ['LOGIN'],
|
|
321
|
-
impl: (state, events) => [UserLoggedIn.create({ userId: '123' })]
|
|
325
|
+
impl: (state, events) => [UserLoggedIn.create({ userId: '123' })],
|
|
322
326
|
});
|
|
323
327
|
|
|
324
328
|
// Rule 2: UserLoggedIn triggers welcome notification
|
|
@@ -326,12 +330,12 @@ const welcomeRule = defineRule({
|
|
|
326
330
|
id: 'notify.welcome',
|
|
327
331
|
impl: (state, events) => {
|
|
328
332
|
// This runs after loginRule because facts are processed
|
|
329
|
-
const loggedIn = state.facts.find(f => f.tag === 'UserLoggedIn');
|
|
333
|
+
const loggedIn = state.facts.find((f) => f.tag === 'UserLoggedIn');
|
|
330
334
|
if (loggedIn) {
|
|
331
335
|
return [ShowNotification.create({ message: 'Welcome!' })];
|
|
332
336
|
}
|
|
333
337
|
return [];
|
|
334
|
-
}
|
|
338
|
+
},
|
|
335
339
|
});
|
|
336
340
|
```
|
|
337
341
|
|
|
@@ -358,14 +362,14 @@ if (result.violations.length > 0) {
|
|
|
358
362
|
```typescript
|
|
359
363
|
const softConstraint = defineConstraint({
|
|
360
364
|
id: 'warn.lowBalance',
|
|
361
|
-
severity: 'warning',
|
|
365
|
+
severity: 'warning', // Allows state change, logs warning
|
|
362
366
|
check: (state) => state.context.balance > 100,
|
|
363
367
|
errorMessage: 'Balance is getting low',
|
|
364
368
|
});
|
|
365
369
|
|
|
366
370
|
const hardConstraint = defineConstraint({
|
|
367
371
|
id: 'error.overdraft',
|
|
368
|
-
severity: 'error',
|
|
372
|
+
severity: 'error', // Prevents state change
|
|
369
373
|
check: (state) => state.context.balance >= 0,
|
|
370
374
|
errorMessage: 'Insufficient funds',
|
|
371
375
|
});
|
|
@@ -410,7 +414,7 @@ for (const fact of result.state.facts) {
|
|
|
410
414
|
```typescript
|
|
411
415
|
// Get all registered rules
|
|
412
416
|
const rules = registry.getRules();
|
|
413
|
-
console.log(rules.map(r => r.id));
|
|
417
|
+
console.log(rules.map((r) => r.id));
|
|
414
418
|
|
|
415
419
|
// Get all constraints
|
|
416
420
|
const constraints = registry.getConstraints();
|
|
@@ -447,12 +451,7 @@ For isolated stateful units:
|
|
|
447
451
|
```typescript
|
|
448
452
|
import { createActor, createActorSystem } from '@plures/praxis';
|
|
449
453
|
|
|
450
|
-
const counterActor = createActor(
|
|
451
|
-
'counter-1',
|
|
452
|
-
{ count: 0 },
|
|
453
|
-
counterStepFunction,
|
|
454
|
-
'counter'
|
|
455
|
-
);
|
|
454
|
+
const counterActor = createActor('counter-1', { count: 0 }, counterStepFunction, 'counter');
|
|
456
455
|
|
|
457
456
|
const system = createActorSystem();
|
|
458
457
|
system.register(counterActor);
|
|
@@ -495,16 +494,16 @@ Rules should have no side effects:
|
|
|
495
494
|
// ❌ Bad: Side effect in rule
|
|
496
495
|
const badRule = defineRule({
|
|
497
496
|
impl: (state, events) => {
|
|
498
|
-
fetch('/api/data');
|
|
497
|
+
fetch('/api/data'); // Side effect!
|
|
499
498
|
return [];
|
|
500
|
-
}
|
|
499
|
+
},
|
|
501
500
|
});
|
|
502
501
|
|
|
503
502
|
// ✅ Good: Return effect descriptor
|
|
504
503
|
const goodRule = defineRule({
|
|
505
504
|
impl: (state, events) => {
|
|
506
505
|
return [FetchDataRequested.create({ url: '/api/data' })];
|
|
507
|
-
}
|
|
506
|
+
},
|
|
508
507
|
});
|
|
509
508
|
```
|
|
510
509
|
|
|
@@ -534,7 +533,7 @@ const typedRule = defineRule<AppContext>({
|
|
|
534
533
|
// TypeScript knows the shape of state.context
|
|
535
534
|
const user = state.context.user;
|
|
536
535
|
return [];
|
|
537
|
-
}
|
|
536
|
+
},
|
|
538
537
|
});
|
|
539
538
|
```
|
|
540
539
|
|
|
@@ -549,14 +548,10 @@ describe('Login Rule', () => {
|
|
|
549
548
|
initialContext: { users: [{ username: 'alice', id: '1' }] },
|
|
550
549
|
registry,
|
|
551
550
|
});
|
|
552
|
-
|
|
553
|
-
const result = engine.step([
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
expect(result.state.facts).toContainEqual(
|
|
558
|
-
expect.objectContaining({ tag: 'UserLoggedIn' })
|
|
559
|
-
);
|
|
551
|
+
|
|
552
|
+
const result = engine.step([Login.create({ username: 'alice', password: 'valid' })]);
|
|
553
|
+
|
|
554
|
+
expect(result.state.facts).toContainEqual(expect.objectContaining({ tag: 'UserLoggedIn' }));
|
|
560
555
|
});
|
|
561
556
|
});
|
|
562
557
|
```
|
|
@@ -5,6 +5,7 @@ PluresDB is Praxis's local-first reactive datastore. This document explains how
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
7
|
PluresDB provides:
|
|
8
|
+
|
|
8
9
|
- **Local-first storage**: Data lives on the device
|
|
9
10
|
- **Reactive queries**: Automatic UI updates on data changes
|
|
10
11
|
- **Sync**: Automatic synchronization when connected
|
|
@@ -17,18 +18,18 @@ flowchart TB
|
|
|
17
18
|
Engine[Logic Engine]
|
|
18
19
|
UI[UI Components]
|
|
19
20
|
end
|
|
20
|
-
|
|
21
|
+
|
|
21
22
|
subgraph PluresDB["PluresDB"]
|
|
22
23
|
Local[(Local Store)]
|
|
23
24
|
Sync[Sync Engine]
|
|
24
25
|
CRDT[CRDT Resolver]
|
|
25
26
|
end
|
|
26
|
-
|
|
27
|
+
|
|
27
28
|
subgraph Cloud["Praxis Cloud"]
|
|
28
29
|
Relay[Relay Server]
|
|
29
30
|
Remote[(Remote Store)]
|
|
30
31
|
end
|
|
31
|
-
|
|
32
|
+
|
|
32
33
|
Engine <--> Local
|
|
33
34
|
UI <--> Local
|
|
34
35
|
Local <--> Sync
|
|
@@ -57,18 +58,18 @@ import { createPluresDB } from '@plures/praxis';
|
|
|
57
58
|
const db = createPluresDB({
|
|
58
59
|
// Database name (stored in IndexedDB)
|
|
59
60
|
name: 'my-app-db',
|
|
60
|
-
|
|
61
|
+
|
|
61
62
|
// Schema version (increment to migrate)
|
|
62
63
|
version: 1,
|
|
63
|
-
|
|
64
|
+
|
|
64
65
|
// Collections to create
|
|
65
66
|
collections: ['users', 'posts', 'comments'],
|
|
66
|
-
|
|
67
|
+
|
|
67
68
|
// Sync configuration (optional)
|
|
68
69
|
sync: {
|
|
69
70
|
enabled: true,
|
|
70
71
|
endpoint: 'https://your-sync-server.com',
|
|
71
|
-
interval: 5000,
|
|
72
|
+
interval: 5000, // ms
|
|
72
73
|
},
|
|
73
74
|
});
|
|
74
75
|
```
|
|
@@ -167,10 +168,7 @@ await db.users.updateById('user-123', {
|
|
|
167
168
|
});
|
|
168
169
|
|
|
169
170
|
// Update matching documents
|
|
170
|
-
await db.users.updateMany(
|
|
171
|
-
{ role: 'guest' },
|
|
172
|
-
{ $set: { active: false } }
|
|
173
|
-
);
|
|
171
|
+
await db.users.updateMany({ role: 'guest' }, { $set: { active: false } });
|
|
174
172
|
|
|
175
173
|
// Replace document
|
|
176
174
|
await db.users.replaceById('user-123', {
|
|
@@ -199,7 +197,7 @@ PluresDB queries are reactive - they automatically update when data changes.
|
|
|
199
197
|
```typescript
|
|
200
198
|
// Subscribe to all users
|
|
201
199
|
const unsubscribe = db.users.subscribe(
|
|
202
|
-
{},
|
|
200
|
+
{}, // Query
|
|
203
201
|
(users) => {
|
|
204
202
|
console.log('Users updated:', users);
|
|
205
203
|
}
|
|
@@ -214,10 +212,10 @@ unsubscribe();
|
|
|
214
212
|
```svelte
|
|
215
213
|
<script lang="ts">
|
|
216
214
|
import { db } from '../db';
|
|
217
|
-
|
|
215
|
+
|
|
218
216
|
// Reactive query as a store
|
|
219
217
|
const users = db.users.query({});
|
|
220
|
-
|
|
218
|
+
|
|
221
219
|
// Derived query
|
|
222
220
|
const activeUsers = db.users.query({ active: true });
|
|
223
221
|
</script>
|
|
@@ -351,10 +349,10 @@ const db = createPluresDB({
|
|
|
351
349
|
name: 'documents',
|
|
352
350
|
schema: {
|
|
353
351
|
id: { type: 'uuid' },
|
|
354
|
-
title: { type: 'string', crdt: 'lww' },
|
|
355
|
-
content: { type: 'string', crdt: 'rga' },
|
|
356
|
-
tags: { type: 'array', crdt: 'or-set' },
|
|
357
|
-
viewCount: { type: 'number', crdt: 'counter' },
|
|
352
|
+
title: { type: 'string', crdt: 'lww' }, // Last-write-wins
|
|
353
|
+
content: { type: 'string', crdt: 'rga' }, // Sequence CRDT
|
|
354
|
+
tags: { type: 'array', crdt: 'or-set' }, // Add-wins set
|
|
355
|
+
viewCount: { type: 'number', crdt: 'counter' }, // Counter
|
|
358
356
|
},
|
|
359
357
|
},
|
|
360
358
|
],
|
|
@@ -436,10 +434,7 @@ const db = createPluresDB({
|
|
|
436
434
|
const posts = await db.posts.find({ authorId: 'user-123' });
|
|
437
435
|
|
|
438
436
|
// Uses compound index
|
|
439
|
-
const recentPosts = await db.posts.find(
|
|
440
|
-
{ authorId: 'user-123' },
|
|
441
|
-
{ sort: { createdAt: -1 } }
|
|
442
|
-
);
|
|
437
|
+
const recentPosts = await db.posts.find({ authorId: 'user-123' }, { sort: { createdAt: -1 } });
|
|
443
438
|
|
|
444
439
|
// Uses multikey index for array
|
|
445
440
|
const taggedPosts = await db.posts.find({ tags: 'javascript' });
|
|
@@ -456,9 +451,7 @@ From your PSF schema:
|
|
|
456
451
|
"models": [
|
|
457
452
|
{
|
|
458
453
|
"name": "Post",
|
|
459
|
-
"fields": [
|
|
460
|
-
{ "name": "authorId", "type": "string" }
|
|
461
|
-
],
|
|
454
|
+
"fields": [{ "name": "authorId", "type": "string" }],
|
|
462
455
|
"relationships": [
|
|
463
456
|
{
|
|
464
457
|
"name": "author",
|
|
@@ -476,21 +469,15 @@ From your PSF schema:
|
|
|
476
469
|
|
|
477
470
|
```typescript
|
|
478
471
|
// Include related documents
|
|
479
|
-
const posts = await db.posts.find(
|
|
480
|
-
{},
|
|
481
|
-
{ include: ['author'] }
|
|
482
|
-
);
|
|
472
|
+
const posts = await db.posts.find({}, { include: ['author'] });
|
|
483
473
|
|
|
484
474
|
// Each post has author populated
|
|
485
|
-
posts.forEach(post => {
|
|
475
|
+
posts.forEach((post) => {
|
|
486
476
|
console.log(`${post.title} by ${post.author.username}`);
|
|
487
477
|
});
|
|
488
478
|
|
|
489
479
|
// Nested includes
|
|
490
|
-
const posts = await db.posts.find(
|
|
491
|
-
{},
|
|
492
|
-
{ include: ['author', 'comments.author'] }
|
|
493
|
-
);
|
|
480
|
+
const posts = await db.posts.find({}, { include: ['author', 'comments.author'] });
|
|
494
481
|
```
|
|
495
482
|
|
|
496
483
|
## Integration with Logic Engine
|
|
@@ -560,7 +547,7 @@ engine.subscribe((state) => {
|
|
|
560
547
|
```typescript
|
|
561
548
|
const db = createPluresDB({
|
|
562
549
|
name: 'my-app',
|
|
563
|
-
version: 2,
|
|
550
|
+
version: 2, // Increment version
|
|
564
551
|
collections: ['users', 'posts'],
|
|
565
552
|
migrations: [
|
|
566
553
|
{
|
|
@@ -578,9 +565,12 @@ const db = createPluresDB({
|
|
|
578
565
|
},
|
|
579
566
|
down: async (db) => {
|
|
580
567
|
// Rollback migration
|
|
581
|
-
await db.users.updateMany(
|
|
582
|
-
|
|
583
|
-
|
|
568
|
+
await db.users.updateMany(
|
|
569
|
+
{},
|
|
570
|
+
{
|
|
571
|
+
$unset: { role: true },
|
|
572
|
+
}
|
|
573
|
+
);
|
|
584
574
|
},
|
|
585
575
|
},
|
|
586
576
|
],
|
|
@@ -601,7 +591,7 @@ const db = createPluresDB({
|
|
|
601
591
|
username: { type: 'string', required: true },
|
|
602
592
|
email: { type: 'string', required: true, unique: true },
|
|
603
593
|
},
|
|
604
|
-
validate: true,
|
|
594
|
+
validate: true, // Enable validation
|
|
605
595
|
},
|
|
606
596
|
],
|
|
607
597
|
});
|