@contractspec/lib.contracts-transformers 1.57.0 → 1.58.0

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 (135) hide show
  1. package/dist/browser/common/index.js +86 -0
  2. package/dist/browser/index.js +2414 -0
  3. package/dist/browser/openapi/index.js +2404 -0
  4. package/dist/common/index.d.ts +6 -3
  5. package/dist/common/index.d.ts.map +1 -0
  6. package/dist/common/index.js +87 -3
  7. package/dist/common/types.d.ts +119 -120
  8. package/dist/common/types.d.ts.map +1 -1
  9. package/dist/common/utils.d.ts +11 -14
  10. package/dist/common/utils.d.ts.map +1 -1
  11. package/dist/index.d.ts +18 -18
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +2415 -18
  14. package/dist/node/common/index.js +86 -0
  15. package/dist/node/index.js +2414 -0
  16. package/dist/node/openapi/index.js +2404 -0
  17. package/dist/openapi/differ.d.ts +21 -21
  18. package/dist/openapi/differ.d.ts.map +1 -1
  19. package/dist/openapi/exporter/data-views.d.ts +24 -25
  20. package/dist/openapi/exporter/data-views.d.ts.map +1 -1
  21. package/dist/openapi/exporter/events.d.ts +15 -15
  22. package/dist/openapi/exporter/events.d.ts.map +1 -1
  23. package/dist/openapi/exporter/features.d.ts +23 -24
  24. package/dist/openapi/exporter/features.d.ts.map +1 -1
  25. package/dist/openapi/exporter/forms.d.ts +17 -17
  26. package/dist/openapi/exporter/forms.d.ts.map +1 -1
  27. package/dist/openapi/exporter/index.d.ts +12 -0
  28. package/dist/openapi/exporter/index.d.ts.map +1 -0
  29. package/dist/openapi/exporter/operations.d.ts +29 -29
  30. package/dist/openapi/exporter/operations.d.ts.map +1 -1
  31. package/dist/openapi/exporter/presentations.d.ts +16 -17
  32. package/dist/openapi/exporter/presentations.d.ts.map +1 -1
  33. package/dist/openapi/exporter/registries.d.ts +13 -14
  34. package/dist/openapi/exporter/registries.d.ts.map +1 -1
  35. package/dist/openapi/exporter/workflows.d.ts +23 -24
  36. package/dist/openapi/exporter/workflows.d.ts.map +1 -1
  37. package/dist/openapi/exporter.d.ts +24 -23
  38. package/dist/openapi/exporter.d.ts.map +1 -1
  39. package/dist/openapi/exporter.test.d.ts +2 -0
  40. package/dist/openapi/exporter.test.d.ts.map +1 -0
  41. package/dist/openapi/importer/analyzer.d.ts +14 -0
  42. package/dist/openapi/importer/analyzer.d.ts.map +1 -0
  43. package/dist/openapi/importer/events.d.ts +7 -0
  44. package/dist/openapi/importer/events.d.ts.map +1 -0
  45. package/dist/openapi/importer/generator.d.ts +8 -0
  46. package/dist/openapi/importer/generator.d.ts.map +1 -0
  47. package/dist/openapi/importer/grouping.d.ts +27 -0
  48. package/dist/openapi/importer/grouping.d.ts.map +1 -0
  49. package/dist/openapi/importer/index.d.ts +11 -9
  50. package/dist/openapi/importer/index.d.ts.map +1 -1
  51. package/dist/openapi/importer/models.d.ts +7 -0
  52. package/dist/openapi/importer/models.d.ts.map +1 -0
  53. package/dist/openapi/importer/schemas.d.ts +15 -0
  54. package/dist/openapi/importer/schemas.d.ts.map +1 -0
  55. package/dist/openapi/importer.d.ts +6 -0
  56. package/dist/openapi/importer.d.ts.map +1 -0
  57. package/dist/openapi/index.d.ts +12 -16
  58. package/dist/openapi/index.d.ts.map +1 -0
  59. package/dist/openapi/index.js +2405 -18
  60. package/dist/openapi/parser/document.d.ts +5 -9
  61. package/dist/openapi/parser/document.d.ts.map +1 -1
  62. package/dist/openapi/parser/index.d.ts +6 -0
  63. package/dist/openapi/parser/index.d.ts.map +1 -0
  64. package/dist/openapi/parser/operation.d.ts +7 -0
  65. package/dist/openapi/parser/operation.d.ts.map +1 -0
  66. package/dist/openapi/parser/parameters.d.ts +11 -0
  67. package/dist/openapi/parser/parameters.d.ts.map +1 -0
  68. package/dist/openapi/parser/resolvers.d.ts +21 -0
  69. package/dist/openapi/parser/resolvers.d.ts.map +1 -0
  70. package/dist/openapi/parser/utils.d.ts +9 -8
  71. package/dist/openapi/parser/utils.d.ts.map +1 -1
  72. package/dist/openapi/parser.d.ts +6 -0
  73. package/dist/openapi/parser.d.ts.map +1 -0
  74. package/dist/openapi/schema-converter.d.ts +45 -45
  75. package/dist/openapi/schema-converter.d.ts.map +1 -1
  76. package/dist/openapi/schema-generators/index.d.ts +115 -0
  77. package/dist/openapi/schema-generators/index.d.ts.map +1 -0
  78. package/dist/openapi/schema-generators.test.d.ts +2 -0
  79. package/dist/openapi/schema-generators.test.d.ts.map +1 -0
  80. package/dist/openapi/types.d.ts +198 -198
  81. package/dist/openapi/types.d.ts.map +1 -1
  82. package/package.json +53 -20
  83. package/dist/common/utils.js +0 -103
  84. package/dist/common/utils.js.map +0 -1
  85. package/dist/openapi/differ.js +0 -222
  86. package/dist/openapi/differ.js.map +0 -1
  87. package/dist/openapi/exporter/data-views.js +0 -47
  88. package/dist/openapi/exporter/data-views.js.map +0 -1
  89. package/dist/openapi/exporter/events.js +0 -39
  90. package/dist/openapi/exporter/events.js.map +0 -1
  91. package/dist/openapi/exporter/features.js +0 -46
  92. package/dist/openapi/exporter/features.js.map +0 -1
  93. package/dist/openapi/exporter/forms.js +0 -49
  94. package/dist/openapi/exporter/forms.js.map +0 -1
  95. package/dist/openapi/exporter/index.js +0 -8
  96. package/dist/openapi/exporter/operations.js +0 -143
  97. package/dist/openapi/exporter/operations.js.map +0 -1
  98. package/dist/openapi/exporter/presentations.js +0 -60
  99. package/dist/openapi/exporter/presentations.js.map +0 -1
  100. package/dist/openapi/exporter/registries.js +0 -29
  101. package/dist/openapi/exporter/registries.js.map +0 -1
  102. package/dist/openapi/exporter/workflows.js +0 -54
  103. package/dist/openapi/exporter/workflows.js.map +0 -1
  104. package/dist/openapi/exporter.js +0 -122
  105. package/dist/openapi/exporter.js.map +0 -1
  106. package/dist/openapi/importer/analyzer.js +0 -28
  107. package/dist/openapi/importer/analyzer.js.map +0 -1
  108. package/dist/openapi/importer/events.js +0 -40
  109. package/dist/openapi/importer/events.js.map +0 -1
  110. package/dist/openapi/importer/generator.js +0 -105
  111. package/dist/openapi/importer/generator.js.map +0 -1
  112. package/dist/openapi/importer/grouping.js +0 -72
  113. package/dist/openapi/importer/grouping.js.map +0 -1
  114. package/dist/openapi/importer/index.js +0 -175
  115. package/dist/openapi/importer/index.js.map +0 -1
  116. package/dist/openapi/importer/models.js +0 -22
  117. package/dist/openapi/importer/models.js.map +0 -1
  118. package/dist/openapi/importer/schemas.js +0 -60
  119. package/dist/openapi/importer/schemas.js.map +0 -1
  120. package/dist/openapi/parser/document.js +0 -95
  121. package/dist/openapi/parser/document.js.map +0 -1
  122. package/dist/openapi/parser/index.js +0 -5
  123. package/dist/openapi/parser/operation.js +0 -59
  124. package/dist/openapi/parser/operation.js.map +0 -1
  125. package/dist/openapi/parser/parameters.js +0 -37
  126. package/dist/openapi/parser/parameters.js.map +0 -1
  127. package/dist/openapi/parser/resolvers.js +0 -63
  128. package/dist/openapi/parser/resolvers.js.map +0 -1
  129. package/dist/openapi/parser/utils.js +0 -48
  130. package/dist/openapi/parser/utils.js.map +0 -1
  131. package/dist/openapi/parser.js +0 -6
  132. package/dist/openapi/schema-converter.js +0 -161
  133. package/dist/openapi/schema-converter.js.map +0 -1
  134. package/dist/openapi/schema-generators/index.js +0 -461
  135. package/dist/openapi/schema-generators/index.js.map +0 -1
