@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,608 @@
1
+ /**
2
+ * Base Generator - Abstract Class for Framework Generators
3
+ *
4
+ * Provides shared functionality for React, Vue, Svelte, Angular, and Runtime generators.
5
+ * Enforces architectural constraints (nesting depth, state management) while allowing
6
+ * framework-specific implementation details.
7
+ *
8
+ * Architecture:
9
+ * - Shared: Component tree rendering, property mapping, nesting enforcement
10
+ * - Abstract: Syntax generation, file structure, imports (framework-specific)
11
+ * - Constraints: MAX_DEPTH = 3, basic state only, common properties only
12
+ */
13
+
14
+ import { mapProperties, PropertyTarget } from './property-mapper.js';
15
+ import { getSyntaxPattern, FrameworkTarget } from './syntax-mapper.js';
16
+ import { ATOMIC_COMPONENTS_REGISTRY, AtomicComponentDefinition } from './atomic-components-registry.js';
17
+ import type { ComponentAdapter } from './adapter-types.js';
18
+
19
+ // ============================================================================
20
+ // Types
21
+ // ============================================================================
22
+
23
+ /**
24
+ * UI Component specification from SpecVerse view definition
25
+ */
26
+ export interface UIComponent {
27
+ type: string;
28
+ properties?: Record<string, any>;
29
+ children?: UIComponent[];
30
+ dataSource?: string; // Model array for lists
31
+ condition?: string; // Conditional rendering expression
32
+ }
33
+
34
+ /**
35
+ * View specification from SpecVerse
36
+ */
37
+ export interface ViewSpec {
38
+ name: string;
39
+ description?: string;
40
+ components: Record<string, UIComponent>;
41
+ state?: Record<string, StateDefinition>;
42
+ events?: Record<string, EventDefinition>;
43
+ }
44
+
45
+ /**
46
+ * State variable definition
47
+ */
48
+ export interface StateDefinition {
49
+ type: string;
50
+ initial: any;
51
+ description?: string;
52
+ }
53
+
54
+ /**
55
+ * Event handler definition
56
+ */
57
+ export interface EventDefinition {
58
+ params?: string;
59
+ body: string;
60
+ description?: string;
61
+ }
62
+
63
+ /**
64
+ * Component rendering context
65
+ */
66
+ export interface RenderContext {
67
+ depth: number;
68
+ path: string[];
69
+ parentComponent?: string;
70
+ dataContext?: string; // Current data variable (for loops)
71
+ }
72
+
73
+ /**
74
+ * Generation result
75
+ */
76
+ export interface GenerationResult {
77
+ code: string;
78
+ imports: string[];
79
+ warnings: string[];
80
+ }
81
+
82
+ /**
83
+ * Generator configuration
84
+ */
85
+ export interface GeneratorConfig {
86
+ target: PropertyTarget;
87
+ framework: FrameworkTarget;
88
+ maxDepth?: number;
89
+ enableWarnings?: boolean;
90
+ }
91
+
92
+ // ============================================================================
93
+ // Base Generator Abstract Class
94
+ // ============================================================================
95
+
96
+ /**
97
+ * Base generator for all framework implementations
98
+ *
99
+ * Provides shared logic for:
100
+ * - Component tree rendering with depth enforcement
101
+ * - Property mapping via property-mapper
102
+ * - Nesting validation and flattening
103
+ * - State and event management
104
+ *
105
+ * Framework-specific subclasses must implement:
106
+ * - generateImports(): Framework-specific import statements
107
+ * - generateComponent(): Framework-specific component structure
108
+ * - generateState(): Framework-specific state declarations
109
+ * - generateEvents(): Framework-specific event handlers
110
+ */
111
+ export abstract class BaseComponentGenerator {
112
+ // Configuration
113
+ protected readonly config: GeneratorConfig;
114
+ protected readonly adapter: ComponentAdapter;
115
+
116
+ // Architectural constraints
117
+ protected readonly MAX_DEPTH: number;
118
+ protected readonly ENABLE_WARNINGS: boolean;
119
+
120
+ // Tracking
121
+ protected warnings: string[] = [];
122
+ protected imports: Set<string> = new Set();
123
+
124
+ constructor(adapter: ComponentAdapter, config: GeneratorConfig) {
125
+ this.adapter = adapter;
126
+ this.config = config;
127
+ this.MAX_DEPTH = config.maxDepth ?? 3;
128
+ this.ENABLE_WARNINGS = config.enableWarnings ?? true;
129
+ }
130
+
131
+ // ============================================================================
132
+ // Public API
133
+ // ============================================================================
134
+
135
+ /**
136
+ * Generate code for a complete view specification
137
+ *
138
+ * @param viewSpec - View specification from SpecVerse
139
+ * @returns Generation result with code, imports, and warnings
140
+ */
141
+ public generate(viewSpec: ViewSpec): GenerationResult {
142
+ this.reset();
143
+
144
+ // Generate imports
145
+ const importStatements = this.generateImports(viewSpec);
146
+
147
+ // Generate state declarations
148
+ const stateCode = viewSpec.state
149
+ ? this.generateState(viewSpec.state)
150
+ : '';
151
+
152
+ // Generate event handlers
153
+ const eventsCode = viewSpec.events
154
+ ? this.generateEvents(viewSpec.events)
155
+ : '';
156
+
157
+ // Generate component tree
158
+ const componentsCode = this.generateComponentTree(viewSpec.components);
159
+
160
+ // Generate complete component
161
+ const code = this.generateComponent({
162
+ name: viewSpec.name,
163
+ imports: importStatements,
164
+ state: stateCode,
165
+ events: eventsCode,
166
+ components: componentsCode
167
+ });
168
+
169
+ return {
170
+ code,
171
+ imports: Array.from(this.imports),
172
+ warnings: this.warnings
173
+ };
174
+ }
175
+
176
+ // ============================================================================
177
+ // Shared Component Rendering (Framework-Agnostic)
178
+ // ============================================================================
179
+
180
+ /**
181
+ * Render all components in the view
182
+ */
183
+ protected generateComponentTree(components: Record<string, UIComponent>): string {
184
+ const rendered = Object.entries(components).map(([name, component]) => {
185
+ return this.renderComponent(component, {
186
+ depth: 0,
187
+ path: [name],
188
+ dataContext: undefined
189
+ });
190
+ });
191
+
192
+ return rendered.join('\n\n');
193
+ }
194
+
195
+ /**
196
+ * Render a single component with depth tracking and nesting enforcement
197
+ *
198
+ * This is the core shared logic - applies to ALL frameworks
199
+ */
200
+ protected renderComponent(
201
+ component: UIComponent,
202
+ context: RenderContext
203
+ ): string {
204
+ // Depth enforcement
205
+ if (context.depth > this.MAX_DEPTH) {
206
+ this.addWarning(
207
+ `Component at path ${context.path.join('.')} exceeds max depth (${this.MAX_DEPTH}). ` +
208
+ `Flattening to maintain readability.`
209
+ );
210
+ return this.renderFlattened(component, context);
211
+ }
212
+
213
+ // Get component definition from registry
214
+ const componentDef = ATOMIC_COMPONENTS_REGISTRY[component.type];
215
+ if (!componentDef) {
216
+ this.addWarning(`Unknown component type: ${component.type}`);
217
+ return `<!-- Unknown component: ${component.type} -->`;
218
+ }
219
+
220
+ // Map properties to target framework
221
+ const mappedProps = this.mapComponentProperties(component, componentDef);
222
+
223
+ // Handle conditional rendering
224
+ if (component.condition) {
225
+ return this.renderConditional(component, mappedProps, context);
226
+ }
227
+
228
+ // Handle list rendering (dataSource)
229
+ if (component.dataSource) {
230
+ return this.renderList(component, mappedProps, context);
231
+ }
232
+
233
+ // Handle children
234
+ const children = component.children
235
+ ? this.renderChildren(component.children, context)
236
+ : undefined;
237
+
238
+ // Delegate to adapter for framework-specific rendering
239
+ return this.renderAdapterComponent(
240
+ component.type,
241
+ mappedProps,
242
+ children,
243
+ context
244
+ );
245
+ }
246
+
247
+ /**
248
+ * Map component properties using property-mapper
249
+ */
250
+ protected mapComponentProperties(
251
+ component: UIComponent,
252
+ componentDef: AtomicComponentDefinition
253
+ ): Record<string, any> {
254
+ if (!component.properties) {
255
+ return {};
256
+ }
257
+
258
+ return mapProperties(
259
+ component.type,
260
+ component.properties,
261
+ this.config.target
262
+ );
263
+ }
264
+
265
+ /**
266
+ * Render child components with incremented depth
267
+ */
268
+ protected renderChildren(
269
+ children: UIComponent[],
270
+ parentContext: RenderContext
271
+ ): string {
272
+ const childContext: RenderContext = {
273
+ ...parentContext,
274
+ depth: parentContext.depth + 1
275
+ };
276
+
277
+ return children
278
+ .map((child, index) => {
279
+ const childPath = [...parentContext.path, `child_${index}`];
280
+ return this.renderComponent(child, {
281
+ ...childContext,
282
+ path: childPath
283
+ });
284
+ })
285
+ .join('\n');
286
+ }
287
+
288
+ /**
289
+ * Render conditional component using syntax-mapper
290
+ */
291
+ protected renderConditional(
292
+ component: UIComponent,
293
+ mappedProps: Record<string, any>,
294
+ context: RenderContext
295
+ ): string {
296
+ const innerComponent = this.renderAdapterComponent(
297
+ component.type,
298
+ mappedProps,
299
+ component.children
300
+ ? this.renderChildren(component.children, context)
301
+ : undefined,
302
+ context
303
+ );
304
+
305
+ // Use syntax-mapper for framework-specific conditional syntax
306
+ return getSyntaxPattern('conditionalRender', this.config.framework, {
307
+ condition: component.condition,
308
+ Component: this.getComponentName(component.type),
309
+ props: this.formatProps(mappedProps)
310
+ });
311
+ }
312
+
313
+ /**
314
+ * Render list (loop) component using syntax-mapper
315
+ */
316
+ protected renderList(
317
+ component: UIComponent,
318
+ mappedProps: Record<string, any>,
319
+ context: RenderContext
320
+ ): string {
321
+ const itemName = this.getItemName(component.dataSource!);
322
+ const keyProperty = this.getKeyProperty(component);
323
+
324
+ // Create child context with data variable
325
+ const childContext: RenderContext = {
326
+ ...context,
327
+ depth: context.depth + 1,
328
+ dataContext: itemName
329
+ };
330
+
331
+ // Use syntax-mapper for framework-specific loop syntax
332
+ return getSyntaxPattern('loopRender', this.config.framework, {
333
+ array: component.dataSource,
334
+ item: itemName,
335
+ key: keyProperty,
336
+ Component: this.getComponentName(component.type)
337
+ });
338
+ }
339
+
340
+ /**
341
+ * Flatten component when depth exceeded
342
+ *
343
+ * Extracts nested children into sibling components to reduce nesting
344
+ */
345
+ protected renderFlattened(
346
+ component: UIComponent,
347
+ context: RenderContext
348
+ ): string {
349
+ // Render component without children
350
+ const componentDef = ATOMIC_COMPONENTS_REGISTRY[component.type];
351
+ const mappedProps = this.mapComponentProperties(component, componentDef);
352
+
353
+ const flatComponent = this.renderAdapterComponent(
354
+ component.type,
355
+ mappedProps,
356
+ undefined, // No children
357
+ context
358
+ );
359
+
360
+ // Render children as siblings (extracted)
361
+ const flattenedChildren = component.children
362
+ ? component.children.map((child, index) => {
363
+ return this.renderComponent(child, {
364
+ depth: context.depth, // Same depth (sibling)
365
+ path: [...context.path, `flattened_${index}`]
366
+ });
367
+ }).join('\n')
368
+ : '';
369
+
370
+ return flatComponent + '\n' + flattenedChildren;
371
+ }
372
+
373
+ /**
374
+ * Delegate to adapter for actual component rendering
375
+ */
376
+ protected renderAdapterComponent(
377
+ type: string,
378
+ properties: Record<string, any>,
379
+ children: string | undefined,
380
+ context: RenderContext
381
+ ): string {
382
+ const adapterComponent = this.adapter.components[type];
383
+ if (!adapterComponent) {
384
+ this.addWarning(`Adapter missing component: ${type}`);
385
+ return `<!-- Missing adapter for: ${type} -->`;
386
+ }
387
+
388
+ return adapterComponent.render({
389
+ properties,
390
+ children
391
+ });
392
+ }
393
+
394
+ // ============================================================================
395
+ // Helper Methods
396
+ // ============================================================================
397
+
398
+ /**
399
+ * Get component name for import/usage
400
+ */
401
+ protected getComponentName(type: string): string {
402
+ const componentDef = ATOMIC_COMPONENTS_REGISTRY[type];
403
+ return componentDef?.name || type.charAt(0).toUpperCase() + type.slice(1);
404
+ }
405
+
406
+ /**
407
+ * Get item variable name for loop rendering
408
+ */
409
+ protected getItemName(dataSource: string): string {
410
+ // Convert "users" -> "user", "items" -> "item"
411
+ if (dataSource.endsWith('s')) {
412
+ return dataSource.slice(0, -1);
413
+ }
414
+ return dataSource + 'Item';
415
+ }
416
+
417
+ /**
418
+ * Get key property for list items
419
+ */
420
+ protected getKeyProperty(component: UIComponent): string {
421
+ return component.properties?.keyProperty || 'id';
422
+ }
423
+
424
+ /**
425
+ * Format properties for inline rendering
426
+ */
427
+ protected formatProps(properties: Record<string, any>): string {
428
+ return Object.entries(properties)
429
+ .map(([key, value]) => {
430
+ if (typeof value === 'string') {
431
+ return `${key}="${value}"`;
432
+ }
433
+ return `${key}={${JSON.stringify(value)}}`;
434
+ })
435
+ .join(' ');
436
+ }
437
+
438
+ /**
439
+ * Add warning message
440
+ */
441
+ protected addWarning(message: string): void {
442
+ if (this.ENABLE_WARNINGS) {
443
+ this.warnings.push(message);
444
+ }
445
+ }
446
+
447
+ /**
448
+ * Reset generator state for new generation
449
+ */
450
+ protected reset(): void {
451
+ this.warnings = [];
452
+ this.imports = new Set();
453
+ }
454
+
455
+ /**
456
+ * Add import statement
457
+ */
458
+ protected addImport(importStatement: string): void {
459
+ this.imports.add(importStatement);
460
+ }
461
+
462
+ // ============================================================================
463
+ // Abstract Methods (Framework-Specific)
464
+ // ============================================================================
465
+
466
+ /**
467
+ * Generate import statements for the framework
468
+ *
469
+ * @param viewSpec - View specification
470
+ * @returns Import statements code
471
+ */
472
+ protected abstract generateImports(viewSpec: ViewSpec): string;
473
+
474
+ /**
475
+ * Generate complete component code with framework-specific structure
476
+ *
477
+ * @param parts - Component parts (imports, state, events, components)
478
+ * @returns Complete component code
479
+ */
480
+ protected abstract generateComponent(parts: {
481
+ name: string;
482
+ imports: string;
483
+ state: string;
484
+ events: string;
485
+ components: string;
486
+ }): string;
487
+
488
+ /**
489
+ * Generate state declarations using framework-specific syntax
490
+ *
491
+ * @param state - State definitions
492
+ * @returns State declaration code
493
+ */
494
+ protected abstract generateState(state: Record<string, StateDefinition>): string;
495
+
496
+ /**
497
+ * Generate event handlers using framework-specific syntax
498
+ *
499
+ * @param events - Event definitions
500
+ * @returns Event handler code
501
+ */
502
+ protected abstract generateEvents(events: Record<string, EventDefinition>): string;
503
+
504
+ /**
505
+ * Get file extension for the framework
506
+ *
507
+ * @returns File extension (e.g., '.tsx', '.vue', '.svelte')
508
+ */
509
+ public abstract getFileExtension(): string;
510
+
511
+ /**
512
+ * Get additional files that need to be generated (e.g., CSS, types)
513
+ *
514
+ * @param viewSpec - View specification
515
+ * @returns Map of filename to content
516
+ */
517
+ public abstract getAdditionalFiles(viewSpec: ViewSpec): Record<string, string>;
518
+ }
519
+
520
+ // ============================================================================
521
+ // Utility Functions
522
+ // ============================================================================
523
+
524
+ /**
525
+ * Validate component nesting depth
526
+ *
527
+ * @param component - Component to validate
528
+ * @param maxDepth - Maximum allowed depth
529
+ * @returns Validation result with depth and issues
530
+ */
531
+ export function validateNestingDepth(
532
+ component: UIComponent,
533
+ maxDepth: number = 3
534
+ ): { valid: boolean; actualDepth: number; issues: string[] } {
535
+ const issues: string[] = [];
536
+
537
+ function calculateDepth(comp: UIComponent, currentDepth: number): number {
538
+ if (!comp.children || comp.children.length === 0) {
539
+ return currentDepth;
540
+ }
541
+
542
+ const childDepths = comp.children.map(child =>
543
+ calculateDepth(child, currentDepth + 1)
544
+ );
545
+
546
+ return Math.max(...childDepths);
547
+ }
548
+
549
+ const actualDepth = calculateDepth(component, 0);
550
+
551
+ if (actualDepth > maxDepth) {
552
+ issues.push(
553
+ `Component nesting depth (${actualDepth}) exceeds maximum (${maxDepth})`
554
+ );
555
+ }
556
+
557
+ return {
558
+ valid: actualDepth <= maxDepth,
559
+ actualDepth,
560
+ issues
561
+ };
562
+ }
563
+
564
+ /**
565
+ * Extract all component types used in a view
566
+ *
567
+ * @param components - Component tree
568
+ * @returns Set of component types
569
+ */
570
+ export function extractComponentTypes(
571
+ components: Record<string, UIComponent>
572
+ ): Set<string> {
573
+ const types = new Set<string>();
574
+
575
+ function walk(component: UIComponent): void {
576
+ types.add(component.type);
577
+ if (component.children) {
578
+ component.children.forEach(walk);
579
+ }
580
+ }
581
+
582
+ Object.values(components).forEach(walk);
583
+
584
+ return types;
585
+ }
586
+
587
+ /**
588
+ * Count total components in a view
589
+ *
590
+ * @param components - Component tree
591
+ * @returns Component count
592
+ */
593
+ export function countComponents(
594
+ components: Record<string, UIComponent>
595
+ ): number {
596
+ let count = 0;
597
+
598
+ function walk(component: UIComponent): void {
599
+ count++;
600
+ if (component.children) {
601
+ component.children.forEach(walk);
602
+ }
603
+ }
604
+
605
+ Object.values(components).forEach(walk);
606
+
607
+ return count;
608
+ }