@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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* PluresDB Integration Tests
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import { describe, it, expect, beforeEach } from
|
|
5
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
6
6
|
import {
|
|
7
7
|
createInMemoryDB,
|
|
8
8
|
InMemoryPraxisDB,
|
|
@@ -17,100 +17,100 @@ import {
|
|
|
17
17
|
getSchemaPath,
|
|
18
18
|
createPluresDBAdapter,
|
|
19
19
|
attachToEngine,
|
|
20
|
-
} from
|
|
21
|
-
import { PraxisRegistry } from
|
|
22
|
-
import { createPraxisEngine } from
|
|
23
|
-
import { defineRule, defineConstraint, defineFact, defineEvent } from
|
|
24
|
-
import type { PraxisSchema } from
|
|
20
|
+
} from '../integrations/pluresdb.js';
|
|
21
|
+
import { PraxisRegistry } from '../core/rules.js';
|
|
22
|
+
import { createPraxisEngine } from '../core/engine.js';
|
|
23
|
+
import { defineRule, defineConstraint, defineFact, defineEvent } from '../dsl/index.js';
|
|
24
|
+
import type { PraxisSchema } from '../core/schema/types.js';
|
|
25
25
|
|
|
26
|
-
describe(
|
|
26
|
+
describe('InMemoryPraxisDB', () => {
|
|
27
27
|
let db: InMemoryPraxisDB;
|
|
28
28
|
|
|
29
29
|
beforeEach(() => {
|
|
30
30
|
db = createInMemoryDB();
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
-
it(
|
|
34
|
-
await db.set(
|
|
35
|
-
const result = await db.get<{ value: number }>(
|
|
33
|
+
it('should get and set values', async () => {
|
|
34
|
+
await db.set('test-key', { value: 42 });
|
|
35
|
+
const result = await db.get<{ value: number }>('test-key');
|
|
36
36
|
expect(result).toEqual({ value: 42 });
|
|
37
37
|
});
|
|
38
38
|
|
|
39
|
-
it(
|
|
40
|
-
const result = await db.get(
|
|
39
|
+
it('should return undefined for missing keys', async () => {
|
|
40
|
+
const result = await db.get('nonexistent');
|
|
41
41
|
expect(result).toBeUndefined();
|
|
42
42
|
});
|
|
43
43
|
|
|
44
|
-
it(
|
|
44
|
+
it('should watch for changes', async () => {
|
|
45
45
|
const values: number[] = [];
|
|
46
|
-
|
|
47
|
-
db.watch<number>(
|
|
46
|
+
|
|
47
|
+
db.watch<number>('counter', (val) => {
|
|
48
48
|
values.push(val);
|
|
49
49
|
});
|
|
50
50
|
|
|
51
|
-
await db.set(
|
|
52
|
-
await db.set(
|
|
53
|
-
await db.set(
|
|
51
|
+
await db.set('counter', 1);
|
|
52
|
+
await db.set('counter', 2);
|
|
53
|
+
await db.set('counter', 3);
|
|
54
54
|
|
|
55
55
|
expect(values).toEqual([1, 2, 3]);
|
|
56
56
|
});
|
|
57
57
|
|
|
58
|
-
it(
|
|
58
|
+
it('should unsubscribe from watch', async () => {
|
|
59
59
|
const values: number[] = [];
|
|
60
|
-
|
|
61
|
-
const unsubscribe = db.watch<number>(
|
|
60
|
+
|
|
61
|
+
const unsubscribe = db.watch<number>('counter', (val) => {
|
|
62
62
|
values.push(val);
|
|
63
63
|
});
|
|
64
64
|
|
|
65
|
-
await db.set(
|
|
65
|
+
await db.set('counter', 1);
|
|
66
66
|
unsubscribe();
|
|
67
|
-
await db.set(
|
|
67
|
+
await db.set('counter', 2);
|
|
68
68
|
|
|
69
69
|
expect(values).toEqual([1]);
|
|
70
70
|
});
|
|
71
71
|
|
|
72
|
-
it(
|
|
73
|
-
await db.set(
|
|
74
|
-
await db.set(
|
|
75
|
-
|
|
72
|
+
it('should list keys', async () => {
|
|
73
|
+
await db.set('key1', 'value1');
|
|
74
|
+
await db.set('key2', 'value2');
|
|
75
|
+
|
|
76
76
|
const keys = db.keys();
|
|
77
|
-
expect(keys).toContain(
|
|
78
|
-
expect(keys).toContain(
|
|
77
|
+
expect(keys).toContain('key1');
|
|
78
|
+
expect(keys).toContain('key2');
|
|
79
79
|
});
|
|
80
80
|
|
|
81
|
-
it(
|
|
82
|
-
await db.set(
|
|
81
|
+
it('should clear all data', async () => {
|
|
82
|
+
await db.set('key1', 'value1');
|
|
83
83
|
db.clear();
|
|
84
|
-
|
|
85
|
-
const result = await db.get(
|
|
84
|
+
|
|
85
|
+
const result = await db.get('key1');
|
|
86
86
|
expect(result).toBeUndefined();
|
|
87
87
|
expect(db.keys()).toHaveLength(0);
|
|
88
88
|
});
|
|
89
89
|
});
|
|
90
90
|
|
|
91
|
-
describe(
|
|
92
|
-
it(
|
|
93
|
-
expect(getFactPath(
|
|
94
|
-
expect(getFactPath(
|
|
91
|
+
describe('Path generators', () => {
|
|
92
|
+
it('should generate fact paths', () => {
|
|
93
|
+
expect(getFactPath('UserLoggedIn')).toBe('/_praxis/facts/UserLoggedIn');
|
|
94
|
+
expect(getFactPath('UserLoggedIn', 'user-123')).toBe('/_praxis/facts/UserLoggedIn/user-123');
|
|
95
95
|
});
|
|
96
96
|
|
|
97
|
-
it(
|
|
98
|
-
expect(getEventPath(
|
|
97
|
+
it('should generate event paths', () => {
|
|
98
|
+
expect(getEventPath('LOGIN')).toBe('/_praxis/events/LOGIN');
|
|
99
99
|
});
|
|
100
100
|
|
|
101
|
-
it(
|
|
102
|
-
expect(getSchemaPath(
|
|
101
|
+
it('should generate schema paths', () => {
|
|
102
|
+
expect(getSchemaPath('MyApp')).toBe('/_praxis/schemas/MyApp');
|
|
103
103
|
});
|
|
104
104
|
|
|
105
|
-
it(
|
|
106
|
-
expect(PRAXIS_PATHS.BASE).toBe(
|
|
107
|
-
expect(PRAXIS_PATHS.FACTS).toBe(
|
|
108
|
-
expect(PRAXIS_PATHS.EVENTS).toBe(
|
|
109
|
-
expect(PRAXIS_PATHS.SCHEMAS).toBe(
|
|
105
|
+
it('should have correct PRAXIS_PATHS', () => {
|
|
106
|
+
expect(PRAXIS_PATHS.BASE).toBe('/_praxis');
|
|
107
|
+
expect(PRAXIS_PATHS.FACTS).toBe('/_praxis/facts');
|
|
108
|
+
expect(PRAXIS_PATHS.EVENTS).toBe('/_praxis/events');
|
|
109
|
+
expect(PRAXIS_PATHS.SCHEMAS).toBe('/_praxis/schemas');
|
|
110
110
|
});
|
|
111
111
|
});
|
|
112
112
|
|
|
113
|
-
describe(
|
|
113
|
+
describe('PraxisDBStore', () => {
|
|
114
114
|
let db: InMemoryPraxisDB;
|
|
115
115
|
let registry: PraxisRegistry;
|
|
116
116
|
let store: PraxisDBStore;
|
|
@@ -121,111 +121,111 @@ describe("PraxisDBStore", () => {
|
|
|
121
121
|
store = createPraxisDBStore(db, registry);
|
|
122
122
|
});
|
|
123
123
|
|
|
124
|
-
describe(
|
|
125
|
-
it(
|
|
126
|
-
const fact = { tag:
|
|
127
|
-
|
|
124
|
+
describe('Facts', () => {
|
|
125
|
+
it('should store a fact', async () => {
|
|
126
|
+
const fact = { tag: 'UserLoggedIn', payload: { userId: 'alice', id: 'fact-1' } };
|
|
127
|
+
|
|
128
128
|
await store.storeFact(fact);
|
|
129
|
-
|
|
130
|
-
const retrieved = await store.getFact(
|
|
129
|
+
|
|
130
|
+
const retrieved = await store.getFact('UserLoggedIn', 'fact-1');
|
|
131
131
|
expect(retrieved).toEqual(fact);
|
|
132
132
|
});
|
|
133
133
|
|
|
134
|
-
it(
|
|
134
|
+
it('should store multiple facts', async () => {
|
|
135
135
|
const facts = [
|
|
136
|
-
{ tag:
|
|
137
|
-
{ tag:
|
|
136
|
+
{ tag: 'UserLoggedIn', payload: { userId: 'alice', id: 'fact-1' } },
|
|
137
|
+
{ tag: 'UserLoggedIn', payload: { userId: 'bob', id: 'fact-2' } },
|
|
138
138
|
];
|
|
139
|
-
|
|
139
|
+
|
|
140
140
|
await store.storeFacts(facts);
|
|
141
|
-
|
|
142
|
-
const fact1 = await store.getFact(
|
|
143
|
-
const fact2 = await store.getFact(
|
|
144
|
-
|
|
141
|
+
|
|
142
|
+
const fact1 = await store.getFact('UserLoggedIn', 'fact-1');
|
|
143
|
+
const fact2 = await store.getFact('UserLoggedIn', 'fact-2');
|
|
144
|
+
|
|
145
145
|
expect(fact1).toEqual(facts[0]);
|
|
146
146
|
expect(fact2).toEqual(facts[1]);
|
|
147
147
|
});
|
|
148
148
|
|
|
149
|
-
it(
|
|
150
|
-
const fact = { tag:
|
|
151
|
-
|
|
149
|
+
it('should generate id if not provided', async () => {
|
|
150
|
+
const fact = { tag: 'UserLoggedIn', payload: { userId: 'alice' } };
|
|
151
|
+
|
|
152
152
|
await store.storeFact(fact);
|
|
153
|
-
|
|
153
|
+
|
|
154
154
|
// Check that something was stored under the UserLoggedIn path
|
|
155
|
-
const keys = db.keys().filter(k => k.startsWith(
|
|
155
|
+
const keys = db.keys().filter((k) => k.startsWith('/_praxis/facts/UserLoggedIn/'));
|
|
156
156
|
expect(keys.length).toBe(1);
|
|
157
157
|
});
|
|
158
158
|
});
|
|
159
159
|
|
|
160
|
-
describe(
|
|
161
|
-
it(
|
|
162
|
-
const event = { tag:
|
|
163
|
-
|
|
160
|
+
describe('Events', () => {
|
|
161
|
+
it('should append an event', async () => {
|
|
162
|
+
const event = { tag: 'LOGIN', payload: { username: 'alice' } };
|
|
163
|
+
|
|
164
164
|
await store.appendEvent(event);
|
|
165
|
-
|
|
166
|
-
const entries = await store.getEvents(
|
|
165
|
+
|
|
166
|
+
const entries = await store.getEvents('LOGIN');
|
|
167
167
|
expect(entries).toHaveLength(1);
|
|
168
168
|
expect(entries[0]?.event).toEqual(event);
|
|
169
169
|
expect(entries[0]?.timestamp).toBeDefined();
|
|
170
170
|
expect(entries[0]?.sequence).toBe(0);
|
|
171
171
|
});
|
|
172
172
|
|
|
173
|
-
it(
|
|
173
|
+
it('should append multiple events', async () => {
|
|
174
174
|
const events = [
|
|
175
|
-
{ tag:
|
|
176
|
-
{ tag:
|
|
175
|
+
{ tag: 'LOGIN', payload: { username: 'alice' } },
|
|
176
|
+
{ tag: 'LOGIN', payload: { username: 'bob' } },
|
|
177
177
|
];
|
|
178
|
-
|
|
178
|
+
|
|
179
179
|
await store.appendEvents(events);
|
|
180
|
-
|
|
181
|
-
const entries = await store.getEvents(
|
|
180
|
+
|
|
181
|
+
const entries = await store.getEvents('LOGIN');
|
|
182
182
|
expect(entries).toHaveLength(2);
|
|
183
|
-
expect(entries[0]?.event.payload).toEqual({ username:
|
|
184
|
-
expect(entries[1]?.event.payload).toEqual({ username:
|
|
183
|
+
expect(entries[0]?.event.payload).toEqual({ username: 'alice' });
|
|
184
|
+
expect(entries[1]?.event.payload).toEqual({ username: 'bob' });
|
|
185
185
|
});
|
|
186
186
|
|
|
187
|
-
it(
|
|
188
|
-
const event1 = { tag:
|
|
187
|
+
it('should filter events by timestamp', async () => {
|
|
188
|
+
const event1 = { tag: 'LOGIN', payload: { username: 'alice' } };
|
|
189
189
|
await store.appendEvent(event1);
|
|
190
|
-
|
|
190
|
+
|
|
191
191
|
const timestamp = Date.now();
|
|
192
|
-
|
|
192
|
+
|
|
193
193
|
// Small delay to ensure different timestamp
|
|
194
|
-
await new Promise(resolve => setTimeout(resolve, 10));
|
|
195
|
-
|
|
196
|
-
const event2 = { tag:
|
|
194
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
195
|
+
|
|
196
|
+
const event2 = { tag: 'LOGIN', payload: { username: 'bob' } };
|
|
197
197
|
await store.appendEvent(event2);
|
|
198
|
-
|
|
199
|
-
const entries = await store.getEvents(
|
|
198
|
+
|
|
199
|
+
const entries = await store.getEvents('LOGIN', { since: timestamp });
|
|
200
200
|
expect(entries).toHaveLength(1);
|
|
201
|
-
expect(entries[0]?.event.payload).toEqual({ username:
|
|
201
|
+
expect(entries[0]?.event.payload).toEqual({ username: 'bob' });
|
|
202
202
|
});
|
|
203
203
|
|
|
204
|
-
it(
|
|
204
|
+
it('should limit events', async () => {
|
|
205
205
|
await store.appendEvents([
|
|
206
|
-
{ tag:
|
|
207
|
-
{ tag:
|
|
208
|
-
{ tag:
|
|
206
|
+
{ tag: 'LOGIN', payload: { username: 'alice' } },
|
|
207
|
+
{ tag: 'LOGIN', payload: { username: 'bob' } },
|
|
208
|
+
{ tag: 'LOGIN', payload: { username: 'charlie' } },
|
|
209
209
|
]);
|
|
210
|
-
|
|
211
|
-
const entries = await store.getEvents(
|
|
210
|
+
|
|
211
|
+
const entries = await store.getEvents('LOGIN', { limit: 2 });
|
|
212
212
|
expect(entries).toHaveLength(2);
|
|
213
|
-
expect(entries[0]?.event.payload).toEqual({ username:
|
|
214
|
-
expect(entries[1]?.event.payload).toEqual({ username:
|
|
213
|
+
expect(entries[0]?.event.payload).toEqual({ username: 'bob' });
|
|
214
|
+
expect(entries[1]?.event.payload).toEqual({ username: 'charlie' });
|
|
215
215
|
});
|
|
216
216
|
});
|
|
217
217
|
|
|
218
|
-
describe(
|
|
219
|
-
it(
|
|
218
|
+
describe('Constraints', () => {
|
|
219
|
+
it('should reject facts that violate constraints', async () => {
|
|
220
220
|
const noEmptyUserId = defineConstraint({
|
|
221
|
-
id:
|
|
222
|
-
description:
|
|
221
|
+
id: 'noEmptyUserId',
|
|
222
|
+
description: 'User ID cannot be empty',
|
|
223
223
|
impl: (state) => {
|
|
224
224
|
const facts = state.facts;
|
|
225
225
|
for (const fact of facts) {
|
|
226
226
|
const payload = fact.payload as { userId?: string };
|
|
227
|
-
if (payload?.userId ===
|
|
228
|
-
return
|
|
227
|
+
if (payload?.userId === '') {
|
|
228
|
+
return 'User ID cannot be empty';
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
return true;
|
|
@@ -234,33 +234,37 @@ describe("PraxisDBStore", () => {
|
|
|
234
234
|
|
|
235
235
|
registry.registerConstraint(noEmptyUserId);
|
|
236
236
|
|
|
237
|
-
const invalidFact = { tag:
|
|
238
|
-
|
|
239
|
-
await expect(store.storeFact(invalidFact)).rejects.toThrow(
|
|
237
|
+
const invalidFact = { tag: 'UserLoggedIn', payload: { userId: '', id: 'fact-1' } };
|
|
238
|
+
|
|
239
|
+
await expect(store.storeFact(invalidFact)).rejects.toThrow('Constraint violation');
|
|
240
240
|
});
|
|
241
241
|
});
|
|
242
242
|
|
|
243
|
-
describe(
|
|
244
|
-
it(
|
|
245
|
-
interface Context {
|
|
246
|
-
|
|
247
|
-
|
|
243
|
+
describe('Context', () => {
|
|
244
|
+
it('should update and get context', () => {
|
|
245
|
+
interface Context {
|
|
246
|
+
count: number;
|
|
247
|
+
}
|
|
248
|
+
const typedStore = createPraxisDBStore<Context>(db, registry as PraxisRegistry<Context>, {
|
|
249
|
+
count: 0,
|
|
250
|
+
});
|
|
251
|
+
|
|
248
252
|
expect(typedStore.getContext()).toEqual({ count: 0 });
|
|
249
|
-
|
|
253
|
+
|
|
250
254
|
typedStore.updateContext({ count: 5 });
|
|
251
255
|
expect(typedStore.getContext()).toEqual({ count: 5 });
|
|
252
256
|
});
|
|
253
257
|
});
|
|
254
258
|
|
|
255
|
-
describe(
|
|
256
|
-
it(
|
|
259
|
+
describe('Dispose', () => {
|
|
260
|
+
it('should dispose subscriptions', () => {
|
|
257
261
|
store.dispose();
|
|
258
262
|
// Should not throw
|
|
259
263
|
});
|
|
260
264
|
});
|
|
261
265
|
});
|
|
262
266
|
|
|
263
|
-
describe(
|
|
267
|
+
describe('PraxisSchemaRegistry', () => {
|
|
264
268
|
let db: InMemoryPraxisDB;
|
|
265
269
|
let schemaRegistry: PraxisSchemaRegistry;
|
|
266
270
|
|
|
@@ -270,75 +274,75 @@ describe("PraxisSchemaRegistry", () => {
|
|
|
270
274
|
});
|
|
271
275
|
|
|
272
276
|
const testSchema: PraxisSchema = {
|
|
273
|
-
version:
|
|
274
|
-
name:
|
|
275
|
-
description:
|
|
277
|
+
version: '1.0.0',
|
|
278
|
+
name: 'TestApp',
|
|
279
|
+
description: 'Test application schema',
|
|
276
280
|
models: [],
|
|
277
281
|
components: [],
|
|
278
282
|
logic: [],
|
|
279
283
|
};
|
|
280
284
|
|
|
281
|
-
it(
|
|
285
|
+
it('should register a schema', async () => {
|
|
282
286
|
await schemaRegistry.register(testSchema);
|
|
283
|
-
|
|
284
|
-
const stored = await schemaRegistry.get(
|
|
287
|
+
|
|
288
|
+
const stored = await schemaRegistry.get('TestApp');
|
|
285
289
|
expect(stored?.schema).toEqual(testSchema);
|
|
286
|
-
expect(stored?.version).toBe(
|
|
290
|
+
expect(stored?.version).toBe('1.0.0');
|
|
287
291
|
expect(stored?.registeredAt).toBeDefined();
|
|
288
292
|
});
|
|
289
293
|
|
|
290
|
-
it(
|
|
291
|
-
expect(await schemaRegistry.exists(
|
|
292
|
-
|
|
294
|
+
it('should check if schema exists', async () => {
|
|
295
|
+
expect(await schemaRegistry.exists('TestApp')).toBe(false);
|
|
296
|
+
|
|
293
297
|
await schemaRegistry.register(testSchema);
|
|
294
|
-
|
|
295
|
-
expect(await schemaRegistry.exists(
|
|
298
|
+
|
|
299
|
+
expect(await schemaRegistry.exists('TestApp')).toBe(true);
|
|
296
300
|
});
|
|
297
301
|
|
|
298
|
-
it(
|
|
302
|
+
it('should update a schema', async () => {
|
|
299
303
|
await schemaRegistry.register(testSchema);
|
|
300
|
-
|
|
301
|
-
const updatedSchema = { ...testSchema, version:
|
|
304
|
+
|
|
305
|
+
const updatedSchema = { ...testSchema, version: '2.0.0' };
|
|
302
306
|
await schemaRegistry.update(updatedSchema);
|
|
303
|
-
|
|
304
|
-
const stored = await schemaRegistry.get(
|
|
305
|
-
expect(stored?.version).toBe(
|
|
307
|
+
|
|
308
|
+
const stored = await schemaRegistry.get('TestApp');
|
|
309
|
+
expect(stored?.version).toBe('2.0.0');
|
|
306
310
|
});
|
|
307
311
|
|
|
308
|
-
it(
|
|
312
|
+
it('should register with index and list schemas', async () => {
|
|
309
313
|
await schemaRegistry.registerWithIndex(testSchema);
|
|
310
|
-
await schemaRegistry.registerWithIndex({ ...testSchema, name:
|
|
311
|
-
|
|
314
|
+
await schemaRegistry.registerWithIndex({ ...testSchema, name: 'OtherApp' });
|
|
315
|
+
|
|
312
316
|
const list = await schemaRegistry.list();
|
|
313
|
-
expect(list).toContain(
|
|
314
|
-
expect(list).toContain(
|
|
317
|
+
expect(list).toContain('TestApp');
|
|
318
|
+
expect(list).toContain('OtherApp');
|
|
315
319
|
});
|
|
316
320
|
|
|
317
|
-
it(
|
|
321
|
+
it('should not duplicate in index', async () => {
|
|
318
322
|
await schemaRegistry.registerWithIndex(testSchema);
|
|
319
323
|
await schemaRegistry.registerWithIndex(testSchema);
|
|
320
|
-
|
|
324
|
+
|
|
321
325
|
const list = await schemaRegistry.list();
|
|
322
|
-
expect(list.filter(n => n ===
|
|
326
|
+
expect(list.filter((n) => n === 'TestApp')).toHaveLength(1);
|
|
323
327
|
});
|
|
324
328
|
});
|
|
325
329
|
|
|
326
|
-
describe(
|
|
327
|
-
it(
|
|
330
|
+
describe('registerSchema helper', () => {
|
|
331
|
+
it('should register schema with convenience function', async () => {
|
|
328
332
|
const db = createInMemoryDB();
|
|
329
|
-
|
|
333
|
+
|
|
330
334
|
await registerSchema(db, {
|
|
331
|
-
version:
|
|
332
|
-
name:
|
|
335
|
+
version: '1.0.0',
|
|
336
|
+
name: 'QuickApp',
|
|
333
337
|
});
|
|
334
|
-
|
|
338
|
+
|
|
335
339
|
const schemaRegistry = createSchemaRegistry(db);
|
|
336
|
-
const stored = await schemaRegistry.get(
|
|
337
|
-
expect(stored?.schema.name).toBe(
|
|
340
|
+
const stored = await schemaRegistry.get('QuickApp');
|
|
341
|
+
expect(stored?.schema.name).toBe('QuickApp');
|
|
338
342
|
});
|
|
339
343
|
});
|
|
340
344
|
|
|
341
|
-
describe(
|
|
345
|
+
describe('PluresDBAdapter', () => {
|
|
342
346
|
let db: InMemoryPraxisDB;
|
|
343
347
|
let registry: PraxisRegistry;
|
|
344
348
|
|
|
@@ -347,62 +351,60 @@ describe("PluresDBAdapter", () => {
|
|
|
347
351
|
registry = new PraxisRegistry();
|
|
348
352
|
});
|
|
349
353
|
|
|
350
|
-
it(
|
|
354
|
+
it('should persist facts', async () => {
|
|
351
355
|
const adapter = createPluresDBAdapter({ db, registry });
|
|
352
|
-
|
|
356
|
+
|
|
353
357
|
await adapter.persistFacts([
|
|
354
|
-
{ tag:
|
|
358
|
+
{ tag: 'UserLoggedIn', payload: { userId: 'alice', id: 'fact-1' } },
|
|
355
359
|
]);
|
|
356
|
-
|
|
357
|
-
const keys = db.keys().filter(k => k.includes(
|
|
360
|
+
|
|
361
|
+
const keys = db.keys().filter((k) => k.includes('UserLoggedIn'));
|
|
358
362
|
expect(keys.length).toBe(1);
|
|
359
|
-
|
|
363
|
+
|
|
360
364
|
adapter.dispose();
|
|
361
365
|
});
|
|
362
366
|
|
|
363
|
-
it(
|
|
367
|
+
it('should persist events', async () => {
|
|
364
368
|
const adapter = createPluresDBAdapter({ db, registry });
|
|
365
|
-
|
|
366
|
-
await adapter.persistEvents([
|
|
367
|
-
|
|
368
|
-
]);
|
|
369
|
-
|
|
369
|
+
|
|
370
|
+
await adapter.persistEvents([{ tag: 'LOGIN', payload: { username: 'alice' } }]);
|
|
371
|
+
|
|
370
372
|
const entries = await db.get<Array<{ event: unknown }>>(`/_praxis/events/LOGIN`);
|
|
371
373
|
expect(entries).toHaveLength(1);
|
|
372
|
-
|
|
374
|
+
|
|
373
375
|
adapter.dispose();
|
|
374
376
|
});
|
|
375
377
|
|
|
376
|
-
it(
|
|
378
|
+
it('should load events', async () => {
|
|
377
379
|
const adapter = createPluresDBAdapter({ db, registry });
|
|
378
|
-
|
|
380
|
+
|
|
379
381
|
await adapter.persistEvents([
|
|
380
|
-
{ tag:
|
|
381
|
-
{ tag:
|
|
382
|
+
{ tag: 'LOGIN', payload: { username: 'alice' } },
|
|
383
|
+
{ tag: 'LOGIN', payload: { username: 'bob' } },
|
|
382
384
|
]);
|
|
383
|
-
|
|
384
|
-
const events = await adapter.loadEvents({ tag:
|
|
385
|
+
|
|
386
|
+
const events = await adapter.loadEvents({ tag: 'LOGIN' });
|
|
385
387
|
expect(events).toHaveLength(2);
|
|
386
|
-
|
|
388
|
+
|
|
387
389
|
adapter.dispose();
|
|
388
390
|
});
|
|
389
391
|
|
|
390
|
-
it(
|
|
392
|
+
it('should attach to engine', () => {
|
|
391
393
|
const adapter = createPluresDBAdapter({ db, registry });
|
|
392
394
|
const engine = createPraxisEngine({
|
|
393
395
|
initialContext: { count: 0 },
|
|
394
396
|
registry,
|
|
395
397
|
});
|
|
396
|
-
|
|
398
|
+
|
|
397
399
|
// Should not throw
|
|
398
400
|
adapter.attachEngine(engine);
|
|
399
|
-
|
|
401
|
+
|
|
400
402
|
adapter.dispose();
|
|
401
403
|
});
|
|
402
404
|
});
|
|
403
405
|
|
|
404
|
-
describe(
|
|
405
|
-
it(
|
|
406
|
+
describe('attachToEngine', () => {
|
|
407
|
+
it('should attach store to engine', () => {
|
|
406
408
|
const db = createInMemoryDB();
|
|
407
409
|
const registry = new PraxisRegistry<{ count: number }>();
|
|
408
410
|
const store = createPraxisDBStore(db, registry, { count: 0 });
|
|
@@ -410,29 +412,29 @@ describe("attachToEngine", () => {
|
|
|
410
412
|
initialContext: { count: 5 },
|
|
411
413
|
registry,
|
|
412
414
|
});
|
|
413
|
-
|
|
415
|
+
|
|
414
416
|
const detach = attachToEngine(store, engine);
|
|
415
|
-
|
|
417
|
+
|
|
416
418
|
// Context should be synced from engine to store
|
|
417
419
|
expect(store.getContext()).toEqual({ count: 5 });
|
|
418
|
-
|
|
420
|
+
|
|
419
421
|
// Should not throw
|
|
420
422
|
detach();
|
|
421
423
|
});
|
|
422
424
|
});
|
|
423
425
|
|
|
424
|
-
describe(
|
|
425
|
-
it(
|
|
426
|
+
describe('Rules triggering', () => {
|
|
427
|
+
it('should trigger rules when events are appended', async () => {
|
|
426
428
|
interface Context {
|
|
427
429
|
logins: number;
|
|
428
430
|
}
|
|
429
431
|
|
|
430
|
-
const UserLoggedIn = defineFact<
|
|
431
|
-
const Login = defineEvent<
|
|
432
|
+
const UserLoggedIn = defineFact<'UserLoggedIn', { userId: string }>('UserLoggedIn');
|
|
433
|
+
const Login = defineEvent<'LOGIN', { username: string }>('LOGIN');
|
|
432
434
|
|
|
433
435
|
const loginRule = defineRule<Context>({
|
|
434
|
-
id:
|
|
435
|
-
description:
|
|
436
|
+
id: 'auth.login',
|
|
437
|
+
description: 'Process login event',
|
|
436
438
|
impl: (state, events) => {
|
|
437
439
|
const loginEvent = events.find(Login.is);
|
|
438
440
|
if (loginEvent) {
|
|
@@ -448,10 +450,10 @@ describe("Rules triggering", () => {
|
|
|
448
450
|
|
|
449
451
|
const store = createPraxisDBStore(db, registry, { logins: 0 });
|
|
450
452
|
|
|
451
|
-
await store.appendEvent(Login.create({ username:
|
|
453
|
+
await store.appendEvent(Login.create({ username: 'alice' }));
|
|
452
454
|
|
|
453
455
|
// Check that derived fact was stored
|
|
454
|
-
const keys = db.keys().filter(k => k.includes(
|
|
456
|
+
const keys = db.keys().filter((k) => k.includes('UserLoggedIn'));
|
|
455
457
|
expect(keys.length).toBe(1);
|
|
456
458
|
});
|
|
457
459
|
});
|