@kubb/plugin-oas 4.33.0 → 4.33.2

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 (58) hide show
  1. package/dist/{SchemaMapper-CEvL7_hg.cjs → SchemaMapper-CeavHZlp.cjs} +1 -1
  2. package/dist/{SchemaMapper-CEvL7_hg.cjs.map → SchemaMapper-CeavHZlp.cjs.map} +1 -1
  3. package/dist/{SchemaMapper-ClUmzpCc.js → SchemaMapper-CqMkO2T1.js} +1 -1
  4. package/dist/{SchemaMapper-ClUmzpCc.js.map → SchemaMapper-CqMkO2T1.js.map} +1 -1
  5. package/dist/{createGenerator-BPVBbTHR.d.ts → createGenerator-Z5-TQKKC.d.ts} +44 -8
  6. package/dist/{generators-BvfaSMp3.cjs → generators-CBlzDhTh.cjs} +4 -5
  7. package/dist/generators-CBlzDhTh.cjs.map +1 -0
  8. package/dist/{generators-BrYP9z4D.js → generators-DRPPf38p.js} +2 -3
  9. package/dist/{generators-BrYP9z4D.js.map → generators-DRPPf38p.js.map} +1 -1
  10. package/dist/generators.cjs +1 -1
  11. package/dist/generators.d.ts +1 -1
  12. package/dist/generators.js +1 -1
  13. package/dist/getFooter-BBzsC616.cjs +136 -0
  14. package/dist/getFooter-BBzsC616.cjs.map +1 -0
  15. package/dist/getFooter-Pw3tLCiV.js +112 -0
  16. package/dist/getFooter-Pw3tLCiV.js.map +1 -0
  17. package/dist/hooks.cjs +2 -2
  18. package/dist/hooks.cjs.map +1 -1
  19. package/dist/hooks.d.ts +2 -2
  20. package/dist/hooks.js +2 -2
  21. package/dist/hooks.js.map +1 -1
  22. package/dist/index.cjs +60 -71
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.d.ts +3 -3
  25. package/dist/index.js +47 -57
  26. package/dist/index.js.map +1 -1
  27. package/dist/mocks.cjs +1 -1
  28. package/dist/mocks.js +1 -1
  29. package/dist/{resolveServerUrl-sGGjx0hA.js → requestBody-C0-TOJVO.js} +111 -49
  30. package/dist/requestBody-C0-TOJVO.js.map +1 -0
  31. package/dist/{resolveServerUrl-CxAWmztf.cjs → requestBody-DTUm-tGf.cjs} +111 -56
  32. package/dist/requestBody-DTUm-tGf.cjs.map +1 -0
  33. package/dist/utils.cjs +139 -25
  34. package/dist/utils.cjs.map +1 -1
  35. package/dist/utils.d.ts +3 -21
  36. package/dist/utils.js +130 -14
  37. package/dist/utils.js.map +1 -1
  38. package/package.json +5 -4
  39. package/src/OperationGenerator.ts +56 -79
  40. package/src/SchemaGenerator.ts +50 -29
  41. package/src/generators/jsonGenerator.ts +1 -1
  42. package/src/hooks/useOperationManager.ts +2 -2
  43. package/src/plugin.ts +4 -13
  44. package/src/types.ts +1 -1
  45. package/src/utils/getComments.ts +3 -6
  46. package/src/utils/getImports.ts +5 -3
  47. package/src/utils/getParams.ts +2 -2
  48. package/src/utils/index.ts +0 -1
  49. package/src/utils/paramsCasing.ts +5 -5
  50. package/src/utils/requestBody.ts +7 -1
  51. package/dist/generators-BvfaSMp3.cjs.map +0 -1
  52. package/dist/getFooter-DGVGGyRc.js +0 -57
  53. package/dist/getFooter-DGVGGyRc.js.map +0 -1
  54. package/dist/getFooter-WAZDOcmk.cjs +0 -69
  55. package/dist/getFooter-WAZDOcmk.cjs.map +0 -1
  56. package/dist/resolveServerUrl-CxAWmztf.cjs.map +0 -1
  57. package/dist/resolveServerUrl-sGGjx0hA.js.map +0 -1
  58. package/src/utils/resolveServerUrl.ts +0 -37
package/dist/utils.js CHANGED
@@ -1,10 +1,124 @@
1
1
  import "./chunk--u3MIqq1.js";
2
- import { c as getSchemaFactory, i as SchemaGenerator, n as isRequestBodyRequired, r as withRequiredRequestBodySchema, t as resolveServerUrl } from "./resolveServerUrl-sGGjx0hA.js";
3
- import { n as schemaKeywords } from "./SchemaMapper-ClUmzpCc.js";
4
- import { n as getBanner, t as getFooter } from "./getFooter-DGVGGyRc.js";
5
- import transformers, { camelCase, isValidVarName } from "@kubb/core/transformers";
6
- import { URLPath } from "@kubb/core/utils";
2
+ import { n as getBanner, r as camelCase, t as getFooter } from "./getFooter-Pw3tLCiV.js";
3
+ import { n as withRequiredRequestBodySchema, r as SchemaGenerator, s as getSchemaFactory, t as isRequestBodyRequired } from "./requestBody-C0-TOJVO.js";
4
+ import { n as schemaKeywords } from "./SchemaMapper-CqMkO2T1.js";
7
5
  import { isOptional } from "@kubb/oas";
