@lssm/bundle.contractspec-workspace 0.0.0-canary-20251217063201 → 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 (257) 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.js +81 -1
  27. package/dist/libs/ai-providers/dist/factory.js +154 -1
  28. package/dist/libs/ai-providers/dist/index.js +4 -1
  29. package/dist/libs/ai-providers/dist/legacy.js +72 -1
  30. package/dist/libs/ai-providers/dist/models.js +287 -1
  31. package/dist/libs/ai-providers/dist/validation.js +1 -1
  32. package/dist/libs/contracts/dist/capabilities/openbanking.js +88 -1
  33. package/dist/libs/contracts/dist/client/index.js +5 -1
  34. package/dist/libs/contracts/dist/client/react/feature-render.js +2 -1
  35. package/dist/libs/contracts/dist/client/react/form-render.js +4 -1
  36. package/dist/libs/contracts/dist/client/react/index.js +4 -1
  37. package/dist/libs/contracts/dist/contract-registry/index.js +1 -1
  38. package/dist/libs/contracts/dist/contract-registry/schemas.js +60 -1
  39. package/dist/libs/contracts/dist/docs/PUBLISHING.docblock.js +16 -76
  40. package/dist/libs/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +16 -350
  41. package/dist/libs/contracts/dist/docs/index.js +29 -1
  42. package/dist/libs/contracts/dist/docs/presentations.js +71 -1
  43. package/dist/libs/contracts/dist/docs/registry.js +44 -1
  44. package/dist/libs/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +16 -383
  45. package/dist/libs/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +16 -68
  46. package/dist/libs/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +16 -140
  47. package/dist/libs/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +16 -86
  48. package/dist/libs/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +16 -1
  49. package/dist/libs/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +24 -2
  50. package/dist/libs/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +21 -2
  51. package/dist/libs/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +16 -213
  52. package/dist/libs/contracts/dist/docs/tech/llm/llm-integration.docblock.js +73 -5
  53. package/dist/libs/contracts/dist/docs/tech/mcp-endpoints.docblock.js +37 -1
  54. package/dist/libs/contracts/dist/docs/tech/presentation-runtime.docblock.js +16 -1
  55. package/dist/libs/contracts/dist/docs/tech/schema/README.docblock.js +20 -262
  56. package/dist/libs/contracts/dist/docs/tech/studio/learning-events.docblock.js +48 -1
  57. package/dist/libs/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +24 -2
  58. package/dist/libs/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +23 -2
  59. package/dist/libs/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +25 -16
  60. package/dist/libs/contracts/dist/docs/tech/studio/project-routing.docblock.js +67 -1
  61. package/dist/libs/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +22 -2
  62. package/dist/libs/contracts/dist/docs/tech/studio/team-invitations.docblock.js +40 -36
  63. package/dist/libs/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +47 -1
  64. package/dist/libs/contracts/dist/docs/tech/studio/workspaces.docblock.js +23 -2
  65. package/dist/libs/contracts/dist/docs/tech/telemetry-ingest.docblock.js +36 -3
  66. package/dist/libs/contracts/dist/docs/tech/templates/runtime.docblock.js +20 -1
  67. package/dist/libs/contracts/dist/docs/tech/vscode-extension.docblock.js +36 -3
  68. package/dist/libs/contracts/dist/docs/tech/workflows/overview.docblock.js +20 -1
  69. package/dist/libs/contracts/dist/events.js +8 -1
  70. package/dist/libs/contracts/dist/experiments/evaluator.js +1 -1
  71. package/dist/libs/contracts/dist/index.js +72 -1
  72. package/dist/libs/contracts/dist/install.js +2 -1
  73. package/dist/libs/contracts/dist/integrations/contracts.js +377 -1
  74. package/dist/libs/contracts/dist/integrations/index.js +18 -1
  75. package/dist/libs/contracts/dist/integrations/openbanking/contracts/accounts.js +228 -1
  76. package/dist/libs/contracts/dist/integrations/openbanking/contracts/balances.js +159 -1
  77. package/dist/libs/contracts/dist/integrations/openbanking/contracts/index.js +3 -1
  78. package/dist/libs/contracts/dist/integrations/openbanking/contracts/transactions.js +210 -1
  79. package/dist/libs/contracts/dist/integrations/openbanking/models.js +242 -1
  80. package/dist/libs/contracts/dist/integrations/openbanking/telemetry.js +13 -1
  81. package/dist/libs/contracts/dist/integrations/providers/elevenlabs.js +52 -1
  82. package/dist/libs/contracts/dist/integrations/providers/gcs-storage.js +75 -1
  83. package/dist/libs/contracts/dist/integrations/providers/gmail.js +87 -1
  84. package/dist/libs/contracts/dist/integrations/providers/google-calendar.js +66 -1
  85. package/dist/libs/contracts/dist/integrations/providers/index.js +11 -1
  86. package/dist/libs/contracts/dist/integrations/providers/mistral.js +68 -1
  87. package/dist/libs/contracts/dist/integrations/providers/postmark.js +68 -1
  88. package/dist/libs/contracts/dist/integrations/providers/powens.js +116 -1
  89. package/dist/libs/contracts/dist/integrations/providers/qdrant.js +73 -1
  90. package/dist/libs/contracts/dist/integrations/providers/registry.js +10 -1
  91. package/dist/libs/contracts/dist/integrations/providers/stripe.js +83 -1
  92. package/dist/libs/contracts/dist/integrations/providers/twilio-sms.js +61 -1
  93. package/dist/libs/contracts/dist/jsonschema.js +24 -1
  94. package/dist/libs/contracts/dist/knowledge/contracts.js +306 -1
  95. package/dist/libs/contracts/dist/knowledge/index.js +7 -1
  96. package/dist/libs/contracts/dist/knowledge/spaces/email-threads.js +34 -1
  97. package/dist/libs/contracts/dist/knowledge/spaces/financial-docs.js +34 -1
  98. package/dist/libs/contracts/dist/knowledge/spaces/financial-overview.js +38 -1
  99. package/dist/libs/contracts/dist/knowledge/spaces/index.js +6 -1
  100. package/dist/libs/contracts/dist/knowledge/spaces/product-canon.js +34 -1
  101. package/dist/libs/contracts/dist/knowledge/spaces/support-faq.js +37 -1
  102. package/dist/libs/contracts/dist/knowledge/spaces/uploaded-docs.js +34 -1
  103. package/dist/libs/contracts/dist/llm/exporters.js +352 -4
  104. package/dist/libs/contracts/dist/llm/index.js +2 -1
  105. package/dist/libs/contracts/dist/llm/prompts.js +143 -7
  106. package/dist/libs/contracts/dist/onboarding-base.js +196 -1
  107. package/dist/libs/contracts/dist/openapi.js +75 -1
  108. package/dist/libs/contracts/dist/ownership.js +21 -1
  109. package/dist/libs/contracts/dist/presentations.js +1 -1
  110. package/dist/libs/contracts/dist/presentations.v2.js +11 -1
  111. package/dist/libs/contracts/dist/prompt.js +1 -1
  112. package/dist/libs/contracts/dist/promptRegistry.js +1 -1
  113. package/dist/libs/contracts/dist/regenerator/index.js +2 -1
  114. package/dist/libs/contracts/dist/regenerator/service.js +92 -1
  115. package/dist/libs/contracts/dist/regenerator/utils.js +51 -1
  116. package/dist/libs/contracts/dist/registry.js +208 -1
  117. package/dist/libs/contracts/dist/resources.js +1 -1
  118. package/dist/libs/contracts/dist/schema/dist/EnumType.js +2 -1
  119. package/dist/libs/contracts/dist/schema/dist/FieldType.js +49 -1
  120. package/dist/libs/contracts/dist/schema/dist/ScalarTypeEnum.js +236 -1
  121. package/dist/libs/contracts/dist/schema/dist/SchemaModel.js +34 -1
  122. package/dist/libs/contracts/dist/schema/dist/entity/defineEntity.js +1 -1
  123. package/dist/libs/contracts/dist/schema/dist/entity/index.js +2 -1
  124. package/dist/libs/contracts/dist/schema/dist/entity/types.js +1 -1
  125. package/dist/libs/contracts/dist/schema/dist/index.js +6 -1
  126. package/dist/libs/contracts/dist/server/graphql-pothos.js +6 -1
  127. package/dist/libs/contracts/dist/server/index.js +8 -1
  128. package/dist/libs/contracts/dist/server/mcp/createMcpServer.js +4 -1
  129. package/dist/libs/contracts/dist/server/mcp/registerPresentations.js +2 -1
  130. package/dist/libs/contracts/dist/server/mcp/registerPrompts.js +1 -1
  131. package/dist/libs/contracts/dist/server/mcp/registerResources.js +2 -1
  132. package/dist/libs/contracts/dist/server/mcp/registerTools.js +1 -1
  133. package/dist/libs/contracts/dist/server/provider-mcp.js +1 -1
  134. package/dist/libs/contracts/dist/server/rest-elysia.js +1 -1
  135. package/dist/libs/contracts/dist/server/rest-express.js +1 -1
  136. package/dist/libs/contracts/dist/server/rest-generic.js +1 -1
  137. package/dist/libs/contracts/dist/server/rest-next-app.js +1 -1
  138. package/dist/libs/contracts/dist/server/rest-next-pages.js +1 -1
  139. package/dist/libs/contracts/dist/spec.js +35 -1
  140. package/dist/libs/contracts/dist/telemetry/index.js +1 -1
  141. package/dist/libs/contracts/dist/telemetry/tracker.js +1 -1
  142. package/dist/libs/contracts/dist/tests/index.js +1 -1
  143. package/dist/libs/contracts/dist/tests/runner.js +150 -1
  144. package/dist/libs/contracts/dist/workflow/index.js +1 -1
  145. package/dist/libs/contracts/dist/workflow/runner.js +1 -1
  146. package/dist/libs/contracts-transformers/dist/common/utils.js +47 -1
  147. package/dist/libs/contracts-transformers/dist/openapi/exporter.js +1 -1
  148. package/dist/libs/contracts-transformers/dist/openapi/importer.js +255 -2
  149. package/dist/libs/contracts-transformers/dist/openapi/index.js +4 -1
  150. package/dist/libs/contracts-transformers/dist/openapi/parser.js +231 -1
  151. package/dist/libs/contracts-transformers/dist/openapi/schema-converter.js +201 -4
  152. package/dist/modules/contractspec-workspace/dist/ai/code-generation.js +50 -13
  153. package/dist/modules/contractspec-workspace/dist/ai/spec-creation.js +50 -18
  154. package/dist/modules/contractspec-workspace/dist/analysis/deps/graph.js +84 -2
  155. package/dist/modules/contractspec-workspace/dist/analysis/deps/parse-imports.js +30 -1
  156. package/dist/modules/contractspec-workspace/dist/analysis/diff/semantic.js +96 -1
  157. package/dist/modules/contractspec-workspace/dist/analysis/feature-scan.js +151 -1
  158. package/dist/modules/contractspec-workspace/dist/analysis/spec-scan.js +344 -1
  159. package/dist/modules/contractspec-workspace/dist/analysis/validate/spec-structure.js +122 -1
  160. package/dist/modules/contractspec-workspace/dist/templates/app-config.js +100 -28
  161. package/dist/modules/contractspec-workspace/dist/templates/data-view.js +41 -27
  162. package/dist/modules/contractspec-workspace/dist/templates/event.js +28 -14
  163. package/dist/modules/contractspec-workspace/dist/templates/experiment.js +76 -51
  164. package/dist/modules/contractspec-workspace/dist/templates/handler.js +49 -17
  165. package/dist/modules/contractspec-workspace/dist/templates/integration-utils.js +97 -26
  166. package/dist/modules/contractspec-workspace/dist/templates/integration.js +46 -23
  167. package/dist/modules/contractspec-workspace/dist/templates/knowledge.js +59 -19
  168. package/dist/modules/contractspec-workspace/dist/templates/migration.js +49 -26
  169. package/dist/modules/contractspec-workspace/dist/templates/operation.js +40 -28
  170. package/dist/modules/contractspec-workspace/dist/templates/presentation.js +45 -20
  171. package/dist/modules/contractspec-workspace/dist/templates/telemetry.js +73 -53
  172. package/dist/modules/contractspec-workspace/dist/templates/utils.js +38 -1
  173. package/dist/modules/contractspec-workspace/dist/templates/workflow-runner.js +12 -6
  174. package/dist/modules/contractspec-workspace/dist/templates/workflow.js +50 -24
  175. package/dist/modules/contractspec-workspace/dist/types/generation-types.js +20 -1
  176. package/dist/services/agent-guide/adapters/claude-code.js +144 -3
  177. package/dist/services/agent-guide/adapters/cursor-cli.js +135 -3
  178. package/dist/services/agent-guide/adapters/generic-mcp.js +159 -3
  179. package/dist/services/agent-guide/adapters/index.js +30 -1
  180. package/dist/services/agent-guide/agent-guide-service.js +148 -1
  181. package/dist/services/agent-guide/index.js +5 -1
  182. package/dist/services/build.js +140 -1
  183. package/dist/services/ci-check/ci-check-service.js +393 -1
  184. package/dist/services/ci-check/index.js +2 -1
  185. package/dist/services/ci-check/types.js +28 -1
  186. package/dist/services/clean.js +71 -1
  187. package/dist/services/config.js +76 -1
  188. package/dist/services/deps.js +62 -1
  189. package/dist/services/diff.js +33 -1
  190. package/dist/services/doctor/checks/ai.js +118 -2
  191. package/dist/services/doctor/checks/cli.js +146 -1
  192. package/dist/services/doctor/checks/config.js +170 -1
  193. package/dist/services/doctor/checks/deps.js +180 -1
  194. package/dist/services/doctor/checks/index.js +6 -1
  195. package/dist/services/doctor/checks/mcp.js +144 -1
  196. package/dist/services/doctor/checks/workspace.js +243 -1
  197. package/dist/services/doctor/doctor-service.js +115 -2
  198. package/dist/services/doctor/index.js +2 -1
  199. package/dist/services/doctor/types.js +26 -1
  200. package/dist/services/implementation/discovery.js +143 -2
  201. package/dist/services/implementation/index.js +2 -1
  202. package/dist/services/implementation/resolver.js +223 -1
  203. package/dist/services/index.js +53 -1
  204. package/dist/services/integrity-diagram.js +274 -6
  205. package/dist/services/integrity.js +272 -1
  206. package/dist/services/list.js +35 -1
  207. package/dist/services/openapi/export-service.js +51 -2
  208. package/dist/services/openapi/import-service.js +75 -1
  209. package/dist/services/openapi/index.js +4 -1
  210. package/dist/services/openapi/sync-service.js +121 -1
  211. package/dist/services/openapi/validate-service.js +130 -1
  212. package/dist/services/regenerator.js +23 -1
  213. package/dist/services/registry.js +73 -1
  214. package/dist/services/setup/config-generators.js +113 -26
  215. package/dist/services/setup/file-merger.js +60 -2
  216. package/dist/services/setup/index.js +4 -1
  217. package/dist/services/setup/setup-service.js +95 -1
  218. package/dist/services/setup/targets/agents-md.js +46 -1
  219. package/dist/services/setup/targets/cli-config.js +59 -1
  220. package/dist/services/setup/targets/cursor-rules.js +47 -1
  221. package/dist/services/setup/targets/mcp-claude.js +59 -1
  222. package/dist/services/setup/targets/mcp-cursor.js +58 -1
  223. package/dist/services/setup/targets/vscode-settings.js +62 -1
  224. package/dist/services/setup/types.js +26 -1
  225. package/dist/services/sync.js +62 -1
  226. package/dist/services/test.js +30 -1
  227. package/dist/services/validate-implementation.js +69 -1
  228. package/dist/services/validate.js +47 -1
  229. package/dist/services/verification-cache/adapters/filesystem.js +121 -1
  230. package/dist/services/verification-cache/adapters/in-memory.js +45 -1
  231. package/dist/services/verification-cache/adapters/index.js +3 -1
  232. package/dist/services/verification-cache/adapters/workspace-state.js +90 -1
  233. package/dist/services/verification-cache/cache-service.js +255 -1
  234. package/dist/services/verification-cache/index.js +6 -1
  235. package/dist/services/verification-cache/types.js +15 -1
  236. package/dist/services/verify/ai-verifier.js +336 -9
  237. package/dist/services/verify/behavior-verifier.js +185 -1
  238. package/dist/services/verify/index.js +4 -1
  239. package/dist/services/verify/structure-verifier.js +195 -2
  240. package/dist/services/verify/verify-service.js +203 -3
  241. package/dist/services/watch.js +31 -1
  242. package/dist/services/workspace-info.js +102 -2
  243. package/dist/templates/app-config.template.js +101 -28
  244. package/dist/templates/data-view.template.js +42 -27
  245. package/dist/templates/event.template.js +29 -14
  246. package/dist/templates/experiment.template.js +77 -51
  247. package/dist/templates/handler.template.js +53 -17
  248. package/dist/templates/index.js +36 -1
  249. package/dist/templates/integration.template.js +134 -50
  250. package/dist/templates/knowledge.template.js +62 -21
  251. package/dist/templates/migration.template.js +50 -26
  252. package/dist/templates/operation.template.js +44 -28
  253. package/dist/templates/presentation.template.js +46 -20
  254. package/dist/templates/telemetry.template.js +74 -53
  255. package/dist/templates/workflow-runner.template.js +12 -6
  256. package/dist/templates/workflow.template.js +51 -24
  257. package/package.json +13 -9
