@kubb/plugin-ts 4.14.0 → 4.15.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 (42) hide show
  1. package/dist/{components-HKIi69kI.js → components-BE9rQGox.js} +60 -28
  2. package/dist/components-BE9rQGox.js.map +1 -0
  3. package/dist/{components-pzX1Kb4u.cjs → components-CGcs8968.cjs} +90 -28
  4. package/dist/components-CGcs8968.cjs.map +1 -0
  5. package/dist/components.cjs +1 -1
  6. package/dist/components.d.cts +3 -1
  7. package/dist/components.d.ts +3 -1
  8. package/dist/components.js +1 -1
  9. package/dist/generators.cjs +1 -1
  10. package/dist/generators.d.cts +1 -1
  11. package/dist/generators.d.ts +1 -1
  12. package/dist/generators.js +1 -1
  13. package/dist/index.cjs +1 -1
  14. package/dist/index.d.cts +1 -1
  15. package/dist/index.d.ts +1 -1
  16. package/dist/index.js +1 -1
  17. package/dist/{plugin-DljW3znk.cjs → plugin-B96TNDf4.cjs} +174 -21
  18. package/dist/plugin-B96TNDf4.cjs.map +1 -0
  19. package/dist/{plugin-BEfry-Dm.js → plugin-DXyNbr_u.js} +173 -21
  20. package/dist/plugin-DXyNbr_u.js.map +1 -0
  21. package/dist/{types-DcA3qMIF.d.ts → types-D59kq_S_.d.ts} +27 -1
  22. package/dist/{types-C51mhXW0.d.cts → types-njfY0PGo.d.cts} +27 -1
  23. package/package.json +4 -4
  24. package/src/components/Type.tsx +8 -2
  25. package/src/factory.ts +77 -3
  26. package/src/generators/__snapshots__/createPet.ts +1 -1
  27. package/src/generators/__snapshots__/createPetWithEmptySchemaTypeUnknown.ts +1 -1
  28. package/src/generators/__snapshots__/createPetWithEmptySchemaTypeVoid.ts +1 -1
  29. package/src/generators/__snapshots__/createPetWithUnknownTypeUnknown.ts +1 -1
  30. package/src/generators/__snapshots__/createPetWithUnknownTypeVoid.ts +1 -1
  31. package/src/generators/__snapshots__/deletePet.ts +1 -1
  32. package/src/generators/__snapshots__/getPets.ts +1 -1
  33. package/src/generators/__snapshots__/showPetById.ts +1 -1
  34. package/src/generators/__snapshots__/systemsWithExplodeForm.ts +1 -1
  35. package/src/generators/typeGenerator.tsx +232 -8
  36. package/src/parser.ts +9 -20
  37. package/src/plugin.ts +4 -0
  38. package/src/types.ts +12 -0
  39. package/dist/components-HKIi69kI.js.map +0 -1
  40. package/dist/components-pzX1Kb4u.cjs.map +0 -1
  41. package/dist/plugin-BEfry-Dm.js.map +0 -1
  42. package/dist/plugin-DljW3znk.cjs.map +0 -1
@@ -1,4 +1,4 @@
1
- import { a as createTypeLiteralNode, c as modifiers, i as createTypeAliasDeclaration, n as createIdentifier, o as createTypeReferenceNode, r as createPropertySignature, s as createUnionDeclaration, t as Type } from "./components-HKIi69kI.js";
1
+ import { a as createTypeAliasDeclaration, c as createTypeReferenceNode, d as getUnknownType, f as keywordTypeNodes, i as createPropertySignature, l as createUnionDeclaration, n as createIdentifier, o as createTypeLiteralNode, p as modifiers, r as createIndexedAccessTypeNode, s as createTypeOperatorNode, t as Type, u as createUrlTemplateType } from "./components-BE9rQGox.js";
2
2
  import path from "node:path";
3
3
  import { definePlugin, getBarrelFiles, getMode } from "@kubb/core";
4
4
  import transformers, { camelCase, pascalCase } from "@kubb/core/transformers";
@@ -9,6 +9,7 @@ import { createReactGenerator } from "@kubb/plugin-oas/generators";
9
9
  import { useOas, useOperationManager, useSchemaManager } from "@kubb/plugin-oas/hooks";
10
10
  import { getBanner, getFooter } from "@kubb/plugin-oas/utils";
11
11
  import { File } from "@kubb/react-fabric";
12
+ import ts from "typescript";
12
13
  import { Fragment, jsx, jsxs } from "@kubb/react-fabric/jsx-runtime";
13
14
 
14
15
  //#region src/generators/typeGenerator.tsx
@@ -75,22 +76,145 @@ function printCombinedSchema({ name, schemas, pluginManager }) {
75
76
  modifiers: [modifiers.export]
76
77
  }));
77
78
  }
