@lssm/bundle.contractspec-workspace 0.0.0-canary-20251217060834 → 0.0.0-canary-20251217072406

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 (269) hide show
  1. package/dist/_virtual/rolldown_runtime.js +22 -1
  2. package/dist/adapters/ai.js +82 -1
  3. package/dist/adapters/factory.js +36 -1
  4. package/dist/adapters/fs.js +118 -1
  5. package/dist/adapters/git.js +54 -1
  6. package/dist/adapters/index.js +7 -1
  7. package/dist/adapters/logger.js +80 -1
  8. package/dist/adapters/watcher.js +69 -1
  9. package/dist/adapters/workspace.js +190 -2
  10. package/dist/ai/agents/claude-code-agent.js +146 -9
  11. package/dist/ai/agents/cursor-agent.js +286 -17
  12. package/dist/ai/agents/index.js +5 -1
  13. package/dist/ai/agents/openai-codex-agent.js +140 -8
  14. package/dist/ai/agents/orchestrator.js +142 -1
  15. package/dist/ai/agents/simple-agent.js +80 -4
  16. package/dist/ai/client.js +162 -1
  17. package/dist/ai/index.js +27 -1
  18. package/dist/ai/prompts/code-generation.js +55 -13
  19. package/dist/ai/prompts/index.js +12 -1
  20. package/dist/ai/prompts/spec-creation.js +61 -20
  21. package/dist/ai/providers.js +40 -1
  22. package/dist/formatters/index.js +18 -1
  23. package/dist/formatters/json.js +71 -1
  24. package/dist/formatters/sarif.js +163 -1
  25. package/dist/formatters/text.js +208 -2
  26. package/dist/index.d.ts +0 -3
  27. package/dist/index.js +81 -1
  28. package/dist/libs/ai-providers/dist/factory.js +154 -0
  29. package/dist/libs/ai-providers/dist/index.js +4 -0
  30. package/dist/libs/ai-providers/dist/legacy.js +72 -0
  31. package/dist/libs/ai-providers/dist/models.js +287 -0
  32. package/dist/libs/ai-providers/dist/validation.js +1 -0
  33. package/dist/libs/contracts/dist/capabilities/openbanking.js +88 -0
  34. package/dist/libs/contracts/dist/client/index.js +5 -0
  35. package/dist/libs/contracts/dist/client/react/feature-render.js +2 -0
  36. package/dist/libs/contracts/dist/client/react/form-render.js +4 -0
  37. package/dist/libs/contracts/dist/client/react/index.js +4 -0
  38. package/dist/libs/contracts/dist/contract-registry/index.js +1 -0
  39. package/dist/libs/contracts/dist/contract-registry/schemas.js +60 -0
  40. package/dist/libs/contracts/dist/docs/PUBLISHING.docblock.js +16 -0
  41. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +16 -0
  42. package/dist/libs/contracts/dist/docs/index.js +29 -0
  43. package/dist/libs/contracts/dist/docs/presentations.js +71 -0
  44. package/dist/libs/contracts/dist/docs/registry.js +44 -0
  45. package/dist/libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +16 -0
  46. package/dist/libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +16 -0
  47. package/dist/libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +16 -0
  48. package/dist/libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +16 -0
  49. package/dist/libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +16 -0
  50. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +80 -0
  51. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +57 -0
  52. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +16 -0
  53. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js +357 -0
  54. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js +37 -0
  55. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js +16 -0
  56. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js +20 -0
  57. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js +48 -0
  58. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +79 -0
  59. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +84 -0
  60. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +45 -0
  61. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js +67 -0
  62. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +40 -0
  63. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js +69 -0
  64. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +47 -0
  65. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js +62 -0
  66. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js +155 -0
  67. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js +20 -0
  68. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js +101 -0
  69. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js +20 -0
  70. package/dist/libs/contracts/dist/events.js +8 -0
  71. package/dist/libs/contracts/dist/experiments/evaluator.js +1 -0
  72. package/dist/libs/contracts/dist/index.js +72 -0
  73. package/dist/libs/contracts/dist/install.js +2 -0
  74. package/dist/libs/contracts/dist/integrations/contracts.js +377 -0
  75. package/dist/libs/contracts/dist/integrations/index.js +18 -0
  76. package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js +228 -0
  77. package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js +159 -0
  78. package/dist/libs/contracts/dist/integrations/openbanking/contracts/index.js +3 -0
  79. package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js +210 -0
  80. package/dist/libs/contracts/dist/integrations/openbanking/models.js +242 -0
  81. package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js +13 -0
  82. package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js +52 -0
  83. package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js +75 -0
  84. package/dist/libs/contracts/dist/integrations/providers/gmail.js +87 -0
  85. package/dist/libs/contracts/dist/integrations/providers/google-calendar.js +66 -0
  86. package/dist/libs/contracts/dist/integrations/providers/index.js +11 -0
  87. package/dist/libs/contracts/dist/integrations/providers/mistral.js +68 -0
  88. package/dist/libs/contracts/dist/integrations/providers/postmark.js +68 -0
  89. package/dist/libs/contracts/dist/integrations/providers/powens.js +116 -0
  90. package/dist/libs/contracts/dist/integrations/providers/qdrant.js +73 -0
  91. package/dist/libs/contracts/dist/integrations/providers/registry.js +10 -0
  92. package/dist/libs/contracts/dist/integrations/providers/stripe.js +83 -0
  93. package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js +61 -0
  94. package/dist/libs/contracts/dist/jsonschema.js +24 -0
  95. package/dist/libs/contracts/dist/knowledge/contracts.js +306 -0
  96. package/dist/libs/contracts/dist/knowledge/index.js +7 -0
  97. package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js +34 -0
  98. package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js +34 -0
  99. package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js +38 -0
  100. package/dist/libs/contracts/dist/knowledge/spaces/index.js +6 -0
  101. package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js +34 -0
  102. package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js +37 -0
  103. package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js +34 -0
  104. package/dist/libs/contracts/dist/llm/exporters.js +352 -0
  105. package/dist/libs/contracts/dist/llm/index.js +2 -0
  106. package/dist/libs/contracts/dist/llm/prompts.js +211 -0
  107. package/dist/libs/contracts/dist/onboarding-base.js +196 -0
  108. package/dist/libs/contracts/dist/openapi.js +75 -0
  109. package/dist/libs/contracts/dist/ownership.js +21 -0
  110. package/dist/libs/contracts/dist/presentations.js +1 -0
  111. package/dist/libs/contracts/dist/presentations.v2.js +11 -0
  112. package/dist/libs/contracts/dist/prompt.js +1 -0
  113. package/dist/libs/contracts/dist/promptRegistry.js +1 -0
  114. package/dist/libs/contracts/dist/regenerator/index.js +2 -0
  115. package/dist/libs/contracts/dist/regenerator/service.js +92 -0
  116. package/dist/libs/contracts/dist/regenerator/utils.js +51 -0
  117. package/dist/libs/contracts/dist/registry.js +208 -0
  118. package/dist/libs/contracts/dist/resources.js +1 -0
  119. package/dist/libs/contracts/dist/schema/dist/EnumType.js +2 -0
  120. package/dist/libs/contracts/dist/schema/dist/FieldType.js +49 -0
  121. package/dist/libs/contracts/dist/schema/dist/ScalarTypeEnum.js +236 -0
  122. package/dist/libs/contracts/dist/schema/dist/SchemaModel.js +34 -0
  123. package/dist/libs/contracts/dist/schema/dist/entity/defineEntity.js +1 -0
  124. package/dist/libs/contracts/dist/schema/dist/entity/index.js +2 -0
  125. package/dist/libs/contracts/dist/schema/dist/entity/types.js +1 -0
  126. package/dist/libs/contracts/dist/schema/dist/index.js +6 -0
  127. package/dist/libs/contracts/dist/server/graphql-pothos.js +6 -0
  128. package/dist/libs/contracts/dist/server/index.js +8 -0
  129. package/dist/libs/contracts/dist/server/mcp/createMcpServer.js +4 -0
  130. package/dist/libs/contracts/dist/server/mcp/registerPresentations.js +2 -0
  131. package/dist/libs/contracts/dist/server/mcp/registerPrompts.js +1 -0
  132. package/dist/libs/contracts/dist/server/mcp/registerResources.js +2 -0
  133. package/dist/libs/contracts/dist/server/mcp/registerTools.js +1 -0
  134. package/dist/libs/contracts/dist/server/provider-mcp.js +1 -0
  135. package/dist/libs/contracts/dist/server/rest-elysia.js +1 -0
  136. package/dist/libs/contracts/dist/server/rest-express.js +1 -0
  137. package/dist/libs/contracts/dist/server/rest-generic.js +1 -0
  138. package/dist/libs/contracts/dist/server/rest-next-app.js +1 -0
  139. package/dist/libs/contracts/dist/server/rest-next-pages.js +1 -0
  140. package/dist/libs/contracts/dist/spec.js +35 -0
  141. package/dist/libs/contracts/dist/telemetry/index.js +1 -0
  142. package/dist/libs/contracts/dist/telemetry/tracker.js +1 -0
  143. package/dist/libs/contracts/dist/tests/index.js +1 -0
  144. package/dist/libs/contracts/dist/tests/runner.js +150 -0
  145. package/dist/libs/contracts/dist/workflow/index.js +1 -0
  146. package/dist/libs/contracts/dist/workflow/runner.js +1 -0
  147. package/dist/libs/contracts-transformers/dist/common/utils.js +47 -0
  148. package/dist/libs/contracts-transformers/dist/openapi/exporter.js +1 -0
  149. package/dist/libs/contracts-transformers/dist/openapi/importer.js +255 -0
  150. package/dist/libs/contracts-transformers/dist/openapi/index.js +4 -0
  151. package/dist/libs/contracts-transformers/dist/openapi/parser.js +231 -0
  152. package/dist/libs/contracts-transformers/dist/openapi/schema-converter.js +201 -0
  153. package/dist/modules/contractspec-workspace/dist/ai/code-generation.js +137 -0
  154. package/dist/modules/contractspec-workspace/dist/ai/spec-creation.js +101 -0
  155. package/dist/modules/contractspec-workspace/dist/analysis/deps/graph.js +84 -0
  156. package/dist/modules/contractspec-workspace/dist/analysis/deps/parse-imports.js +30 -0
  157. package/dist/modules/contractspec-workspace/dist/analysis/diff/semantic.js +96 -0
  158. package/dist/modules/contractspec-workspace/dist/analysis/feature-scan.js +151 -0
  159. package/dist/modules/contractspec-workspace/dist/analysis/spec-scan.js +344 -0
  160. package/dist/modules/contractspec-workspace/dist/analysis/validate/spec-structure.js +122 -0
  161. package/dist/modules/contractspec-workspace/dist/templates/app-config.js +105 -0
  162. package/dist/modules/contractspec-workspace/dist/templates/data-view.js +68 -0
  163. package/dist/modules/contractspec-workspace/dist/templates/event.js +38 -0
  164. package/dist/modules/contractspec-workspace/dist/templates/experiment.js +87 -0
  165. package/dist/modules/contractspec-workspace/dist/templates/handler.js +95 -0
  166. package/dist/modules/contractspec-workspace/dist/templates/integration-utils.js +104 -0
  167. package/dist/modules/contractspec-workspace/dist/templates/integration.js +62 -0
  168. package/dist/modules/contractspec-workspace/dist/templates/knowledge.js +68 -0
  169. package/dist/modules/contractspec-workspace/dist/templates/migration.js +60 -0
  170. package/dist/modules/contractspec-workspace/dist/templates/operation.js +100 -0
  171. package/dist/modules/contractspec-workspace/dist/templates/presentation.js +78 -0
  172. package/dist/modules/contractspec-workspace/dist/templates/telemetry.js +89 -0
  173. package/dist/modules/contractspec-workspace/dist/templates/utils.js +38 -0
  174. package/dist/modules/contractspec-workspace/dist/templates/workflow-runner.js +48 -0
  175. package/dist/modules/contractspec-workspace/dist/templates/workflow.js +67 -0
  176. package/dist/modules/contractspec-workspace/dist/types/generation-types.js +20 -0
  177. package/dist/services/agent-guide/adapters/claude-code.js +144 -3
  178. package/dist/services/agent-guide/adapters/cursor-cli.js +135 -3
  179. package/dist/services/agent-guide/adapters/generic-mcp.js +159 -3
  180. package/dist/services/agent-guide/adapters/index.js +30 -1
  181. package/dist/services/agent-guide/agent-guide-service.js +148 -1
  182. package/dist/services/agent-guide/index.js +5 -1
  183. package/dist/services/build.js +140 -1
  184. package/dist/services/ci-check/ci-check-service.js +393 -1
  185. package/dist/services/ci-check/index.js +2 -1
  186. package/dist/services/ci-check/types.js +28 -1
  187. package/dist/services/clean.js +71 -1
  188. package/dist/services/config.js +76 -1
  189. package/dist/services/deps.js +62 -1
  190. package/dist/services/diff.js +33 -1
  191. package/dist/services/doctor/checks/ai.js +118 -2
  192. package/dist/services/doctor/checks/cli.js +146 -1
  193. package/dist/services/doctor/checks/config.js +170 -1
  194. package/dist/services/doctor/checks/deps.js +180 -1
  195. package/dist/services/doctor/checks/index.js +6 -1
  196. package/dist/services/doctor/checks/mcp.js +144 -1
  197. package/dist/services/doctor/checks/workspace.js +243 -1
  198. package/dist/services/doctor/doctor-service.js +115 -2
  199. package/dist/services/doctor/index.js +2 -1
  200. package/dist/services/doctor/types.js +26 -1
  201. package/dist/services/implementation/discovery.js +143 -2
  202. package/dist/services/implementation/index.js +2 -1
  203. package/dist/services/implementation/resolver.js +223 -1
  204. package/dist/services/index.js +53 -1
  205. package/dist/services/integrity-diagram.js +274 -6
  206. package/dist/services/integrity.js +272 -1
  207. package/dist/services/list.js +35 -1
  208. package/dist/services/openapi/export-service.js +51 -2
  209. package/dist/services/openapi/import-service.js +75 -1
  210. package/dist/services/openapi/index.js +4 -1
  211. package/dist/services/openapi/sync-service.js +121 -1
  212. package/dist/services/openapi/validate-service.js +130 -1
  213. package/dist/services/regenerator.js +23 -1
  214. package/dist/services/registry.js +73 -1
  215. package/dist/services/setup/config-generators.js +113 -26
  216. package/dist/services/setup/file-merger.js +60 -2
  217. package/dist/services/setup/index.js +4 -1
  218. package/dist/services/setup/setup-service.js +95 -1
  219. package/dist/services/setup/targets/agents-md.js +46 -1
  220. package/dist/services/setup/targets/cli-config.js +59 -1
  221. package/dist/services/setup/targets/cursor-rules.js +47 -1
  222. package/dist/services/setup/targets/mcp-claude.js +59 -1
  223. package/dist/services/setup/targets/mcp-cursor.js +58 -1
  224. package/dist/services/setup/targets/vscode-settings.js +62 -1
  225. package/dist/services/setup/types.js +26 -1
  226. package/dist/services/sync.js +62 -1
  227. package/dist/services/test.js +30 -1
  228. package/dist/services/validate-implementation.js +69 -1
  229. package/dist/services/validate.js +47 -1
  230. package/dist/services/verification-cache/adapters/filesystem.js +121 -1
  231. package/dist/services/verification-cache/adapters/in-memory.js +45 -1
  232. package/dist/services/verification-cache/adapters/index.js +3 -1
  233. package/dist/services/verification-cache/adapters/workspace-state.js +90 -1
  234. package/dist/services/verification-cache/cache-service.js +255 -1
  235. package/dist/services/verification-cache/index.js +6 -1
  236. package/dist/services/verification-cache/types.js +15 -1
  237. package/dist/services/verify/ai-verifier.js +336 -9
  238. package/dist/services/verify/behavior-verifier.js +185 -1
  239. package/dist/services/verify/index.js +4 -1
  240. package/dist/services/verify/structure-verifier.js +195 -2
  241. package/dist/services/verify/verify-service.js +203 -3
  242. package/dist/services/watch.js +31 -1
  243. package/dist/services/workspace-info.js +102 -2
  244. package/dist/templates/app-config.template.js +101 -28
  245. package/dist/templates/data-view.template.js +42 -27
  246. package/dist/templates/event.template.js +29 -14
  247. package/dist/templates/experiment.template.js +77 -51
  248. package/dist/templates/handler.template.js +53 -17
  249. package/dist/templates/index.js +36 -1
  250. package/dist/templates/integration.template.js +134 -50
  251. package/dist/templates/knowledge.template.js +62 -21
  252. package/dist/templates/migration.template.js +50 -26
  253. package/dist/templates/operation.template.js +44 -28
  254. package/dist/templates/presentation.template.js +46 -20
  255. package/dist/templates/telemetry.template.js +74 -53
  256. package/dist/templates/workflow-runner.template.js +12 -6
  257. package/dist/templates/workflow.template.js +51 -24
  258. package/package.json +13 -9
  259. package/dist/adapters/index.d.ts +0 -7
  260. package/dist/ports/index.d.ts +0 -5
  261. package/dist/services/agent-guide/index.d.ts +0 -6
  262. package/dist/services/ci-check/index.d.ts +0 -2
  263. package/dist/services/doctor/index.d.ts +0 -2
  264. package/dist/services/implementation/index.d.ts +0 -3
  265. package/dist/services/index.d.ts +0 -56
  266. package/dist/services/openapi/index.d.ts +0 -5
  267. package/dist/services/verification-cache/adapters/index.d.ts +0 -3
  268. package/dist/services/verification-cache/index.d.ts +0 -6
  269. package/dist/services/verify/index.d.ts +0 -5