6
+ //#region ../../internals/utils/src/reserved.ts
7
+ /**
8
+ * Returns `true` when `name` is a syntactically valid JavaScript variable name.
9
+ */
10
+ function isValidVarName(name) {
11
+ try {
12
+ new Function(`var ${name}`);
13
+ } catch {
14
+ return false;
15
+ }
16
+ return true;
17
+ }
18
+ //#endregion
19
+ //#region ../../internals/utils/src/urlPath.ts
20
+ /**
21
+ * Parses and transforms an OpenAPI/Swagger path string into various URL formats.
22
+ *
23
+ * @example
24
+ * const p = new URLPath('/pet/{petId}')
25
+ * p.URL // '/pet/:petId'
26
+ * p.template // '`/pet/${petId}`'
27
+ */
28
+ var URLPath = class {
29
+ /** The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`. */
30
+ path;
31
+ #options;
32
+ constructor(path, options = {}) {
33
+ this.path = path;
34
+ this.#options = options;
35
+ }
36
+ /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */
37
+ get URL() {
38
+ return this.toURLPath();
39
+ }
40
+ /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`). */
41
+ get isURL() {
42
+ try {
43
+ return !!new URL(this.path).href;
44
+ } catch {
45
+ return false;
46
+ }
47
+ }
48
+ /**
49
+ * Converts the OpenAPI path to a TypeScript template literal string.
50
+ *
51
+ * @example
52
+ * new URLPath('/pet/{petId}').template // '`/pet/${petId}`'
53
+ * new URLPath('/account/monetary-accountID').template // '`/account/${monetaryAccountId}`'
54
+ */
55
+ get template() {
56
+ return this.toTemplateString();
57
+ }
58
+ /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set. */
59
+ get object() {
60
+ return this.toObject();
61
+ }
62
+ /** Returns a map of path parameter names, or `undefined` when the path has no parameters. */
63
+ get params() {
64
+ return this.getParams();
65
+ }
66
+ #transformParam(raw) {
67
+ const param = isValidVarName(raw) ? raw : camelCase(raw);
68
+ return this.#options.casing === "camelcase" ? camelCase(param) : param;
69
+ }
70
+ /** Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name. */
71
+ #eachParam(fn) {
72
+ for (const match of this.path.matchAll(/\{([^}]+)\}/g)) {
73
+ const raw = match[1];
74
+ fn(raw, this.#transformParam(raw));
75
+ }
76
+ }
77
+ toObject({ type = "path", replacer, stringify } = {}) {
78
+ const object = {
79
+ url: type === "path" ? this.toURLPath() : this.toTemplateString({ replacer }),
80
+ params: this.getParams()
81
+ };
82
+ if (stringify) {
83
+ if (type === "template") return JSON.stringify(object).replaceAll("'", "").replaceAll(`"`, "");
84
+ if (object.params) return `{ url: '${object.url}', params: ${JSON.stringify(object.params).replaceAll("'", "").replaceAll(`"`, "")} }`;
85
+ return `{ url: '${object.url}' }`;
86
+ }
87
+ return object;
88
+ }
89
+ /**
90
+ * Converts the OpenAPI path to a TypeScript template literal string.
91
+ * An optional `replacer` can transform each extracted parameter name before interpolation.
92
+ *
93
+ * @example
94
+ * new URLPath('/pet/{petId}').toTemplateString() // '`/pet/${petId}`'
95
+ */
96
+ toTemplateString({ prefix = "", replacer } = {}) {
97
+ return `\`${prefix}${this.path.split(/\{([^}]+)\}/).map((part, i) => {
98
+ if (i % 2 === 0) return part;
99
+ const param = this.#transformParam(part);
100
+ return `\${${replacer ? replacer(param) : param}}`;
101
+ }).join("")}\``;
102
+ }
103
+ /**
104
+ * Extracts all `{param}` segments from the path and returns them as a key-value map.
105
+ * An optional `replacer` transforms each parameter name in both key and value positions.
106
+ * Returns `undefined` when no path parameters are found.
107
+ */
108
+ getParams(replacer) {
109
+ const params = {};
110
+ this.#eachParam((_raw, param) => {
111
+ const key = replacer ? replacer(param) : param;
112
+ params[key] = key;
113
+ });
114
+ return Object.keys(params).length > 0 ? params : void 0;
115
+ }
116
+ /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */
117
+ toURLPath() {
118
+ return this.path.replace(/\{([^}]+)\}/g, ":$1");
119
+ }
120
+ };
121
+ //#endregion
8
122
  //#region src/utils/getComments.ts
9
123
  function getComments(operation) {
10
124
  return [
@@ -12,9 +126,9 @@ function getComments(operation) {
12
126
  operation.getSummary() && `@summary ${operation.getSummary()}`,
13
127
  operation.path && `{@link ${new URLPath(operation.path).URL}}`,
14
128
  operation.isDeprecated() && "@deprecated"
15
- ].filter(Boolean).flatMap((text) => {
129
+ ].filter((x) => Boolean(x)).flatMap((text) => {
16
130
  return text.split(/\r?\n/).map((line) => line.trim());
17
- }).filter(Boolean);
131
+ }).filter((x) => Boolean(x));
18
132
  }
19
133
  //#endregion
20
134
  //#region src/utils/getImports.ts