79
+ function printRequestSchema({ baseName, operation, schemas, pluginManager }) {
80
+ const name = pluginManager.resolveName({
81
+ name: `${baseName} Request`,
82
+ pluginKey: [pluginTsName],
83
+ type: "type"
84
+ });
85
+ const results = [];
86
+ const dataRequestProperties = [];
87
+ if (schemas.request) {
88
+ const identifier = pluginManager.resolveName({
89
+ name: schemas.request.name,
90
+ pluginKey: [pluginTsName],
91
+ type: "type"
92
+ });
93
+ dataRequestProperties.push(createPropertySignature({
94
+ name: "data",
95
+ questionToken: true,
96
+ type: createTypeReferenceNode(createIdentifier(identifier), void 0)
97
+ }));
98
+ } else dataRequestProperties.push(createPropertySignature({
99
+ name: "data",
100
+ questionToken: true,
101
+ type: keywordTypeNodes.never
102
+ }));
103
+ if (schemas.pathParams) {
104
+ const identifier = pluginManager.resolveName({
105
+ name: schemas.pathParams.name,
106
+ pluginKey: [pluginTsName],
107
+ type: "type"
108
+ });
109
+ dataRequestProperties.push(createPropertySignature({
110
+ name: "pathParams",
111
+ type: createTypeReferenceNode(createIdentifier(identifier), void 0)
112
+ }));
113
+ } else dataRequestProperties.push(createPropertySignature({
114
+ name: "pathParams",
115
+ questionToken: true,
116
+ type: keywordTypeNodes.never
117
+ }));
118
+ if (schemas.queryParams) {
119
+ const identifier = pluginManager.resolveName({
120
+ name: schemas.queryParams.name,
121
+ pluginKey: [pluginTsName],
122
+ type: "type"
123
+ });
124
+ dataRequestProperties.push(createPropertySignature({
125
+ name: "queryParams",
126
+ questionToken: true,
127
+ type: createTypeReferenceNode(createIdentifier(identifier), void 0)
128
+ }));
129
+ } else dataRequestProperties.push(createPropertySignature({
130
+ name: "queryParams",
131
+ questionToken: true,
132
+ type: keywordTypeNodes.never
133
+ }));
134
+ if (schemas.headerParams) {
135
+ const identifier = pluginManager.resolveName({
136
+ name: schemas.headerParams.name,
137
+ pluginKey: [pluginTsName],
138
+ type: "type"
139
+ });
140
+ dataRequestProperties.push(createPropertySignature({
141
+ name: "headerParams",
142
+ questionToken: true,
143
+ type: createTypeReferenceNode(createIdentifier(identifier), void 0)
144
+ }));
145
+ } else dataRequestProperties.push(createPropertySignature({
146
+ name: "headerParams",
147
+ questionToken: true,
148
+ type: keywordTypeNodes.never
149
+ }));
150
+ dataRequestProperties.push(createPropertySignature({
151
+ name: "url",
152
+ type: createUrlTemplateType(operation.path)
153
+ }));
154
+ const dataRequestNode = createTypeAliasDeclaration({
155
+ name,
156
+ type: createTypeLiteralNode(dataRequestProperties),
157
+ modifiers: [modifiers.export]
158
+ });
159
+ results.push(safePrint(dataRequestNode));
160
+ return results.join("\n\n");
161
+ }
162
+ function printResponseSchema({ baseName, schemas, pluginManager, unknownType }) {
163
+ const results = [];
164
+ const name = pluginManager.resolveName({
165
+ name: `${baseName} ResponseData`,
166
+ pluginKey: [pluginTsName],
167
+ type: "type"
168
+ });
169
+ if (schemas.responses && schemas.responses.length > 0) {
170
+ const responsesProperties = schemas.responses.map((res) => {
171
+ const identifier = pluginManager.resolveName({
172
+ name: res.name,
173
+ pluginKey: [pluginTsName],
174
+ type: "type"
175
+ });
176
+ return createPropertySignature({
177
+ name: res.statusCode?.toString() ?? "default",
178
+ type: createTypeReferenceNode(createIdentifier(identifier), void 0)
179
+ });
180
+ });
181
+ const responsesNode = createTypeAliasDeclaration({
182
+ name: `${baseName}Responses`,
183
+ type: createTypeLiteralNode(responsesProperties),
184
+ modifiers: [modifiers.export]
185
+ });
186
+ results.push(safePrint(responsesNode));
187
+ const responseNode = createTypeAliasDeclaration({
188
+ name,
189
+ type: createIndexedAccessTypeNode(createTypeReferenceNode(createIdentifier(`${baseName}Responses`), void 0), createTypeOperatorNode(ts.SyntaxKind.KeyOfKeyword, createTypeReferenceNode(createIdentifier(`${baseName}Responses`), void 0))),
190
+ modifiers: [modifiers.export]
191
+ });
192
+ results.push(safePrint(responseNode));
193
+ } else {
194
+ const responseNode = createTypeAliasDeclaration({
195
+ name,
196
+ modifiers: [modifiers.export],
197
+ type: getUnknownType(unknownType)
198
+ });
199
+ results.push(safePrint(responseNode));
200
+ }
201
+ return results.join("\n\n");
202
+ }
78
203
  const typeGenerator = createReactGenerator({
79
204
  name: "typescript",
80
205
  Operation({ operation, generator, plugin }) {
81
- const { options, options: { mapper, enumType, syntaxType, optionalType } } = plugin;
206
+ const { options, options: { mapper, enumType, syntaxType, optionalType, arrayType, unknownType } } = plugin;
82
207
  const mode = useMode();
83
208
  const pluginManager = usePluginManager();
84
209
  const oas = useOas();
85
210
  const { getSchemas, getFile, getName, getGroup } = useOperationManager(generator);
86
211
  const schemaManager = useSchemaManager();
87
- const file = getFile(operation);
88
- const schemas = getSchemas(operation);
89
- const type = getName(operation, {
90
- type: "function",
212
+ const name = getName(operation, {
213
+ type: "type",
91
214
  pluginKey: [pluginTsName]
92
215
  });
93
- const combinedSchemaName = operation.method === "get" ? `${type}Query` : `${type}Mutation`;
216
+ const file = getFile(operation);
217
+ const schemas = getSchemas(operation);
94
218
  const schemaGenerator = new SchemaGenerator(options, {
95
219
  fabric: generator.context.fabric,
96
220
  oas,
@@ -108,18 +232,18 @@ const typeGenerator = createReactGenerator({
108
232
  schemas.request,
109
233
  schemas.response
110
234
  ].flat().filter(Boolean);
111
- const mapOperationSchema = ({ name, schema, description, keysToOmit, ...options$1 }) => {
235
+ const mapOperationSchema = ({ name: name$1, schema, description, keysToOmit, ...options$1 }) => {
112
236
  const tree = schemaGenerator.parse({
113
237
  schema,
114
- name,
238
+ name: name$1,
115
239
  parentName: null
116
240
  });
117
241
  const imports = schemaManager.getImports(tree);
118
242
  const group = options$1.operation ? getGroup(options$1.operation) : void 0;
119
- const type$1 = {
120
- name: schemaManager.getName(name, { type: "type" }),
121
- typedName: schemaManager.getName(name, { type: "type" }),
122
- file: schemaManager.getFile(options$1.operationName || name, { group })
243
+ const type = {
244
+ name: schemaManager.getName(name$1, { type: "type" }),
245
+ typedName: schemaManager.getName(name$1, { type: "type" }),
246
+ file: schemaManager.getFile(options$1.operationName || name$1, { group })
123
247
  };
124
248
  return /* @__PURE__ */ jsxs(Fragment, { children: [mode === "split" && imports.map((imp) => /* @__PURE__ */ jsx(File.Import, {
125
249
  root: file.path,
@@ -127,23 +251,26 @@ const typeGenerator = createReactGenerator({
127
251
  name: imp.name,
128
252
  isTypeOnly: true
129
253
  }, [
130
- name,
254
+ name$1,
131
255
  imp.name,
132
256
  imp.path,
133
257
  imp.isTypeOnly
134
258
  ].join("-"))), /* @__PURE__ */ jsx(Type, {
135
- name: type$1.name,
136
- typedName: type$1.typedName,
259
+ name: type.name,
260
+ typedName: type.typedName,
137
261
  description,
138
262
  tree,
139
263
  schema,
140
264
  mapper,
141
265
  enumType,
142
266
  optionalType,
267
+ arrayType,
143
268
  keysToOmit,
144
269
  syntaxType
145
270
  })] });
146
271
  };
272
+ const responseName = schemaManager.getName(schemas.response.name, { type: "type" });
273
+ const combinedSchemaName = operation.method === "get" ? `${name}Query` : `${name}Mutation`;
147
274
  return /* @__PURE__ */ jsxs(File, {
148
275
  baseName: file.baseName,
149
276
  path: file.path,
@@ -157,7 +284,29 @@ const typeGenerator = createReactGenerator({
157
284
  oas,
158
285
  output: plugin.options.output
159
286
  }),
160
- children: [operationSchemas.map(mapOperationSchema), /* @__PURE__ */ jsx(File.Source, {
287
+ children: [operationSchemas.map(mapOperationSchema), generator.context.UNSTABLE_NAMING ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx(File.Source, {
288
+ name: `${name}Request`,
289
+ isExportable: true,
290
+ isIndexable: true,
291
+ isTypeOnly: true,
292
+ children: printRequestSchema({
293
+ baseName: name,
294
+ operation,
295
+ schemas,
296
+ pluginManager
297
+ })
298
+ }), /* @__PURE__ */ jsx(File.Source, {
299
+ name: responseName,
300
+ isExportable: true,
301
+ isIndexable: true,
302
+ isTypeOnly: true,
303
+ children: printResponseSchema({
304
+ baseName: name,
305
+ schemas,
306
+ pluginManager,
307
+ unknownType
308
+ })
309
+ })] }) : /* @__PURE__ */ jsx(File.Source, {
161
310
  name: combinedSchemaName,
162
311
  isExportable: true,
163
312
  isIndexable: true,
@@ -171,7 +320,7 @@ const typeGenerator = createReactGenerator({
171
320
  });
172
321
  },
173
322
  Schema({ schema, plugin }) {
174
- const { options: { mapper, enumType, syntaxType, optionalType, output } } = plugin;
323
+ const { options: { mapper, enumType, syntaxType, optionalType, arrayType, output } } = plugin;
175
324
  const mode = useMode();
176
325
  const oas = useOas();
177
326
  const pluginManager = usePluginManager();
@@ -216,6 +365,7 @@ const typeGenerator = createReactGenerator({
216
365
  mapper,
217
366
  enumType,
218
367
  optionalType,
368
+ arrayType,
219
369
  syntaxType
220
370
  })]
221
371
  });
@@ -229,7 +379,7 @@ const pluginTs = definePlugin((options) => {
229
379
  const { output = {
230
380
  path: "types",
231
381
  barrelType: "named"
232
- }, group, exclude = [], include, override = [], enumType = "asConst", enumSuffix = "enum", dateType = "string", unknownType = "any", optionalType = "questionToken", emptySchemaType = unknownType, syntaxType = "type", transformers: transformers$1 = {}, mapper = {}, generators = [typeGenerator].filter(Boolean), contentType } = options;
382
+ }, group, exclude = [], include, override = [], enumType = "asConst", enumSuffix = "enum", dateType = "string", unknownType = "any", optionalType = "questionToken", arrayType = "array", emptySchemaType = unknownType, syntaxType = "type", transformers: transformers$1 = {}, mapper = {}, generators = [typeGenerator].filter(Boolean), contentType, UNSTABLE_NAMING } = options;
233
383
  return {
234
384
  name: pluginTsName,
235
385
  options: {
@@ -237,6 +387,7 @@ const pluginTs = definePlugin((options) => {
237
387
  transformers: transformers$1,
238
388
  dateType,
239
389
  optionalType,
390
+ arrayType,
240
391
  enumType,
241
392
  enumSuffix,
242
393
  unknownType,
@@ -297,7 +448,8 @@ const pluginTs = definePlugin((options) => {
297
448
  exclude,
298
449
  include,
299
450
  override,
300
- mode
451
+ mode,
452
+ UNSTABLE_NAMING
301
453
  }).build(...generators);
302
454
  await this.upsertFile(...operationFiles);
303
455
  const barrelFiles = await getBarrelFiles(this.fabric.files, {
@@ -313,4 +465,4 @@ const pluginTs = definePlugin((options) => {
313
465
 
314
466
  //#endregion
315
467
  export { pluginTsName as n, typeGenerator as r, pluginTs as t };
316
- //# sourceMappingURL=plugin-BEfry-Dm.js.map
468
+ //# sourceMappingURL=plugin-DXyNbr_u.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-DXyNbr_u.js","names":["properties: Record<string, ts.TypeNode>","factory.createUnionDeclaration","factory.createTypeReferenceNode","factory.createIdentifier","factory.createTypeAliasDeclaration","factory.createTypeLiteralNode","factory.createPropertySignature","results: string[]","dataRequestProperties: ts.PropertySignature[]","responsesProperties: ts.PropertySignature[]","factory.createIndexedAccessTypeNode","factory.createTypeOperatorNode","options","name","options","groupName: Group['name']","transformers"],"sources":["../src/generators/typeGenerator.tsx","../src/plugin.ts"],"sourcesContent":["import type { PluginManager } from '@kubb/core'\nimport { useMode, usePluginManager } from '@kubb/core/hooks'\nimport transformers from '@kubb/core/transformers'\nimport { safePrint } from '@kubb/fabric-core/parsers/typescript'\nimport type { Operation } from '@kubb/oas'\nimport { isKeyword, type OperationSchemas, type OperationSchema as OperationSchemaType, SchemaGenerator, schemaKeywords } from '@kubb/plugin-oas'\nimport { createReactGenerator } from '@kubb/plugin-oas/generators'\nimport { useOas, useOperationManager, useSchemaManager } from '@kubb/plugin-oas/hooks'\nimport { getBanner, getFooter } from '@kubb/plugin-oas/utils'\nimport { File } from '@kubb/react-fabric'\nimport ts from 'typescript'\nimport { Type } from '../components'\nimport * as factory from '../factory.ts'\nimport { createUrlTemplateType, getUnknownType, keywordTypeNodes } from '../factory.ts'\nimport { pluginTsName } from '../plugin.ts'\nimport type { PluginTs } from '../types'\n\nfunction printCombinedSchema({ name, schemas, pluginManager }: { name: string; schemas: OperationSchemas; pluginManager: PluginManager }): string {\n const properties: Record<string, ts.TypeNode> = {}\n\n if (schemas.response) {\n properties['response'] = factory.createUnionDeclaration({\n nodes: schemas.responses.map((res) => {\n const identifier = pluginManager.resolveName({\n name: res.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n\n return factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }),\n })!\n }\n\n if (schemas.request) {\n const identifier = pluginManager.resolveName({\n name: schemas.request.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n properties['request'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }\n\n if (schemas.pathParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.pathParams.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n properties['pathParams'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }\n\n if (schemas.queryParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.queryParams.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n properties['queryParams'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }\n\n if (schemas.headerParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.headerParams.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n properties['headerParams'] = factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }\n\n if (schemas.errors) {\n properties['errors'] = factory.createUnionDeclaration({\n nodes: schemas.errors.map((error) => {\n const identifier = pluginManager.resolveName({\n name: error.name,\n pluginKey: [pluginTsName],\n type: 'function',\n })\n\n return factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined)\n }),\n })!\n }\n\n const namespaceNode = factory.createTypeAliasDeclaration({\n name,\n type: factory.createTypeLiteralNode(\n Object.keys(properties)\n .map((key) => {\n const type = properties[key]\n if (!type) {\n return undefined\n }\n\n return factory.createPropertySignature({\n name: transformers.pascalCase(key),\n type,\n })\n })\n .filter(Boolean),\n ),\n modifiers: [factory.modifiers.export],\n })\n\n return safePrint(namespaceNode)\n}\n\nfunction printRequestSchema({\n baseName,\n operation,\n schemas,\n pluginManager,\n}: {\n baseName: string\n operation: Operation\n schemas: OperationSchemas\n pluginManager: PluginManager\n}): string {\n const name = pluginManager.resolveName({\n name: `${baseName} Request`,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n\n const results: string[] = []\n\n // Generate DataRequest type\n const dataRequestProperties: ts.PropertySignature[] = []\n\n if (schemas.request) {\n const identifier = pluginManager.resolveName({\n name: schemas.request.name,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'data',\n questionToken: true,\n type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),\n }),\n )\n } else {\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'data',\n questionToken: true,\n type: keywordTypeNodes.never,\n }),\n )\n }\n\n // Add pathParams property\n if (schemas.pathParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.pathParams.name,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'pathParams',\n type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),\n }),\n )\n } else {\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'pathParams',\n questionToken: true,\n type: keywordTypeNodes.never,\n }),\n )\n }\n\n // Add queryParams property\n if (schemas.queryParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.queryParams.name,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'queryParams',\n questionToken: true,\n type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),\n }),\n )\n } else {\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'queryParams',\n questionToken: true,\n type: keywordTypeNodes.never,\n }),\n )\n }\n\n // Add headerParams property\n if (schemas.headerParams) {\n const identifier = pluginManager.resolveName({\n name: schemas.headerParams.name,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'headerParams',\n questionToken: true,\n type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),\n }),\n )\n } else {\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'headerParams',\n questionToken: true,\n type: keywordTypeNodes.never,\n }),\n )\n }\n\n // Add url property with template literal type\n dataRequestProperties.push(\n factory.createPropertySignature({\n name: 'url',\n type: createUrlTemplateType(operation.path),\n }),\n )\n\n const dataRequestNode = factory.createTypeAliasDeclaration({\n name,\n type: factory.createTypeLiteralNode(dataRequestProperties),\n modifiers: [factory.modifiers.export],\n })\n\n results.push(safePrint(dataRequestNode))\n\n return results.join('\\n\\n')\n}\n\nfunction printResponseSchema({\n baseName,\n schemas,\n pluginManager,\n unknownType,\n}: {\n baseName: string\n schemas: OperationSchemas\n pluginManager: PluginManager\n unknownType: PluginTs['resolvedOptions']['unknownType']\n}): string {\n const results: string[] = []\n\n const name = pluginManager.resolveName({\n name: `${baseName} ResponseData`,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n\n // Generate Responses type (mapping status codes to response types)\n if (schemas.responses && schemas.responses.length > 0) {\n const responsesProperties: ts.PropertySignature[] = schemas.responses.map((res) => {\n const identifier = pluginManager.resolveName({\n name: res.name,\n pluginKey: [pluginTsName],\n type: 'type',\n })\n\n return factory.createPropertySignature({\n name: res.statusCode?.toString() ?? 'default',\n type: factory.createTypeReferenceNode(factory.createIdentifier(identifier), undefined),\n })\n })\n\n const responsesNode = factory.createTypeAliasDeclaration({\n name: `${baseName}Responses`,\n type: factory.createTypeLiteralNode(responsesProperties),\n modifiers: [factory.modifiers.export],\n })\n\n results.push(safePrint(responsesNode))\n\n // Generate Response type (union via indexed access)\n const responseNode = factory.createTypeAliasDeclaration({\n name,\n type: factory.createIndexedAccessTypeNode(\n factory.createTypeReferenceNode(factory.createIdentifier(`${baseName}Responses`), undefined),\n factory.createTypeOperatorNode(\n ts.SyntaxKind.KeyOfKeyword,\n factory.createTypeReferenceNode(factory.createIdentifier(`${baseName}Responses`), undefined),\n ),\n ),\n modifiers: [factory.modifiers.export],\n })\n\n results.push(safePrint(responseNode))\n } else {\n const responseNode = factory.createTypeAliasDeclaration({\n name,\n modifiers: [factory.modifiers.export],\n type: getUnknownType(unknownType),\n })\n\n results.push(safePrint(responseNode))\n }\n\n return results.join('\\n\\n')\n}\n\nexport const typeGenerator = createReactGenerator<PluginTs>({\n name: 'typescript',\n Operation({ operation, generator, plugin }) {\n const {\n options,\n options: { mapper, enumType, syntaxType, optionalType, arrayType, unknownType },\n } = plugin\n\n const mode = useMode()\n const pluginManager = usePluginManager()\n\n const oas = useOas()\n const { getSchemas, getFile, getName, getGroup } = useOperationManager(generator)\n const schemaManager = useSchemaManager()\n\n const name = getName(operation, { type: 'type', pluginKey: [pluginTsName] })\n\n const file = getFile(operation)\n const schemas = getSchemas(operation)\n const schemaGenerator = new SchemaGenerator(options, {\n fabric: generator.context.fabric,\n oas,\n events: generator.context.events,\n plugin,\n pluginManager,\n mode,\n override: options.override,\n })\n\n const operationSchemas = [schemas.pathParams, schemas.queryParams, schemas.headerParams, schemas.statusCodes, schemas.request, schemas.response]\n .flat()\n .filter(Boolean)\n\n const mapOperationSchema = ({ name, schema, description, keysToOmit, ...options }: OperationSchemaType) => {\n const tree = schemaGenerator.parse({ schema, name, parentName: null })\n const imports = schemaManager.getImports(tree)\n const group = options.operation ? getGroup(options.operation) : undefined\n\n const type = {\n name: schemaManager.getName(name, { type: 'type' }),\n typedName: schemaManager.getName(name, { type: 'type' }),\n file: schemaManager.getFile(options.operationName || name, { group }),\n }\n\n return (\n <>\n {mode === 'split' &&\n imports.map((imp) => (\n <File.Import key={[name, imp.name, imp.path, imp.isTypeOnly].join('-')} root={file.path} path={imp.path} name={imp.name} isTypeOnly />\n ))}\n <Type\n name={type.name}\n typedName={type.typedName}\n description={description}\n tree={tree}\n schema={schema}\n mapper={mapper}\n enumType={enumType}\n optionalType={optionalType}\n arrayType={arrayType}\n keysToOmit={keysToOmit}\n syntaxType={syntaxType}\n />\n </>\n )\n }\n\n const responseName = schemaManager.getName(schemas.response.name, {\n type: 'type',\n })\n const combinedSchemaName = operation.method === 'get' ? `${name}Query` : `${name}Mutation`\n\n return (\n <File\n baseName={file.baseName}\n path={file.path}\n meta={file.meta}\n banner={getBanner({ oas, output: plugin.options.output, config: pluginManager.config })}\n footer={getFooter({ oas, output: plugin.options.output })}\n >\n {operationSchemas.map(mapOperationSchema)}\n\n {generator.context.UNSTABLE_NAMING ? (\n <>\n <File.Source name={`${name}Request`} isExportable isIndexable isTypeOnly>\n {printRequestSchema({ baseName: name, operation, schemas, pluginManager })}\n </File.Source>\n <File.Source name={responseName} isExportable isIndexable isTypeOnly>\n {printResponseSchema({ baseName: name, schemas, pluginManager, unknownType })}\n </File.Source>\n </>\n ) : (\n <File.Source name={combinedSchemaName} isExportable isIndexable isTypeOnly>\n {printCombinedSchema({ name: combinedSchemaName, schemas, pluginManager })}\n </File.Source>\n )}\n </File>\n )\n },\n Schema({ schema, plugin }) {\n const {\n options: { mapper, enumType, syntaxType, optionalType, arrayType, output },\n } = plugin\n const mode = useMode()\n\n const oas = useOas()\n const pluginManager = usePluginManager()\n\n const { getName, getImports, getFile } = useSchemaManager()\n const imports = getImports(schema.tree)\n const schemaFromTree = schema.tree.find((item) => item.keyword === schemaKeywords.schema)\n\n let typedName = getName(schema.name, { type: 'type' })\n\n if (enumType === 'asConst' && schemaFromTree && isKeyword(schemaFromTree, schemaKeywords.enum)) {\n typedName = typedName += 'Key' //Suffix for avoiding collisions (https://github.com/kubb-labs/kubb/issues/1873)\n }\n\n const type = {\n name: getName(schema.name, { type: 'function' }),\n typedName,\n file: getFile(schema.name),\n }\n\n return (\n <File\n baseName={type.file.baseName}\n path={type.file.path}\n meta={type.file.meta}\n banner={getBanner({ oas, output, config: pluginManager.config })}\n footer={getFooter({ oas, output })}\n >\n {mode === 'split' &&\n imports.map((imp) => (\n <File.Import key={[schema.name, imp.path, imp.isTypeOnly].join('-')} root={type.file.path} path={imp.path} name={imp.name} isTypeOnly />\n ))}\n <Type\n name={type.name}\n typedName={type.typedName}\n description={schema.value.description}\n tree={schema.tree}\n schema={schema.value}\n mapper={mapper}\n enumType={enumType}\n optionalType={optionalType}\n arrayType={arrayType}\n syntaxType={syntaxType}\n />\n </File>\n )\n },\n})\n","import path from 'node:path'\nimport { definePlugin, type Group, getBarrelFiles, getMode } from '@kubb/core'\nimport { camelCase, pascalCase } from '@kubb/core/transformers'\nimport { OperationGenerator, pluginOasName, SchemaGenerator } from '@kubb/plugin-oas'\nimport { typeGenerator } from './generators'\nimport type { PluginTs } from './types.ts'\n\nexport const pluginTsName = 'plugin-ts' satisfies PluginTs['name']\n\nexport const pluginTs = definePlugin<PluginTs>((options) => {\n const {\n output = { path: 'types', barrelType: 'named' },\n group,\n exclude = [],\n include,\n override = [],\n enumType = 'asConst',\n enumSuffix = 'enum',\n dateType = 'string',\n unknownType = 'any',\n optionalType = 'questionToken',\n arrayType = 'array',\n emptySchemaType = unknownType,\n syntaxType = 'type',\n transformers = {},\n mapper = {},\n generators = [typeGenerator].filter(Boolean),\n contentType,\n UNSTABLE_NAMING,\n } = options\n\n const usedEnumNames = {}\n\n return {\n name: pluginTsName,\n options: {\n output,\n transformers,\n dateType,\n optionalType,\n arrayType,\n enumType,\n enumSuffix,\n unknownType,\n emptySchemaType,\n syntaxType,\n group,\n override,\n mapper,\n usedEnumNames,\n },\n pre: [pluginOasName],\n resolvePath(baseName, pathMode, options) {\n const root = path.resolve(this.config.root, this.config.output.path)\n const mode = pathMode ?? getMode(path.resolve(root, output.path))\n\n if (mode === 'single') {\n /**\n * when output is a file then we will always append to the same file(output file), see fileManager.addOrAppend\n * Other plugins then need to call addOrAppend instead of just add from the fileManager class\n */\n return path.resolve(root, output.path)\n }\n\n if (group && (options?.group?.path || options?.group?.tag)) {\n const groupName: Group['name'] = group?.name\n ? group.name\n : (ctx) => {\n if (group?.type === 'path') {\n return `${ctx.group.split('/')[1]}`\n }\n return `${camelCase(ctx.group)}Controller`\n }\n\n return path.resolve(\n root,\n output.path,\n groupName({\n group: group.type === 'path' ? options.group.path! : options.group.tag!,\n }),\n baseName,\n )\n }\n\n return path.resolve(root, output.path, baseName)\n },\n resolveName(name, type) {\n const resolvedName = pascalCase(name, { isFile: type === 'file' })\n\n if (type) {\n return transformers?.name?.(resolvedName, type) || resolvedName\n }\n\n return resolvedName\n },\n async install() {\n const root = path.resolve(this.config.root, this.config.output.path)\n const mode = getMode(path.resolve(root, output.path))\n const oas = await this.getOas()\n\n const schemaGenerator = new SchemaGenerator(this.plugin.options, {\n fabric: this.fabric,\n oas,\n pluginManager: this.pluginManager,\n events: this.events,\n plugin: this.plugin,\n contentType,\n include: undefined,\n override,\n mode,\n output: output.path,\n })\n\n const schemaFiles = await schemaGenerator.build(...generators)\n await this.upsertFile(...schemaFiles)\n\n const operationGenerator = new OperationGenerator(this.plugin.options, {\n fabric: this.fabric,\n oas,\n pluginManager: this.pluginManager,\n events: this.events,\n plugin: this.plugin,\n contentType,\n exclude,\n include,\n override,\n mode,\n UNSTABLE_NAMING,\n })\n\n const operationFiles = await operationGenerator.build(...generators)\n await this.upsertFile(...operationFiles)\n\n const barrelFiles = await getBarrelFiles(this.fabric.files, {\n type: output.barrelType ?? 'named',\n root,\n output,\n meta: {\n pluginKey: this.plugin.key,\n },\n })\n\n await this.upsertFile(...barrelFiles)\n },\n }\n})\n"],"mappings":"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"}
@@ -392,6 +392,13 @@ type Config<TInput = Input> = {
392
392
  * @default 'simple'
393
393
  */
394
394
  defaultBanner?: 'simple' | 'full' | false;
395
+ /**
396
+ * Whether to override existing external files if they already exist.
397
+ * When setting the option in the global configuration, all plugins inherit the same behavior by default.
398
+ * However, all plugins also have an `output.override` option, which can be used to override the behavior for a specific plugin.
399
+ * @default false
400
+ */
401
+ override?: boolean;
395
402
  };
396
403
  /**
397
404
  * An array of Kubb plugins that will be used in the generation.
@@ -579,6 +586,11 @@ type Output<TOptions> = {
579
586
  * Add a footer text in the beginning of every file
580
587
  */
581
588
  footer?: string | ((options: TOptions) => string);
589
+ /**
590
+ * Whether to override existing external files if they already exist.
591
+ * @default false
592
+ */
593
+ override?: boolean;
582
594
  };
583
595
  type GroupContext = {
584
596
  group: string;
@@ -828,9 +840,11 @@ type Context$1<TOptions, TPluginOptions extends PluginFactoryOptions> = {
828
840
  */
829
841
  plugin: Plugin<TPluginOptions>;
830
842
  mode: KubbFile.Mode;
843
+ UNSTABLE_NAMING?: true;
831
844
  };
832
845
  declare class OperationGenerator<TPluginOptions extends PluginFactoryOptions = PluginFactoryOptions, TFileMeta extends FileMetaBase = FileMetaBase> extends BaseGenerator<TPluginOptions['resolvedOptions'], Context$1<TPluginOptions['resolvedOptions'], TPluginOptions>> {
833
846
  #private;
847
+ getOptions(operation: Operation$1, method: HttpMethod): Partial<TPluginOptions['resolvedOptions']>;
834
848
  getSchemas(operation: Operation$1, {
835
849
  resolveName
836
850
  }?: {
@@ -1236,6 +1250,13 @@ type Options = {
1236
1250
  * @default 'questionToken'
1237
1251
  */
1238
1252
  optionalType?: 'questionToken' | 'undefined' | 'questionTokenAndUndefined';
1253
+ /**
1254
+ * Choose between `Array<string>` or `string[]` for array types.
1255
+ * - `generic`: Array<Type>
1256
+ * - `array`: Type[]
1257
+ * @default 'array'
1258
+ */
1259
+ arrayType?: 'generic' | 'array';
1239
1260
  transformers?: {
1240
1261
  /**
1241
1262
  * Customize the names based on the type that is provided by the plugin.
@@ -1257,6 +1278,10 @@ type Options = {
1257
1278
  * Define some generators next to the ts generators
1258
1279
  */
1259
1280
  generators?: Array<Generator<PluginTs>>;
1281
+ /**
1282
+ * Unstable naming for v5
1283
+ */
1284
+ UNSTABLE_NAMING?: true;
1260
1285
  };
1261
1286
  type ResolvedOptions = {
1262
1287
  output: Output<Oas>;
@@ -1268,6 +1293,7 @@ type ResolvedOptions = {
1268
1293
  unknownType: NonNullable<Options['unknownType']>;
1269
1294
  emptySchemaType: NonNullable<Options['emptySchemaType']>;
1270
1295
  optionalType: NonNullable<Options['optionalType']>;
1296
+ arrayType: NonNullable<Options['arrayType']>;
1271
1297
  transformers: NonNullable<Options['transformers']>;
1272
1298
  syntaxType: NonNullable<Options['syntaxType']>;
1273
1299
  mapper: Record<string, any>;
@@ -1275,4 +1301,4 @@ type ResolvedOptions = {
1275
1301
  type PluginTs = PluginFactoryOptions<'plugin-ts', Options, ResolvedOptions, never, ResolvePathOptions>;
1276
1302
  //#endregion
1277
1303
  export { UserPluginWithLifeCycle as a, Schema as i, PluginTs as n, SchemaObject$1 as o, ReactGenerator as r, Options as t };
1278
- //# sourceMappingURL=types-DcA3qMIF.d.ts.map
1304
+ //# sourceMappingURL=types-D59kq_S_.d.ts.map
@@ -392,6 +392,13 @@ type Config<TInput = Input> = {
392
392
  * @default 'simple'
393
393
  */
394
394
  defaultBanner?: 'simple' | 'full' | false;
395
+ /**
396
+ * Whether to override existing external files if they already exist.
397
+ * When setting the option in the global configuration, all plugins inherit the same behavior by default.
398
+ * However, all plugins also have an `output.override` option, which can be used to override the behavior for a specific plugin.
399
+ * @default false
400
+ */
401
+ override?: boolean;
395
402
  };
396
403
  /**
397
404
  * An array of Kubb plugins that will be used in the generation.
@@ -579,6 +586,11 @@ type Output<TOptions> = {
579
586
  * Add a footer text in the beginning of every file
580
587
  */
581
588
  footer?: string | ((options: TOptions) => string);
589
+ /**
590
+ * Whether to override existing external files if they already exist.
591
+ * @default false
592
+ */
593
+ override?: boolean;
582
594
  };
583
595
  type GroupContext = {
584
596
  group: string;
@@ -828,9 +840,11 @@ type Context$1<TOptions, TPluginOptions extends PluginFactoryOptions> = {
828
840
  */
829
841
  plugin: Plugin<TPluginOptions>;
830
842
  mode: KubbFile.Mode;
843
+ UNSTABLE_NAMING?: true;
831
844
  };
832
845
  declare class OperationGenerator<TPluginOptions extends PluginFactoryOptions = PluginFactoryOptions, TFileMeta extends FileMetaBase = FileMetaBase> extends BaseGenerator<TPluginOptions['resolvedOptions'], Context$1<TPluginOptions['resolvedOptions'], TPluginOptions>> {
833
846
  #private;
847
+ getOptions(operation: Operation$1, method: HttpMethod): Partial<TPluginOptions['resolvedOptions']>;
834
848
  getSchemas(operation: Operation$1, {
835
849
  resolveName
836
850
  }?: {
@@ -1236,6 +1250,13 @@ type Options = {
1236
1250
  * @default 'questionToken'
1237
1251
  */
1238
1252
  optionalType?: 'questionToken' | 'undefined' | 'questionTokenAndUndefined';
1253
+ /**
1254
+ * Choose between `Array<string>` or `string[]` for array types.
1255
+ * - `generic`: Array<Type>
1256
+ * - `array`: Type[]
1257
+ * @default 'array'
1258
+ */
1259
+ arrayType?: 'generic' | 'array';
1239
1260
  transformers?: {
1240
1261
  /**
1241
1262
  * Customize the names based on the type that is provided by the plugin.
@@ -1257,6 +1278,10 @@ type Options = {
1257
1278
  * Define some generators next to the ts generators
1258
1279
  */
1259
1280
  generators?: Array<Generator<PluginTs>>;
1281
+ /**
1282
+ * Unstable naming for v5
1283
+ */
1284
+ UNSTABLE_NAMING?: true;
1260
1285
  };
1261
1286
  type ResolvedOptions = {
1262
1287
  output: Output<Oas>;
@@ -1268,6 +1293,7 @@ type ResolvedOptions = {
1268
1293
  unknownType: NonNullable<Options['unknownType']>;
1269
1294
  emptySchemaType: NonNullable<Options['emptySchemaType']>;
1270
1295
  optionalType: NonNullable<Options['optionalType']>;
1296
+ arrayType: NonNullable<Options['arrayType']>;
1271
1297
  transformers: NonNullable<Options['transformers']>;
1272
1298
  syntaxType: NonNullable<Options['syntaxType']>;
1273
1299
  mapper: Record<string, any>;
@@ -1275,4 +1301,4 @@ type ResolvedOptions = {
1275
1301
  type PluginTs = PluginFactoryOptions<'plugin-ts', Options, ResolvedOptions, never, ResolvePathOptions>;
1276
1302
  //#endregion
1277
1303
  export { UserPluginWithLifeCycle as a, Schema as i, PluginTs as n, SchemaObject$1 as o, ReactGenerator as r, Options as t };
1278
- //# sourceMappingURL=types-C51mhXW0.d.cts.map
1304
+ //# sourceMappingURL=types-njfY0PGo.d.cts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubb/plugin-ts",
3
- "version": "4.14.0",
3
+ "version": "4.15.0",
4
4
  "description": "TypeScript code generation plugin for Kubb, transforming OpenAPI schemas into TypeScript interfaces, types, and utility functions.",
5
5
  "keywords": [
6
6
  "typescript",
@@ -69,9 +69,9 @@
69
69
  "natural-orderby": "^5.0.0",
70
70
  "remeda": "^2.33.1",
71
71
  "typescript": "5.9.3",
72
- "@kubb/core": "4.14.0",
73
- "@kubb/oas": "4.14.0",
74
- "@kubb/plugin-oas": "4.14.0"
72
+ "@kubb/core": "4.15.0",
73
+ "@kubb/oas": "4.15.0",
74
+ "@kubb/plugin-oas": "4.15.0"
75
75
  },
76
76
  "peerDependencies": {
77
77
  "@kubb/react-fabric": "0.9.2",
@@ -15,6 +15,7 @@ type Props = {
15
15
  schema: SchemaObject
16
16
  tree: Array<Schema>
17
17
  optionalType: PluginTs['resolvedOptions']['optionalType']
18
+ arrayType: PluginTs['resolvedOptions']['arrayType']
18
19
  enumType: PluginTs['resolvedOptions']['enumType']
19
20
  mapper: PluginTs['resolvedOptions']['mapper']
20
21
  syntaxType: PluginTs['resolvedOptions']['syntaxType']
@@ -22,7 +23,7 @@ type Props = {
22
23
  keysToOmit?: string[]
23
24
  }
24
25
 
25
- export function Type({ name, typedName, tree, keysToOmit, schema, optionalType, syntaxType, enumType, mapper, description }: Props): KubbNode {
26
+ export function Type({ name, typedName, tree, keysToOmit, schema, optionalType, arrayType, syntaxType, enumType, mapper, description }: Props): KubbNode {
26
27
  const typeNodes: ts.Node[] = []
27
28
 
28
29
  if (!tree.length) {
@@ -39,6 +40,7 @@ export function Type({ name, typedName, tree, keysToOmit, schema, optionalType,
39
40
  { name, schema, parent: undefined, current, siblings },
40
41
  {
41
42
  optionalType,
43
+ arrayType,
42
44
  enumType,
43
45
  mapper,
44
46
  },
@@ -59,7 +61,11 @@ export function Type({ name, typedName, tree, keysToOmit, schema, optionalType,
59
61
  type = factory.createTypeReferenceNode(typeNameWithKey)
60
62
 
61
63
  if (schema.type === 'array') {
62
- type = factory.createArrayTypeNode(type)
64
+ if (arrayType === 'generic') {
65
+ type = factory.createTypeReferenceNode(factory.createIdentifier('Array'), [type])
66
+ } else {
67
+ type = factory.createArrayTypeNode(type)
68
+ }
63
69
  }
64
70
  }
65
71
  }