@plures/praxis 0.2.0 → 1.0.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/README.md +282 -76
- 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/{core → src/core}/schema/loader.js +2 -2
- 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 +237 -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 +1 -1
- 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/actors.ts +1 -1
- 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 +443 -0
- package/src/core/schema/loader.ts +2 -2
- 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 +178 -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/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,541 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PSF Validator
|
|
3
|
+
*
|
|
4
|
+
* Validates PSF schemas for correctness, completeness, and consistency.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type {
|
|
8
|
+
PSFSchema,
|
|
9
|
+
PSFFact,
|
|
10
|
+
PSFEvent,
|
|
11
|
+
PSFRule,
|
|
12
|
+
PSFConstraint,
|
|
13
|
+
PSFModel,
|
|
14
|
+
PSFComponent,
|
|
15
|
+
PSFFlow,
|
|
16
|
+
PSFFieldType,
|
|
17
|
+
} from './psf.js';
|
|
18
|
+
import { PSF_VERSION } from './psf.js';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Validation error
|
|
22
|
+
*/
|
|
23
|
+
export interface ValidationError {
|
|
24
|
+
/** Error path in schema */
|
|
25
|
+
path: string;
|
|
26
|
+
/** Error message */
|
|
27
|
+
message: string;
|
|
28
|
+
/** Error code */
|
|
29
|
+
code: string;
|
|
30
|
+
/** Severity */
|
|
31
|
+
severity: 'error' | 'warning' | 'info';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Validation result
|
|
36
|
+
*/
|
|
37
|
+
export interface ValidationResult {
|
|
38
|
+
/** Is schema valid */
|
|
39
|
+
valid: boolean;
|
|
40
|
+
/** Validation errors */
|
|
41
|
+
errors: ValidationError[];
|
|
42
|
+
/** Validation warnings */
|
|
43
|
+
warnings: ValidationError[];
|
|
44
|
+
/** Info messages */
|
|
45
|
+
info: ValidationError[];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Validation options
|
|
50
|
+
*/
|
|
51
|
+
export interface ValidationOptions {
|
|
52
|
+
/** Check for duplicate IDs */
|
|
53
|
+
checkDuplicates?: boolean;
|
|
54
|
+
/** Check references are valid */
|
|
55
|
+
checkReferences?: boolean;
|
|
56
|
+
/** Check identifier naming conventions */
|
|
57
|
+
checkNaming?: boolean;
|
|
58
|
+
/** Strict mode (treat warnings as errors) */
|
|
59
|
+
strict?: boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Reserved JavaScript keywords
|
|
64
|
+
*/
|
|
65
|
+
const RESERVED_KEYWORDS = new Set([
|
|
66
|
+
'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger',
|
|
67
|
+
'default', 'delete', 'do', 'else', 'export', 'extends', 'finally',
|
|
68
|
+
'for', 'function', 'if', 'import', 'in', 'instanceof', 'new',
|
|
69
|
+
'return', 'super', 'switch', 'this', 'throw', 'try', 'typeof',
|
|
70
|
+
'var', 'void', 'while', 'with', 'yield', 'let', 'static',
|
|
71
|
+
'enum', 'await', 'implements', 'interface', 'package', 'private',
|
|
72
|
+
'protected', 'public',
|
|
73
|
+
]);
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* PSF Validator class
|
|
77
|
+
*/
|
|
78
|
+
export class PSFValidator {
|
|
79
|
+
private options: Required<ValidationOptions>;
|
|
80
|
+
private errors: ValidationError[] = [];
|
|
81
|
+
private warnings: ValidationError[] = [];
|
|
82
|
+
private info: ValidationError[] = [];
|
|
83
|
+
|
|
84
|
+
constructor(options: ValidationOptions = {}) {
|
|
85
|
+
this.options = {
|
|
86
|
+
checkDuplicates: options.checkDuplicates ?? true,
|
|
87
|
+
checkReferences: options.checkReferences ?? true,
|
|
88
|
+
checkNaming: options.checkNaming ?? true,
|
|
89
|
+
strict: options.strict ?? false,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Validate a PSF schema
|
|
95
|
+
*/
|
|
96
|
+
validate(schema: PSFSchema): ValidationResult {
|
|
97
|
+
this.errors = [];
|
|
98
|
+
this.warnings = [];
|
|
99
|
+
this.info = [];
|
|
100
|
+
|
|
101
|
+
// Check version
|
|
102
|
+
this.validateVersion(schema);
|
|
103
|
+
|
|
104
|
+
// Check required fields
|
|
105
|
+
this.validateRequiredFields(schema);
|
|
106
|
+
|
|
107
|
+
// Validate individual sections (handle undefined arrays)
|
|
108
|
+
this.validateFacts(schema.facts || []);
|
|
109
|
+
this.validateEvents(schema.events || []);
|
|
110
|
+
this.validateRules(schema.rules || [], schema);
|
|
111
|
+
this.validateConstraints(schema.constraints || []);
|
|
112
|
+
this.validateModels(schema.models || []);
|
|
113
|
+
this.validateComponents(schema.components || [], schema);
|
|
114
|
+
this.validateFlows(schema.flows || []);
|
|
115
|
+
|
|
116
|
+
// Check for duplicate IDs
|
|
117
|
+
if (this.options.checkDuplicates) {
|
|
118
|
+
this.validateDuplicateIds(schema);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Check references
|
|
122
|
+
if (this.options.checkReferences) {
|
|
123
|
+
this.validateReferences(schema);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const isValid = this.options.strict
|
|
127
|
+
? this.errors.length === 0 && this.warnings.length === 0
|
|
128
|
+
: this.errors.length === 0;
|
|
129
|
+
|
|
130
|
+
return {
|
|
131
|
+
valid: isValid,
|
|
132
|
+
errors: this.errors,
|
|
133
|
+
warnings: this.warnings,
|
|
134
|
+
info: this.info,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Validate schema version
|
|
140
|
+
*/
|
|
141
|
+
private validateVersion(schema: PSFSchema): void {
|
|
142
|
+
if (!schema.$version) {
|
|
143
|
+
this.addError('$version', 'Schema version is required', 'missing-version');
|
|
144
|
+
} else if (schema.$version !== PSF_VERSION) {
|
|
145
|
+
this.addWarning(
|
|
146
|
+
'$version',
|
|
147
|
+
`Schema version ${schema.$version} does not match current PSF version ${PSF_VERSION}`,
|
|
148
|
+
'version-mismatch'
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Validate required fields
|
|
155
|
+
*/
|
|
156
|
+
private validateRequiredFields(schema: PSFSchema): void {
|
|
157
|
+
if (!schema.id) {
|
|
158
|
+
this.addError('id', 'Schema ID is required', 'missing-id');
|
|
159
|
+
}
|
|
160
|
+
if (!schema.name) {
|
|
161
|
+
this.addError('name', 'Schema name is required', 'missing-name');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Validate facts
|
|
167
|
+
*/
|
|
168
|
+
private validateFacts(facts: PSFFact[]): void {
|
|
169
|
+
facts.forEach((fact, index) => {
|
|
170
|
+
const path = `facts[${index}]`;
|
|
171
|
+
|
|
172
|
+
if (!fact.id) {
|
|
173
|
+
this.addError(`${path}.id`, 'Fact ID is required', 'missing-id');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (!fact.tag) {
|
|
177
|
+
this.addError(`${path}.tag`, 'Fact tag is required', 'missing-tag');
|
|
178
|
+
} else if (this.options.checkNaming && !this.isValidIdentifier(fact.tag)) {
|
|
179
|
+
this.addError(`${path}.tag`, `"${fact.tag}" is not a valid identifier`, 'invalid-identifier');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (!fact.payload) {
|
|
183
|
+
this.addError(`${path}.payload`, 'Fact payload is required', 'missing-payload');
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Validate events
|
|
190
|
+
*/
|
|
191
|
+
private validateEvents(events: PSFEvent[]): void {
|
|
192
|
+
events.forEach((event, index) => {
|
|
193
|
+
const path = `events[${index}]`;
|
|
194
|
+
|
|
195
|
+
if (!event.id) {
|
|
196
|
+
this.addError(`${path}.id`, 'Event ID is required', 'missing-id');
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
if (!event.tag) {
|
|
200
|
+
this.addError(`${path}.tag`, 'Event tag is required', 'missing-tag');
|
|
201
|
+
} else if (this.options.checkNaming && !this.isValidIdentifier(event.tag)) {
|
|
202
|
+
this.addError(`${path}.tag`, `"${event.tag}" is not a valid identifier`, 'invalid-identifier');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (!event.payload) {
|
|
206
|
+
this.addError(`${path}.payload`, 'Event payload is required', 'missing-payload');
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Validate rules
|
|
213
|
+
*/
|
|
214
|
+
private validateRules(rules: PSFRule[], schema: PSFSchema): void {
|
|
215
|
+
const eventTags = new Set((schema.events || []).map((e) => e.tag));
|
|
216
|
+
|
|
217
|
+
rules.forEach((rule, index) => {
|
|
218
|
+
const path = `rules[${index}]`;
|
|
219
|
+
|
|
220
|
+
if (!rule.id) {
|
|
221
|
+
this.addError(`${path}.id`, 'Rule ID is required', 'missing-id');
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
if (!rule.description) {
|
|
225
|
+
this.addWarning(`${path}.description`, 'Rule description is recommended', 'missing-description');
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (!rule.then) {
|
|
229
|
+
this.addError(`${path}.then`, 'Rule action (then) is required', 'missing-action');
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Check that triggers reference valid events
|
|
233
|
+
if (rule.triggers) {
|
|
234
|
+
rule.triggers.forEach((trigger, triggerIndex) => {
|
|
235
|
+
if (!eventTags.has(trigger)) {
|
|
236
|
+
this.addWarning(
|
|
237
|
+
`${path}.triggers[${triggerIndex}]`,
|
|
238
|
+
`Trigger "${trigger}" does not match any defined event`,
|
|
239
|
+
'unknown-trigger'
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Validate constraints
|
|
249
|
+
*/
|
|
250
|
+
private validateConstraints(constraints: PSFConstraint[]): void {
|
|
251
|
+
constraints.forEach((constraint, index) => {
|
|
252
|
+
const path = `constraints[${index}]`;
|
|
253
|
+
|
|
254
|
+
if (!constraint.id) {
|
|
255
|
+
this.addError(`${path}.id`, 'Constraint ID is required', 'missing-id');
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
if (!constraint.description) {
|
|
259
|
+
this.addWarning(`${path}.description`, 'Constraint description is recommended', 'missing-description');
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (!constraint.check) {
|
|
263
|
+
this.addError(`${path}.check`, 'Constraint check is required', 'missing-check');
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
if (!constraint.errorMessage) {
|
|
267
|
+
this.addWarning(`${path}.errorMessage`, 'Constraint error message is recommended', 'missing-error-message');
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Validate models
|
|
274
|
+
*/
|
|
275
|
+
private validateModels(models: PSFModel[]): void {
|
|
276
|
+
models.forEach((model, index) => {
|
|
277
|
+
const path = `models[${index}]`;
|
|
278
|
+
|
|
279
|
+
if (!model.id) {
|
|
280
|
+
this.addError(`${path}.id`, 'Model ID is required', 'missing-id');
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
if (!model.name) {
|
|
284
|
+
this.addError(`${path}.name`, 'Model name is required', 'missing-name');
|
|
285
|
+
} else if (this.options.checkNaming && !this.isValidTypeName(model.name)) {
|
|
286
|
+
this.addError(`${path}.name`, `"${model.name}" is not a valid type name (should be PascalCase)`, 'invalid-type-name');
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
if (!model.fields || model.fields.length === 0) {
|
|
290
|
+
this.addError(`${path}.fields`, 'Model must have at least one field', 'empty-fields');
|
|
291
|
+
} else {
|
|
292
|
+
this.validateModelFields(model.fields, `${path}.fields`);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Validate model fields
|
|
299
|
+
*/
|
|
300
|
+
private validateModelFields(fields: { name: string; type: PSFFieldType; optional?: boolean }[], basePath: string): void {
|
|
301
|
+
const fieldNames = new Set<string>();
|
|
302
|
+
|
|
303
|
+
fields.forEach((field, index) => {
|
|
304
|
+
const path = `${basePath}[${index}]`;
|
|
305
|
+
|
|
306
|
+
if (!field.name) {
|
|
307
|
+
this.addError(`${path}.name`, 'Field name is required', 'missing-name');
|
|
308
|
+
} else {
|
|
309
|
+
if (fieldNames.has(field.name)) {
|
|
310
|
+
this.addError(`${path}.name`, `Duplicate field name "${field.name}"`, 'duplicate-field');
|
|
311
|
+
}
|
|
312
|
+
fieldNames.add(field.name);
|
|
313
|
+
|
|
314
|
+
if (this.options.checkNaming && !this.isValidPropertyName(field.name)) {
|
|
315
|
+
this.addWarning(`${path}.name`, `"${field.name}" should be camelCase`, 'naming-convention');
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
if (!field.type) {
|
|
320
|
+
this.addError(`${path}.type`, 'Field type is required', 'missing-type');
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Validate components
|
|
327
|
+
*/
|
|
328
|
+
private validateComponents(components: PSFComponent[], schema: PSFSchema): void {
|
|
329
|
+
const modelNames = new Set((schema.models || []).map((m) => m.name));
|
|
330
|
+
|
|
331
|
+
components.forEach((component, index) => {
|
|
332
|
+
const path = `components[${index}]`;
|
|
333
|
+
|
|
334
|
+
if (!component.id) {
|
|
335
|
+
this.addError(`${path}.id`, 'Component ID is required', 'missing-id');
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (!component.name) {
|
|
339
|
+
this.addError(`${path}.name`, 'Component name is required', 'missing-name');
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (!component.type) {
|
|
343
|
+
this.addError(`${path}.type`, 'Component type is required', 'missing-type');
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Check model reference
|
|
347
|
+
if (component.model && !modelNames.has(component.model)) {
|
|
348
|
+
this.addWarning(
|
|
349
|
+
`${path}.model`,
|
|
350
|
+
`Model "${component.model}" does not exist`,
|
|
351
|
+
'unknown-model'
|
|
352
|
+
);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Validate flows
|
|
359
|
+
*/
|
|
360
|
+
private validateFlows(flows: PSFFlow[]): void {
|
|
361
|
+
flows.forEach((flow, index) => {
|
|
362
|
+
const path = `flows[${index}]`;
|
|
363
|
+
|
|
364
|
+
if (!flow.id) {
|
|
365
|
+
this.addError(`${path}.id`, 'Flow ID is required', 'missing-id');
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
if (!flow.name) {
|
|
369
|
+
this.addError(`${path}.name`, 'Flow name is required', 'missing-name');
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
if (!flow.type) {
|
|
373
|
+
this.addError(`${path}.type`, 'Flow type is required', 'missing-type');
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
if (!flow.steps || flow.steps.length === 0) {
|
|
377
|
+
this.addWarning(`${path}.steps`, 'Flow has no steps', 'empty-steps');
|
|
378
|
+
} else {
|
|
379
|
+
const stepIds = new Set(flow.steps.map((s) => s.id));
|
|
380
|
+
|
|
381
|
+
// Check step references
|
|
382
|
+
flow.steps.forEach((step, stepIndex) => {
|
|
383
|
+
const stepPath = `${path}.steps[${stepIndex}]`;
|
|
384
|
+
|
|
385
|
+
if (!step.id) {
|
|
386
|
+
this.addError(`${stepPath}.id`, 'Step ID is required', 'missing-id');
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Check next step references
|
|
390
|
+
if (step.next) {
|
|
391
|
+
if (typeof step.next === 'string') {
|
|
392
|
+
if (!stepIds.has(step.next)) {
|
|
393
|
+
this.addError(`${stepPath}.next`, `Step "${step.next}" does not exist`, 'invalid-step-reference');
|
|
394
|
+
}
|
|
395
|
+
} else {
|
|
396
|
+
Object.values(step.next).forEach((nextId) => {
|
|
397
|
+
if (!stepIds.has(nextId)) {
|
|
398
|
+
this.addError(`${stepPath}.next`, `Step "${nextId}" does not exist`, 'invalid-step-reference');
|
|
399
|
+
}
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
// Check initial step
|
|
406
|
+
if (flow.initial && !stepIds.has(flow.initial)) {
|
|
407
|
+
this.addError(`${path}.initial`, `Initial step "${flow.initial}" does not exist`, 'invalid-step-reference');
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
/**
|
|
414
|
+
* Validate for duplicate IDs across all sections
|
|
415
|
+
*/
|
|
416
|
+
private validateDuplicateIds(schema: PSFSchema): void {
|
|
417
|
+
const allIds = new Map<string, string[]>();
|
|
418
|
+
|
|
419
|
+
const addId = (id: string, type: string) => {
|
|
420
|
+
if (!allIds.has(id)) {
|
|
421
|
+
allIds.set(id, []);
|
|
422
|
+
}
|
|
423
|
+
allIds.get(id)!.push(type);
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
(schema.facts || []).forEach((f) => addId(f.id, 'fact'));
|
|
427
|
+
(schema.events || []).forEach((e) => addId(e.id, 'event'));
|
|
428
|
+
(schema.rules || []).forEach((r) => addId(r.id, 'rule'));
|
|
429
|
+
(schema.constraints || []).forEach((c) => addId(c.id, 'constraint'));
|
|
430
|
+
(schema.models || []).forEach((m) => addId(m.id, 'model'));
|
|
431
|
+
(schema.components || []).forEach((c) => addId(c.id, 'component'));
|
|
432
|
+
(schema.flows || []).forEach((f) => addId(f.id, 'flow'));
|
|
433
|
+
|
|
434
|
+
allIds.forEach((types, id) => {
|
|
435
|
+
if (types.length > 1) {
|
|
436
|
+
this.addError('', `Duplicate ID "${id}" found in: ${types.join(', ')}`, 'duplicate-id');
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Validate references between sections
|
|
443
|
+
*/
|
|
444
|
+
private validateReferences(schema: PSFSchema): void {
|
|
445
|
+
const modelNames = new Set((schema.models || []).map((m) => m.name));
|
|
446
|
+
|
|
447
|
+
// Check model references in field types
|
|
448
|
+
(schema.models || []).forEach((model, modelIndex) => {
|
|
449
|
+
(model.fields || []).forEach((field, fieldIndex) => {
|
|
450
|
+
this.checkFieldTypeReferences(
|
|
451
|
+
field.type,
|
|
452
|
+
modelNames,
|
|
453
|
+
`models[${modelIndex}].fields[${fieldIndex}].type`
|
|
454
|
+
);
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
// Check relationship references
|
|
458
|
+
model.relationships?.forEach((rel, relIndex) => {
|
|
459
|
+
if (!modelNames.has(rel.target)) {
|
|
460
|
+
this.addError(
|
|
461
|
+
`models[${modelIndex}].relationships[${relIndex}].target`,
|
|
462
|
+
`Target model "${rel.target}" does not exist`,
|
|
463
|
+
'invalid-reference'
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Check field type for references
|
|
472
|
+
*/
|
|
473
|
+
private checkFieldTypeReferences(type: PSFFieldType, modelNames: Set<string>, path: string): void {
|
|
474
|
+
if (typeof type === 'object') {
|
|
475
|
+
if ('reference' in type) {
|
|
476
|
+
if (!modelNames.has(type.reference)) {
|
|
477
|
+
this.addWarning(path, `Reference to unknown model "${type.reference}"`, 'unknown-reference');
|
|
478
|
+
}
|
|
479
|
+
} else if ('array' in type) {
|
|
480
|
+
this.checkFieldTypeReferences(type.array, modelNames, path);
|
|
481
|
+
} else if ('object' in type) {
|
|
482
|
+
Object.entries(type.object).forEach(([key, field]) => {
|
|
483
|
+
this.checkFieldTypeReferences(field.type, modelNames, `${path}.${key}`);
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* Check if string is valid JavaScript identifier
|
|
491
|
+
*/
|
|
492
|
+
private isValidIdentifier(str: string): boolean {
|
|
493
|
+
const identifierRegex = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
|
|
494
|
+
return identifierRegex.test(str) && !RESERVED_KEYWORDS.has(str);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* Check if string is valid type name (PascalCase)
|
|
499
|
+
*/
|
|
500
|
+
private isValidTypeName(str: string): boolean {
|
|
501
|
+
const pascalCaseRegex = /^[A-Z][a-zA-Z0-9]*$/;
|
|
502
|
+
return pascalCaseRegex.test(str);
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* Check if string is valid property name (camelCase)
|
|
507
|
+
*/
|
|
508
|
+
private isValidPropertyName(str: string): boolean {
|
|
509
|
+
const camelCaseRegex = /^[a-z][a-zA-Z0-9]*$/;
|
|
510
|
+
return camelCaseRegex.test(str) || str.startsWith('_');
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Add error
|
|
515
|
+
*/
|
|
516
|
+
private addError(path: string, message: string, code: string): void {
|
|
517
|
+
this.errors.push({ path, message, code, severity: 'error' });
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
/**
|
|
521
|
+
* Add warning
|
|
522
|
+
*/
|
|
523
|
+
private addWarning(path: string, message: string, code: string): void {
|
|
524
|
+
this.warnings.push({ path, message, code, severity: 'warning' });
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/**
|
|
529
|
+
* Create a PSF validator
|
|
530
|
+
*/
|
|
531
|
+
export function createPSFValidator(options?: ValidationOptions): PSFValidator {
|
|
532
|
+
return new PSFValidator(options);
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* Validate a PSF schema (convenience function)
|
|
537
|
+
*/
|
|
538
|
+
export function validatePSFSchema(schema: PSFSchema, options?: ValidationOptions): ValidationResult {
|
|
539
|
+
const validator = new PSFValidator(options);
|
|
540
|
+
return validator.validate(schema);
|
|
541
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Documentation Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates Markdown documentation from PSF schemas.
|
|
5
|
+
* Produces API docs, architecture diagrams, and user guides.
|
|
6
|
+
*/
|
|
7
|
+
import type { PSFSchema } from '../schema-engine/psf.js';
|
|
8
|
+
/**
|
|
9
|
+
* Documentation generator options
|
|
10
|
+
*/
|
|
11
|
+
export interface DocsGeneratorOptions {
|
|
12
|
+
/** Output directory */
|
|
13
|
+
outputDir?: string;
|
|
14
|
+
/** Include Mermaid diagrams */
|
|
15
|
+
includeDiagrams?: boolean;
|
|
16
|
+
/** Include code examples */
|
|
17
|
+
includeExamples?: boolean;
|
|
18
|
+
/** Include API reference */
|
|
19
|
+
includeApiReference?: boolean;
|
|
20
|
+
/** Include table of contents */
|
|
21
|
+
includeToc?: boolean;
|
|
22
|
+
/** Document format */
|
|
23
|
+
format?: 'markdown' | 'html';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Generated documentation file
|
|
27
|
+
*/
|
|
28
|
+
export interface GeneratedDoc {
|
|
29
|
+
/** File path */
|
|
30
|
+
path: string;
|
|
31
|
+
/** File content */
|
|
32
|
+
content: string;
|
|
33
|
+
/** Document type */
|
|
34
|
+
type: 'overview' | 'api' | 'model' | 'component' | 'flow' | 'diagram' | 'index';
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Documentation generation result
|
|
38
|
+
*/
|
|
39
|
+
export interface DocsGenerationResult {
|
|
40
|
+
success: boolean;
|
|
41
|
+
files: GeneratedDoc[];
|
|
42
|
+
errors: string[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Documentation Generator class
|
|
46
|
+
*/
|
|
47
|
+
export declare class DocsGenerator {
|
|
48
|
+
private options;
|
|
49
|
+
constructor(options?: DocsGeneratorOptions);
|
|
50
|
+
/**
|
|
51
|
+
* Generate all documentation from schema
|
|
52
|
+
*/
|
|
53
|
+
generate(schema: PSFSchema): DocsGenerationResult;
|
|
54
|
+
/**
|
|
55
|
+
* Generate overview document
|
|
56
|
+
*/
|
|
57
|
+
private generateOverview;
|
|
58
|
+
/**
|
|
59
|
+
* Generate API reference
|
|
60
|
+
*/
|
|
61
|
+
private generateApiReference;
|
|
62
|
+
/**
|
|
63
|
+
* Generate fact documentation
|
|
64
|
+
*/
|
|
65
|
+
private generateFactDoc;
|
|
66
|
+
/**
|
|
67
|
+
* Generate event documentation
|
|
68
|
+
*/
|
|
69
|
+
private generateEventDoc;
|
|
70
|
+
/**
|
|
71
|
+
* Generate rule documentation
|
|
72
|
+
*/
|
|
73
|
+
private generateRuleDoc;
|
|
74
|
+
/**
|
|
75
|
+
* Generate constraint documentation
|
|
76
|
+
*/
|
|
77
|
+
private generateConstraintDoc;
|
|
78
|
+
/**
|
|
79
|
+
* Generate models documentation
|
|
80
|
+
*/
|
|
81
|
+
private generateModelsDoc;
|
|
82
|
+
/**
|
|
83
|
+
* Generate components documentation
|
|
84
|
+
*/
|
|
85
|
+
private generateComponentsDoc;
|
|
86
|
+
/**
|
|
87
|
+
* Generate flows documentation
|
|
88
|
+
*/
|
|
89
|
+
private generateFlowsDoc;
|
|
90
|
+
/**
|
|
91
|
+
* Generate Mermaid diagrams
|
|
92
|
+
*/
|
|
93
|
+
private generateDiagrams;
|
|
94
|
+
/**
|
|
95
|
+
* Generate index document
|
|
96
|
+
*/
|
|
97
|
+
private generateIndex;
|
|
98
|
+
/**
|
|
99
|
+
* Format field type for display
|
|
100
|
+
*/
|
|
101
|
+
private formatFieldType;
|
|
102
|
+
/**
|
|
103
|
+
* Format field type simple (for Mermaid)
|
|
104
|
+
*/
|
|
105
|
+
private formatFieldTypeSimple;
|
|
106
|
+
/**
|
|
107
|
+
* Get example value for type
|
|
108
|
+
*/
|
|
109
|
+
private getExampleValue;
|
|
110
|
+
/**
|
|
111
|
+
* Sanitize ID for Mermaid
|
|
112
|
+
*/
|
|
113
|
+
private sanitizeId;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Create a docs generator
|
|
117
|
+
*/
|
|
118
|
+
export declare function createDocsGenerator(options?: DocsGeneratorOptions): DocsGenerator;
|
|
119
|
+
/**
|
|
120
|
+
* Generate documentation from PSF schema (convenience function)
|
|
121
|
+
*/
|
|
122
|
+
export declare function generateDocs(schema: PSFSchema, options?: DocsGeneratorOptions): DocsGenerationResult;
|
|
123
|
+
//# sourceMappingURL=docs-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docs-generator.d.ts","sourceRoot":"","sources":["../../../core/codegen/docs-generator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,SAAS,EASV,MAAM,yBAAyB,CAAC;AAEjC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4BAA4B;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,4BAA4B;IAC5B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,gCAAgC;IAChC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,sBAAsB;IACtB,MAAM,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gBAAgB;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,IAAI,EAAE,UAAU,GAAG,KAAK,GAAG,OAAO,GAAG,WAAW,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;CACjF;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAiC;gBAEpC,OAAO,GAAE,oBAAyB;IAW9C;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,oBAAoB;IA8CjD;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA8DxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAsE5B;;OAEG;IACH,OAAO,CAAC,eAAe;IA+CvB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+CxB;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA0B7B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAyDzB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAyD7B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAsDxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA0FxB;;OAEG;IACH,OAAO,CAAC,aAAa;IA4CrB;;OAEG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuBvB;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,aAAa,CAEjF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,oBAAoB,CAGpG"}
|