@medusajs/http-types-generator 2.13.6-preview-20260402101111

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 (111) hide show
  1. package/README.md +135 -0
  2. package/dist/__tests__/compatibility-checker.spec.d.ts +2 -0
  3. package/dist/__tests__/compatibility-checker.spec.d.ts.map +1 -0
  4. package/dist/__tests__/compatibility-checker.spec.js +231 -0
  5. package/dist/__tests__/compatibility-checker.spec.js.map +1 -0
  6. package/dist/__tests__/config.spec.d.ts +2 -0
  7. package/dist/__tests__/config.spec.d.ts.map +1 -0
  8. package/dist/__tests__/config.spec.js +78 -0
  9. package/dist/__tests__/config.spec.js.map +1 -0
  10. package/dist/__tests__/import-tracker.spec.d.ts +2 -0
  11. package/dist/__tests__/import-tracker.spec.d.ts.map +1 -0
  12. package/dist/__tests__/import-tracker.spec.js +25 -0
  13. package/dist/__tests__/import-tracker.spec.js.map +1 -0
  14. package/dist/__tests__/name-classifier.spec.d.ts +2 -0
  15. package/dist/__tests__/name-classifier.spec.d.ts.map +1 -0
  16. package/dist/__tests__/name-classifier.spec.js +77 -0
  17. package/dist/__tests__/name-classifier.spec.js.map +1 -0
  18. package/dist/__tests__/name-registry.spec.d.ts +2 -0
  19. package/dist/__tests__/name-registry.spec.d.ts.map +1 -0
  20. package/dist/__tests__/name-registry.spec.js +67 -0
  21. package/dist/__tests__/name-registry.spec.js.map +1 -0
  22. package/dist/__tests__/path-mapper.spec.d.ts +2 -0
  23. package/dist/__tests__/path-mapper.spec.d.ts.map +1 -0
  24. package/dist/__tests__/path-mapper.spec.js +98 -0
  25. package/dist/__tests__/path-mapper.spec.js.map +1 -0
  26. package/dist/__tests__/type-emitter.spec.d.ts +2 -0
  27. package/dist/__tests__/type-emitter.spec.d.ts.map +1 -0
  28. package/dist/__tests__/type-emitter.spec.js +173 -0
  29. package/dist/__tests__/type-emitter.spec.js.map +1 -0
  30. package/dist/__tests__/type-pipeline.spec.d.ts +2 -0
  31. package/dist/__tests__/type-pipeline.spec.d.ts.map +1 -0
  32. package/dist/__tests__/type-pipeline.spec.js +239 -0
  33. package/dist/__tests__/type-pipeline.spec.js.map +1 -0
  34. package/dist/__tests__/utils/ts-utils.d.ts +22 -0
  35. package/dist/__tests__/utils/ts-utils.d.ts.map +1 -0
  36. package/dist/__tests__/utils/ts-utils.js +66 -0
  37. package/dist/__tests__/utils/ts-utils.js.map +1 -0
  38. package/dist/commands/generate.d.ts +10 -0
  39. package/dist/commands/generate.d.ts.map +1 -0
  40. package/dist/commands/generate.js +215 -0
  41. package/dist/commands/generate.js.map +1 -0
  42. package/dist/commands/validate.d.ts +14 -0
  43. package/dist/commands/validate.d.ts.map +1 -0
  44. package/dist/commands/validate.js +201 -0
  45. package/dist/commands/validate.js.map +1 -0
  46. package/dist/config/index.d.ts +52 -0
  47. package/dist/config/index.d.ts.map +1 -0
  48. package/dist/config/index.js +119 -0
  49. package/dist/config/index.js.map +1 -0
  50. package/dist/core/compatibility-checker.d.ts +92 -0
  51. package/dist/core/compatibility-checker.d.ts.map +1 -0
  52. package/dist/core/compatibility-checker.js +415 -0
  53. package/dist/core/compatibility-checker.js.map +1 -0
  54. package/dist/core/import-tracker.d.ts +11 -0
  55. package/dist/core/import-tracker.d.ts.map +1 -0
  56. package/dist/core/import-tracker.js +17 -0
  57. package/dist/core/import-tracker.js.map +1 -0
  58. package/dist/core/program-factory.d.ts +23 -0
  59. package/dist/core/program-factory.d.ts.map +1 -0
  60. package/dist/core/program-factory.js +80 -0
  61. package/dist/core/program-factory.js.map +1 -0
  62. package/dist/core/schema-extractor.d.ts +73 -0
  63. package/dist/core/schema-extractor.d.ts.map +1 -0
  64. package/dist/core/schema-extractor.js +205 -0
  65. package/dist/core/schema-extractor.js.map +1 -0
  66. package/dist/core/type-emitter.d.ts +73 -0
  67. package/dist/core/type-emitter.d.ts.map +1 -0
  68. package/dist/core/type-emitter.js +246 -0
  69. package/dist/core/type-emitter.js.map +1 -0
  70. package/dist/core/type-resolver.d.ts +64 -0
  71. package/dist/core/type-resolver.d.ts.map +1 -0
  72. package/dist/core/type-resolver.js +163 -0
  73. package/dist/core/type-resolver.js.map +1 -0
  74. package/dist/index.d.ts +3 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +20 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/mapping/name-classifier.d.ts +34 -0
  79. package/dist/mapping/name-classifier.d.ts.map +1 -0
  80. package/dist/mapping/name-classifier.js +72 -0
  81. package/dist/mapping/name-classifier.js.map +1 -0
  82. package/dist/mapping/name-registry.d.ts +54 -0
  83. package/dist/mapping/name-registry.d.ts.map +1 -0
  84. package/dist/mapping/name-registry.js +251 -0
  85. package/dist/mapping/name-registry.js.map +1 -0
  86. package/dist/mapping/path-mapper.d.ts +62 -0
  87. package/dist/mapping/path-mapper.d.ts.map +1 -0
  88. package/dist/mapping/path-mapper.js +116 -0
  89. package/dist/mapping/path-mapper.js.map +1 -0
  90. package/dist/tsconfig.tsbuildinfo +1 -0
  91. package/dist/utils/file-merger.d.ts +47 -0
  92. package/dist/utils/file-merger.d.ts.map +1 -0
  93. package/dist/utils/file-merger.js +164 -0
  94. package/dist/utils/file-merger.js.map +1 -0
  95. package/dist/utils/formatter.d.ts +12 -0
  96. package/dist/utils/formatter.d.ts.map +1 -0
  97. package/dist/utils/formatter.js +31 -0
  98. package/dist/utils/formatter.js.map +1 -0
  99. package/dist/utils/fs-helpers.d.ts +21 -0
  100. package/dist/utils/fs-helpers.d.ts.map +1 -0
  101. package/dist/utils/fs-helpers.js +42 -0
  102. package/dist/utils/fs-helpers.js.map +1 -0
  103. package/dist/utils/index-manager.d.ts +24 -0
  104. package/dist/utils/index-manager.d.ts.map +1 -0
  105. package/dist/utils/index-manager.js +95 -0
  106. package/dist/utils/index-manager.js.map +1 -0
  107. package/dist/utils/ts-helpers.d.ts +87 -0
  108. package/dist/utils/ts-helpers.d.ts.map +1 -0
  109. package/dist/utils/ts-helpers.js +216 -0
  110. package/dist/utils/ts-helpers.js.map +1 -0
  111. package/package.json +41 -0
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TypeEmitter = void 0;
7
+ const typescript_1 = __importDefault(require("typescript"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const fs_1 = require("fs");
10
+ const type_resolver_1 = require("./type-resolver");
11
+ const fs_helpers_1 = require("../utils/fs-helpers");
12
+ const config_1 = require("../config");
13
+ /**
14
+ * Emits TypeScript interface declarations from resolved Zod schema types and
15
+ * assembles complete output files with the correct import statements.
16
+ */
17
+ class TypeEmitter {
18
+ constructor(checker) {
19
+ this.checker = checker;
20
+ }
21
+ /**
22
+ * Emits a TypeScript interface declaration as a string from a resolved schema type.
23
+ *
24
+ * @param interfaceName - The name for the generated interface
25
+ * @param resolved - The resolved schema type info
26
+ * @param importTracker - Mutable tracker that records which imports are needed
27
+ */
28
+ emitInterface(interfaceName, resolved, importTracker) {
29
+ const { type, hasFindParams, hasSelectParams, hasBaseFilterable } = resolved;
30
+ if (hasFindParams) {
31
+ importTracker.needsFindParams = true;
32
+ }
33
+ if (hasSelectParams) {
34
+ importTracker.needsSelectParams = true;
35
+ }
36
+ if (hasBaseFilterable) {
37
+ importTracker.needsBaseFilterable = true;
38
+ }
39
+ const resolver = new type_resolver_1.TypeResolver(this.checker);
40
+ const properties = resolver.resolveProperties(type, hasFindParams, hasSelectParams);
41
+ const hasOperatorMapProp = properties.some((p) => p.isOperatorMap);
42
+ if (hasOperatorMapProp) {
43
+ importTracker.needsOperatorMap = true;
44
+ }
45
+ const members = [];
46
+ for (const prop of properties) {
47
+ if (prop.isFindParamsField) {
48
+ continue;
49
+ }
50
+ members.push(this.createPropertySignature(prop));
51
+ }
52
+ const heritageClauses = TypeEmitter.createHeritageClauses(interfaceName, hasFindParams, hasSelectParams, hasBaseFilterable);
53
+ const interfaceDecl = typescript_1.default.factory.createInterfaceDeclaration([typescript_1.default.factory.createModifier(typescript_1.default.SyntaxKind.ExportKeyword)], typescript_1.default.factory.createIdentifier(interfaceName), undefined, heritageClauses, members);
54
+ const printer = TypeEmitter.createPrinter();
55
+ const dummyFile = TypeEmitter.createDummySourceFile();
56
+ return printer.printNode(typescript_1.default.EmitHint.Unspecified, interfaceDecl, dummyFile);
57
+ }
58
+ /**
59
+ * Assembles a complete TypeScript file from a list of emitted interfaces.
60
+ *
61
+ * @param interfaces - The interfaces to include
62
+ * @param importTracker - What imports are needed
63
+ * @param outputFile - Absolute path to the file being written (used to compute relative imports)
64
+ */
65
+ static assembleFile(interfaces, importTracker, outputFile) {
66
+ const bodyParts = [];
67
+ for (const iface of interfaces) {
68
+ bodyParts.push(iface.code);
69
+ bodyParts.push("");
70
+ }
71
+ const { content: cleanedBody, imports: hoistedImports } = TypeEmitter.hoistInlineImports(bodyParts.join("\n"), outputFile);
72
+ const parts = [];
73
+ const trackerImports = TypeEmitter.generateImports(importTracker, outputFile);
74
+ if (trackerImports) {
75
+ parts.push(trackerImports);
76
+ }
77
+ for (const [source, typeNames] of hoistedImports) {
78
+ const names = [...typeNames].sort().join(", ");
79
+ parts.push(`import type { ${names} } from "${source}"`);
80
+ }
81
+ if (parts.length > 0) {
82
+ parts.push("");
83
+ }
84
+ parts.push(cleanedBody);
85
+ return parts.join("\n");
86
+ }
87
+ /**
88
+ * Creates a `ts.PropertySignature` for an interface member from a `PropertyInfo`.
89
+ */
90
+ createPropertySignature(prop, enclosingNode) {
91
+ let typeNode;
92
+ if (prop.isOperatorMap) {
93
+ typeNode = TypeEmitter.makeOperatorMapTypeNode();
94
+ }
95
+ else {
96
+ typeNode = this.typeToTypeNode(prop.type, enclosingNode);
97
+ }
98
+ return typescript_1.default.factory.createPropertySignature(undefined, typescript_1.default.factory.createIdentifier(prop.name), prop.isOptional
99
+ ? typescript_1.default.factory.createToken(typescript_1.default.SyntaxKind.QuestionToken)
100
+ : undefined, typeNode);
101
+ }
102
+ /**
103
+ * Converts a TypeScript `ts.Type` to a `ts.TypeNode` using the type checker.
104
+ * Falls back to `any` if conversion fails.
105
+ */
106
+ typeToTypeNode(type, enclosingNode) {
107
+ const typeNode = this.checker.typeToTypeNode(type, enclosingNode, typescript_1.default.NodeBuilderFlags.NoTruncation |
108
+ typescript_1.default.NodeBuilderFlags.UseFullyQualifiedType |
109
+ typescript_1.default.NodeBuilderFlags.AllowThisInObjectLiteral);
110
+ if (!typeNode) {
111
+ return typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.AnyKeyword);
112
+ }
113
+ return typeNode;
114
+ }
115
+ /**
116
+ * Resolves an import source to an import specifier string.
117
+ * If `target` is a bare package name (starts with `@` or contains no `/` after
118
+ * stripping scope), it is returned as-is. Otherwise it is treated as a
119
+ * project-root-relative path and converted to a relative import path.
120
+ */
121
+ static resolveImportPath(outputFile, target) {
122
+ // Package specifier: starts with "@" (scoped) or has no path separators
123
+ const isPackageSpecifier = target.startsWith("@") || !target.includes("/");
124
+ if (isPackageSpecifier) {
125
+ return target;
126
+ }
127
+ const fromDir = path_1.default.dirname(outputFile);
128
+ const toDir = fs_helpers_1.FsHelpers.fromRoot(target);
129
+ const rel = path_1.default.relative(fromDir, toDir).replace(/\\/g, "/");
130
+ return rel.startsWith(".") ? rel : "./" + rel;
131
+ }
132
+ static createPrinter() {
133
+ return typescript_1.default.createPrinter({
134
+ newLine: typescript_1.default.NewLineKind.LineFeed,
135
+ removeComments: false,
136
+ });
137
+ }
138
+ static createDummySourceFile() {
139
+ return typescript_1.default.createSourceFile("output.ts", "", typescript_1.default.ScriptTarget.Latest, false, typescript_1.default.ScriptKind.TS);
140
+ }
141
+ /**
142
+ * Generates a `ts.TypeNode` for an OperatorMap field.
143
+ */
144
+ static makeOperatorMapTypeNode() {
145
+ return typescript_1.default.factory.createTypeReferenceNode(typescript_1.default.factory.createIdentifier("OperatorMap"), [typescript_1.default.factory.createKeywordTypeNode(typescript_1.default.SyntaxKind.StringKeyword)]);
146
+ }
147
+ /**
148
+ * Creates heritage clauses (extends ...) for an interface declaration.
149
+ */
150
+ static createHeritageClauses(interfaceName, hasFindParams, hasSelectParams, hasBaseFilterable) {
151
+ const expressions = [];
152
+ if (hasFindParams) {
153
+ expressions.push(typescript_1.default.factory.createExpressionWithTypeArguments(typescript_1.default.factory.createIdentifier("FindParams"), undefined));
154
+ }
155
+ if (hasSelectParams) {
156
+ expressions.push(typescript_1.default.factory.createExpressionWithTypeArguments(typescript_1.default.factory.createIdentifier("SelectParams"), undefined));
157
+ }
158
+ if (hasBaseFilterable) {
159
+ expressions.push(typescript_1.default.factory.createExpressionWithTypeArguments(typescript_1.default.factory.createIdentifier("BaseFilterable"), [
160
+ typescript_1.default.factory.createTypeReferenceNode(typescript_1.default.factory.createIdentifier(interfaceName), undefined),
161
+ ]));
162
+ }
163
+ if (expressions.length === 0) {
164
+ return [];
165
+ }
166
+ return [
167
+ typescript_1.default.factory.createHeritageClause(typescript_1.default.SyntaxKind.ExtendsKeyword, expressions),
168
+ ];
169
+ }
170
+ /**
171
+ * Generates the import statements for a file based on what types were referenced.
172
+ */
173
+ static generateImports(tracker, outputFile) {
174
+ const lines = [];
175
+ const commonTypes = [];
176
+ if (tracker.needsFindParams)
177
+ commonTypes.push("FindParams");
178
+ if (tracker.needsSelectParams)
179
+ commonTypes.push("SelectParams");
180
+ if (commonTypes.length > 0) {
181
+ lines.push(`import { ${commonTypes.join(", ")} } from "${TypeEmitter.resolveImportPath(outputFile, config_1.Config.get().importSources.commonRequest)}"`);
182
+ }
183
+ const dalTypes = [];
184
+ if (tracker.needsBaseFilterable)
185
+ dalTypes.push("BaseFilterable");
186
+ if (tracker.needsOperatorMap)
187
+ dalTypes.push("OperatorMap");
188
+ if (dalTypes.length > 0) {
189
+ lines.push(`import { ${dalTypes.join(", ")} } from "${TypeEmitter.resolveImportPath(outputFile, config_1.Config.get().importSources.dal)}"`);
190
+ }
191
+ return lines.join("\n");
192
+ }
193
+ /**
194
+ * Walks up the directory tree from `startPath` to find the nearest `package.json`
195
+ * and returns its `name` field, or `undefined` if none is found.
196
+ */
197
+ static findPackageName(startPath) {
198
+ const monorepoRoot = fs_helpers_1.FsHelpers.fromRoot();
199
+ let dir = startPath;
200
+ while (dir !== monorepoRoot) {
201
+ const parent = path_1.default.dirname(dir);
202
+ if (parent === dir)
203
+ break;
204
+ dir = parent;
205
+ const pkgPath = path_1.default.join(dir, "package.json");
206
+ if ((0, fs_1.existsSync)(pkgPath)) {
207
+ try {
208
+ const pkg = JSON.parse((0, fs_1.readFileSync)(pkgPath, "utf8"));
209
+ if (pkg.name)
210
+ return pkg.name;
211
+ }
212
+ catch {
213
+ // ignore malformed package.json
214
+ }
215
+ }
216
+ }
217
+ return undefined;
218
+ }
219
+ /**
220
+ * Scans `content` for inline TypeScript import expressions, extracts them,
221
+ * and replaces each with just the type name. Returns the cleaned content plus
222
+ * a map of importSource → Set<typeName> for import statements to prepend.
223
+ */
224
+ static hoistInlineImports(content, outputFile) {
225
+ const imports = new Map();
226
+ const INLINE_IMPORT_RE = /import\("([^"]+)"\)\.(\w+)/g;
227
+ const cleaned = content.replace(INLINE_IMPORT_RE, (_match, absolutePath, typeName) => {
228
+ const packageName = TypeEmitter.findPackageName(absolutePath);
229
+ const importSource = packageName ??
230
+ (() => {
231
+ const rel = path_1.default
232
+ .relative(path_1.default.dirname(outputFile), absolutePath)
233
+ .replace(/\\/g, "/");
234
+ return rel.startsWith(".") ? rel : "./" + rel;
235
+ })();
236
+ if (!imports.has(importSource)) {
237
+ imports.set(importSource, new Set());
238
+ }
239
+ imports.get(importSource).add(typeName);
240
+ return typeName;
241
+ });
242
+ return { content: cleaned, imports };
243
+ }
244
+ }
245
+ exports.TypeEmitter = TypeEmitter;
246
+ //# sourceMappingURL=type-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-emitter.js","sourceRoot":"","sources":["../../src/core/type-emitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import ts from "typescript";
2
+ import type { ExtractedSchema } from "./schema-extractor";
3
+ export interface ResolvedSchemaType {
4
+ /** The resolved TypeScript type representing the HTTP interface shape */
5
+ type: ts.Type;
6
+ /** Whether this type has special fields that need `FindParams` as a base */
7
+ hasFindParams: boolean;
8
+ /** Whether this type only has the `fields` property from `SelectParams` */
9
+ hasSelectParams: boolean;
10
+ /** Whether this type has `$and`/`$or` operators (BaseFilterable) */
11
+ hasBaseFilterable: boolean;
12
+ /** The schema name for diagnostic reporting */
13
+ schemaName: string;
14
+ }
15
+ /** Property names that belong to `FindParams` (superset of SelectParams) */
16
+ export declare const FIND_PARAMS_FIELDS: Set<string>;
17
+ /** Property names that belong to `SelectParams` only */
18
+ export declare const SELECT_PARAMS_FIELDS: Set<string>;
19
+ export interface PropertyInfo {
20
+ name: string;
21
+ type: ts.Type;
22
+ isOptional: boolean;
23
+ isOperatorMap: boolean;
24
+ /** True for fields that come from FindParams and should be omitted when extending it */
25
+ isFindParamsField: boolean;
26
+ }
27
+ /**
28
+ * Resolves TypeScript types from Zod schemas for HTTP interface generation.
29
+ */
30
+ export declare class TypeResolver {
31
+ private readonly checker;
32
+ constructor(checker: ts.TypeChecker);
33
+ /**
34
+ * Resolves the TypeScript type that should be used to generate the HTTP
35
+ * interface for a given Zod schema.
36
+ *
37
+ * Decision logic:
38
+ * - For `WithAdditionalData` wrappers (innerSchemaType present): use `_output`
39
+ * of the inner schema (no transforms on payloads).
40
+ * - For schemas with `.transform()` (ZodEffects): use `_input` type, which
41
+ * represents what the HTTP client sends (pre-transform).
42
+ * - For plain ZodObjects without transforms: use `_output` type.
43
+ * - `createFindParams()` fields (limit, offset, etc.) use `_output` because
44
+ * `z.preprocess()` has `unknown` as input but `number` as output.
45
+ */
46
+ resolveSchemaType(schema: ExtractedSchema): ResolvedSchemaType | undefined;
47
+ /**
48
+ * For each property in the resolved type, determines the appropriate
49
+ * TypeScript type to emit. Applies special-case mappings for:
50
+ * - OperatorMap fields (complex union with $eq, $ne, etc.)
51
+ * - booleanString fields (string | boolean → boolean)
52
+ * - FindParams fields (omit from flat interface if using extends FindParams)
53
+ */
54
+ resolveProperties(resolvedType: ts.Type, hasFindParams: boolean, hasSelectParams?: boolean): PropertyInfo[];
55
+ /**
56
+ * Attempts to resolve schema properties directly from the ZodObject's first type
57
+ * argument (the raw shape `T` in `ZodObject<T, ...>`).
58
+ *
59
+ * This is a fallback for schemas where the overall `_output` type can't be fully
60
+ * resolved by TypeScript due to circular `z.lazy()` references.
61
+ */
62
+ private resolveFromZodObjectShapeArg;
63
+ }
64
+ //# sourceMappingURL=type-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-resolver.d.ts","sourceRoot":"","sources":["../../src/core/type-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAA;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAEzD,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAA;IACb,4EAA4E;IAC5E,aAAa,EAAE,OAAO,CAAA;IACtB,2EAA2E;IAC3E,eAAe,EAAE,OAAO,CAAA;IACxB,oEAAoE;IACpE,iBAAiB,EAAE,OAAO,CAAA;IAC1B,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,aAM7B,CAAA;AAEF,wDAAwD;AACxD,eAAO,MAAM,oBAAoB,aAAsB,CAAA;AAEvD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,EAAE,CAAC,IAAI,CAAA;IACb,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,wFAAwF;IACxF,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAQD;;GAEG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,EAAE,CAAC,WAAW;IAEpD;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,kBAAkB,GAAG,SAAS;IA0E1E;;;;;;OAMG;IACH,iBAAiB,CACf,YAAY,EAAE,EAAE,CAAC,IAAI,EACrB,aAAa,EAAE,OAAO,EACtB,eAAe,UAAQ,GACtB,YAAY,EAAE;IA6CjB;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;CAmBrC"}
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TypeResolver = exports.SELECT_PARAMS_FIELDS = exports.FIND_PARAMS_FIELDS = void 0;
7
+ const typescript_1 = __importDefault(require("typescript"));
8
+ const ts_helpers_1 = require("../utils/ts-helpers");
9
+ /** Property names that belong to `FindParams` (superset of SelectParams) */
10
+ exports.FIND_PARAMS_FIELDS = new Set([
11
+ "fields",
12
+ "limit",
13
+ "offset",
14
+ "order",
15
+ "with_deleted",
16
+ ]);
17
+ /** Property names that belong to `SelectParams` only */
18
+ exports.SELECT_PARAMS_FIELDS = new Set(["fields"]);
19
+ /**
20
+ * Minimum number of FindParams fields that must be present to consider
21
+ * a type as a `FindParams`-based type.
22
+ */
23
+ const FIND_PARAMS_THRESHOLD = 3;
24
+ /**
25
+ * Resolves TypeScript types from Zod schemas for HTTP interface generation.
26
+ */
27
+ class TypeResolver {
28
+ constructor(checker) {
29
+ this.checker = checker;
30
+ }
31
+ /**
32
+ * Resolves the TypeScript type that should be used to generate the HTTP
33
+ * interface for a given Zod schema.
34
+ *
35
+ * Decision logic:
36
+ * - For `WithAdditionalData` wrappers (innerSchemaType present): use `_output`
37
+ * of the inner schema (no transforms on payloads).
38
+ * - For schemas with `.transform()` (ZodEffects): use `_input` type, which
39
+ * represents what the HTTP client sends (pre-transform).
40
+ * - For plain ZodObjects without transforms: use `_output` type.
41
+ * - `createFindParams()` fields (limit, offset, etc.) use `_output` because
42
+ * `z.preprocess()` has `unknown` as input but `number` as output.
43
+ */
44
+ resolveSchemaType(schema) {
45
+ const { zodType, hasTransform, httpTypeName, baseFieldsType, hasFindParamsInChain, hasSelectParamsInChain, } = schema;
46
+ let resolvedType;
47
+ if (hasTransform) {
48
+ resolvedType = ts_helpers_1.TsHelpers.getZodInputType(this.checker, zodType);
49
+ }
50
+ else {
51
+ resolvedType = ts_helpers_1.TsHelpers.getZodOutputType(this.checker, zodType);
52
+ }
53
+ if (!resolvedType) {
54
+ return undefined;
55
+ }
56
+ let properties = resolvedType.getProperties();
57
+ const initialPropNames = new Set(properties.map((p) => p.name));
58
+ const hasZodSchemaLeak = initialPropNames.has("parse") &&
59
+ initialPropNames.has("safeParse") &&
60
+ initialPropNames.has("_output");
61
+ const hasCircularLazyIssue = hasZodSchemaLeak ||
62
+ (properties.length > 0 &&
63
+ properties.every((p) => p.name === "$and" || p.name === "$or"));
64
+ let hasBaseFilterable = initialPropNames.has("$and");
65
+ if (hasCircularLazyIssue && baseFieldsType) {
66
+ const baseFieldsOutput = ts_helpers_1.TsHelpers.getZodOutputType(this.checker, baseFieldsType);
67
+ if (baseFieldsOutput) {
68
+ resolvedType = baseFieldsOutput;
69
+ properties = resolvedType.getProperties();
70
+ hasBaseFilterable = true;
71
+ }
72
+ }
73
+ else if (hasCircularLazyIssue) {
74
+ const shapeResolved = this.resolveFromZodObjectShapeArg(zodType);
75
+ if (shapeResolved) {
76
+ resolvedType = shapeResolved;
77
+ properties = resolvedType.getProperties();
78
+ hasBaseFilterable = true;
79
+ }
80
+ }
81
+ const propNames = new Set(properties.map((p) => p.name));
82
+ let findParamsFieldCount = 0;
83
+ for (const f of exports.FIND_PARAMS_FIELDS) {
84
+ if (propNames.has(f))
85
+ findParamsFieldCount++;
86
+ }
87
+ const hasFindParams = findParamsFieldCount >= FIND_PARAMS_THRESHOLD || hasFindParamsInChain;
88
+ const hasSelectParams = !hasFindParams && hasSelectParamsInChain;
89
+ return {
90
+ type: resolvedType,
91
+ hasFindParams,
92
+ hasSelectParams,
93
+ hasBaseFilterable,
94
+ schemaName: httpTypeName,
95
+ };
96
+ }
97
+ /**
98
+ * For each property in the resolved type, determines the appropriate
99
+ * TypeScript type to emit. Applies special-case mappings for:
100
+ * - OperatorMap fields (complex union with $eq, $ne, etc.)
101
+ * - booleanString fields (string | boolean → boolean)
102
+ * - FindParams fields (omit from flat interface if using extends FindParams)
103
+ */
104
+ resolveProperties(resolvedType, hasFindParams, hasSelectParams = false) {
105
+ const properties = resolvedType.getProperties();
106
+ const result = [];
107
+ for (const prop of properties) {
108
+ const propName = prop.name;
109
+ if (propName === "$and" || propName === "$or") {
110
+ continue;
111
+ }
112
+ const rawPropType = this.checker.getTypeOfSymbol(prop);
113
+ const zodOutput = ts_helpers_1.TsHelpers.getZodOutputType(this.checker, rawPropType);
114
+ const propType = zodOutput ?? rawPropType;
115
+ let isOptional = !!(prop.flags & typescript_1.default.SymbolFlags.Optional);
116
+ if (zodOutput) {
117
+ const zodSymbolName = rawPropType.getSymbol()?.getName() ?? "";
118
+ isOptional =
119
+ zodSymbolName === "ZodOptional" ||
120
+ zodSymbolName === "ZodNullable" ||
121
+ zodSymbolName === "ZodDefault" ||
122
+ zodSymbolName === "ZodEffects";
123
+ }
124
+ const nonNullableType = this.checker.getNonNullableType(propType);
125
+ const isOperatorMap = ts_helpers_1.TsHelpers.isOperatorMapType(nonNullableType);
126
+ const isFindParamsField = (hasFindParams && exports.FIND_PARAMS_FIELDS.has(propName)) ||
127
+ (hasSelectParams && exports.SELECT_PARAMS_FIELDS.has(propName));
128
+ result.push({
129
+ name: propName,
130
+ type: propType,
131
+ isOptional,
132
+ isOperatorMap,
133
+ isFindParamsField,
134
+ });
135
+ }
136
+ return result;
137
+ }
138
+ /**
139
+ * Attempts to resolve schema properties directly from the ZodObject's first type
140
+ * argument (the raw shape `T` in `ZodObject<T, ...>`).
141
+ *
142
+ * This is a fallback for schemas where the overall `_output` type can't be fully
143
+ * resolved by TypeScript due to circular `z.lazy()` references.
144
+ */
145
+ resolveFromZodObjectShapeArg(zodType) {
146
+ const typeRef = zodType;
147
+ const typeArgs = this.checker.getTypeArguments(typeRef);
148
+ if (!typeArgs || typeArgs.length === 0) {
149
+ return undefined;
150
+ }
151
+ const shapeType = typeArgs[0];
152
+ if (!shapeType) {
153
+ return undefined;
154
+ }
155
+ const shapeProps = shapeType.getProperties();
156
+ if (shapeProps.length === 0) {
157
+ return undefined;
158
+ }
159
+ return shapeType;
160
+ }
161
+ }
162
+ exports.TypeResolver = TypeResolver;
163
+ //# sourceMappingURL=type-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-resolver.js","sourceRoot":"","sources":["../../src/core/type-resolver.ts"],"names":[],"mappings":";;;;;;AAAA,4DAA2B;AAC3B,oDAA+C;AAgB/C,4EAA4E;AAC/D,QAAA,kBAAkB,GAAG,IAAI,GAAG,CAAC;IACxC,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,OAAO;IACP,cAAc;CACf,CAAC,CAAA;AAEF,wDAAwD;AAC3C,QAAA,oBAAoB,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;AAWvD;;;GAGG;AACH,MAAM,qBAAqB,GAAG,CAAC,CAAA;AAE/B;;GAEG;AACH,MAAa,YAAY;IACvB,YAA6B,OAAuB;QAAvB,YAAO,GAAP,OAAO,CAAgB;IAAG,CAAC;IAExD;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,MAAuB;QACvC,MAAM,EACJ,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,sBAAsB,GACvB,GAAG,MAAM,CAAA;QAEV,IAAI,YAAiC,CAAA;QAErC,IAAI,YAAY,EAAE,CAAC;YACjB,YAAY,GAAG,sBAAS,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QACjE,CAAC;aAAM,CAAC;YACN,YAAY,GAAG,sBAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAClE,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,IAAI,UAAU,GAAG,YAAY,CAAC,aAAa,EAAE,CAAA;QAE7C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAC/D,MAAM,gBAAgB,GACpB,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;YAC7B,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC;YACjC,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QACjC,MAAM,oBAAoB,GACxB,gBAAgB;YAChB,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;gBACpB,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAA;QAEnE,IAAI,iBAAiB,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAEpD,IAAI,oBAAoB,IAAI,cAAc,EAAE,CAAC;YAC3C,MAAM,gBAAgB,GAAG,sBAAS,CAAC,gBAAgB,CACjD,IAAI,CAAC,OAAO,EACZ,cAAc,CACf,CAAA;YACD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,YAAY,GAAG,gBAAgB,CAAA;gBAC/B,UAAU,GAAG,YAAY,CAAC,aAAa,EAAE,CAAA;gBACzC,iBAAiB,GAAG,IAAI,CAAA;YAC1B,CAAC;QACH,CAAC;aAAM,IAAI,oBAAoB,EAAE,CAAC;YAChC,MAAM,aAAa,GAAG,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,CAAA;YAChE,IAAI,aAAa,EAAE,CAAC;gBAClB,YAAY,GAAG,aAAa,CAAA;gBAC5B,UAAU,GAAG,YAAY,CAAC,aAAa,EAAE,CAAA;gBACzC,iBAAiB,GAAG,IAAI,CAAA;YAC1B,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAExD,IAAI,oBAAoB,GAAG,CAAC,CAAA;QAC5B,KAAK,MAAM,CAAC,IAAI,0BAAkB,EAAE,CAAC;YACnC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,oBAAoB,EAAE,CAAA;QAC9C,CAAC;QACD,MAAM,aAAa,GACjB,oBAAoB,IAAI,qBAAqB,IAAI,oBAAoB,CAAA;QACvE,MAAM,eAAe,GAAG,CAAC,aAAa,IAAI,sBAAsB,CAAA;QAEhE,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,aAAa;YACb,eAAe;YACf,iBAAiB;YACjB,UAAU,EAAE,YAAY;SACzB,CAAA;IACH,CAAC;IAED;;;;;;OAMG;IACH,iBAAiB,CACf,YAAqB,EACrB,aAAsB,EACtB,eAAe,GAAG,KAAK;QAEvB,MAAM,UAAU,GAAG,YAAY,CAAC,aAAa,EAAE,CAAA;QAC/C,MAAM,MAAM,GAAmB,EAAE,CAAA;QAEjC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAA;YAE1B,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC9C,SAAQ;YACV,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;YAEtD,MAAM,SAAS,GAAG,sBAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;YACvE,MAAM,QAAQ,GAAG,SAAS,IAAI,WAAW,CAAA;YAEzC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,oBAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;YACzD,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,aAAa,GAAG,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAA;gBAC9D,UAAU;oBACR,aAAa,KAAK,aAAa;wBAC/B,aAAa,KAAK,aAAa;wBAC/B,aAAa,KAAK,YAAY;wBAC9B,aAAa,KAAK,YAAY,CAAA;YAClC,CAAC;YAED,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAA;YACjE,MAAM,aAAa,GAAG,sBAAS,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAA;YAElE,MAAM,iBAAiB,GACrB,CAAC,aAAa,IAAI,0BAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACnD,CAAC,eAAe,IAAI,4BAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;YAEzD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,QAAQ;gBACd,UAAU;gBACV,aAAa;gBACb,iBAAiB;aAClB,CAAC,CAAA;QACJ,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;;;;;OAMG;IACK,4BAA4B,CAAC,OAAgB;QACnD,MAAM,OAAO,GAAG,OAA2B,CAAA;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAA;QACvD,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,MAAM,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC7B,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,aAAa,EAAE,CAAA;QAC5C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;CACF;AA5KD,oCA4KC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const generate_1 = require("./commands/generate");
6
+ const validate_1 = require("./commands/validate");
7
+ const program = new commander_1.Command();
8
+ program
9
+ .name("medusa-http-types")
10
+ .description("Generate and validate HTTP TypeScript types from Zod validator schemas.\n\n" +
11
+ "Use `generate` to create TypeScript interfaces from Zod schemas, and\n" +
12
+ "`validate` to check that existing interfaces match their Zod schemas.")
13
+ .version("0.0.1");
14
+ program.addCommand((0, generate_1.generateCommand)());
15
+ program.addCommand((0, validate_1.validateCommand)());
16
+ program.parseAsync(process.argv).catch((err) => {
17
+ console.error(err);
18
+ process.exit(1);
19
+ });
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAmC;AACnC,kDAAqD;AACrD,kDAAqD;AAErD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,mBAAmB,CAAC;KACzB,WAAW,CACV,6EAA6E;IAC3E,wEAAwE;IACxE,uEAAuE,CAC1E;KACA,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,OAAO,CAAC,UAAU,CAAC,IAAA,0BAAe,GAAE,CAAC,CAAA;AACrC,OAAO,CAAC,UAAU,CAAC,IAAA,0BAAe,GAAE,CAAC,CAAA;AAErC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Target file categories for schema outputs.
3
+ * - `payloads` → `payloads.ts` (request body types: create, update, batch, etc.)
4
+ * - `queries` → `queries.ts` (query parameter types: list, filter, select params)
5
+ * - `skip` → do not generate a type for this schema
6
+ */
7
+ export type FileTarget = "payloads" | "queries" | "skip";
8
+ /**
9
+ * Classifies Zod schema export names into the appropriate output file category.
10
+ */
11
+ export declare class NameClassifier {
12
+ /**
13
+ * Patterns in the schema name that indicate a query/filter type.
14
+ * These go into `queries.ts`.
15
+ */
16
+ private static readonly QUERY_PATTERNS;
17
+ /**
18
+ * Patterns in the schema name that indicate a payload type.
19
+ * These go into `payloads.ts`.
20
+ */
21
+ private static readonly PAYLOAD_PATTERNS;
22
+ /**
23
+ * These intermediate/internal helper schemas should not generate HTTP types.
24
+ */
25
+ private static readonly SKIP_PATTERNS;
26
+ /**
27
+ * Classifies a Zod schema export name into the appropriate output file category.
28
+ *
29
+ * @param name - The exported variable name from the validator file.
30
+ * @returns The target file category. Returns "skip" if no type should be generated for this schema.
31
+ */
32
+ static classify(name: string): FileTarget;
33
+ }
34
+ //# sourceMappingURL=name-classifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name-classifier.d.ts","sourceRoot":"","sources":["../../src/mapping/name-classifier.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAA;AAExD;;GAEG;AACH,qBAAa,cAAc;IACzB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAKrC;IAED;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CASvC;IAED;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAMpC;IAED;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;CAyB1C"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NameClassifier = void 0;
4
+ const config_1 = require("../config");
5
+ /**
6
+ * Classifies Zod schema export names into the appropriate output file category.
7
+ */
8
+ class NameClassifier {
9
+ /**
10
+ * Classifies a Zod schema export name into the appropriate output file category.
11
+ *
12
+ * @param name - The exported variable name from the validator file.
13
+ * @returns The target file category. Returns "skip" if no type should be generated for this schema.
14
+ */
15
+ static classify(name) {
16
+ // Must have one of the configured public prefixes to be an HTTP type
17
+ const prefixes = config_1.Config.get().publicPrefixes;
18
+ if (!prefixes.some((prefix) => name.startsWith(prefix))) {
19
+ return "skip";
20
+ }
21
+ // Skip intermediate/helper schemas
22
+ if (NameClassifier.SKIP_PATTERNS.some((p) => p.test(name))) {
23
+ return "skip";
24
+ }
25
+ // Check if it's a query/filter type
26
+ if (NameClassifier.QUERY_PATTERNS.some((p) => p.test(name))) {
27
+ return "queries";
28
+ }
29
+ // Check if it's a payload type
30
+ if (NameClassifier.PAYLOAD_PATTERNS.some((p) => p.test(name))) {
31
+ return "payloads";
32
+ }
33
+ // Default: treat as a payload type
34
+ return "payloads";
35
+ }
36
+ }
37
+ exports.NameClassifier = NameClassifier;
38
+ /**
39
+ * Patterns in the schema name that indicate a query/filter type.
40
+ * These go into `queries.ts`.
41
+ */
42
+ NameClassifier.QUERY_PATTERNS = [
43
+ /Params$/,
44
+ /Filters?$/,
45
+ /ListParams$/,
46
+ /FilterFields$/,
47
+ ];
48
+ /**
49
+ * Patterns in the schema name that indicate a payload type.
50
+ * These go into `payloads.ts`.
51
+ */
52
+ NameClassifier.PAYLOAD_PATTERNS = [
53
+ /Create[A-Z]/,
54
+ /Update[A-Z]/,
55
+ /Batch[A-Z]/,
56
+ /Import[A-Z]/,
57
+ /Export[A-Z]/,
58
+ /Link[A-Z]/,
59
+ /[A-Z]Request$/,
60
+ /[A-Z]Payload$/,
61
+ ];
62
+ /**
63
+ * These intermediate/internal helper schemas should not generate HTTP types.
64
+ */
65
+ NameClassifier.SKIP_PATTERNS = [
66
+ /ParamsFields$/,
67
+ /ParamsDirectFields$/,
68
+ /ParamsBase$/,
69
+ /ParamsTransform$/,
70
+ /Schema$/,
71
+ ];
72
+ //# sourceMappingURL=name-classifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"name-classifier.js","sourceRoot":"","sources":["../../src/mapping/name-classifier.ts"],"names":[],"mappings":";;;AAAA,sCAAkC;AAUlC;;GAEG;AACH,MAAa,cAAc;IAsCzB;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAY;QAC1B,qEAAqE;QACrE,MAAM,QAAQ,GAAG,eAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAA;QAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,MAAM,CAAA;QACf,CAAC;QAED,mCAAmC;QACnC,IAAI,cAAc,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,MAAM,CAAA;QACf,CAAC;QAED,oCAAoC;QACpC,IAAI,cAAc,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC5D,OAAO,SAAS,CAAA;QAClB,CAAC;QAED,+BAA+B;QAC/B,IAAI,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC9D,OAAO,UAAU,CAAA;QACnB,CAAC;QAED,mCAAmC;QACnC,OAAO,UAAU,CAAA;IACnB,CAAC;;AApEH,wCAqEC;AApEC;;;GAGG;AACqB,6BAAc,GAAG;IACvC,SAAS;IACT,WAAW;IACX,aAAa;IACb,eAAe;CAChB,CAAA;AAED;;;GAGG;AACqB,+BAAgB,GAAG;IACzC,aAAa;IACb,aAAa;IACb,YAAY;IACZ,aAAa;IACb,aAAa;IACb,WAAW;IACX,eAAe;IACf,eAAe;CAChB,CAAA;AAED;;GAEG;AACqB,4BAAa,GAAG;IACtC,eAAe;IACf,qBAAqB;IACrB,aAAa;IACb,kBAAkB;IAClB,SAAS;CACV,CAAA"}