@specverse/engine-realize 3.5.3
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/templates/README.md +559 -0
- package/assets/templates/TEMPLATE-ENHANCEMENTS-V33.md +462 -0
- package/assets/templates/backend-only/CLAUDE.md +73 -0
- package/assets/templates/backend-only/README.md +197 -0
- package/assets/templates/backend-only/deployments/README.md +149 -0
- package/assets/templates/backend-only/deployments/development.specly +53 -0
- package/assets/templates/backend-only/deployments/production.specly +87 -0
- package/assets/templates/backend-only/docs/README.md +50 -0
- package/assets/templates/backend-only/docs/api/README.md +7 -0
- package/assets/templates/backend-only/docs/diagrams/README.md +85 -0
- package/assets/templates/backend-only/docs/example-documentation-template.md +269 -0
- package/assets/templates/backend-only/docs/guides/README.md +15 -0
- package/assets/templates/backend-only/dot.env.example +18 -0
- package/assets/templates/backend-only/generated/README.md +56 -0
- package/assets/templates/backend-only/generated/code/integration-test.template.js +320 -0
- package/assets/templates/backend-only/generated/code/package.json.template +34 -0
- package/assets/templates/backend-only/generated/docs/README.md +49 -0
- package/assets/templates/backend-only/gitignore +54 -0
- package/assets/templates/backend-only/manifests/README.md +72 -0
- package/assets/templates/backend-only/manifests/docker-compose.specly +91 -0
- package/assets/templates/backend-only/manifests/implementation.yaml +100 -0
- package/assets/templates/backend-only/manifests/kubernetes.specly +140 -0
- package/assets/templates/backend-only/package.json +59 -0
- package/assets/templates/backend-only/scripts/test-all.sh +160 -0
- package/assets/templates/backend-only/scripts/test-generated-code.sh +165 -0
- package/assets/templates/backend-only/specs/main.specly +67 -0
- package/assets/templates/default/CLAUDE.md +141 -0
- package/assets/templates/default/README.md +404 -0
- package/assets/templates/default/deployments/README.md +149 -0
- package/assets/templates/default/deployments/development.specly +53 -0
- package/assets/templates/default/deployments/production.specly +87 -0
- package/assets/templates/default/docs/README.md +50 -0
- package/assets/templates/default/docs/api/README.md +7 -0
- package/assets/templates/default/docs/diagrams/README.md +85 -0
- package/assets/templates/default/docs/example-documentation-template.md +269 -0
- package/assets/templates/default/docs/guides/README.md +15 -0
- package/assets/templates/default/dot.env.example +18 -0
- package/assets/templates/default/generated/README.md +56 -0
- package/assets/templates/default/generated/code/integration-test.template.js +320 -0
- package/assets/templates/default/generated/code/package.json.template +34 -0
- package/assets/templates/default/generated/docs/README.md +49 -0
- package/assets/templates/default/gitignore +54 -0
- package/assets/templates/default/manifests/README.md +72 -0
- package/assets/templates/default/manifests/docker-compose.specly +91 -0
- package/assets/templates/default/manifests/implementation.yaml +176 -0
- package/assets/templates/default/manifests/kubernetes.specly +140 -0
- package/assets/templates/default/package.json +61 -0
- package/assets/templates/default/scripts/test-all.sh +160 -0
- package/assets/templates/default/scripts/test-generated-code.sh +165 -0
- package/assets/templates/default/specs/main.specly +67 -0
- package/assets/templates/frontend-only/CLAUDE.md +75 -0
- package/assets/templates/frontend-only/README.md +231 -0
- package/assets/templates/frontend-only/deployments/README.md +149 -0
- package/assets/templates/frontend-only/deployments/development.specly +53 -0
- package/assets/templates/frontend-only/deployments/production.specly +87 -0
- package/assets/templates/frontend-only/docs/README.md +50 -0
- package/assets/templates/frontend-only/docs/api/README.md +7 -0
- package/assets/templates/frontend-only/docs/diagrams/README.md +85 -0
- package/assets/templates/frontend-only/docs/example-documentation-template.md +269 -0
- package/assets/templates/frontend-only/docs/guides/README.md +15 -0
- package/assets/templates/frontend-only/dot.env.example +18 -0
- package/assets/templates/frontend-only/generated/README.md +56 -0
- package/assets/templates/frontend-only/generated/code/integration-test.template.js +320 -0
- package/assets/templates/frontend-only/generated/code/package.json.template +34 -0
- package/assets/templates/frontend-only/generated/docs/README.md +49 -0
- package/assets/templates/frontend-only/gitignore +54 -0
- package/assets/templates/frontend-only/manifests/README.md +72 -0
- package/assets/templates/frontend-only/manifests/docker-compose.specly +91 -0
- package/assets/templates/frontend-only/manifests/implementation.yaml +58 -0
- package/assets/templates/frontend-only/manifests/kubernetes.specly +140 -0
- package/assets/templates/frontend-only/package.json +59 -0
- package/assets/templates/frontend-only/scripts/test-all.sh +160 -0
- package/assets/templates/frontend-only/scripts/test-generated-code.sh +165 -0
- package/assets/templates/frontend-only/specs/main.specly +57 -0
- package/assets/templates/full-stack/AI-GUIDE.md +60 -0
- package/assets/templates/full-stack/CLAUDE.md +141 -0
- package/assets/templates/full-stack/README.md +382 -0
- package/assets/templates/full-stack/archive/AI-GUIDE-legacy.md +392 -0
- package/assets/templates/full-stack/deployments/README.md +149 -0
- package/assets/templates/full-stack/deployments/development.specly +53 -0
- package/assets/templates/full-stack/deployments/production.specly +87 -0
- package/assets/templates/full-stack/docs/README.md +51 -0
- package/assets/templates/full-stack/docs/api/README.md +7 -0
- package/assets/templates/full-stack/docs/diagrams/README.md +85 -0
- package/assets/templates/full-stack/docs/example-documentation-template.md +269 -0
- package/assets/templates/full-stack/docs/guides/README.md +15 -0
- package/assets/templates/full-stack/generated/README.md +56 -0
- package/assets/templates/full-stack/generated/code/integration-test.template.js +320 -0
- package/assets/templates/full-stack/generated/code/package.json.template +34 -0
- package/assets/templates/full-stack/generated/docs/README.md +49 -0
- package/assets/templates/full-stack/gitignore +54 -0
- package/assets/templates/full-stack/manifests/README.md +72 -0
- package/assets/templates/full-stack/manifests/docker-compose.specly +91 -0
- package/assets/templates/full-stack/manifests/implementation.yaml +155 -0
- package/assets/templates/full-stack/manifests/kubernetes.specly +140 -0
- package/assets/templates/full-stack/package.json +45 -0
- package/assets/templates/full-stack/scripts/test-all.sh +160 -0
- package/assets/templates/full-stack/scripts/test-generated-code.sh +165 -0
- package/assets/templates/full-stack/specs/example-v33.specly +297 -0
- package/assets/templates/full-stack/specs/main-simple.specly +73 -0
- package/assets/templates/full-stack/specs/main.specly +408 -0
- package/dist/engines/code-generator.d.ts +86 -0
- package/dist/engines/code-generator.d.ts.map +1 -0
- package/dist/engines/code-generator.js +159 -0
- package/dist/engines/code-generator.js.map +1 -0
- package/dist/engines/engine-registry.d.ts +94 -0
- package/dist/engines/engine-registry.d.ts.map +1 -0
- package/dist/engines/engine-registry.js +163 -0
- package/dist/engines/engine-registry.js.map +1 -0
- package/dist/engines/index.d.ts +10 -0
- package/dist/engines/index.d.ts.map +1 -0
- package/dist/engines/index.js +12 -0
- package/dist/engines/index.js.map +1 -0
- package/dist/engines/typescript-engine.d.ts +74 -0
- package/dist/engines/typescript-engine.d.ts.map +1 -0
- package/dist/engines/typescript-engine.js +288 -0
- package/dist/engines/typescript-engine.js.map +1 -0
- package/dist/generators/index.d.ts +11 -0
- package/dist/generators/index.d.ts.map +1 -0
- package/dist/generators/index.js +11 -0
- package/dist/generators/index.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +434 -0
- package/dist/index.js.map +1 -0
- package/dist/library/index.d.ts +12 -0
- package/dist/library/index.d.ts.map +1 -0
- package/dist/library/index.js +15 -0
- package/dist/library/index.js.map +1 -0
- package/dist/library/library.d.ts +132 -0
- package/dist/library/library.d.ts.map +1 -0
- package/dist/library/library.js +343 -0
- package/dist/library/library.js.map +1 -0
- package/dist/library/loader.d.ts +73 -0
- package/dist/library/loader.d.ts.map +1 -0
- package/dist/library/loader.js +150 -0
- package/dist/library/loader.js.map +1 -0
- package/dist/library/resolver.d.ts +104 -0
- package/dist/library/resolver.d.ts.map +1 -0
- package/dist/library/resolver.js +299 -0
- package/dist/library/resolver.js.map +1 -0
- package/dist/library/validator.d.ts +65 -0
- package/dist/library/validator.d.ts.map +1 -0
- package/dist/library/validator.js +203 -0
- package/dist/library/validator.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/instance-factory.d.ts +289 -0
- package/dist/types/instance-factory.d.ts.map +1 -0
- package/dist/types/instance-factory.js +8 -0
- package/dist/types/instance-factory.js.map +1 -0
- package/dist/types/unified-mappings.d.ts +163 -0
- package/dist/types/unified-mappings.d.ts.map +1 -0
- package/dist/types/unified-mappings.js +110 -0
- package/dist/types/unified-mappings.js.map +1 -0
- package/dist/utils/ai-spec-loader.d.ts +77 -0
- package/dist/utils/ai-spec-loader.d.ts.map +1 -0
- package/dist/utils/ai-spec-loader.js +138 -0
- package/dist/utils/ai-spec-loader.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/manifest-loader.d.ts +107 -0
- package/dist/utils/manifest-loader.d.ts.map +1 -0
- package/dist/utils/manifest-loader.js +168 -0
- package/dist/utils/manifest-loader.js.map +1 -0
- package/dist/utils/mapping-migration.d.ts +53 -0
- package/dist/utils/mapping-migration.d.ts.map +1 -0
- package/dist/utils/mapping-migration.js +194 -0
- package/dist/utils/mapping-migration.js.map +1 -0
- package/libs/instance-factories/CURVED-INTERFACE.md +278 -0
- package/libs/instance-factories/README.md +433 -0
- package/libs/instance-factories/applications/generic-app.yaml +52 -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 +80 -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 +85 -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 +54 -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/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/commander-js.yaml +55 -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 +145 -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 +992 -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/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/docker-k8s.yaml +61 -0
- package/libs/instance-factories/infrastructure/templates/docker-k8s/infrastructure-generator.ts +46 -0
- package/libs/instance-factories/orms/prisma.yaml +89 -0
- package/libs/instance-factories/orms/templates/prisma/schema-generator.ts +563 -0
- package/libs/instance-factories/orms/templates/prisma/services-generator.ts +408 -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/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/prisma-services.yaml +71 -0
- package/libs/instance-factories/services/templates/prisma/behavior-generator.ts +303 -0
- package/libs/instance-factories/services/templates/prisma/controller-generator.ts +532 -0
- package/libs/instance-factories/services/templates/prisma/service-generator.ts +315 -0
- package/libs/instance-factories/shared/path-resolver.ts +111 -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/templates/vitest/tests-generator.ts +51 -0
- package/libs/instance-factories/testing/vitest-tests.yaml +63 -0
- package/libs/instance-factories/tools/templates/mcp/mcp-server-generator.ts +136 -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 +92 -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 +524 -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 +214 -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/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 +391 -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 +54 -0
- package/libs/instance-factories/views/templates/react/hooks-generator.ts +122 -0
- package/libs/instance-factories/views/templates/react/index-css-generator.ts +209 -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 +103 -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 +42 -0
- package/schema/SPECVERSE-SCHEMA.json +4274 -0
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime View Renderer
|
|
3
|
+
*
|
|
4
|
+
* Dynamically renders SpecVerse views at runtime using React.createElement.
|
|
5
|
+
* Used by app-demo for live view rendering without code generation.
|
|
6
|
+
*
|
|
7
|
+
* Architecture:
|
|
8
|
+
* - No code generation - creates React elements directly
|
|
9
|
+
* - Uses component-metadata for runtime hints
|
|
10
|
+
* - Integrates with BaseComponentGenerator for shared logic
|
|
11
|
+
* - Supports dynamic state and event binding
|
|
12
|
+
* - Real-time view updates
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import React, { createElement, useState, useEffect, useMemo } from 'react';
|
|
16
|
+
import {
|
|
17
|
+
BaseComponentGenerator,
|
|
18
|
+
ViewSpec,
|
|
19
|
+
StateDefinition,
|
|
20
|
+
EventDefinition,
|
|
21
|
+
UIComponent,
|
|
22
|
+
RenderContext,
|
|
23
|
+
GeneratorConfig
|
|
24
|
+
} from '../shared/base-generator.js';
|
|
25
|
+
import { mapProperties } from '../shared/property-mapper.js';
|
|
26
|
+
import { getComponentMetadata } from '../shared/component-metadata.js';
|
|
27
|
+
import type { ComponentAdapter } from '../shared/adapter-types.js';
|
|
28
|
+
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Types
|
|
31
|
+
// ============================================================================
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Runtime renderer configuration
|
|
35
|
+
*/
|
|
36
|
+
export interface RuntimeRendererConfig extends GeneratorConfig {
|
|
37
|
+
framework: 'runtime';
|
|
38
|
+
target: 'runtime';
|
|
39
|
+
/**
|
|
40
|
+
* Enable live reload on spec changes
|
|
41
|
+
*/
|
|
42
|
+
liveReload?: boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Debug mode with console logging
|
|
45
|
+
*/
|
|
46
|
+
debug?: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Runtime component props
|
|
51
|
+
*/
|
|
52
|
+
export interface RuntimeComponentProps {
|
|
53
|
+
[key: string]: any;
|
|
54
|
+
children?: React.ReactNode;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Runtime state manager
|
|
59
|
+
*/
|
|
60
|
+
export interface RuntimeState {
|
|
61
|
+
[key: string]: any;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Runtime event handlers
|
|
66
|
+
*/
|
|
67
|
+
export interface RuntimeEventHandlers {
|
|
68
|
+
[key: string]: (...args: any[]) => void;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Runtime view context
|
|
73
|
+
*/
|
|
74
|
+
export interface RuntimeViewContext {
|
|
75
|
+
state: RuntimeState;
|
|
76
|
+
setState: (updates: Partial<RuntimeState>) => void;
|
|
77
|
+
handlers: RuntimeEventHandlers;
|
|
78
|
+
data: Record<string, any[]>; // Model data for lists
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ============================================================================
|
|
82
|
+
// Runtime View Renderer
|
|
83
|
+
// ============================================================================
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Renders SpecVerse views dynamically at runtime
|
|
87
|
+
*
|
|
88
|
+
* Unlike code generators, this creates React elements directly without
|
|
89
|
+
* generating .tsx files. Used by app-demo for live view rendering.
|
|
90
|
+
*/
|
|
91
|
+
export class RuntimeViewRenderer extends BaseComponentGenerator {
|
|
92
|
+
private readonly runtimeConfig: RuntimeRendererConfig;
|
|
93
|
+
private viewContext?: RuntimeViewContext;
|
|
94
|
+
|
|
95
|
+
constructor(adapter: ComponentAdapter, config: RuntimeRendererConfig) {
|
|
96
|
+
super(adapter, config);
|
|
97
|
+
this.runtimeConfig = config;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// ============================================================================
|
|
101
|
+
// Public API - Runtime Rendering
|
|
102
|
+
// ============================================================================
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Render view as React element (runtime)
|
|
106
|
+
*
|
|
107
|
+
* @param viewSpec - View specification
|
|
108
|
+
* @param context - Runtime context (state, data, handlers)
|
|
109
|
+
* @returns React element
|
|
110
|
+
*/
|
|
111
|
+
public renderRuntime(
|
|
112
|
+
viewSpec: ViewSpec,
|
|
113
|
+
context?: Partial<RuntimeViewContext>
|
|
114
|
+
): React.ReactElement {
|
|
115
|
+
// Initialize runtime context
|
|
116
|
+
this.viewContext = this.initializeContext(viewSpec, context);
|
|
117
|
+
|
|
118
|
+
// Create root element
|
|
119
|
+
const components = this.renderComponentsRuntime(viewSpec.components);
|
|
120
|
+
|
|
121
|
+
return createElement(
|
|
122
|
+
'div',
|
|
123
|
+
{ className: 'specverse-runtime-view', 'data-view': viewSpec.name },
|
|
124
|
+
components
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Create a React component from view spec
|
|
130
|
+
*
|
|
131
|
+
* Returns a React component function that can be used directly
|
|
132
|
+
*
|
|
133
|
+
* @param viewSpec - View specification
|
|
134
|
+
* @returns React component function
|
|
135
|
+
*/
|
|
136
|
+
public createRuntimeComponent(viewSpec: ViewSpec): React.FC<any> {
|
|
137
|
+
const renderer = this;
|
|
138
|
+
|
|
139
|
+
return function RuntimeViewComponent(props: any) {
|
|
140
|
+
// Initialize state from view spec
|
|
141
|
+
const [state, setState] = useState<RuntimeState>(() =>
|
|
142
|
+
renderer.initializeState(viewSpec.state)
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
// Initialize event handlers
|
|
146
|
+
const handlers = useMemo(() =>
|
|
147
|
+
renderer.createEventHandlers(viewSpec.events, state, setState),
|
|
148
|
+
[state]
|
|
149
|
+
);
|
|
150
|
+
|
|
151
|
+
// Create runtime context
|
|
152
|
+
const context: RuntimeViewContext = {
|
|
153
|
+
state,
|
|
154
|
+
setState: (updates) => setState(prev => ({ ...prev, ...updates })),
|
|
155
|
+
handlers,
|
|
156
|
+
data: props.data || {}
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
// Render view
|
|
160
|
+
return renderer.renderRuntime(viewSpec, context);
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ============================================================================
|
|
165
|
+
// Abstract Method Implementations (Not Used in Runtime)
|
|
166
|
+
// ============================================================================
|
|
167
|
+
|
|
168
|
+
protected generateImports(viewSpec: ViewSpec): string {
|
|
169
|
+
// Runtime doesn't generate code
|
|
170
|
+
return '';
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
protected generateComponent(parts: any): string {
|
|
174
|
+
// Runtime doesn't generate code
|
|
175
|
+
return '';
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
protected generateState(state: Record<string, StateDefinition>): string {
|
|
179
|
+
// Runtime doesn't generate code
|
|
180
|
+
return '';
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
protected generateEvents(events: Record<string, EventDefinition>): string {
|
|
184
|
+
// Runtime doesn't generate code
|
|
185
|
+
return '';
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
public getFileExtension(): string {
|
|
189
|
+
return ''; // No files generated
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
public getAdditionalFiles(viewSpec: ViewSpec): Record<string, string> {
|
|
193
|
+
return {}; // No files generated
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// ============================================================================
|
|
197
|
+
// Runtime-Specific Methods
|
|
198
|
+
// ============================================================================
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Initialize runtime context
|
|
202
|
+
*/
|
|
203
|
+
private initializeContext(
|
|
204
|
+
viewSpec: ViewSpec,
|
|
205
|
+
context?: Partial<RuntimeViewContext>
|
|
206
|
+
): RuntimeViewContext {
|
|
207
|
+
return {
|
|
208
|
+
state: context?.state || this.initializeState(viewSpec.state),
|
|
209
|
+
setState: context?.setState || (() => {}),
|
|
210
|
+
handlers: context?.handlers || this.createEventHandlers(viewSpec.events),
|
|
211
|
+
data: context?.data || {}
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Initialize state from view spec
|
|
217
|
+
*/
|
|
218
|
+
private initializeState(state?: Record<string, StateDefinition>): RuntimeState {
|
|
219
|
+
if (!state) return {};
|
|
220
|
+
|
|
221
|
+
const initialState: RuntimeState = {};
|
|
222
|
+
|
|
223
|
+
for (const [name, def] of Object.entries(state)) {
|
|
224
|
+
initialState[name] = def.initial;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return initialState;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Create event handlers from view spec
|
|
232
|
+
*/
|
|
233
|
+
private createEventHandlers(
|
|
234
|
+
events?: Record<string, EventDefinition>,
|
|
235
|
+
state?: RuntimeState,
|
|
236
|
+
setState?: (updates: Partial<RuntimeState>) => void
|
|
237
|
+
): RuntimeEventHandlers {
|
|
238
|
+
if (!events) return {};
|
|
239
|
+
|
|
240
|
+
const handlers: RuntimeEventHandlers = {};
|
|
241
|
+
|
|
242
|
+
for (const [name, def] of Object.entries(events)) {
|
|
243
|
+
// Create handler function
|
|
244
|
+
handlers[`handle${this.capitalize(name)}`] = (...args: any[]) => {
|
|
245
|
+
if (this.runtimeConfig.debug) {
|
|
246
|
+
console.log(`[RuntimeView] Event: ${name}`, args);
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// Execute event body
|
|
250
|
+
try {
|
|
251
|
+
// Create function from body
|
|
252
|
+
const fn = new Function('state', 'setState', 'args', def.body);
|
|
253
|
+
fn(state, setState, args);
|
|
254
|
+
} catch (error) {
|
|
255
|
+
console.error(`[RuntimeView] Event handler error (${name}):`, error);
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return handlers;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Render components as React elements
|
|
265
|
+
*/
|
|
266
|
+
private renderComponentsRuntime(components: Record<string, UIComponent>): React.ReactNode[] {
|
|
267
|
+
return Object.entries(components).map(([name, component]) =>
|
|
268
|
+
this.renderComponentRuntime(component, {
|
|
269
|
+
depth: 0,
|
|
270
|
+
path: [name]
|
|
271
|
+
})
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Render single component as React element
|
|
277
|
+
*/
|
|
278
|
+
private renderComponentRuntime(
|
|
279
|
+
component: UIComponent,
|
|
280
|
+
context: RenderContext
|
|
281
|
+
): React.ReactElement | null {
|
|
282
|
+
// Depth enforcement
|
|
283
|
+
if (context.depth > this.MAX_DEPTH) {
|
|
284
|
+
if (this.runtimeConfig.debug) {
|
|
285
|
+
console.warn(`[RuntimeView] Max depth exceeded at ${context.path.join('.')}`);
|
|
286
|
+
}
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Get component metadata
|
|
291
|
+
const metadata = getComponentMetadata(component.type);
|
|
292
|
+
if (!metadata) {
|
|
293
|
+
console.warn(`[RuntimeView] Unknown component type: ${component.type}`);
|
|
294
|
+
return null;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Map properties
|
|
298
|
+
const mappedProps = component.properties
|
|
299
|
+
? mapProperties(component.type, component.properties, 'runtime')
|
|
300
|
+
: {};
|
|
301
|
+
|
|
302
|
+
// Add key for React
|
|
303
|
+
const props: RuntimeComponentProps = {
|
|
304
|
+
...mappedProps,
|
|
305
|
+
key: context.path.join('-')
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
// Handle conditional rendering
|
|
309
|
+
if (component.condition && this.viewContext) {
|
|
310
|
+
const condition = this.evaluateCondition(component.condition, this.viewContext);
|
|
311
|
+
if (!condition) return null;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Handle list rendering
|
|
315
|
+
if (component.dataSource && this.viewContext) {
|
|
316
|
+
return this.renderListRuntime(component, props, context);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Render children
|
|
320
|
+
let children: React.ReactNode = null;
|
|
321
|
+
if (component.children && component.children.length > 0) {
|
|
322
|
+
children = component.children.map((child, index) =>
|
|
323
|
+
this.renderComponentRuntime(child, {
|
|
324
|
+
...context,
|
|
325
|
+
depth: context.depth + 1,
|
|
326
|
+
path: [...context.path, `child_${index}`]
|
|
327
|
+
})
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Get adapter component render function
|
|
332
|
+
const adapterComponent = this.adapter.components[component.type];
|
|
333
|
+
if (!adapterComponent) {
|
|
334
|
+
console.warn(`[RuntimeView] No adapter for component: ${component.type}`);
|
|
335
|
+
return null;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// For runtime, we need to create actual React elements
|
|
339
|
+
// The adapter render function returns JSX string, so we need to convert it
|
|
340
|
+
// For now, create a simple wrapper
|
|
341
|
+
return this.createElementFromAdapter(component.type, props, children);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Render list of items
|
|
346
|
+
*/
|
|
347
|
+
private renderListRuntime(
|
|
348
|
+
component: UIComponent,
|
|
349
|
+
props: RuntimeComponentProps,
|
|
350
|
+
context: RenderContext
|
|
351
|
+
): React.ReactElement | null {
|
|
352
|
+
if (!this.viewContext) return null;
|
|
353
|
+
|
|
354
|
+
const dataArray = this.viewContext.data[component.dataSource!];
|
|
355
|
+
if (!Array.isArray(dataArray)) {
|
|
356
|
+
console.warn(`[RuntimeView] Data source not found: ${component.dataSource}`);
|
|
357
|
+
return null;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
const items = dataArray.map((item, index) => {
|
|
361
|
+
const itemProps = {
|
|
362
|
+
...props,
|
|
363
|
+
...item,
|
|
364
|
+
key: `${context.path.join('-')}-${index}`
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
return this.createElementFromAdapter(component.type, itemProps, null);
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
return createElement(React.Fragment, null, ...items);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Create React element from adapter component
|
|
375
|
+
*/
|
|
376
|
+
private createElementFromAdapter(
|
|
377
|
+
type: string,
|
|
378
|
+
props: RuntimeComponentProps,
|
|
379
|
+
children: React.ReactNode
|
|
380
|
+
): React.ReactElement {
|
|
381
|
+
// For runtime, we create a simple div wrapper with className
|
|
382
|
+
// In actual implementation, this would integrate with a component library
|
|
383
|
+
return createElement(
|
|
384
|
+
'div',
|
|
385
|
+
{
|
|
386
|
+
...props,
|
|
387
|
+
className: `specverse-runtime-${type} ${props.className || ''}`.trim(),
|
|
388
|
+
'data-component': type
|
|
389
|
+
},
|
|
390
|
+
children
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/**
|
|
395
|
+
* Evaluate condition expression
|
|
396
|
+
*/
|
|
397
|
+
private evaluateCondition(condition: string, context: RuntimeViewContext): boolean {
|
|
398
|
+
try {
|
|
399
|
+
const fn = new Function('state', 'data', `return ${condition}`);
|
|
400
|
+
return fn(context.state, context.data);
|
|
401
|
+
} catch (error) {
|
|
402
|
+
console.error(`[RuntimeView] Condition evaluation error:`, error);
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/**
|
|
408
|
+
* Capitalize first letter
|
|
409
|
+
*/
|
|
410
|
+
private capitalize(str: string): string {
|
|
411
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// ============================================================================
|
|
416
|
+
// Factory Functions
|
|
417
|
+
// ============================================================================
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Create a RuntimeViewRenderer instance
|
|
421
|
+
*
|
|
422
|
+
* @param adapter - Component adapter (runtime adapter)
|
|
423
|
+
* @param config - Optional configuration
|
|
424
|
+
* @returns RuntimeViewRenderer instance
|
|
425
|
+
*/
|
|
426
|
+
export function createRuntimeRenderer(
|
|
427
|
+
adapter: ComponentAdapter,
|
|
428
|
+
config?: Partial<RuntimeRendererConfig>
|
|
429
|
+
): RuntimeViewRenderer {
|
|
430
|
+
const defaultConfig: RuntimeRendererConfig = {
|
|
431
|
+
framework: 'runtime',
|
|
432
|
+
target: 'runtime',
|
|
433
|
+
liveReload: false,
|
|
434
|
+
debug: false,
|
|
435
|
+
maxDepth: 3,
|
|
436
|
+
enableWarnings: true
|
|
437
|
+
};
|
|
438
|
+
|
|
439
|
+
const finalConfig = { ...defaultConfig, ...config } as RuntimeRendererConfig;
|
|
440
|
+
|
|
441
|
+
return new RuntimeViewRenderer(adapter, finalConfig);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
/**
|
|
445
|
+
* Render view at runtime (convenience function)
|
|
446
|
+
*
|
|
447
|
+
* @param viewSpec - View specification
|
|
448
|
+
* @param adapter - Component adapter
|
|
449
|
+
* @param context - Runtime context
|
|
450
|
+
* @returns React element
|
|
451
|
+
*/
|
|
452
|
+
export function renderView(
|
|
453
|
+
viewSpec: ViewSpec,
|
|
454
|
+
adapter: ComponentAdapter,
|
|
455
|
+
context?: Partial<RuntimeViewContext>
|
|
456
|
+
): React.ReactElement {
|
|
457
|
+
const renderer = createRuntimeRenderer(adapter);
|
|
458
|
+
return renderer.renderRuntime(viewSpec, context);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Create runtime component (convenience function)
|
|
463
|
+
*
|
|
464
|
+
* @param viewSpec - View specification
|
|
465
|
+
* @param adapter - Component adapter
|
|
466
|
+
* @returns React component function
|
|
467
|
+
*/
|
|
468
|
+
export function createViewComponent(
|
|
469
|
+
viewSpec: ViewSpec,
|
|
470
|
+
adapter: ComponentAdapter
|
|
471
|
+
): React.FC<any> {
|
|
472
|
+
const renderer = createRuntimeRenderer(adapter);
|
|
473
|
+
return renderer.createRuntimeComponent(viewSpec);
|
|
474
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for Composite View Patterns
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
import {
|
|
7
|
+
COMPOSITE_VIEW_PATTERNS,
|
|
8
|
+
FORM_VIEW_PATTERN,
|
|
9
|
+
LIST_VIEW_PATTERN,
|
|
10
|
+
DETAIL_VIEW_PATTERN,
|
|
11
|
+
DASHBOARD_VIEW_PATTERN,
|
|
12
|
+
getPattern,
|
|
13
|
+
getPatternsByCategory,
|
|
14
|
+
getPatternsByTag,
|
|
15
|
+
getPatternIds,
|
|
16
|
+
hasPattern
|
|
17
|
+
} from '../composite-patterns.js';
|
|
18
|
+
import { validatePattern, validatePatternRegistry } from '../pattern-validator.js';
|
|
19
|
+
|
|
20
|
+
describe('Composite View Patterns', () => {
|
|
21
|
+
describe('Pattern Registry', () => {
|
|
22
|
+
it('should export all 4 core patterns', () => {
|
|
23
|
+
expect(Object.keys(COMPOSITE_VIEW_PATTERNS)).toHaveLength(4);
|
|
24
|
+
expect(COMPOSITE_VIEW_PATTERNS['form-view']).toBeDefined();
|
|
25
|
+
expect(COMPOSITE_VIEW_PATTERNS['list-view']).toBeDefined();
|
|
26
|
+
expect(COMPOSITE_VIEW_PATTERNS['detail-view']).toBeDefined();
|
|
27
|
+
expect(COMPOSITE_VIEW_PATTERNS['dashboard-view']).toBeDefined();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('should have correct pattern IDs', () => {
|
|
31
|
+
const ids = getPatternIds();
|
|
32
|
+
expect(ids).toContain('form-view');
|
|
33
|
+
expect(ids).toContain('list-view');
|
|
34
|
+
expect(ids).toContain('detail-view');
|
|
35
|
+
expect(ids).toContain('dashboard-view');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
describe('FormView Pattern', () => {
|
|
40
|
+
it('should have correct identity', () => {
|
|
41
|
+
expect(FORM_VIEW_PATTERN.id).toBe('form-view');
|
|
42
|
+
expect(FORM_VIEW_PATTERN.name).toBe('FormView');
|
|
43
|
+
expect(FORM_VIEW_PATTERN.version).toBe('1.0.0');
|
|
44
|
+
expect(FORM_VIEW_PATTERN.category).toBe('data-entry');
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('should require form, input, and button components', () => {
|
|
48
|
+
expect(FORM_VIEW_PATTERN.requiredAtomicComponents).toContain('form');
|
|
49
|
+
expect(FORM_VIEW_PATTERN.requiredAtomicComponents).toContain('input');
|
|
50
|
+
expect(FORM_VIEW_PATTERN.requiredAtomicComponents).toContain('button');
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
it('should support create, update, and validate operations', () => {
|
|
54
|
+
expect(FORM_VIEW_PATTERN.supportedOperations).toContain('create');
|
|
55
|
+
expect(FORM_VIEW_PATTERN.supportedOperations).toContain('update');
|
|
56
|
+
expect(FORM_VIEW_PATTERN.supportedOperations).toContain('validate');
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('should validate successfully', () => {
|
|
60
|
+
const result = validatePattern(FORM_VIEW_PATTERN);
|
|
61
|
+
expect(result.valid).toBe(true);
|
|
62
|
+
expect(result.errors).toHaveLength(0);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe('ListView Pattern', () => {
|
|
67
|
+
it('should have correct identity', () => {
|
|
68
|
+
expect(LIST_VIEW_PATTERN.id).toBe('list-view');
|
|
69
|
+
expect(LIST_VIEW_PATTERN.name).toBe('ListView');
|
|
70
|
+
expect(LIST_VIEW_PATTERN.category).toBe('data-display');
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('should require table and list components', () => {
|
|
74
|
+
expect(LIST_VIEW_PATTERN.requiredAtomicComponents).toContain('table');
|
|
75
|
+
expect(LIST_VIEW_PATTERN.requiredAtomicComponents).toContain('list');
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('should support retrieve_many operation', () => {
|
|
79
|
+
expect(LIST_VIEW_PATTERN.supportedOperations).toContain('retrieve_many');
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('should validate successfully', () => {
|
|
83
|
+
const result = validatePattern(LIST_VIEW_PATTERN);
|
|
84
|
+
expect(result.valid).toBe(true);
|
|
85
|
+
expect(result.errors).toHaveLength(0);
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
describe('DetailView Pattern', () => {
|
|
90
|
+
it('should have correct identity', () => {
|
|
91
|
+
expect(DETAIL_VIEW_PATTERN.id).toBe('detail-view');
|
|
92
|
+
expect(DETAIL_VIEW_PATTERN.name).toBe('DetailView');
|
|
93
|
+
expect(DETAIL_VIEW_PATTERN.category).toBe('data-display');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
it('should require content and profile components', () => {
|
|
97
|
+
expect(DETAIL_VIEW_PATTERN.requiredAtomicComponents).toContain('content');
|
|
98
|
+
expect(DETAIL_VIEW_PATTERN.requiredAtomicComponents).toContain('profile');
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('should support retrieve, update, and delete operations', () => {
|
|
102
|
+
expect(DETAIL_VIEW_PATTERN.supportedOperations).toContain('retrieve');
|
|
103
|
+
expect(DETAIL_VIEW_PATTERN.supportedOperations).toContain('update');
|
|
104
|
+
expect(DETAIL_VIEW_PATTERN.supportedOperations).toContain('delete');
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('should validate successfully', () => {
|
|
108
|
+
const result = validatePattern(DETAIL_VIEW_PATTERN);
|
|
109
|
+
expect(result.valid).toBe(true);
|
|
110
|
+
expect(result.errors).toHaveLength(0);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
describe('DashboardView Pattern', () => {
|
|
115
|
+
it('should have correct identity', () => {
|
|
116
|
+
expect(DASHBOARD_VIEW_PATTERN.id).toBe('dashboard-view');
|
|
117
|
+
expect(DASHBOARD_VIEW_PATTERN.name).toBe('DashboardView');
|
|
118
|
+
expect(DASHBOARD_VIEW_PATTERN.category).toBe('dashboard');
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it('should require grid and card components', () => {
|
|
122
|
+
expect(DASHBOARD_VIEW_PATTERN.requiredAtomicComponents).toContain('grid');
|
|
123
|
+
expect(DASHBOARD_VIEW_PATTERN.requiredAtomicComponents).toContain('card');
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should support retrieve_many operation', () => {
|
|
127
|
+
expect(DASHBOARD_VIEW_PATTERN.supportedOperations).toContain('retrieve_many');
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('should validate successfully', () => {
|
|
131
|
+
const result = validatePattern(DASHBOARD_VIEW_PATTERN);
|
|
132
|
+
expect(result.valid).toBe(true);
|
|
133
|
+
expect(result.errors).toHaveLength(0);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
describe('Pattern Query Functions', () => {
|
|
138
|
+
it('should get pattern by ID', () => {
|
|
139
|
+
const pattern = getPattern('form-view');
|
|
140
|
+
expect(pattern).toBeDefined();
|
|
141
|
+
expect(pattern?.name).toBe('FormView');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('should return undefined for non-existent pattern', () => {
|
|
145
|
+
const pattern = getPattern('non-existent');
|
|
146
|
+
expect(pattern).toBeUndefined();
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it('should check if pattern exists', () => {
|
|
150
|
+
expect(hasPattern('form-view')).toBe(true);
|
|
151
|
+
expect(hasPattern('non-existent')).toBe(false);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('should get patterns by category', () => {
|
|
155
|
+
const dataEntryPatterns = getPatternsByCategory('data-entry');
|
|
156
|
+
expect(dataEntryPatterns).toHaveLength(1);
|
|
157
|
+
expect(dataEntryPatterns[0].name).toBe('FormView');
|
|
158
|
+
|
|
159
|
+
const dataDisplayPatterns = getPatternsByCategory('data-display');
|
|
160
|
+
expect(dataDisplayPatterns).toHaveLength(2);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it('should get patterns by tag', () => {
|
|
164
|
+
const formPatterns = getPatternsByTag('form');
|
|
165
|
+
expect(formPatterns.length).toBeGreaterThan(0);
|
|
166
|
+
expect(formPatterns[0].tags).toContain('form');
|
|
167
|
+
|
|
168
|
+
const tablePatterns = getPatternsByTag('table');
|
|
169
|
+
expect(tablePatterns.length).toBeGreaterThan(0);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
describe('Pattern Validation', () => {
|
|
174
|
+
it('should validate all patterns in registry', () => {
|
|
175
|
+
const results = validatePatternRegistry(COMPOSITE_VIEW_PATTERNS);
|
|
176
|
+
expect(Object.keys(results)).toHaveLength(4);
|
|
177
|
+
|
|
178
|
+
// All patterns should be valid
|
|
179
|
+
for (const [id, result] of Object.entries(results)) {
|
|
180
|
+
expect(result.valid).toBe(true);
|
|
181
|
+
expect(result.errors).toHaveLength(0);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it('should detect missing required fields', () => {
|
|
186
|
+
const invalidPattern: any = {
|
|
187
|
+
id: '',
|
|
188
|
+
name: '',
|
|
189
|
+
version: '1.0.0',
|
|
190
|
+
category: 'data-entry',
|
|
191
|
+
requiredAtomicComponents: [],
|
|
192
|
+
layoutStrategy: { type: 'single-column', responsive: true },
|
|
193
|
+
dataBindings: {
|
|
194
|
+
source: 'controller',
|
|
195
|
+
operations: []
|
|
196
|
+
},
|
|
197
|
+
supportedOperations: []
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
const result = validatePattern(invalidPattern);
|
|
201
|
+
expect(result.valid).toBe(false);
|
|
202
|
+
expect(result.errors.length).toBeGreaterThan(0);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
it('should detect invalid category', () => {
|
|
206
|
+
const invalidPattern: any = {
|
|
207
|
+
...FORM_VIEW_PATTERN,
|
|
208
|
+
category: 'invalid-category'
|
|
209
|
+
};
|
|
210
|
+
|
|
211
|
+
const result = validatePattern(invalidPattern);
|
|
212
|
+
expect(result.valid).toBe(false);
|
|
213
|
+
expect(result.errors.some(e => e.field === 'category')).toBe(true);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it('should detect invalid version format', () => {
|
|
217
|
+
const invalidPattern: any = {
|
|
218
|
+
...FORM_VIEW_PATTERN,
|
|
219
|
+
version: 'not-a-version'
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
const result = validatePattern(invalidPattern);
|
|
223
|
+
expect(result.valid).toBe(false);
|
|
224
|
+
expect(result.errors.some(e => e.field === 'version')).toBe(true);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
describe('Framework Independence', () => {
|
|
229
|
+
it('should have no React dependencies', () => {
|
|
230
|
+
// Patterns should be pure data structures
|
|
231
|
+
expect(typeof FORM_VIEW_PATTERN).toBe('object');
|
|
232
|
+
expect(FORM_VIEW_PATTERN.requiredAtomicComponents).toBeInstanceOf(Array);
|
|
233
|
+
expect(FORM_VIEW_PATTERN.frameworkHints).toBeDefined();
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('should support multiple frameworks in hints', () => {
|
|
237
|
+
expect(FORM_VIEW_PATTERN.frameworkHints?.react).toBeDefined();
|
|
238
|
+
expect(FORM_VIEW_PATTERN.frameworkHints?.vue).toBeDefined();
|
|
239
|
+
expect(FORM_VIEW_PATTERN.frameworkHints?.svelte).toBeDefined();
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
});
|