@kubb/plugin-ts 5.0.0-alpha.9 → 5.0.0-beta.15

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 (44) hide show
  1. package/LICENSE +17 -10
  2. package/README.md +26 -7
  3. package/dist/index.cjs +1526 -5
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.ts +558 -27
  6. package/dist/index.js +1488 -2
  7. package/dist/index.js.map +1 -0
  8. package/extension.yaml +635 -0
  9. package/package.json +43 -65
  10. package/src/components/{v2/Enum.tsx → Enum.tsx} +33 -17
  11. package/src/components/Type.tsx +31 -161
  12. package/src/constants.ts +10 -0
  13. package/src/factory.ts +295 -39
  14. package/src/generators/typeGenerator.tsx +248 -420
  15. package/src/index.ts +9 -3
  16. package/src/plugin.ts +66 -205
  17. package/src/printers/functionPrinter.ts +197 -0
  18. package/src/printers/printerTs.ts +329 -0
  19. package/src/resolvers/resolverTs.ts +66 -0
  20. package/src/types.ts +233 -221
  21. package/src/utils.ts +129 -0
  22. package/dist/components-CRu8IKY3.js +0 -729
  23. package/dist/components-CRu8IKY3.js.map +0 -1
  24. package/dist/components-DeNDKlzf.cjs +0 -982
  25. package/dist/components-DeNDKlzf.cjs.map +0 -1
  26. package/dist/components.cjs +0 -3
  27. package/dist/components.d.ts +0 -36
  28. package/dist/components.js +0 -2
  29. package/dist/generators.cjs +0 -4
  30. package/dist/generators.d.ts +0 -509
  31. package/dist/generators.js +0 -2
  32. package/dist/plugin-BZkBwnEA.js +0 -1269
  33. package/dist/plugin-BZkBwnEA.js.map +0 -1
  34. package/dist/plugin-Bunz1oGa.cjs +0 -1322
  35. package/dist/plugin-Bunz1oGa.cjs.map +0 -1
  36. package/dist/types-mSXmB8WU.d.ts +0 -298
  37. package/src/components/index.ts +0 -1
  38. package/src/components/v2/Type.tsx +0 -59
  39. package/src/generators/index.ts +0 -2
  40. package/src/generators/v2/typeGenerator.tsx +0 -167
  41. package/src/generators/v2/utils.ts +0 -140
  42. package/src/parser.ts +0 -389
  43. package/src/printer.ts +0 -368
  44. package/src/resolverTs.ts +0 -77