@@ -1 +1,35 @@
1
- const e=e=>`ref`in e,t=e=>({...e,meta:{...e.meta,kind:`command`},policy:{...e.policy,idempotent:e.policy?.policy?.idempotent??!1}}),n=e=>({...e,meta:{...e.meta,kind:`query`},policy:{...e.policy,idempotent:!0}});export{e,n,t};
1
+ //#region ../../libs/contracts/dist/spec.js
2
+ const isEmitDeclRef = (e) => "ref" in e;
3
+ /**
4
+ * Helper to define a Command (write operation).
5
+ * Sets `kind: 'command'` and defaults `idempotent: false`.
6
+ */
7
+ const defineCommand = (spec) => ({
8
+ ...spec,
9
+ meta: {
10
+ ...spec.meta,
11
+ kind: "command"
12
+ },
13
+ policy: {
14
+ ...spec.policy,
15
+ idempotent: spec.policy?.["policy"]?.idempotent ?? false
16
+ }
17
+ });
18
+ /**
19
+ * Helper to define a Query (read-only operation).
20
+ * Sets `kind: 'query'` and forces `idempotent: true`.
21
+ */
22
+ const defineQuery = (spec) => ({
23
+ ...spec,
24
+ meta: {
25
+ ...spec.meta,
26
+ kind: "query"
27
+ },
28
+ policy: {
29
+ ...spec.policy,
30
+ idempotent: true
31
+ }
32
+ });
33
+
34
+ //#endregion
35
+ export { defineCommand, defineQuery, isEmitDeclRef };
@@ -1 +1 @@
1
- import"./tracker.js";
1
+ import "./tracker.js";
@@ -1 +1 @@
1
- import"crypto";
1
+ import "crypto";
@@ -1 +1 @@
1
- import{t as e}from"./runner.js";
1
+ import { TestRunner } from "./runner.js";
@@ -1 +1,150 @@
1
- import"../index.js";import{deepStrictEqual as e}from"node:assert";var t=class{constructor(e){this.config=e}async run(e){let t=[],n=0,r=0;for(let i of e.scenarios){await this.config.beforeEach?.(i);let a=await this.runScenario(e,i);t.push(a),a.status===`passed`?n+=1:r+=1,await this.config.afterEach?.(i,a)}return{spec:e,scenarios:t,passed:n,failed:r}}async runScenario(e,t){let n=[];try{let r=await this.createContext(),i=[...e.fixtures??[],...t.given??[]],a=[];for(let e of i)await this.executeOperation(e,r,a);let o=await this.executeOperation(t.when,r,a),s=t.then??[];for(let e of s){let t=this.evaluateAssertion(e,o,a);n.push(t)}return{scenario:t,status:n.some(e=>e.status===`failed`)?`failed`:`passed`,assertionResults:n}}catch(e){return{scenario:t,status:`failed`,error:e,assertionResults:n}}}async createContext(){return{...await this.config.createContext?.()??{}}}async executeOperation(e,t,n){let r={...t,eventPublisher:async e=>{n.push({name:e.name,version:e.version,payload:e.payload}),await t.eventPublisher?.(e)}};try{return{output:await this.config.registry.execute(e.operation.name,e.operation.version,e.input??null,r),events:n}}catch(e){return{error:e,events:n}}}evaluateAssertion(e,t,n){switch(e.type){case`expectOutput`:return this.evaluateOutputAssertion(e,t);case`expectError`:return this.evaluateErrorAssertion(e,t);case`expectEvents`:return this.evaluateEventsAssertion(e,n);default:return{assertion:e,status:`failed`,message:`Unknown assertion type ${e.type}`}}}evaluateOutputAssertion(t,n){if(n.error)return{assertion:t,status:`failed`,message:`Expected output but operation threw error: ${n.error.message}`};try{return e(n.output,t.match),{assertion:t,status:`passed`}}catch(e){return{assertion:t,status:`failed`,message:e instanceof Error?e.message:`Output assertion failed`}}}evaluateErrorAssertion(e,t){return t.error?e.messageIncludes&&!t.error.message.includes(e.messageIncludes)?{assertion:e,status:`failed`,message:`Error message "${t.error.message}" did not include expected substring "${e.messageIncludes}"`}:{assertion:e,status:`passed`}:{assertion:e,status:`failed`,message:`Expected an error but operation completed successfully`}}evaluateEventsAssertion(e,t){let n=[];for(let r of e.events){let e=t.filter(e=>e.name===r.name&&e.version===r.version).length;typeof r.min==`number`&&e<r.min||typeof r.max==`number`&&e>r.max?n.push(`Event ${r.name}.v${r.version} occurred ${e} times (expected ${r.min??0} - ${r.max??`∞`})`):r.min===void 0&&r.max===void 0&&e===0&&n.push(`Event ${r.name}.v${r.version} did not occur`)}return n.length>0?{assertion:e,status:`failed`,message:n.join(`; `)}:{assertion:e,status:`passed`}}};export{t};
1
+ import "../index.js";
2
+ import { deepStrictEqual } from "node:assert";
3
+
4
+ //#region ../../libs/contracts/dist/tests/runner.js
5
+ var TestRunner = class {
6
+ constructor(config) {
7
+ this.config = config;
8
+ }
9
+ async run(spec) {
10
+ const scenarios = [];
11
+ let passed = 0;
12
+ let failed = 0;
13
+ for (const scenario of spec.scenarios) {
14
+ await this.config.beforeEach?.(scenario);
15
+ const result = await this.runScenario(spec, scenario);
16
+ scenarios.push(result);
17
+ if (result.status === "passed") passed += 1;
18
+ else failed += 1;
19
+ await this.config.afterEach?.(scenario, result);
20
+ }
21
+ return {
22
+ spec,
23
+ scenarios,
24
+ passed,
25
+ failed
26
+ };
27
+ }
28
+ async runScenario(spec, scenario) {
29
+ const assertionResults = [];
30
+ try {
31
+ const context = await this.createContext();
32
+ const fixtures = [...spec.fixtures ?? [], ...scenario.given ?? []];
33
+ const events = [];
34
+ for (const fixture of fixtures) await this.executeOperation(fixture, context, events);
35
+ const actionResult = await this.executeOperation(scenario.when, context, events);
36
+ const assertions = scenario.then ?? [];
37
+ for (const assertion of assertions) {
38
+ const assertionResult = this.evaluateAssertion(assertion, actionResult, events);
39
+ assertionResults.push(assertionResult);
40
+ }
41
+ return {
42
+ scenario,
43
+ status: assertionResults.some((assertion) => assertion.status === "failed") ? "failed" : "passed",
44
+ assertionResults
45
+ };
46
+ } catch (error) {
47
+ return {
48
+ scenario,
49
+ status: "failed",
50
+ error,
51
+ assertionResults
52
+ };
53
+ }
54
+ }
55
+ async createContext() {
56
+ return { ...await this.config.createContext?.() ?? {} };
57
+ }
58
+ async executeOperation(action, baseCtx, recordedEvents) {
59
+ const ctx = {
60
+ ...baseCtx,
61
+ eventPublisher: async (event) => {
62
+ recordedEvents.push({
63
+ name: event.name,
64
+ version: event.version,
65
+ payload: event.payload
66
+ });
67
+ await baseCtx.eventPublisher?.(event);
68
+ }
69
+ };
70
+ try {
71
+ return {
72
+ output: await this.config.registry.execute(action.operation.name, action.operation.version, action.input ?? null, ctx),
73
+ events: recordedEvents
74
+ };
75
+ } catch (error) {
76
+ return {
77
+ error,
78
+ events: recordedEvents
79
+ };
80
+ }
81
+ }
82
+ evaluateAssertion(assertion, result, events) {
83
+ switch (assertion.type) {
84
+ case "expectOutput": return this.evaluateOutputAssertion(assertion, result);
85
+ case "expectError": return this.evaluateErrorAssertion(assertion, result);
86
+ case "expectEvents": return this.evaluateEventsAssertion(assertion, events);
87
+ default: return {
88
+ assertion,
89
+ status: "failed",
90
+ message: `Unknown assertion type ${assertion.type}`
91
+ };
92
+ }
93
+ }
94
+ evaluateOutputAssertion(assertion, result) {
95
+ if (result.error) return {
96
+ assertion,
97
+ status: "failed",
98
+ message: `Expected output but operation threw error: ${result.error.message}`
99
+ };
100
+ try {
101
+ deepStrictEqual(result.output, assertion.match);
102
+ return {
103
+ assertion,
104
+ status: "passed"
105
+ };
106
+ } catch (error) {
107
+ return {
108
+ assertion,
109
+ status: "failed",
110
+ message: error instanceof Error ? error.message : "Output assertion failed"
111
+ };
112
+ }
113
+ }
114
+ evaluateErrorAssertion(assertion, result) {
115
+ if (!result.error) return {
116
+ assertion,
117
+ status: "failed",
118
+ message: "Expected an error but operation completed successfully"
119
+ };
120
+ if (assertion.messageIncludes && !result.error.message.includes(assertion.messageIncludes)) return {
121
+ assertion,
122
+ status: "failed",
123
+ message: `Error message "${result.error.message}" did not include expected substring "${assertion.messageIncludes}"`
124
+ };
125
+ return {
126
+ assertion,
127
+ status: "passed"
128
+ };
129
+ }
130
+ evaluateEventsAssertion(assertion, events) {
131
+ const failures = [];
132
+ for (const expected of assertion.events) {
133
+ const count = events.filter((event) => event.name === expected.name && event.version === expected.version).length;
134
+ if (typeof expected.min === "number" && count < expected.min || typeof expected.max === "number" && count > expected.max) failures.push(`Event ${expected.name}.v${expected.version} occurred ${count} times (expected ${expected.min ?? 0} - ${expected.max ?? "∞"})`);
135
+ else if (typeof expected.min === "undefined" && typeof expected.max === "undefined" && count === 0) failures.push(`Event ${expected.name}.v${expected.version} did not occur`);
136
+ }
137
+ if (failures.length > 0) return {
138
+ assertion,
139
+ status: "failed",
140
+ message: failures.join("; ")
141
+ };
142
+ return {
143
+ assertion,
144
+ status: "passed"
145
+ };
146
+ }
147
+ };
148
+
149
+ //#endregion
150
+ export { TestRunner };
@@ -1 +1 @@
1
- import"./runner.js";
1
+ import "./runner.js";
@@ -1 +1 @@
1
- import"node:crypto";
1
+ import "node:crypto";
@@ -1 +1,47 @@
1
- function e(e){return e.replace(/[-_./\s]+(.)?/g,(e,t)=>t?t.toUpperCase():``).replace(/^./,e=>e.toUpperCase())}function t(t){let n=e(t);return n.charAt(0).toLowerCase()+n.slice(1)}function n(e){return e.replace(/([a-z])([A-Z])/g,`$1-$2`).replace(/[\s_./]+/g,`-`).toLowerCase()}function r(e){let t=e.replace(/[^a-zA-Z0-9_$]/g,`_`);return/^[0-9]/.test(t)&&(t=`_`+t),t}function i(e,n){let r=t(e);return n?`${n}.${r}`:r}function a(e){return n(e.replace(/\./g,`-`))+`.ts`}export{i as a,e,r as i,a as o,t};
1
+ //#region ../../libs/contracts-transformers/dist/common/utils.js
2
+ /**
3
+ * Common utilities for contract transformations.
4
+ */
5
+ /**
6
+ * Convert a string to PascalCase.
7
+ */
8
+ function toPascalCase(str) {
9
+ return str.replace(/[-_./\s]+(.)?/g, (_, c) => c ? c.toUpperCase() : "").replace(/^./, (c) => c.toUpperCase());
10
+ }
11
+ /**
12
+ * Convert a string to camelCase.
13
+ */
14
+ function toCamelCase(str) {
15
+ const pascal = toPascalCase(str);
16
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
17
+ }
18
+ /**
19
+ * Convert a string to kebab-case.
20
+ */
21
+ function toKebabCase(str) {
22
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_./]+/g, "-").toLowerCase();
23
+ }
24
+ /**
25
+ * Sanitize a string to be a valid TypeScript identifier.
26
+ */
27
+ function toValidIdentifier(str) {
28
+ let result = str.replace(/[^a-zA-Z0-9_$]/g, "_");
29
+ if (/^[0-9]/.test(result)) result = "_" + result;
30
+ return result;
31
+ }
32
+ /**
33
+ * Generate a ContractSpec name from an operation identifier.
34
+ */
35
+ function toSpecName(operationId, prefix) {
36
+ const name = toCamelCase(operationId);
37
+ return prefix ? `${prefix}.${name}` : name;
38
+ }
39
+ /**
40
+ * Generate a file name from a spec name.
41
+ */
42
+ function toFileName(specName) {
43
+ return toKebabCase(specName.replace(/\./g, "-")) + ".ts";
44
+ }
45
+
46
+ //#endregion
47
+ export { toCamelCase, toFileName, toPascalCase, toSpecName, toValidIdentifier };
@@ -1 +1 @@
1
- import"zod";
1
+ import "zod";
@@ -1,2 +1,255 @@
1
- import{a as e,e as t,i as n,o as r}from"../common/utils.js";import{d as i,l as a}from"./schema-converter.js";const o=[`post`,`put`,`delete`,`patch`];function s(e){return o.includes(e.toLowerCase())?`command`:`query`}function c(e,t){if(!e.security||e.security.length===0)return t;for(let t of e.security)if(Object.keys(t).length===0)return`anonymous`;return`user`}function l(e){let t=[];for(let n of e.pathParams)t.push({name:n.name,schema:n.schema,required:!0});for(let n of e.queryParams)t.push({name:n.name,schema:n.schema,required:n.required});let n=[`authorization`,`content-type`,`accept`,`user-agent`];for(let r of e.headerParams)n.includes(r.name.toLowerCase())||t.push({name:r.name,schema:r.schema,required:r.required});if(e.requestBody?.schema){let n=e.requestBody.schema;if(`$ref`in n)t.push({name:`body`,schema:n,required:e.requestBody.required});else{let e=n,r=e.properties,i=e.required??[];if(r)for(let[e,n]of Object.entries(r))t.push({name:e,schema:n,required:i.includes(e)})}}return t.length===0?{schema:null,fields:[]}:{schema:{type:`object`,properties:t.reduce((e,t)=>(e[t.name]=t.schema,e),{}),required:t.filter(e=>e.required).map(e=>e.name)},fields:t}}function u(e){for(let t of[`200`,`201`,`202`,`204`]){let n=e.responses[t];if(n?.schema)return n.schema}for(let[t,n]of Object.entries(e.responses))if(t.startsWith(`2`)&&n.schema)return n.schema;return null}function d(r,a,o,l){let u=e(r.operationId,a.prefix),d=s(r.method),f=c(r,a.defaultAuth??`user`),p=[];p.push(`import { defineCommand, defineQuery } from '@lssm/lib.contracts';`),(o||l)&&p.push(i([...o?.fields??[],...l?.fields??[]])),p.push(``),o&&o.code&&(p.push(`// Input schema`),p.push(o.code),p.push(``)),l&&l.code&&(p.push(`// Output schema`),p.push(l.code),p.push(``));let m=d===`command`?`defineCommand`:`defineQuery`,h=n(t(r.operationId));return p.push(`/**`),p.push(` * ${r.summary??r.operationId}`),r.description&&(p.push(` *`),p.push(` * ${r.description}`)),p.push(` *`),p.push(` * @source OpenAPI: ${r.method.toUpperCase()} ${r.path}`),p.push(` */`),p.push(`export const ${h}Spec = ${m}({`),p.push(` meta: {`),p.push(` name: '${u}',`),p.push(` version: 1,`),p.push(` stability: '${a.defaultStability??`stable`}',`),p.push(` owners: [${(a.defaultOwners??[]).map(e=>`'${e}'`).join(`, `)}],`),p.push(` tags: [${r.tags.map(e=>`'${e}'`).join(`, `)}],`),p.push(` description: ${JSON.stringify(r.summary??r.operationId)},`),p.push(` goal: ${JSON.stringify(r.description??`Imported from OpenAPI`)},`),p.push(` context: 'Imported from OpenAPI: ${r.method.toUpperCase()} ${r.path}',`),p.push(` },`),p.push(` io: {`),o?p.push(` input: ${o.name},`):p.push(` input: null,`),l?p.push(` output: ${l.name},`):p.push(` output: null, // TODO: Define output schema`),p.push(` },`),p.push(` policy: {`),p.push(` auth: '${f}',`),p.push(` },`),p.push(` transport: {`),p.push(` rest: {`),p.push(` method: '${r.method.toUpperCase()}',`),p.push(` path: '${r.path}',`),p.push(` },`),p.push(` },`),p.push(`});`),p.join(`
2
- `)}function f(t,n={}){let{tags:i,exclude:o=[],include:s}=n,c=[],f=[],p=[];for(let m of t.operations){if(i&&i.length>0&&!m.tags.some(e=>i.includes(e))){f.push({sourceId:m.operationId,reason:`No matching tags (has: ${m.tags.join(`, `)})`});continue}if(s&&s.length>0){if(!s.includes(m.operationId)){f.push({sourceId:m.operationId,reason:`Not in include list`});continue}}else if(o.includes(m.operationId)){f.push({sourceId:m.operationId,reason:`In exclude list`});continue}if(m.deprecated&&n.defaultStability!==`deprecated`){f.push({sourceId:m.operationId,reason:`Deprecated operation`});continue}try{let{schema:i}=l(m),o=i?a(i,`${m.operationId}Input`):null,s=u(m),f=d(m,n,o,s?a(s,`${m.operationId}Output`):null),p=r(e(m.operationId,n.prefix)),h={rest:{method:m.method.toUpperCase(),path:m.path,params:{path:m.pathParams.map(e=>e.name),query:m.queryParams.map(e=>e.name),header:m.headerParams.map(e=>e.name),cookie:m.cookieParams.map(e=>e.name)}}},g={type:`openapi`,sourceId:m.operationId,operationId:m.operationId,openApiVersion:t.version,importedAt:new Date};c.push({spec:{},code:f,fileName:p,source:g,transportHints:h})}catch(e){p.push({sourceId:m.operationId,error:e instanceof Error?e.message:String(e)})}}return{specs:c,skipped:f,errors:p,summary:{total:t.operations.length,imported:c.length,skipped:f.length,errors:p.length}}}export{f};
1
+ import { toFileName, toPascalCase, toSpecName, toValidIdentifier } from "../common/utils.js";
2
+ import { generateImports, generateSchemaModelCode } from "./schema-converter.js";
3
+
4
+ //#region ../../libs/contracts-transformers/dist/openapi/importer.js
5
+ /**
6
+ * HTTP methods that typically indicate a command (state-changing).
7
+ */
8
+ const COMMAND_METHODS = [
9
+ "post",
10
+ "put",
11
+ "delete",
12
+ "patch"
13
+ ];
14
+ /**
15
+ * Determine if an operation is a command or query based on HTTP method.
16
+ */
17
+ function inferOpKind(method) {
18
+ return COMMAND_METHODS.includes(method.toLowerCase()) ? "command" : "query";
19
+ }
20
+ /**
21
+ * Determine auth level based on security requirements.
22
+ */
23
+ function inferAuthLevel(operation, defaultAuth) {
24
+ if (!operation.security || operation.security.length === 0) return defaultAuth;
25
+ for (const sec of operation.security) if (Object.keys(sec).length === 0) return "anonymous";
26
+ return "user";
27
+ }
28
+ /**
29
+ * Build a merged input schema from all parameter sources.
30
+ */
31
+ function buildInputSchema(operation) {
32
+ const fields = [];
33
+ for (const param of operation.pathParams) fields.push({
34
+ name: param.name,
35
+ schema: param.schema,
36
+ required: true
37
+ });
38
+ for (const param of operation.queryParams) fields.push({
39
+ name: param.name,
40
+ schema: param.schema,
41
+ required: param.required
42
+ });
43
+ const excludedHeaders = [
44
+ "authorization",
45
+ "content-type",
46
+ "accept",
47
+ "user-agent"
48
+ ];
49
+ for (const param of operation.headerParams) if (!excludedHeaders.includes(param.name.toLowerCase())) fields.push({
50
+ name: param.name,
51
+ schema: param.schema,
52
+ required: param.required
53
+ });
54
+ if (operation.requestBody?.schema) {
55
+ const bodySchema = operation.requestBody.schema;
56
+ if (!("$ref" in bodySchema)) {
57
+ const schemaObj = bodySchema;
58
+ const properties = schemaObj["properties"];
59
+ const required = schemaObj["required"] ?? [];
60
+ if (properties) for (const [propName, propSchema] of Object.entries(properties)) fields.push({
61
+ name: propName,
62
+ schema: propSchema,
63
+ required: required.includes(propName)
64
+ });
65
+ } else fields.push({
66
+ name: "body",
67
+ schema: bodySchema,
68
+ required: operation.requestBody.required
69
+ });
70
+ }
71
+ if (fields.length === 0) return {
72
+ schema: null,
73
+ fields: []
74
+ };
75
+ return {
76
+ schema: {
77
+ type: "object",
78
+ properties: fields.reduce((acc, f) => {
79
+ acc[f.name] = f.schema;
80
+ return acc;
81
+ }, {}),
82
+ required: fields.filter((f) => f.required).map((f) => f.name)
83
+ },
84
+ fields
85
+ };
86
+ }
87
+ /**
88
+ * Get the output schema from the operation responses.
89
+ */
90
+ function getOutputSchema(operation) {
91
+ for (const code of [
92
+ "200",
93
+ "201",
94
+ "202",
95
+ "204"
96
+ ]) {
97
+ const response = operation.responses[code];
98
+ if (response?.schema) return response.schema;
99
+ }
100
+ for (const [code, response] of Object.entries(operation.responses)) if (code.startsWith("2") && response.schema) return response.schema;
101
+ return null;
102
+ }
103
+ /**
104
+ * Generate ContractSpec TypeScript code for an operation.
105
+ */
106
+ function generateSpecCode(operation, options, inputModel, outputModel) {
107
+ const specName = toSpecName(operation.operationId, options.prefix);
108
+ const kind = inferOpKind(operation.method);
109
+ const auth = inferAuthLevel(operation, options.defaultAuth ?? "user");
110
+ const lines = [];
111
+ lines.push("import { defineCommand, defineQuery } from '@lssm/lib.contracts';");
112
+ if (inputModel || outputModel) lines.push(generateImports([...inputModel?.fields ?? [], ...outputModel?.fields ?? []]));
113
+ lines.push("");
114
+ if (inputModel && inputModel.code) {
115
+ lines.push("// Input schema");
116
+ lines.push(inputModel.code);
117
+ lines.push("");
118
+ }
119
+ if (outputModel && outputModel.code) {
120
+ lines.push("// Output schema");
121
+ lines.push(outputModel.code);
122
+ lines.push("");
123
+ }
124
+ const defineFunc = kind === "command" ? "defineCommand" : "defineQuery";
125
+ const safeName = toValidIdentifier(toPascalCase(operation.operationId));
126
+ lines.push(`/**`);
127
+ lines.push(` * ${operation.summary ?? operation.operationId}`);
128
+ if (operation.description) {
129
+ lines.push(` *`);
130
+ lines.push(` * ${operation.description}`);
131
+ }
132
+ lines.push(` *`);
133
+ lines.push(` * @source OpenAPI: ${operation.method.toUpperCase()} ${operation.path}`);
134
+ lines.push(` */`);
135
+ lines.push(`export const ${safeName}Spec = ${defineFunc}({`);
136
+ lines.push(" meta: {");
137
+ lines.push(` name: '${specName}',`);
138
+ lines.push(" version: 1,");
139
+ lines.push(` stability: '${options.defaultStability ?? "stable"}',`);
140
+ lines.push(` owners: [${(options.defaultOwners ?? []).map((o) => `'${o}'`).join(", ")}],`);
141
+ lines.push(` tags: [${operation.tags.map((t) => `'${t}'`).join(", ")}],`);
142
+ lines.push(` description: ${JSON.stringify(operation.summary ?? operation.operationId)},`);
143
+ lines.push(` goal: ${JSON.stringify(operation.description ?? "Imported from OpenAPI")},`);
144
+ lines.push(` context: 'Imported from OpenAPI: ${operation.method.toUpperCase()} ${operation.path}',`);
145
+ lines.push(" },");
146
+ lines.push(" io: {");
147
+ if (inputModel) lines.push(` input: ${inputModel.name},`);
148
+ else lines.push(" input: null,");
149
+ if (outputModel) lines.push(` output: ${outputModel.name},`);
150
+ else lines.push(" output: null, // TODO: Define output schema");
151
+ lines.push(" },");
152
+ lines.push(" policy: {");
153
+ lines.push(` auth: '${auth}',`);
154
+ lines.push(" },");
155
+ lines.push(" transport: {");
156
+ lines.push(" rest: {");
157
+ lines.push(` method: '${operation.method.toUpperCase()}',`);
158
+ lines.push(` path: '${operation.path}',`);
159
+ lines.push(" },");
160
+ lines.push(" },");
161
+ lines.push("});");
162
+ return lines.join("\n");
163
+ }
164
+ /**
165
+ * Import operations from a parsed OpenAPI document.
166
+ */
167
+ function importFromOpenApi(parseResult, options = {}) {
168
+ const { tags, exclude = [], include } = options;
169
+ const specs = [];
170
+ const skipped = [];
171
+ const errors = [];
172
+ for (const operation of parseResult.operations) {
173
+ if (tags && tags.length > 0) {
174
+ if (!operation.tags.some((t) => tags.includes(t))) {
175
+ skipped.push({
176
+ sourceId: operation.operationId,
177
+ reason: `No matching tags (has: ${operation.tags.join(", ")})`
178
+ });
179
+ continue;
180
+ }
181
+ }
182
+ if (include && include.length > 0) {
183
+ if (!include.includes(operation.operationId)) {
184
+ skipped.push({
185
+ sourceId: operation.operationId,
186
+ reason: "Not in include list"
187
+ });
188
+ continue;
189
+ }
190
+ } else if (exclude.includes(operation.operationId)) {
191
+ skipped.push({
192
+ sourceId: operation.operationId,
193
+ reason: "In exclude list"
194
+ });
195
+ continue;
196
+ }
197
+ if (operation.deprecated && options.defaultStability !== "deprecated") {
198
+ skipped.push({
199
+ sourceId: operation.operationId,
200
+ reason: "Deprecated operation"
201
+ });
202
+ continue;
203
+ }
204
+ try {
205
+ const { schema: inputSchema } = buildInputSchema(operation);
206
+ const inputModel = inputSchema ? generateSchemaModelCode(inputSchema, `${operation.operationId}Input`) : null;
207
+ const outputSchema = getOutputSchema(operation);
208
+ const code = generateSpecCode(operation, options, inputModel, outputSchema ? generateSchemaModelCode(outputSchema, `${operation.operationId}Output`) : null);
209
+ const fileName = toFileName(toSpecName(operation.operationId, options.prefix));
210
+ const transportHints = { rest: {
211
+ method: operation.method.toUpperCase(),
212
+ path: operation.path,
213
+ params: {
214
+ path: operation.pathParams.map((p) => p.name),
215
+ query: operation.queryParams.map((p) => p.name),
216
+ header: operation.headerParams.map((p) => p.name),
217
+ cookie: operation.cookieParams.map((p) => p.name)
218
+ }
219
+ } };
220
+ const source = {
221
+ type: "openapi",
222
+ sourceId: operation.operationId,
223
+ operationId: operation.operationId,
224
+ openApiVersion: parseResult.version,
225
+ importedAt: /* @__PURE__ */ new Date()
226
+ };
227
+ specs.push({
228
+ spec: {},
229
+ code,
230
+ fileName,
231
+ source,
232
+ transportHints
233
+ });
234
+ } catch (error) {
235
+ errors.push({
236
+ sourceId: operation.operationId,
237
+ error: error instanceof Error ? error.message : String(error)
238
+ });
239
+ }
240
+ }
241
+ return {
242
+ specs,
243
+ skipped,
244
+ errors,
245
+ summary: {
246
+ total: parseResult.operations.length,
247
+ imported: specs.length,
248
+ skipped: skipped.length,
249
+ errors: errors.length
250
+ }
251
+ };
252
+ }
253
+
254
+ //#endregion
255
+ export { importFromOpenApi };
@@ -1 +1,4 @@
1
- import{d as e,f as t,i as n,n as r,r as i}from"./parser.js";import"./exporter.js";import{c as a,d as o,l as s,o as c,s as l}from"./schema-converter.js";import{f as u}from"./importer.js";
1
+ import { detectFormat, detectVersion, parseOpenApi, parseOpenApiDocument, parseOpenApiString } from "./parser.js";
2
+ import "./exporter.js";
3
+ import { generateImports, generateSchemaModelCode, getScalarType, jsonSchemaToField, jsonSchemaToType } from "./schema-converter.js";
4
+ import { importFromOpenApi } from "./importer.js";