@@ -1,33 +1,106 @@
1
- function e(e){let u=f(e.name.split(`.`).pop()??`App`)+`AppConfig`,d=t(e),m=n(e),h=r(`dataViews`,e.dataViews),g=r(`workflows`,e.workflows),_=i(e),v=a(e),y=o(e),b=s(e),x=c(e),S=l(e),C=e.notes?` notes: '${p(e.notes)}',\n`:``;return`import type { AppBlueprintSpec } from '@lssm/lib.contracts/app-config';
1
+ //#region src/templates/app-config.template.ts
2
+ function generateAppBlueprintSpec(data) {
3
+ const exportName = toPascalCase(data.name.split(".").pop() ?? "App") + "AppConfig";
4
+ const capabilitiesSection = buildCapabilitiesSection(data);
5
+ const featuresSection = buildFeaturesSection(data);
6
+ const dataViewsSection = buildMappingSection("dataViews", data.dataViews);
7
+ const workflowsSection = buildMappingSection("workflows", data.workflows);
8
+ const policiesSection = buildPolicySection(data);
9
+ const themeSection = buildThemeSection(data);
10
+ const telemetrySection = buildTelemetrySection(data);
11
+ const experimentsSection = buildExperimentsSection(data);
12
+ const flagsSection = buildFeatureFlagsSection(data);
13
+ const routesSection = buildRoutesSection(data);
14
+ const notesSection = data.notes ? ` notes: '${escapeString(data.notes)}',\n` : "";
15
+ return `import type { AppBlueprintSpec } from '@lssm/lib.contracts/app-config';
2
16
 
3
- export const ${u}: AppBlueprintSpec = {
17
+ export const ${exportName}: AppBlueprintSpec = {
4
18
  meta: {
5
- name: '${p(e.name)}',
6
- version: ${e.version},
7
- title: '${p(e.title)}',
8
- description: '${p(e.description)}',
9
- domain: '${p(e.domain)}',
10
- owners: [${e.owners.map(e=>`'${p(e)}'`).join(`, `)}],
11
- tags: [${e.tags.map(e=>`'${p(e)}'`).join(`, `)}],
12
- stability: '${e.stability}',
13
- appId: '${p(e.appId)}',
19
+ name: '${escapeString(data.name)}',
20
+ version: ${data.version},
21
+ title: '${escapeString(data.title)}',
22
+ description: '${escapeString(data.description)}',
23
+ domain: '${escapeString(data.domain)}',
24
+ owners: [${data.owners.map((owner) => `'${escapeString(owner)}'`).join(", ")}],
25
+ tags: [${data.tags.map((tag) => `'${escapeString(tag)}'`).join(", ")}],
26
+ stability: '${data.stability}',
27
+ appId: '${escapeString(data.appId)}',
14
28
  },
15
- ${d}${m}${h}${g}${_}${v}${y}${b}${x}${S}${C}};\n`}function t(e){return e.capabilitiesEnabled.length===0&&e.capabilitiesDisabled.length===0?``:` capabilities: {\n${e.capabilitiesEnabled.length>0?` enabled: [${e.capabilitiesEnabled.map(e=>u(e)).join(`, `)}],\n`:``}${e.capabilitiesDisabled.length>0?` disabled: [${e.capabilitiesDisabled.map(e=>u(e)).join(`, `)}],\n`:``} },\n`}function n(e){return e.featureIncludes.length===0&&e.featureExcludes.length===0?``:` features: {\n${e.featureIncludes.length>0?` include: [${e.featureIncludes.map(e=>`{ key: '${p(e)}' }`).join(`, `)}],\n`:``}${e.featureExcludes.length>0?` exclude: [${e.featureExcludes.map(e=>`{ key: '${p(e)}' }`).join(`, `)}],\n`:``} },\n`}function r(e,t){return t.length===0?``:` ${e}: {\n${t.map(e=>` ${e.slot}: {
16
- name: '${p(e.name)}',
17
- ${typeof e.version==`number`?`version: ${e.version},`:``}
18
- }`).join(`,
19
- `)}\n },\n`}function i(e){return e.policyRefs.length===0?``:` policies: [\n${e.policyRefs.map(e=>` {
20
- name: '${p(e.name)}'${typeof e.version==`number`?`,\n version: ${e.version}`:``}
21
- }`).join(`,
22
- `)}\n ],\n`}function a(e){return e.theme?` theme: {\n${` primary: { name: '${p(e.theme.name)}', version: ${e.theme.version} },\n`}${e.themeFallbacks.length>0?` fallbacks: [${e.themeFallbacks.map(e=>`{ name: '${p(e.name)}', version: ${e.version} }`).join(`, `)}],\n`:``} },\n`:``}function o(e){return e.telemetry?` telemetry: {
29
+ ${capabilitiesSection}${featuresSection}${dataViewsSection}${workflowsSection}${policiesSection}${themeSection}${telemetrySection}${experimentsSection}${flagsSection}${routesSection}${notesSection}};\n`;
30
+ }
31
+ function buildCapabilitiesSection(data) {
32
+ if (data.capabilitiesEnabled.length === 0 && data.capabilitiesDisabled.length === 0) return "";
33
+ return ` capabilities: {\n${data.capabilitiesEnabled.length > 0 ? ` enabled: [${data.capabilitiesEnabled.map((key) => formatCapabilityRef(key)).join(", ")}],\n` : ""}${data.capabilitiesDisabled.length > 0 ? ` disabled: [${data.capabilitiesDisabled.map((key) => formatCapabilityRef(key)).join(", ")}],\n` : ""} },\n`;
34
+ }
35
+ function buildFeaturesSection(data) {
36
+ if (data.featureIncludes.length === 0 && data.featureExcludes.length === 0) return "";
37
+ return ` features: {\n${data.featureIncludes.length > 0 ? ` include: [${data.featureIncludes.map((key) => `{ key: '${escapeString(key)}' }`).join(", ")}],\n` : ""}${data.featureExcludes.length > 0 ? ` exclude: [${data.featureExcludes.map((key) => `{ key: '${escapeString(key)}' }`).join(", ")}],\n` : ""} },\n`;
38
+ }
39
+ function buildMappingSection(prop, mappings) {
40
+ if (mappings.length === 0) return "";
41
+ return ` ${prop}: {\n${mappings.map((mapping) => ` ${mapping.slot}: {
42
+ name: '${escapeString(mapping.name)}',
43
+ ${typeof mapping.version === "number" ? `version: ${mapping.version},` : ""}
44
+ }`).join(",\n")}\n },\n`;
45
+ }
46
+ function buildPolicySection(data) {
47
+ if (data.policyRefs.length === 0) return "";
48
+ return ` policies: [\n${data.policyRefs.map((policy) => ` {
49
+ name: '${escapeString(policy.name)}'${typeof policy.version === "number" ? `,\n version: ${policy.version}` : ""}
50
+ }`).join(",\n")}\n ],\n`;
51
+ }
52
+ function buildThemeSection(data) {
53
+ if (!data.theme) return "";
54
+ return ` theme: {\n${` primary: { name: '${escapeString(data.theme.name)}', version: ${data.theme.version} },\n`}${data.themeFallbacks.length > 0 ? ` fallbacks: [${data.themeFallbacks.map((theme) => `{ name: '${escapeString(theme.name)}', version: ${theme.version} }`).join(", ")}],\n` : ""} },\n`;
55
+ }
56
+ function buildTelemetrySection(data) {
57
+ if (!data.telemetry) return "";
58
+ return ` telemetry: {
23
59
  spec: {
24
- name: '${p(e.telemetry.name)}'${typeof e.telemetry.version==`number`?`,\n version: ${e.telemetry.version}`:``}
60
+ name: '${escapeString(data.telemetry.name)}'${typeof data.telemetry.version === "number" ? `,\n version: ${data.telemetry.version}` : ""}
25
61
  },
26
- },\n`:``}function s(e){return e.activeExperiments.length===0&&e.pausedExperiments.length===0?``:` experiments: {\n${e.activeExperiments.length>0?` active: [${e.activeExperiments.map(e=>d(e)).join(`, `)}],\n`:``}${e.pausedExperiments.length>0?` paused: [${e.pausedExperiments.map(e=>d(e)).join(`, `)}],\n`:``} },\n`}function c(e){return e.featureFlags.length===0?``:` featureFlags: [\n${e.featureFlags.map(e=>` {
27
- key: '${p(e.key)}',
28
- enabled: ${e.enabled},
29
- ${e.variant?`variant: '${p(e.variant)}',`:``}
30
- ${e.description?`description: '${p(e.description)}',`:``}
31
- }`).join(`,
32
- `)}\n ],\n`}function l(e){return e.routes.length===0?``:` routes: [\n${e.routes.map(e=>` { ${[`path: '${p(e.path)}'`,e.label?`label: '${p(e.label)}'`:null,e.dataView?`dataView: '${p(e.dataView)}'`:null,e.workflow?`workflow: '${p(e.workflow)}'`:null,e.guardName?`guard: { name: '${p(e.guardName)}'${typeof e.guardVersion==`number`?`, version: ${e.guardVersion}`:``} }`:null,e.featureFlag?`featureFlag: '${p(e.featureFlag)}'`:null,e.experimentName?`experiment: { name: '${p(e.experimentName)}'${typeof e.experimentVersion==`number`?`, version: ${e.experimentVersion}`:``} }`:null].filter(Boolean).join(`, `)} }`).join(`,
33
- `)}\n ],\n`}function u(e){return`{ key: '${p(e)}' }`}function d(e){let t=typeof e.version==`number`?`, version: ${e.version}`:``;return`{ name: '${p(e.name)}'${t} }`}function f(e){return e.split(/[-_.]/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}function p(e){return e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`)}export{e as generateAppBlueprintSpec};
62
+ },\n`;
63
+ }
64
+ function buildExperimentsSection(data) {
65
+ if (data.activeExperiments.length === 0 && data.pausedExperiments.length === 0) return "";
66
+ return ` experiments: {\n${data.activeExperiments.length > 0 ? ` active: [${data.activeExperiments.map((exp) => formatExperimentRef(exp)).join(", ")}],\n` : ""}${data.pausedExperiments.length > 0 ? ` paused: [${data.pausedExperiments.map((exp) => formatExperimentRef(exp)).join(", ")}],\n` : ""} },\n`;
67
+ }
68
+ function buildFeatureFlagsSection(data) {
69
+ if (data.featureFlags.length === 0) return "";
70
+ return ` featureFlags: [\n${data.featureFlags.map((flag) => ` {
71
+ key: '${escapeString(flag.key)}',
72
+ enabled: ${flag.enabled},
73
+ ${flag.variant ? `variant: '${escapeString(flag.variant)}',` : ""}
74
+ ${flag.description ? `description: '${escapeString(flag.description)}',` : ""}
75
+ }`).join(",\n")}\n ],\n`;
76
+ }
77
+ function buildRoutesSection(data) {
78
+ if (data.routes.length === 0) return "";
79
+ return ` routes: [\n${data.routes.map((route) => {
80
+ return ` { ${[
81
+ `path: '${escapeString(route.path)}'`,
82
+ route.label ? `label: '${escapeString(route.label)}'` : null,
83
+ route.dataView ? `dataView: '${escapeString(route.dataView)}'` : null,
84
+ route.workflow ? `workflow: '${escapeString(route.workflow)}'` : null,
85
+ route.guardName ? `guard: { name: '${escapeString(route.guardName)}'${typeof route.guardVersion === "number" ? `, version: ${route.guardVersion}` : ""} }` : null,
86
+ route.featureFlag ? `featureFlag: '${escapeString(route.featureFlag)}'` : null,
87
+ route.experimentName ? `experiment: { name: '${escapeString(route.experimentName)}'${typeof route.experimentVersion === "number" ? `, version: ${route.experimentVersion}` : ""} }` : null
88
+ ].filter(Boolean).join(", ")} }`;
89
+ }).join(",\n")}\n ],\n`;
90
+ }
91
+ function formatCapabilityRef(key) {
92
+ return `{ key: '${escapeString(key)}' }`;
93
+ }
94
+ function formatExperimentRef(exp) {
95
+ const version = typeof exp.version === "number" ? `, version: ${exp.version}` : "";
96
+ return `{ name: '${escapeString(exp.name)}'${version} }`;
97
+ }
98
+ function toPascalCase(value) {
99
+ return value.split(/[-_.]/).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
100
+ }
101
+ function escapeString(value) {
102
+ return value.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
103
+ }
104
+
105
+ //#endregion
106
+ export { generateAppBlueprintSpec };
@@ -1,42 +1,47 @@
1
- function e(e){let r=t(e.name.split(`.`).pop()??`DataView`)+`DataView`,i=e.fields.map(e=>` {
2
- key: '${e.key}',
3
- label: '${n(e.label)}',
4
- dataPath: '${e.dataPath}',
5
- ${e.format?`format: '${e.format}',`:``}
6
- ${e.sortable?`sortable: true,`:``}
7
- ${e.filterable?`filterable: true,`:``}
8
- }`).join(`,
9
- `),a=e.secondaryFields?.length?`secondaryFields: [${e.secondaryFields.map(e=>`'${e}'`).join(`, `)}],`:``,o=e.itemOperation?`item: { name: '${e.itemOperation.name}', version: ${e.itemOperation.version} },`:``;return`import type { DataViewSpec } from '@lssm/lib.contracts/data-views';
1
+ //#region src/templates/data-view.template.ts
2
+ function generateDataViewSpec(data) {
3
+ const viewVarName = toPascalCase(data.name.split(".").pop() ?? "DataView") + "DataView";
4
+ const fields = data.fields.map((field) => ` {
5
+ key: '${field.key}',
6
+ label: '${escape(field.label)}',
7
+ dataPath: '${field.dataPath}',
8
+ ${field.format ? `format: '${field.format}',` : ""}
9
+ ${field.sortable ? "sortable: true," : ""}
10
+ ${field.filterable ? "filterable: true," : ""}
11
+ }`).join(",\n");
12
+ const secondaryFields = data.secondaryFields?.length ? `secondaryFields: [${data.secondaryFields.map((key) => `'${key}'`).join(", ")}],` : "";
13
+ const itemOperation = data.itemOperation ? `item: { name: '${data.itemOperation.name}', version: ${data.itemOperation.version} },` : "";
14
+ return `import type { DataViewSpec } from '@lssm/lib.contracts/data-views';
10
15
 
11
- export const ${r}: DataViewSpec = {
16
+ export const ${viewVarName}: DataViewSpec = {
12
17
  meta: {
13
- name: '${e.name}',
14
- version: ${e.version},
15
- entity: '${e.entity}',
16
- title: '${n(e.title)}',
17
- description: '${n(e.description||`Describe the purpose of this data view.`)}',
18
- domain: '${n(e.domain||e.entity)}',
19
- owners: [${e.owners.map(e=>`'${e}'`).join(`, `)}],
20
- tags: [${e.tags.map(e=>`'${e}'`).join(`, `)}],
21
- stability: '${e.stability}',
18
+ name: '${data.name}',
19
+ version: ${data.version},
20
+ entity: '${data.entity}',
21
+ title: '${escape(data.title)}',
22
+ description: '${escape(data.description || "Describe the purpose of this data view.")}',
23
+ domain: '${escape(data.domain || data.entity)}',
24
+ owners: [${data.owners.map((owner) => `'${owner}'`).join(", ")}],
25
+ tags: [${data.tags.map((tag) => `'${tag}'`).join(", ")}],
26
+ stability: '${data.stability}',
22
27
  },
23
28
  source: {
24
29
  primary: {
25
- name: '${e.primaryOperation.name}',
26
- version: ${e.primaryOperation.version},
30
+ name: '${data.primaryOperation.name}',
31
+ version: ${data.primaryOperation.version},
27
32
  },
28
- ${o}
33
+ ${itemOperation}
29
34
  refreshEvents: [
30
35
  // { name: 'entity.updated', version: 1 },
31
36
  ],
32
37
  },
33
38
  view: {
34
- kind: '${e.kind}',
39
+ kind: '${data.kind}',
35
40
  fields: [
36
- ${i}
41
+ ${fields}
37
42
  ],
38
- ${e.primaryField?`primaryField: '${e.primaryField}',`:``}
39
- ${a}
43
+ ${data.primaryField ? `primaryField: '${data.primaryField}',` : ""}
44
+ ${secondaryFields}
40
45
  filters: [
41
46
  // Example filter:
42
47
  // { key: 'search', label: 'Search', field: 'fullName', type: 'search' },
@@ -51,4 +56,14 @@ ${i}
51
56
  // error: { name: 'app.data.error', version: 1 },
52
57
  },
53
58
  };
54
- `}function t(e){return e.split(/[-_.]/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}function n(e){return e.replace(/'/g,`\\'`)}export{e as generateDataViewSpec};
59
+ `;
60
+ }
61
+ function toPascalCase(value) {
62
+ return value.split(/[-_.]/).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
63
+ }
64
+ function escape(value) {
65
+ return value.replace(/'/g, "\\'");
66
+ }
67
+
68
+ //#endregion
69
+ export { generateDataViewSpec };
@@ -1,24 +1,39 @@
1
- function e(e){let{name:n,version:r,description:i,stability:a,owners:o,tags:s,piiFields:c}=e,l=t(n.replace(/\./g,`_`))+`V`+r,u=l+`Payload`;return`import { defineEvent } from '@lssm/lib.contracts';
1
+ //#region src/templates/event.template.ts
2
+ /**
3
+ * Generate event spec TypeScript code
4
+ */
5
+ function generateEventSpec(data) {
6
+ const { name, version, description, stability, owners, tags, piiFields } = data;
7
+ const eventVarName = toPascalCase(name.replace(/\./g, "_")) + "V" + version;
8
+ const payloadSchemaName = eventVarName + "Payload";
9
+ return `import { defineEvent } from '@lssm/lib.contracts';
2
10
  import { ScalarTypeEnum, SchemaModel } from '@lssm/lib.schema';
3
11
 
4
12
  // TODO: Define event payload schema
5
- export const ${u} = new SchemaModel({
6
- name: '${u}',
7
- description: 'Payload for ${n}',
13
+ export const ${payloadSchemaName} = new SchemaModel({
14
+ name: '${payloadSchemaName}',
15
+ description: 'Payload for ${name}',
8
16
  fields: {
9
17
  // Add your payload fields here
10
18
  // example: { type: ScalarTypeEnum.String_unsecure(), isOptional: false },
11
19
  },
12
20
  });
13
21
 
14
- export const ${l} = defineEvent({
15
- name: '${n}',
16
- version: ${r},
17
- description: '${i}',
18
- stability: '${a}',
19
- owners: [${o.map(e=>`'${e}'`).join(`, `)}],
20
- tags: [${s.map(e=>`'${e}'`).join(`, `)}],
21
- ${c.length>0?`pii: [${c.map(e=>`'${e}'`).join(`, `)}],`:`// pii: [],`}
22
- payload: ${u},
22
+ export const ${eventVarName} = defineEvent({
23
+ name: '${name}',
24
+ version: ${version},
25
+ description: '${description}',
26
+ stability: '${stability}',
27
+ owners: [${owners.map((o) => `'${o}'`).join(", ")}],
28
+ tags: [${tags.map((t) => `'${t}'`).join(", ")}],
29
+ ${piiFields.length > 0 ? `pii: [${piiFields.map((f) => `'${f}'`).join(", ")}],` : "// pii: [],"}
30
+ payload: ${payloadSchemaName},
23
31
  });
24
- `}function t(e){return e.split(/[-_.]/).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}export{e as generateEventSpec};
32
+ `;
33
+ }
34
+ function toPascalCase(str) {
35
+ return str.split(/[-_.]/).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("");
36
+ }
37
+
38
+ //#endregion
39
+ export { generateEventSpec };
@@ -1,62 +1,88 @@
1
- function e(e){let i=n(e.name.split(`.`).pop()??`Experiment`)+`Experiment`,a=e.variants.map(e=>{let t=e.overrides?.length?` overrides: [
2
- ${e.overrides.map(e=>` {
3
- type: '${e.type}',
4
- target: '${r(e.target)}',
5
- ${typeof e.version==`number`?`version: ${e.version},`:``}
6
- }`).join(`,
7
- `)}
8
- ],`:``;return` {
9
- id: '${r(e.id)}',
10
- name: '${r(e.name)}',
11
- ${e.description?`description: '${r(e.description)}',`:``}
12
- ${typeof e.weight==`number`?`weight: ${e.weight},`:``}
13
- ${t}
14
- }`}).join(`,
15
- `),o=t(e.allocation),s=e.successMetrics?.length?` successMetrics: [
16
- ${e.successMetrics.map(e=>` {
17
- name: '${r(e.name)}',
18
- telemetryEvent: { name: '${r(e.eventName)}', version: ${e.eventVersion} },
19
- aggregation: '${e.aggregation}',
20
- ${typeof e.target==`number`?`target: ${e.target},`:``}
21
- }`).join(`,
22
- `)}
23
- ],`:``;return`import type { ExperimentSpec } from '@lssm/lib.contracts/experiments';
1
+ //#region src/templates/experiment.template.ts
2
+ function generateExperimentSpec(data) {
3
+ const specVar = toPascalCase(data.name.split(".").pop() ?? "Experiment") + "Experiment";
4
+ const variants = data.variants.map((variant) => {
5
+ const overrides = variant.overrides?.length ? ` overrides: [
6
+ ${variant.overrides.map((override) => ` {
7
+ type: '${override.type}',
8
+ target: '${escapeString(override.target)}',
9
+ ${typeof override.version === "number" ? `version: ${override.version},` : ""}
10
+ }`).join(",\n")}
11
+ ],` : "";
12
+ return ` {
13
+ id: '${escapeString(variant.id)}',
14
+ name: '${escapeString(variant.name)}',
15
+ ${variant.description ? `description: '${escapeString(variant.description)}',` : ""}
16
+ ${typeof variant.weight === "number" ? `weight: ${variant.weight},` : ""}
17
+ ${overrides}
18
+ }`;
19
+ }).join(",\n");
20
+ const allocation = renderAllocation(data.allocation);
21
+ const metrics = data.successMetrics?.length ? ` successMetrics: [
22
+ ${data.successMetrics.map((metric) => ` {
23
+ name: '${escapeString(metric.name)}',
24
+ telemetryEvent: { name: '${escapeString(metric.eventName)}', version: ${metric.eventVersion} },
25
+ aggregation: '${metric.aggregation}',
26
+ ${typeof metric.target === "number" ? `target: ${metric.target},` : ""}
27
+ }`).join(",\n")}
28
+ ],` : "";
29
+ return `import type { ExperimentSpec } from '@lssm/lib.contracts/experiments';
24
30
 
25
- export const ${i}: ExperimentSpec = {
31
+ export const ${specVar}: ExperimentSpec = {
26
32
  meta: {
27
- name: '${r(e.name)}',
28
- version: ${e.version},
29
- title: '${r(e.name)} experiment',
30
- description: '${r(e.description||`Describe the experiment goal.`)}',
31
- domain: '${r(e.domain)}',
32
- owners: [${e.owners.map(e=>`'${r(e)}'`).join(`, `)}],
33
- tags: [${e.tags.map(e=>`'${r(e)}'`).join(`, `)}],
34
- stability: '${e.stability}',
33
+ name: '${escapeString(data.name)}',
34
+ version: ${data.version},
35
+ title: '${escapeString(data.name)} experiment',
36
+ description: '${escapeString(data.description || "Describe the experiment goal.")}',
37
+ domain: '${escapeString(data.domain)}',
38
+ owners: [${data.owners.map((owner) => `'${escapeString(owner)}'`).join(", ")}],
39
+ tags: [${data.tags.map((tag) => `'${escapeString(tag)}'`).join(", ")}],
40
+ stability: '${data.stability}',
35
41
  },
36
- controlVariant: '${r(e.controlVariant)}',
42
+ controlVariant: '${escapeString(data.controlVariant)}',
37
43
  variants: [
38
- ${a}
44
+ ${variants}
39
45
  ],
40
- allocation: ${o},
41
- ${s}
46
+ allocation: ${allocation},
47
+ ${metrics}
42
48
  };
43
- `}function t(e){switch(e.type){case`random`:return`{
49
+ `;
50
+ }
51
+ function renderAllocation(allocation) {
52
+ switch (allocation.type) {
53
+ case "random": return `{
44
54
  type: 'random',
45
- ${e.salt?`salt: '${r(e.salt)}',`:``}
46
- }`;case`sticky`:return`{
55
+ ${allocation.salt ? `salt: '${escapeString(allocation.salt)}',` : ""}
56
+ }`;
57
+ case "sticky": return `{
47
58
  type: 'sticky',
48
- attribute: '${e.attribute}',
49
- ${e.salt?`salt: '${r(e.salt)}',`:``}
50
- }`;case`targeted`:return`{
59
+ attribute: '${allocation.attribute}',
60
+ ${allocation.salt ? `salt: '${escapeString(allocation.salt)}',` : ""}
61
+ }`;
62
+ case "targeted": return `{
51
63
  type: 'targeted',
52
64
  rules: [
53
- ${e.rules.map(e=>` {
54
- variantId: '${r(e.variantId)}',
55
- ${typeof e.percentage==`number`?`percentage: ${e.percentage},`:``}
56
- ${e.policy?`policy: { name: '${r(e.policy.name)}'${typeof e.policy.version==`number`?`, version: ${e.policy.version}`:``} },`:``}
57
- ${e.expression?`expression: '${r(e.expression)}',`:``}
58
- }`).join(`,
59
- `)}
65
+ ${allocation.rules.map((rule) => ` {
66
+ variantId: '${escapeString(rule.variantId)}',
67
+ ${typeof rule.percentage === "number" ? `percentage: ${rule.percentage},` : ""}
68
+ ${rule.policy ? `policy: { name: '${escapeString(rule.policy.name)}'${typeof rule.policy.version === "number" ? `, version: ${rule.policy.version}` : ""} },` : ""}
69
+ ${rule.expression ? `expression: '${escapeString(rule.expression)}',` : ""}
70
+ }`).join(",\n")}
60
71
  ],
61
- fallback: '${e.fallback??`control`}',
62
- }`;default:return i(e)}}function n(e){return e.split(/[-_.]/).filter(Boolean).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}function r(e){return e.replace(/\\/g,`\\\\`).replace(/'/g,`\\'`)}function i(e){throw Error(`Unsupported allocation type ${e}`)}export{e as generateExperimentSpec};
72
+ fallback: '${allocation.fallback ?? "control"}',
73
+ }`;
74
+ default: return renderUnsupportedAllocation(allocation);
75
+ }
76
+ }
77
+ function toPascalCase(value) {
78
+ return value.split(/[-_.]/).filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join("");
79
+ }
80
+ function escapeString(value) {
81
+ return value.replace(/\\/g, "\\\\").replace(/'/g, "\\'");
82
+ }
83
+ function renderUnsupportedAllocation(allocation) {
84
+ throw new Error(`Unsupported allocation type ${allocation}`);
85
+ }
86
+
87
+ //#endregion
88
+ export { generateExperimentSpec };
@@ -1,14 +1,21 @@
1
- function e(e,t){let n=r(e.split(`.`).pop()||`unknown`)+`Handler`,o=i(e.split(`.`).pop()||`Unknown`)+`Spec`;return`import type { ContractHandler } from '@lssm/lib.contracts';
2
- import { ${o} } from '../contracts/${a(e)}.contracts';
1
+ //#region src/templates/handler.template.ts
2
+ /**
3
+ * Generate handler implementation template
4
+ */
5
+ function generateHandlerTemplate(specName, kind) {
6
+ const handlerName = toCamelCase(specName.split(".").pop() || "unknown") + "Handler";
7
+ const specVarName = toPascalCase(specName.split(".").pop() || "Unknown") + "Spec";
8
+ return `import type { ContractHandler } from '@lssm/lib.contracts';
9
+ import { ${specVarName} } from '../contracts/${toKebabCase(specName)}.contracts';
3
10
 
4
11
  /**
5
- * Handler for ${e}
12
+ * Handler for ${specName}
6
13
  */
7
- export const ${n}: ContractHandler<typeof ${o}> = async (
14
+ export const ${handlerName}: ContractHandler<typeof ${specVarName}> = async (
8
15
  input,
9
16
  context
10
17
  ) => {
11
- // TODO: Implement ${t} logic
18
+ // TODO: Implement ${kind} logic
12
19
 
13
20
  try {
14
21
  // 1. Validate prerequisites
@@ -24,28 +31,43 @@ export const ${n}: ContractHandler<typeof ${o}> = async (
24
31
  throw error;
25
32
  }
26
33
  };
27
- `}function t(e,t){let n=i(e);return`import React from 'react';
34
+ `;
35
+ }
36
+ /**
37
+ * Generate component template
38
+ */
39
+ function generateComponentTemplate(componentName, description) {
40
+ const pascalName = toPascalCase(componentName);
41
+ return `import React from 'react';
28
42
 
29
- interface ${n}Props {
43
+ interface ${pascalName}Props {
30
44
  // TODO: Define props based on presentation spec
31
45
  }
32
46
 
33
47
  /**
34
- * ${t}
48
+ * ${description}
35
49
  */
36
- export const ${n}: React.FC<${n}Props> = (props) => {
50
+ export const ${pascalName}: React.FC<${pascalName}Props> = (props) => {
37
51
  return (
38
52
  <div>
39
53
  {/* TODO: Implement component UI */}
40
- <p>Component: ${n}</p>
54
+ <p>Component: ${pascalName}</p>
41
55
  </div>
42
56
  );
43
57
  };
44
- `}function n(e,t){let n=t===`handler`?`../handlers`:`../components`,r=i(e);return`import { describe, it, expect } from 'bun:test';
45
- import { ${r} } from '${n}/${a(e)}';
58
+ `;
59
+ }
60
+ /**
61
+ * Generate test template
62
+ */
63
+ function generateTestTemplate(targetName, type) {
64
+ const importPath = type === "handler" ? "../handlers" : "../components";
65
+ const testName = toPascalCase(targetName);
66
+ return `import { describe, it, expect } from 'bun:test';
67
+ import { ${testName} } from '${importPath}/${toKebabCase(targetName)}';
46
68
 
47
- describe('${r}', () => {
48
- it('should ${t===`handler`?`handle valid input`:`render correctly`}', async () => {
69
+ describe('${testName}', () => {
70
+ it('should ${type === "handler" ? "handle valid input" : "render correctly"}', async () => {
49
71
  // TODO: Implement test
50
72
  expect(true).toBe(true);
51
73
  });
@@ -54,10 +76,24 @@ describe('${r}', () => {
54
76
  // TODO: Test edge cases
55
77
  });
56
78
 
57
- ${t===`handler`?`it('should handle errors appropriately', async () => {
79
+ ${type === "handler" ? `it('should handle errors appropriately', async () => {
58
80
  // TODO: Test error scenarios
59
- });`:`it('should be accessible', async () => {
81
+ });` : `it('should be accessible', async () => {
60
82
  // TODO: Test accessibility
61
83
  });`}
62
84
  });
63
- `}function r(e){let t=i(e);return t.charAt(0).toLowerCase()+t.slice(1)}function i(e){return e.split(/[-_.]/).map(e=>e.charAt(0).toUpperCase()+e.slice(1)).join(``)}function a(e){return e.replace(/\./g,`-`).replace(/([a-z])([A-Z])/g,`$1-$2`).toLowerCase()}export{t as generateComponentTemplate,e as generateHandlerTemplate,n as generateTestTemplate};
85
+ `;
86
+ }
87
+ function toCamelCase(str) {
88
+ const pascal = toPascalCase(str);
89
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
90
+ }
91
+ function toPascalCase(str) {
92
+ return str.split(/[-_.]/).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("");
93
+ }
94
+ function toKebabCase(str) {
95
+ return str.replace(/\./g, "-").replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
96
+ }
97
+
98
+ //#endregion
99
+ export { generateComponentTemplate, generateHandlerTemplate, generateTestTemplate };
@@ -1 +1,36 @@
1
- import{__export as e}from"../_virtual/rolldown_runtime.js";import{generateOperationSpec as t}from"./operation.template.js";import{generateEventSpec as n}from"./event.template.js";import{generatePresentationSpec as r}from"./presentation.template.js";import{generateWorkflowSpec as i}from"./workflow.template.js";import{generateMigrationSpec as a}from"./migration.template.js";import{generateTelemetrySpec as o}from"./telemetry.template.js";import{generateExperimentSpec as s}from"./experiment.template.js";import{generateAppBlueprintSpec as c}from"./app-config.template.js";import{generateDataViewSpec as l}from"./data-view.template.js";import{generateIntegrationSpec as u}from"./integration.template.js";import{generateKnowledgeSpaceSpec as d}from"./knowledge.template.js";import{generateComponentTemplate as f,generateHandlerTemplate as p,generateTestTemplate as m}from"./handler.template.js";import{generateWorkflowRunnerTemplate as h}from"./workflow-runner.template.js";var g=e({generateAppBlueprintSpec:()=>c,generateComponentTemplate:()=>f,generateDataViewSpec:()=>l,generateEventSpec:()=>n,generateExperimentSpec:()=>s,generateHandlerTemplate:()=>p,generateIntegrationSpec:()=>u,generateKnowledgeSpaceSpec:()=>d,generateMigrationSpec:()=>a,generateOperationSpec:()=>t,generatePresentationSpec:()=>r,generateTelemetrySpec:()=>o,generateTestTemplate:()=>m,generateWorkflowRunnerTemplate:()=>h,generateWorkflowSpec:()=>i});export{g as templates_exports};
1
+ import { __export } from "../_virtual/rolldown_runtime.js";
2
+ import { generateOperationSpec } from "./operation.template.js";
3
+ import { generateEventSpec } from "./event.template.js";
4
+ import { generatePresentationSpec } from "./presentation.template.js";
5
+ import { generateWorkflowSpec } from "./workflow.template.js";
6
+ import { generateMigrationSpec } from "./migration.template.js";
7
+ import { generateTelemetrySpec } from "./telemetry.template.js";
8
+ import { generateExperimentSpec } from "./experiment.template.js";
9
+ import { generateAppBlueprintSpec } from "./app-config.template.js";
10
+ import { generateDataViewSpec } from "./data-view.template.js";
11
+ import { generateIntegrationSpec } from "./integration.template.js";
12
+ import { generateKnowledgeSpaceSpec } from "./knowledge.template.js";
13
+ import { generateComponentTemplate, generateHandlerTemplate, generateTestTemplate } from "./handler.template.js";
14
+ import { generateWorkflowRunnerTemplate } from "./workflow-runner.template.js";
15
+
16
+ //#region src/templates/index.ts
17
+ var templates_exports = /* @__PURE__ */ __export({
18
+ generateAppBlueprintSpec: () => generateAppBlueprintSpec,
19
+ generateComponentTemplate: () => generateComponentTemplate,
20
+ generateDataViewSpec: () => generateDataViewSpec,
21
+ generateEventSpec: () => generateEventSpec,
22
+ generateExperimentSpec: () => generateExperimentSpec,
23
+ generateHandlerTemplate: () => generateHandlerTemplate,
24
+ generateIntegrationSpec: () => generateIntegrationSpec,
25
+ generateKnowledgeSpaceSpec: () => generateKnowledgeSpaceSpec,
26
+ generateMigrationSpec: () => generateMigrationSpec,
27
+ generateOperationSpec: () => generateOperationSpec,
28
+ generatePresentationSpec: () => generatePresentationSpec,
29
+ generateTelemetrySpec: () => generateTelemetrySpec,
30
+ generateTestTemplate: () => generateTestTemplate,
31
+ generateWorkflowRunnerTemplate: () => generateWorkflowRunnerTemplate,
32
+ generateWorkflowSpec: () => generateWorkflowSpec
33
+ });
34
+
35
+ //#endregion
36
+ export { templates_exports };