@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.
Files changed (420) hide show
  1. package/assets/examples/09-api/ai-spec.yaml +194 -0
  2. package/assets/examples/09-api/converted.yaml +95 -0
  3. package/assets/examples/09-api/diagram-architecture.mmd +10 -0
  4. package/assets/examples/09-api/diagram-er.mmd +10 -0
  5. package/assets/examples/09-api/documentation.html +104 -0
  6. package/assets/examples/09-api/documentation.md +95 -0
  7. package/assets/examples/09-api/inferred-spec.yaml +420 -0
  8. package/assets/examples/09-api/openapi.json +61 -0
  9. package/assets/examples/10-api/README.md +216 -0
  10. package/assets/examples/10-api/ai-spec.yaml +194 -0
  11. package/assets/examples/10-api/converted.yaml +96 -0
  12. package/assets/examples/10-api/diagram-architecture.mmd +10 -0
  13. package/assets/examples/10-api/diagram-er.mmd +10 -0
  14. package/assets/examples/10-api/documentation.html +104 -0
  15. package/assets/examples/10-api/documentation.md +95 -0
  16. package/assets/examples/10-api/inferred-spec.yaml +7 -0
  17. package/assets/examples/10-api/metadata.yaml +89 -0
  18. package/assets/examples/10-api/openapi.json +61 -0
  19. package/assets/examples/10-api/package-integration-test.js +177 -0
  20. package/assets/examples/10-api/usage-example.js +323 -0
  21. package/assets/examples/10-api/usage-example.ts +363 -0
  22. package/assets/examples/10-api/workflow-test.js +113 -0
  23. package/assets/examples/manifests/01-simple-default-mappings.yaml +36 -0
  24. package/assets/examples/manifests/02-capability-mappings.yaml +55 -0
  25. package/assets/examples/manifests/03-hybrid-mappings.yaml +109 -0
  26. package/assets/examples/manifests/README.md +245 -0
  27. package/assets/examples/manifests/backend-only.yaml +43 -0
  28. package/assets/examples/manifests/blog-api.md +78 -0
  29. package/assets/examples/manifests/blog-api.specly +79 -0
  30. package/assets/examples/manifests/frontend-only.yaml +27 -0
  31. package/assets/examples/manifests/fullstack-app.yaml +44 -0
  32. package/assets/examples/manifests/fullstack-monorepo.yaml +62 -0
  33. package/assets/examples/validate-examples-with-expected-failures.cjs +328 -0
  34. package/assets/examples/validate-examples.cjs +225 -0
  35. package/assets/examples-decomposed/cloud-native-manifest.example.yaml +8 -0
  36. package/assets/examples-decomposed/cloud-native-manifest.md +379 -0
  37. package/assets/examples-decomposed/cloud-native-manifest.specly +60 -0
  38. package/assets/examples-decomposed/docker-compose-manifest.example.yaml +8 -0
  39. package/assets/examples-decomposed/docker-compose-manifest.md +326 -0
  40. package/assets/examples-decomposed/docker-compose-manifest.specly +40 -0
  41. package/assets/examples-decomposed/kubernetes-deployment-manifest.example.yaml +8 -0
  42. package/assets/examples-decomposed/kubernetes-deployment-manifest.md +237 -0
  43. package/assets/examples-decomposed/kubernetes-deployment-manifest.specly +41 -0
  44. package/assets/templates/README.md +559 -0
  45. package/assets/templates/TEMPLATE-ENHANCEMENTS-V33.md +462 -0
  46. package/assets/templates/backend-only/CLAUDE.md +73 -0
  47. package/assets/templates/backend-only/README.md +197 -0
  48. package/assets/templates/backend-only/deployments/README.md +149 -0
  49. package/assets/templates/backend-only/deployments/development.specly +53 -0
  50. package/assets/templates/backend-only/deployments/production.specly +87 -0
  51. package/assets/templates/backend-only/docs/README.md +50 -0
  52. package/assets/templates/backend-only/docs/api/README.md +7 -0
  53. package/assets/templates/backend-only/docs/diagrams/README.md +85 -0
  54. package/assets/templates/backend-only/docs/example-documentation-template.md +269 -0
  55. package/assets/templates/backend-only/docs/guides/README.md +15 -0
  56. package/assets/templates/backend-only/dot.env.example +18 -0
  57. package/assets/templates/backend-only/generated/README.md +56 -0
  58. package/assets/templates/backend-only/generated/code/integration-test.template.js +320 -0
  59. package/assets/templates/backend-only/generated/code/package.json.template +34 -0
  60. package/assets/templates/backend-only/generated/docs/README.md +49 -0
  61. package/assets/templates/backend-only/gitignore +54 -0
  62. package/assets/templates/backend-only/manifests/README.md +72 -0
  63. package/assets/templates/backend-only/manifests/docker-compose.specly +91 -0
  64. package/assets/templates/backend-only/manifests/implementation.yaml +100 -0
  65. package/assets/templates/backend-only/manifests/kubernetes.specly +140 -0
  66. package/assets/templates/backend-only/package.json +59 -0
  67. package/assets/templates/backend-only/scripts/test-all.sh +160 -0
  68. package/assets/templates/backend-only/scripts/test-generated-code.sh +165 -0
  69. package/assets/templates/backend-only/specs/main.specly +67 -0
  70. package/assets/templates/default/CLAUDE.md +141 -0
  71. package/assets/templates/default/README.md +404 -0
  72. package/assets/templates/default/deployments/README.md +149 -0
  73. package/assets/templates/default/deployments/development.specly +53 -0
  74. package/assets/templates/default/deployments/production.specly +87 -0
  75. package/assets/templates/default/docs/README.md +50 -0
  76. package/assets/templates/default/docs/api/README.md +7 -0
  77. package/assets/templates/default/docs/diagrams/README.md +85 -0
  78. package/assets/templates/default/docs/example-documentation-template.md +269 -0
  79. package/assets/templates/default/docs/guides/README.md +15 -0
  80. package/assets/templates/default/dot.env.example +18 -0
  81. package/assets/templates/default/generated/README.md +56 -0
  82. package/assets/templates/default/generated/code/integration-test.template.js +320 -0
  83. package/assets/templates/default/generated/code/package.json.template +34 -0
  84. package/assets/templates/default/generated/docs/README.md +49 -0
  85. package/assets/templates/default/gitignore +54 -0
  86. package/assets/templates/default/manifests/README.md +72 -0
  87. package/assets/templates/default/manifests/docker-compose.specly +91 -0
  88. package/assets/templates/default/manifests/implementation.yaml +176 -0
  89. package/assets/templates/default/manifests/kubernetes.specly +140 -0
  90. package/assets/templates/default/package.json +61 -0
  91. package/assets/templates/default/scripts/test-all.sh +160 -0
  92. package/assets/templates/default/scripts/test-generated-code.sh +165 -0
  93. package/assets/templates/default/specs/main.specly +67 -0
  94. package/assets/templates/frontend-only/CLAUDE.md +75 -0
  95. package/assets/templates/frontend-only/README.md +231 -0
  96. package/assets/templates/frontend-only/deployments/README.md +149 -0
  97. package/assets/templates/frontend-only/deployments/development.specly +53 -0
  98. package/assets/templates/frontend-only/deployments/production.specly +87 -0
  99. package/assets/templates/frontend-only/docs/README.md +50 -0
  100. package/assets/templates/frontend-only/docs/api/README.md +7 -0
  101. package/assets/templates/frontend-only/docs/diagrams/README.md +85 -0
  102. package/assets/templates/frontend-only/docs/example-documentation-template.md +269 -0
  103. package/assets/templates/frontend-only/docs/guides/README.md +15 -0
  104. package/assets/templates/frontend-only/dot.env.example +18 -0
  105. package/assets/templates/frontend-only/generated/README.md +56 -0
  106. package/assets/templates/frontend-only/generated/code/integration-test.template.js +320 -0
  107. package/assets/templates/frontend-only/generated/code/package.json.template +34 -0
  108. package/assets/templates/frontend-only/generated/docs/README.md +49 -0
  109. package/assets/templates/frontend-only/gitignore +54 -0
  110. package/assets/templates/frontend-only/manifests/README.md +72 -0
  111. package/assets/templates/frontend-only/manifests/docker-compose.specly +91 -0
  112. package/assets/templates/frontend-only/manifests/implementation.yaml +58 -0
  113. package/assets/templates/frontend-only/manifests/kubernetes.specly +140 -0
  114. package/assets/templates/frontend-only/package.json +59 -0
  115. package/assets/templates/frontend-only/scripts/test-all.sh +160 -0
  116. package/assets/templates/frontend-only/scripts/test-generated-code.sh +165 -0
  117. package/assets/templates/frontend-only/specs/main.specly +57 -0
  118. package/assets/templates/full-stack/AI-GUIDE.md +60 -0
  119. package/assets/templates/full-stack/CLAUDE.md +141 -0
  120. package/assets/templates/full-stack/README.md +382 -0
  121. package/assets/templates/full-stack/archive/AI-GUIDE-legacy.md +392 -0
  122. package/assets/templates/full-stack/deployments/README.md +149 -0
  123. package/assets/templates/full-stack/deployments/development.specly +53 -0
  124. package/assets/templates/full-stack/deployments/production.specly +87 -0
  125. package/assets/templates/full-stack/docs/README.md +51 -0
  126. package/assets/templates/full-stack/docs/api/README.md +7 -0
  127. package/assets/templates/full-stack/docs/diagrams/README.md +85 -0
  128. package/assets/templates/full-stack/docs/example-documentation-template.md +269 -0
  129. package/assets/templates/full-stack/docs/guides/README.md +15 -0
  130. package/assets/templates/full-stack/generated/README.md +56 -0
  131. package/assets/templates/full-stack/generated/code/integration-test.template.js +320 -0
  132. package/assets/templates/full-stack/generated/code/package.json.template +34 -0
  133. package/assets/templates/full-stack/generated/docs/README.md +49 -0
  134. package/assets/templates/full-stack/gitignore +54 -0
  135. package/assets/templates/full-stack/manifests/README.md +72 -0
  136. package/assets/templates/full-stack/manifests/docker-compose.specly +91 -0
  137. package/assets/templates/full-stack/manifests/implementation.yaml +155 -0
  138. package/assets/templates/full-stack/manifests/kubernetes.specly +140 -0
  139. package/assets/templates/full-stack/package.json +45 -0
  140. package/assets/templates/full-stack/scripts/test-all.sh +160 -0
  141. package/assets/templates/full-stack/scripts/test-generated-code.sh +165 -0
  142. package/assets/templates/full-stack/specs/example-v33.specly +297 -0
  143. package/assets/templates/full-stack/specs/main-simple.specly +73 -0
  144. package/assets/templates/full-stack/specs/main.specly +408 -0
  145. package/dist/engines/code-generator.d.ts +86 -0
  146. package/dist/engines/code-generator.d.ts.map +1 -0
  147. package/dist/engines/code-generator.js +159 -0
  148. package/dist/engines/code-generator.js.map +1 -0
  149. package/dist/engines/engine-registry.d.ts +94 -0
  150. package/dist/engines/engine-registry.d.ts.map +1 -0
  151. package/dist/engines/engine-registry.js +163 -0
  152. package/dist/engines/engine-registry.js.map +1 -0
  153. package/dist/engines/index.d.ts +10 -0
  154. package/dist/engines/index.d.ts.map +1 -0
  155. package/dist/engines/index.js +12 -0
  156. package/dist/engines/index.js.map +1 -0
  157. package/dist/engines/typescript-engine.d.ts +74 -0
  158. package/dist/engines/typescript-engine.d.ts.map +1 -0
  159. package/dist/engines/typescript-engine.js +288 -0
  160. package/dist/engines/typescript-engine.js.map +1 -0
  161. package/dist/generators/index.d.ts +11 -0
  162. package/dist/generators/index.d.ts.map +1 -0
  163. package/dist/generators/index.js +11 -0
  164. package/dist/generators/index.js.map +1 -0
  165. package/dist/index.d.ts +48 -0
  166. package/dist/index.d.ts.map +1 -0
  167. package/dist/index.js +434 -0
  168. package/dist/index.js.map +1 -0
  169. package/dist/library/index.d.ts +12 -0
  170. package/dist/library/index.d.ts.map +1 -0
  171. package/dist/library/index.js +15 -0
  172. package/dist/library/index.js.map +1 -0
  173. package/dist/library/library.d.ts +132 -0
  174. package/dist/library/library.d.ts.map +1 -0
  175. package/dist/library/library.js +343 -0
  176. package/dist/library/library.js.map +1 -0
  177. package/dist/library/loader.d.ts +73 -0
  178. package/dist/library/loader.d.ts.map +1 -0
  179. package/dist/library/loader.js +150 -0
  180. package/dist/library/loader.js.map +1 -0
  181. package/dist/library/resolver.d.ts +104 -0
  182. package/dist/library/resolver.d.ts.map +1 -0
  183. package/dist/library/resolver.js +299 -0
  184. package/dist/library/resolver.js.map +1 -0
  185. package/dist/library/validator.d.ts +65 -0
  186. package/dist/library/validator.d.ts.map +1 -0
  187. package/dist/library/validator.js +203 -0
  188. package/dist/library/validator.js.map +1 -0
  189. package/dist/types/index.d.ts +7 -0
  190. package/dist/types/index.d.ts.map +1 -0
  191. package/dist/types/index.js +7 -0
  192. package/dist/types/index.js.map +1 -0
  193. package/dist/types/instance-factory.d.ts +289 -0
  194. package/dist/types/instance-factory.d.ts.map +1 -0
  195. package/dist/types/instance-factory.js +8 -0
  196. package/dist/types/instance-factory.js.map +1 -0
  197. package/dist/types/unified-mappings.d.ts +163 -0
  198. package/dist/types/unified-mappings.d.ts.map +1 -0
  199. package/dist/types/unified-mappings.js +110 -0
  200. package/dist/types/unified-mappings.js.map +1 -0
  201. package/dist/utils/ai-spec-loader.d.ts +77 -0
  202. package/dist/utils/ai-spec-loader.d.ts.map +1 -0
  203. package/dist/utils/ai-spec-loader.js +138 -0
  204. package/dist/utils/ai-spec-loader.js.map +1 -0
  205. package/dist/utils/index.d.ts +9 -0
  206. package/dist/utils/index.d.ts.map +1 -0
  207. package/dist/utils/index.js +9 -0
  208. package/dist/utils/index.js.map +1 -0
  209. package/dist/utils/manifest-loader.d.ts +107 -0
  210. package/dist/utils/manifest-loader.d.ts.map +1 -0
  211. package/dist/utils/manifest-loader.js +168 -0
  212. package/dist/utils/manifest-loader.js.map +1 -0
  213. package/dist/utils/mapping-migration.d.ts +53 -0
  214. package/dist/utils/mapping-migration.d.ts.map +1 -0
  215. package/dist/utils/mapping-migration.js +194 -0
  216. package/dist/utils/mapping-migration.js.map +1 -0
  217. package/libs/instance-factories/CURVED-INTERFACE.md +278 -0
  218. package/libs/instance-factories/README.md +433 -0
  219. package/libs/instance-factories/applications/generic-app.yaml +52 -0
  220. package/libs/instance-factories/applications/react-app.yaml +186 -0
  221. package/libs/instance-factories/applications/templates/generic/backend-env-generator.ts +31 -0
  222. package/libs/instance-factories/applications/templates/generic/backend-package-json-generator.ts +80 -0
  223. package/libs/instance-factories/applications/templates/generic/backend-tsconfig-generator.ts +69 -0
  224. package/libs/instance-factories/applications/templates/generic/main-generator.ts +308 -0
  225. package/libs/instance-factories/applications/templates/react/_view-components-source.ts +555 -0
  226. package/libs/instance-factories/applications/templates/react/api-client-generator.ts +436 -0
  227. package/libs/instance-factories/applications/templates/react/api-types-generator.ts +153 -0
  228. package/libs/instance-factories/applications/templates/react/app-tsx-generator.ts +94 -0
  229. package/libs/instance-factories/applications/templates/react/env-example-generator.ts +24 -0
  230. package/libs/instance-factories/applications/templates/react/field-helpers-generator.ts +106 -0
  231. package/libs/instance-factories/applications/templates/react/gitignore-generator.ts +38 -0
  232. package/libs/instance-factories/applications/templates/react/index-css-generator.ts +85 -0
  233. package/libs/instance-factories/applications/templates/react/index-html-generator.ts +30 -0
  234. package/libs/instance-factories/applications/templates/react/main-tsx-generator.ts +34 -0
  235. package/libs/instance-factories/applications/templates/react/package-json-generator.ts +54 -0
  236. package/libs/instance-factories/applications/templates/react/pattern-adapter-generator.ts +179 -0
  237. package/libs/instance-factories/applications/templates/react/react-pattern-adapter.tsx +1347 -0
  238. package/libs/instance-factories/applications/templates/react/relationship-field-generator.ts +150 -0
  239. package/libs/instance-factories/applications/templates/react/tailwind-adapter-generator.ts +704 -0
  240. package/libs/instance-factories/applications/templates/react/tailwind-adapter-wrapper-generator.ts +84 -0
  241. package/libs/instance-factories/applications/templates/react/tsconfig-generator.ts +35 -0
  242. package/libs/instance-factories/applications/templates/react/use-api-hooks-generator.ts +121 -0
  243. package/libs/instance-factories/applications/templates/react/view-dashboard-generator.ts +150 -0
  244. package/libs/instance-factories/applications/templates/react/view-detail-generator.ts +150 -0
  245. package/libs/instance-factories/applications/templates/react/view-form-generator.ts +362 -0
  246. package/libs/instance-factories/applications/templates/react/view-list-generator.ts +98 -0
  247. package/libs/instance-factories/applications/templates/react/view-router-generator.ts +89 -0
  248. package/libs/instance-factories/applications/templates/react/vite-config-generator.ts +49 -0
  249. package/libs/instance-factories/archived/fastify-prisma.yaml +104 -0
  250. package/libs/instance-factories/cli/commander-js.yaml +55 -0
  251. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.d.ts +12 -0
  252. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.d.ts.map +1 -0
  253. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.js +115 -0
  254. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.js.map +1 -0
  255. package/libs/instance-factories/cli/templates/commander/cli-entry-generator.ts +145 -0
  256. package/libs/instance-factories/cli/templates/commander/command-generator.d.ts +14 -0
  257. package/libs/instance-factories/cli/templates/commander/command-generator.d.ts.map +1 -0
  258. package/libs/instance-factories/cli/templates/commander/command-generator.js +182 -0
  259. package/libs/instance-factories/cli/templates/commander/command-generator.js.map +1 -0
  260. package/libs/instance-factories/cli/templates/commander/command-generator.ts +992 -0
  261. package/libs/instance-factories/communication/event-emitter.yaml +56 -0
  262. package/libs/instance-factories/communication/rabbitmq-events.yaml +87 -0
  263. package/libs/instance-factories/communication/templates/eventemitter/bus-generator.ts +93 -0
  264. package/libs/instance-factories/communication/templates/eventemitter/publisher-generator.ts +117 -0
  265. package/libs/instance-factories/communication/templates/eventemitter/subscriber-generator.ts +101 -0
  266. package/libs/instance-factories/controllers/fastify.yaml +127 -0
  267. package/libs/instance-factories/controllers/templates/fastify/meta-routes-generator.ts +103 -0
  268. package/libs/instance-factories/controllers/templates/fastify/routes-generator.ts +389 -0
  269. package/libs/instance-factories/controllers/templates/fastify/server-generator.ts +76 -0
  270. package/libs/instance-factories/infrastructure/docker-k8s.yaml +61 -0
  271. package/libs/instance-factories/infrastructure/templates/docker-k8s/infrastructure-generator.ts +46 -0
  272. package/libs/instance-factories/orms/prisma.yaml +89 -0
  273. package/libs/instance-factories/orms/templates/prisma/schema-generator.ts +563 -0
  274. package/libs/instance-factories/orms/templates/prisma/services-generator.ts +408 -0
  275. package/libs/instance-factories/scaffolding/generic-scaffold.yaml +65 -0
  276. package/libs/instance-factories/scaffolding/templates/generic/env-example-generator.ts +73 -0
  277. package/libs/instance-factories/scaffolding/templates/generic/env-generator.ts +85 -0
  278. package/libs/instance-factories/scaffolding/templates/generic/gitignore-generator.ts +69 -0
  279. package/libs/instance-factories/scaffolding/templates/generic/package-json-generator.ts +176 -0
  280. package/libs/instance-factories/scaffolding/templates/generic/readme-generator.ts +207 -0
  281. package/libs/instance-factories/scaffolding/templates/generic/tsconfig-generator.ts +78 -0
  282. package/libs/instance-factories/scaffolding/templates/generic/tsconfig-react-generator.ts +41 -0
  283. package/libs/instance-factories/sdks/python-sdk.yaml +66 -0
  284. package/libs/instance-factories/sdks/templates/python/sdk-generator.ts +50 -0
  285. package/libs/instance-factories/sdks/templates/typescript/sdk-generator.ts +49 -0
  286. package/libs/instance-factories/sdks/typescript-sdk.yaml +59 -0
  287. package/libs/instance-factories/services/prisma-services.yaml +71 -0
  288. package/libs/instance-factories/services/templates/prisma/behavior-generator.ts +303 -0
  289. package/libs/instance-factories/services/templates/prisma/controller-generator.ts +532 -0
  290. package/libs/instance-factories/services/templates/prisma/service-generator.ts +315 -0
  291. package/libs/instance-factories/shared/path-resolver.ts +111 -0
  292. package/libs/instance-factories/storage/mongodb.yaml +79 -0
  293. package/libs/instance-factories/storage/postgresql.yaml +75 -0
  294. package/libs/instance-factories/storage/redis.yaml +79 -0
  295. package/libs/instance-factories/storage/templates/mongodb/config-generator.ts +15 -0
  296. package/libs/instance-factories/storage/templates/mongodb/docker-generator.ts +18 -0
  297. package/libs/instance-factories/storage/templates/postgresql/config-generator.ts +54 -0
  298. package/libs/instance-factories/storage/templates/postgresql/docker-generator.ts +55 -0
  299. package/libs/instance-factories/storage/templates/redis/config-generator.ts +16 -0
  300. package/libs/instance-factories/storage/templates/redis/docker-generator.ts +18 -0
  301. package/libs/instance-factories/test-generation.ts +192 -0
  302. package/libs/instance-factories/testing/templates/vitest/tests-generator.ts +51 -0
  303. package/libs/instance-factories/testing/vitest-tests.yaml +63 -0
  304. package/libs/instance-factories/tools/templates/mcp/mcp-server-generator.ts +136 -0
  305. package/libs/instance-factories/tools/templates/mcp/static/docs/DEPLOYMENT_GUIDE.md +630 -0
  306. package/libs/instance-factories/tools/templates/mcp/static/docs/HYBRID_RESOURCE_SYSTEM.md +330 -0
  307. package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/EXTENSION_DEPLOYMENT.md +552 -0
  308. package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/LOCAL_DEPLOYMENT.md +164 -0
  309. package/libs/instance-factories/tools/templates/mcp/static/docs/deployments/WEB_DEPLOYMENT.md +247 -0
  310. package/libs/instance-factories/tools/templates/mcp/static/package.json +92 -0
  311. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-enterprise.js +284 -0
  312. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-extension.js +139 -0
  313. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-local.js +74 -0
  314. package/libs/instance-factories/tools/templates/mcp/static/scripts/build-web.js +156 -0
  315. package/libs/instance-factories/tools/templates/mcp/static/scripts/copy-canonical-files.js +41 -0
  316. package/libs/instance-factories/tools/templates/mcp/static/scripts/test-deployments.js +259 -0
  317. package/libs/instance-factories/tools/templates/mcp/static/scripts/test-hybrid-resources.js +231 -0
  318. package/libs/instance-factories/tools/templates/mcp/static/scripts/test-hybrid-simple.js +196 -0
  319. package/libs/instance-factories/tools/templates/mcp/static/src/controllers/MCPServerController.ts +293 -0
  320. package/libs/instance-factories/tools/templates/mcp/static/src/events/EventEmitter.ts +90 -0
  321. package/libs/instance-factories/tools/templates/mcp/static/src/index.ts +24 -0
  322. package/libs/instance-factories/tools/templates/mcp/static/src/interfaces/ResourceProvider.ts +15 -0
  323. package/libs/instance-factories/tools/templates/mcp/static/src/models/LibrarySuggestion.ts +106 -0
  324. package/libs/instance-factories/tools/templates/mcp/static/src/models/SpecVerseResource.ts +75 -0
  325. package/libs/instance-factories/tools/templates/mcp/static/src/server/mcp-server.ts +239 -0
  326. package/libs/instance-factories/tools/templates/mcp/static/src/services/CLIProxyService.ts +1501 -0
  327. package/libs/instance-factories/tools/templates/mcp/static/src/services/EmbeddedResourcesAdapter.ts +211 -0
  328. package/libs/instance-factories/tools/templates/mcp/static/src/services/EntityModuleService.ts +308 -0
  329. package/libs/instance-factories/tools/templates/mcp/static/src/services/HybridResourcesProvider.ts +210 -0
  330. package/libs/instance-factories/tools/templates/mcp/static/src/services/LibraryToolsService.ts +356 -0
  331. package/libs/instance-factories/tools/templates/mcp/static/src/services/OrchestratorBridge.ts +524 -0
  332. package/libs/instance-factories/tools/templates/mcp/static/src/services/OrchestratorToolsService.ts +530 -0
  333. package/libs/instance-factories/tools/templates/mcp/static/src/services/PromptToolsService.ts +594 -0
  334. package/libs/instance-factories/tools/templates/mcp/static/src/services/ResourcesProviderService.ts +170 -0
  335. package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/CLIProxyService.init.test.ts +544 -0
  336. package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/CLIProxyService.test.ts +189 -0
  337. package/libs/instance-factories/tools/templates/mcp/static/src/tests/unit/ResourcesProviderService.test.ts +89 -0
  338. package/libs/instance-factories/tools/templates/mcp/static/src/types/index.ts +110 -0
  339. package/libs/instance-factories/tools/templates/mcp/static/tsconfig.json +28 -0
  340. package/libs/instance-factories/tools/templates/vscode/static/extension.ts +1195 -0
  341. package/libs/instance-factories/tools/templates/vscode/static/language-configuration.json +34 -0
  342. package/libs/instance-factories/tools/templates/vscode/static/schemas/specverse-v3-schema.json +4279 -0
  343. package/libs/instance-factories/tools/templates/vscode/static/syntaxes/specverse.tmLanguage.json +138 -0
  344. package/libs/instance-factories/tools/templates/vscode/static/themes/README.md +74 -0
  345. package/libs/instance-factories/tools/templates/vscode/static/themes/complete-specverse-colors.json +122 -0
  346. package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-basic-theme.json +65 -0
  347. package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-complete-theme.json +123 -0
  348. package/libs/instance-factories/tools/templates/vscode/static/themes/specverse-theme-colors.json +64 -0
  349. package/libs/instance-factories/tools/templates/vscode/vscode-extension-generator.ts +214 -0
  350. package/libs/instance-factories/validation/templates/zod/validation-generator.ts +46 -0
  351. package/libs/instance-factories/validation/zod.yaml +56 -0
  352. package/libs/instance-factories/views/index.d.ts +13 -0
  353. package/libs/instance-factories/views/index.d.ts.map +1 -0
  354. package/libs/instance-factories/views/index.js +18 -0
  355. package/libs/instance-factories/views/index.js.map +1 -0
  356. package/libs/instance-factories/views/index.ts +45 -0
  357. package/libs/instance-factories/views/react-components.yaml +129 -0
  358. package/libs/instance-factories/views/templates/ARCHITECTURE.md +198 -0
  359. package/libs/instance-factories/views/templates/react/adapters/antd-adapter.ts +869 -0
  360. package/libs/instance-factories/views/templates/react/adapters/mui-adapter.ts +953 -0
  361. package/libs/instance-factories/views/templates/react/adapters/shadcn-adapter.ts +806 -0
  362. package/libs/instance-factories/views/templates/react/app-generator.ts +55 -0
  363. package/libs/instance-factories/views/templates/react/components-generator.ts +391 -0
  364. package/libs/instance-factories/views/templates/react/forms-generator.ts +343 -0
  365. package/libs/instance-factories/views/templates/react/frontend-package-json-generator.ts +54 -0
  366. package/libs/instance-factories/views/templates/react/hooks-generator.ts +122 -0
  367. package/libs/instance-factories/views/templates/react/index-css-generator.ts +209 -0
  368. package/libs/instance-factories/views/templates/react/index-html-generator.ts +34 -0
  369. package/libs/instance-factories/views/templates/react/main-tsx-generator.ts +29 -0
  370. package/libs/instance-factories/views/templates/react/react-component-generator.d.ts +152 -0
  371. package/libs/instance-factories/views/templates/react/react-component-generator.d.ts.map +1 -0
  372. package/libs/instance-factories/views/templates/react/react-component-generator.js +398 -0
  373. package/libs/instance-factories/views/templates/react/react-component-generator.js.map +1 -0
  374. package/libs/instance-factories/views/templates/react/react-component-generator.ts +533 -0
  375. package/libs/instance-factories/views/templates/react/router-generator.ts +197 -0
  376. package/libs/instance-factories/views/templates/react/router-generic-generator.ts +103 -0
  377. package/libs/instance-factories/views/templates/react/spec-json-generator.ts +17 -0
  378. package/libs/instance-factories/views/templates/react/types-generator.ts +76 -0
  379. package/libs/instance-factories/views/templates/react/views-metadata-generator.ts +42 -0
  380. package/libs/instance-factories/views/templates/react/vite-config-generator.ts +38 -0
  381. package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.d.ts.map +1 -0
  382. package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.js.map +1 -0
  383. package/libs/instance-factories/views/templates/runtime/runtime-view-renderer.ts +474 -0
  384. package/libs/instance-factories/views/templates/shared/__tests__/composite-patterns.test.ts +242 -0
  385. package/libs/instance-factories/views/templates/shared/adapter-types.d.ts +77 -0
  386. package/libs/instance-factories/views/templates/shared/adapter-types.d.ts.map +1 -0
  387. package/libs/instance-factories/views/templates/shared/adapter-types.js +47 -0
  388. package/libs/instance-factories/views/templates/shared/adapter-types.js.map +1 -0
  389. package/libs/instance-factories/views/templates/shared/adapter-types.ts +142 -0
  390. package/libs/instance-factories/views/templates/shared/atomic-components-registry.d.ts +63 -0
  391. package/libs/instance-factories/views/templates/shared/atomic-components-registry.d.ts.map +1 -0
  392. package/libs/instance-factories/views/templates/shared/atomic-components-registry.js +822 -0
  393. package/libs/instance-factories/views/templates/shared/atomic-components-registry.js.map +1 -0
  394. package/libs/instance-factories/views/templates/shared/atomic-components-registry.ts +908 -0
  395. package/libs/instance-factories/views/templates/shared/base-generator.d.ts +247 -0
  396. package/libs/instance-factories/views/templates/shared/base-generator.d.ts.map +1 -0
  397. package/libs/instance-factories/views/templates/shared/base-generator.js +363 -0
  398. package/libs/instance-factories/views/templates/shared/base-generator.js.map +1 -0
  399. package/libs/instance-factories/views/templates/shared/base-generator.ts +608 -0
  400. package/libs/instance-factories/views/templates/shared/component-metadata.d.ts +254 -0
  401. package/libs/instance-factories/views/templates/shared/component-metadata.d.ts.map +1 -0
  402. package/libs/instance-factories/views/templates/shared/component-metadata.js +602 -0
  403. package/libs/instance-factories/views/templates/shared/component-metadata.js.map +1 -0
  404. package/libs/instance-factories/views/templates/shared/component-metadata.ts +803 -0
  405. package/libs/instance-factories/views/templates/shared/composite-pattern-types.ts +250 -0
  406. package/libs/instance-factories/views/templates/shared/composite-patterns.ts +535 -0
  407. package/libs/instance-factories/views/templates/shared/index.ts +68 -0
  408. package/libs/instance-factories/views/templates/shared/pattern-validator.ts +279 -0
  409. package/libs/instance-factories/views/templates/shared/property-mapper.d.ts +149 -0
  410. package/libs/instance-factories/views/templates/shared/property-mapper.d.ts.map +1 -0
  411. package/libs/instance-factories/views/templates/shared/property-mapper.js +580 -0
  412. package/libs/instance-factories/views/templates/shared/property-mapper.js.map +1 -0
  413. package/libs/instance-factories/views/templates/shared/property-mapper.ts +700 -0
  414. package/libs/instance-factories/views/templates/shared/syntax-mapper.d.ts +143 -0
  415. package/libs/instance-factories/views/templates/shared/syntax-mapper.d.ts.map +1 -0
  416. package/libs/instance-factories/views/templates/shared/syntax-mapper.js +420 -0
  417. package/libs/instance-factories/views/templates/shared/syntax-mapper.js.map +1 -0
  418. package/libs/instance-factories/views/templates/shared/syntax-mapper.ts +539 -0
  419. package/package.json +42 -0
  420. 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
+ });