@specverse/engines 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/examples/09-api/ai-spec.yaml +194 -0
- package/assets/examples/09-api/converted.yaml +95 -0
- package/assets/examples/09-api/diagram-architecture.mmd +10 -0
- package/assets/examples/09-api/diagram-er.mmd +10 -0
- package/assets/examples/09-api/documentation.html +104 -0
- package/assets/examples/09-api/documentation.md +95 -0
- package/assets/examples/09-api/inferred-spec.yaml +420 -0
- package/assets/examples/09-api/openapi.json +61 -0
- package/assets/examples/10-api/README.md +216 -0
- package/assets/examples/10-api/ai-spec.yaml +194 -0
- package/assets/examples/10-api/converted.yaml +96 -0
- package/assets/examples/10-api/diagram-architecture.mmd +10 -0
- package/assets/examples/10-api/diagram-er.mmd +10 -0
- package/assets/examples/10-api/documentation.html +104 -0
- package/assets/examples/10-api/documentation.md +95 -0
- package/assets/examples/10-api/inferred-spec.yaml +7 -0
- package/assets/examples/10-api/metadata.yaml +89 -0
- package/assets/examples/10-api/openapi.json +61 -0
- package/assets/examples/10-api/package-integration-test.js +177 -0
- package/assets/examples/10-api/usage-example.js +323 -0
- package/assets/examples/10-api/usage-example.ts +363 -0
- package/assets/examples/10-api/workflow-test.js +113 -0
- package/assets/examples/manifests/01-simple-default-mappings.yaml +36 -0
- package/assets/examples/manifests/02-capability-mappings.yaml +55 -0
- package/assets/examples/manifests/03-hybrid-mappings.yaml +109 -0
- package/assets/examples/manifests/README.md +245 -0
- package/assets/examples/manifests/backend-only.yaml +43 -0
- package/assets/examples/manifests/blog-api.md +78 -0
- package/assets/examples/manifests/blog-api.specly +79 -0
- package/assets/examples/manifests/frontend-only.yaml +27 -0
- package/assets/examples/manifests/fullstack-app.yaml +44 -0
- package/assets/examples/manifests/fullstack-monorepo.yaml +62 -0
- package/assets/examples/validate-examples-with-expected-failures.cjs +328 -0
- package/assets/examples/validate-examples.cjs +225 -0
- package/assets/examples-decomposed/cloud-native-manifest.example.yaml +8 -0
- package/assets/examples-decomposed/cloud-native-manifest.md +379 -0
- package/assets/examples-decomposed/cloud-native-manifest.specly +60 -0
- package/assets/examples-decomposed/docker-compose-manifest.example.yaml +8 -0
- package/assets/examples-decomposed/docker-compose-manifest.md +326 -0
- package/assets/examples-decomposed/docker-compose-manifest.specly +40 -0
- package/assets/examples-decomposed/kubernetes-deployment-manifest.example.yaml +8 -0
- package/assets/examples-decomposed/kubernetes-deployment-manifest.md +237 -0
- package/assets/examples-decomposed/kubernetes-deployment-manifest.specly +41 -0
- package/assets/examples-inference/inference-engine-demo.example.yaml +8 -0
- package/assets/examples-inference/inference-engine-demo.md +574 -0
- package/assets/examples-inference/inference-engine-demo.specly +216 -0
- package/assets/prompts/MOVED.md +35 -0
- package/assets/prompts/SUMMARY-v8-PROMOTION.md +445 -0
- package/assets/prompts/core/CHANGELOG.md +158 -0
- package/assets/prompts/core/MIGRATION-v6-to-v7.md +379 -0
- package/assets/prompts/core/README.md +319 -0
- package/assets/prompts/core/base-terminal-prompt.md +201 -0
- package/assets/prompts/core/examples/example-usage.ts +140 -0
- package/assets/prompts/core/schemas/prompt.schema.json +309 -0
- package/assets/prompts/core/schemas/prompt.schema.yaml +229 -0
- package/assets/prompts/core/standard/archive/v1/analyse.prompt.yaml +259 -0
- package/assets/prompts/core/standard/archive/v1/create.prompt.yaml +302 -0
- package/assets/prompts/core/standard/archive/v1/materialise.prompt.yaml +328 -0
- package/assets/prompts/core/standard/archive/v1/realize.prompt.yaml +606 -0
- package/assets/prompts/core/standard/archive/v2/README.md +110 -0
- package/assets/prompts/core/standard/archive/v2/analyse.prompt.yaml +151 -0
- package/assets/prompts/core/standard/archive/v2/create.prompt.yaml +151 -0
- package/assets/prompts/core/standard/archive/v2/materialise.prompt.yaml +132 -0
- package/assets/prompts/core/standard/archive/v2/realize.prompt.yaml +147 -0
- package/assets/prompts/core/standard/archive/v3/README.md +279 -0
- package/assets/prompts/core/standard/archive/v3/analyse.prompt.yaml +309 -0
- package/assets/prompts/core/standard/archive/v3/create.prompt.yaml +351 -0
- package/assets/prompts/core/standard/archive/v3/materialise.prompt.yaml +247 -0
- package/assets/prompts/core/standard/archive/v3/realize.prompt.yaml +344 -0
- package/assets/prompts/core/standard/archive/v4/README.md +79 -0
- package/assets/prompts/core/standard/archive/v4/analyse.prompt.yaml +204 -0
- package/assets/prompts/core/standard/archive/v4/create.prompt.yaml +185 -0
- package/assets/prompts/core/standard/archive/v5/README.md +224 -0
- package/assets/prompts/core/standard/archive/v5/analyse.prompt.yaml +209 -0
- package/assets/prompts/core/standard/archive/v5/create.prompt.yaml +225 -0
- package/assets/prompts/core/standard/archive/v5/materialise.prompt.yaml +242 -0
- package/assets/prompts/core/standard/archive/v5/realize.prompt.yaml +336 -0
- package/assets/prompts/core/standard/archive/v6/README.md +187 -0
- package/assets/prompts/core/standard/archive/v6/analyse.prompt.yaml +219 -0
- package/assets/prompts/core/standard/archive/v6/create.prompt.yaml +180 -0
- package/assets/prompts/core/standard/archive/v6/materialise.prompt.yaml +203 -0
- package/assets/prompts/core/standard/archive/v6/realize.prompt.yaml +215 -0
- package/assets/prompts/core/standard/archive/v7/analyse.prompt.nick.yaml +144 -0
- package/assets/prompts/core/standard/archive/v7/analyse.prompt.old.yaml +146 -0
- package/assets/prompts/core/standard/archive/v7/analyse.prompt.yaml +129 -0
- package/assets/prompts/core/standard/archive/v7/create.prompt.yaml +146 -0
- package/assets/prompts/core/standard/archive/v7/materialise.prompt.yaml +297 -0
- package/assets/prompts/core/standard/archive/v7/realize.prompt.yaml +294 -0
- package/assets/prompts/core/standard/archive/v8/README.md +400 -0
- package/assets/prompts/core/standard/archive/v8/analyse.prompt.yaml +185 -0
- package/assets/prompts/core/standard/archive/v8/create.prompt.yaml +203 -0
- package/assets/prompts/core/standard/archive/v8/materialise.prompt.yaml +297 -0
- package/assets/prompts/core/standard/archive/v8/realize.prompt.yaml +294 -0
- package/assets/prompts/core/standard/default/analyse.prompt.yaml +496 -0
- package/assets/prompts/core/standard/default/app-demo.prompt.yaml +213 -0
- package/assets/prompts/core/standard/default/create.prompt.yaml +418 -0
- package/assets/prompts/core/standard/default/materialise.prompt.yaml +814 -0
- package/assets/prompts/core/standard/default/realize.prompt.yaml +574 -0
- package/assets/prompts/core/standard/v9/analyse.prompt.yaml +496 -0
- package/assets/prompts/core/standard/v9/create.prompt.yaml +418 -0
- package/assets/prompts/core/standard/v9/materialise.prompt.yaml +814 -0
- package/assets/prompts/core/standard/v9/realize.prompt.yaml +574 -0
- package/assets/prompts/templates/api-orchestrator-template.yaml +188 -0
- package/assets/prompts/templates/claude-integration-template.md +121 -0
- package/assets/prompts/templates/terminal-prompt-template.md +97 -0
- package/dist/ai/commands/enhance.d.ts +8 -0
- package/dist/ai/commands/enhance.d.ts.map +1 -0
- package/dist/ai/commands/enhance.js +155 -0
- package/dist/ai/commands/enhance.js.map +1 -0
- package/dist/ai/commands/fill.d.ts +8 -0
- package/dist/ai/commands/fill.d.ts.map +1 -0
- package/dist/ai/commands/fill.js +179 -0
- package/dist/ai/commands/fill.js.map +1 -0
- package/dist/ai/commands/index.d.ts +11 -0
- package/dist/ai/commands/index.d.ts.map +1 -0
- package/dist/ai/commands/index.js +11 -0
- package/dist/ai/commands/index.js.map +1 -0
- package/dist/ai/commands/spec-analyser.d.ts +18 -0
- package/dist/ai/commands/spec-analyser.d.ts.map +1 -0
- package/dist/ai/commands/spec-analyser.js +175 -0
- package/dist/ai/commands/spec-analyser.js.map +1 -0
- package/dist/ai/commands/suggest.d.ts +8 -0
- package/dist/ai/commands/suggest.d.ts.map +1 -0
- package/dist/ai/commands/suggest.js +101 -0
- package/dist/ai/commands/suggest.js.map +1 -0
- package/dist/ai/commands/template.d.ts +8 -0
- package/dist/ai/commands/template.d.ts.map +1 -0
- package/dist/ai/commands/template.js +136 -0
- package/dist/ai/commands/template.js.map +1 -0
- package/dist/ai/config/index.d.ts +71 -0
- package/dist/ai/config/index.d.ts.map +1 -0
- package/dist/ai/config/index.js +193 -0
- package/dist/ai/config/index.js.map +1 -0
- package/dist/ai/config-loader.d.ts +31 -0
- package/dist/ai/config-loader.d.ts.map +1 -0
- package/dist/ai/config-loader.js +66 -0
- package/dist/ai/config-loader.js.map +1 -0
- package/dist/ai/core/ecosystem-prompt-manager.d.ts +107 -0
- package/dist/ai/core/ecosystem-prompt-manager.d.ts.map +1 -0
- package/dist/ai/core/ecosystem-prompt-manager.js +462 -0
- package/dist/ai/core/ecosystem-prompt-manager.js.map +1 -0
- package/dist/ai/examples/basic-usage.d.ts +9 -0
- package/dist/ai/examples/basic-usage.d.ts.map +1 -0
- package/dist/ai/examples/basic-usage.js +94 -0
- package/dist/ai/examples/basic-usage.js.map +1 -0
- package/dist/ai/index.d.ts +44 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +164 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/orchestrator/index.d.ts +3 -0
- package/dist/ai/orchestrator/index.d.ts.map +1 -0
- package/dist/ai/orchestrator/index.js +3 -0
- package/dist/ai/orchestrator/index.js.map +1 -0
- package/dist/ai/orchestrator/interactive-workflow.d.ts +66 -0
- package/dist/ai/orchestrator/interactive-workflow.d.ts.map +1 -0
- package/dist/ai/orchestrator/interactive-workflow.js +214 -0
- package/dist/ai/orchestrator/interactive-workflow.js.map +1 -0
- package/dist/ai/orchestrator/specverse-orchestrator.d.ts +217 -0
- package/dist/ai/orchestrator/specverse-orchestrator.d.ts.map +1 -0
- package/dist/ai/orchestrator/specverse-orchestrator.js +745 -0
- package/dist/ai/orchestrator/specverse-orchestrator.js.map +1 -0
- package/dist/ai/prompt-loader.d.ts +24 -0
- package/dist/ai/prompt-loader.d.ts.map +1 -0
- package/dist/ai/prompt-loader.js +159 -0
- package/dist/ai/prompt-loader.js.map +1 -0
- package/dist/ai/providers/anthropic-provider.d.ts +38 -0
- package/dist/ai/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/ai/providers/anthropic-provider.js +235 -0
- package/dist/ai/providers/anthropic-provider.js.map +1 -0
- package/dist/ai/providers/index.d.ts +6 -0
- package/dist/ai/providers/index.d.ts.map +1 -0
- package/dist/ai/providers/index.js +6 -0
- package/dist/ai/providers/index.js.map +1 -0
- package/dist/ai/providers/interactive-provider.d.ts +67 -0
- package/dist/ai/providers/interactive-provider.d.ts.map +1 -0
- package/dist/ai/providers/interactive-provider.js +337 -0
- package/dist/ai/providers/interactive-provider.js.map +1 -0
- package/dist/ai/providers/llm-provider.d.ts +127 -0
- package/dist/ai/providers/llm-provider.d.ts.map +1 -0
- package/dist/ai/providers/llm-provider.js +141 -0
- package/dist/ai/providers/llm-provider.js.map +1 -0
- package/dist/ai/providers/openai-provider.d.ts +39 -0
- package/dist/ai/providers/openai-provider.d.ts.map +1 -0
- package/dist/ai/providers/openai-provider.js +193 -0
- package/dist/ai/providers/openai-provider.js.map +1 -0
- package/dist/ai/providers/provider-factory.d.ts +47 -0
- package/dist/ai/providers/provider-factory.d.ts.map +1 -0
- package/dist/ai/providers/provider-factory.js +159 -0
- package/dist/ai/providers/provider-factory.js.map +1 -0
- package/dist/ai/session/claude-executor.d.ts +39 -0
- package/dist/ai/session/claude-executor.d.ts.map +1 -0
- package/dist/ai/session/claude-executor.js +136 -0
- package/dist/ai/session/claude-executor.js.map +1 -0
- package/dist/ai/session/session-manager.d.ts +72 -0
- package/dist/ai/session/session-manager.d.ts.map +1 -0
- package/dist/ai/session/session-manager.js +294 -0
- package/dist/ai/session/session-manager.js.map +1 -0
- package/dist/ai/session/types.d.ts +152 -0
- package/dist/ai/session/types.d.ts.map +1 -0
- package/dist/ai/session/types.js +6 -0
- package/dist/ai/session/types.js.map +1 -0
- package/dist/ai/types/index.d.ts +83 -0
- package/dist/ai/types/index.d.ts.map +1 -0
- package/dist/ai/types/index.js +5 -0
- package/dist/ai/types/index.js.map +1 -0
- package/dist/generators/UML-generator.d.ts +64 -0
- package/dist/generators/UML-generator.d.ts.map +1 -0
- package/dist/generators/UML-generator.js +541 -0
- package/dist/generators/UML-generator.js.map +1 -0
- package/dist/generators/ai-view-generator.d.ts +391 -0
- package/dist/generators/ai-view-generator.d.ts.map +1 -0
- package/dist/generators/ai-view-generator.js +907 -0
- package/dist/generators/ai-view-generator.js.map +1 -0
- package/dist/generators/diagram-engine/core/BaseDiagramPlugin.d.ts +41 -0
- package/dist/generators/diagram-engine/core/BaseDiagramPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/core/BaseDiagramPlugin.js +64 -0
- package/dist/generators/diagram-engine/core/BaseDiagramPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/core/DiagramContext.d.ts +155 -0
- package/dist/generators/diagram-engine/core/DiagramContext.d.ts.map +1 -0
- package/dist/generators/diagram-engine/core/DiagramContext.js +481 -0
- package/dist/generators/diagram-engine/core/DiagramContext.js.map +1 -0
- package/dist/generators/diagram-engine/core/StyleManager.d.ts +51 -0
- package/dist/generators/diagram-engine/core/StyleManager.d.ts.map +1 -0
- package/dist/generators/diagram-engine/core/StyleManager.js +227 -0
- package/dist/generators/diagram-engine/core/StyleManager.js.map +1 -0
- package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.d.ts +83 -0
- package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.d.ts.map +1 -0
- package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.js +200 -0
- package/dist/generators/diagram-engine/core/UnifiedDiagramGenerator.js.map +1 -0
- package/dist/generators/diagram-engine/index.d.ts +41 -0
- package/dist/generators/diagram-engine/index.d.ts.map +1 -0
- package/dist/generators/diagram-engine/index.js +74 -0
- package/dist/generators/diagram-engine/index.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.d.ts +65 -0
- package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.js +490 -0
- package/dist/generators/diagram-engine/plugins/architecture/ArchitecturePlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.d.ts +40 -0
- package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.js +323 -0
- package/dist/generators/diagram-engine/plugins/class-diagram/ClassDiagramPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.d.ts +46 -0
- package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.js +391 -0
- package/dist/generators/diagram-engine/plugins/deployment/DeploymentPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.d.ts +57 -0
- package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.js +300 -0
- package/dist/generators/diagram-engine/plugins/er-diagram/ERDiagramPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.d.ts +70 -0
- package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.js +955 -0
- package/dist/generators/diagram-engine/plugins/event-flow/EventFlowPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.d.ts +40 -0
- package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.js +183 -0
- package/dist/generators/diagram-engine/plugins/lifecycle/LifecyclePlugin.js.map +1 -0
- package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.d.ts +71 -0
- package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.d.ts.map +1 -0
- package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.js +396 -0
- package/dist/generators/diagram-engine/plugins/manifest/ManifestPlugin.js.map +1 -0
- package/dist/generators/diagram-engine/renderers/MermaidRenderer.d.ts +72 -0
- package/dist/generators/diagram-engine/renderers/MermaidRenderer.d.ts.map +1 -0
- package/dist/generators/diagram-engine/renderers/MermaidRenderer.js +441 -0
- package/dist/generators/diagram-engine/renderers/MermaidRenderer.js.map +1 -0
- package/dist/generators/diagram-engine/types/index.d.ts +261 -0
- package/dist/generators/diagram-engine/types/index.d.ts.map +1 -0
- package/dist/generators/diagram-engine/types/index.js +7 -0
- package/dist/generators/diagram-engine/types/index.js.map +1 -0
- package/dist/generators/documentation-generator.d.ts +54 -0
- package/dist/generators/documentation-generator.d.ts.map +1 -0
- package/dist/generators/documentation-generator.js +756 -0
- package/dist/generators/documentation-generator.js.map +1 -0
- package/dist/generators/index.d.ts +47 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +51 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/inference/comprehensive-engine.d.ts +71 -0
- package/dist/inference/comprehensive-engine.d.ts.map +1 -0
- package/dist/inference/comprehensive-engine.js +271 -0
- package/dist/inference/comprehensive-engine.js.map +1 -0
- package/dist/inference/core/context.d.ts +60 -0
- package/dist/inference/core/context.d.ts.map +1 -0
- package/dist/inference/core/context.js +292 -0
- package/dist/inference/core/context.js.map +1 -0
- package/dist/inference/core/index.d.ts +14 -0
- package/dist/inference/core/index.d.ts.map +1 -0
- package/dist/inference/core/index.js +18 -0
- package/dist/inference/core/index.js.map +1 -0
- package/dist/inference/core/rule-engine.d.ts +52 -0
- package/dist/inference/core/rule-engine.d.ts.map +1 -0
- package/dist/inference/core/rule-engine.js +1329 -0
- package/dist/inference/core/rule-engine.js.map +1 -0
- package/dist/inference/core/rule-file-types.d.ts +225 -0
- package/dist/inference/core/rule-file-types.d.ts.map +1 -0
- package/dist/inference/core/rule-file-types.js +79 -0
- package/dist/inference/core/rule-file-types.js.map +1 -0
- package/dist/inference/core/rule-loader.d.ts +93 -0
- package/dist/inference/core/rule-loader.d.ts.map +1 -0
- package/dist/inference/core/rule-loader.js +645 -0
- package/dist/inference/core/rule-loader.js.map +1 -0
- package/dist/inference/core/specly-converter.d.ts +50 -0
- package/dist/inference/core/specly-converter.d.ts.map +1 -0
- package/dist/inference/core/specly-converter.js +885 -0
- package/dist/inference/core/specly-converter.js.map +1 -0
- package/dist/inference/core/types.d.ts +395 -0
- package/dist/inference/core/types.d.ts.map +1 -0
- package/dist/inference/core/types.js +31 -0
- package/dist/inference/core/types.js.map +1 -0
- package/dist/inference/deployment/deployment-generator.d.ts +48 -0
- package/dist/inference/deployment/deployment-generator.d.ts.map +1 -0
- package/dist/inference/deployment/deployment-generator.js +343 -0
- package/dist/inference/deployment/deployment-generator.js.map +1 -0
- package/dist/inference/deployment/index.d.ts +6 -0
- package/dist/inference/deployment/index.d.ts.map +1 -0
- package/dist/inference/deployment/index.js +5 -0
- package/dist/inference/deployment/index.js.map +1 -0
- package/dist/inference/dev-specly-generator.d.ts +19 -0
- package/dist/inference/dev-specly-generator.d.ts.map +1 -0
- package/dist/inference/dev-specly-generator.js +127 -0
- package/dist/inference/dev-specly-generator.js.map +1 -0
- package/dist/inference/index.d.ts +29 -0
- package/dist/inference/index.d.ts.map +1 -0
- package/dist/inference/index.js +170 -0
- package/dist/inference/index.js.map +1 -0
- package/dist/inference/logical/generators/component-type-resolver.d.ts +82 -0
- package/dist/inference/logical/generators/component-type-resolver.d.ts.map +1 -0
- package/dist/inference/logical/generators/component-type-resolver.js +151 -0
- package/dist/inference/logical/generators/component-type-resolver.js.map +1 -0
- package/dist/inference/logical/generators/controller-generator.d.ts +43 -0
- package/dist/inference/logical/generators/controller-generator.d.ts.map +1 -0
- package/dist/inference/logical/generators/controller-generator.js +303 -0
- package/dist/inference/logical/generators/controller-generator.js.map +1 -0
- package/dist/inference/logical/generators/event-generator.d.ts +67 -0
- package/dist/inference/logical/generators/event-generator.d.ts.map +1 -0
- package/dist/inference/logical/generators/event-generator.js +466 -0
- package/dist/inference/logical/generators/event-generator.js.map +1 -0
- package/dist/inference/logical/generators/promotion-generator.d.ts +32 -0
- package/dist/inference/logical/generators/promotion-generator.d.ts.map +1 -0
- package/dist/inference/logical/generators/promotion-generator.js +133 -0
- package/dist/inference/logical/generators/promotion-generator.js.map +1 -0
- package/dist/inference/logical/generators/service-generator.d.ts +51 -0
- package/dist/inference/logical/generators/service-generator.d.ts.map +1 -0
- package/dist/inference/logical/generators/service-generator.js +268 -0
- package/dist/inference/logical/generators/service-generator.js.map +1 -0
- package/dist/inference/logical/generators/specialist-view-expander.d.ts +75 -0
- package/dist/inference/logical/generators/specialist-view-expander.d.ts.map +1 -0
- package/dist/inference/logical/generators/specialist-view-expander.js +182 -0
- package/dist/inference/logical/generators/specialist-view-expander.js.map +1 -0
- package/dist/inference/logical/generators/view-generator.d.ts +131 -0
- package/dist/inference/logical/generators/view-generator.d.ts.map +1 -0
- package/dist/inference/logical/generators/view-generator.js +1115 -0
- package/dist/inference/logical/generators/view-generator.js.map +1 -0
- package/dist/inference/logical/index.d.ts +19 -0
- package/dist/inference/logical/index.d.ts.map +1 -0
- package/dist/inference/logical/index.js +15 -0
- package/dist/inference/logical/index.js.map +1 -0
- package/dist/inference/logical/logical-engine.d.ts +68 -0
- package/dist/inference/logical/logical-engine.d.ts.map +1 -0
- package/dist/inference/logical/logical-engine.js +484 -0
- package/dist/inference/logical/logical-engine.js.map +1 -0
- package/dist/inference/quint-transpiler.d.ts +64 -0
- package/dist/inference/quint-transpiler.d.ts.map +1 -0
- package/dist/inference/quint-transpiler.js +433 -0
- package/dist/inference/quint-transpiler.js.map +1 -0
- package/dist/inference/test-harness.d.ts +41 -0
- package/dist/inference/test-harness.d.ts.map +1 -0
- package/dist/inference/test-harness.js +357 -0
- package/dist/inference/test-harness.js.map +1 -0
- package/dist/parser/convention-processor.d.ts +66 -0
- package/dist/parser/convention-processor.d.ts.map +1 -0
- package/dist/parser/convention-processor.js +349 -0
- package/dist/parser/convention-processor.js.map +1 -0
- package/dist/parser/import-resolver/cache.d.ts +56 -0
- package/dist/parser/import-resolver/cache.d.ts.map +1 -0
- package/dist/parser/import-resolver/cache.js +191 -0
- package/dist/parser/import-resolver/cache.js.map +1 -0
- package/dist/parser/import-resolver/index.d.ts +10 -0
- package/dist/parser/import-resolver/index.d.ts.map +1 -0
- package/dist/parser/import-resolver/index.js +9 -0
- package/dist/parser/import-resolver/index.js.map +1 -0
- package/dist/parser/import-resolver/resolver.d.ts +102 -0
- package/dist/parser/import-resolver/resolver.d.ts.map +1 -0
- package/dist/parser/import-resolver/resolver.js +669 -0
- package/dist/parser/import-resolver/resolver.js.map +1 -0
- package/dist/parser/import-resolver/types.d.ts +55 -0
- package/dist/parser/import-resolver/types.d.ts.map +1 -0
- package/dist/parser/import-resolver/types.js +5 -0
- package/dist/parser/import-resolver/types.js.map +1 -0
- package/dist/parser/index.d.ts +38 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +61 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/namespace-utils.d.ts +61 -0
- package/dist/parser/namespace-utils.d.ts.map +1 -0
- package/dist/parser/namespace-utils.js +191 -0
- package/dist/parser/namespace-utils.js.map +1 -0
- package/dist/parser/processors/AbstractProcessor.d.ts +10 -0
- package/dist/parser/processors/AbstractProcessor.d.ts.map +1 -0
- package/dist/parser/processors/AbstractProcessor.js +11 -0
- package/dist/parser/processors/AbstractProcessor.js.map +1 -0
- package/dist/parser/processors/AttributeProcessor.d.ts +19 -0
- package/dist/parser/processors/AttributeProcessor.d.ts.map +1 -0
- package/dist/parser/processors/AttributeProcessor.js +154 -0
- package/dist/parser/processors/AttributeProcessor.js.map +1 -0
- package/dist/parser/processors/ControllerProcessor.d.ts +9 -0
- package/dist/parser/processors/ControllerProcessor.d.ts.map +1 -0
- package/dist/parser/processors/ControllerProcessor.js +74 -0
- package/dist/parser/processors/ControllerProcessor.js.map +1 -0
- package/dist/parser/processors/DeploymentProcessor.d.ts +19 -0
- package/dist/parser/processors/DeploymentProcessor.d.ts.map +1 -0
- package/dist/parser/processors/DeploymentProcessor.js +244 -0
- package/dist/parser/processors/DeploymentProcessor.js.map +1 -0
- package/dist/parser/processors/EventProcessor.d.ts +8 -0
- package/dist/parser/processors/EventProcessor.d.ts.map +1 -0
- package/dist/parser/processors/EventProcessor.js +28 -0
- package/dist/parser/processors/EventProcessor.js.map +1 -0
- package/dist/parser/processors/ExecutableProcessor.d.ts +21 -0
- package/dist/parser/processors/ExecutableProcessor.d.ts.map +1 -0
- package/dist/parser/processors/ExecutableProcessor.js +135 -0
- package/dist/parser/processors/ExecutableProcessor.js.map +1 -0
- package/dist/parser/processors/LifecycleProcessor.d.ts +9 -0
- package/dist/parser/processors/LifecycleProcessor.d.ts.map +1 -0
- package/dist/parser/processors/LifecycleProcessor.js +41 -0
- package/dist/parser/processors/LifecycleProcessor.js.map +1 -0
- package/dist/parser/processors/ModelProcessor.d.ts +67 -0
- package/dist/parser/processors/ModelProcessor.d.ts.map +1 -0
- package/dist/parser/processors/ModelProcessor.js +495 -0
- package/dist/parser/processors/ModelProcessor.js.map +1 -0
- package/dist/parser/processors/RelationshipProcessor.d.ts +10 -0
- package/dist/parser/processors/RelationshipProcessor.d.ts.map +1 -0
- package/dist/parser/processors/RelationshipProcessor.js +55 -0
- package/dist/parser/processors/RelationshipProcessor.js.map +1 -0
- package/dist/parser/processors/ServiceProcessor.d.ts +9 -0
- package/dist/parser/processors/ServiceProcessor.d.ts.map +1 -0
- package/dist/parser/processors/ServiceProcessor.js +59 -0
- package/dist/parser/processors/ServiceProcessor.js.map +1 -0
- package/dist/parser/processors/ViewProcessor.d.ts +7 -0
- package/dist/parser/processors/ViewProcessor.d.ts.map +1 -0
- package/dist/parser/processors/ViewProcessor.js +66 -0
- package/dist/parser/processors/ViewProcessor.js.map +1 -0
- package/dist/parser/types/ast.d.ts +518 -0
- package/dist/parser/types/ast.d.ts.map +1 -0
- package/dist/parser/types/ast.js +8 -0
- package/dist/parser/types/ast.js.map +1 -0
- package/dist/parser/types/views.d.ts +186 -0
- package/dist/parser/types/views.d.ts.map +1 -0
- package/dist/parser/types/views.js +8 -0
- package/dist/parser/types/views.js.map +1 -0
- package/dist/parser/unified-parser.d.ts +195 -0
- package/dist/parser/unified-parser.d.ts.map +1 -0
- package/dist/parser/unified-parser.js +1180 -0
- package/dist/parser/unified-parser.js.map +1 -0
- package/dist/parser/vitest.config.d.ts +3 -0
- package/dist/parser/vitest.config.d.ts.map +1 -0
- package/dist/parser/vitest.config.js +27 -0
- package/dist/parser/vitest.config.js.map +1 -0
- package/dist/realize/engines/code-generator.d.ts +86 -0
- package/dist/realize/engines/code-generator.d.ts.map +1 -0
- package/dist/realize/engines/code-generator.js +159 -0
- package/dist/realize/engines/code-generator.js.map +1 -0
- package/dist/realize/engines/engine-registry.d.ts +94 -0
- package/dist/realize/engines/engine-registry.d.ts.map +1 -0
- package/dist/realize/engines/engine-registry.js +163 -0
- package/dist/realize/engines/engine-registry.js.map +1 -0
- package/dist/realize/engines/index.d.ts +10 -0
- package/dist/realize/engines/index.d.ts.map +1 -0
- package/dist/realize/engines/index.js +12 -0
- package/dist/realize/engines/index.js.map +1 -0
- package/dist/realize/engines/typescript-engine.d.ts +74 -0
- package/dist/realize/engines/typescript-engine.d.ts.map +1 -0
- package/dist/realize/engines/typescript-engine.js +289 -0
- package/dist/realize/engines/typescript-engine.js.map +1 -0
- package/dist/realize/generators/index.d.ts +11 -0
- package/dist/realize/generators/index.d.ts.map +1 -0
- package/dist/realize/generators/index.js +11 -0
- package/dist/realize/generators/index.js.map +1 -0
- package/dist/realize/index.d.ts +48 -0
- package/dist/realize/index.d.ts.map +1 -0
- package/dist/realize/index.js +529 -0
- package/dist/realize/index.js.map +1 -0
- package/dist/realize/library/index.d.ts +12 -0
- package/dist/realize/library/index.d.ts.map +1 -0
- package/dist/realize/library/index.js +15 -0
- package/dist/realize/library/index.js.map +1 -0
- package/dist/realize/library/library.d.ts +132 -0
- package/dist/realize/library/library.d.ts.map +1 -0
- package/dist/realize/library/library.js +343 -0
- package/dist/realize/library/library.js.map +1 -0
- package/dist/realize/library/loader.d.ts +73 -0
- package/dist/realize/library/loader.d.ts.map +1 -0
- package/dist/realize/library/loader.js +159 -0
- package/dist/realize/library/loader.js.map +1 -0
- package/dist/realize/library/resolver.d.ts +104 -0
- package/dist/realize/library/resolver.d.ts.map +1 -0
- package/dist/realize/library/resolver.js +299 -0
- package/dist/realize/library/resolver.js.map +1 -0
- package/dist/realize/library/validator.d.ts +65 -0
- package/dist/realize/library/validator.d.ts.map +1 -0
- package/dist/realize/library/validator.js +203 -0
- package/dist/realize/library/validator.js.map +1 -0
- package/dist/realize/types/index.d.ts +5 -0
- package/dist/realize/types/index.d.ts.map +1 -0
- package/dist/realize/types/index.js +5 -0
- package/dist/realize/types/index.js.map +1 -0
- package/dist/realize/types/instance-factory.d.ts +7 -0
- package/dist/realize/types/instance-factory.d.ts.map +1 -0
- package/dist/realize/types/instance-factory.js +2 -0
- package/dist/realize/types/instance-factory.js.map +1 -0
- package/dist/realize/types/unified-mappings.d.ts +163 -0
- package/dist/realize/types/unified-mappings.d.ts.map +1 -0
- package/dist/realize/types/unified-mappings.js +110 -0
- package/dist/realize/types/unified-mappings.js.map +1 -0
- package/dist/realize/utils/ai-spec-loader.d.ts +77 -0
- package/dist/realize/utils/ai-spec-loader.d.ts.map +1 -0
- package/dist/realize/utils/ai-spec-loader.js +142 -0
- package/dist/realize/utils/ai-spec-loader.js.map +1 -0
- package/dist/realize/utils/index.d.ts +9 -0
- package/dist/realize/utils/index.d.ts.map +1 -0
- package/dist/realize/utils/index.js +9 -0
- package/dist/realize/utils/index.js.map +1 -0
- package/dist/realize/utils/manifest-loader.d.ts +107 -0
- package/dist/realize/utils/manifest-loader.d.ts.map +1 -0
- package/dist/realize/utils/manifest-loader.js +168 -0
- package/dist/realize/utils/manifest-loader.js.map +1 -0
- package/dist/realize/utils/mapping-migration.d.ts +53 -0
- package/dist/realize/utils/mapping-migration.d.ts.map +1 -0
- package/dist/realize/utils/mapping-migration.js +194 -0
- package/dist/realize/utils/mapping-migration.js.map +1 -0
- package/dist/registry/cache/cache-manager.d.ts +132 -0
- package/dist/registry/cache/cache-manager.d.ts.map +1 -0
- package/dist/registry/cache/cache-manager.js +218 -0
- package/dist/registry/cache/cache-manager.js.map +1 -0
- package/dist/registry/client/registry-client.d.ts +129 -0
- package/dist/registry/client/registry-client.d.ts.map +1 -0
- package/dist/registry/client/registry-client.js +317 -0
- package/dist/registry/client/registry-client.js.map +1 -0
- package/dist/registry/formatters/error-formatter.d.ts +100 -0
- package/dist/registry/formatters/error-formatter.d.ts.map +1 -0
- package/dist/registry/formatters/error-formatter.js +290 -0
- package/dist/registry/formatters/error-formatter.js.map +1 -0
- package/dist/registry/formatters/index.d.ts +8 -0
- package/dist/registry/formatters/index.d.ts.map +1 -0
- package/dist/registry/formatters/index.js +7 -0
- package/dist/registry/formatters/index.js.map +1 -0
- package/dist/registry/index.d.ts +19 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +22 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/registry/offline/offline-handler.d.ts +150 -0
- package/dist/registry/offline/offline-handler.d.ts.map +1 -0
- package/dist/registry/offline/offline-handler.js +290 -0
- package/dist/registry/offline/offline-handler.js.map +1 -0
- package/dist/registry/types/index.d.ts +13 -0
- package/dist/registry/types/index.d.ts.map +1 -0
- package/dist/registry/types/index.js +11 -0
- package/dist/registry/types/index.js.map +1 -0
- package/dist/registry/types/registry.d.ts +220 -0
- package/dist/registry/types/registry.d.ts.map +1 -0
- package/dist/registry/types/registry.js +55 -0
- package/dist/registry/types/registry.js.map +1 -0
- package/dist/registry/types/validation.d.ts +197 -0
- package/dist/registry/types/validation.d.ts.map +1 -0
- package/dist/registry/types/validation.js +140 -0
- package/dist/registry/types/validation.js.map +1 -0
- package/dist/registry/utils/manifest-adapter.d.ts +42 -0
- package/dist/registry/utils/manifest-adapter.d.ts.map +1 -0
- package/dist/registry/utils/manifest-adapter.js +182 -0
- package/dist/registry/utils/manifest-adapter.js.map +1 -0
- package/dist/registry/validators/index.d.ts +12 -0
- package/dist/registry/validators/index.d.ts.map +1 -0
- package/dist/registry/validators/index.js +9 -0
- package/dist/registry/validators/index.js.map +1 -0
- package/dist/registry/validators/installation-validator.d.ts +75 -0
- package/dist/registry/validators/installation-validator.d.ts.map +1 -0
- package/dist/registry/validators/installation-validator.js +142 -0
- package/dist/registry/validators/installation-validator.js.map +1 -0
- package/dist/registry/validators/manifest-validator.d.ts +82 -0
- package/dist/registry/validators/manifest-validator.d.ts.map +1 -0
- package/dist/registry/validators/manifest-validator.js +213 -0
- package/dist/registry/validators/manifest-validator.js.map +1 -0
- package/dist/registry/validators/validator.d.ts +113 -0
- package/dist/registry/validators/validator.d.ts.map +1 -0
- package/dist/registry/validators/validator.js +165 -0
- package/dist/registry/validators/validator.js.map +1 -0
- package/libs/instance-factories/CURVED-INTERFACE.md +278 -0
- package/libs/instance-factories/README.md +73 -0
- package/libs/instance-factories/applications/README.md +51 -0
- package/libs/instance-factories/applications/generic-app.yaml +52 -0
- package/libs/instance-factories/applications/react-app-runtime.yaml +139 -0
- package/libs/instance-factories/applications/react-app.yaml +186 -0
- package/libs/instance-factories/applications/templates/generic/backend-env-generator.ts +31 -0
- package/libs/instance-factories/applications/templates/generic/backend-package-json-generator.ts +84 -0
- package/libs/instance-factories/applications/templates/generic/backend-tsconfig-generator.ts +69 -0
- package/libs/instance-factories/applications/templates/generic/main-generator.ts +308 -0
- package/libs/instance-factories/applications/templates/react/_view-components-source.ts +555 -0
- package/libs/instance-factories/applications/templates/react/api-client-generator.ts +436 -0
- package/libs/instance-factories/applications/templates/react/api-types-generator.ts +153 -0
- package/libs/instance-factories/applications/templates/react/app-tsx-generator.ts +94 -0
- package/libs/instance-factories/applications/templates/react/env-example-generator.ts +24 -0
- package/libs/instance-factories/applications/templates/react/field-helpers-generator.ts +106 -0
- package/libs/instance-factories/applications/templates/react/gitignore-generator.ts +38 -0
- package/libs/instance-factories/applications/templates/react/index-css-generator.ts +14 -0
- package/libs/instance-factories/applications/templates/react/index-html-generator.ts +30 -0
- package/libs/instance-factories/applications/templates/react/main-tsx-generator.ts +34 -0
- package/libs/instance-factories/applications/templates/react/package-json-generator.ts +57 -0
- package/libs/instance-factories/applications/templates/react/pattern-adapter-generator.ts +179 -0
- package/libs/instance-factories/applications/templates/react/react-pattern-adapter.tsx +1347 -0
- package/libs/instance-factories/applications/templates/react/relationship-field-generator.ts +150 -0
- package/libs/instance-factories/applications/templates/react/runtime-app-tsx-generator.ts +90 -0
- package/libs/instance-factories/applications/templates/react/runtime-package-json-generator.ts +61 -0
- package/libs/instance-factories/applications/templates/react/tailwind-adapter-generator.ts +704 -0
- package/libs/instance-factories/applications/templates/react/tailwind-adapter-wrapper-generator.ts +84 -0
- package/libs/instance-factories/applications/templates/react/tsconfig-generator.ts +35 -0
- package/libs/instance-factories/applications/templates/react/use-api-hooks-generator.ts +121 -0
- package/libs/instance-factories/applications/templates/react/view-dashboard-generator.ts +150 -0
- package/libs/instance-factories/applications/templates/react/view-detail-generator.ts +150 -0
- package/libs/instance-factories/applications/templates/react/view-form-generator.ts +362 -0
- package/libs/instance-factories/applications/templates/react/view-list-generator.ts +98 -0
- package/libs/instance-factories/applications/templates/react/view-router-generator.ts +89 -0
- package/libs/instance-factories/applications/templates/react/vite-config-generator.ts +49 -0
- package/libs/instance-factories/archived/fastify-prisma.yaml +104 -0
- package/libs/instance-factories/cli/README.md +43 -0
- package/libs/instance-factories/cli/commander-js.yaml +55 -0
- package/libs/instance-factories/cli/templates/commander/cli-bin-wrapper-generator.ts +20 -0
- package/libs/instance-factories/cli/templates/commander/cli-entry-generator.d.ts +12 -0
- package/libs/instance-factories/cli/templates/commander/cli-entry-generator.d.ts.map +1 -0
- package/libs/instance-factories/cli/templates/commander/cli-entry-generator.js +115 -0
- package/libs/instance-factories/cli/templates/commander/cli-entry-generator.js.map +1 -0
- package/libs/instance-factories/cli/templates/commander/cli-entry-generator.ts +168 -0
- package/libs/instance-factories/cli/templates/commander/command-generator.d.ts +14 -0
- package/libs/instance-factories/cli/templates/commander/command-generator.d.ts.map +1 -0
- package/libs/instance-factories/cli/templates/commander/command-generator.js +182 -0
- package/libs/instance-factories/cli/templates/commander/command-generator.js.map +1 -0
- package/libs/instance-factories/cli/templates/commander/command-generator.ts +1036 -0
- package/libs/instance-factories/communication/README.md +47 -0
- package/libs/instance-factories/communication/event-emitter.yaml +56 -0
- package/libs/instance-factories/communication/rabbitmq-events.yaml +87 -0
- package/libs/instance-factories/communication/templates/eventemitter/bus-generator.ts +93 -0
- package/libs/instance-factories/communication/templates/eventemitter/publisher-generator.ts +117 -0
- package/libs/instance-factories/communication/templates/eventemitter/subscriber-generator.ts +101 -0
- package/libs/instance-factories/controllers/README.md +42 -0
- package/libs/instance-factories/controllers/fastify.yaml +127 -0
- package/libs/instance-factories/controllers/templates/fastify/meta-routes-generator.ts +103 -0
- package/libs/instance-factories/controllers/templates/fastify/routes-generator.ts +389 -0
- package/libs/instance-factories/controllers/templates/fastify/server-generator.ts +76 -0
- package/libs/instance-factories/infrastructure/README.md +29 -0
- package/libs/instance-factories/infrastructure/docker-k8s.yaml +61 -0
- package/libs/instance-factories/infrastructure/templates/docker-k8s/infrastructure-generator.ts +46 -0
- package/libs/instance-factories/orms/README.md +54 -0
- package/libs/instance-factories/orms/prisma.yaml +89 -0
- package/libs/instance-factories/orms/templates/prisma/schema-generator.ts +576 -0
- package/libs/instance-factories/orms/templates/prisma/services-generator.ts +408 -0
- package/libs/instance-factories/scaffolding/README.md +49 -0
- package/libs/instance-factories/scaffolding/generic-scaffold.yaml +65 -0
- package/libs/instance-factories/scaffolding/templates/generic/env-example-generator.ts +73 -0
- package/libs/instance-factories/scaffolding/templates/generic/env-generator.ts +85 -0
- package/libs/instance-factories/scaffolding/templates/generic/gitignore-generator.ts +69 -0
- package/libs/instance-factories/scaffolding/templates/generic/package-json-generator.ts +176 -0
- package/libs/instance-factories/scaffolding/templates/generic/readme-generator.ts +207 -0
- package/libs/instance-factories/scaffolding/templates/generic/tsconfig-generator.ts +78 -0
- package/libs/instance-factories/scaffolding/templates/generic/tsconfig-react-generator.ts +41 -0
- package/libs/instance-factories/sdks/README.md +28 -0
- package/libs/instance-factories/sdks/python-sdk.yaml +66 -0
- package/libs/instance-factories/sdks/templates/python/sdk-generator.ts +50 -0
- package/libs/instance-factories/sdks/templates/typescript/sdk-generator.ts +49 -0
- package/libs/instance-factories/sdks/typescript-sdk.yaml +59 -0
- package/libs/instance-factories/services/README.md +55 -0
- package/libs/instance-factories/services/prisma-services.yaml +71 -0
- package/libs/instance-factories/services/templates/memory/generate-interpreter.ts +25 -0
- package/libs/instance-factories/services/templates/memory/step-conventions-memory.ts +465 -0
- package/libs/instance-factories/services/templates/prisma/behavior-generator.ts +304 -0
- package/libs/instance-factories/services/templates/prisma/controller-generator.ts +532 -0
- package/libs/instance-factories/services/templates/prisma/service-generator.ts +334 -0
- package/libs/instance-factories/services/templates/prisma/step-conventions.ts +309 -0
- package/libs/instance-factories/services/templates/shared-patterns.ts +38 -0
- package/libs/instance-factories/shared/path-resolver.ts +111 -0
- package/libs/instance-factories/storage/README.md +34 -0
- package/libs/instance-factories/storage/mongodb.yaml +79 -0
- package/libs/instance-factories/storage/postgresql.yaml +75 -0
- package/libs/instance-factories/storage/redis.yaml +79 -0
- package/libs/instance-factories/storage/templates/mongodb/config-generator.ts +15 -0
- package/libs/instance-factories/storage/templates/mongodb/docker-generator.ts +18 -0
- package/libs/instance-factories/storage/templates/postgresql/config-generator.ts +54 -0
- package/libs/instance-factories/storage/templates/postgresql/docker-generator.ts +55 -0
- package/libs/instance-factories/storage/templates/redis/config-generator.ts +16 -0
- package/libs/instance-factories/storage/templates/redis/docker-generator.ts +18 -0
- package/libs/instance-factories/test-generation.ts +192 -0
- package/libs/instance-factories/testing/README.md +40 -0
- package/libs/instance-factories/testing/templates/vitest/tests-generator.ts +51 -0
- package/libs/instance-factories/testing/vitest-tests.yaml +63 -0
- package/libs/instance-factories/tools/README.md +70 -0
- package/libs/instance-factories/tools/mcp.yaml +36 -0
- package/libs/instance-factories/tools/templates/mcp/mcp-server-generator.ts +190 -0
- package/libs/instance-factories/tools/templates/mcp/static/docs/DEPLOYMENT_GUIDE.md +630 -0
- package/libs/instance-factories/tools/templates/mcp/static/docs/HYBRID_RESOURCE_SYSTEM.md +330 -0
- package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/EXTENSION_DEPLOYMENT.md +552 -0
- package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/LOCAL_DEPLOYMENT.md +164 -0
- package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/WEB_DEPLOYMENT.md +247 -0
- package/libs/instance-factories/tools/templates/mcp/static/package.json +94 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/build-enterprise.js +284 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/build-extension.js +139 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/build-local.js +74 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/build-web.js +156 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/copy-canonical-files.js +41 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/test-deployments.js +259 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/test-hybrid-resources.js +231 -0
- package/libs/instance-factories/tools/templates/mcp/static/scripts/test-hybrid-simple.js +196 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/controllers/MCPServerController.ts +293 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/events/EventEmitter.ts +90 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/index.ts +24 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/interfaces/ResourceProvider.ts +15 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/models/LibrarySuggestion.ts +106 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/models/SpecVerseResource.ts +75 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/server/mcp-server.ts +239 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/CLIProxyService.ts +1501 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/EmbeddedResourcesAdapter.ts +211 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/EntityModuleService.ts +308 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/HybridResourcesProvider.ts +210 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/LibraryToolsService.ts +356 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/OrchestratorBridge.ts +522 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/OrchestratorToolsService.ts +530 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/PromptToolsService.ts +594 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/services/ResourcesProviderService.ts +170 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/CLIProxyService.init.test.ts +544 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/CLIProxyService.test.ts +189 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/ResourcesProviderService.test.ts +89 -0
- package/libs/instance-factories/tools/templates/mcp/static/src/types/index.ts +110 -0
- package/libs/instance-factories/tools/templates/mcp/static/tsconfig.json +28 -0
- package/libs/instance-factories/tools/templates/vscode/static/extension.ts +1195 -0
- package/libs/instance-factories/tools/templates/vscode/static/language-configuration.json +34 -0
- package/libs/instance-factories/tools/templates/vscode/static/schemas/specverse-v3-schema.json +4279 -0
- package/libs/instance-factories/tools/templates/vscode/static/syntaxes/specverse.tmLanguage.json +138 -0
- package/libs/instance-factories/tools/templates/vscode/static/themes/README.md +74 -0
- package/libs/instance-factories/tools/templates/vscode/static/themes/complete-specverse-colors.json +122 -0
- package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-basic-theme.json +65 -0
- package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-complete-theme.json +123 -0
- package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-theme-colors.json +64 -0
- package/libs/instance-factories/tools/templates/vscode/vscode-extension-generator.ts +300 -0
- package/libs/instance-factories/tools/vscode.yaml +35 -0
- package/libs/instance-factories/validation/README.md +38 -0
- package/libs/instance-factories/validation/templates/zod/validation-generator.ts +46 -0
- package/libs/instance-factories/validation/zod.yaml +56 -0
- package/libs/instance-factories/views/README.md +62 -0
- package/libs/instance-factories/views/index.d.ts +13 -0
- package/libs/instance-factories/views/index.d.ts.map +1 -0
- package/libs/instance-factories/views/index.js +18 -0
- package/libs/instance-factories/views/index.js.map +1 -0
- package/libs/instance-factories/views/index.ts +45 -0
- package/libs/instance-factories/views/react-components.yaml +129 -0
- package/libs/instance-factories/views/templates/ARCHITECTURE.md +198 -0
- package/libs/instance-factories/views/templates/react/adapters/antd-adapter.ts +869 -0
- package/libs/instance-factories/views/templates/react/adapters/mui-adapter.ts +953 -0
- package/libs/instance-factories/views/templates/react/adapters/shadcn-adapter.ts +806 -0
- package/libs/instance-factories/views/templates/react/app-generator.ts +55 -0
- package/libs/instance-factories/views/templates/react/components-generator.ts +887 -0
- package/libs/instance-factories/views/templates/react/forms-generator.ts +343 -0
- package/libs/instance-factories/views/templates/react/frontend-package-json-generator.ts +57 -0
- package/libs/instance-factories/views/templates/react/hooks-generator.ts +122 -0
- package/libs/instance-factories/views/templates/react/index-css-generator.ts +14 -0
- package/libs/instance-factories/views/templates/react/index-html-generator.ts +34 -0
- package/libs/instance-factories/views/templates/react/main-tsx-generator.ts +29 -0
- package/libs/instance-factories/views/templates/react/react-component-generator.d.ts +152 -0
- package/libs/instance-factories/views/templates/react/react-component-generator.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/react/react-component-generator.js +398 -0
- package/libs/instance-factories/views/templates/react/react-component-generator.js.map +1 -0
- package/libs/instance-factories/views/templates/react/react-component-generator.ts +533 -0
- package/libs/instance-factories/views/templates/react/router-generator.ts +197 -0
- package/libs/instance-factories/views/templates/react/router-generic-generator.ts +132 -0
- package/libs/instance-factories/views/templates/react/shared-utils-generator.ts +188 -0
- package/libs/instance-factories/views/templates/react/spec-json-generator.ts +17 -0
- package/libs/instance-factories/views/templates/react/types-generator.ts +76 -0
- package/libs/instance-factories/views/templates/react/views-metadata-generator.ts +42 -0
- package/libs/instance-factories/views/templates/react/vite-config-generator.ts +38 -0
- package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.js.map +1 -0
- package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.ts +474 -0
- package/libs/instance-factories/views/templates/shared/__tests__/composite-patterns.test.ts +242 -0
- package/libs/instance-factories/views/templates/shared/adapter-types.d.ts +77 -0
- package/libs/instance-factories/views/templates/shared/adapter-types.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/adapter-types.js +47 -0
- package/libs/instance-factories/views/templates/shared/adapter-types.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/adapter-types.ts +142 -0
- package/libs/instance-factories/views/templates/shared/atomic-components-registry.d.ts +63 -0
- package/libs/instance-factories/views/templates/shared/atomic-components-registry.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/atomic-components-registry.js +822 -0
- package/libs/instance-factories/views/templates/shared/atomic-components-registry.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/atomic-components-registry.ts +908 -0
- package/libs/instance-factories/views/templates/shared/base-generator.d.ts +247 -0
- package/libs/instance-factories/views/templates/shared/base-generator.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/base-generator.js +363 -0
- package/libs/instance-factories/views/templates/shared/base-generator.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/base-generator.ts +608 -0
- package/libs/instance-factories/views/templates/shared/component-metadata.d.ts +254 -0
- package/libs/instance-factories/views/templates/shared/component-metadata.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/component-metadata.js +602 -0
- package/libs/instance-factories/views/templates/shared/component-metadata.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/component-metadata.ts +803 -0
- package/libs/instance-factories/views/templates/shared/composite-pattern-types.ts +250 -0
- package/libs/instance-factories/views/templates/shared/composite-patterns.ts +535 -0
- package/libs/instance-factories/views/templates/shared/index.ts +68 -0
- package/libs/instance-factories/views/templates/shared/pattern-validator.ts +279 -0
- package/libs/instance-factories/views/templates/shared/property-mapper.d.ts +149 -0
- package/libs/instance-factories/views/templates/shared/property-mapper.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/property-mapper.js +580 -0
- package/libs/instance-factories/views/templates/shared/property-mapper.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/property-mapper.ts +700 -0
- package/libs/instance-factories/views/templates/shared/syntax-mapper.d.ts +143 -0
- package/libs/instance-factories/views/templates/shared/syntax-mapper.d.ts.map +1 -0
- package/libs/instance-factories/views/templates/shared/syntax-mapper.js +420 -0
- package/libs/instance-factories/views/templates/shared/syntax-mapper.js.map +1 -0
- package/libs/instance-factories/views/templates/shared/syntax-mapper.ts +539 -0
- package/package.json +63 -0
|
@@ -0,0 +1,1180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unified SpecVerse Parser
|
|
3
|
+
*
|
|
4
|
+
* Combines functionality of SpecVerseParser and EnhancedSpecVerseParser
|
|
5
|
+
* into a single configurable parser with optional import resolution
|
|
6
|
+
*/
|
|
7
|
+
import * as yaml from 'js-yaml';
|
|
8
|
+
import * as path from 'path';
|
|
9
|
+
import * as fs from 'fs/promises';
|
|
10
|
+
import AjvModule from 'ajv/dist/2020.js';
|
|
11
|
+
import addFormatsModule from 'ajv-formats';
|
|
12
|
+
const Ajv = AjvModule.default || AjvModule;
|
|
13
|
+
const addFormats = addFormatsModule.default || addFormatsModule;
|
|
14
|
+
import { ConventionProcessor } from './convention-processor.js';
|
|
15
|
+
import { ImportResolver } from './import-resolver/index.js';
|
|
16
|
+
export class UnifiedSpecVerseParser {
|
|
17
|
+
conventionProcessor;
|
|
18
|
+
schemaValidator;
|
|
19
|
+
schema;
|
|
20
|
+
options;
|
|
21
|
+
importResolver;
|
|
22
|
+
warnings = [];
|
|
23
|
+
constructor(schema, options = {}) {
|
|
24
|
+
this.options = options;
|
|
25
|
+
this.conventionProcessor = new ConventionProcessor();
|
|
26
|
+
// Create AJV instance - v8 uses 2020-12 draft by default
|
|
27
|
+
this.schemaValidator = new Ajv({
|
|
28
|
+
allErrors: true,
|
|
29
|
+
strict: false,
|
|
30
|
+
removeAdditional: false, // Don't remove additional properties, fail validation instead
|
|
31
|
+
useDefaults: false, // Don't apply default values
|
|
32
|
+
coerceTypes: false, // Don't coerce types
|
|
33
|
+
validateFormats: true, // Ensure format validation is enabled
|
|
34
|
+
formats: {} // Initialize empty formats object
|
|
35
|
+
});
|
|
36
|
+
// Add commonly used formats manually to avoid ajv-formats compatibility issues
|
|
37
|
+
this.schemaValidator.addFormat('email', /^[^\s@]+@[^\s@]+\.[^\s@]+$/);
|
|
38
|
+
this.schemaValidator.addFormat('uri', /^https?:\/\/[^\s]+$/);
|
|
39
|
+
this.schemaValidator.addFormat('uuid', /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i);
|
|
40
|
+
this.schemaValidator.addFormat('date', /^\d{4}-\d{2}-\d{2}$/);
|
|
41
|
+
this.schemaValidator.addFormat('date-time', /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{3})?Z?$/);
|
|
42
|
+
// Try to add full ajv-formats if possible, but continue if it fails
|
|
43
|
+
try {
|
|
44
|
+
addFormats(this.schemaValidator);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
// ajv-formats has compatibility issues in mixed CommonJS/ES module environments
|
|
48
|
+
// We've already added the most common formats manually above
|
|
49
|
+
console.debug('Note: Using manual format validators due to ajv-formats compatibility issue');
|
|
50
|
+
}
|
|
51
|
+
// Remove $schema property to avoid meta-schema issues
|
|
52
|
+
// AJV v8 uses Draft 2020-12 by default, so we don't need the $schema property
|
|
53
|
+
// Ensure $id is preserved when processing the schema for validation
|
|
54
|
+
const { $schema, ...schemaForValidation } = schema;
|
|
55
|
+
if (schema.$id) {
|
|
56
|
+
Object.assign(schemaForValidation, { $id: schema.$id });
|
|
57
|
+
}
|
|
58
|
+
this.schema = schemaForValidation;
|
|
59
|
+
// Initialize import resolver if imports are enabled (default: enabled)
|
|
60
|
+
if (options.enableImports !== false) {
|
|
61
|
+
this.importResolver = options.importResolver || new ImportResolver({
|
|
62
|
+
basePath: options.basePath || process.cwd(),
|
|
63
|
+
cacheDir: options.cacheDir,
|
|
64
|
+
offline: options.offline || false,
|
|
65
|
+
debug: options.debug || false
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Parse content from a string with optional filename for context
|
|
71
|
+
*/
|
|
72
|
+
parseContent(content, filename) {
|
|
73
|
+
if (this.options.debug) {
|
|
74
|
+
console.log('[DEBUG] parseContent method called with debug:', this.options.debug);
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
this.warnings = [];
|
|
78
|
+
// 1. Handle imports if enabled
|
|
79
|
+
let processedContent = content;
|
|
80
|
+
let resolvedImports;
|
|
81
|
+
if (this.importResolver && this.options.enableImports !== false) {
|
|
82
|
+
const importResult = this.resolveAndMergeImports(content, filename);
|
|
83
|
+
processedContent = importResult.content;
|
|
84
|
+
resolvedImports = importResult.resolvedImports;
|
|
85
|
+
}
|
|
86
|
+
// 2. Parse YAML
|
|
87
|
+
const yamlData = yaml.load(processedContent);
|
|
88
|
+
if (this.options.debug) {
|
|
89
|
+
console.log('[UnifiedParser] Parsed YAML data:', JSON.stringify(yamlData, null, 2));
|
|
90
|
+
}
|
|
91
|
+
// 3. PRE-PROCESSING SCHEMA VALIDATION - validate original YAML structure
|
|
92
|
+
if (this.options.debug) {
|
|
93
|
+
console.log('[UnifiedParser] Starting pre-processing validation...');
|
|
94
|
+
try {
|
|
95
|
+
console.log('[UnifiedParser] About to run pre-processing validation on:', JSON.stringify(yamlData, null, 2));
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
console.log('[UnifiedParser] Error in debug logging:', e.message);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
let preSchemaErrors = [];
|
|
102
|
+
try {
|
|
103
|
+
preSchemaErrors = this.validateWithSchema(yamlData);
|
|
104
|
+
if (this.options.debug) {
|
|
105
|
+
console.log('[UnifiedParser] Pre-processing schema errors:', preSchemaErrors.length);
|
|
106
|
+
if (preSchemaErrors.length > 0) {
|
|
107
|
+
console.log('[UnifiedParser] Pre-processing errors details:', preSchemaErrors);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (e) {
|
|
112
|
+
if (this.options.debug) {
|
|
113
|
+
console.log('[UnifiedParser] Exception in pre-processing validation:', e.message);
|
|
114
|
+
}
|
|
115
|
+
preSchemaErrors = [`Pre-processing validation error: ${e.message}`];
|
|
116
|
+
}
|
|
117
|
+
if (preSchemaErrors.length > 0) {
|
|
118
|
+
// Return early if original structure is invalid
|
|
119
|
+
return {
|
|
120
|
+
errors: preSchemaErrors,
|
|
121
|
+
warnings: [...this.warnings]
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// 4. Process conventions (only if pre-validation passed)
|
|
125
|
+
const ast = this.conventionProcessor.process(yamlData);
|
|
126
|
+
// 5. Collect warnings from convention processor
|
|
127
|
+
this.warnings.push(...this.conventionProcessor.getWarnings());
|
|
128
|
+
// 6. Convert AST back to expanded YAML for post-processing validation
|
|
129
|
+
const processedYamlString = this.astToExpandedYaml(ast);
|
|
130
|
+
const processedYaml = yaml.load(processedYamlString);
|
|
131
|
+
if (this.options.debug) {
|
|
132
|
+
console.log('[UnifiedParser] Processed YAML string:', processedYamlString);
|
|
133
|
+
console.log('[UnifiedParser] Processed YAML after convention processing:', JSON.stringify(processedYaml, null, 2));
|
|
134
|
+
}
|
|
135
|
+
// 7. POST-PROCESSING SCHEMA VALIDATION - validate expanded conventions
|
|
136
|
+
if (this.options.debug) {
|
|
137
|
+
console.log('[UnifiedParser] About to run post-processing validation on:', JSON.stringify(processedYaml, null, 2));
|
|
138
|
+
}
|
|
139
|
+
const postSchemaErrors = this.validateWithSchema(processedYaml);
|
|
140
|
+
if (this.options.debug) {
|
|
141
|
+
console.log('[UnifiedParser] Post-processing schema errors:', postSchemaErrors.length);
|
|
142
|
+
if (postSchemaErrors.length > 0) {
|
|
143
|
+
console.log('[UnifiedParser] Post-processing errors details:', postSchemaErrors);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// 8. Semantic validation (if post-processing schema validation passes)
|
|
147
|
+
let semanticErrors = [];
|
|
148
|
+
if (postSchemaErrors.length === 0) {
|
|
149
|
+
semanticErrors = this.validateSemantics(ast);
|
|
150
|
+
}
|
|
151
|
+
// 9. Return unified result
|
|
152
|
+
return {
|
|
153
|
+
ast,
|
|
154
|
+
errors: [...postSchemaErrors, ...semanticErrors],
|
|
155
|
+
warnings: [...this.warnings],
|
|
156
|
+
resolvedImports
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
return {
|
|
161
|
+
errors: [error.message],
|
|
162
|
+
warnings: [...this.warnings]
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Parse a file from the filesystem
|
|
168
|
+
*/
|
|
169
|
+
parseFromFile(filePath) {
|
|
170
|
+
try {
|
|
171
|
+
const fs = require('fs');
|
|
172
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
173
|
+
return this.parseContent(content, filePath);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
return {
|
|
177
|
+
errors: [`File reading error: ${error.message}`],
|
|
178
|
+
warnings: []
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Parse YAML content directly (for compatibility)
|
|
184
|
+
*/
|
|
185
|
+
parse(yamlContent, format) {
|
|
186
|
+
return this.parseContent(yamlContent);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Parse .specly file specifically (for compatibility)
|
|
190
|
+
*/
|
|
191
|
+
parseSpeclyFile(content) {
|
|
192
|
+
return this.parse(content, 'specly');
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Parse .yaml file specifically (for compatibility)
|
|
196
|
+
*/
|
|
197
|
+
parseYamlFile(content) {
|
|
198
|
+
return this.parse(content, 'yaml');
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Process .specly content to expanded YAML format (for compatibility)
|
|
202
|
+
*/
|
|
203
|
+
processToYaml(speclyContent) {
|
|
204
|
+
const parseResult = this.parseSpeclyFile(speclyContent);
|
|
205
|
+
if (parseResult.errors.length > 0) {
|
|
206
|
+
return { yaml: '', errors: parseResult.errors };
|
|
207
|
+
}
|
|
208
|
+
if (!parseResult.ast) {
|
|
209
|
+
return { yaml: '', errors: ['No AST generated'] };
|
|
210
|
+
}
|
|
211
|
+
// Convert AST back to expanded YAML format
|
|
212
|
+
const expandedYaml = this.astToExpandedYaml(parseResult.ast);
|
|
213
|
+
return { yaml: expandedYaml, errors: [] };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Parse a file with import resolution (async version)
|
|
217
|
+
*/
|
|
218
|
+
async parseFileWithImports(filePath, options) {
|
|
219
|
+
// Merge options
|
|
220
|
+
const resolveOptions = { ...this.options, ...options };
|
|
221
|
+
// Read and parse the main file
|
|
222
|
+
const fileContent = await this.readFile(filePath);
|
|
223
|
+
const basePath = path.dirname(path.resolve(filePath));
|
|
224
|
+
// Parse without import resolution first
|
|
225
|
+
const parseResult = this.parseContent(fileContent, filePath);
|
|
226
|
+
if (!parseResult.ast || !this.importResolver || resolveOptions.enableImports === false) {
|
|
227
|
+
return parseResult;
|
|
228
|
+
}
|
|
229
|
+
// Resolve imports for each component
|
|
230
|
+
const enhancedResult = {
|
|
231
|
+
...parseResult,
|
|
232
|
+
resolvedImports: new Map()
|
|
233
|
+
};
|
|
234
|
+
for (const component of parseResult.ast.components) {
|
|
235
|
+
if (component.imports && component.imports.length > 0) {
|
|
236
|
+
const componentImports = await this.resolveComponentImports(component, basePath);
|
|
237
|
+
enhancedResult.resolvedImports.set(component.name, componentImports);
|
|
238
|
+
// Merge imported types into the component
|
|
239
|
+
if (componentImports.length > 0) {
|
|
240
|
+
this.mergeImportedTypes(component, componentImports);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
// Re-validate with resolved imports
|
|
245
|
+
const validationErrors = this.validateWithResolvedImports(parseResult.ast, enhancedResult.resolvedImports);
|
|
246
|
+
if (validationErrors.length > 0) {
|
|
247
|
+
enhancedResult.errors.push(...validationErrors);
|
|
248
|
+
}
|
|
249
|
+
return enhancedResult;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Resolve imports for a component
|
|
253
|
+
*/
|
|
254
|
+
async resolveComponentImports(component, basePath) {
|
|
255
|
+
if (!this.importResolver) {
|
|
256
|
+
return [];
|
|
257
|
+
}
|
|
258
|
+
const resolvedImports = [];
|
|
259
|
+
for (const importSpec of component.imports || []) {
|
|
260
|
+
try {
|
|
261
|
+
if (this.options.debug) {
|
|
262
|
+
console.log(`[UnifiedParser] Resolving import for ${component.name}:`, importSpec);
|
|
263
|
+
}
|
|
264
|
+
// Resolve the import
|
|
265
|
+
const resolved = await this.importResolver.resolve(importSpec, basePath);
|
|
266
|
+
// Parse the imported content
|
|
267
|
+
const importedAst = await this.parseImportedContent(resolved.content, resolved.contentType, resolved.path || resolved.url || 'imported');
|
|
268
|
+
// Extract selected types
|
|
269
|
+
const { selectedTypes, foundOriginalTypes } = this.extractSelectedTypes(importedAst, importSpec.select || [], importSpec.as || {});
|
|
270
|
+
resolvedImports.push({
|
|
271
|
+
importSpec: importSpec,
|
|
272
|
+
resolved,
|
|
273
|
+
selectedTypes,
|
|
274
|
+
foundOriginalTypes
|
|
275
|
+
});
|
|
276
|
+
if (this.options.debug) {
|
|
277
|
+
console.log(`[UnifiedParser] Resolved ${selectedTypes.size} types from import`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (error) {
|
|
281
|
+
console.error(`[UnifiedParser] Failed to resolve import:`, error.message);
|
|
282
|
+
// Continue with other imports even if one fails
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return resolvedImports;
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Parse imported content
|
|
289
|
+
*/
|
|
290
|
+
async parseImportedContent(content, contentType, source) {
|
|
291
|
+
let parsed;
|
|
292
|
+
if (contentType === 'json') {
|
|
293
|
+
parsed = JSON.parse(content);
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
parsed = yaml.load(content);
|
|
297
|
+
}
|
|
298
|
+
if (this.options.debug) {
|
|
299
|
+
console.log(`[UnifiedParser] parseImportedContent - source: ${source}`);
|
|
300
|
+
console.log(`[UnifiedParser] parseImportedContent - parsed keys:`, Object.keys(parsed));
|
|
301
|
+
console.log(`[UnifiedParser] parseImportedContent - has exports:`, !!parsed.exports);
|
|
302
|
+
}
|
|
303
|
+
// Handle different import formats
|
|
304
|
+
if (parsed.components) {
|
|
305
|
+
// Full SpecVerse specification
|
|
306
|
+
const result = this.parse(content);
|
|
307
|
+
if (result.ast) {
|
|
308
|
+
return result.ast;
|
|
309
|
+
}
|
|
310
|
+
// If parsing failed, log the errors for debugging
|
|
311
|
+
if (this.options.debug && result.errors.length > 0) {
|
|
312
|
+
console.log(`[UnifiedParser] Failed to parse imported content: ${result.errors.join(', ')}`);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
else if (parsed.exports) {
|
|
316
|
+
// Library catalog format
|
|
317
|
+
return await this.createAstFromLibraryCatalog(parsed, source);
|
|
318
|
+
}
|
|
319
|
+
else if (parsed.types) {
|
|
320
|
+
// Type definitions file
|
|
321
|
+
return this.createAstFromTypes(parsed.types);
|
|
322
|
+
}
|
|
323
|
+
else if (parsed.models || parsed.controllers || parsed.services || parsed.events || parsed.views) {
|
|
324
|
+
// Partial component specification
|
|
325
|
+
return this.createAstFromPartial(parsed);
|
|
326
|
+
}
|
|
327
|
+
// Fallback - treat as raw type definitions
|
|
328
|
+
return this.createAstFromTypes(parsed);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Create AST from type definitions
|
|
332
|
+
*/
|
|
333
|
+
createAstFromTypes(types) {
|
|
334
|
+
const component = {
|
|
335
|
+
name: 'imported-types',
|
|
336
|
+
namespace: 'imported',
|
|
337
|
+
version: '1.0.0',
|
|
338
|
+
description: 'Imported type definitions',
|
|
339
|
+
primitives: [],
|
|
340
|
+
models: [],
|
|
341
|
+
controllers: [],
|
|
342
|
+
services: [],
|
|
343
|
+
views: [],
|
|
344
|
+
events: [],
|
|
345
|
+
imports: [],
|
|
346
|
+
exports: {}
|
|
347
|
+
};
|
|
348
|
+
// Convert type definitions to models
|
|
349
|
+
for (const [typeName, typeDef] of Object.entries(types)) {
|
|
350
|
+
if (typeof typeDef === 'object' && typeDef !== null) {
|
|
351
|
+
component.models.push({
|
|
352
|
+
name: typeName,
|
|
353
|
+
description: typeDef.description || `Imported type ${typeName}`,
|
|
354
|
+
attributes: typeDef.attributes || {},
|
|
355
|
+
relationships: typeDef.relationships || {},
|
|
356
|
+
lifecycles: typeDef.lifecycles || {},
|
|
357
|
+
behaviors: typeDef.behaviors || {}
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
return {
|
|
362
|
+
components: [component],
|
|
363
|
+
deployments: [],
|
|
364
|
+
manifests: []
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Create AST from partial component specification
|
|
369
|
+
*/
|
|
370
|
+
createAstFromPartial(partial) {
|
|
371
|
+
const component = {
|
|
372
|
+
name: 'imported-component',
|
|
373
|
+
namespace: 'imported',
|
|
374
|
+
version: '1.0.0',
|
|
375
|
+
description: 'Imported component',
|
|
376
|
+
primitives: partial.primitives || [],
|
|
377
|
+
models: [],
|
|
378
|
+
controllers: partial.controllers || [],
|
|
379
|
+
services: partial.services || [],
|
|
380
|
+
views: partial.views || [],
|
|
381
|
+
events: partial.events || [],
|
|
382
|
+
imports: [],
|
|
383
|
+
exports: {}
|
|
384
|
+
};
|
|
385
|
+
// Convert models object to array format
|
|
386
|
+
if (partial.models && typeof partial.models === 'object') {
|
|
387
|
+
for (const [modelName, modelDef] of Object.entries(partial.models)) {
|
|
388
|
+
if (typeof modelDef === 'object' && modelDef !== null) {
|
|
389
|
+
component.models.push({
|
|
390
|
+
name: modelName,
|
|
391
|
+
description: modelDef.description || `Model ${modelName}`,
|
|
392
|
+
attributes: modelDef.attributes || {},
|
|
393
|
+
relationships: modelDef.relationships || {},
|
|
394
|
+
lifecycles: modelDef.lifecycles || {},
|
|
395
|
+
behaviors: modelDef.behaviors || {}
|
|
396
|
+
});
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return {
|
|
401
|
+
components: [component],
|
|
402
|
+
deployments: [],
|
|
403
|
+
manifests: []
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Create AST from library catalog format
|
|
408
|
+
*/
|
|
409
|
+
async createAstFromLibraryCatalog(catalog, basePath) {
|
|
410
|
+
if (this.options.debug) {
|
|
411
|
+
console.log(`[UnifiedParser] Creating AST from library catalog, basePath: ${basePath}`);
|
|
412
|
+
}
|
|
413
|
+
const component = {
|
|
414
|
+
name: catalog.domain?.name || 'library-catalog',
|
|
415
|
+
namespace: 'library',
|
|
416
|
+
version: catalog.domain?.version || '1.0.0',
|
|
417
|
+
description: catalog.domain?.description || 'Library catalog',
|
|
418
|
+
primitives: [],
|
|
419
|
+
models: [],
|
|
420
|
+
controllers: [],
|
|
421
|
+
services: [],
|
|
422
|
+
views: [],
|
|
423
|
+
events: [],
|
|
424
|
+
imports: [],
|
|
425
|
+
exports: {}
|
|
426
|
+
};
|
|
427
|
+
// Process exports from catalog
|
|
428
|
+
if (catalog.exports) {
|
|
429
|
+
for (const [category, categoryExports] of Object.entries(catalog.exports)) {
|
|
430
|
+
if (typeof categoryExports === 'object' && categoryExports !== null) {
|
|
431
|
+
for (const [exportName, exportInfo] of Object.entries(categoryExports)) {
|
|
432
|
+
if (exportInfo && typeof exportInfo === 'object' && exportInfo.source && exportInfo.types) {
|
|
433
|
+
try {
|
|
434
|
+
// Resolve relative path from catalog location
|
|
435
|
+
const catalogDir = basePath.endsWith('.yaml') || basePath.endsWith('.yml')
|
|
436
|
+
? path.dirname(basePath)
|
|
437
|
+
: basePath;
|
|
438
|
+
const sourcePath = path.resolve(catalogDir, exportInfo.source);
|
|
439
|
+
if (this.options.debug) {
|
|
440
|
+
console.log(`[UnifiedParser] Loading catalog source: ${sourcePath}`);
|
|
441
|
+
}
|
|
442
|
+
// Load the referenced source file
|
|
443
|
+
const sourceContent = await fs.readFile(sourcePath, 'utf8');
|
|
444
|
+
const sourceContentType = this.detectContentType(sourcePath, sourceContent);
|
|
445
|
+
// Parse the source content
|
|
446
|
+
const sourceAst = await this.parseImportedContent(sourceContent, sourceContentType, sourcePath);
|
|
447
|
+
// Extract types from the source
|
|
448
|
+
for (const sourceComponent of sourceAst.components) {
|
|
449
|
+
// Add models from source
|
|
450
|
+
for (const model of sourceComponent.models) {
|
|
451
|
+
if (exportInfo.types.includes(model.name)) {
|
|
452
|
+
component.models.push(model);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
// Add other types as needed
|
|
456
|
+
for (const primitive of sourceComponent.primitives || []) {
|
|
457
|
+
if (exportInfo.types.includes(primitive.name)) {
|
|
458
|
+
component.primitives.push(primitive);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
for (const controller of sourceComponent.controllers || []) {
|
|
462
|
+
if (exportInfo.types.includes(controller.name)) {
|
|
463
|
+
component.controllers.push(controller);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
for (const service of sourceComponent.services || []) {
|
|
467
|
+
if (exportInfo.types.includes(service.name)) {
|
|
468
|
+
component.services.push(service);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
for (const view of sourceComponent.views || []) {
|
|
472
|
+
if (exportInfo.types.includes(view.name)) {
|
|
473
|
+
component.views.push(view);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
for (const event of sourceComponent.events || []) {
|
|
477
|
+
if (exportInfo.types.includes(event.name)) {
|
|
478
|
+
component.events.push(event);
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
catch (error) {
|
|
484
|
+
if (this.options.debug) {
|
|
485
|
+
console.log(`[UnifiedParser] Failed to load catalog source ${exportInfo.source}: ${error.message}`);
|
|
486
|
+
}
|
|
487
|
+
// Continue with other exports even if one fails
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
return {
|
|
495
|
+
components: [component],
|
|
496
|
+
deployments: [],
|
|
497
|
+
manifests: []
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Detect content type from path or content
|
|
502
|
+
*/
|
|
503
|
+
detectContentType(pathOrUrl, content) {
|
|
504
|
+
// Check file extension
|
|
505
|
+
if (pathOrUrl.endsWith('.json'))
|
|
506
|
+
return 'json';
|
|
507
|
+
if (pathOrUrl.endsWith('.yaml') || pathOrUrl.endsWith('.yml') || pathOrUrl.endsWith('.specly'))
|
|
508
|
+
return 'yaml';
|
|
509
|
+
// Try to detect from content
|
|
510
|
+
const trimmed = content.trim();
|
|
511
|
+
if (trimmed.startsWith('{') || trimmed.startsWith('[')) {
|
|
512
|
+
try {
|
|
513
|
+
JSON.parse(trimmed);
|
|
514
|
+
return 'json';
|
|
515
|
+
}
|
|
516
|
+
catch {
|
|
517
|
+
// Not valid JSON
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
// Default to YAML
|
|
521
|
+
return 'yaml';
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Extract selected types from imported AST
|
|
525
|
+
*/
|
|
526
|
+
extractSelectedTypes(importedAst, select, aliases) {
|
|
527
|
+
const selectedTypes = new Map();
|
|
528
|
+
const foundOriginalTypes = new Set();
|
|
529
|
+
if (this.options.debug) {
|
|
530
|
+
console.log(`[UnifiedParser] Extracting types from imported AST with ${importedAst.components.length} components`);
|
|
531
|
+
for (const comp of importedAst.components) {
|
|
532
|
+
console.log(`[UnifiedParser] Component ${comp.name} has primitives: ${comp.primitives?.map(p => p.name) || []}`);
|
|
533
|
+
console.log(`[UnifiedParser] Component ${comp.name} has models: ${comp.models.map(m => m.name)}`);
|
|
534
|
+
console.log(`[UnifiedParser] Component ${comp.name} has events: ${comp.events?.map(e => e.name) || []}`);
|
|
535
|
+
console.log(`[UnifiedParser] Component ${comp.name} has controllers: ${comp.controllers?.map(c => c.name) || []}`);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
// If no select list, import everything
|
|
539
|
+
if (select.length === 0) {
|
|
540
|
+
for (const component of importedAst.components) {
|
|
541
|
+
// Add all primitives
|
|
542
|
+
for (const primitive of component.primitives || []) {
|
|
543
|
+
const name = aliases[primitive.name] || primitive.name;
|
|
544
|
+
selectedTypes.set(name, { type: 'primitive', definition: primitive });
|
|
545
|
+
foundOriginalTypes.add(primitive.name);
|
|
546
|
+
}
|
|
547
|
+
// Add all models
|
|
548
|
+
for (const model of component.models) {
|
|
549
|
+
const name = aliases[model.name] || model.name;
|
|
550
|
+
selectedTypes.set(name, { type: 'model', definition: model });
|
|
551
|
+
foundOriginalTypes.add(model.name);
|
|
552
|
+
}
|
|
553
|
+
// Add all events
|
|
554
|
+
for (const event of component.events || []) {
|
|
555
|
+
const name = aliases[event.name] || event.name;
|
|
556
|
+
selectedTypes.set(name, { type: 'event', definition: event });
|
|
557
|
+
foundOriginalTypes.add(event.name);
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
return { selectedTypes, foundOriginalTypes };
|
|
561
|
+
}
|
|
562
|
+
// Extract only selected types
|
|
563
|
+
for (const typeName of select) {
|
|
564
|
+
if (this.options.debug) {
|
|
565
|
+
console.log(`[UnifiedParser] Looking for type: ${typeName}`);
|
|
566
|
+
}
|
|
567
|
+
let found = false;
|
|
568
|
+
for (const component of importedAst.components) {
|
|
569
|
+
// Check primitives first
|
|
570
|
+
const primitive = (component.primitives || []).find((p) => p.name === typeName);
|
|
571
|
+
if (primitive) {
|
|
572
|
+
const name = aliases[typeName] || typeName;
|
|
573
|
+
selectedTypes.set(name, { type: 'primitive', definition: primitive });
|
|
574
|
+
foundOriginalTypes.add(typeName);
|
|
575
|
+
found = true;
|
|
576
|
+
if (this.options.debug) {
|
|
577
|
+
console.log(`[UnifiedParser] Found primitive: ${typeName} as ${name}`);
|
|
578
|
+
}
|
|
579
|
+
break;
|
|
580
|
+
}
|
|
581
|
+
// Check models
|
|
582
|
+
const model = component.models.find(m => m.name === typeName);
|
|
583
|
+
if (model) {
|
|
584
|
+
const name = aliases[typeName] || typeName;
|
|
585
|
+
selectedTypes.set(name, { type: 'model', definition: model });
|
|
586
|
+
foundOriginalTypes.add(typeName);
|
|
587
|
+
found = true;
|
|
588
|
+
if (this.options.debug) {
|
|
589
|
+
console.log(`[UnifiedParser] Found model: ${typeName} as ${name}`);
|
|
590
|
+
}
|
|
591
|
+
break;
|
|
592
|
+
}
|
|
593
|
+
// Check events
|
|
594
|
+
const event = (component.events || []).find(e => e.name === typeName);
|
|
595
|
+
if (event) {
|
|
596
|
+
const name = aliases[typeName] || typeName;
|
|
597
|
+
selectedTypes.set(name, { type: 'event', definition: event });
|
|
598
|
+
foundOriginalTypes.add(typeName);
|
|
599
|
+
found = true;
|
|
600
|
+
if (this.options.debug) {
|
|
601
|
+
console.log(`[UnifiedParser] Found event: ${typeName} as ${name}`);
|
|
602
|
+
}
|
|
603
|
+
break;
|
|
604
|
+
}
|
|
605
|
+
// Check controllers
|
|
606
|
+
const controller = (component.controllers || []).find(c => c.name === typeName);
|
|
607
|
+
if (controller) {
|
|
608
|
+
const name = aliases[typeName] || typeName;
|
|
609
|
+
selectedTypes.set(name, { type: 'controller', definition: controller });
|
|
610
|
+
foundOriginalTypes.add(typeName);
|
|
611
|
+
found = true;
|
|
612
|
+
if (this.options.debug) {
|
|
613
|
+
console.log(`[UnifiedParser] Found controller: ${typeName} as ${name}`);
|
|
614
|
+
}
|
|
615
|
+
break;
|
|
616
|
+
}
|
|
617
|
+
// Check services
|
|
618
|
+
const service = (component.services || []).find(s => s.name === typeName);
|
|
619
|
+
if (service) {
|
|
620
|
+
const name = aliases[typeName] || typeName;
|
|
621
|
+
selectedTypes.set(name, { type: 'service', definition: service });
|
|
622
|
+
foundOriginalTypes.add(typeName);
|
|
623
|
+
found = true;
|
|
624
|
+
if (this.options.debug) {
|
|
625
|
+
console.log(`[UnifiedParser] Found service: ${typeName} as ${name}`);
|
|
626
|
+
}
|
|
627
|
+
break;
|
|
628
|
+
}
|
|
629
|
+
// Check views
|
|
630
|
+
const view = (component.views || []).find(v => v.name === typeName);
|
|
631
|
+
if (view) {
|
|
632
|
+
const name = aliases[typeName] || typeName;
|
|
633
|
+
selectedTypes.set(name, { type: 'view', definition: view });
|
|
634
|
+
foundOriginalTypes.add(typeName);
|
|
635
|
+
found = true;
|
|
636
|
+
if (this.options.debug) {
|
|
637
|
+
console.log(`[UnifiedParser] Found view: ${typeName} as ${name}`);
|
|
638
|
+
}
|
|
639
|
+
break;
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
if (!found && this.options.debug) {
|
|
643
|
+
console.log(`[UnifiedParser] Type not found: ${typeName}`);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
return { selectedTypes, foundOriginalTypes };
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Merge imported types into component
|
|
650
|
+
*/
|
|
651
|
+
mergeImportedTypes(component, imports) {
|
|
652
|
+
// Create a set of imported type names for tracking
|
|
653
|
+
const importedTypeNames = new Set();
|
|
654
|
+
for (const importInfo of imports) {
|
|
655
|
+
if (!importInfo.selectedTypes)
|
|
656
|
+
continue;
|
|
657
|
+
for (const [name, typeInfo] of importInfo.selectedTypes) {
|
|
658
|
+
importedTypeNames.add(name);
|
|
659
|
+
// Store import metadata on the component
|
|
660
|
+
if (!component.importedTypes) {
|
|
661
|
+
component.importedTypes = new Map();
|
|
662
|
+
}
|
|
663
|
+
component.importedTypes.set(name, {
|
|
664
|
+
source: importInfo.resolved.url || importInfo.resolved.path || importInfo.resolved.packageName || 'unknown',
|
|
665
|
+
type: typeInfo.type,
|
|
666
|
+
definition: typeInfo.definition
|
|
667
|
+
});
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
// Update component metadata
|
|
671
|
+
if (!component.metadata) {
|
|
672
|
+
component.metadata = {};
|
|
673
|
+
}
|
|
674
|
+
component.metadata.importedTypes = Array.from(importedTypeNames);
|
|
675
|
+
}
|
|
676
|
+
/**
|
|
677
|
+
* Validate with resolved imports
|
|
678
|
+
*/
|
|
679
|
+
validateWithResolvedImports(ast, resolvedImports) {
|
|
680
|
+
const errors = [];
|
|
681
|
+
for (const component of ast.components) {
|
|
682
|
+
const componentImports = resolvedImports.get(component.name) || [];
|
|
683
|
+
// Check that all selected types were found
|
|
684
|
+
for (const importInfo of componentImports) {
|
|
685
|
+
const requestedTypes = importInfo.importSpec.select || [];
|
|
686
|
+
const foundTypes = importInfo.foundOriginalTypes || new Set();
|
|
687
|
+
for (const requested of requestedTypes) {
|
|
688
|
+
if (!foundTypes.has(requested)) {
|
|
689
|
+
errors.push(`Component ${component.name}: Type '${requested}' not found in import from '${importInfo.importSpec.from || importInfo.importSpec.file || importInfo.importSpec.package}'`);
|
|
690
|
+
}
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
// Validate import conflicts (prevent duplicate type definitions)
|
|
694
|
+
errors.push(...this.validateImportConflicts(component, componentImports));
|
|
695
|
+
}
|
|
696
|
+
return errors;
|
|
697
|
+
}
|
|
698
|
+
/**
|
|
699
|
+
* Validate import conflicts (prevent duplicate type definitions)
|
|
700
|
+
* Checks if types imported from external files are redefined locally
|
|
701
|
+
*/
|
|
702
|
+
validateImportConflicts(component, componentImports) {
|
|
703
|
+
const errors = [];
|
|
704
|
+
// Collect all imported type names
|
|
705
|
+
const importedTypes = new Set();
|
|
706
|
+
const importSources = new Map(); // type name -> source file
|
|
707
|
+
for (const importInfo of componentImports) {
|
|
708
|
+
const importSpec = importInfo.importSpec;
|
|
709
|
+
const sourceFile = importSpec.from || importSpec.file || importSpec.package || 'unknown';
|
|
710
|
+
if (importSpec.select && Array.isArray(importSpec.select)) {
|
|
711
|
+
for (const typeName of importSpec.select) {
|
|
712
|
+
if (importedTypes.has(typeName)) {
|
|
713
|
+
errors.push(`Component ${component.name}: Duplicate import: Type '${typeName}' is imported from multiple sources (${importSources.get(typeName)} and ${sourceFile})`);
|
|
714
|
+
}
|
|
715
|
+
else {
|
|
716
|
+
importedTypes.add(typeName);
|
|
717
|
+
importSources.set(typeName, sourceFile);
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
// Check for conflicts between imported types and locally defined primitives
|
|
723
|
+
const localPrimitiveNames = new Set((component.primitives || []).map((p) => p.name));
|
|
724
|
+
for (const importedType of importedTypes) {
|
|
725
|
+
if (localPrimitiveNames.has(importedType)) {
|
|
726
|
+
errors.push(`Component ${component.name}: Import conflict: Type '${importedType}' is imported from ${importSources.get(importedType)} but also defined as a local primitive`);
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
// Check for conflicts between imported types and locally defined entities
|
|
730
|
+
// Derive entity type names from the component's own keys (covers any entity type, including extensions)
|
|
731
|
+
const entityTypes = Object.keys(component).filter(k => Array.isArray(component[k]) && component[k].length > 0 && component[k][0]?.name);
|
|
732
|
+
for (const entityType of entityTypes) {
|
|
733
|
+
const localNames = new Set((component[entityType] || []).map((item) => item.name));
|
|
734
|
+
for (const importedType of importedTypes) {
|
|
735
|
+
if (localNames.has(importedType)) {
|
|
736
|
+
const singular = entityType.endsWith('s') ? entityType.slice(0, -1) : entityType;
|
|
737
|
+
errors.push(`Component ${component.name}: Import conflict: Type '${importedType}' is imported from ${importSources.get(importedType)} but also defined as a local ${singular}`);
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
return errors;
|
|
742
|
+
}
|
|
743
|
+
/**
|
|
744
|
+
* Read file content
|
|
745
|
+
*/
|
|
746
|
+
async readFile(filePath) {
|
|
747
|
+
const fs = await import('fs/promises');
|
|
748
|
+
return fs.readFile(filePath, 'utf8');
|
|
749
|
+
}
|
|
750
|
+
/**
|
|
751
|
+
* Resolve and merge imports (private method) - for sync parsing
|
|
752
|
+
*/
|
|
753
|
+
resolveAndMergeImports(content, filename) {
|
|
754
|
+
// For synchronous parsing, we can't resolve imports
|
|
755
|
+
// This is a limitation - imports require async processing
|
|
756
|
+
if (this.options.debug) {
|
|
757
|
+
console.log('[UnifiedParser] Import resolution requires async parsing - use parseFileWithImports() instead');
|
|
758
|
+
}
|
|
759
|
+
return {
|
|
760
|
+
content,
|
|
761
|
+
resolvedImports: new Map()
|
|
762
|
+
};
|
|
763
|
+
}
|
|
764
|
+
/**
|
|
765
|
+
* Validate with JSON Schema
|
|
766
|
+
*/
|
|
767
|
+
validateWithSchema(data) {
|
|
768
|
+
const errors = [];
|
|
769
|
+
try {
|
|
770
|
+
// Debug: check what schema we're compiling
|
|
771
|
+
if (this.options.debug) {
|
|
772
|
+
console.log('[UnifiedParser] Schema has $schema:', !!this.schema.$schema);
|
|
773
|
+
console.log('[UnifiedParser] Schema keys:', Object.keys(this.schema));
|
|
774
|
+
}
|
|
775
|
+
// Compile schema each time (matches original parser behavior)
|
|
776
|
+
const validate = this.schemaValidator.compile(this.schema);
|
|
777
|
+
const valid = validate(data);
|
|
778
|
+
if (!valid && validate.errors) {
|
|
779
|
+
if (this.options.debug) {
|
|
780
|
+
console.log('[UnifiedParser] Detailed AJV errors:', JSON.stringify(validate.errors, null, 2));
|
|
781
|
+
}
|
|
782
|
+
for (const error of validate.errors) {
|
|
783
|
+
let path = error.instancePath || 'root';
|
|
784
|
+
if (error.instancePath === '') {
|
|
785
|
+
path = 'root';
|
|
786
|
+
}
|
|
787
|
+
let message = error.message || 'Unknown error';
|
|
788
|
+
if (error.keyword === 'additionalProperties') {
|
|
789
|
+
message = `Unknown property '${error.params?.additionalProperty}'`;
|
|
790
|
+
}
|
|
791
|
+
errors.push(`${path}: ${message}`);
|
|
792
|
+
}
|
|
793
|
+
}
|
|
794
|
+
}
|
|
795
|
+
catch (validationError) {
|
|
796
|
+
errors.push(`Schema validation error: ${validationError.message}`);
|
|
797
|
+
}
|
|
798
|
+
return errors;
|
|
799
|
+
}
|
|
800
|
+
/**
|
|
801
|
+
* Convert AST to expanded YAML format for tools (copied from original parser)
|
|
802
|
+
*/
|
|
803
|
+
astToExpandedYaml(ast) {
|
|
804
|
+
const result = {
|
|
805
|
+
components: {},
|
|
806
|
+
deployments: {},
|
|
807
|
+
manifests: {}
|
|
808
|
+
};
|
|
809
|
+
// Convert components - preserve all properties for validation
|
|
810
|
+
for (const component of ast.components) {
|
|
811
|
+
// Start with basic component structure
|
|
812
|
+
result.components[component.name] = {
|
|
813
|
+
version: component.version,
|
|
814
|
+
description: component.description,
|
|
815
|
+
...(component.tags && component.tags.length > 0 && { tags: component.tags }),
|
|
816
|
+
...(component.imports && component.imports.length > 0 && { import: component.imports }),
|
|
817
|
+
...(component.exports && Object.keys(component.exports).length > 0 && { export: component.exports })
|
|
818
|
+
};
|
|
819
|
+
// Add any additional properties (unknown ones) that were preserved
|
|
820
|
+
const knownProps = new Set(['name', 'namespace', 'version', 'description', 'tags', 'imports', 'exports', 'primitives', 'models', 'controllers', 'services', 'views', 'events', 'commands', 'constraints']);
|
|
821
|
+
Object.keys(component).forEach(key => {
|
|
822
|
+
if (!knownProps.has(key)) {
|
|
823
|
+
result.components[component.name][key] = component[key];
|
|
824
|
+
}
|
|
825
|
+
});
|
|
826
|
+
// Add primitives - convert PrimitiveSpec array back to PrimitivesSection object format
|
|
827
|
+
if (component.primitives && component.primitives.length > 0) {
|
|
828
|
+
result.components[component.name].primitives = {};
|
|
829
|
+
for (const primitive of component.primitives) {
|
|
830
|
+
// Convert back to expanded PrimitiveDefinition format
|
|
831
|
+
result.components[component.name].primitives[primitive.name] = {
|
|
832
|
+
name: primitive.name,
|
|
833
|
+
baseType: primitive.baseType,
|
|
834
|
+
description: primitive.description,
|
|
835
|
+
typeAlias: primitive.typeAlias,
|
|
836
|
+
...(primitive.required !== undefined && { required: primitive.required }),
|
|
837
|
+
...(primitive.unique !== undefined && { unique: primitive.unique }),
|
|
838
|
+
...(primitive.validation && Object.keys(primitive.validation).length > 0 && { validation: primitive.validation })
|
|
839
|
+
};
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
// Add models
|
|
843
|
+
if (component.models && component.models.length > 0) {
|
|
844
|
+
result.components[component.name].models = {};
|
|
845
|
+
for (const model of component.models) {
|
|
846
|
+
result.components[component.name].models[model.name] = {
|
|
847
|
+
...(model.description && { description: model.description }),
|
|
848
|
+
...(model.metadata && { metadata: model.metadata }), // v3.3+ metadata primitives
|
|
849
|
+
attributes: {},
|
|
850
|
+
...(model.relationships.length > 0 && { relationships: {} }),
|
|
851
|
+
...(model.lifecycles.length > 0 && { lifecycles: {} }),
|
|
852
|
+
...(Object.keys(model.behaviors).length > 0 && { behaviors: model.behaviors })
|
|
853
|
+
};
|
|
854
|
+
// Expand attributes
|
|
855
|
+
for (const attr of model.attributes) {
|
|
856
|
+
result.components[component.name].models[model.name].attributes[attr.name] = {
|
|
857
|
+
name: attr.name,
|
|
858
|
+
type: attr.type,
|
|
859
|
+
required: attr.required,
|
|
860
|
+
unique: attr.unique,
|
|
861
|
+
...(attr.default !== undefined && { default: attr.default }),
|
|
862
|
+
...(attr.min !== undefined && { min: attr.min }),
|
|
863
|
+
...(attr.max !== undefined && { max: attr.max }),
|
|
864
|
+
...(attr.auto !== undefined && { auto: attr.auto }),
|
|
865
|
+
...(attr.values !== undefined && { values: attr.values })
|
|
866
|
+
};
|
|
867
|
+
}
|
|
868
|
+
// Expand relationships
|
|
869
|
+
for (const rel of model.relationships) {
|
|
870
|
+
result.components[component.name].models[model.name].relationships[rel.name] = {
|
|
871
|
+
name: rel.name,
|
|
872
|
+
type: rel.type,
|
|
873
|
+
target: rel.target,
|
|
874
|
+
...(rel.cascade && { cascade: rel.cascade }),
|
|
875
|
+
...(rel.eager && { eager: rel.eager }),
|
|
876
|
+
...(rel.through && { through: rel.through })
|
|
877
|
+
};
|
|
878
|
+
}
|
|
879
|
+
// Expand lifecycles - output schema-compliant format
|
|
880
|
+
for (const lifecycle of model.lifecycles) {
|
|
881
|
+
if (lifecycle.type === 'shorthand') {
|
|
882
|
+
// Convert back to flow format for schema compliance
|
|
883
|
+
const flow = lifecycle.states.join(' -> ');
|
|
884
|
+
result.components[component.name].models[model.name].lifecycles[lifecycle.name] = {
|
|
885
|
+
flow: flow
|
|
886
|
+
};
|
|
887
|
+
}
|
|
888
|
+
else if (lifecycle.type === 'structured') {
|
|
889
|
+
// Convert structured format to schema-compliant transitions
|
|
890
|
+
const transitions = {};
|
|
891
|
+
if (lifecycle.transitions) {
|
|
892
|
+
for (const [action, transition] of Object.entries(lifecycle.transitions)) {
|
|
893
|
+
transitions[action] = `${transition.from} -> ${transition.to}`;
|
|
894
|
+
}
|
|
895
|
+
}
|
|
896
|
+
result.components[component.name].models[model.name].lifecycles[lifecycle.name] = {
|
|
897
|
+
states: lifecycle.states,
|
|
898
|
+
transitions: transitions
|
|
899
|
+
};
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
}
|
|
904
|
+
// Add controllers, services, events, views similarly...
|
|
905
|
+
if (component.controllers && component.controllers.length > 0) {
|
|
906
|
+
result.components[component.name].controllers = {};
|
|
907
|
+
for (const controller of component.controllers) {
|
|
908
|
+
result.components[component.name].controllers[controller.name] = {
|
|
909
|
+
...(controller.model && { model: controller.model }),
|
|
910
|
+
...(controller.path && { path: controller.path }),
|
|
911
|
+
...(controller.description && { description: controller.description }),
|
|
912
|
+
...(controller.subscriptions.events.length > 0 && { subscribes_to: controller.subscriptions.handlers }),
|
|
913
|
+
...(Object.keys(controller.cured).length > 0 && { cured: controller.cured }),
|
|
914
|
+
...(Object.keys(controller.actions).length > 0 && { actions: controller.actions })
|
|
915
|
+
};
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
if (component.services && component.services.length > 0) {
|
|
919
|
+
result.components[component.name].services = {};
|
|
920
|
+
for (const service of component.services) {
|
|
921
|
+
result.components[component.name].services[service.name] = {
|
|
922
|
+
...(service.description && { description: service.description }),
|
|
923
|
+
...(service.subscriptions.events.length > 0 && { subscribes_to: service.subscriptions.handlers }),
|
|
924
|
+
...(Object.keys(service.operations).length > 0 && { operations: service.operations })
|
|
925
|
+
};
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
if (component.events && component.events.length > 0) {
|
|
929
|
+
result.components[component.name].events = {};
|
|
930
|
+
for (const event of component.events) {
|
|
931
|
+
result.components[component.name].events[event.name] = {
|
|
932
|
+
...(event.description && { description: event.description }),
|
|
933
|
+
attributes: {}
|
|
934
|
+
};
|
|
935
|
+
// Expand event attributes (same as model attributes)
|
|
936
|
+
for (const attr of event.payload) {
|
|
937
|
+
result.components[component.name].events[event.name].attributes[attr.name] = {
|
|
938
|
+
name: attr.name,
|
|
939
|
+
type: attr.type,
|
|
940
|
+
required: attr.required,
|
|
941
|
+
unique: attr.unique
|
|
942
|
+
};
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
if (component.views && component.views.length > 0) {
|
|
947
|
+
result.components[component.name].views = {};
|
|
948
|
+
for (const view of component.views) {
|
|
949
|
+
result.components[component.name].views[view.name] = {
|
|
950
|
+
...(view.description && { description: view.description }),
|
|
951
|
+
...(view.type && { type: view.type }),
|
|
952
|
+
...(view.model && { model: view.model }),
|
|
953
|
+
...(view.tags && view.tags.length > 0 && { tags: view.tags }),
|
|
954
|
+
...(view.export !== undefined && { export: view.export }),
|
|
955
|
+
...(view.layout && { layout: view.layout }),
|
|
956
|
+
...(view.subscriptions.events.length > 0 && { subscribes_to: view.subscriptions.handlers }),
|
|
957
|
+
...(Object.keys(view.uiComponents).length > 0 && { uiComponents: view.uiComponents }),
|
|
958
|
+
...(Object.keys(view.properties).length > 0 && { properties: view.properties })
|
|
959
|
+
};
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
// Add commands back as object format (convert from CommandSpec[] to {name: def})
|
|
963
|
+
if (component.commands && component.commands.length > 0) {
|
|
964
|
+
result.components[component.name].commands = {};
|
|
965
|
+
for (const cmd of component.commands) {
|
|
966
|
+
const { name: cmdName, ...cmdDef } = cmd;
|
|
967
|
+
result.components[component.name].commands[cmdName] = cmdDef;
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
}
|
|
971
|
+
// Convert deployments - preserve all properties for validation
|
|
972
|
+
for (const deployment of ast.deployments) {
|
|
973
|
+
const { name, namespace, ...deploymentProps } = deployment;
|
|
974
|
+
result.deployments[deployment.name] = deploymentProps;
|
|
975
|
+
}
|
|
976
|
+
// Convert manifests - preserve all properties for validation (keep name property)
|
|
977
|
+
for (const manifest of ast.manifests) {
|
|
978
|
+
const { namespace, ...manifestProps } = manifest;
|
|
979
|
+
result.manifests[manifest.name] = manifestProps;
|
|
980
|
+
}
|
|
981
|
+
return yaml.dump(result, {
|
|
982
|
+
indent: 2,
|
|
983
|
+
lineWidth: 120,
|
|
984
|
+
quotingType: '"',
|
|
985
|
+
forceQuotes: false
|
|
986
|
+
});
|
|
987
|
+
}
|
|
988
|
+
/**
|
|
989
|
+
* Get component type information (for compatibility)
|
|
990
|
+
*/
|
|
991
|
+
getComponentTypes(ast) {
|
|
992
|
+
return ast.components.map(component => ({
|
|
993
|
+
name: component.name,
|
|
994
|
+
version: component.version || '1.0.0',
|
|
995
|
+
models: new Set((component.models || []).map(m => m.name)),
|
|
996
|
+
controllers: new Set((component.controllers || []).map(c => c.name)),
|
|
997
|
+
services: new Set((component.services || []).map(s => s.name)),
|
|
998
|
+
views: new Set((component.views || []).map(v => v.name)),
|
|
999
|
+
events: new Set((component.events || []).map(e => e.name)),
|
|
1000
|
+
exports: component.exports || {}
|
|
1001
|
+
}));
|
|
1002
|
+
}
|
|
1003
|
+
/**
|
|
1004
|
+
* Enable imports dynamically
|
|
1005
|
+
*/
|
|
1006
|
+
enableImports(options) {
|
|
1007
|
+
this.options.enableImports = true;
|
|
1008
|
+
if (options) {
|
|
1009
|
+
Object.assign(this.options, options);
|
|
1010
|
+
}
|
|
1011
|
+
if (!this.importResolver) {
|
|
1012
|
+
this.importResolver = new ImportResolver({
|
|
1013
|
+
basePath: this.options.basePath || process.cwd(),
|
|
1014
|
+
cacheDir: this.options.cacheDir,
|
|
1015
|
+
offline: this.options.offline || false,
|
|
1016
|
+
debug: this.options.debug || false
|
|
1017
|
+
});
|
|
1018
|
+
}
|
|
1019
|
+
}
|
|
1020
|
+
/**
|
|
1021
|
+
* Disable imports dynamically
|
|
1022
|
+
*/
|
|
1023
|
+
disableImports() {
|
|
1024
|
+
this.options.enableImports = false;
|
|
1025
|
+
}
|
|
1026
|
+
/**
|
|
1027
|
+
* Get import resolver instance (for compatibility)
|
|
1028
|
+
*/
|
|
1029
|
+
getImportResolver() {
|
|
1030
|
+
return this.importResolver;
|
|
1031
|
+
}
|
|
1032
|
+
/**
|
|
1033
|
+
* Get current options
|
|
1034
|
+
*/
|
|
1035
|
+
getOptions() {
|
|
1036
|
+
return { ...this.options };
|
|
1037
|
+
}
|
|
1038
|
+
/**
|
|
1039
|
+
* Format validation errors for display
|
|
1040
|
+
*/
|
|
1041
|
+
formatErrors(errors) {
|
|
1042
|
+
if (errors.length === 0) {
|
|
1043
|
+
return 'No errors found.';
|
|
1044
|
+
}
|
|
1045
|
+
return `Found ${errors.length} error(s):\n` +
|
|
1046
|
+
errors.map((err, i) => ` ${i + 1}. ${err}`).join('\n');
|
|
1047
|
+
}
|
|
1048
|
+
/**
|
|
1049
|
+
* Get available model names (for IDE support)
|
|
1050
|
+
*/
|
|
1051
|
+
getModelNames(ast) {
|
|
1052
|
+
const modelNames = [];
|
|
1053
|
+
for (const component of ast.components) {
|
|
1054
|
+
modelNames.push(...(component.models || []).map((m) => m.name));
|
|
1055
|
+
}
|
|
1056
|
+
return modelNames;
|
|
1057
|
+
}
|
|
1058
|
+
/**
|
|
1059
|
+
* Get available event names (for IDE support)
|
|
1060
|
+
*/
|
|
1061
|
+
getEventNames(ast) {
|
|
1062
|
+
const eventNames = [];
|
|
1063
|
+
for (const component of ast.components) {
|
|
1064
|
+
eventNames.push(...(component.events || []).map((e) => e.name));
|
|
1065
|
+
}
|
|
1066
|
+
return eventNames;
|
|
1067
|
+
}
|
|
1068
|
+
/**
|
|
1069
|
+
* Get lifecycle actions for a model (for IDE support)
|
|
1070
|
+
*/
|
|
1071
|
+
getLifecycleActions(ast, modelName) {
|
|
1072
|
+
for (const component of ast.components) {
|
|
1073
|
+
const model = component.models.find((m) => m.name === modelName);
|
|
1074
|
+
if (model) {
|
|
1075
|
+
const result = {};
|
|
1076
|
+
for (const lifecycle of model.lifecycles) {
|
|
1077
|
+
result[lifecycle.name] = lifecycle.actions;
|
|
1078
|
+
}
|
|
1079
|
+
return result;
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
return {};
|
|
1083
|
+
}
|
|
1084
|
+
// =============================================================================
|
|
1085
|
+
// SEMANTIC VALIDATION SYSTEM
|
|
1086
|
+
// =============================================================================
|
|
1087
|
+
/**
|
|
1088
|
+
* Semantic validation rules — data-driven cross-entity constraints.
|
|
1089
|
+
* Each rule defines what to check without hardcoding entity type names.
|
|
1090
|
+
*/
|
|
1091
|
+
static SEMANTIC_RULES = [
|
|
1092
|
+
{
|
|
1093
|
+
name: 'controller-model-connections',
|
|
1094
|
+
validate: (component, _importedTypes) => {
|
|
1095
|
+
const errors = [];
|
|
1096
|
+
const modelNames = new Set((component.models || []).map((m) => m.name));
|
|
1097
|
+
for (const controller of (component.controllers || [])) {
|
|
1098
|
+
if (!controller.model) {
|
|
1099
|
+
errors.push(`Component ${component.name}: Controller ${controller.name} missing required model reference`);
|
|
1100
|
+
}
|
|
1101
|
+
else if (!modelNames.has(controller.model)) {
|
|
1102
|
+
errors.push(`Component ${component.name}: Controller ${controller.name} references non-existent model ${controller.model}`);
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
return errors;
|
|
1106
|
+
}
|
|
1107
|
+
},
|
|
1108
|
+
{
|
|
1109
|
+
name: 'subscription-targets',
|
|
1110
|
+
validate: (component, _importedTypes) => {
|
|
1111
|
+
const errors = [];
|
|
1112
|
+
const eventNames = new Set((component.events || []).map((e) => e.name));
|
|
1113
|
+
// Check subscriptions on any entity type that has them
|
|
1114
|
+
const subscriberTypes = [
|
|
1115
|
+
{ items: component.controllers || [], typeName: 'Controller' },
|
|
1116
|
+
{ items: component.services || [], typeName: 'Service' },
|
|
1117
|
+
{ items: component.views || [], typeName: 'View' },
|
|
1118
|
+
];
|
|
1119
|
+
for (const { items, typeName } of subscriberTypes) {
|
|
1120
|
+
for (const item of items) {
|
|
1121
|
+
for (const event of (item.subscriptions?.events || [])) {
|
|
1122
|
+
if (!eventNames.has(event)) {
|
|
1123
|
+
errors.push(`Component ${component.name}: ${typeName} ${item.name} subscribes to unknown event ${event}`);
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1128
|
+
return errors;
|
|
1129
|
+
}
|
|
1130
|
+
},
|
|
1131
|
+
{
|
|
1132
|
+
name: 'relationship-targets',
|
|
1133
|
+
validate: (component, importedTypes) => {
|
|
1134
|
+
const errors = [];
|
|
1135
|
+
const localTypes = new Set((component.models || []).map((m) => m.name));
|
|
1136
|
+
for (const model of (component.models || [])) {
|
|
1137
|
+
for (const relationship of (model.relationships || [])) {
|
|
1138
|
+
const target = relationship.target;
|
|
1139
|
+
if (target && !target.includes('.')) {
|
|
1140
|
+
if (!localTypes.has(target) && !importedTypes.has(target)) {
|
|
1141
|
+
errors.push(`Component ${component.name}: Model ${model.name} relationship ${relationship.name} targets non-existent model ${target}`);
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
return errors;
|
|
1147
|
+
}
|
|
1148
|
+
},
|
|
1149
|
+
];
|
|
1150
|
+
/**
|
|
1151
|
+
* Perform semantic validation on the parsed AST
|
|
1152
|
+
*/
|
|
1153
|
+
validateSemantics(ast) {
|
|
1154
|
+
const errors = [];
|
|
1155
|
+
for (const component of ast.components) {
|
|
1156
|
+
const importedTypes = this.buildImportedTypesSet(component);
|
|
1157
|
+
for (const rule of UnifiedSpecVerseParser.SEMANTIC_RULES) {
|
|
1158
|
+
errors.push(...rule.validate(component, importedTypes));
|
|
1159
|
+
}
|
|
1160
|
+
}
|
|
1161
|
+
return errors;
|
|
1162
|
+
}
|
|
1163
|
+
/**
|
|
1164
|
+
* Build set of imported types available to a component
|
|
1165
|
+
*/
|
|
1166
|
+
buildImportedTypesSet(component) {
|
|
1167
|
+
const importedTypes = new Set();
|
|
1168
|
+
for (const importDef of component.imports || []) {
|
|
1169
|
+
for (const typeName of importDef.select || []) {
|
|
1170
|
+
importedTypes.add(typeName);
|
|
1171
|
+
}
|
|
1172
|
+
}
|
|
1173
|
+
return importedTypes;
|
|
1174
|
+
}
|
|
1175
|
+
}
|
|
1176
|
+
// =============================================================================
|
|
1177
|
+
// BACKWARD COMPATIBILITY LAYER
|
|
1178
|
+
// =============================================================================
|
|
1179
|
+
// Backward compatibility exports removed - use UnifiedSpecVerseParser directly
|
|
1180
|
+
//# sourceMappingURL=unified-parser.js.map
|