@plures/praxis 0.2.1 → 1.0.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/README.md +191 -64
- package/core/codegen/docs-generator.ts +808 -0
- package/core/codegen/index.ts +27 -0
- package/core/codegen/ts-generator.ts +15 -0
- package/core/db-adapter/index.ts +52 -0
- package/core/db-adapter/sync-engine.ts +450 -0
- package/core/logic-engine/engine.ts +12 -0
- package/core/logic-engine/index.ts +16 -0
- package/core/logic-engine/protocol.ts +16 -0
- package/core/logic-engine/psf-adapter.ts +269 -0
- package/core/logic-engine/rules.ts +16 -0
- package/core/schema-engine/compiler.ts +431 -0
- package/core/schema-engine/generator.ts +635 -0
- package/core/schema-engine/index.ts +18 -0
- package/core/schema-engine/psf.ts +664 -0
- package/core/schema-engine/types.ts +63 -0
- package/core/schema-engine/validator.ts +541 -0
- package/dist/core/codegen/docs-generator.d.ts +123 -0
- package/dist/core/codegen/docs-generator.d.ts.map +1 -0
- package/dist/core/codegen/docs-generator.js +674 -0
- package/dist/core/codegen/docs-generator.js.map +1 -0
- package/dist/core/codegen/index.d.ts +11 -0
- package/dist/core/codegen/index.d.ts.map +1 -0
- package/dist/core/codegen/index.js +13 -0
- package/dist/core/codegen/index.js.map +1 -0
- package/dist/core/codegen/ts-generator.d.ts +8 -0
- package/dist/core/codegen/ts-generator.d.ts.map +1 -0
- package/dist/core/codegen/ts-generator.js +8 -0
- package/dist/core/codegen/ts-generator.js.map +1 -0
- package/dist/core/db-adapter/index.d.ts +18 -0
- package/dist/core/db-adapter/index.d.ts.map +1 -0
- package/dist/core/db-adapter/index.js +23 -0
- package/dist/core/db-adapter/index.js.map +1 -0
- package/dist/core/db-adapter/sync-engine.d.ts +180 -0
- package/dist/core/db-adapter/sync-engine.d.ts.map +1 -0
- package/dist/core/db-adapter/sync-engine.js +342 -0
- package/dist/core/db-adapter/sync-engine.js.map +1 -0
- package/dist/core/logic-engine/engine.d.ts +8 -0
- package/dist/core/logic-engine/engine.d.ts.map +1 -0
- package/dist/core/logic-engine/engine.js +8 -0
- package/dist/core/logic-engine/engine.js.map +1 -0
- package/dist/core/logic-engine/index.d.ts +16 -0
- package/dist/core/logic-engine/index.d.ts.map +1 -0
- package/dist/core/logic-engine/index.js +16 -0
- package/dist/core/logic-engine/index.js.map +1 -0
- package/dist/core/logic-engine/protocol.d.ts +7 -0
- package/dist/core/logic-engine/protocol.d.ts.map +1 -0
- package/dist/core/logic-engine/protocol.js +7 -0
- package/dist/core/logic-engine/protocol.js.map +1 -0
- package/dist/core/logic-engine/psf-adapter.d.ts +88 -0
- package/dist/core/logic-engine/psf-adapter.d.ts.map +1 -0
- package/dist/core/logic-engine/psf-adapter.js +207 -0
- package/dist/core/logic-engine/psf-adapter.js.map +1 -0
- package/dist/core/logic-engine/rules.d.ts +7 -0
- package/dist/core/logic-engine/rules.d.ts.map +1 -0
- package/dist/core/logic-engine/rules.js +7 -0
- package/dist/core/logic-engine/rules.js.map +1 -0
- package/dist/core/schema-engine/compiler.d.ts +198 -0
- package/dist/core/schema-engine/compiler.d.ts.map +1 -0
- package/dist/core/schema-engine/compiler.js +262 -0
- package/dist/core/schema-engine/compiler.js.map +1 -0
- package/dist/core/schema-engine/generator.d.ts +115 -0
- package/dist/core/schema-engine/generator.d.ts.map +1 -0
- package/dist/core/schema-engine/generator.js +506 -0
- package/dist/core/schema-engine/generator.js.map +1 -0
- package/dist/core/schema-engine/index.d.ts +18 -0
- package/dist/core/schema-engine/index.d.ts.map +1 -0
- package/dist/core/schema-engine/index.js +18 -0
- package/dist/core/schema-engine/index.js.map +1 -0
- package/dist/core/schema-engine/psf.d.ts +612 -0
- package/dist/core/schema-engine/psf.d.ts.map +1 -0
- package/dist/core/schema-engine/psf.js +45 -0
- package/dist/core/schema-engine/psf.js.map +1 -0
- package/dist/core/schema-engine/types.d.ts +10 -0
- package/dist/core/schema-engine/types.d.ts.map +1 -0
- package/dist/core/schema-engine/types.js +7 -0
- package/dist/core/schema-engine/types.js.map +1 -0
- package/dist/core/schema-engine/validator.d.ts +140 -0
- package/dist/core/schema-engine/validator.d.ts.map +1 -0
- package/dist/core/schema-engine/validator.js +407 -0
- package/dist/core/schema-engine/validator.js.map +1 -0
- package/dist/src/adapters/cli.d.ts.map +1 -0
- package/dist/src/adapters/cli.js.map +1 -0
- package/dist/src/cli/commands/auth.d.ts.map +1 -0
- package/dist/src/cli/commands/auth.js.map +1 -0
- package/dist/src/cli/commands/build.d.ts +23 -0
- package/dist/src/cli/commands/build.d.ts.map +1 -0
- package/dist/src/cli/commands/build.js +162 -0
- package/dist/src/cli/commands/build.js.map +1 -0
- package/dist/src/cli/commands/canvas.d.ts +23 -0
- package/dist/src/cli/commands/canvas.d.ts.map +1 -0
- package/dist/src/cli/commands/canvas.js +215 -0
- package/dist/src/cli/commands/canvas.js.map +1 -0
- package/dist/src/cli/commands/cloud.d.ts.map +1 -0
- package/dist/src/cli/commands/cloud.js.map +1 -0
- package/dist/src/cli/commands/create.d.ts +21 -0
- package/dist/src/cli/commands/create.d.ts.map +1 -0
- package/dist/src/cli/commands/create.js +621 -0
- package/dist/src/cli/commands/create.js.map +1 -0
- package/dist/src/cli/commands/dev.d.ts +21 -0
- package/dist/src/cli/commands/dev.d.ts.map +1 -0
- package/dist/src/cli/commands/dev.js +71 -0
- package/dist/src/cli/commands/dev.js.map +1 -0
- package/dist/src/cli/commands/generate.d.ts.map +1 -0
- package/dist/src/cli/commands/generate.js.map +1 -0
- package/dist/src/cli/commands/orchestrate.d.ts +44 -0
- package/dist/src/cli/commands/orchestrate.d.ts.map +1 -0
- package/dist/src/cli/commands/orchestrate.js +150 -0
- package/dist/src/cli/commands/orchestrate.js.map +1 -0
- package/dist/{cli → src/cli}/index.d.ts.map +1 -1
- package/dist/{cli → src/cli}/index.js +53 -21
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cloud/auth.d.ts.map +1 -0
- package/dist/src/cloud/auth.js.map +1 -0
- package/dist/src/cloud/billing.d.ts.map +1 -0
- package/dist/src/cloud/billing.js.map +1 -0
- package/dist/src/cloud/client.d.ts.map +1 -0
- package/dist/src/cloud/client.js.map +1 -0
- package/dist/src/cloud/index.d.ts.map +1 -0
- package/dist/src/cloud/index.js.map +1 -0
- package/dist/src/cloud/marketplace.d.ts.map +1 -0
- package/dist/src/cloud/marketplace.js.map +1 -0
- package/dist/src/cloud/provisioning.d.ts.map +1 -0
- package/dist/src/cloud/provisioning.js.map +1 -0
- package/dist/src/cloud/relay/endpoints.d.ts.map +1 -0
- package/dist/src/cloud/relay/endpoints.js.map +1 -0
- package/dist/src/cloud/relay/health/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/health/index.js.map +1 -0
- package/dist/src/cloud/relay/stats/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/stats/index.js.map +1 -0
- package/dist/src/cloud/relay/sync/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/sync/index.js.map +1 -0
- package/dist/src/cloud/relay/usage/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/usage/index.js.map +1 -0
- package/dist/src/cloud/sponsors.d.ts.map +1 -0
- package/dist/src/cloud/sponsors.js.map +1 -0
- package/dist/src/cloud/types.d.ts.map +1 -0
- package/dist/src/cloud/types.js.map +1 -0
- package/dist/src/components/index.d.ts.map +1 -0
- package/dist/src/components/index.js.map +1 -0
- package/dist/src/core/actors.d.ts.map +1 -0
- package/dist/src/core/actors.js.map +1 -0
- package/dist/src/core/component/generator.d.ts.map +1 -0
- package/dist/{core → src/core}/component/generator.js +45 -3
- package/dist/src/core/component/generator.js.map +1 -0
- package/dist/src/core/engine.d.ts.map +1 -0
- package/dist/src/core/engine.js.map +1 -0
- package/dist/src/core/introspection.d.ts.map +1 -0
- package/dist/src/core/introspection.js.map +1 -0
- package/dist/src/core/logic/generator.d.ts.map +1 -0
- package/dist/{core → src/core}/logic/generator.js +35 -4
- package/dist/src/core/logic/generator.js.map +1 -0
- package/dist/src/core/pluresdb/adapter.d.ts +72 -0
- package/dist/src/core/pluresdb/adapter.d.ts.map +1 -0
- package/dist/src/core/pluresdb/adapter.js +73 -0
- package/dist/src/core/pluresdb/adapter.js.map +1 -0
- package/dist/src/core/pluresdb/generator.d.ts.map +1 -0
- package/dist/{core → src/core}/pluresdb/generator.js +33 -4
- package/dist/src/core/pluresdb/generator.js.map +1 -0
- package/dist/src/core/pluresdb/index.d.ts +15 -0
- package/dist/src/core/pluresdb/index.d.ts.map +1 -0
- package/dist/src/core/pluresdb/index.js +11 -0
- package/dist/src/core/pluresdb/index.js.map +1 -0
- package/dist/src/core/pluresdb/schema-registry.d.ts +104 -0
- package/dist/src/core/pluresdb/schema-registry.d.ts.map +1 -0
- package/dist/src/core/pluresdb/schema-registry.js +130 -0
- package/dist/src/core/pluresdb/schema-registry.js.map +1 -0
- package/dist/src/core/pluresdb/store.d.ts +199 -0
- package/dist/src/core/pluresdb/store.d.ts.map +1 -0
- package/dist/src/core/pluresdb/store.js +344 -0
- package/dist/src/core/pluresdb/store.js.map +1 -0
- package/dist/src/core/protocol.d.ts.map +1 -0
- package/dist/src/core/protocol.js.map +1 -0
- package/dist/src/core/rules.d.ts.map +1 -0
- package/dist/src/core/rules.js.map +1 -0
- package/dist/src/core/schema/loader.d.ts.map +1 -0
- package/dist/src/core/schema/loader.js.map +1 -0
- package/dist/src/core/schema/normalize.d.ts.map +1 -0
- package/dist/src/core/schema/normalize.js.map +1 -0
- package/dist/src/core/schema/types.d.ts.map +1 -0
- package/dist/src/core/schema/types.js.map +1 -0
- package/dist/src/dsl/index.d.ts.map +1 -0
- package/dist/src/dsl/index.js.map +1 -0
- package/dist/src/dsl.d.ts.map +1 -0
- package/dist/src/dsl.js.map +1 -0
- package/dist/src/examples/advanced-todo/index.d.ts.map +1 -0
- package/dist/src/examples/advanced-todo/index.js.map +1 -0
- package/dist/src/examples/auth-basic/index.d.ts.map +1 -0
- package/dist/src/examples/auth-basic/index.js.map +1 -0
- package/dist/src/examples/cart/index.d.ts.map +1 -0
- package/dist/src/examples/cart/index.js.map +1 -0
- package/dist/src/examples/hero-ecommerce/index.d.ts.map +1 -0
- package/dist/src/examples/hero-ecommerce/index.js.map +1 -0
- package/dist/src/examples/svelte-counter/index.d.ts.map +1 -0
- package/dist/src/examples/svelte-counter/index.js.map +1 -0
- package/dist/src/flows.d.ts.map +1 -0
- package/dist/src/flows.js.map +1 -0
- package/dist/{index.d.ts → src/index.d.ts} +12 -2
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{index.js → src/index.js} +6 -1
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/code-canvas.d.ts +265 -0
- package/dist/src/integrations/code-canvas.d.ts.map +1 -0
- package/dist/src/integrations/code-canvas.js +451 -0
- package/dist/src/integrations/code-canvas.js.map +1 -0
- package/dist/src/integrations/pluresdb.d.ts +117 -0
- package/dist/src/integrations/pluresdb.d.ts.map +1 -0
- package/dist/src/integrations/pluresdb.js +117 -0
- package/dist/src/integrations/pluresdb.js.map +1 -0
- package/dist/src/integrations/state-docs.d.ts +191 -0
- package/dist/src/integrations/state-docs.d.ts.map +1 -0
- package/dist/src/integrations/state-docs.js +515 -0
- package/dist/src/integrations/state-docs.js.map +1 -0
- package/dist/src/integrations/svelte.d.ts.map +1 -0
- package/dist/src/integrations/svelte.js.map +1 -0
- package/dist/src/integrations/tauri.d.ts +360 -0
- package/dist/src/integrations/tauri.d.ts.map +1 -0
- package/dist/src/integrations/tauri.js +278 -0
- package/dist/src/integrations/tauri.js.map +1 -0
- package/dist/src/integrations/unum.d.ts +159 -0
- package/dist/src/integrations/unum.d.ts.map +1 -0
- package/dist/src/integrations/unum.js +240 -0
- package/dist/src/integrations/unum.js.map +1 -0
- package/dist/src/registry.d.ts.map +1 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/{runtime → src/runtime}/terminal-adapter.d.ts +58 -7
- package/dist/src/runtime/terminal-adapter.d.ts.map +1 -0
- package/dist/src/runtime/terminal-adapter.js +239 -0
- package/dist/src/runtime/terminal-adapter.js.map +1 -0
- package/dist/src/step.d.ts.map +1 -0
- package/dist/src/step.js.map +1 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/{cloud → src}/types.js.map +1 -1
- package/dist/tools/cli/commands/index.d.ts +7 -0
- package/dist/tools/cli/commands/index.d.ts.map +1 -0
- package/dist/tools/cli/commands/index.js +7 -0
- package/dist/tools/cli/commands/index.js.map +1 -0
- package/dist/tools/cli/index.d.ts +8 -0
- package/dist/tools/cli/index.d.ts.map +1 -0
- package/dist/tools/cli/index.js +9 -0
- package/dist/tools/cli/index.js.map +1 -0
- package/dist/tools/watcher/index.d.ts +105 -0
- package/dist/tools/watcher/index.d.ts.map +1 -0
- package/dist/tools/watcher/index.js +213 -0
- package/dist/tools/watcher/index.js.map +1 -0
- package/dist/ui/canvas/canvas-projection.d.ts +78 -0
- package/dist/ui/canvas/canvas-projection.d.ts.map +1 -0
- package/dist/ui/canvas/canvas-projection.js +416 -0
- package/dist/ui/canvas/canvas-projection.js.map +1 -0
- package/dist/ui/canvas/canvas-state.d.ts +200 -0
- package/dist/ui/canvas/canvas-state.d.ts.map +1 -0
- package/dist/ui/canvas/canvas-state.js +464 -0
- package/dist/ui/canvas/canvas-state.js.map +1 -0
- package/dist/ui/canvas/components/index.d.ts +95 -0
- package/dist/ui/canvas/components/index.d.ts.map +1 -0
- package/dist/ui/canvas/components/index.js +19 -0
- package/dist/ui/canvas/components/index.js.map +1 -0
- package/dist/ui/canvas/index.d.ts +32 -0
- package/dist/ui/canvas/index.d.ts.map +1 -0
- package/dist/ui/canvas/index.js +32 -0
- package/dist/ui/canvas/index.js.map +1 -0
- package/dist/ui/svelte-generator/index.d.ts +9 -0
- package/dist/ui/svelte-generator/index.d.ts.map +1 -0
- package/dist/ui/svelte-generator/index.js +11 -0
- package/dist/ui/svelte-generator/index.js.map +1 -0
- package/dist/ui/svelte-generator/psf-generator.d.ts +128 -0
- package/dist/ui/svelte-generator/psf-generator.d.ts.map +1 -0
- package/dist/ui/svelte-generator/psf-generator.js +506 -0
- package/dist/ui/svelte-generator/psf-generator.js.map +1 -0
- package/docs/README.md +155 -0
- package/docs/core/building-extensions.md +553 -0
- package/docs/core/cli-usage.md +498 -0
- package/docs/core/code-canvas-sync.md +468 -0
- package/docs/core/logic-engine.md +566 -0
- package/docs/core/pluresdb-integration.md +646 -0
- package/docs/core/schema-model.md +414 -0
- package/docs/core/ui-generation.md +580 -0
- package/docs/core/what-is-praxis.md +240 -0
- package/docs/tutorials/README.md +84 -0
- package/docs/tutorials/ecommerce-cart.md +631 -0
- package/docs/tutorials/first-app.md +529 -0
- package/docs/tutorials/form-builder.md +620 -0
- package/docs/tutorials/todo-pluresdb.md +589 -0
- package/package.json +16 -16
- package/src/__tests__/canvas-components.test.ts +450 -0
- package/src/__tests__/cli-create.test.ts +178 -0
- package/src/__tests__/code-canvas-integration.test.ts +277 -0
- package/src/__tests__/docs-generator.test.ts +181 -0
- package/src/__tests__/generators.test.ts +3 -2
- package/src/__tests__/pluresdb.test.ts +457 -0
- package/src/__tests__/psf-schema-engine.test.ts +450 -0
- package/src/__tests__/state-docs-integration.test.ts +297 -0
- package/src/__tests__/tauri-integration.test.ts +298 -0
- package/src/__tests__/terminal-node.test.ts +1 -1
- package/src/__tests__/unum-integration.test.ts +142 -0
- package/src/cli/commands/build.ts +203 -0
- package/src/cli/commands/canvas.ts +246 -0
- package/src/cli/commands/create.ts +666 -0
- package/src/cli/commands/dev.ts +95 -0
- package/src/cli/commands/orchestrate.ts +212 -0
- package/src/cli/index.ts +48 -21
- package/src/core/component/generator.ts +45 -3
- package/src/core/logic/generator.ts +39 -4
- package/src/core/pluresdb/adapter.ts +117 -0
- package/src/core/pluresdb/generator.ts +33 -4
- package/src/core/pluresdb/index.ts +37 -0
- package/src/core/pluresdb/schema-registry.ts +162 -0
- package/src/core/pluresdb/store.ts +446 -0
- package/src/index.ts +109 -0
- package/src/integrations/code-canvas.ts +717 -0
- package/src/integrations/pluresdb.ts +140 -29
- package/src/integrations/state-docs.ts +710 -0
- package/src/integrations/tauri.ts +638 -0
- package/src/integrations/unum.ts +395 -0
- package/src/runtime/terminal-adapter.ts +184 -23
- package/dist/adapters/cli.d.ts.map +0 -1
- package/dist/adapters/cli.js.map +0 -1
- package/dist/cli/commands/auth.d.ts.map +0 -1
- package/dist/cli/commands/auth.js.map +0 -1
- package/dist/cli/commands/cloud.d.ts.map +0 -1
- package/dist/cli/commands/cloud.js.map +0 -1
- package/dist/cli/commands/generate.d.ts.map +0 -1
- package/dist/cli/commands/generate.js.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cloud/auth.d.ts.map +0 -1
- package/dist/cloud/auth.js.map +0 -1
- package/dist/cloud/billing.d.ts.map +0 -1
- package/dist/cloud/billing.js.map +0 -1
- package/dist/cloud/client.d.ts.map +0 -1
- package/dist/cloud/client.js.map +0 -1
- package/dist/cloud/index.d.ts.map +0 -1
- package/dist/cloud/index.js.map +0 -1
- package/dist/cloud/marketplace.d.ts.map +0 -1
- package/dist/cloud/marketplace.js.map +0 -1
- package/dist/cloud/provisioning.d.ts.map +0 -1
- package/dist/cloud/provisioning.js.map +0 -1
- package/dist/cloud/relay/endpoints.d.ts.map +0 -1
- package/dist/cloud/relay/endpoints.js.map +0 -1
- package/dist/cloud/relay/health/index.d.ts.map +0 -1
- package/dist/cloud/relay/health/index.js.map +0 -1
- package/dist/cloud/relay/stats/index.d.ts.map +0 -1
- package/dist/cloud/relay/stats/index.js.map +0 -1
- package/dist/cloud/relay/sync/index.d.ts.map +0 -1
- package/dist/cloud/relay/sync/index.js.map +0 -1
- package/dist/cloud/relay/usage/index.d.ts.map +0 -1
- package/dist/cloud/relay/usage/index.js.map +0 -1
- package/dist/cloud/sponsors.d.ts.map +0 -1
- package/dist/cloud/sponsors.js.map +0 -1
- package/dist/cloud/types.d.ts.map +0 -1
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/core/actors.d.ts.map +0 -1
- package/dist/core/actors.js.map +0 -1
- package/dist/core/component/generator.d.ts.map +0 -1
- package/dist/core/component/generator.js.map +0 -1
- package/dist/core/engine.d.ts.map +0 -1
- package/dist/core/engine.js.map +0 -1
- package/dist/core/introspection.d.ts.map +0 -1
- package/dist/core/introspection.js.map +0 -1
- package/dist/core/logic/generator.d.ts.map +0 -1
- package/dist/core/logic/generator.js.map +0 -1
- package/dist/core/pluresdb/generator.d.ts.map +0 -1
- package/dist/core/pluresdb/generator.js.map +0 -1
- package/dist/core/protocol.d.ts.map +0 -1
- package/dist/core/protocol.js.map +0 -1
- package/dist/core/rules.d.ts.map +0 -1
- package/dist/core/rules.js.map +0 -1
- package/dist/core/schema/loader.d.ts.map +0 -1
- package/dist/core/schema/loader.js.map +0 -1
- package/dist/core/schema/normalize.d.ts.map +0 -1
- package/dist/core/schema/normalize.js.map +0 -1
- package/dist/core/schema/types.d.ts.map +0 -1
- package/dist/core/schema/types.js.map +0 -1
- package/dist/dsl/index.d.ts.map +0 -1
- package/dist/dsl/index.js.map +0 -1
- package/dist/dsl.d.ts.map +0 -1
- package/dist/dsl.js.map +0 -1
- package/dist/examples/advanced-todo/index.d.ts.map +0 -1
- package/dist/examples/advanced-todo/index.js.map +0 -1
- package/dist/examples/auth-basic/index.d.ts.map +0 -1
- package/dist/examples/auth-basic/index.js.map +0 -1
- package/dist/examples/cart/index.d.ts.map +0 -1
- package/dist/examples/cart/index.js.map +0 -1
- package/dist/examples/hero-ecommerce/index.d.ts.map +0 -1
- package/dist/examples/hero-ecommerce/index.js.map +0 -1
- package/dist/examples/svelte-counter/index.d.ts.map +0 -1
- package/dist/examples/svelte-counter/index.js.map +0 -1
- package/dist/flows.d.ts.map +0 -1
- package/dist/flows.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/integrations/pluresdb.d.ts +0 -56
- package/dist/integrations/pluresdb.d.ts.map +0 -1
- package/dist/integrations/pluresdb.js +0 -46
- package/dist/integrations/pluresdb.js.map +0 -1
- package/dist/integrations/svelte.d.ts.map +0 -1
- package/dist/integrations/svelte.js.map +0 -1
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js.map +0 -1
- package/dist/runtime/terminal-adapter.d.ts.map +0 -1
- package/dist/runtime/terminal-adapter.js +0 -113
- package/dist/runtime/terminal-adapter.js.map +0 -1
- package/dist/step.d.ts.map +0 -1
- package/dist/step.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{adapters → src/adapters}/cli.d.ts +0 -0
- /package/dist/{adapters → src/adapters}/cli.js +0 -0
- /package/dist/{cli → src/cli}/commands/auth.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/auth.js +0 -0
- /package/dist/{cli → src/cli}/commands/cloud.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/cloud.js +0 -0
- /package/dist/{cli → src/cli}/commands/generate.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/generate.js +0 -0
- /package/dist/{cli → src/cli}/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/auth.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/auth.js +0 -0
- /package/dist/{cloud → src/cloud}/billing.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/billing.js +0 -0
- /package/dist/{cloud → src/cloud}/client.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/client.js +0 -0
- /package/dist/{cloud → src/cloud}/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/index.js +0 -0
- /package/dist/{cloud → src/cloud}/marketplace.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/marketplace.js +0 -0
- /package/dist/{cloud → src/cloud}/provisioning.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/provisioning.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/endpoints.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/endpoints.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/health/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/health/index.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/stats/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/stats/index.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/sync/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/sync/index.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/usage/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/usage/index.js +0 -0
- /package/dist/{cloud → src/cloud}/sponsors.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/sponsors.js +0 -0
- /package/dist/{cloud → src/cloud}/types.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/types.js +0 -0
- /package/dist/{components → src/components}/index.d.ts +0 -0
- /package/dist/{components → src/components}/index.js +0 -0
- /package/dist/{core → src/core}/actors.d.ts +0 -0
- /package/dist/{core → src/core}/actors.js +0 -0
- /package/dist/{core → src/core}/component/generator.d.ts +0 -0
- /package/dist/{core → src/core}/engine.d.ts +0 -0
- /package/dist/{core → src/core}/engine.js +0 -0
- /package/dist/{core → src/core}/introspection.d.ts +0 -0
- /package/dist/{core → src/core}/introspection.js +0 -0
- /package/dist/{core → src/core}/logic/generator.d.ts +0 -0
- /package/dist/{core → src/core}/pluresdb/generator.d.ts +0 -0
- /package/dist/{core → src/core}/protocol.d.ts +0 -0
- /package/dist/{core → src/core}/protocol.js +0 -0
- /package/dist/{core → src/core}/rules.d.ts +0 -0
- /package/dist/{core → src/core}/rules.js +0 -0
- /package/dist/{core → src/core}/schema/loader.d.ts +0 -0
- /package/dist/{core → src/core}/schema/loader.js +0 -0
- /package/dist/{core → src/core}/schema/normalize.d.ts +0 -0
- /package/dist/{core → src/core}/schema/normalize.js +0 -0
- /package/dist/{core → src/core}/schema/types.d.ts +0 -0
- /package/dist/{core → src/core}/schema/types.js +0 -0
- /package/dist/{dsl → src/dsl}/index.d.ts +0 -0
- /package/dist/{dsl → src/dsl}/index.js +0 -0
- /package/dist/{dsl.d.ts → src/dsl.d.ts} +0 -0
- /package/dist/{dsl.js → src/dsl.js} +0 -0
- /package/dist/{examples → src/examples}/advanced-todo/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/advanced-todo/index.js +0 -0
- /package/dist/{examples → src/examples}/auth-basic/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/auth-basic/index.js +0 -0
- /package/dist/{examples → src/examples}/cart/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/cart/index.js +0 -0
- /package/dist/{examples → src/examples}/hero-ecommerce/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/hero-ecommerce/index.js +0 -0
- /package/dist/{examples → src/examples}/svelte-counter/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/svelte-counter/index.js +0 -0
- /package/dist/{flows.d.ts → src/flows.d.ts} +0 -0
- /package/dist/{flows.js → src/flows.js} +0 -0
- /package/dist/{integrations → src/integrations}/svelte.d.ts +0 -0
- /package/dist/{integrations → src/integrations}/svelte.js +0 -0
- /package/dist/{registry.d.ts → src/registry.d.ts} +0 -0
- /package/dist/{registry.js → src/registry.js} +0 -0
- /package/dist/{step.d.ts → src/step.d.ts} +0 -0
- /package/dist/{step.js → src/step.js} +0 -0
- /package/dist/{types.d.ts → src/types.d.ts} +0 -0
- /package/dist/{types.js → src/types.js} +0 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unum Integration Tests
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
6
|
+
import { createUnumAdapter, attachUnumToEngine } from "../integrations/unum.js";
|
|
7
|
+
import { createInMemoryDB } from "../integrations/pluresdb.js";
|
|
8
|
+
import { createPraxisEngine, PraxisRegistry } from "../index.js";
|
|
9
|
+
|
|
10
|
+
describe("Unum Integration", () => {
|
|
11
|
+
describe("createUnumAdapter", () => {
|
|
12
|
+
it("should create an adapter without identity", async () => {
|
|
13
|
+
const db = createInMemoryDB();
|
|
14
|
+
const adapter = await createUnumAdapter({ db });
|
|
15
|
+
|
|
16
|
+
expect(adapter).toBeDefined();
|
|
17
|
+
expect(adapter.identity).toBeNull();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("should create an adapter with identity", async () => {
|
|
21
|
+
const db = createInMemoryDB();
|
|
22
|
+
const adapter = await createUnumAdapter({
|
|
23
|
+
db,
|
|
24
|
+
identity: {
|
|
25
|
+
id: "test-user",
|
|
26
|
+
name: "Test User",
|
|
27
|
+
createdAt: Date.now(),
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
expect(adapter.identity).toBeDefined();
|
|
32
|
+
expect(adapter.identity?.name).toBe("Test User");
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("should set identity", async () => {
|
|
36
|
+
const db = createInMemoryDB();
|
|
37
|
+
const adapter = await createUnumAdapter({ db });
|
|
38
|
+
|
|
39
|
+
const identity = await adapter.setIdentity({ name: "New User" });
|
|
40
|
+
|
|
41
|
+
expect(identity.name).toBe("New User");
|
|
42
|
+
expect(identity.id).toBeDefined();
|
|
43
|
+
expect(identity.createdAt).toBeDefined();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("should get identity by ID", async () => {
|
|
47
|
+
const db = createInMemoryDB();
|
|
48
|
+
const adapter = await createUnumAdapter({ db });
|
|
49
|
+
|
|
50
|
+
const created = await adapter.setIdentity({ name: "Test" });
|
|
51
|
+
const fetched = await adapter.getIdentity(created.id);
|
|
52
|
+
|
|
53
|
+
expect(fetched).toBeDefined();
|
|
54
|
+
expect(fetched?.name).toBe("Test");
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("should create a channel", async () => {
|
|
58
|
+
const db = createInMemoryDB();
|
|
59
|
+
const adapter = await createUnumAdapter({ db });
|
|
60
|
+
|
|
61
|
+
const channel = await adapter.createChannel("test-channel");
|
|
62
|
+
|
|
63
|
+
expect(channel).toBeDefined();
|
|
64
|
+
expect(channel.name).toBe("test-channel");
|
|
65
|
+
expect(channel.id).toBeDefined();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("should join a channel", async () => {
|
|
69
|
+
const db = createInMemoryDB();
|
|
70
|
+
const adapter = await createUnumAdapter({ db });
|
|
71
|
+
|
|
72
|
+
const created = await adapter.createChannel("test-channel");
|
|
73
|
+
const joined = await adapter.joinChannel(created.id);
|
|
74
|
+
|
|
75
|
+
expect(joined.id).toBe(created.id);
|
|
76
|
+
expect(joined.name).toBe("test-channel");
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it("should list channels", async () => {
|
|
80
|
+
const db = createInMemoryDB();
|
|
81
|
+
const adapter = await createUnumAdapter({ db });
|
|
82
|
+
|
|
83
|
+
await adapter.createChannel("channel-1");
|
|
84
|
+
await adapter.createChannel("channel-2");
|
|
85
|
+
|
|
86
|
+
const channels = await adapter.listChannels();
|
|
87
|
+
|
|
88
|
+
expect(channels.length).toBe(2);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("should publish messages to channel", async () => {
|
|
92
|
+
const db = createInMemoryDB();
|
|
93
|
+
const adapter = await createUnumAdapter({
|
|
94
|
+
db,
|
|
95
|
+
identity: { id: "user-1", name: "User 1", createdAt: Date.now() },
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const channel = await adapter.createChannel("test-channel");
|
|
99
|
+
|
|
100
|
+
const messages: unknown[] = [];
|
|
101
|
+
channel.subscribe((msg) => messages.push(msg));
|
|
102
|
+
|
|
103
|
+
await channel.publish({
|
|
104
|
+
id: "msg-1",
|
|
105
|
+
sender: adapter.identity!,
|
|
106
|
+
content: { text: "Hello!" },
|
|
107
|
+
type: "text",
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
expect(messages.length).toBe(1);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it("should disconnect and cleanup", async () => {
|
|
114
|
+
const db = createInMemoryDB();
|
|
115
|
+
const adapter = await createUnumAdapter({ db });
|
|
116
|
+
|
|
117
|
+
await adapter.createChannel("test-channel");
|
|
118
|
+
await adapter.disconnect();
|
|
119
|
+
|
|
120
|
+
const channels = await adapter.listChannels();
|
|
121
|
+
expect(channels.length).toBe(0);
|
|
122
|
+
expect(adapter.identity).toBeNull();
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
describe("attachUnumToEngine", () => {
|
|
127
|
+
it("should attach adapter to engine", async () => {
|
|
128
|
+
const db = createInMemoryDB();
|
|
129
|
+
const adapter = await createUnumAdapter({ db });
|
|
130
|
+
const registry = new PraxisRegistry();
|
|
131
|
+
const engine = createPraxisEngine({
|
|
132
|
+
initialContext: {},
|
|
133
|
+
registry,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
const cleanup = attachUnumToEngine(engine, adapter, "test-channel");
|
|
137
|
+
|
|
138
|
+
expect(cleanup).toBeInstanceOf(Function);
|
|
139
|
+
cleanup();
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build Command
|
|
3
|
+
*
|
|
4
|
+
* Builds a Praxis application for production.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { spawn } from 'child_process';
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Build options
|
|
13
|
+
*/
|
|
14
|
+
export interface BuildOptions {
|
|
15
|
+
/** Output directory */
|
|
16
|
+
output?: string;
|
|
17
|
+
/** Build target */
|
|
18
|
+
target?: 'web' | 'desktop' | 'mobile';
|
|
19
|
+
/** Minify output */
|
|
20
|
+
minify?: boolean;
|
|
21
|
+
/** Generate source maps */
|
|
22
|
+
sourcemap?: boolean;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Build application for production
|
|
27
|
+
*/
|
|
28
|
+
export async function build(options: BuildOptions): Promise<void> {
|
|
29
|
+
const output = options.output || './dist';
|
|
30
|
+
const target = options.target || 'web';
|
|
31
|
+
|
|
32
|
+
console.log('\n╔═══════════════════════════════════════════════════╗');
|
|
33
|
+
console.log('║ Praxis Production Build ║');
|
|
34
|
+
console.log('╚═══════════════════════════════════════════════════╝\n');
|
|
35
|
+
|
|
36
|
+
// Check if we're in a Praxis project
|
|
37
|
+
const packageJsonPath = path.join(process.cwd(), 'package.json');
|
|
38
|
+
|
|
39
|
+
if (!fs.existsSync(packageJsonPath)) {
|
|
40
|
+
console.error('Error: No package.json found in current directory.');
|
|
41
|
+
console.log('Make sure you are in a Praxis project directory.\n');
|
|
42
|
+
process.exit(1);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Read package.json to check for build script
|
|
46
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
47
|
+
|
|
48
|
+
if (!packageJson.scripts?.build) {
|
|
49
|
+
console.error('Error: No "build" script found in package.json.');
|
|
50
|
+
console.log('\nTo build your Praxis project, add a build script to your package.json:');
|
|
51
|
+
console.log(' "scripts": {');
|
|
52
|
+
console.log(' "build": "vite build"');
|
|
53
|
+
console.log(' }\n');
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
console.log(`Building for: ${target}`);
|
|
58
|
+
console.log(`Output: ${output}`);
|
|
59
|
+
console.log('');
|
|
60
|
+
|
|
61
|
+
// Handle different build targets
|
|
62
|
+
if (target === 'desktop') {
|
|
63
|
+
await buildDesktop(options);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (target === 'mobile') {
|
|
68
|
+
await buildMobile(options);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Web build (default)
|
|
73
|
+
await buildWeb(options);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Build for web
|
|
78
|
+
*/
|
|
79
|
+
async function buildWeb(options: BuildOptions): Promise<void> {
|
|
80
|
+
const output = options.output || './dist';
|
|
81
|
+
|
|
82
|
+
console.log('🌐 Building web application...\n');
|
|
83
|
+
|
|
84
|
+
// Set up environment variables for Vite
|
|
85
|
+
const env = {
|
|
86
|
+
...process.env,
|
|
87
|
+
FORCE_COLOR: '1',
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// Build args
|
|
91
|
+
const args = ['run', 'build'];
|
|
92
|
+
if (output !== './dist') {
|
|
93
|
+
args.push('--', '--outDir', output);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return new Promise((resolve, reject) => {
|
|
97
|
+
const child = spawn('npm', args, {
|
|
98
|
+
stdio: 'inherit',
|
|
99
|
+
shell: true,
|
|
100
|
+
cwd: process.cwd(),
|
|
101
|
+
env,
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
child.on('error', (error) => {
|
|
105
|
+
console.error('Build failed:', error.message);
|
|
106
|
+
reject(error);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
child.on('exit', (code) => {
|
|
110
|
+
if (code === 0) {
|
|
111
|
+
console.log('\n✅ Build completed successfully!');
|
|
112
|
+
console.log(`\nOutput: ${output}/`);
|
|
113
|
+
console.log('\nTo preview the build:');
|
|
114
|
+
console.log(' npm run preview\n');
|
|
115
|
+
resolve();
|
|
116
|
+
} else {
|
|
117
|
+
console.error(`\n❌ Build failed with code ${code}`);
|
|
118
|
+
process.exit(code || 1);
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Build for desktop (Tauri)
|
|
126
|
+
*/
|
|
127
|
+
async function buildDesktop(_options: BuildOptions): Promise<void> {
|
|
128
|
+
console.log('🖥️ Building desktop application with Tauri...\n');
|
|
129
|
+
|
|
130
|
+
// Check if Tauri is configured
|
|
131
|
+
const tauriConfigPath = path.join(process.cwd(), 'src-tauri', 'tauri.conf.json');
|
|
132
|
+
|
|
133
|
+
if (!fs.existsSync(tauriConfigPath)) {
|
|
134
|
+
console.log('Tauri is not configured for this project.');
|
|
135
|
+
console.log('\nTo add Tauri support:');
|
|
136
|
+
console.log(' 1. npm install -D @tauri-apps/cli');
|
|
137
|
+
console.log(' 2. npm run tauri init');
|
|
138
|
+
console.log(' 3. praxis build --target desktop\n');
|
|
139
|
+
console.log('For more information, see the Tauri integration docs.');
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Check for tauri build script
|
|
144
|
+
const packageJson = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'), 'utf-8'));
|
|
145
|
+
|
|
146
|
+
const buildScript = packageJson.scripts?.['tauri:build'] || packageJson.scripts?.['tauri'];
|
|
147
|
+
|
|
148
|
+
return new Promise((resolve, reject) => {
|
|
149
|
+
const child = spawn('npm', ['run', buildScript ? 'tauri:build' : 'tauri', 'build'], {
|
|
150
|
+
stdio: 'inherit',
|
|
151
|
+
shell: true,
|
|
152
|
+
cwd: process.cwd(),
|
|
153
|
+
env: {
|
|
154
|
+
...process.env,
|
|
155
|
+
FORCE_COLOR: '1',
|
|
156
|
+
},
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
child.on('error', (error) => {
|
|
160
|
+
console.error('Desktop build failed:', error.message);
|
|
161
|
+
reject(error);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
child.on('exit', (code) => {
|
|
165
|
+
if (code === 0) {
|
|
166
|
+
console.log('\n✅ Desktop build completed!');
|
|
167
|
+
console.log('\nBundles are in: src-tauri/target/release/bundle/');
|
|
168
|
+
resolve();
|
|
169
|
+
} else {
|
|
170
|
+
console.error(`\n❌ Desktop build failed with code ${code}`);
|
|
171
|
+
process.exit(code || 1);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Build for mobile (Tauri mobile)
|
|
179
|
+
*/
|
|
180
|
+
async function buildMobile(_options: BuildOptions): Promise<void> {
|
|
181
|
+
console.log('📱 Building mobile application...\n');
|
|
182
|
+
|
|
183
|
+
// Check if Tauri mobile is configured
|
|
184
|
+
const tauriConfigPath = path.join(process.cwd(), 'src-tauri', 'tauri.conf.json');
|
|
185
|
+
|
|
186
|
+
if (!fs.existsSync(tauriConfigPath)) {
|
|
187
|
+
console.log('Tauri is not configured for this project.');
|
|
188
|
+
console.log('\nTo add mobile support:');
|
|
189
|
+
console.log(' 1. npm install -D @tauri-apps/cli');
|
|
190
|
+
console.log(' 2. npm run tauri init');
|
|
191
|
+
console.log(' 3. npm run tauri android init');
|
|
192
|
+
console.log(' 4. npm run tauri ios init');
|
|
193
|
+
console.log(' 5. praxis build --target mobile\n');
|
|
194
|
+
console.log('For more information, see the Tauri mobile docs.');
|
|
195
|
+
process.exit(1);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
console.log('Mobile build requires platform-specific setup:');
|
|
199
|
+
console.log('\n📱 Android:');
|
|
200
|
+
console.log(' npm run tauri android build');
|
|
201
|
+
console.log('\n🍎 iOS:');
|
|
202
|
+
console.log(' npm run tauri ios build\n');
|
|
203
|
+
}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canvas Command
|
|
3
|
+
*
|
|
4
|
+
* Opens the CodeCanvas visual schema editor.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as http from 'http';
|
|
10
|
+
import {
|
|
11
|
+
schemaToCanvas,
|
|
12
|
+
canvasToYaml,
|
|
13
|
+
canvasToMermaid,
|
|
14
|
+
createCanvasEditor,
|
|
15
|
+
} from '../../integrations/code-canvas.js';
|
|
16
|
+
import { loadSchemaFromFile } from '../../core/schema/loader.js';
|
|
17
|
+
import type { PraxisSchema } from '../../core/schema/types.js';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Canvas command options
|
|
21
|
+
*/
|
|
22
|
+
export interface CanvasOptions {
|
|
23
|
+
/** Port for Canvas server */
|
|
24
|
+
port?: string;
|
|
25
|
+
/** Mode (edit, view, present) */
|
|
26
|
+
mode?: 'edit' | 'view' | 'present';
|
|
27
|
+
/** Export format */
|
|
28
|
+
export?: 'yaml' | 'mermaid' | 'json';
|
|
29
|
+
/** Output file for export */
|
|
30
|
+
output?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Open CodeCanvas for visual editing
|
|
35
|
+
*/
|
|
36
|
+
export async function canvas(schemaPath: string | undefined, options: CanvasOptions): Promise<void> {
|
|
37
|
+
const port = parseInt(options.port || '3000', 10);
|
|
38
|
+
const mode = options.mode || 'edit';
|
|
39
|
+
|
|
40
|
+
console.log('\n╔═══════════════════════════════════════════════════╗');
|
|
41
|
+
console.log('║ CodeCanvas Visual Editor ║');
|
|
42
|
+
console.log('╚═══════════════════════════════════════════════════╝\n');
|
|
43
|
+
|
|
44
|
+
// If export format is specified, export and exit
|
|
45
|
+
if (options.export) {
|
|
46
|
+
await exportCanvas(schemaPath, options);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Load schema if provided
|
|
51
|
+
let schema: PraxisSchema | undefined;
|
|
52
|
+
if (schemaPath && fs.existsSync(schemaPath)) {
|
|
53
|
+
try {
|
|
54
|
+
const result = await loadSchemaFromFile(schemaPath);
|
|
55
|
+
if (result.errors.length > 0) {
|
|
56
|
+
console.error(`Error loading schema: ${result.errors.join(', ')}`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
schema = result.schema;
|
|
60
|
+
console.log(`✓ Loaded schema: ${schemaPath}`);
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.error(`Error loading schema: ${error}`);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Create canvas from schema
|
|
68
|
+
const editor = createCanvasEditor({ schema, layout: 'hierarchical' });
|
|
69
|
+
|
|
70
|
+
console.log(`\nStarting Canvas server on http://localhost:${port}`);
|
|
71
|
+
console.log(`Mode: ${mode}\n`);
|
|
72
|
+
|
|
73
|
+
// Start a simple HTTP server for the canvas
|
|
74
|
+
const server = http.createServer((req, res) => {
|
|
75
|
+
if (req.url === '/') {
|
|
76
|
+
res.writeHead(200, { 'Content-Type': 'text/html' });
|
|
77
|
+
res.end(generateCanvasHtml(editor.document, mode));
|
|
78
|
+
} else if (req.url === '/api/canvas') {
|
|
79
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
80
|
+
res.end(JSON.stringify(editor.document));
|
|
81
|
+
} else if (req.url === '/api/mermaid') {
|
|
82
|
+
res.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
83
|
+
res.end(editor.toMermaid());
|
|
84
|
+
} else if (req.url === '/api/yaml') {
|
|
85
|
+
res.writeHead(200, { 'Content-Type': 'text/yaml' });
|
|
86
|
+
res.end(editor.toYaml());
|
|
87
|
+
} else if (req.url === '/api/schema') {
|
|
88
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
89
|
+
res.end(JSON.stringify(editor.toSchema()));
|
|
90
|
+
} else {
|
|
91
|
+
res.writeHead(404);
|
|
92
|
+
res.end('Not found');
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
server.listen(port, () => {
|
|
97
|
+
console.log('Canvas server running!');
|
|
98
|
+
console.log(`\n Local: http://localhost:${port}`);
|
|
99
|
+
console.log(` Mermaid: http://localhost:${port}/api/mermaid`);
|
|
100
|
+
console.log(` YAML: http://localhost:${port}/api/yaml`);
|
|
101
|
+
console.log(` Schema: http://localhost:${port}/api/schema\n`);
|
|
102
|
+
console.log('Press Ctrl+C to stop.\n');
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
// Handle shutdown
|
|
106
|
+
process.on('SIGINT', () => {
|
|
107
|
+
console.log('\nShutting down Canvas server...');
|
|
108
|
+
server.close();
|
|
109
|
+
process.exit(0);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Export canvas to file
|
|
115
|
+
*/
|
|
116
|
+
async function exportCanvas(schemaPath: string | undefined, options: CanvasOptions): Promise<void> {
|
|
117
|
+
if (!schemaPath || !fs.existsSync(schemaPath)) {
|
|
118
|
+
console.error('Error: Schema file required for export');
|
|
119
|
+
console.log('Usage: praxis canvas <schema-file> --export yaml --output schema.canvas.yaml');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const result = await loadSchemaFromFile(schemaPath);
|
|
124
|
+
if (result.errors.length > 0 || !result.schema) {
|
|
125
|
+
console.error(`Error loading schema: ${result.errors.join(', ')}`);
|
|
126
|
+
process.exit(1);
|
|
127
|
+
}
|
|
128
|
+
const canvas = schemaToCanvas(result.schema);
|
|
129
|
+
|
|
130
|
+
let output: string;
|
|
131
|
+
let ext: string;
|
|
132
|
+
|
|
133
|
+
switch (options.export) {
|
|
134
|
+
case 'yaml':
|
|
135
|
+
output = canvasToYaml(canvas);
|
|
136
|
+
ext = 'yaml';
|
|
137
|
+
break;
|
|
138
|
+
case 'mermaid':
|
|
139
|
+
output = canvasToMermaid(canvas);
|
|
140
|
+
ext = 'mmd';
|
|
141
|
+
break;
|
|
142
|
+
case 'json':
|
|
143
|
+
default:
|
|
144
|
+
output = JSON.stringify(canvas, null, 2);
|
|
145
|
+
ext = 'json';
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const outputPath = options.output || `${path.basename(schemaPath, path.extname(schemaPath))}.canvas.${ext}`;
|
|
149
|
+
fs.writeFileSync(outputPath, output);
|
|
150
|
+
|
|
151
|
+
console.log(`✓ Exported canvas to: ${outputPath}`);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Generate HTML for canvas viewer
|
|
156
|
+
*/
|
|
157
|
+
function generateCanvasHtml(document: ReturnType<typeof createCanvasEditor>['document'], mode: string): string {
|
|
158
|
+
const mermaidDiagram = canvasToMermaid({
|
|
159
|
+
id: document.id,
|
|
160
|
+
name: document.name,
|
|
161
|
+
version: document.version,
|
|
162
|
+
nodes: document.nodes,
|
|
163
|
+
edges: document.edges,
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
return `<!DOCTYPE html>
|
|
167
|
+
<html lang="en">
|
|
168
|
+
<head>
|
|
169
|
+
<meta charset="UTF-8">
|
|
170
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
171
|
+
<title>CodeCanvas - ${document.name}</title>
|
|
172
|
+
<script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
|
|
173
|
+
<style>
|
|
174
|
+
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
175
|
+
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #1a1a2e; color: #eee; }
|
|
176
|
+
.header { background: #16213e; padding: 1rem 2rem; display: flex; justify-content: space-between; align-items: center; }
|
|
177
|
+
.header h1 { font-size: 1.25rem; color: #00d9ff; }
|
|
178
|
+
.header .mode { background: #0f3460; padding: 0.25rem 0.75rem; border-radius: 4px; font-size: 0.875rem; }
|
|
179
|
+
.main { padding: 2rem; display: flex; gap: 2rem; }
|
|
180
|
+
.canvas { flex: 1; background: #16213e; border-radius: 8px; padding: 1.5rem; min-height: 500px; }
|
|
181
|
+
.sidebar { width: 300px; }
|
|
182
|
+
.panel { background: #16213e; border-radius: 8px; padding: 1rem; margin-bottom: 1rem; }
|
|
183
|
+
.panel h3 { font-size: 0.875rem; color: #00d9ff; margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; }
|
|
184
|
+
.panel ul { list-style: none; }
|
|
185
|
+
.panel li { padding: 0.5rem 0; border-bottom: 1px solid #0f3460; font-size: 0.875rem; }
|
|
186
|
+
.panel li:last-child { border-bottom: none; }
|
|
187
|
+
.mermaid { background: #fff; border-radius: 8px; padding: 1rem; }
|
|
188
|
+
.stats { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.5rem; }
|
|
189
|
+
.stat { background: #0f3460; padding: 0.75rem; border-radius: 4px; text-align: center; }
|
|
190
|
+
.stat-value { font-size: 1.5rem; font-weight: bold; color: #00d9ff; }
|
|
191
|
+
.stat-label { font-size: 0.75rem; color: #888; }
|
|
192
|
+
</style>
|
|
193
|
+
</head>
|
|
194
|
+
<body>
|
|
195
|
+
<div class="header">
|
|
196
|
+
<h1>🎨 CodeCanvas - ${document.name}</h1>
|
|
197
|
+
<span class="mode">${mode.toUpperCase()} MODE</span>
|
|
198
|
+
</div>
|
|
199
|
+
<div class="main">
|
|
200
|
+
<div class="canvas">
|
|
201
|
+
<div class="mermaid">
|
|
202
|
+
${mermaidDiagram}
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
<div class="sidebar">
|
|
206
|
+
<div class="panel">
|
|
207
|
+
<h3>Statistics</h3>
|
|
208
|
+
<div class="stats">
|
|
209
|
+
<div class="stat">
|
|
210
|
+
<div class="stat-value">${document.nodes.filter(n => n.type === 'model').length}</div>
|
|
211
|
+
<div class="stat-label">Models</div>
|
|
212
|
+
</div>
|
|
213
|
+
<div class="stat">
|
|
214
|
+
<div class="stat-value">${document.nodes.filter(n => n.type === 'component').length}</div>
|
|
215
|
+
<div class="stat-label">Components</div>
|
|
216
|
+
</div>
|
|
217
|
+
<div class="stat">
|
|
218
|
+
<div class="stat-value">${document.nodes.filter(n => n.type === 'event').length}</div>
|
|
219
|
+
<div class="stat-label">Events</div>
|
|
220
|
+
</div>
|
|
221
|
+
<div class="stat">
|
|
222
|
+
<div class="stat-value">${document.nodes.filter(n => n.type === 'fact').length}</div>
|
|
223
|
+
<div class="stat-label">Facts</div>
|
|
224
|
+
</div>
|
|
225
|
+
</div>
|
|
226
|
+
</div>
|
|
227
|
+
<div class="panel">
|
|
228
|
+
<h3>Nodes</h3>
|
|
229
|
+
<ul>
|
|
230
|
+
${document.nodes.map(n => `<li><strong>${n.type}:</strong> ${n.label}</li>`).join('\n ')}
|
|
231
|
+
</ul>
|
|
232
|
+
</div>
|
|
233
|
+
<div class="panel">
|
|
234
|
+
<h3>Edges</h3>
|
|
235
|
+
<ul>
|
|
236
|
+
${document.edges.length ? document.edges.map(e => `<li>${e.source} → ${e.target}</li>`).join('\n ') : '<li>No edges</li>'}
|
|
237
|
+
</ul>
|
|
238
|
+
</div>
|
|
239
|
+
</div>
|
|
240
|
+
</div>
|
|
241
|
+
<script>
|
|
242
|
+
mermaid.initialize({ startOnLoad: true, theme: 'base' });
|
|
243
|
+
</script>
|
|
244
|
+
</body>
|
|
245
|
+
</html>`;
|
|
246
|
+
}
|