@@ -1,59 +0,0 @@
1
- import { generateOperationId } from "./utils.js";
2
- import { dereferenceSchema, isReference, resolveRef } from "./resolvers.js";
3
- import { parseParameters } from "./parameters.js";
4
-
5
- //#region src/openapi/parser/operation.ts
6
- /**
7
- * Parse a single operation.
8
- */
9
- function parseOperation(doc, method, path, operation, pathParams) {
10
- const params = parseParameters(doc, [...pathParams ?? [], ...operation.parameters ?? []]);
11
- let requestBody;
12
- if (operation.requestBody) {
13
- const body = isReference(operation.requestBody) ? resolveRef(doc, operation.requestBody.$ref) : operation.requestBody;
14
- if (body) {
15
- const contentType = Object.keys(body.content ?? {})[0] ?? "application/json";
16
- const content = body.content?.[contentType];
17
- if (content?.schema) requestBody = {
18
- required: body.required ?? false,
19
- schema: dereferenceSchema(doc, content.schema) ?? {},
20
- contentType
21
- };
22
- }
23
- }
24
- const responses = {};
25
- for (const [status, response] of Object.entries(operation.responses ?? {})) {
26
- const resolved = isReference(response) ? resolveRef(doc, response.$ref) : response;
27
- if (resolved) {
28
- const contentType = Object.keys(resolved.content ?? {})[0];
29
- const content = contentType ? resolved.content?.[contentType] : void 0;
30
- responses[status] = {
31
- description: resolved.description,
32
- schema: content?.schema ? dereferenceSchema(doc, content.schema) : void 0,
33
- contentType
34
- };
35
- }
36
- }
37
- const contractSpecMeta = operation?.["x-contractspec"];
38
- return {
39
- operationId: operation.operationId ?? generateOperationId(method, path),
40
- method,
41
- path,
42
- summary: operation.summary,
43
- description: operation.description,
44
- tags: operation.tags ?? [],
45
- pathParams: params.path,
46
- queryParams: params.query,
47
- headerParams: params.header,
48
- cookieParams: params.cookie,
49
- requestBody,
50
- responses,
51
- deprecated: operation.deprecated ?? false,
52
- security: operation.security,
53
- contractSpecMeta
54
- };
55
- }
56
-
57
- //#endregion
58
- export { parseOperation };
59
- //# sourceMappingURL=operation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"operation.js","names":[],"sources":["../../../src/openapi/parser/operation.ts"],"sourcesContent":["import type {\n HttpMethod,\n OpenApiDocument,\n OpenApiParameter,\n OpenApiSchema,\n ParsedOperation,\n} from '../types';\nimport type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport { dereferenceSchema, isReference, resolveRef } from './resolvers';\nimport { parseParameters } from './parameters';\nimport { generateOperationId } from './utils';\n\n/**\n * Parse a single operation.\n */\nexport function parseOperation(\n doc: OpenApiDocument,\n method: HttpMethod,\n path: string,\n operation: OpenAPIV3.OperationObject | OpenAPIV3_1.OperationObject,\n pathParams: OpenApiParameter[] | undefined\n): ParsedOperation {\n // Merge path-level and operation-level parameters\n const allParams = [...(pathParams ?? []), ...(operation.parameters ?? [])];\n const params = parseParameters(doc, allParams as OpenApiParameter[]);\n\n // Parse request body\n let requestBody: ParsedOperation['requestBody'];\n if (operation.requestBody) {\n const body = isReference(operation.requestBody)\n ? resolveRef<OpenAPIV3.RequestBodyObject | OpenAPIV3_1.RequestBodyObject>(\n doc,\n operation.requestBody.$ref\n )\n : operation.requestBody;\n\n if (body) {\n const contentType =\n Object.keys(body.content ?? {})[0] ?? 'application/json';\n const content = body.content?.[contentType];\n if (content?.schema) {\n requestBody = {\n required: body.required ?? false,\n schema:\n dereferenceSchema(doc, content.schema as OpenApiSchema) ??\n ({} as OpenApiSchema),\n contentType,\n };\n }\n }\n }\n\n // Parse responses\n const responses: ParsedOperation['responses'] = {};\n for (const [status, response] of Object.entries(operation.responses ?? {})) {\n const resolved = isReference(response)\n ? resolveRef<OpenAPIV3.ResponseObject | OpenAPIV3_1.ResponseObject>(\n doc,\n response.$ref\n )\n : response;\n\n if (resolved) {\n const contentType = Object.keys(resolved.content ?? {})[0];\n const content = contentType ? resolved.content?.[contentType] : undefined;\n\n responses[status] = {\n description: resolved.description,\n schema: content?.schema\n ? dereferenceSchema(doc, content.schema as OpenApiSchema)\n : undefined,\n contentType,\n };\n }\n }\n\n // Check for x-contractspec extension\n const contractSpecMeta = (operation as Record<string, unknown>)?.[\n 'x-contractspec'\n ] as ParsedOperation['contractSpecMeta'];\n\n return {\n operationId: operation.operationId ?? generateOperationId(method, path),\n method,\n path,\n summary: operation.summary,\n description: operation.description,\n tags: operation.tags ?? [],\n pathParams: params.path,\n queryParams: params.query,\n headerParams: params.header,\n cookieParams: params.cookie,\n requestBody,\n responses,\n deprecated: operation.deprecated ?? false,\n security: operation.security as ParsedOperation['security'],\n contractSpecMeta,\n };\n}\n"],"mappings":";;;;;;;;AAeA,SAAgB,eACd,KACA,QACA,MACA,WACA,YACiB;CAGjB,MAAM,SAAS,gBAAgB,KADb,CAAC,GAAI,cAAc,EAAE,EAAG,GAAI,UAAU,cAAc,EAAE,CAAE,CACN;CAGpE,IAAI;AACJ,KAAI,UAAU,aAAa;EACzB,MAAM,OAAO,YAAY,UAAU,YAAY,GAC3C,WACE,KACA,UAAU,YAAY,KACvB,GACD,UAAU;AAEd,MAAI,MAAM;GACR,MAAM,cACJ,OAAO,KAAK,KAAK,WAAW,EAAE,CAAC,CAAC,MAAM;GACxC,MAAM,UAAU,KAAK,UAAU;AAC/B,OAAI,SAAS,OACX,eAAc;IACZ,UAAU,KAAK,YAAY;IAC3B,QACE,kBAAkB,KAAK,QAAQ,OAAwB,IACtD,EAAE;IACL;IACD;;;CAMP,MAAM,YAA0C,EAAE;AAClD,MAAK,MAAM,CAAC,QAAQ,aAAa,OAAO,QAAQ,UAAU,aAAa,EAAE,CAAC,EAAE;EAC1E,MAAM,WAAW,YAAY,SAAS,GAClC,WACE,KACA,SAAS,KACV,GACD;AAEJ,MAAI,UAAU;GACZ,MAAM,cAAc,OAAO,KAAK,SAAS,WAAW,EAAE,CAAC,CAAC;GACxD,MAAM,UAAU,cAAc,SAAS,UAAU,eAAe;AAEhE,aAAU,UAAU;IAClB,aAAa,SAAS;IACtB,QAAQ,SAAS,SACb,kBAAkB,KAAK,QAAQ,OAAwB,GACvD;IACJ;IACD;;;CAKL,MAAM,mBAAoB,YACxB;AAGF,QAAO;EACL,aAAa,UAAU,eAAe,oBAAoB,QAAQ,KAAK;EACvE;EACA;EACA,SAAS,UAAU;EACnB,aAAa,UAAU;EACvB,MAAM,UAAU,QAAQ,EAAE;EAC1B,YAAY,OAAO;EACnB,aAAa,OAAO;EACpB,cAAc,OAAO;EACrB,cAAc,OAAO;EACrB;EACA;EACA,YAAY,UAAU,cAAc;EACpC,UAAU,UAAU;EACpB;EACD"}
@@ -1,37 +0,0 @@
1
- import { dereferenceSchema, isReference, resolveRef } from "./resolvers.js";
2
-
3
- //#region src/openapi/parser/parameters.ts
4
- /**
5
- * Parse parameters from an operation.
6
- */
7
- function parseParameters(doc, params) {
8
- const result = {
9
- path: [],
10
- query: [],
11
- header: [],
12
- cookie: []
13
- };
14
- if (!params) return result;
15
- for (const param of params) {
16
- let resolved;
17
- if (isReference(param)) {
18
- const ref = resolveRef(doc, param.$ref);
19
- if (!ref) continue;
20
- resolved = ref;
21
- } else resolved = param;
22
- const parsed = {
23
- name: resolved.name,
24
- in: resolved.in,
25
- required: resolved.required ?? resolved.in === "path",
26
- description: resolved.description,
27
- schema: dereferenceSchema(doc, resolved.schema),
28
- deprecated: resolved.deprecated ?? false
29
- };
30
- result[resolved.in]?.push(parsed);
31
- }
32
- return result;
33
- }
34
-
35
- //#endregion
36
- export { parseParameters };
37
- //# sourceMappingURL=parameters.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parameters.js","names":[],"sources":["../../../src/openapi/parser/parameters.ts"],"sourcesContent":["import type {\n OpenApiDocument,\n OpenApiParameter,\n ParsedParameter,\n OpenApiSchema,\n} from '../types';\nimport type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\nimport { isReference, resolveRef, dereferenceSchema } from './resolvers';\n\n/**\n * Parse parameters from an operation.\n */\nexport function parseParameters(\n doc: OpenApiDocument,\n params: OpenApiParameter[] | undefined\n): {\n path: ParsedParameter[];\n query: ParsedParameter[];\n header: ParsedParameter[];\n cookie: ParsedParameter[];\n} {\n const result = {\n path: [] as ParsedParameter[],\n query: [] as ParsedParameter[],\n header: [] as ParsedParameter[],\n cookie: [] as ParsedParameter[],\n };\n\n if (!params) return result;\n\n for (const param of params) {\n let resolved: OpenAPIV3.ParameterObject | OpenAPIV3_1.ParameterObject;\n\n if (isReference(param)) {\n const ref = resolveRef<\n OpenAPIV3.ParameterObject | OpenAPIV3_1.ParameterObject\n >(doc, param.$ref);\n if (!ref) continue;\n resolved = ref;\n } else {\n resolved = param;\n }\n\n const parsed: ParsedParameter = {\n name: resolved.name,\n in: resolved.in as ParsedParameter['in'],\n required: resolved.required ?? resolved.in === 'path',\n description: resolved.description,\n schema: dereferenceSchema(\n doc,\n resolved.schema as OpenApiSchema\n ) as OpenApiSchema,\n deprecated: resolved.deprecated ?? false,\n };\n\n result[resolved.in as keyof typeof result]?.push(parsed);\n }\n\n return result;\n}\n"],"mappings":";;;;;;AAYA,SAAgB,gBACd,KACA,QAMA;CACA,MAAM,SAAS;EACb,MAAM,EAAE;EACR,OAAO,EAAE;EACT,QAAQ,EAAE;EACV,QAAQ,EAAE;EACX;AAED,KAAI,CAAC,OAAQ,QAAO;AAEpB,MAAK,MAAM,SAAS,QAAQ;EAC1B,IAAI;AAEJ,MAAI,YAAY,MAAM,EAAE;GACtB,MAAM,MAAM,WAEV,KAAK,MAAM,KAAK;AAClB,OAAI,CAAC,IAAK;AACV,cAAW;QAEX,YAAW;EAGb,MAAM,SAA0B;GAC9B,MAAM,SAAS;GACf,IAAI,SAAS;GACb,UAAU,SAAS,YAAY,SAAS,OAAO;GAC/C,aAAa,SAAS;GACtB,QAAQ,kBACN,KACA,SAAS,OACV;GACD,YAAY,SAAS,cAAc;GACpC;AAED,SAAO,SAAS,KAA4B,KAAK,OAAO;;AAG1D,QAAO"}
@@ -1,63 +0,0 @@
1
- //#region src/openapi/parser/resolvers.ts
2
- /**
3
- * Check if a value is a reference object.
4
- */
5
- function isReference(obj) {
6
- return typeof obj === "object" && obj !== null && "$ref" in obj;
7
- }
8
- /**
9
- * Resolve a $ref reference in the document.
10
- */
11
- function resolveRef(doc, ref) {
12
- if (!ref.startsWith("#/")) return;
13
- const path = ref.slice(2).split("/");
14
- let current = doc;
15
- for (const part of path) {
16
- if (current === null || current === void 0) return void 0;
17
- if (typeof current !== "object") return void 0;
18
- current = current[part];
19
- }
20
- return current;
21
- }
22
- /**
23
- * Recursively dereference a schema.
24
- * Replaces all $ref with their resolved values.
25
- * Preserves `_originalRef` to track where the schema came from.
26
- */
27
- function dereferenceSchema(doc, schema, seen = /* @__PURE__ */ new Set()) {
28
- if (!schema) return void 0;
29
- if (isReference(schema)) {
30
- if (seen.has(schema.$ref)) return schema;
31
- const newSeen = new Set(seen);
32
- newSeen.add(schema.$ref);
33
- const resolved = resolveRef(doc, schema.$ref);
34
- if (!resolved) return schema;
35
- const dereferenced = dereferenceSchema(doc, resolved, newSeen);
36
- if (!dereferenced) return schema;
37
- const refParts = schema.$ref.split("/");
38
- const typeName = refParts[refParts.length - 1];
39
- return {
40
- ...dereferenced,
41
- _originalRef: schema.$ref,
42
- _originalTypeName: typeName
43
- };
44
- }
45
- const schemaObj = { ...schema };
46
- if (schemaObj.properties) {
47
- const props = schemaObj.properties;
48
- const newProps = {};
49
- for (const [key, prop] of Object.entries(props)) newProps[key] = dereferenceSchema(doc, prop, seen) ?? prop;
50
- schemaObj.properties = newProps;
51
- }
52
- if (schemaObj.items) schemaObj.items = dereferenceSchema(doc, schemaObj.items, seen);
53
- for (const comb of [
54
- "allOf",
55
- "anyOf",
56
- "oneOf"
57
- ]) if (Array.isArray(schemaObj[comb])) schemaObj[comb] = schemaObj[comb].map((s) => dereferenceSchema(doc, s, seen) ?? s);
58
- return schemaObj;
59
- }
60
-
61
- //#endregion
62
- export { dereferenceSchema, isReference, resolveRef };
63
- //# sourceMappingURL=resolvers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolvers.js","names":[],"sources":["../../../src/openapi/parser/resolvers.ts"],"sourcesContent":["import type { OpenApiDocument, OpenApiSchema } from '../types';\nimport type { OpenAPIV3, OpenAPIV3_1 } from 'openapi-types';\n\n/**\n * Check if a value is a reference object.\n */\nexport function isReference(\n obj: unknown\n): obj is OpenAPIV3.ReferenceObject | OpenAPIV3_1.ReferenceObject {\n return typeof obj === 'object' && obj !== null && '$ref' in obj;\n}\n\n/**\n * Resolve a $ref reference in the document.\n */\nexport function resolveRef<T>(\n doc: OpenApiDocument,\n ref: string\n): T | undefined {\n // Only support local refs for now\n if (!ref.startsWith('#/')) {\n return undefined;\n }\n\n const path = ref.slice(2).split('/');\n let current: unknown = doc;\n\n for (const part of path) {\n if (current === null || current === undefined) return undefined;\n if (typeof current !== 'object') return undefined;\n current = (current as Record<string, unknown>)[part];\n }\n\n return current as T;\n}\n\n/**\n * Resolve a schema, following $ref if needed.\n */\nexport function resolveSchema(\n doc: OpenApiDocument,\n schema: OpenApiSchema | undefined\n): OpenApiSchema | undefined {\n if (!schema) return undefined;\n if (isReference(schema)) {\n return resolveRef<OpenApiSchema>(doc, schema.$ref) ?? schema;\n }\n return schema;\n}\n\n/**\n * Recursively dereference a schema.\n * Replaces all $ref with their resolved values.\n * Preserves `_originalRef` to track where the schema came from.\n */\nexport function dereferenceSchema(\n doc: OpenApiDocument,\n schema: OpenApiSchema | undefined,\n seen = new Set<string>()\n): OpenApiSchema | undefined {\n if (!schema) return undefined;\n\n // Handle references\n if (isReference(schema)) {\n // Avoid infinite recursion for cycles\n if (seen.has(schema.$ref)) {\n return schema; // Keep reference for cycles\n }\n\n // Create new seen set for this branch\n const newSeen = new Set(seen);\n newSeen.add(schema.$ref);\n\n const resolved = resolveRef<OpenApiSchema>(doc, schema.$ref);\n if (!resolved) return schema;\n\n // Recursively dereference the resolved schema\n const dereferenced = dereferenceSchema(doc, resolved, newSeen);\n if (!dereferenced) return schema;\n\n // IMPORTANT: Preserve the original $ref so we can generate correct imports\n // Extract the type name from the $ref (e.g., '#/components/schemas/PaginationMeta' -> 'PaginationMeta')\n const refParts = schema.$ref.split('/');\n const typeName = refParts[refParts.length - 1];\n return {\n ...dereferenced,\n _originalRef: schema.$ref,\n _originalTypeName: typeName,\n } as unknown as OpenApiSchema;\n }\n\n // Deep clone to avoid mutating original doc (if we were modifying in place, but here we return new objects mostly)\n // For simplicity, we just walk properties\n const schemaObj = { ...schema } as Record<string, unknown>;\n\n // Handle nested schemas in properties\n if (schemaObj.properties) {\n const props = schemaObj.properties as Record<string, OpenApiSchema>;\n const newProps: Record<string, OpenApiSchema> = {};\n for (const [key, prop] of Object.entries(props)) {\n newProps[key] = dereferenceSchema(doc, prop, seen) ?? prop;\n }\n schemaObj.properties = newProps;\n }\n\n // Handle nested schema in items (array)\n if (schemaObj.items) {\n schemaObj.items = dereferenceSchema(\n doc,\n schemaObj.items as OpenApiSchema,\n seen\n );\n }\n\n // Handle allOf, anyOf, oneOf\n const combinators = ['allOf', 'anyOf', 'oneOf'];\n for (const comb of combinators) {\n if (Array.isArray(schemaObj[comb])) {\n schemaObj[comb] = (schemaObj[comb] as OpenApiSchema[]).map(\n (s) => dereferenceSchema(doc, s, seen) ?? s\n );\n }\n }\n\n return schemaObj as OpenApiSchema;\n}\n"],"mappings":";;;;AAMA,SAAgB,YACd,KACgE;AAChE,QAAO,OAAO,QAAQ,YAAY,QAAQ,QAAQ,UAAU;;;;;AAM9D,SAAgB,WACd,KACA,KACe;AAEf,KAAI,CAAC,IAAI,WAAW,KAAK,CACvB;CAGF,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC,MAAM,IAAI;CACpC,IAAI,UAAmB;AAEvB,MAAK,MAAM,QAAQ,MAAM;AACvB,MAAI,YAAY,QAAQ,YAAY,OAAW,QAAO;AACtD,MAAI,OAAO,YAAY,SAAU,QAAO;AACxC,YAAW,QAAoC;;AAGjD,QAAO;;;;;;;AAsBT,SAAgB,kBACd,KACA,QACA,uBAAO,IAAI,KAAa,EACG;AAC3B,KAAI,CAAC,OAAQ,QAAO;AAGpB,KAAI,YAAY,OAAO,EAAE;AAEvB,MAAI,KAAK,IAAI,OAAO,KAAK,CACvB,QAAO;EAIT,MAAM,UAAU,IAAI,IAAI,KAAK;AAC7B,UAAQ,IAAI,OAAO,KAAK;EAExB,MAAM,WAAW,WAA0B,KAAK,OAAO,KAAK;AAC5D,MAAI,CAAC,SAAU,QAAO;EAGtB,MAAM,eAAe,kBAAkB,KAAK,UAAU,QAAQ;AAC9D,MAAI,CAAC,aAAc,QAAO;EAI1B,MAAM,WAAW,OAAO,KAAK,MAAM,IAAI;EACvC,MAAM,WAAW,SAAS,SAAS,SAAS;AAC5C,SAAO;GACL,GAAG;GACH,cAAc,OAAO;GACrB,mBAAmB;GACpB;;CAKH,MAAM,YAAY,EAAE,GAAG,QAAQ;AAG/B,KAAI,UAAU,YAAY;EACxB,MAAM,QAAQ,UAAU;EACxB,MAAM,WAA0C,EAAE;AAClD,OAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,MAAM,CAC7C,UAAS,OAAO,kBAAkB,KAAK,MAAM,KAAK,IAAI;AAExD,YAAU,aAAa;;AAIzB,KAAI,UAAU,MACZ,WAAU,QAAQ,kBAChB,KACA,UAAU,OACV,KACD;AAKH,MAAK,MAAM,QADS;EAAC;EAAS;EAAS;EAAQ,CAE7C,KAAI,MAAM,QAAQ,UAAU,MAAM,CAChC,WAAU,QAAS,UAAU,MAA0B,KACpD,MAAM,kBAAkB,KAAK,GAAG,KAAK,IAAI,EAC3C;AAIL,QAAO"}
@@ -1,48 +0,0 @@
1
- import { parse } from "yaml";
2
-
3
- //#region src/openapi/parser/utils.ts
4
- const HTTP_METHODS = [
5
- "get",
6
- "post",
7
- "put",
8
- "delete",
9
- "patch",
10
- "head",
11
- "options",
12
- "trace"
13
- ];
14
- /**
15
- * Parse an OpenAPI document from a string (JSON or YAML).
16
- */
17
- function parseOpenApiString(content, format = "json") {
18
- if (format === "yaml") return parse(content);
19
- return JSON.parse(content);
20
- }
21
- /**
22
- * Detect the format of content (JSON or YAML).
23
- */
24
- function detectFormat(content) {
25
- const trimmed = content.trim();
26
- if (trimmed.startsWith("{") || trimmed.startsWith("[")) return "json";
27
- return "yaml";
28
- }
29
- /**
30
- * Detect OpenAPI version from document.
31
- */
32
- function detectVersion(doc) {
33
- if (doc.openapi.startsWith("3.1")) return "3.1";
34
- return "3.0";
35
- }
36
- /**
37
- * Generate an operationId if not present.
38
- */
39
- function generateOperationId(method, path) {
40
- return method + path.split("/").filter(Boolean).map((part) => {
41
- if (part.startsWith("{") && part.endsWith("}")) return "By" + part.slice(1, -1).charAt(0).toUpperCase() + part.slice(2, -1);
42
- return part.charAt(0).toUpperCase() + part.slice(1);
43
- }).join("");
44
- }
45
-
46
- //#endregion
47
- export { HTTP_METHODS, detectFormat, detectVersion, generateOperationId, parseOpenApiString };
48
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","names":["parseYaml"],"sources":["../../../src/openapi/parser/utils.ts"],"sourcesContent":["import { parse as parseYaml } from 'yaml';\nimport type { OpenApiDocument, HttpMethod, OpenApiVersion } from '../types';\n\nexport const HTTP_METHODS: HttpMethod[] = [\n 'get',\n 'post',\n 'put',\n 'delete',\n 'patch',\n 'head',\n 'options',\n 'trace',\n];\n\n/**\n * Parse an OpenAPI document from a string (JSON or YAML).\n */\nexport function parseOpenApiString(\n content: string,\n format: 'json' | 'yaml' = 'json'\n): OpenApiDocument {\n if (format === 'yaml') {\n return parseYaml(content) as OpenApiDocument;\n }\n return JSON.parse(content) as OpenApiDocument;\n}\n\n/**\n * Detect the format of content (JSON or YAML).\n */\nexport function detectFormat(content: string): 'json' | 'yaml' {\n const trimmed = content.trim();\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return 'json';\n }\n return 'yaml';\n}\n\n/**\n * Detect OpenAPI version from document.\n */\nexport function detectVersion(doc: OpenApiDocument): OpenApiVersion {\n const version = doc.openapi;\n if (version.startsWith('3.1')) {\n return '3.1';\n }\n return '3.0';\n}\n\n/**\n * Generate an operationId if not present.\n */\nexport function generateOperationId(method: HttpMethod, path: string): string {\n // Convert path to camelCase operationId\n const pathParts = path\n .split('/')\n .filter(Boolean)\n .map((part) => {\n // Remove path parameters\n if (part.startsWith('{') && part.endsWith('}')) {\n return (\n 'By' + part.slice(1, -1).charAt(0).toUpperCase() + part.slice(2, -1)\n );\n }\n return part.charAt(0).toUpperCase() + part.slice(1);\n });\n\n return method + pathParts.join('');\n}\n"],"mappings":";;;AAGA,MAAa,eAA6B;CACxC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;AAKD,SAAgB,mBACd,SACA,SAA0B,QACT;AACjB,KAAI,WAAW,OACb,QAAOA,MAAU,QAAQ;AAE3B,QAAO,KAAK,MAAM,QAAQ;;;;;AAM5B,SAAgB,aAAa,SAAkC;CAC7D,MAAM,UAAU,QAAQ,MAAM;AAC9B,KAAI,QAAQ,WAAW,IAAI,IAAI,QAAQ,WAAW,IAAI,CACpD,QAAO;AAET,QAAO;;;;;AAMT,SAAgB,cAAc,KAAsC;AAElE,KADgB,IAAI,QACR,WAAW,MAAM,CAC3B,QAAO;AAET,QAAO;;;;;AAMT,SAAgB,oBAAoB,QAAoB,MAAsB;AAe5E,QAAO,SAbW,KACf,MAAM,IAAI,CACV,OAAO,QAAQ,CACf,KAAK,SAAS;AAEb,MAAI,KAAK,WAAW,IAAI,IAAI,KAAK,SAAS,IAAI,CAC5C,QACE,OAAO,KAAK,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,GAAG,GAAG;AAGxE,SAAO,KAAK,OAAO,EAAE,CAAC,aAAa,GAAG,KAAK,MAAM,EAAE;GACnD,CAEsB,KAAK,GAAG"}
@@ -1,6 +0,0 @@
1
- import { HTTP_METHODS, detectFormat, detectVersion, generateOperationId, parseOpenApiString } from "./parser/utils.js";
2
- import { dereferenceSchema, isReference, resolveRef } from "./parser/resolvers.js";
3
- import { parseParameters } from "./parser/parameters.js";
4
- import { parseOperation } from "./parser/operation.js";
5
- import { parseOpenApi, parseOpenApiDocument } from "./parser/document.js";
6
- import "./parser/index.js";
@@ -1,161 +0,0 @@
1
- import { toPascalCase } from "../common/utils.js";
2
- import { createSchemaGenerator } from "./schema-generators/index.js";
3
-
4
- //#region src/openapi/schema-converter.ts
5
- /**
6
- * JSON Schema to SchemaModel conversion utilities.
7
- * Converts OpenAPI JSON Schema to ContractSpec SchemaModel definitions.
8
- */
9
- /**
10
- * Map JSON Schema types to ContractSpec ScalarTypeEnum values.
11
- */
12
- const JSON_SCHEMA_TO_SCALAR = {
13
- string: "ScalarTypeEnum.String_unsecure",
14
- integer: "ScalarTypeEnum.Int_unsecure",
15
- number: "ScalarTypeEnum.Float_unsecure",
16
- boolean: "ScalarTypeEnum.Boolean",
17
- "string:date": "ScalarTypeEnum.Date",
18
- "string:date-time": "ScalarTypeEnum.DateTime",
19
- "string:email": "ScalarTypeEnum.EmailAddress",
20
- "string:uri": "ScalarTypeEnum.URL",
21
- "string:uuid": "ScalarTypeEnum.ID"
22
- };
23
- /**
24
- * Check if a schema is a reference object.
25
- */
26
- function isReference(schema) {
27
- return typeof schema === "object" && schema !== null && "$ref" in schema;
28
- }
29
- /**
30
- * Extract type name from a $ref.
31
- */
32
- function typeNameFromRef(ref) {
33
- const parts = ref.split("/");
34
- return parts[parts.length - 1] ?? "Unknown";
35
- }
36
- /**
37
- * Convert a JSON Schema to a TypeScript type representation.
38
- */
39
- function jsonSchemaToType(schema, name) {
40
- if (isReference(schema)) return {
41
- type: toPascalCase(typeNameFromRef(schema.$ref)),
42
- optional: false,
43
- array: false,
44
- primitive: false,
45
- isReference: true
46
- };
47
- const schemaObj = schema;
48
- const type = schemaObj["type"];
49
- const format = schemaObj["format"];
50
- const nullable = schemaObj["nullable"];
51
- const originalTypeName = schemaObj["_originalTypeName"];
52
- if (originalTypeName) return {
53
- type: toPascalCase(originalTypeName),
54
- optional: nullable ?? false,
55
- array: false,
56
- primitive: false,
57
- isReference: true
58
- };
59
- if (type === "array") {
60
- const items = schemaObj["items"];
61
- if (items) return {
62
- ...jsonSchemaToType(items, name),
63
- array: true,
64
- optional: nullable ?? false
65
- };
66
- return {
67
- type: "unknown",
68
- optional: nullable ?? false,
69
- array: true,
70
- primitive: false,
71
- isReference: true
72
- };
73
- }
74
- if (type === "object" || schemaObj["properties"]) return {
75
- type: name ? toPascalCase(name) : "Record<string, unknown>",
76
- optional: nullable ?? false,
77
- array: false,
78
- primitive: false,
79
- isReference: true
80
- };
81
- if (schemaObj["enum"]) return {
82
- type: name ? toPascalCase(name) : "string",
83
- optional: nullable ?? false,
84
- array: false,
85
- primitive: false,
86
- isReference: true
87
- };
88
- const scalarKey = format ? `${type}:${format}` : type;
89
- if (scalarKey === "string") return {
90
- type: "string",
91
- optional: nullable ?? false,
92
- array: false,
93
- primitive: true
94
- };
95
- if (scalarKey === "integer" || type === "number") return {
96
- type: "number",
97
- optional: nullable ?? false,
98
- array: false,
99
- primitive: true
100
- };
101
- if (scalarKey === "boolean") return {
102
- type: "boolean",
103
- optional: nullable ?? false,
104
- array: false,
105
- primitive: true
106
- };
107
- return {
108
- type: "unknown",
109
- optional: nullable ?? false,
110
- array: false,
111
- primitive: false,
112
- isReference: true
113
- };
114
- }
115
- /**
116
- * Get the ScalarTypeEnum value for a JSON Schema type.
117
- */
118
- function getScalarType(schema) {
119
- if (isReference(schema)) return;
120
- const schemaObj = schema;
121
- const type = schemaObj["type"];
122
- const format = schemaObj["format"];
123
- if (!type) return void 0;
124
- if (type === "array") {
125
- const items = schemaObj["items"];
126
- if (items) return getScalarType(items);
127
- return;
128
- }
129
- return JSON_SCHEMA_TO_SCALAR[format ? `${type}:${format}` : type] ?? JSON_SCHEMA_TO_SCALAR[type] ?? void 0;
130
- }
131
- /**
132
- * Generate code for a schema model using the specified format.
133
- */
134
- function generateSchemaModelCode(schema, modelName, schemaFormat = "contractspec", config) {
135
- const result = createSchemaGenerator(schemaFormat, config).generateModel(schema, modelName, { description: schema["description"] });
136
- return {
137
- name: result.name,
138
- description: schema["description"],
139
- fields: [],
140
- code: result.code,
141
- imports: result.imports
142
- };
143
- }
144
- /**
145
- * Generate import statements for a SchemaModel.
146
- */
147
- function generateImports(fields, options, sameDirectory = true) {
148
- const imports = /* @__PURE__ */ new Set();
149
- const modelsDir = sameDirectory ? "." : `../${options.conventions.models}`;
150
- imports.add("import { defineSchemaModel, ScalarTypeEnum, EnumType } from '@contractspec/lib.schema';");
151
- for (const field of fields) if (field.type.isReference && !field.type.primitive && !field.enumValues && !field.scalarType && !field.nestedModel) {
152
- const modelName = field.type.type;
153
- const kebabName = modelName.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
154
- imports.add(`import { ${modelName} } from '${modelsDir}/${kebabName}';`);
155
- }
156
- return Array.from(imports).join("\n");
157
- }
158
-
159
- //#endregion
160
- export { generateImports, generateSchemaModelCode, getScalarType, jsonSchemaToType };
161
- //# sourceMappingURL=schema-converter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema-converter.js","names":[],"sources":["../../src/openapi/schema-converter.ts"],"sourcesContent":["/**\n * JSON Schema to SchemaModel conversion utilities.\n * Converts OpenAPI JSON Schema to ContractSpec SchemaModel definitions.\n */\n\nimport { createSchemaGenerator } from './schema-generators';\nimport type {\n SchemaFormat,\n ResolvedContractsrcConfig,\n} from '@contractspec/lib.contracts';\nimport type { OpenApiSchema } from './types';\nimport { toPascalCase } from '../common/utils';\n\n/**\n * Map JSON Schema types to ContractSpec ScalarTypeEnum values.\n */\nconst JSON_SCHEMA_TO_SCALAR: Record<string, string> = {\n string: 'ScalarTypeEnum.String_unsecure',\n integer: 'ScalarTypeEnum.Int_unsecure',\n number: 'ScalarTypeEnum.Float_unsecure',\n boolean: 'ScalarTypeEnum.Boolean',\n // Special formats\n 'string:date': 'ScalarTypeEnum.Date',\n 'string:date-time': 'ScalarTypeEnum.DateTime',\n 'string:email': 'ScalarTypeEnum.EmailAddress',\n 'string:uri': 'ScalarTypeEnum.URL',\n 'string:uuid': 'ScalarTypeEnum.ID',\n};\n\n/**\n * TypeScript type representation for code generation.\n */\nexport interface TypescriptType {\n /** The type expression (e.g., \"string\", \"number\", \"MyModel\") */\n type: string;\n /** Whether the type is optional */\n optional: boolean;\n /** Whether the type is an array */\n array: boolean;\n /** Whether this is a primitive type */\n primitive: boolean;\n /** Description for documentation */\n description?: string;\n /** Whether this type is a reference to another schema (needs import) vs inline */\n isReference?: boolean;\n}\n\n/**\n * SchemaModel field representation for code generation.\n */\nexport interface SchemaField {\n /** Field name */\n name: string;\n /** Field type */\n type: TypescriptType;\n /** Scalar type enum value (for FieldType) */\n scalarType?: string;\n /** Enum values if this is an enum type */\n enumValues?: string[];\n /** Nested model if this is an object type */\n nestedModel?: GeneratedModel;\n}\n\n/**\n * Generated model representation.\n */\nexport interface GeneratedModel {\n /** Model name (PascalCase) */\n name: string;\n /** Model description */\n description?: string;\n /** Fields */\n fields: SchemaField[];\n /** Generated TypeScript code */\n code: string;\n /** Required imports */\n imports?: string[];\n}\n\n/**\n * Check if a schema is a reference object.\n */\nfunction isReference(schema: OpenApiSchema): schema is { $ref: string } {\n return typeof schema === 'object' && schema !== null && '$ref' in schema;\n}\n\n/**\n * Extract type name from a $ref.\n */\nfunction typeNameFromRef(ref: string): string {\n const parts = ref.split('/');\n return parts[parts.length - 1] ?? 'Unknown';\n}\n\n/**\n * Convert a JSON Schema to a TypeScript type representation.\n */\nexport function jsonSchemaToType(\n schema: OpenApiSchema,\n name?: string\n): TypescriptType {\n if (isReference(schema)) {\n return {\n type: toPascalCase(typeNameFromRef(schema.$ref)),\n optional: false,\n array: false,\n primitive: false,\n isReference: true,\n };\n }\n\n const schemaObj = schema as Record<string, unknown>;\n const type = schemaObj['type'] as string | undefined;\n const format = schemaObj['format'] as string | undefined;\n const nullable = schemaObj['nullable'] as boolean | undefined;\n\n // Check if this schema was dereferenced from a $ref - use the original type name\n const originalTypeName = schemaObj['_originalTypeName'] as string | undefined;\n if (originalTypeName) {\n return {\n type: toPascalCase(originalTypeName),\n optional: nullable ?? false,\n array: false,\n primitive: false,\n isReference: true,\n };\n }\n\n // Handle arrays\n if (type === 'array') {\n const items = schemaObj['items'] as OpenApiSchema | undefined;\n if (items) {\n const itemType = jsonSchemaToType(items, name);\n return {\n ...itemType,\n array: true,\n optional: nullable ?? false,\n };\n }\n return {\n type: 'unknown',\n optional: nullable ?? false,\n array: true,\n primitive: false,\n isReference: true,\n };\n }\n\n // Handle objects\n if (type === 'object' || schemaObj['properties']) {\n return {\n type: name ? toPascalCase(name) : 'Record<string, unknown>',\n optional: nullable ?? false,\n array: false,\n primitive: false,\n isReference: true,\n };\n }\n\n // Handle enums\n if (schemaObj['enum']) {\n return {\n type: name ? toPascalCase(name) : 'string',\n optional: nullable ?? false,\n array: false,\n primitive: false,\n isReference: true,\n };\n }\n\n // Handle primitives\n const scalarKey = format ? `${type}:${format}` : type;\n if (scalarKey === 'string') {\n return {\n type: 'string',\n optional: nullable ?? false,\n array: false,\n primitive: true,\n };\n }\n if (scalarKey === 'integer' || type === 'number') {\n return {\n type: 'number',\n optional: nullable ?? false,\n array: false,\n primitive: true,\n };\n }\n if (scalarKey === 'boolean') {\n return {\n type: 'boolean',\n optional: nullable ?? false,\n array: false,\n primitive: true,\n };\n }\n\n // Default to unknown\n return {\n type: 'unknown',\n optional: nullable ?? false,\n array: false,\n primitive: false,\n isReference: true,\n };\n}\n\n/**\n * Get the ScalarTypeEnum value for a JSON Schema type.\n */\nexport function getScalarType(schema: OpenApiSchema): string | undefined {\n if (isReference(schema)) {\n return undefined;\n }\n\n const schemaObj = schema as Record<string, unknown>;\n const type = schemaObj['type'] as string | undefined;\n const format = schemaObj['format'] as string | undefined;\n\n if (!type) return undefined;\n\n // For arrays, get the scalar type of the items\n if (type === 'array') {\n const items = schemaObj['items'] as OpenApiSchema | undefined;\n if (items) {\n return getScalarType(items);\n }\n return undefined;\n }\n\n const key = format ? `${type}:${format}` : type;\n return JSON_SCHEMA_TO_SCALAR[key] ?? JSON_SCHEMA_TO_SCALAR[type] ?? undefined;\n}\n\n/**\n * Generate code for a schema model using the specified format.\n */\nexport function generateSchemaModelCode(\n schema: OpenApiSchema,\n modelName: string,\n schemaFormat: SchemaFormat = 'contractspec',\n config?: ResolvedContractsrcConfig\n): GeneratedModel {\n const generator = createSchemaGenerator(schemaFormat, config);\n const result = generator.generateModel(schema, modelName, {\n description: (schema as Record<string, unknown>)['description'] as string,\n });\n\n return {\n name: result.name,\n description: (schema as Record<string, unknown>)['description'] as string,\n fields: [], // fields are processed internally by generators now\n code: result.code,\n imports: result.imports,\n };\n}\n\n/**\n * Generate import statements for a SchemaModel.\n */\nexport function generateImports(\n fields: SchemaField[],\n options: ResolvedContractsrcConfig,\n sameDirectory = true\n): string {\n const imports = new Set<string>();\n const modelsDir = sameDirectory ? '.' : `../${options.conventions.models}`;\n\n imports.add(\n \"import { defineSchemaModel, ScalarTypeEnum, EnumType } from '@contractspec/lib.schema';\"\n );\n\n for (const field of fields) {\n // Only import fields that are actual references to other schemas (not inline types)\n if (\n field.type.isReference &&\n !field.type.primitive &&\n !field.enumValues &&\n !field.scalarType &&\n !field.nestedModel\n ) {\n // This is a reference to another schema model\n const modelName = field.type.type;\n const kebabName = modelName\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .toLowerCase();\n imports.add(`import { ${modelName} } from '${modelsDir}/${kebabName}';`);\n }\n }\n\n return Array.from(imports).join('\\n');\n}\n"],"mappings":"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"}