@@ -22,13 +136,15 @@ function getComments(operation) {
22
136
  * Get imports from a schema tree by extracting all ref schemas that are importable
23
137
  */
24
138
  function getImports(tree) {
25
- return SchemaGenerator.deepSearch(tree, schemaKeywords.ref)?.map((item) => {
139
+ const refs = SchemaGenerator.deepSearch(tree, schemaKeywords.ref);
140
+ if (!refs) return [];
141
+ return refs.map((item) => {
26
142
  if (!item.args.path || !item.args.isImportable) return;
27
143
  return {
28
144
  name: [item.args.name],
29
145
  path: item.args.path
30
146
  };
31
- }).filter(Boolean);
147
+ }).filter((x) => x !== void 0);
32
148
  }
33
149
  //#endregion
34
150
  //#region src/utils/getParams.ts
@@ -122,14 +238,14 @@ function applyParamsCasing(schema, casing) {
122
238
  const transformedRequired = [];
123
239
  Object.entries(schema.properties).forEach(([originalName, propertySchema]) => {
124
240
  let transformedName = originalName;
125
- if (casing === "camelcase") transformedName = transformers.camelCase(originalName);
126
- else if (!isValidVarName(originalName)) transformedName = transformers.camelCase(originalName);
241
+ if (casing === "camelcase") transformedName = camelCase(originalName);
242
+ else if (!isValidVarName(originalName)) transformedName = camelCase(originalName);
127
243
  transformedProperties[transformedName] = propertySchema;
128
244
  });
129
245
  if (Array.isArray(schema.required)) schema.required.forEach((originalName) => {
130
246
  let transformedName = originalName;
131
- if (casing === "camelcase") transformedName = transformers.camelCase(originalName);
132
- else if (!isValidVarName(originalName)) transformedName = transformers.camelCase(originalName);
247
+ if (casing === "camelcase") transformedName = camelCase(originalName);
248
+ else if (!isValidVarName(originalName)) transformedName = camelCase(originalName);
133
249
  transformedRequired.push(transformedName);
134
250
  });
135
251
  return {
@@ -147,6 +263,6 @@ function isParameterSchema(schemaName) {
147
263
  return lowerName.includes("pathparams") || lowerName.includes("queryparams") || lowerName.includes("headerparams");
148
264
  }
149
265
  //#endregion
150
- export { applyParamsCasing, getBanner, getComments, getFooter, getImports, getParamsMapping, getPathParams, getSchemaFactory, getSchemas, isOptional, isParameterSchema, isRequestBodyRequired, resolveServerUrl, withRequiredRequestBodySchema };
266
+ export { applyParamsCasing, getBanner, getComments, getFooter, getImports, getParamsMapping, getPathParams, getSchemaFactory, getSchemas, isOptional, isParameterSchema, isRequestBodyRequired, withRequiredRequestBodySchema };
151
267
 
152
268
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","names":[],"sources":["../src/utils/getComments.ts","../src/utils/getImports.ts","../src/utils/getParams.ts","../src/utils/getSchemas.ts","../src/utils/paramsCasing.ts"],"sourcesContent":["import { URLPath } from '@kubb/core/utils'\n\nimport type { Operation } from '@kubb/oas'\n\nexport function getComments(operation: Operation): string[] {\n return [\n operation.getDescription() && `@description ${operation.getDescription()}`,\n operation.getSummary() && `@summary ${operation.getSummary()}`,\n operation.path && `{@link ${new URLPath(operation.path).URL}}`,\n operation.isDeprecated() && '@deprecated',\n ]\n .filter(Boolean)\n .flatMap((text) => {\n // Split by newlines to preserve line breaks in JSDoc\n // Trim each line individually to remove leading/trailing whitespace\n return text.split(/\\r?\\n/).map((line) => line.trim())\n })\n .filter(Boolean)\n}\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport { SchemaGenerator } from '../SchemaGenerator.ts'\nimport type { Schema } from '../SchemaMapper'\nimport { schemaKeywords } from '../SchemaMapper'\n\n/**\n * Get imports from a schema tree by extracting all ref schemas that are importable\n */\nexport function getImports(tree: Array<Schema>): Array<KubbFile.Import> {\n const refs = SchemaGenerator.deepSearch(tree, schemaKeywords.ref)\n\n return refs\n ?.map((item) => {\n if (!item.args.path || !item.args.isImportable) {\n return undefined\n }\n\n return {\n name: [item.args.name],\n path: item.args.path,\n }\n })\n .filter(Boolean)\n}\n","import { camelCase, isValidVarName } from '@kubb/core/transformers'\nimport type { FunctionParamsAST } from '@kubb/core/utils'\nimport type { OasTypes } from '@kubb/oas'\nimport type { Params } from '@kubb/react-fabric/types'\nimport type { OperationSchema } from '../types.ts'\n/**\n *\n * @deprecated\n * TODO move to operationManager hook\n */\nexport function getASTParams(\n operationSchema: OperationSchema | undefined,\n {\n typed = false,\n casing,\n override,\n }: {\n typed?: boolean\n casing?: 'camelcase'\n override?: (data: FunctionParamsAST) => FunctionParamsAST\n } = {},\n): FunctionParamsAST[] {\n if (!operationSchema || !operationSchema.schema.properties || !operationSchema.name) {\n return []\n }\n\n const requiredFields = Array.isArray(operationSchema.schema.required) ? operationSchema.schema.required : []\n\n return Object.entries(operationSchema.schema.properties).map(([name]: [string, OasTypes.SchemaObject]) => {\n // Use camelCase name for indexed access if casing is enabled\n const accessName = casing === 'camelcase' ? camelCase(name) : name\n\n const data: FunctionParamsAST = {\n name,\n enabled: !!name,\n required: requiredFields.includes(name),\n type: typed ? `${operationSchema.name}[\"${accessName}\"]` : undefined,\n }\n\n return override ? override(data) : data\n })\n}\n\nexport function getPathParams(\n operationSchema: OperationSchema | undefined,\n options: {\n typed?: boolean\n casing?: 'camelcase'\n override?: (data: FunctionParamsAST) => FunctionParamsAST\n } = {},\n) {\n return getASTParams(operationSchema, options).reduce((acc, curr) => {\n if (curr.name && curr.enabled) {\n let name = curr.name\n\n // Only transform to camelCase if explicitly requested\n if (options.casing === 'camelcase') {\n name = camelCase(name)\n } else if (!isValidVarName(name)) {\n // If not valid variable name and casing not set, still need to make it valid\n name = camelCase(name)\n }\n\n acc[name] = {\n default: curr.default,\n type: curr.type,\n optional: !curr.required,\n }\n }\n\n return acc\n }, {} as Params)\n}\n\n/**\n * Get a mapping of camelCase parameter names to their original names\n * Used for mapping function parameters to backend parameter names\n */\nexport function getParamsMapping(\n operationSchema: OperationSchema | undefined,\n options: {\n casing?: 'camelcase'\n } = {},\n): Record<string, string> | undefined {\n if (!operationSchema || !operationSchema.schema.properties) {\n return undefined\n }\n\n const allEntries: Array<[string, string]> = []\n let hasTransformation = false\n\n Object.entries(operationSchema.schema.properties).forEach(([originalName]) => {\n let transformedName = originalName\n\n // Only transform to camelCase if explicitly requested\n if (options.casing === 'camelcase') {\n transformedName = camelCase(originalName)\n } else if (!isValidVarName(originalName)) {\n // If not valid variable name and casing not set, still need to make it valid\n transformedName = camelCase(originalName)\n }\n\n allEntries.push([originalName, transformedName])\n\n if (transformedName !== originalName) {\n hasTransformation = true\n }\n })\n\n // When using explicit casing and there are transformations, include ALL params so that\n // mappedParams contains every parameter (not just the ones whose names changed).\n // This prevents params with already-camelCase names (e.g. 'page', 'search') from being\n // silently dropped when other params in the same schema do need transformation.\n if (options.casing === 'camelcase' && hasTransformation) {\n return Object.fromEntries(allEntries)\n }\n\n // When casing is not specified or no transformations are needed, only return changed entries\n const mapping: Record<string, string> = {}\n allEntries.forEach(([originalName, transformedName]) => {\n if (transformedName !== originalName) {\n mapping[originalName] = transformedName\n }\n })\n\n return Object.keys(mapping).length > 0 ? mapping : undefined\n}\n","import type { contentType, Oas, OasTypes } from '@kubb/oas'\n\nexport type GetSchemasResult = {\n schemas: Record<string, OasTypes.SchemaObject>\n /**\n * Mapping from original component name to resolved name after collision handling\n * e.g., { 'Order': 'OrderSchema', 'variant': 'variant2' }\n */\n nameMapping: Map<string, string>\n}\n\ntype Mode = 'schemas' | 'responses' | 'requestBodies'\n\ntype GetSchemasProps = {\n oas: Oas\n contentType?: contentType\n includes?: Mode[]\n /**\n * Whether to resolve name collisions with suffixes.\n * If not provided, uses oas.options.collisionDetection\n * @default false (from oas.options or fallback)\n */\n collisionDetection?: boolean\n}\n\n/**\n * Collect schemas from OpenAPI components (schemas, responses, requestBodies)\n * and return them in dependency order along with name mapping for collision resolution.\n *\n * This function is a wrapper around the oas.getSchemas() method for backward compatibility.\n * New code should use oas.getSchemas() directly.\n *\n * @deprecated Use oas.getSchemas() instead\n */\nexport function getSchemas({ oas, contentType, includes = ['schemas', 'requestBodies', 'responses'], collisionDetection }: GetSchemasProps): GetSchemasResult {\n return oas.getSchemas({\n contentType,\n includes,\n collisionDetection,\n })\n}\n","import transformers, { isValidVarName } from '@kubb/core/transformers'\nimport type { SchemaObject } from '@kubb/oas'\n\n/**\n * Apply casing transformation to schema properties\n * Only transforms property names, not nested schemas\n */\nexport function applyParamsCasing(schema: SchemaObject, casing: 'camelcase' | undefined): SchemaObject {\n if (!casing || !schema.properties) {\n return schema\n }\n\n const transformedProperties: Record<string, any> = {}\n const transformedRequired: string[] = []\n\n // Transform property names\n Object.entries(schema.properties).forEach(([originalName, propertySchema]) => {\n let transformedName = originalName\n\n if (casing === 'camelcase') {\n transformedName = transformers.camelCase(originalName)\n } else if (!isValidVarName(originalName)) {\n // If not valid variable name, make it valid\n transformedName = transformers.camelCase(originalName)\n }\n\n transformedProperties[transformedName] = propertySchema\n })\n\n // Transform required field names\n if (Array.isArray(schema.required)) {\n schema.required.forEach((originalName) => {\n let transformedName = originalName\n\n if (casing === 'camelcase') {\n transformedName = transformers.camelCase(originalName)\n } else if (!isValidVarName(originalName)) {\n transformedName = transformers.camelCase(originalName)\n }\n\n transformedRequired.push(transformedName)\n })\n }\n\n // Return a new schema with transformed properties and required fields\n return {\n ...schema,\n properties: transformedProperties,\n ...(transformedRequired.length > 0 && { required: transformedRequired }),\n } as SchemaObject\n}\n\n/**\n * Check if this schema is a parameter schema (pathParams, queryParams, or headerParams)\n * Only these should be transformed, not response/data/body\n */\nexport function isParameterSchema(schemaName: string): boolean {\n const lowerName = schemaName.toLowerCase()\n return lowerName.includes('pathparams') || lowerName.includes('queryparams') || lowerName.includes('headerparams')\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","names":["#options","#transformParam","#eachParam"],"sources":["../../../internals/utils/src/reserved.ts","../../../internals/utils/src/urlPath.ts","../src/utils/getComments.ts","../src/utils/getImports.ts","../src/utils/getParams.ts","../src/utils/getSchemas.ts","../src/utils/paramsCasing.ts"],"sourcesContent":["/**\n * JavaScript and Java reserved words.\n * @link https://github.com/jonschlinkert/reserved/blob/master/index.js\n */\nconst reservedWords = [\n 'abstract',\n 'arguments',\n 'boolean',\n 'break',\n 'byte',\n 'case',\n 'catch',\n 'char',\n 'class',\n 'const',\n 'continue',\n 'debugger',\n 'default',\n 'delete',\n 'do',\n 'double',\n 'else',\n 'enum',\n 'eval',\n 'export',\n 'extends',\n 'false',\n 'final',\n 'finally',\n 'float',\n 'for',\n 'function',\n 'goto',\n 'if',\n 'implements',\n 'import',\n 'in',\n 'instanceof',\n 'int',\n 'interface',\n 'let',\n 'long',\n 'native',\n 'new',\n 'null',\n 'package',\n 'private',\n 'protected',\n 'public',\n 'return',\n 'short',\n 'static',\n 'super',\n 'switch',\n 'synchronized',\n 'this',\n 'throw',\n 'throws',\n 'transient',\n 'true',\n 'try',\n 'typeof',\n 'var',\n 'void',\n 'volatile',\n 'while',\n 'with',\n 'yield',\n 'Array',\n 'Date',\n 'hasOwnProperty',\n 'Infinity',\n 'isFinite',\n 'isNaN',\n 'isPrototypeOf',\n 'length',\n 'Math',\n 'name',\n 'NaN',\n 'Number',\n 'Object',\n 'prototype',\n 'String',\n 'toString',\n 'undefined',\n 'valueOf',\n]\n\n/**\n * Prefixes a word with `_` when it is a reserved JavaScript/Java identifier\n * or starts with a digit.\n */\nexport function transformReservedWord(word: string): string {\n const firstChar = word.charCodeAt(0)\n if (word && (reservedWords.includes(word) || (firstChar >= 48 && firstChar <= 57))) {\n return `_${word}`\n }\n return word\n}\n\n/**\n * Returns `true` when `name` is a syntactically valid JavaScript variable name.\n */\nexport function isValidVarName(name: string): boolean {\n try {\n new Function(`var ${name}`)\n } catch {\n return false\n }\n return true\n}\n","import { camelCase } from './casing.ts'\nimport { isValidVarName } from './reserved.ts'\n\nexport type URLObject = {\n /** The resolved URL string (Express-style or template literal, depending on context). */\n url: string\n /** Extracted path parameters as a key-value map, or `undefined` when the path has none. */\n params?: Record<string, string>\n}\n\ntype ObjectOptions = {\n /** Controls whether the `url` is rendered as an Express path or a template literal. Defaults to `'path'`. */\n type?: 'path' | 'template'\n /** Optional transform applied to each extracted parameter name. */\n replacer?: (pathParam: string) => string\n /** When `true`, the result is serialized to a string expression instead of a plain object. */\n stringify?: boolean\n}\n\n/** Supported identifier casing strategies for path parameters. */\ntype PathCasing = 'camelcase'\n\ntype Options = {\n /** Casing strategy applied to path parameter names. Defaults to the original identifier. */\n casing?: PathCasing\n}\n\n/**\n * Parses and transforms an OpenAPI/Swagger path string into various URL formats.\n *\n * @example\n * const p = new URLPath('/pet/{petId}')\n * p.URL // '/pet/:petId'\n * p.template // '`/pet/${petId}`'\n */\nexport class URLPath {\n /** The raw OpenAPI/Swagger path string, e.g. `/pet/{petId}`. */\n path: string\n\n #options: Options\n\n constructor(path: string, options: Options = {}) {\n this.path = path\n this.#options = options\n }\n\n /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */\n get URL(): string {\n return this.toURLPath()\n }\n\n /** Returns `true` when `path` is a fully-qualified URL (e.g. starts with `https://`). */\n get isURL(): boolean {\n try {\n return !!new URL(this.path).href\n } catch {\n return false\n }\n }\n\n /**\n * Converts the OpenAPI path to a TypeScript template literal string.\n *\n * @example\n * new URLPath('/pet/{petId}').template // '`/pet/${petId}`'\n * new URLPath('/account/monetary-accountID').template // '`/account/${monetaryAccountId}`'\n */\n get template(): string {\n return this.toTemplateString()\n }\n\n /** Returns the path and its extracted params as a structured `URLObject`, or as a stringified expression when `stringify` is set. */\n get object(): URLObject | string {\n return this.toObject()\n }\n\n /** Returns a map of path parameter names, or `undefined` when the path has no parameters. */\n get params(): Record<string, string> | undefined {\n return this.getParams()\n }\n\n #transformParam(raw: string): string {\n const param = isValidVarName(raw) ? raw : camelCase(raw)\n return this.#options.casing === 'camelcase' ? camelCase(param) : param\n }\n\n /** Iterates over every `{param}` token in `path`, calling `fn` with the raw token and transformed name. */\n #eachParam(fn: (raw: string, param: string) => void): void {\n for (const match of this.path.matchAll(/\\{([^}]+)\\}/g)) {\n const raw = match[1]!\n fn(raw, this.#transformParam(raw))\n }\n }\n\n toObject({ type = 'path', replacer, stringify }: ObjectOptions = {}): URLObject | string {\n const object = {\n url: type === 'path' ? this.toURLPath() : this.toTemplateString({ replacer }),\n params: this.getParams(),\n }\n\n if (stringify) {\n if (type === 'template') {\n return JSON.stringify(object).replaceAll(\"'\", '').replaceAll(`\"`, '')\n }\n\n if (object.params) {\n return `{ url: '${object.url}', params: ${JSON.stringify(object.params).replaceAll(\"'\", '').replaceAll(`\"`, '')} }`\n }\n\n return `{ url: '${object.url}' }`\n }\n\n return object\n }\n\n /**\n * Converts the OpenAPI path to a TypeScript template literal string.\n * An optional `replacer` can transform each extracted parameter name before interpolation.\n *\n * @example\n * new URLPath('/pet/{petId}').toTemplateString() // '`/pet/${petId}`'\n */\n toTemplateString({ prefix = '', replacer }: { prefix?: string; replacer?: (pathParam: string) => string } = {}): string {\n const parts = this.path.split(/\\{([^}]+)\\}/)\n const result = parts\n .map((part, i) => {\n if (i % 2 === 0) return part\n const param = this.#transformParam(part)\n return `\\${${replacer ? replacer(param) : param}}`\n })\n .join('')\n\n return `\\`${prefix}${result}\\``\n }\n\n /**\n * Extracts all `{param}` segments from the path and returns them as a key-value map.\n * An optional `replacer` transforms each parameter name in both key and value positions.\n * Returns `undefined` when no path parameters are found.\n */\n getParams(replacer?: (pathParam: string) => string): Record<string, string> | undefined {\n const params: Record<string, string> = {}\n\n this.#eachParam((_raw, param) => {\n const key = replacer ? replacer(param) : param\n params[key] = key\n })\n\n return Object.keys(params).length > 0 ? params : undefined\n }\n\n /** Converts the OpenAPI path to Express-style colon syntax, e.g. `/pet/{petId}` → `/pet/:petId`. */\n toURLPath(): string {\n return this.path.replace(/\\{([^}]+)\\}/g, ':$1')\n }\n}\n","import { URLPath } from '@internals/utils'\nimport type { Operation } from '@kubb/oas'\n\nexport function getComments(operation: Operation): string[] {\n return [\n operation.getDescription() && `@description ${operation.getDescription()}`,\n operation.getSummary() && `@summary ${operation.getSummary()}`,\n operation.path && `{@link ${new URLPath(operation.path).URL}}`,\n operation.isDeprecated() && '@deprecated',\n ]\n .filter((x): x is string => Boolean(x))\n .flatMap((text) => {\n return text.split(/\\r?\\n/).map((line) => line.trim())\n })\n .filter((x): x is string => Boolean(x))\n}\n","import type { KubbFile } from '@kubb/fabric-core/types'\nimport { SchemaGenerator } from '../SchemaGenerator.ts'\nimport type { Schema } from '../SchemaMapper'\nimport { schemaKeywords } from '../SchemaMapper'\n\n/**\n * Get imports from a schema tree by extracting all ref schemas that are importable\n */\nexport function getImports(tree: Array<Schema>): Array<KubbFile.Import> {\n const refs = SchemaGenerator.deepSearch(tree, schemaKeywords.ref)\n\n if (!refs) return []\n\n return refs\n .map((item) => {\n if (!item.args.path || !item.args.isImportable) {\n return undefined\n }\n\n return {\n name: [item.args.name],\n path: item.args.path,\n } satisfies KubbFile.Import\n })\n .filter((x): x is NonNullable<typeof x> => x !== undefined)\n}\n","import { camelCase, isValidVarName } from '@internals/utils'\nimport type { FunctionParamsAST } from '@kubb/core'\nimport type { OasTypes } from '@kubb/oas'\nimport type { Params } from '@kubb/react-fabric/types'\nimport type { OperationSchema } from '../types.ts'\n/**\n *\n * @deprecated\n * TODO move to operationManager hook\n */\nexport function getASTParams(\n operationSchema: OperationSchema | undefined,\n {\n typed = false,\n casing,\n override,\n }: {\n typed?: boolean\n casing?: 'camelcase'\n override?: (data: FunctionParamsAST) => FunctionParamsAST\n } = {},\n): FunctionParamsAST[] {\n if (!operationSchema || !operationSchema.schema.properties || !operationSchema.name) {\n return []\n }\n\n const requiredFields = Array.isArray(operationSchema.schema.required) ? operationSchema.schema.required : []\n\n return Object.entries(operationSchema.schema.properties).map(([name]: [string, OasTypes.SchemaObject]) => {\n // Use camelCase name for indexed access if casing is enabled\n const accessName = casing === 'camelcase' ? camelCase(name) : name\n\n const data: FunctionParamsAST = {\n name,\n enabled: !!name,\n required: requiredFields.includes(name),\n type: typed ? `${operationSchema.name}[\"${accessName}\"]` : undefined,\n }\n\n return override ? override(data) : data\n })\n}\n\nexport function getPathParams(\n operationSchema: OperationSchema | undefined,\n options: {\n typed?: boolean\n casing?: 'camelcase'\n override?: (data: FunctionParamsAST) => FunctionParamsAST\n } = {},\n) {\n return getASTParams(operationSchema, options).reduce((acc, curr) => {\n if (curr.name && curr.enabled) {\n let name = curr.name\n\n // Only transform to camelCase if explicitly requested\n if (options.casing === 'camelcase') {\n name = camelCase(name)\n } else if (!isValidVarName(name)) {\n // If not valid variable name and casing not set, still need to make it valid\n name = camelCase(name)\n }\n\n acc[name] = {\n default: curr.default,\n type: curr.type,\n optional: !curr.required,\n }\n }\n\n return acc\n }, {} as Params)\n}\n\n/**\n * Get a mapping of camelCase parameter names to their original names\n * Used for mapping function parameters to backend parameter names\n */\nexport function getParamsMapping(\n operationSchema: OperationSchema | undefined,\n options: {\n casing?: 'camelcase'\n } = {},\n): Record<string, string> | undefined {\n if (!operationSchema || !operationSchema.schema.properties) {\n return undefined\n }\n\n const allEntries: Array<[string, string]> = []\n let hasTransformation = false\n\n Object.entries(operationSchema.schema.properties).forEach(([originalName]) => {\n let transformedName = originalName\n\n // Only transform to camelCase if explicitly requested\n if (options.casing === 'camelcase') {\n transformedName = camelCase(originalName)\n } else if (!isValidVarName(originalName)) {\n // If not valid variable name and casing not set, still need to make it valid\n transformedName = camelCase(originalName)\n }\n\n allEntries.push([originalName, transformedName])\n\n if (transformedName !== originalName) {\n hasTransformation = true\n }\n })\n\n // When using explicit casing and there are transformations, include ALL params so that\n // mappedParams contains every parameter (not just the ones whose names changed).\n // This prevents params with already-camelCase names (e.g. 'page', 'search') from being\n // silently dropped when other params in the same schema do need transformation.\n if (options.casing === 'camelcase' && hasTransformation) {\n return Object.fromEntries(allEntries)\n }\n\n // When casing is not specified or no transformations are needed, only return changed entries\n const mapping: Record<string, string> = {}\n allEntries.forEach(([originalName, transformedName]) => {\n if (transformedName !== originalName) {\n mapping[originalName] = transformedName\n }\n })\n\n return Object.keys(mapping).length > 0 ? mapping : undefined\n}\n","import type { contentType, Oas, OasTypes } from '@kubb/oas'\n\nexport type GetSchemasResult = {\n schemas: Record<string, OasTypes.SchemaObject>\n /**\n * Mapping from original component name to resolved name after collision handling\n * e.g., { 'Order': 'OrderSchema', 'variant': 'variant2' }\n */\n nameMapping: Map<string, string>\n}\n\ntype Mode = 'schemas' | 'responses' | 'requestBodies'\n\ntype GetSchemasProps = {\n oas: Oas\n contentType?: contentType\n includes?: Mode[]\n /**\n * Whether to resolve name collisions with suffixes.\n * If not provided, uses oas.options.collisionDetection\n * @default false (from oas.options or fallback)\n */\n collisionDetection?: boolean\n}\n\n/**\n * Collect schemas from OpenAPI components (schemas, responses, requestBodies)\n * and return them in dependency order along with name mapping for collision resolution.\n *\n * This function is a wrapper around the oas.getSchemas() method for backward compatibility.\n * New code should use oas.getSchemas() directly.\n *\n * @deprecated Use oas.getSchemas() instead\n */\nexport function getSchemas({ oas, contentType, includes = ['schemas', 'requestBodies', 'responses'], collisionDetection }: GetSchemasProps): GetSchemasResult {\n return oas.getSchemas({\n contentType,\n includes,\n collisionDetection,\n })\n}\n","import { camelCase, isValidVarName } from '@internals/utils'\nimport type { SchemaObject } from '@kubb/oas'\n\n/**\n * Apply casing transformation to schema properties\n * Only transforms property names, not nested schemas\n */\nexport function applyParamsCasing(schema: SchemaObject, casing: 'camelcase' | undefined): SchemaObject {\n if (!casing || !schema.properties) {\n return schema\n }\n\n const transformedProperties: Record<string, any> = {}\n const transformedRequired: string[] = []\n\n // Transform property names\n Object.entries(schema.properties).forEach(([originalName, propertySchema]) => {\n let transformedName = originalName\n\n if (casing === 'camelcase') {\n transformedName = camelCase(originalName)\n } else if (!isValidVarName(originalName)) {\n // If not valid variable name, make it valid\n transformedName = camelCase(originalName)\n }\n\n transformedProperties[transformedName] = propertySchema\n })\n\n // Transform required field names\n if (Array.isArray(schema.required)) {\n schema.required.forEach((originalName) => {\n let transformedName = originalName\n\n if (casing === 'camelcase') {\n transformedName = camelCase(originalName)\n } else if (!isValidVarName(originalName)) {\n transformedName = camelCase(originalName)\n }\n\n transformedRequired.push(transformedName)\n })\n }\n\n // Return a new schema with transformed properties and required fields\n return {\n ...schema,\n properties: transformedProperties,\n ...(transformedRequired.length > 0 && { required: transformedRequired }),\n } as SchemaObject\n}\n\n/**\n * Check if this schema is a parameter schema (pathParams, queryParams, or headerParams)\n * Only these should be transformed, not response/data/body\n */\nexport function isParameterSchema(schemaName: string): boolean {\n const lowerName = schemaName.toLowerCase()\n return lowerName.includes('pathparams') || lowerName.includes('queryparams') || lowerName.includes('headerparams')\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/plugin-oas",
3
- "version": "4.33.0",
3
+ "version": "4.33.2",
4
4
  "description": "OpenAPI Specification (OAS) plugin for Kubb, providing core functionality for parsing and processing OpenAPI/Swagger schemas for code generation.",
5
5
  "keywords": [
6
6
  "openapi",
@@ -83,8 +83,8 @@
83
83
  "dependencies": {
84
84
  "@kubb/react-fabric": "0.13.3",
85
85
  "remeda": "^2.33.6",
86
- "@kubb/core": "4.33.0",
87
- "@kubb/oas": "4.33.0"
86
+ "@kubb/core": "4.33.2",
87
+ "@kubb/oas": "4.33.2"
88
88
  },
89
89
  "peerDependencies": {
90
90
  "@kubb/react-fabric": "0.13.3"
@@ -97,7 +97,8 @@
97
97
  "registry": "https://registry.npmjs.org/"
98
98
  },
99
99
  "devDependencies": {
100
- "p-limit": "^7.3.0"
100
+ "p-limit": "^7.3.0",
101
+ "@internals/utils": "0.0.0"
101
102
  },
102
103
  "main": "./dist/index.cjs",
103
104
  "module": "./dist/index.js",
@@ -1,7 +1,6 @@
1
- import type { KubbEvents, Plugin, PluginFactoryOptions, PluginManager } from '@kubb/core'
2
- import { BaseGenerator, type FileMetaBase } from '@kubb/core'
3
- import transformers from '@kubb/core/transformers'
4
- import type { AsyncEventEmitter } from '@kubb/core/utils'
1
+ import type { AsyncEventEmitter } from '@internals/utils'
2
+ import { pascalCase } from '@internals/utils'
3
+ import type { FileMetaBase, KubbEvents, Plugin, PluginFactoryOptions, PluginManager } from '@kubb/core'
5
4
  import type { KubbFile } from '@kubb/fabric-core/types'
6
5
  import type { contentType, HttpMethod, Oas, OasTypes, Operation, SchemaObject } from '@kubb/oas'
7
6
  import type { Fabric } from '@kubb/react-fabric'
@@ -30,79 +29,59 @@ type Context<TOptions, TPluginOptions extends PluginFactoryOptions> = {
30
29
  UNSTABLE_NAMING?: true
31
30
  }
32
31
 
33
- export class OperationGenerator<
34
- TPluginOptions extends PluginFactoryOptions = PluginFactoryOptions,
35
- TFileMeta extends FileMetaBase = FileMetaBase,
36
- > extends BaseGenerator<TPluginOptions['resolvedOptions'], Context<TPluginOptions['resolvedOptions'], TPluginOptions>> {
32
+ export class OperationGenerator<TPluginOptions extends PluginFactoryOptions = PluginFactoryOptions, TFileMeta extends FileMetaBase = FileMetaBase> {
33
+ #options: TPluginOptions['resolvedOptions']
34
+ #context: Context<TPluginOptions['resolvedOptions'], TPluginOptions>
35
+
36
+ constructor(options: TPluginOptions['resolvedOptions'], context: Context<TPluginOptions['resolvedOptions'], TPluginOptions>) {
37
+ this.#options = options
38
+ this.#context = context
39
+ }
40
+
41
+ get options(): TPluginOptions['resolvedOptions'] {
42
+ return this.#options
43
+ }
44
+
45
+ set options(options: TPluginOptions['resolvedOptions']) {
46
+ this.#options = { ...this.#options, ...options }
47
+ }
48
+
49
+ get context(): Context<TPluginOptions['resolvedOptions'], TPluginOptions> {
50
+ return this.#context
51
+ }
52
+ #matchesPattern(operation: Operation, method: HttpMethod, type: string, pattern: RegExp | string): boolean {
53
+ switch (type) {
54
+ case 'tag':
55
+ return operation.getTags().some((tag) => tag.name.match(pattern))
56
+ case 'operationId':
57
+ return !!operation.getOperationId({ friendlyCase: true }).match(pattern)
58
+ case 'path':
59
+ return !!operation.path.match(pattern)
60
+ case 'method':
61
+ return !!method.match(pattern)
62
+ case 'contentType':
63
+ return !!operation.getContentType().match(pattern)
64
+ default:
65
+ return false
66
+ }
67
+ }
68
+
37
69
  getOptions(operation: Operation, method: HttpMethod): Partial<TPluginOptions['resolvedOptions']> {
38
70
  const { override = [] } = this.context
39
- const operationId = operation.getOperationId({ friendlyCase: true })
40
- const contentType = operation.getContentType()
41
-
42
- return (
43
- override.find(({ pattern, type }) => {
44
- switch (type) {
45
- case 'tag':
46
- return operation.getTags().some((tag) => tag.name.match(pattern))
47
- case 'operationId':
48
- return !!operationId.match(pattern)
49
- case 'path':
50
- return !!operation.path.match(pattern)
51
- case 'method':
52
- return !!method.match(pattern)
53
- case 'contentType':
54
- return !!contentType.match(pattern)
55
- default:
56
- return false
57
- }
58
- })?.options || {}
59
- )
71
+
72
+ return override.find(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))?.options || {}
60
73
  }
61
74
 
62
75
  #isExcluded(operation: Operation, method: HttpMethod): boolean {
63
76
  const { exclude = [] } = this.context
64
- const operationId = operation.getOperationId({ friendlyCase: true })
65
- const contentType = operation.getContentType()
66
-
67
- return exclude.some(({ pattern, type }) => {
68
- switch (type) {
69
- case 'tag':
70
- return operation.getTags().some((tag) => tag.name.match(pattern))
71
- case 'operationId':
72
- return !!operationId.match(pattern)
73
- case 'path':
74
- return !!operation.path.match(pattern)
75
- case 'method':
76
- return !!method.match(pattern)
77
- case 'contentType':
78
- return !!contentType.match(pattern)
79
- default:
80
- return false
81
- }
82
- })
77
+
78
+ return exclude.some(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))
83
79
  }
84
80
 
85
81
  #isIncluded(operation: Operation, method: HttpMethod): boolean {
86
82
  const { include = [] } = this.context
87
- const operationId = operation.getOperationId({ friendlyCase: true })
88
- const contentType = operation.getContentType()
89
-
90
- return include.some(({ pattern, type }) => {
91
- switch (type) {
92
- case 'tag':
93
- return operation.getTags().some((tag) => tag.name.match(pattern))
94
- case 'operationId':
95
- return !!operationId.match(pattern)
96
- case 'path':
97
- return !!operation.path.match(pattern)
98
- case 'method':
99
- return !!method.match(pattern)
100
- case 'contentType':
101
- return !!contentType.match(pattern)
102
- default:
103
- return false
104
- }
105
- })
83
+
84
+ return include.some(({ pattern, type }) => this.#matchesPattern(operation, method, type, pattern))
106
85
  }
107
86
 
108
87
  getSchemas(
@@ -114,7 +93,7 @@ export class OperationGenerator<
114
93
  } = {},
115
94
  ): OperationSchemas {
116
95
  const operationId = operation.getOperationId({ friendlyCase: true })
117
- const operationName = transformers.pascalCase(operationId)
96
+ const operationName = pascalCase(operationId)
118
97
 
119
98
  const resolveKeys = (schema?: SchemaObject) => (schema?.properties ? Object.keys(schema.properties) : undefined)
120
99
 
@@ -128,9 +107,7 @@ export class OperationGenerator<
128
107
  const keys = resolveKeys(schema)
129
108
 
130
109
  return {
131
- name: this.context.UNSTABLE_NAMING
132
- ? resolveName(transformers.pascalCase(`${operationId} status ${name}`))
133
- : resolveName(transformers.pascalCase(`${operationId} ${name}`)),
110
+ name: this.context.UNSTABLE_NAMING ? resolveName(pascalCase(`${operationId} status ${name}`)) : resolveName(pascalCase(`${operationId} ${name}`)),
134
111
  description: (operation.getResponseByStatusCode(statusCode) as OasTypes.ResponseObject)?.description,
135
112
  schema,
136
113
  operation,
@@ -148,8 +125,8 @@ export class OperationGenerator<
148
125
  requestSchema
149
126
  ? {
150
127
  name: this.context.UNSTABLE_NAMING
151
- ? resolveName(transformers.pascalCase(`${operationId} RequestData`))
152
- : resolveName(transformers.pascalCase(`${operationId} ${operation.method === 'get' ? 'queryRequest' : 'mutationRequest'}`)),
128
+ ? resolveName(pascalCase(`${operationId} RequestData`))
129
+ : resolveName(pascalCase(`${operationId} ${operation.method === 'get' ? 'queryRequest' : 'mutationRequest'}`)),
153
130
  description: (operation.schema.requestBody as OasTypes.RequestBodyObject)?.description,
154
131
  operation,
155
132
  operationName,
@@ -163,7 +140,7 @@ export class OperationGenerator<
163
140
  return {
164
141
  pathParams: pathParamsSchema
165
142
  ? {
166
- name: resolveName(transformers.pascalCase(`${operationId} PathParams`)),
143
+ name: resolveName(pascalCase(`${operationId} PathParams`)),
167
144
  operation,
168
145
  operationName,
169
146
  schema: pathParamsSchema,
@@ -172,7 +149,7 @@ export class OperationGenerator<
172
149
  : undefined,
173
150
  queryParams: queryParamsSchema
174
151
  ? {
175
- name: resolveName(transformers.pascalCase(`${operationId} QueryParams`)),
152
+ name: resolveName(pascalCase(`${operationId} QueryParams`)),
176
153
  operation,
177
154
  operationName,
178
155
  schema: queryParamsSchema,
@@ -181,7 +158,7 @@ export class OperationGenerator<
181
158
  : undefined,
182
159
  headerParams: headerParamsSchema
183
160
  ? {
184
- name: resolveName(transformers.pascalCase(`${operationId} HeaderParams`)),
161
+ name: resolveName(pascalCase(`${operationId} HeaderParams`)),
185
162
  operation,
186
163
  operationName,
187
164
  schema: headerParamsSchema,
@@ -191,8 +168,8 @@ export class OperationGenerator<
191
168
  request,
192
169
  response: {
193
170
  name: this.context.UNSTABLE_NAMING
194
- ? resolveName(transformers.pascalCase(`${operationId} ResponseData`))
195
- : resolveName(transformers.pascalCase(`${operationId} ${operation.method === 'get' ? 'queryResponse' : 'mutationResponse'}`)),
171
+ ? resolveName(pascalCase(`${operationId} ResponseData`))
172
+ : resolveName(pascalCase(`${operationId} ${operation.method === 'get' ? 'queryResponse' : 'mutationResponse'}`)),
196
173
  operation,
197
174
  operationName,
198
175
  schema: {
@@ -224,7 +201,7 @@ export class OperationGenerator<
224
201
 
225
202
  return operation ? { path, method: method as HttpMethod, operation } : null
226
203
  })
227
- .filter(Boolean),
204
+ .filter((x): x is { path: string; method: HttpMethod; operation: Operation } => x !== null),
228
205
  )
229
206
  }
230
207