fork of hey-api/openapi-ts because I need some additional things
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge pull request #546 from hey-api/feat/output-config

feat: move format and lint config options to output object

authored by

Lubos and committed by
GitHub
46081310 5408bd15

+222 -160
+5
.changeset/dirty-sheep-dress.md
··· 1 + --- 2 + "@hey-api/docs": patch 3 + --- 4 + 5 + docs: add format and lint migration for 0.44.0
+5
.changeset/grumpy-bikes-rhyme.md
··· 1 + --- 2 + "@hey-api/openapi-ts": minor 3 + --- 4 + 5 + feat: move format and lint config options to output object
+32 -20
docs/openapi-ts/configuration.md
··· 103 103 104 104 ## Formatting 105 105 106 - By default, `openapi-ts` will not automatically format your client. To enable this feature, set `format` to a valid formatter. 106 + By default, `openapi-ts` will not automatically format your client. To enable this feature, set `output.format` to a valid formatter. 107 107 108 108 ::: code-group 109 109 110 - ```js{2} [disabled] 110 + ```js{4} [disabled] 111 111 export default { 112 - format: false, 113 112 input: 'path/to/openapi.json', 114 - output: 'src/client', 113 + output: { 114 + format: false, 115 + path: 'src/client', 116 + }, 115 117 } 116 118 ``` 117 119 118 - ```js{2} [prettier] 120 + ```js{4} [prettier] 119 121 export default { 120 - format: 'prettier', 121 122 input: 'path/to/openapi.json', 122 - output: 'src/client', 123 + output: { 124 + format: 'prettier', 125 + path: 'src/client', 126 + }, 123 127 } 124 128 ``` 125 129 126 - ```js{2} [biome] 130 + ```js{4} [biome] 127 131 export default { 128 - format: 'biome', 129 132 input: 'path/to/openapi.json', 130 - output: 'src/client', 133 + output: { 134 + format: 'biome', 135 + path: 'src/client', 136 + }, 131 137 } 132 138 ``` 133 139 ··· 137 143 138 144 ## Linting 139 145 140 - For performance reasons, `openapi-ts` does not automatically lint your client. To enable this feature, set `lint` to a valid linter. 146 + For performance reasons, `openapi-ts` does not automatically lint your client. To enable this feature, set `output.lint` to a valid linter. 141 147 142 148 ::: code-group 143 149 144 - ```js{3} [disabled] 150 + ```js{4} [disabled] 145 151 export default { 146 152 input: 'path/to/openapi.json', 147 - lint: false, 148 - output: 'src/client', 153 + output: { 154 + lint: false, 155 + path: 'src/client', 156 + }, 149 157 } 150 158 ``` 151 159 152 - ```js{3} [eslint] 160 + ```js{4} [eslint] 153 161 export default { 154 162 input: 'path/to/openapi.json', 155 - lint: 'eslint', 156 - output: 'src/client', 163 + output: { 164 + lint: 'eslint', 165 + path: 'src/client', 166 + }, 157 167 } 158 168 ``` 159 169 160 - ```js{3} [biome] 170 + ```js{4} [biome] 161 171 export default { 162 172 input: 'path/to/openapi.json', 163 - lint: 'biome', 164 - output: 'src/client', 173 + output: { 174 + lint: 'biome', 175 + path: 'src/client', 176 + }, 165 177 } 166 178 ``` 167 179
+30
docs/openapi-ts/migrating.md
··· 50 50 51 51 This config option is deprecated and will be removed in favor of [clients](./clients). 52 52 53 + ## v0.44.0 54 + 55 + ### Moved `format` 56 + 57 + This config option has been moved. You can now configure formatter using the `output.format` option. 58 + 59 + ```js{4} 60 + export default { 61 + input: 'path/to/openapi.json', 62 + output: { 63 + format: 'prettier', 64 + path: 'src/client', 65 + }, 66 + } 67 + ``` 68 + 69 + ### Moved `lint` 70 + 71 + This config option has been moved. You can now configure linter using the `output.lint` option. 72 + 73 + ```js{4} 74 + export default { 75 + input: 'path/to/openapi.json', 76 + output: { 77 + lint: 'eslint', 78 + path: 'src/client', 79 + }, 80 + } 81 + ``` 82 + 53 83 ## v0.43.0 54 84 55 85 ### Removed `enums.gen.ts`
-4
packages/openapi-ts/bin/index.cjs
··· 23 23 .option('-d, --debug', 'Run in debug mode?') 24 24 .option('--dry-run [value]', 'Skip writing files to disk?') 25 25 .option('--exportCore [value]', 'Write core files to disk') 26 - .option('--format [value]', 'Process output folder with formatter?') 27 26 .option( 28 27 '-i, --input <value>', 29 28 'OpenAPI specification (path, url, or string content)', 30 29 ) 31 - .option('--lint [value]', 'Process output folder with linter?') 32 30 .option('--name <value>', 'Custom client class name') 33 31 .option('-o, --output <value>', 'Output directory') 34 32 .option('--request <value>', 'Path to custom request file') ··· 70 68 userConfig = processParams(params, [ 71 69 'dryRun', 72 70 'exportCore', 73 - 'format', 74 - 'lint', 75 71 'schemas', 76 72 'services', 77 73 'types',
+69 -38
packages/openapi-ts/src/index.ts
··· 14 14 import { writeClient } from './utils/write/client'; 15 15 16 16 type Dependencies = Record<string, unknown>; 17 - type PackageDependencies = { 17 + interface PackageJson { 18 18 dependencies?: Dependencies; 19 19 devDependencies?: Dependencies; 20 20 peerDependencies?: Dependencies; 21 - }; 21 + } 22 22 23 - // Dependencies used in each client. User must have installed these to use the generated client 23 + /** 24 + * Dependencies used in each client. User must install these, without them 25 + * the generated client won't work. 26 + */ 24 27 const clientDependencies: Record<Config['client'], string[]> = { 25 28 '@hey-api/client-axios': ['axios'], 26 29 '@hey-api/client-fetch': [], ··· 32 35 }; 33 36 34 37 type OutputProcesser = { 35 - args: (output: string) => string[]; 38 + args: (path: string) => string[]; 36 39 command: string; 37 40 condition: (dependencies: Dependencies) => boolean; 38 41 name: string; 39 42 }; 40 43 41 - // Map of supported formatters 42 - const formatters: Record<Extract<Config['format'], string>, OutputProcesser> = { 44 + /** 45 + * Map of supported formatters 46 + */ 47 + const formatters: Record< 48 + Extract<Config['output']['format'], string>, 49 + OutputProcesser 50 + > = { 43 51 biome: { 44 - args: (output) => ['format', '--write', output], 52 + args: (path) => ['format', '--write', path], 45 53 command: 'biome', 46 54 condition: (dependencies) => Boolean(dependencies['@biomejs/biome']), 47 55 name: 'Biome (Format)', 48 56 }, 49 57 prettier: { 50 - args: (output) => [ 58 + args: (path) => [ 51 59 '--ignore-unknown', 52 - output, 60 + path, 53 61 '--write', 54 62 '--ignore-path', 55 63 './.prettierignore', ··· 60 68 }, 61 69 }; 62 70 63 - // Map of supported linters 64 - const linters: Record<Extract<Config['lint'], string>, OutputProcesser> = { 71 + /** 72 + * Map of supported linters 73 + */ 74 + const linters: Record< 75 + Extract<Config['output']['lint'], string>, 76 + OutputProcesser 77 + > = { 65 78 biome: { 66 - args: (output) => ['lint', '--apply', output], 79 + args: (path) => ['lint', '--apply', path], 67 80 command: 'biome', 68 81 condition: (dependencies) => Boolean(dependencies['@biomejs/biome']), 69 82 name: 'Biome (Lint)', 70 83 }, 71 84 eslint: { 72 - args: (output) => [output, '--fix'], 85 + args: (path) => [path, '--fix'], 73 86 command: 'eslint', 74 87 condition: (dependencies) => Boolean(dependencies.eslint), 75 88 name: 'ESLint', ··· 78 91 79 92 const processOutput = (dependencies: Dependencies) => { 80 93 const config = getConfig(); 81 - if (config.format) { 82 - const formatter = formatters[config.format]; 94 + if (config.output.format) { 95 + const formatter = formatters[config.output.format]; 83 96 if (formatter.condition(dependencies)) { 84 97 console.log(`✨ Running ${formatter.name}`); 85 - sync(formatter.command, formatter.args(config.output)); 98 + sync(formatter.command, formatter.args(config.output.path)); 86 99 } 87 100 } 88 - if (config.lint) { 89 - const linter = linters[config.lint]; 101 + if (config.output.lint) { 102 + const linter = linters[config.output.lint]; 90 103 if (linter.condition(dependencies)) { 91 104 console.log(`✨ Running ${linter.name}`); 92 - sync(linter.command, linter.args(config.output)); 105 + sync(linter.command, linter.args(config.output.path)); 93 106 } 94 107 } 95 108 }; ··· 142 155 } 143 156 }; 144 157 158 + const getOutput = (userConfig: UserConfig): Config['output'] => { 159 + let output: Config['output'] = { 160 + format: false, 161 + lint: false, 162 + path: '', 163 + }; 164 + if (typeof userConfig.output === 'string') { 165 + output.path = userConfig.output; 166 + } else { 167 + output = { 168 + ...output, 169 + ...userConfig.output, 170 + }; 171 + } 172 + return output; 173 + }; 174 + 145 175 const getSchemas = (userConfig: UserConfig): Config['schemas'] => { 146 176 let schemas: Config['schemas'] = { 147 177 export: true, ··· 199 229 }; 200 230 201 231 const getInstalledDependencies = (): Dependencies => { 202 - const toReducedDependencies = (p: PackageDependencies): Dependencies => 232 + const packageJsonToDependencies = (pkg: PackageJson): Dependencies => 203 233 [ 204 - p.dependencies ?? {}, 205 - p.devDependencies ?? {}, 206 - p.peerDependencies ?? {}, 234 + pkg.dependencies ?? {}, 235 + pkg.devDependencies ?? {}, 236 + pkg.peerDependencies ?? {}, 207 237 ].reduce( 208 - (acc, deps) => ({ 209 - ...acc, 210 - ...deps, 238 + (result, dependencies) => ({ 239 + ...result, 240 + ...dependencies, 211 241 }), 212 242 {}, 213 243 ); 214 244 215 245 let dependencies: Dependencies = {}; 216 246 217 - // Attempt to get all globally installed pacakges. 247 + // Attempt to get all globally installed packages. 218 248 const result = sync('npm', ['list', '-g', '--json', '--depth=0']); 219 249 if (!result.error) { 220 - const globally: PackageDependencies = JSON.parse(result.stdout.toString()); 250 + const globalDependencies: PackageJson = JSON.parse( 251 + result.stdout.toString(), 252 + ); 221 253 dependencies = { 222 254 ...dependencies, 223 - ...toReducedDependencies(globally), 255 + ...packageJsonToDependencies(globalDependencies), 224 256 }; 225 257 } 226 258 227 259 // Attempt to read any dependencies installed in a local projects package.json. 228 260 const pkgPath = path.resolve(process.cwd(), 'package.json'); 229 261 if (existsSync(pkgPath)) { 230 - const locally: PackageDependencies = JSON.parse( 262 + const localDependencies: PackageJson = JSON.parse( 231 263 readFileSync(pkgPath).toString(), 232 264 ); 233 265 dependencies = { 234 266 ...dependencies, 235 - ...toReducedDependencies(locally), 267 + ...packageJsonToDependencies(localDependencies), 236 268 }; 237 269 } 238 270 ··· 260 292 debug = false, 261 293 dryRun = false, 262 294 exportCore = true, 263 - format = false, 264 295 input, 265 - lint = false, 266 296 name, 267 297 request, 268 298 useOptions = true, ··· 271 301 if (debug) { 272 302 console.warn('userConfig:', userConfig); 273 303 } 304 + 305 + const output = getOutput(userConfig); 274 306 275 307 if (!input) { 276 308 throw new Error( ··· 278 310 ); 279 311 } 280 312 281 - if (!userConfig.output) { 313 + if (!output.path) { 282 314 throw new Error( 283 315 '🚫 output not provided - provide path where we should generate your client', 284 316 ); ··· 291 323 } 292 324 293 325 const client = userConfig.client || inferClient(dependencies); 294 - const output = path.resolve(process.cwd(), userConfig.output); 295 326 const schemas = getSchemas(userConfig); 296 327 const services = getServices(userConfig); 297 328 const types = getTypes(userConfig); 298 329 330 + output.path = path.resolve(process.cwd(), output.path); 331 + 299 332 return setConfig({ 300 333 base, 301 334 client, 302 335 debug, 303 336 dryRun, 304 337 exportCore: client.startsWith('@hey-api') ? false : exportCore, 305 - format, 306 338 input, 307 - lint, 308 339 name, 309 340 output, 310 341 request, ··· 345 376 processOutput(dependencies); 346 377 } 347 378 348 - console.log('✨ Done! Your client is located in:', config.output); 379 + console.log('✨ Done! Your client is located in:', config.output.path); 349 380 350 381 return client; 351 382 }
+6 -6
packages/openapi-ts/src/openApi/common/parser/__tests__/operation.spec.ts
··· 13 13 debug: false, 14 14 dryRun: true, 15 15 exportCore: false, 16 - format: false, 17 16 input: '', 18 - lint: false, 19 - output: '', 17 + output: { 18 + path: '', 19 + }, 20 20 schemas: { 21 21 export: false, 22 22 }, ··· 36 36 debug: false, 37 37 dryRun: true, 38 38 exportCore: false, 39 - format: false, 40 39 input: '', 41 - lint: false, 42 - output: '', 40 + output: { 41 + path: '', 42 + }, 43 43 schemas: { 44 44 export: false, 45 45 },
+3 -3
packages/openapi-ts/src/openApi/v2/parser/__tests__/getServices.spec.ts
··· 10 10 debug: false, 11 11 dryRun: true, 12 12 exportCore: true, 13 - format: false, 14 13 input: '', 15 - lint: false, 16 - output: '', 14 + output: { 15 + path: '', 16 + }, 17 17 schemas: {}, 18 18 services: { 19 19 operationId: false,
+3 -3
packages/openapi-ts/src/openApi/v3/parser/__tests__/getServices.spec.ts
··· 10 10 debug: false, 11 11 dryRun: true, 12 12 exportCore: true, 13 - format: false, 14 13 input: '', 15 - lint: false, 16 - output: '', 14 + output: { 15 + path: '', 16 + }, 17 17 schemas: {}, 18 18 services: { 19 19 operationId: true,
+24 -12
packages/openapi-ts/src/types/config.ts
··· 1 1 export interface UserConfig { 2 2 /** 3 3 * Manually set base in OpenAPI config instead of inferring from server value 4 + * @deprecated 4 5 */ 5 6 base?: string; 6 7 /** ··· 31 32 */ 32 33 exportCore?: boolean; 33 34 /** 34 - * Process output folder with formatter? 35 - * @default false 36 - */ 37 - format?: 'biome' | 'prettier' | false; 38 - /** 39 35 * The relative location of the OpenAPI spec 40 36 */ 41 37 input: string | Record<string, unknown>; 42 38 /** 43 - * Process output folder with linter? 44 - * @default false 45 - */ 46 - lint?: 'biome' | 'eslint' | false; 47 - /** 48 39 * Custom client class name 40 + * @deprecated 49 41 */ 50 42 name?: string; 51 43 /** 52 44 * The relative location of the output directory 53 45 */ 54 - output: string; 46 + output: 47 + | string 48 + | { 49 + /** 50 + * Process output folder with formatter? 51 + * @default false 52 + */ 53 + format?: 'biome' | 'prettier' | false; 54 + /** 55 + * Process output folder with linter? 56 + * @default false 57 + */ 58 + lint?: 'biome' | 'eslint' | false; 59 + /** 60 + * The relative location of the output directory 61 + */ 62 + path: string; 63 + }; 55 64 /** 56 65 * Path to custom request file 66 + * @deprecated 57 67 */ 58 68 request?: string; 59 69 /** ··· 144 154 }; 145 155 /** 146 156 * Use options or arguments functions 157 + * @deprecated 147 158 * @default true 148 159 */ 149 160 useOptions?: boolean; ··· 151 162 152 163 export type Config = Omit< 153 164 Required<UserConfig>, 154 - 'base' | 'name' | 'request' | 'schemas' | 'services' | 'types' 165 + 'base' | 'name' | 'output' | 'request' | 'schemas' | 'services' | 'types' 155 166 > & 156 167 Pick<UserConfig, 'base' | 'name' | 'request'> & { 168 + output: Extract<Required<UserConfig>['output'], object>; 157 169 schemas: Extract<Required<UserConfig>['schemas'], object>; 158 170 services: Extract<Required<UserConfig>['services'], object>; 159 171 types: Extract<Required<UserConfig>['types'], object>;
+8 -6
packages/openapi-ts/src/utils/__tests__/handlebars.spec.ts
··· 14 14 debug: false, 15 15 dryRun: false, 16 16 exportCore: true, 17 - format: 'prettier', 18 17 input: '', 19 - lint: false, 20 - output: '', 18 + output: { 19 + format: 'prettier', 20 + path: '', 21 + }, 21 22 schemas: {}, 22 23 services: {}, 23 24 types: { ··· 42 43 debug: false, 43 44 dryRun: false, 44 45 exportCore: true, 45 - format: 'prettier', 46 46 input: '', 47 - lint: false, 48 - output: '', 47 + output: { 48 + format: 'prettier', 49 + path: '', 50 + }, 49 51 schemas: {}, 50 52 services: {}, 51 53 types: {
+3 -3
packages/openapi-ts/src/utils/write/__tests__/class.spec.ts
··· 16 16 debug: false, 17 17 dryRun: false, 18 18 exportCore: true, 19 - format: false, 20 19 input: '', 21 - lint: false, 22 20 name: 'AppClient', 23 - output: '', 21 + output: { 22 + path: '', 23 + }, 24 24 schemas: {}, 25 25 services: {}, 26 26 types: {
+4 -3
packages/openapi-ts/src/utils/write/__tests__/client.spec.ts
··· 16 16 debug: false, 17 17 dryRun: false, 18 18 exportCore: true, 19 - format: 'prettier', 20 19 input: '', 21 - lint: false, 22 - output: './dist', 20 + output: { 21 + format: 'prettier', 22 + path: './dist', 23 + }, 23 24 schemas: {}, 24 25 services: {}, 25 26 types: {
+9 -9
packages/openapi-ts/src/utils/write/__tests__/core.spec.ts
··· 29 29 debug: false, 30 30 dryRun: false, 31 31 exportCore: true, 32 - format: false, 33 32 input: '', 34 - lint: false, 35 33 name: 'AppClient', 36 - output: '', 34 + output: { 35 + path: '', 36 + }, 37 37 schemas: {}, 38 38 services: {}, 39 39 types: { ··· 84 84 debug: false, 85 85 dryRun: false, 86 86 exportCore: true, 87 - format: false, 88 87 input: '', 89 - lint: false, 90 88 name: 'AppClient', 91 - output: '', 89 + output: { 90 + path: '', 91 + }, 92 92 schemas: {}, 93 93 services: {}, 94 94 types: { ··· 122 122 debug: false, 123 123 dryRun: false, 124 124 exportCore: true, 125 - format: false, 126 125 input: '', 127 - lint: false, 128 126 name: 'AppClient', 129 - output: '', 127 + output: { 128 + path: '', 129 + }, 130 130 schemas: {}, 131 131 services: {}, 132 132 types: {
+3 -3
packages/openapi-ts/src/utils/write/__tests__/index.spec.ts
··· 16 16 debug: false, 17 17 dryRun: false, 18 18 exportCore: true, 19 - format: false, 20 19 input: '', 21 - lint: false, 22 - output: '', 20 + output: { 21 + path: '', 22 + }, 23 23 schemas: {}, 24 24 services: {}, 25 25 types: {
+3 -3
packages/openapi-ts/src/utils/write/__tests__/models.spec.ts
··· 16 16 debug: false, 17 17 dryRun: false, 18 18 exportCore: true, 19 - format: false, 20 19 input: '', 21 - lint: false, 22 20 name: 'AppClient', 23 - output: '', 21 + output: { 22 + path: '', 23 + }, 24 24 schemas: {}, 25 25 services: {}, 26 26 types: {
+3 -3
packages/openapi-ts/src/utils/write/__tests__/schemas.spec.ts
··· 17 17 debug: false, 18 18 dryRun: false, 19 19 exportCore: true, 20 - format: false, 21 20 input: '', 22 - lint: false, 23 21 name: 'AppClient', 24 - output: '', 22 + output: { 23 + path: '', 24 + }, 25 25 schemas: {}, 26 26 services: {}, 27 27 types: {
+3 -3
packages/openapi-ts/src/utils/write/__tests__/services.spec.ts
··· 16 16 debug: false, 17 17 dryRun: false, 18 18 exportCore: true, 19 - format: false, 20 19 input: '', 21 - lint: false, 22 - output: '', 20 + output: { 21 + path: '', 22 + }, 23 23 schemas: {}, 24 24 services: {}, 25 25 types: {},
+6 -6
packages/openapi-ts/src/utils/write/client.ts
··· 38 38 client.models = client.models.filter((model) => regexp.test(model.name)); 39 39 } 40 40 41 - const outputPath = path.resolve(config.output); 41 + const outputPath = path.resolve(config.output.path); 42 42 43 43 if (!existsSync(outputPath)) { 44 44 mkdirSync(outputPath, { recursive: true }); ··· 46 46 47 47 const files: Record<string, TypeScriptFile> = { 48 48 index: new TypeScriptFile({ 49 - dir: config.output, 49 + dir: config.output.path, 50 50 name: 'index.ts', 51 51 }), 52 52 }; 53 53 if (config.schemas.export) { 54 54 files.schemas = new TypeScriptFile({ 55 - dir: config.output, 55 + dir: config.output.path, 56 56 name: 'schemas.ts', 57 57 }); 58 58 } 59 59 if (config.services.export) { 60 60 files.services = new TypeScriptFile({ 61 - dir: config.output, 61 + dir: config.output.path, 62 62 name: 'services.ts', 63 63 }); 64 64 } 65 65 if (config.types.export) { 66 66 files.types = new TypeScriptFile({ 67 - dir: config.output, 67 + dir: config.output.path, 68 68 name: 'types.ts', 69 69 }); 70 70 } ··· 75 75 76 76 // deprecated files 77 77 await writeClientClass(openApi, outputPath, client, templates); 78 - await writeCore(path.resolve(config.output, 'core'), client, templates); 78 + await writeCore(path.resolve(config.output.path, 'core'), client, templates); 79 79 80 80 await processIndex({ files }); 81 81
-34
packages/openapi-ts/test/bin.spec.ts
··· 139 139 expect(result.stderr.toString()).toBe(''); 140 140 }); 141 141 142 - it('formats output with Prettier', () => { 143 - const result = sync('node', [ 144 - './bin/index.cjs', 145 - '--input', 146 - './test/spec/v3.json', 147 - '--output', 148 - './test/generated/bin', 149 - '--format', 150 - 'prettier', 151 - ]); 152 - expect(result.stdout.toString()).toContain('Prettier'); 153 - expect(result.stderr.toString()).toBe(''); 154 - }); 155 - 156 - it('lints output with ESLint', () => { 157 - const result = sync('node', [ 158 - './bin/index.cjs', 159 - '--input', 160 - './test/spec/v3.json', 161 - '--output', 162 - './test/generated/bin', 163 - '--lint', 164 - 'eslint', 165 - ]); 166 - expect(result.stdout.toString()).toContain('ESLint'); 167 - expect(result.stderr.toString()).toBe(''); 168 - }); 169 - 170 142 it('throws error without parameters', () => { 171 143 const result = sync('node', ['./bin/index.cjs', '--dry-run', 'true']); 172 144 expect(result.stdout.toString()).toBe(''); ··· 221 193 'false', 222 194 '--services', 223 195 'false', 224 - '--format', 225 - 'false', 226 - '--lint', 227 - 'false', 228 196 '--useOptions', 229 197 'false', 230 198 '--dry-run', ··· 235 203 expect(result.stderr.toString()).toContain('exportCore: false'); 236 204 expect(result.stderr.toString()).toContain('types: false'); 237 205 expect(result.stderr.toString()).toContain('services: false'); 238 - expect(result.stderr.toString()).toContain('format: false'); 239 - expect(result.stderr.toString()).toContain('lint: false'); 240 206 expect(result.stderr.toString()).toContain('schemas: false'); 241 207 expect(result.stderr.toString()).toContain('useOptions: false'); 242 208 });
+3 -1
packages/openapi-ts/test/sample.cjs
··· 5 5 const config = { 6 6 client: 'fetch', 7 7 input: './test/spec/v3.json', 8 - output: './test/generated/v3/', 8 + output: { 9 + path: './test/generated/v3/', 10 + }, 9 11 schemas: { 10 12 // export: false, 11 13 },