package/extension.yaml ADDED
@@ -0,0 +1,635 @@
1
+ $schema: https://kubb.dev/schemas/extension.json
2
+ kind: plugin
3
+ id: plugin-ts
4
+ name: TypeScript
5
+ description: Generate TypeScript types and interfaces from OpenAPI schemas with type-safe representations.
6
+ category: types
7
+ type: official
8
+ npmPackage: '@kubb/plugin-ts'
9
+ docsPath: /plugins/plugin-ts
10
+ repo: https://github.com/kubb-labs/plugins
11
+ maintainers:
12
+ - name: Stijn Van Hulle
13
+ github: stijnvanhulle
14
+ compatibility:
15
+ kubb: '>=5.0.0'
16
+ node: '>=22'
17
+ tags:
18
+ - typescript
19
+ - types
20
+ - interfaces
21
+ - codegen
22
+ - openapi
23
+ dependencies: []
24
+ resources:
25
+ documentation: https://kubb.dev/plugins/plugin-ts
26
+ repository: https://github.com/kubb-labs/plugins
27
+ issues: https://github.com/kubb-labs/plugins/issues
28
+ changelog: https://github.com/kubb-labs/plugins/blob/main/packages/plugin-ts/CHANGELOG.md
29
+ codesandbox: https://codesandbox.io/p/github/kubb-labs/plugins/main/examples/typescript
30
+ featured: true
31
+ icon:
32
+ light: https://kubb.dev/feature/typescript.svg
33
+ intro: |
34
+ # @kubb/plugin-ts
35
+
36
+ Generate TypeScript types from your OpenAPI schema. Use this plugin to produce type-safe representations of your API's request and response shapes, giving your TypeScript project compile-time guarantees over every API interaction.
37
+
38
+ **See also**
39
+
40
+ - [TypeScript](https://www.typescriptlang.org/)
41
+ - [TypeScript Compiler API](https://github.com/microsoft/TypeScript/wiki/Using-the-Compiler-API)
42
+ options:
43
+ - name: output
44
+ type: Output
45
+ required: false
46
+ default: "{ path: 'types', barrel: { type: 'named' } }"
47
+ description: Specify the export location for the files and define the behavior of the output.
48
+ properties:
49
+ - name: path
50
+ type: string
51
+ required: true
52
+ description: Output directory or file for the generated code, relative to the global `output.path`.
53
+ tip: |
54
+ if `output.path` is a file, `group` cannot be used.
55
+ default: "'types'"
56
+ - name: barrel
57
+ type: "{ type: 'named' | 'all', nested?: boolean } | false"
58
+ required: false
59
+ default: "{ type: 'named' }"
60
+ description: 'Configure barrel file export strategy. Use `type` to control named vs. wildcard exports; set `nested: true` to generate hierarchical barrels in subdirectories.'
61
+ examples:
62
+ - name: all
63
+ files:
64
+ - lang: typescript
65
+ code: |
66
+ export * from './gen/petService.ts'
67
+ twoslash: false
68
+ - name: named
69
+ files:
70
+ - lang: typescript
71
+ code: |
72
+ export { PetService } from './gen/petService.ts'
73
+ twoslash: false
74
+ - name: nested
75
+ files:
76
+ - name: kubb.config.ts
77
+ lang: typescript
78
+ code: |
79
+ output: {
80
+ path: './gen',
81
+ barrel: { type: 'named', nested: true },
82
+ }
83
+ twoslash: false
84
+ - name: 'false'
85
+ files:
86
+ - lang: typescript
87
+ code: ''
88
+ twoslash: false
89
+ - name: banner
90
+ type: 'string | ((node: RootNode) => string)'
91
+ required: false
92
+ description: Add a banner comment at the top of every generated file. Accepts a static string or a function that receives the `RootNode` and returns a string.
93
+ - name: footer
94
+ type: 'string | ((node: RootNode) => string)'
95
+ required: false
96
+ description: Add a footer comment at the end of every generated file. Accepts a static string or a function that receives the `RootNode` and returns a string.
97
+ - name: override
98
+ type: boolean
99
+ required: false
100
+ default: 'false'
101
+ description: Whether Kubb overrides existing external files that can be generated if they already exist.
102
+ - name: contentType
103
+ type: "'application/json' | (string & {})"
104
+ required: false
105
+ description: |
106
+ Define which content type to use.
107
+
108
+ By default, Kubb uses the first JSON-valid media type.
109
+ - name: group
110
+ type: Group
111
+ required: false
112
+ description: |
113
+ Grouping combines files in a folder based on a specific `type`.
114
+ examples:
115
+ - name: kubb.config.ts
116
+ files:
117
+ - lang: typescript
118
+ code: |
119
+ group: {
120
+ type: 'tag',
121
+ name({ group }) {
122
+ return `${group}Controller`
123
+ }
124
+ }
125
+ twoslash: false
126
+ body: |
127
+ With the configuration above, the generator emits:
128
+
129
+ ```text
130
+ .
131
+ ├── src/
132
+ │ └── petController/
133
+ │ │ ├── addPet.ts
134
+ │ │ └── getPet.ts
135
+ │ └── storeController/
136
+ │ ├── createStore.ts
137
+ │ └── getStoreById.ts
138
+ ├── petStore.yaml
139
+ ├── kubb.config.ts
140
+ └── package.json
141
+ ```
142
+ properties:
143
+ - name: type
144
+ type: "'tag'"
145
+ required: true
146
+ description: Specify the property to group files by. Required when `group` is defined.
147
+ note: |
148
+ `Required: true*` means this is required only when the `group` option is used. The `group` option itself is optional.
149
+ body: |
150
+ - `'tag'`: Uses the first tag from `operation.getTags().at(0)?.name`
151
+ - name: name
152
+ type: '(context: GroupContext) => string'
153
+ required: false
154
+ default: (ctx) => `${ctx.group}Controller`
155
+ description: Return the name of a group based on the group name, this will be used for the file and name generation.
156
+ - name: enumType
157
+ type: "'enum' | 'asConst' | 'asPascalConst' | 'constEnum' | 'literal' | 'inlineLiteral'"
158
+ required: false
159
+ default: "'asConst'"
160
+ description: Choose to use `enum` or `as const` for enums.
161
+ tip: |
162
+ The difference between `asConst` and `asPascalConst` is the casing of the constant variable name:
163
+
164
+ - `asConst`: generates a camelCase constant name (e.g., `petType`)
165
+ - `asPascalConst`: generates a PascalCase constant name (e.g., `PetType`)
166
+ examples:
167
+ - name: "'enum'"
168
+ files:
169
+ - lang: typescript
170
+ code: |
171
+ enum PetType {
172
+ Dog = 'dog',
173
+ Cat = 'cat',
174
+ }
175
+ twoslash: false
176
+ - name: "'asConst'"
177
+ files:
178
+ - lang: typescript
179
+ code: |
180
+ const petType = {
181
+ Dog: 'dog',
182
+ Cat: 'cat',
183
+ } as const;
184
+ twoslash: false
185
+ - name: "'asPascalConst'"
186
+ files:
187
+ - lang: typescript
188
+ code: |
189
+ const PetType = {
190
+ Dog: 'dog',
191
+ Cat: 'cat',
192
+ } as const;
193
+ twoslash: false
194
+ - name: "'constEnum'"
195
+ files:
196
+ - lang: typescript
197
+ code: |
198
+ const enum PetType {
199
+ Dog = 'dog',
200
+ Cat = 'cat',
201
+ }
202
+ twoslash: false
203
+ - name: "'literal'"
204
+ files:
205
+ - lang: typescript
206
+ code: |
207
+ type PetType = 'dog' | 'cat';
208
+ twoslash: false
209
+ - name: "'inlineLiteral'"
210
+ files:
211
+ - lang: typescript
212
+ code: |
213
+ // Enum values are inlined directly into the type
214
+ export interface Pet {
215
+ status?: 'available' | 'pending' | 'sold';
216
+ }
217
+ twoslash: false
218
+ body: |
219
+ > [!TIP]
220
+ > Consider `'inlineLiteral'` for the most idiomatic output — enum values are inlined directly into the property type instead of creating a separate named type.
221
+ - name: enumSuffix
222
+ required: false
223
+ description: ''
224
+ warning: |
225
+ This option has been moved to [`adapterOas`](/adapters/adapter-oas#enumSuffix). Use `adapterOas({ enumSuffix })` instead.
226
+ - name: enumTypeSuffix
227
+ type: string
228
+ required: false
229
+ default: "'Key'"
230
+ description: |
231
+ Suffix appended to the generated type alias name when `enumType` is `asConst` or `asPascalConst`.
232
+
233
+ Only the type alias is affected — the const object name stays unchanged.
234
+ examples:
235
+ - name: "'Key' (default)"
236
+ files:
237
+ - lang: typescript
238
+ code: |
239
+ const petType = {
240
+ Dog: 'dog',
241
+ Cat: 'cat',
242
+ } as const;
243
+
244
+ export type PetTypeKey = (typeof petType)[keyof typeof petType];
245
+ twoslash: false
246
+ - name: "'Value'"
247
+ files:
248
+ - lang: typescript
249
+ code: |
250
+ // enumTypeSuffix: 'Value'
251
+ const petType = {
252
+ Dog: 'dog',
253
+ Cat: 'cat',
254
+ } as const;
255
+
256
+ export type PetTypeValue = (typeof petType)[keyof typeof petType];
257
+ twoslash: false
258
+ - name: "'' (no suffix)"
259
+ files:
260
+ - lang: typescript
261
+ code: |
262
+ // enumTypeSuffix: ''
263
+ const petType = {
264
+ Dog: 'dog',
265
+ Cat: 'cat',
266
+ } as const;
267
+
268
+ export type PetType = (typeof petType)[keyof typeof petType];
269
+ twoslash: false
270
+ - name: enumKeyCasing
271
+ type: "'screamingSnakeCase' | 'snakeCase' | 'pascalCase' | 'camelCase' | 'none'"
272
+ required: false
273
+ default: "'none'"
274
+ description: Control the casing applied to enum key names in generated TypeScript. Use this to align generated enum keys with your project's naming conventions.
275
+ body: |
276
+ - `'screamingSnakeCase'`: `ENUM_VALUE`
277
+ - `'snakeCase'`: `enum_value`
278
+ - `'pascalCase'`: `EnumValue`
279
+ - `'camelCase'`: `enumValue`
280
+ - `'none'`: Uses the enum value as-is
281
+ - name: dateType
282
+ required: false
283
+ description: ''
284
+ warning: |
285
+ This option has been moved to [`adapterOas`](/adapters/adapter-oas#dateType). Use `adapterOas({ dateType })` instead.
286
+ - name: integerType
287
+ required: false
288
+ description: ''
289
+ warning: |
290
+ This option has been moved to [`adapterOas`](/adapters/adapter-oas#integerType). Use `adapterOas({ integerType })` instead.
291
+ - name: syntaxType
292
+ type: "'type' | 'interface'"
293
+ required: false
294
+ default: "'type'"
295
+ description: |
296
+ Control whether the TypeScript generator emits `type` aliases or `interface` declarations for object schemas.
297
+ See [Type vs Interface: Which Should You Use](https://www.totaltypescript.com/type-vs-interface-which-should-you-use).
298
+ examples:
299
+ - name: "'type'"
300
+ files:
301
+ - lang: typescript
302
+ code: |
303
+ type Pet = {
304
+ name: string;
305
+ };
306
+ twoslash: false
307
+ - name: "'interface'"
308
+ files:
309
+ - lang: typescript
310
+ code: |
311
+ interface Pet {
312
+ name: string;
313
+ }
314
+ twoslash: false
315
+ - name: unknownType
316
+ required: false
317
+ description: ''
318
+ warning: |
319
+ This option has been moved to [`adapterOas`](/adapters/adapter-oas#unknownType). Use `adapterOas({ unknownType })` instead.
320
+ - name: emptySchemaType
321
+ required: false
322
+ description: ''
323
+ warning: |
324
+ This option has been moved to [`adapterOas`](/adapters/adapter-oas#emptySchemaType). Use `adapterOas({ emptySchemaType })` instead.
325
+ - name: optionalType
326
+ type: "'questionToken' | 'undefined' | 'questionTokenAndUndefined'"
327
+ required: false
328
+ default: "'questionToken'"
329
+ description: Control how optional properties are represented in generated TypeScript types.
330
+ examples:
331
+ - name: "'questionToken'"
332
+ files:
333
+ - lang: typescript
334
+ code: |
335
+ type Pet = {
336
+ type?: string;
337
+ };
338
+ twoslash: false
339
+ - name: "'undefined'"
340
+ files:
341
+ - lang: typescript
342
+ code: |
343
+ type Pet = {
344
+ type: string | undefined;
345
+ };
346
+ twoslash: false
347
+ - name: "'questionTokenAndUndefined'"
348
+ files:
349
+ - lang: typescript
350
+ code: |
351
+ type Pet = {
352
+ type?: string | undefined;
353
+ };
354
+ twoslash: false
355
+ - name: arrayType
356
+ type: "'array' | 'generic'"
357
+ required: false
358
+ default: "'array'"
359
+ description: Choose between `Array<Type>` or `Type[]` syntax for array types.
360
+ examples:
361
+ - name: "'array'"
362
+ files:
363
+ - lang: typescript
364
+ code: |
365
+ type Pet = {
366
+ tags: string[];
367
+ };
368
+ twoslash: false
369
+ - name: "'generic'"
370
+ files:
371
+ - lang: typescript
372
+ code: |
373
+ type Pet = {
374
+ tags: Array<string>;
375
+ };
376
+ twoslash: false
377
+ - name: paramsCasing
378
+ type: "'camelcase'"
379
+ required: false
380
+ default: undefined
381
+ description: Transform parameter names to a specific casing format for path, query, and header parameters.
382
+ important: |
383
+ When enabled, this option transforms property names in `PathParams`, `QueryParams`, and `HeaderParams` types to the specified casing. Response and request body types are **not** affected.
384
+
385
+ All plugins that reference parameters (like `@kubb/plugin-client`, `@kubb/plugin-react-query`, `@kubb/plugin-swr`, `@kubb/plugin-faker`, `@kubb/plugin-mcp`) should use the same `paramsCasing` setting to ensure type compatibility.
386
+ examples:
387
+ - name: Original API
388
+ files:
389
+ - lang: typescript
390
+ code: |
391
+ // OpenAPI spec has: step_id, X-Custom-Header, bool_param
392
+
393
+ // Without paramsCasing
394
+ type FindPetsByStatusPathParams = {
395
+ step_id: string;
396
+ };
397
+
398
+ type FindPetsByStatusQueryParams = {
399
+ bool_param?: boolean;
400
+ };
401
+
402
+ type FindPetsByStatusHeaderParams = {
403
+ 'X-Custom-Header'?: string;
404
+ };
405
+ twoslash: false
406
+ - name: "With paramsCasing: 'camelcase'"
407
+ files:
408
+ - lang: typescript
409
+ code: |
410
+ // Properties are transformed to camelCase
411
+
412
+ type FindPetsByStatusPathParams = {
413
+ stepId: string; // ✓ camelCase
414
+ };
415
+
416
+ type FindPetsByStatusQueryParams = {
417
+ boolParam?: boolean; // ✓ camelCase
418
+ };
419
+
420
+ type FindPetsByStatusHeaderParams = {
421
+ xCustomHeader?: string; // ✓ camelCase
422
+ };
423
+ twoslash: false
424
+ - name: resolver
425
+ type: Partial<ResolverTs> & ThisType<ResolverTs>
426
+ required: false
427
+ description: |
428
+ A single resolver that overrides the naming and path-resolution conventions. Each method you provide replaces the corresponding built-in one. When a method returns `null` or `undefined`, the resolver's result is used as the fallback, so you only need to supply the methods you want to change.
429
+
430
+ `this` inside each method is bound to the **full** resolver, so you can call other resolver methods (e.g. `this.default(name, 'function')`) without losing context.
431
+ body: |
432
+ Each plugin ships a built-in resolver:
433
+
434
+ | Plugin | Default resolver |
435
+ | --- | --- |
436
+ | `@kubb/plugin-ts` | `resolverTs` |
437
+ | `@kubb/plugin-zod` | `resolverZod` |
438
+ | `@kubb/plugin-cypress` | `resolverCypress` |
439
+ | `@kubb/plugin-mcp` | `resolverMcp` |
440
+ codeBlock:
441
+ lang: typescript
442
+ title: Custom resolver (plugin-ts example)
443
+ code: |
444
+ import { pluginTs } from '@kubb/plugin-ts'
445
+
446
+ pluginTs({
447
+ resolver: {
448
+ resolveName(name) {
449
+ // Prefix every operation-derived name; falls back for names where
450
+ // this returns null/undefined.
451
+ return `Api${this.default(name, 'function')}`
452
+ },
453
+ },
454
+ })
455
+ tip: |
456
+ Use `resolver` for fine-grained control over naming conventions.
457
+ examples:
458
+ - name: Custom prefix for operation names
459
+ files:
460
+ - lang: typescript
461
+ code: |
462
+ import { pluginTs } from '@kubb/plugin-ts'
463
+
464
+ pluginTs({
465
+ resolver: {
466
+ resolveName(name) {
467
+ return `Custom${this.default(name, 'function')}`
468
+ },
469
+ },
470
+ })
471
+ twoslash: false
472
+ - name: include
473
+ type: Array<Include>
474
+ required: false
475
+ description: Array containing include parameters to include tags, operations, methods, paths, or content types.
476
+ codeBlock:
477
+ lang: typescript
478
+ title: Include
479
+ code: |
480
+ export type Include = {
481
+ type: 'tag' | 'operationId' | 'path' | 'method' | 'contentType'
482
+ pattern: string | RegExp
483
+ }
484
+ - name: exclude
485
+ type: Array<Exclude>
486
+ required: false
487
+ description: Array containing exclude parameters to exclude or skip tags, operations, methods, paths, or content types.
488
+ codeBlock:
489
+ lang: typescript
490
+ title: Exclude
491
+ code: |
492
+ export type Exclude = {
493
+ type: 'tag' | 'operationId' | 'path' | 'method' | 'contentType'
494
+ pattern: string | RegExp
495
+ }
496
+ - name: override
497
+ type: Array<Override>
498
+ required: false
499
+ description: Array containing override parameters to override `options` based on tags, operations, methods, paths, or content types.
500
+ codeBlock:
501
+ lang: typescript
502
+ title: Override
503
+ code: |
504
+ export type Override = {
505
+ type: 'tag' | 'operationId' | 'path' | 'method' | 'contentType'
506
+ pattern: string | RegExp
507
+ options: PluginOptions
508
+ }
509
+ - name: generators
510
+ type: Array<Generator<PluginTs>>
511
+ required: false
512
+ experimental: true
513
+ description: |
514
+ Define additional generators next to the built-in generators.
515
+
516
+ See [Generators](https://kubb.dev/docs/5.x/guides/creating-plugins) for more information on how to use generators.
517
+ - name: transformer
518
+ type: Visitor
519
+ required: false
520
+ description: |
521
+ A single AST visitor applied to every node before code is printed. Each method you provide replaces the corresponding built-in one. When a method returns `null` or `undefined`, the preset transformer's result is used as the fallback — so you only need to supply the methods you want to change.
522
+
523
+ Visitor methods receive the node and a context object. Return a modified node to replace it, or return `undefined`/`void` to leave it unchanged.
524
+ examples:
525
+ - name: Strip descriptions before printing
526
+ files:
527
+ - lang: typescript
528
+ code: |
529
+ import { pluginTs } from '@kubb/plugin-ts'
530
+
531
+ pluginTs({
532
+ transformer: {
533
+ schema(node) {
534
+ return { ...node, description: undefined }
535
+ },
536
+ },
537
+ })
538
+ twoslash: false
539
+ - name: Prefix every operationId
540
+ files:
541
+ - lang: typescript
542
+ code: |
543
+ import { pluginTs } from '@kubb/plugin-ts'
544
+
545
+ pluginTs({
546
+ transformer: {
547
+ operation(node) {
548
+ return { ...node, operationId: `api_${node.operationId}` }
549
+ },
550
+ },
551
+ })
552
+ twoslash: false
553
+ tip: |
554
+ Use `transformer` to rewrite node properties before printing. For output naming customization, use `resolver` instead.
555
+ note: |
556
+ `@kubb/plugin-ts` uses AST `Visitor` transformers for schema/operation node transforms. For output naming customization, use `resolver` instead.
557
+ - name: printer
558
+ type: '{ nodes?: PrinterTsNodes }'
559
+ required: false
560
+ description: |
561
+ Override individual printer node handlers to customize how specific schema types are rendered.
562
+
563
+ Each key is a `SchemaType` (e.g. `'integer'`, `'date'`). The function you provide replaces the built-in handler for that type. Use `this.transform` to recurse into nested schema nodes and `this.options` to read printer options.
564
+ examples:
565
+ - name: Override the date node to use the Date object
566
+ files:
567
+ - lang: typescript
568
+ code: |
569
+ import ts from 'typescript'
570
+ import { pluginTs } from '@kubb/plugin-ts'
571
+
572
+ pluginTs({
573
+ printer: {
574
+ nodes: {
575
+ date(node) {
576
+ return ts.factory.createTypeReferenceNode('Date', [])
577
+ },
578
+ },
579
+ },
580
+ })
581
+ twoslash: false
582
+ - name: Override integer to bigint
583
+ files:
584
+ - lang: typescript
585
+ code: |
586
+ import ts from 'typescript'
587
+ import { pluginTs } from '@kubb/plugin-ts'
588
+
589
+ pluginTs({
590
+ printer: {
591
+ nodes: {
592
+ integer() {
593
+ return ts.factory.createKeywordTypeNode(ts.SyntaxKind.BigIntKeyword)
594
+ },
595
+ },
596
+ },
597
+ })
598
+ twoslash: false
599
+ examples:
600
+ - name: kubb.config.ts
601
+ files:
602
+ - lang: typescript
603
+ code: |
604
+ import { defineConfig } from 'kubb';
605
+ import { pluginTs } from '@kubb/plugin-ts';
606
+
607
+ export default defineConfig({
608
+ input: {
609
+ path: './petStore.yaml',
610
+ },
611
+ output: {
612
+ path: './src/gen',
613
+ },
614
+ plugins: [
615
+ pluginTs({
616
+ output: {
617
+ path: './types',
618
+ },
619
+ exclude: [
620
+ {
621
+ type: 'tag',
622
+ pattern: 'store',
623
+ },
624
+ ],
625
+ group: {
626
+ type: 'tag',
627
+ name: ({ group }) => `${group}Controller`,
628
+ },
629
+ enumType: 'asConst',
630
+ optionalType: 'questionTokenAndUndefined',
631
+ paramsCasing: 'camelcase',
632
+ }),
633
+ ],
634
+ })
635
+ twoslash: false