@moccona/apicodegen 0.0.3 β†’ 0.0.8

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.
package/README.md CHANGED
@@ -1,48 +1,343 @@
1
1
  # @moccona/apicodegen
2
2
 
3
- `@moccona/apicodegen` is a command-line tool for generating TypeScript code from OpenAPI documentation. It provides a simple and efficient way to automate the process of creating API clients.
3
+ A powerful OpenAPI code generator that automatically generates TypeScript API client code from OpenAPI specifications.
4
4
 
5
- ## Installation
5
+ [![npm version](https://badge.fury.io/js/@moccona%2Fapicodegen.svg)](https://www.npmjs.com/package/@moccona/apicodegen)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D24-blue.svg)](https://nodejs.org)
6
8
 
7
- To install `@moccona/apicodegen`, you can use npm or yarn:
9
+ ## ✨ Features
8
10
 
9
- ```sh
11
+ - πŸš€ **Multi-version Support** - Full support for OpenAPI 2.0, 3.0, and 3.1
12
+ - πŸ“ **TypeScript First** - Generates complete type definitions and type-safe API functions
13
+ - πŸ”Œ **Multiple Adaptors** - Built-in `fetch` and `axios` HTTP client support
14
+ - πŸ› οΈ **CLI Tool** - Simple and user-friendly command-line interface with retro ASCII banner
15
+ - ⚑ **Vite Plugin** - Seamless integration into Vite build workflow
16
+ - πŸ“¦ **File Upload** - Native support for multipart/form-data file uploads
17
+ - 🎯 **Complete Types** - Supports enums, union types, intersection types, complex nested objects, and more
18
+
19
+ ## πŸ“¦ Installation
20
+
21
+ ```bash
22
+ # Global installation (recommended for CLI usage)
10
23
  npm install -g @moccona/apicodegen
11
24
 
12
- # or
25
+ # Local installation
26
+ npm install -D @moccona/apicodegen
27
+
28
+ # Using pnpm
29
+ pnpm add -D @moccona/apicodegen
30
+ ```
31
+
32
+ ### Peer Dependencies
33
+
34
+ This package includes optional peer dependencies:
35
+
36
+ - `typescript` (v5) - Required for type checking generated code
37
+ - `prettier` (v3) - Used for formatting output
38
+ - `vite` (v7) - Required only if using the Vite plugin
39
+
40
+ ## πŸš€ Quick Start
41
+
42
+ ### CLI Usage
13
43
 
14
- yarn global add @moccona/apicodegen
44
+ ```bash
45
+ # Basic usage
46
+ apicodegen <OpenAPIζ–‡ζ‘£URL> -o ./src/api.ts
47
+
48
+ # Full example
49
+ apicodegen https://api.example.com/openapi.json \
50
+ -o ./src/api.ts \
51
+ -a fetch \
52
+ -b https://api.example.com \
53
+ -v
15
54
  ```
16
55
 
17
- ## Usage
56
+ ### Options
57
+
58
+ | Option | Short | Description | Default |
59
+ |--------|-------|-------------|---------|
60
+ | `--output` | `-o` | Output file path | `./output.ts` |
61
+ | `--spec` | `-s` | OpenAPI spec file path or URL | - |
62
+ | `--adaptor` | `-a` | HTTP client adaptor (`fetch` or `axios`) | `fetch` |
63
+ | `--baseURL` | `-b` | API base URL | - |
64
+ | `--config` | `-c` | Path to config file | - |
65
+ | `--watch` | `-w` | Watch for file changes | - |
66
+ | `--verbose` | `-v` | Enable verbose logging | `false` |
67
+
68
+ ## πŸ“– Usage Examples
69
+
70
+ ### 1. Basic Code Generation
71
+
72
+ ```bash
73
+ # From remote OpenAPI document
74
+ apicodegen https://petstore3.swagger.io/api/v3/openapi.json -o ./api/petstore.ts
18
75
 
19
- ### Basic Command
76
+ # From local file
77
+ apicodegen ./docs/openapi.json -o ./src/generated/api.ts
78
+ ```
79
+
80
+ ### 2. Using Axios Adaptor
81
+
82
+ ```bash
83
+ apicodegen https://api.example.com/openapi.json \
84
+ -o ./src/api.ts \
85
+ -a axios \
86
+ -b https://api.example.com
87
+ ```
20
88
 
21
- The basic command to generate TypeScript code from an OpenAPI documentation URL is as follows:
89
+ ### 3. Watch Mode
22
90
 
23
- ```sh
24
- apicodegen <docURL> --output ./output.ts
91
+ ```bash
92
+ # Watch for file changes and regenerate
93
+ apicodegen ./openapi.yaml -w -o ./src/api.ts
25
94
  ```
26
95
 
27
- - `<docURL>`: The URL of the OpenAPI documentation file.
28
- - `--output`: The path where the generated TypeScript code will be saved. Default is `./output.ts`.
29
- - `--adaptor`: The adaptor for API calls. Default is `fetch`.
30
- - `--baseURL`: The base path of the API endpoint.
31
- - `--verbose`: Enable verbose logging.
32
- - `--importClientSource`: The source from which the request tool will be imported.
96
+ ## πŸ”Œ Vite Plugin
33
97
 
34
- ## Example
98
+ Automatically integrate code generation into your Vite project:
35
99
 
36
- To generate TypeScript code from an OpenAPI documentation file located at `https://api.example.com/openapi.json` and save it to `./src/api.ts`, you can run:
100
+ ```typescript
101
+ // vite.config.ts
102
+ import { defineConfig } from 'vite';
103
+ import { apiCodeGenPlugin } from '@moccona/apicodegen/vite';
37
104
 
38
- ```sh
39
- apicodegen https://api.example.com/openapi.json --output ./src/api.ts
105
+ export default defineConfig({
106
+ plugins: [
107
+ apiCodeGenPlugin([
108
+ {
109
+ name: 'petstore-api',
110
+ docURL: 'https://petstore3.swagger.io/api/v3/openapi.json',
111
+ output: './src/api/petstore.ts',
112
+ adaptor: 'fetch',
113
+ baseURL: 'https://petstore3.swagger.io/api/v3',
114
+ },
115
+ ]),
116
+ ],
117
+ });
40
118
  ```
41
119
 
42
- ## Contributing
120
+ ### Vite Plugin Options
121
+
122
+ | Option | Type | Description |
123
+ |--------|------|-------------|
124
+ | `name` | `string` | Human-readable API name (required) |
125
+ | `spec` | `string` | OpenAPI spec file path or URL |
126
+ | `output` | `string` | Output file path (required) |
127
+ | `adaptor` | `'fetch' \| 'axios'` | HTTP client adaptor |
128
+ | `baseURL` | `string` | API base URL |
129
+ | `importClientSource` | `string` | Custom client import source (for advanced axios/fetch configuration) |
130
+ | `verbose` | `boolean` | Enable verbose logging |
131
+ | `typeCheck` | `boolean` | Run type check after generation (default: true) |
132
+
133
+ ### Using Custom Axios Instance
134
+
135
+ If you need to use a custom-configured axios instance (e.g., with interceptors, custom base URL, or authentication), you can provide your own axios instance via `importClientSource`:
136
+
137
+ ```typescript
138
+ // src/lib/api-client.ts
139
+ import axios from 'axios';
140
+
141
+ export const apiClient = axios.create({
142
+ baseURL: 'https://api.example.com',
143
+ timeout: 10000,
144
+ });
145
+
146
+ apiClient.interceptors.request.use((config) => {
147
+ config.headers.Authorization = `Bearer ${getToken()}`;
148
+ return config;
149
+ });
150
+ ```
151
+
152
+ ```typescript
153
+ // vite.config.ts
154
+ import { defineConfig } from 'vite';
155
+ import { apiCodeGenPlugin } from '@moccona/apicodegen/vite';
156
+ import { apiClient } from './src/lib/api-client';
157
+
158
+ export default defineConfig({
159
+ plugins: [
160
+ apiCodeGenPlugin([
161
+ {
162
+ name: 'my-api',
163
+ spec: './openapi.json',
164
+ output: './src/api/generated.ts',
165
+ adaptor: 'axios',
166
+ importClientSource: `import { apiClient as axios } from '@/lib/api-client';`,
167
+ },
168
+ ]),
169
+ ],
170
+ });
171
+ ```
172
+
173
+ The generated code will use your custom instance instead of the default `axios`:
174
+
175
+ ```typescript
176
+ // Generated code
177
+ import { apiClient as axios } from '@/lib/api-client';
178
+
179
+ // Uses apiClient under the hood
180
+ export async function getPetById({ petId }: { petId: number }) {
181
+ return apiClient(`/pets/${petId}`, { method: 'GET' });
182
+ }
183
+ ```
184
+
185
+ ## πŸ“ Generated Code Example
186
+
187
+ Given the following OpenAPI definition:
188
+
189
+ ```yaml
190
+ paths:
191
+ /pets/{petId}:
192
+ get:
193
+ operationId: getPetById
194
+ parameters:
195
+ - name: petId
196
+ in: path
197
+ required: true
198
+ schema:
199
+ type: integer
200
+ responses:
201
+ '200':
202
+ content:
203
+ application/json:
204
+ schema:
205
+ $ref: '#/components/schemas/Pet'
206
+
207
+ components:
208
+ schemas:
209
+ Pet:
210
+ type: object
211
+ properties:
212
+ id:
213
+ type: integer
214
+ name:
215
+ type: string
216
+ status:
217
+ type: string
218
+ enum: [available, pending, sold]
219
+ ```
220
+
221
+ The generated TypeScript code:
222
+
223
+ ```typescript
224
+ /**
225
+ * Pet object
226
+ */
227
+ export type Pet = {
228
+ id?: number;
229
+ name?: string;
230
+ status?: 'available' | 'pending' | 'sold';
231
+ };
232
+
233
+ /**
234
+ * Get a pet by ID
235
+ */
236
+ export async function getPetById({ petId }: { petId: number }) {
237
+ return fetch(`/pets/${petId}`, {
238
+ method: 'GET',
239
+ }).then(async (response) => (await response.json()) as Pet);
240
+ }
241
+ ```
242
+
243
+ ## 🎯 Supported OpenAPI Features
244
+
245
+ ### Schema Types
246
+ - βœ… Basic types: `string`, `number`, `integer`, `boolean`
247
+ - βœ… Complex objects: `object` and property definitions
248
+ - βœ… Array types: `array` and nested arrays
249
+ - βœ… Enum types: Automatically generate TypeScript enums
250
+ - βœ… Union types: `oneOf`, `anyOf`
251
+ - βœ… Intersection types: `allOf`
252
+ - βœ… Reference types: `$ref` with circular reference handling
253
+ - βœ… File types: `binary`, `blob`, `file` formats
254
+
255
+ ### Parameter Locations
256
+ - βœ… Path parameters: `/users/{id}`
257
+ - βœ… Query parameters: `?page=1&limit=10`
258
+ - βœ… Header parameters: Custom request headers
259
+ - βœ… Cookie parameters: Request cookies
260
+ - βœ… Body parameters: JSON and FormData
261
+
262
+ ### Request Body Formats
263
+ - βœ… `application/json` - JSON data
264
+ - βœ… `multipart/form-data` - File uploads
265
+ - βœ… `application/x-www-form-urlencoded` - Form data
266
+ - βœ… `text/plain`, `image/*` - Binary data
267
+
268
+ ## πŸ”§ Troubleshooting
269
+
270
+ ### Common Issues
271
+
272
+ **"Command not found" after installation**
273
+ If using the CLI globally but getting command not found, try:
274
+ ```bash
275
+ # Reinstall globally
276
+ npm install -g @moccona/apicodegen
277
+
278
+ # Or use npx
279
+ npx @moccona/apicodegen <OpenAPIζ–‡ζ‘£URL> -o ./src/api.ts
280
+ ```
281
+
282
+ **Network errors when fetching OpenAPI documents**
283
+ - Verify the URL is publicly accessible
284
+ - Try downloading the document locally first
285
+ - Check firewall/proxy settings
286
+ - Use `-v` flag for verbose logging to debug
287
+
288
+ **TypeScript errors in generated code**
289
+ - Ensure `typescript` is installed: `npm install -D typescript`
290
+ - Run `tsc --noEmit` to see specific errors
291
+ - Check that your `tsconfig.json` is properly configured
292
+
293
+ **Vite plugin not generating files**
294
+ - Ensure Node.js 24+ is installed
295
+ - Check that all required options (`name`, `output`) are provided
296
+ - Set `verbose: true` in plugin options to see generation logs
297
+
298
+ **Watch mode not triggering regeneration**
299
+ - Watch mode monitors the spec file, not your output file
300
+ - Ensure the spec file path is correct
301
+ - Try restarting the watch process
302
+
303
+ ### Getting Help
304
+
305
+ - Report issues at [GitHub Issues](https://github.com/freemode1614/api-codegen/issues)
306
+ - Check [CHANGELOG](CHANGELOG.md) for recent updates
307
+
308
+ ## πŸ”§ Development
309
+
310
+ ```bash
311
+ # Install dependencies
312
+ pnpm install
313
+
314
+ # Development mode
315
+ pnpm dev
316
+
317
+ # Build
318
+ pnpm build
319
+
320
+ # Run tests
321
+ pnpm test
322
+
323
+ # Type check
324
+ pnpm typecheck
325
+
326
+ # Lint
327
+ pnpm lint
328
+
329
+ # Format
330
+ pnpm format
331
+ ```
332
+
333
+ ## πŸ“„ License
334
+
335
+ [MIT](LICENSE) Β© freemode
336
+
337
+ ## 🀝 Contributing
43
338
 
44
- Contributions are welcome! Please read the [contributing guidelines](./CONTRIBUTING.md) before submitting a pull request.
339
+ Issues and Pull Requests are welcome!
45
340
 
46
- ## License
341
+ ---
47
342
 
48
- This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.
343
+ Questions or suggestions? Visit [GitHub Issues](https://github.com/freemode1614/api-codegen/issues).
package/bin/cli.cjs ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("node:path");c=s(c,1);let l=require("commander"),u=require("fs-extra");u=s(u,1);let d=require("@moccona/logger"),f=require("undici"),p=require("typescript"),m=require("node:fs/promises"),h=require("prettier");var g={name:`@moccona/apicodegen`,version:`0.0.8`,description:``,type:`module`,engines:{node:`>=24`},bin:{apicodegen:`./bin/cli.cjs`},scripts:{dev:`tsdown --watch`,build:`tsdown`,test:`vitest --watch false`,prepublishOnly:`npm run build`,lint:`pnpm exec biome check src`,"lint:fix":`pnpm exec biome check --write src`,format:`pnpm exec biome format --write src`,debug:`node --inspect-brk=9229 bin/cli.cjs`,prepare:`husky`,typecheck:`tsc --noEmit`,version:`changeset version`,publish:`changeset publish`},exports:{"./package.json":`./package.json`,"./vite":{types:`./npm/vite/index.d.mts`,import:`./npm/vite/index.mjs`},"./*":{types:`./npm/*/index.d.mts`,import:`./npm/*/index.mjs`,require:`./npm/*/index.cjs`},".":{types:`./npm/index.d.mts`,import:`./npm/index.mjs`,require:`./npm/index.cjs`}},keywords:[`api-codegen`],repository:{type:`git`,url:`https://github.com/freemode1614/api-codegen`},author:`freemode`,license:`MIT`,publishConfig:{access:`public`},dependencies:{"@moccona/logger":`^0.0.2`,commander:`^13.1.0`,execa:`^9.5.2`,"fs-extra":`^11.3.0`,"openapi-types":`^12.1.3`,prettier:`^3.6.2`,undici:`^7.8.0`},devDependencies:{"@arethetypeswrong/core":`^0.18.2`,"@biomejs/biome":`^2.4.16`,"@changesets/cli":`^2.31.0`,"@types/fs-extra":`^11.0.4`,"@types/node":`^22.14.1`,axios:`^1.11.0`,"fast-glob":`^3.3.3`,husky:`^9.1.7`,"lint-staged":`^17.0.5`,prettier:`^3.6.2`,serve:`^14.2.4`,"serve-handler":`^6.1.7`,tsdown:`^0.22.1`,typescript:`^5.9.2`,vite:`^7.1.5`,"vite-tsconfig-paths":`^6.1.1`,vitest:`^3.2.4`},peerDependencies:{prettier:`^3`,typescript:`^5`,vite:`^7`},peerDependenciesMeta:{vite:{optional:!0}},"lint-staged":{"src/**/*":[`biome check --write`,`biome format --write`]},packageManager:`pnpm@10.9.0`};const _={APICODEGEN_SPEC:`spec`,APICODEGEN_OUTPUT:`output`,APICODEGEN_BASE_URL:`baseURL`,APICODEGEN_ADAPTOR:`adaptor`,APICODEGEN_VERBOSE:`verbose`,APICODEGEN_WATCH:`watch`,APICODEGEN_TYPE_CHECK:`typeCheck`};function v(){let e={};for(let[t,n]of Object.entries(_)){let r=process.env[t];if(r!==void 0)switch(n){case`verbose`:case`watch`:case`typeCheck`:e[n]=r===`true`||r===`1`;break;case`adaptor`:e[n]=r;break;default:e[n]=r}}return e}async function y(e){let t=c.default.extname(e).toLowerCase();try{if(t===`.json`||t===`.jsonc`){let t=await u.default.readFile(e,`utf-8`);return JSON.parse(t)}if(t===`.js`||t===`.cjs`||t===`.mjs`){let t=await import(e);return t.default||t}if(t===`.ts`){let t=await u.default.readFile(e,`utf-8`);try{return JSON.parse(t)}catch{let e=t.match(/export\s+default\s+(\{.+\})/s);if(e)return JSON.parse(e[1])}}let n=await u.default.readFile(e,`utf-8`);return JSON.parse(n)}catch(t){throw Error(`Failed to load config from ${e}: ${t}`)}}async function b(e){for(let t of[`apicodegen.config.json`,`apicodegen.config.js`,`apicodegen.config.mjs`,`.apicodegenrc`,`.apicodegenrc.json`,`.apicodegenrc.js`,`.apicodegenrc.mjs`]){let n=c.default.join(e,t);if(await u.default.pathExists(n))return n}let t=c.default.join(e,`package.json`);if(await u.default.pathExists(t))try{let n=JSON.parse(await u.default.readFile(t,`utf-8`));if(n.apicodegen&&typeof n.apicodegen==`string`)return c.default.resolve(e,n.apicodegen)}catch{}return null}function x(e,...t){let n={...e};for(let e of t)if(e)for(let[t,r]of Object.entries(e))r!==void 0&&(n[t]=r);return n}function ee(e){if(!e.spec)throw Error(`Missing required field: spec (OpenAPI spec file path or URL)`);return!0}async function S(e={}){let t=e.cwd||process.cwd(),n=e.cliOptions||{},r=v(),i={},a;if(e.configFile)a=c.default.resolve(t,e.configFile),i=await y(a);else{let e=await b(t);e&&(a=e,i=await y(e))}let o=c.default.join(t,`package.json`),s={};if(await u.default.pathExists(o))try{let e=JSON.parse(await u.default.readFile(o,`utf-8`));e.apicodegen&&typeof e.apicodegen==`object`&&(s=e.apicodegen)}catch{}let l=x({spec:``,output:`./output.ts`},r,s,i,n);ee(l);let d=e.name||l.baseURL||l.spec;return{...l,configFilePath:a,name:d}}function C(e){return{docURL:e.spec,output:e.output,adaptor:e.adaptor,baseURL:e.baseURL,importClientSource:e.importClientSource,verbose:e.verbose,requestOptions:e.requestOptions}}const w={SPEC_NOT_FOUND:`E_SPEC_NOT_FOUND`,SPEC_FETCH_FAILED:`E_SPEC_FETCH_FAILED`,SPEC_PARSE_FAILED:`E_SPEC_PARSE_FAILED`,OUTPUT_DIR_MISSING:`E_OUTPUT_DIR_MISSING`,CONFIG_INVALID:`E_CONFIG_INVALID`,VALIDATION_FAILED:`E_VALIDATION_FAILED`,GENERATION_FAILED:`E_GENERATION_FAILED`,TYPE_CHECK_FAILED:`E_TYPE_CHECK_FAILED`};var T=class e extends Error{code;location;line;column;path;suggestions;cause;constructor(t){super(t.message),this.name=`ApicodegenError`,this.code=t.code,this.location=t.location,this.line=t.line,this.column=t.column,this.path=t.path,this.suggestions=t.suggestions||[],this.cause=t.cause,Error.captureStackTrace&&Error.captureStackTrace(this,e)}toString(e=!1){let t=[];if(t.push(`\x1b[1;31mError [${this.code}]\x1b[0m ${this.message}`),this.location&&t.push(` \x1b[36m→ Location:\x1b[0m ${this.location}`),this.path&&t.push(` \x1b[36m→ Path:\x1b[0m ${this.path}`),this.line!==void 0){let e=` \x1b[36m→ Line:\x1b[0m ${this.line}`;this.column!==void 0&&(e+=`, Column: ${this.column}`),t.push(e)}if(this.suggestions.length>0)for(let e of this.suggestions)t.push(` \x1b[32m→ Suggestion:\x1b[0m ${e}`);if(e&&this.cause&&(t.push(`\n \x1b[90mOriginal Error:\x1b[0m ${this.cause.message}`),this.stack)){let e=this.stack.split(`
3
+ `).slice(1).join(`
4
+ `);t.push(`\x1b[90m${e}\x1b[0m`)}return t.join(`
5
+ `)}toJSON(){return{name:this.name,code:this.code,message:this.message,location:this.location,line:this.line,column:this.column,path:this.path,suggestions:this.suggestions,cause:this.cause?.message}}};const E={specNotFound(e,t){return new T({code:w.SPEC_NOT_FOUND,message:`OpenAPI spec file not found`,location:e,suggestions:[`Check if the file exists using 'ls -la'`,`Use --spec to provide the correct path`,`For remote specs, ensure the URL is accessible`],cause:t})},specFetchFailed(e,t,n){let r=t?`Failed to fetch OpenAPI spec (HTTP ${t})`:`Failed to fetch OpenAPI spec from URL`;return new T({code:w.SPEC_FETCH_FAILED,message:r,location:e,suggestions:[`Check if the URL is accessible in a browser`,`Download the spec file locally and use the local path`,`Verify CORS settings if fetching from a different origin`],cause:n})},specParseFailed(e,t,n,r){return new T({code:w.SPEC_PARSE_FAILED,message:`Failed to parse OpenAPI spec (invalid JSON or YAML)`,location:e,line:t,column:n,suggestions:[`Validate JSON syntax using jsonlint.com`,`For YAML specs, ensure proper indentation`,`Check for trailing commas or unquoted special characters`],cause:r})},outputDirMissing(e,t){return new T({code:w.OUTPUT_DIR_MISSING,message:`Output directory does not exist`,location:e,suggestions:[`Create the directory: mkdir -p $(dirname <output>)`,`Check if the path is correct`],cause:t})},configInvalid(e,t){return new T({code:w.CONFIG_INVALID,message:`Invalid configuration file`,location:e,suggestions:[`Validate JSON syntax in the config file`,`Check for required fields (spec, output)`],cause:t})},validationFailed(e,t,n){return new T({code:w.VALIDATION_FAILED,message:`OpenAPI spec validation failed`,location:e,path:t,suggestions:[`Check OpenAPI spec structure at the specified path`,`Ensure all required fields are present`,`Validate using swagger.io editor`],cause:n})},generationFailed(e){return new T({code:w.GENERATION_FAILED,message:`Code generation failed`,suggestions:[`Check for unsupported OpenAPI features`,`Ensure spec follows OpenAPI 2.0, 3.0, or 3.1 specification`,`Use --verbose for more details`],cause:e})},typeCheckFailed(e,t,n){return new T({code:w.TYPE_CHECK_FAILED,message:`TypeScript type check failed`,location:e,suggestions:[`Review type errors above`,`Check for schema inconsistencies`,`Update generated types or fix source schema`],cause:n})},missingRequiredField(e,t){return new T({code:w.VALIDATION_FAILED,message:`Missing required field: ${e}`,path:t,suggestions:[`Add the '${e}' field to your configuration`]})}};function te(e,t){return e instanceof T?e:e instanceof Error?new T({code:t?.code||w.GENERATION_FAILED,message:t?.message||e.message,location:t?.location,suggestions:t?.suggestions,cause:e}):new T({code:t?.code||w.GENERATION_FAILED,message:String(e),suggestions:t?.suggestions})}function D(e){return e instanceof T}var O=class{};const k=new Set(`break.case.catch.class.const.continue.debugger.default.delete.do.else.enum.export.extends.false.finally.for.function.if.import.in.instanceof.new.null.return.super.switch.this.throw.true.try.typeof.var.void.while.with.as.implements.interface.let.package.private.protected.public.static.yield.abstract.any.async.await.constructor.declare.from.get.is.module.namespace.never.require.set.type.unknown.readonly.of.asserts.infer.keyof.boolean.number.string.symbol.object.undefined.bigint`.split(`.`));let A=function(e){return e.JSON=`application/json`,e.TEXT=`text`,e.IMAGE=`image`,e.AUDIO=`audio`,e.VIDEO=`video`,e}({}),j=function(e){return e.GET=`get`,e.PUT=`put`,e.POST=`post`,e.DELETE=`delete`,e.OPTIONS=`options`,e.HEAD=`head`,e.PATCH=`patch`,e.TRACE=`trace`,e}({});var M=class e{constructor(){if(new.target===e)throw Error(`Cannot instantiate abstract class`)}static ref2name(t,n){let r=t.replace(/^#/,``).split(`/`).filter(Boolean);if(!n)return r.slice(-1)[0];let i=n,a=``;for(let e of r){let t=e.replaceAll(`~1`,`/`);i=i[t],a=t}return i?i.$ref?e.ref2name(i.$ref,n):a:`unknown`}static pathToFnName(t,n,r=``){return e.normalize(e.camelCase(e.normalize(t)))+(n?e.capitalize(e.upperCamelCase(`using_${n}`)):``)}static normalize(e){return k.has(e)&&(e+=`_`),e.replace(/[/\-_{}():\s`,*<>$#.]/gm,`_`).replace(/^\d./gm,``).replaceAll(`...`,``)}static capitalize(e){return e=e.trim(),`${e.charAt(0).toUpperCase()}${e.slice(1)}`}static camelCase(t){return t=t.trim(),t.split(`_`).filter(Boolean).map((t,n)=>n===0?t:e.capitalize(t)).join(``)}static upperCamelCase(t){return e.normalize(t).replaceAll(`...`,``).split(`_`).filter(Boolean).map(e.capitalize).join(``)}static async fetchDoc(e,t={}){let{body:n,statusCode:r}=await(0,f.request)(e,{method:`GET`,dispatcher:new f.Agent({connect:{rejectUnauthorized:!1}}),...t});if(r>=400)throw Error(`Failed to fetch OpenAPI documentation from ${e}: HTTP ${r}`);try{return n.json()}catch(t){throw Error(`Failed to parse JSON response from ${e}: ${t instanceof Error?t.message:String(t)}`)}}static getMediaType(e){return Object.values(A).find(t=>e.includes(t))}static isValidEnumType(t){return t.type!==`boolean`&&!e.isBooleanEnum(t)}static isBooleanEnum(e){return e.type===`boolean`||!!e.enum?.some(e=>typeof e==`boolean`)}static isSameEnum(e,t){return e.enum.length===t.enum.length&&e.enum.sort().every((e,n)=>e===t.enum.sort()[n])}static uniqueEnums(e){let t=new Map;for(let n of e){let e=t.get(n.name);if(e)for(let t of n.enum)e.add(t);else t.set(n.name,new Set(n.enum))}return Array.from(t.entries()).map(([e,t])=>({name:e,enum:Array.from(t)}))}static findSameSchema(t,n){return n.find(n=>e.isSameEnum(n,t))}static isRef(e){return typeof e==`object`&&!!e&&`$ref`in e&&typeof e.$ref==`string`}},ne=class{enums=[];schemas={};parameters={};responses={};requestBodies={};apis={};docURL;baseURL;output;requestOptions;importClientSource;constructor(e,t){this.docURL=e.docURL,this.baseURL=e.baseURL??``,this.output=e.output??`.`,this.requestOptions=e.requestOptions??{},this.importClientSource=e.importClientSource??``;let{enums:n,schemas:r,requestBodies:i,responses:a,parameters:o,apis:s}=this.parse(t);this.enums=n,this.schemas=r,this.responses=a,this.parameters=o,this.requestBodies=i,this.apis=s}},N=class e{static toCode(e){if(e.length===0)return`// No api declaration found.`;let t=p.factory.createSourceFile(e,p.factory.createToken(p.SyntaxKind.EndOfFileToken),p.NodeFlags.None);return(0,p.createPrinter)().printFile(t)}static async write(e,t){try{await(0,m.writeFile)(t,e)}catch(e){console.error(e)}}static toUrlTemplate(e,t,n=``){let r=t.filter(e=>e.in===`query`);if(r.length>0){let t=r.map((e,t)=>`${t===0?`?`:`&`}${encodeURIComponent(e.name)}={${M.camelCase(M.normalize(e.name))}}`).join(``);e+=t}let i=e.replaceAll(`{`,"${").split(`$`).filter(Boolean);return i.length===1?p.factory.createNoSubstitutionTemplateLiteral(n+e):p.factory.createTemplateExpression(p.factory.createTemplateHead(n+i[0]),i.slice(1).map((e,t)=>{let n=/^{(.+)}(.+)?/gm.exec(e),r=t===i.length-2;if(!n)throw Error(`Invalid path segment: ${e}`);return p.factory.createTemplateSpan(p.factory.createIdentifier(n[1]),r?p.factory.createTemplateTail(n[2]||``):p.factory.createTemplateMiddle(n[2]))}))}static addComments(e,t){if(!Array.isArray(t)||t.filter(Boolean).length===0)return;let n=`*
6
+ `+t.map(e=>e.tag?` @${e.tag} ${e.comment??``}`:` ${e.comment}`).join(`
7
+ `).trim()+`
8
+ `;(0,p.addSyntheticLeadingComment)(e,p.SyntaxKind.MultiLineCommentTrivia,n,!0)}static isBinarySchema(t){if(t.type===`array`){let n=t;return e.isBinarySchema(n.items)}let n=t;return n.format===`blob`||n.format===`binary`||n.type===`file`}static toRequestBodyTypeNode(t){return p.factory.createParameterDeclaration(void 0,void 0,p.factory.createIdentifier(`req`),void 0,e.toTypeNode(t))}static toTypeNode(t){let{type:n,ref:r}=t;if(r){let e=M.ref2name(r);return p.factory.createTypeReferenceNode(p.factory.createIdentifier(e===`unknown`?e:M.upperCamelCase(e)))}switch(n){case`array`:{let{items:n}=t;return p.factory.createArrayTypeNode(e.toTypeNode(n))}case`object`:{let n=Object.keys(t.properties??{}).length;if(!t.properties||n===0)return p.factory.createTypeReferenceNode(p.factory.createIdentifier(`Record`),[p.factory.createToken(p.SyntaxKind.StringKeyword),p.factory.createToken(p.SyntaxKind.UnknownKeyword)]);let r=Object.keys(t.properties);return p.factory.createTypeLiteralNode(r.map(n=>{let r=t.properties[n];return p.factory.createPropertySignature(void 0,p.factory.createStringLiteral(n),t.required||t.ref||e.isBinarySchema(t)?void 0:p.factory.createToken(p.SyntaxKind.QuestionToken),e.toTypeNode(r))}))}case`integer`:case`number`:return t.enum?p.factory.createUnionTypeNode(t.enum.map(e=>p.factory.createLiteralTypeNode(p.factory.createNumericLiteral(e)))):p.factory.createToken(p.SyntaxKind.NumberKeyword);case`boolean`:return p.factory.createToken(p.SyntaxKind.BooleanKeyword);case`file`:return p.factory.createTypeReferenceNode(p.factory.createIdentifier(`Blob`));default:{let{format:n,oneOf:r,allOf:i,anyOf:a,type:o,enum:s}=t;switch(n){case`number`:return p.factory.createToken(p.SyntaxKind.NumberKeyword);case`string`:return p.factory.createToken(p.SyntaxKind.StringKeyword);case`boolean`:return p.factory.createToken(p.SyntaxKind.BooleanKeyword);case`blob`:case`binary`:return p.factory.createTypeReferenceNode(p.factory.createIdentifier(`Blob`));default:}if(s)return p.factory.createUnionTypeNode(s.map(e=>p.factory.createLiteralTypeNode(p.factory.createStringLiteral(e))));if(o===`string`)return p.factory.createToken(p.SyntaxKind.StringKeyword);if(r)return p.factory.createUnionTypeNode(r.map(t=>e.toTypeNode(t)));if(a)return p.factory.createUnionTypeNode(a.map(t=>e.toTypeNode(t)));if(i)return p.factory.createIntersectionTypeNode(i.map(t=>e.toTypeNode(t)));if(o&&typeof o==`string`)return p.factory.createTypeReferenceNode(o!==`unknown`&&o!==`null`?p.factory.createIdentifier(M.upperCamelCase(o)):o)}}return p.factory.createToken(p.SyntaxKind.UnknownKeyword)}static toDeclarationNodes(t){let n=[],r=[],i=[];for(let a of t)if(a.ref){let e=M.ref2name(a.ref);i.push(p.factory.createParameterDeclaration(void 0,void 0,p.factory.createIdentifier(M.camelCase(M.normalize(e))),void 0,p.factory.createTypeReferenceNode(p.factory.createIdentifier(M.upperCamelCase(M.normalize(e)))),void 0))}else{let{name:t,schema:i,required:o}=a;n.push(p.factory.createBindingElement(void 0,void 0,p.factory.createIdentifier(M.camelCase(M.normalize(t))))),r.push(p.factory.createPropertySignature([],p.factory.createIdentifier(M.camelCase(M.normalize(t))),o?void 0:p.factory.createToken(p.SyntaxKind.QuestionToken),i?e.toTypeNode(i):p.factory.createToken(p.SyntaxKind.UnknownKeyword)))}return n.length>0?[p.factory.createParameterDeclaration(void 0,void 0,p.factory.createObjectBindingPattern(n),void 0,p.factory.createTypeLiteralNode(r),void 0),...i]:i}static toFormDataStatement(t,n){let r=[],i=p.factory.createVariableStatement(void 0,p.factory.createVariableDeclarationList([p.factory.createVariableDeclaration(p.factory.createIdentifier(`fd`),void 0,void 0,p.factory.createNewExpression(p.factory.createIdentifier(`FormData`),void 0,[]))],p.NodeFlags.Const));return r.push(i),t.forEach(e=>{r.push(p.factory.createExpressionStatement(p.factory.createBinaryExpression(p.factory.createIdentifier(e.name),p.factory.createToken(p.SyntaxKind.AmpersandAmpersandToken),p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),void 0,[p.factory.createStringLiteral(e.name),p.factory.createIdentifier(e.name)]))))}),n&&n.type===`object`&&n.properties&&Object.keys(n.properties).length!==0&&Object.keys(n.properties).forEach(t=>{let i=n.properties[t];i.type===`array`&&e.isBinarySchema(i)?r.push(p.factory.createForOfStatement(void 0,p.factory.createVariableDeclarationList([p.factory.createVariableDeclaration(`file`)],p.NodeFlags.Const),p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)),p.factory.createBlock([p.factory.createExpressionStatement(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),[],[p.factory.createStringLiteral(t),p.factory.createIdentifier(`file`),p.factory.createPropertyAccessExpression(p.factory.createAsExpression(p.factory.createIdentifier(`file`),p.factory.createTypeReferenceNode(p.factory.createIdentifier(`File`),void 0)),p.factory.createIdentifier(`name`))]))]))):i.required?r.push(p.factory.createExpressionStatement(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),void 0,[p.factory.createStringLiteral(t),i.type===`string`?p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)):p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t))])]))):r.push(p.factory.createExpressionStatement(p.factory.createBinaryExpression(p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)),p.factory.createToken(p.SyntaxKind.AmpersandAmpersandToken),p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`fd`),p.factory.createIdentifier(`append`)),void 0,[p.factory.createStringLiteral(t),i.type===`string`?p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)):p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t))])]))))}),r}static bodyBlock(t,n,r,i,a,o){let s=i&&[`multipart/form-data`,`application/x-www-form-urlencoded`].includes(i.type),c=a?.type===`application/json`,l=i?.schema&&i.schema.type===`array`&&e.isBinarySchema(i.schema),u=r.filter(t=>t.in===`formData`||t.schema&&e.isBinarySchema(t.schema)),d=r.filter(e=>!u.includes(e)),f=i?.schema&&`properties`in i.schema&&Object.values(i.schema?.properties??{}).some(t=>e.isBinarySchema(t)),m=r.some(t=>t?.schema&&e.isBinarySchema(t.schema)),h=s||l||m||f||u.length>0;return p.factory.createBlock([...h?e.toFormDataStatement(u,i?.schema):[],...o.client(t,n,d,i,a,o,h,c)])}static schemaToStatemets(t,n,r){let i=[],{apis:a,schemas:o={},enums:s}=t,c=[];for(let e of s)c.push(M.upperCamelCase(e.name)),i.push(p.factory.createEnumDeclaration([p.factory.createToken(p.SyntaxKind.ExportKeyword)],p.factory.createIdentifier(M.upperCamelCase(e.name)),e.enum.map(e=>p.factory.createEnumMember(p.factory.createStringLiteral(typeof e==`string`?e:`${e}_`),typeof e==`string`?p.factory.createStringLiteral(e):p.factory.createNumericLiteral(e)))));for(let t in o)if(Object.hasOwn(o,t)&&!c.includes(M.upperCamelCase(t))){let n=o[t];i.push(p.factory.createTypeAliasDeclaration([p.factory.createModifier(p.SyntaxKind.ExportKeyword)],p.factory.createIdentifier(M.upperCamelCase(t)),void 0,e.toTypeNode(n)))}for(let t in a){let o=a[t];for(let a of o){let{method:o,operationId:s,requestBody:c=[],responses:l=[],summary:u,deprecated:d,description:f}=a,{parameters:m=[]}=a;m=m.filter(e=>e.in!==`cookie`),c.length===0&&c.push({type:`application/json`});let h=c.length>1;for(let a of c){let c=p.factory.createFunctionDeclaration([p.factory.createModifier(p.SyntaxKind.ExportKeyword),p.factory.createModifier(p.SyntaxKind.AsyncKeyword)],void 0,M.pathToFnName(t,o,s)+(h?M.capitalize(a.type.split(`/`)[1]):``),void 0,[...m.length>0?e.toDeclarationNodes(m):[],...a?.schema?[e.toRequestBodyTypeNode(a.schema)]:[]].filter(Boolean),void 0,e.bodyBlock(r.baseURL+t,o,m,a,l[0],n));e.addComments(c,[f&&{comment:f},u&&{comment:u},d&&{tag:`deprecated`}].filter(Boolean)),i.push(c)}}}return i}static async prettier(e){return await(0,h.format)(e,{parser:`typescript`})}static async genCode(t,n,r){let{importClientSource:i}=n,a=e.schemaToStatemets(t,r,{baseURL:n.baseURL??``}),o=e.toCode(a);return i&&(o=i+`
9
+
10
+ `+o),await e.prettier(o)}},P=class extends O{methodFieldName=`method`;bodyFieldName=`data`;headersFieldName=`headers`;queryFieldName=`params`;name=`axios`;client(e,t,n,r,i,a,o){let s=[],c=n.filter(e=>!e.in||e.in===`body`),l=n.filter(e=>e.in===`header`);return s.push(p.factory.createReturnStatement(p.factory.createCallExpression(p.factory.createIdentifier(a.name),i?.schema?[N.toTypeNode(i.schema)]:void 0,[N.toUrlTemplate(e,n),p.factory.createObjectLiteralExpression([p.factory.createPropertyAssignment(p.factory.createIdentifier(a.methodFieldName),p.factory.createStringLiteral(t.toUpperCase()))].concat(l.length>0?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.headersFieldName),p.factory.createObjectLiteralExpression(l.map(e=>p.factory.createPropertyAssignment(p.factory.createStringLiteral(e.name),p.factory.createCallExpression(p.factory.createIdentifier(`encodeURIComponent`),void 0,[p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createIdentifier(M.camelCase(M.normalize(e.name)))])]))))):[],o||c.length>0||r?.schema?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.bodyFieldName),o?p.factory.createIdentifier(`fd`):(c.length>0||r?.schema&&N.isBinarySchema(r.schema),p.factory.createIdentifier(`req`))):[]),!0)]))),s}},F=class extends O{methodFieldName=`method`;bodyFieldName=`body`;headersFieldName=`headers`;queryFieldName=``;name=`fetch`;client(e,t,n,r,i,a,o,s){let c=[],l=n.filter(e=>!e.in||e.in===`body`),u=n.filter(e=>e.in===`header`),d=()=>p.factory.createObjectLiteralExpression([p.factory.createPropertyAssignment(p.factory.createIdentifier(a.methodFieldName),p.factory.createStringLiteral(t.toUpperCase()))].concat(u.length>0?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.headersFieldName),p.factory.createObjectLiteralExpression(u.map(e=>p.factory.createPropertyAssignment(p.factory.createStringLiteral(e.name),p.factory.createCallExpression(p.factory.createIdentifier(`encodeURIComponent`),void 0,[p.factory.createCallExpression(p.factory.createIdentifier(`String`),void 0,[p.factory.createIdentifier(M.camelCase(M.normalize(e.name)))])]))))):[],o||l.length>0||r?.schema?p.factory.createPropertyAssignment(p.factory.createIdentifier(a.bodyFieldName),o?p.factory.createIdentifier(`fd`):l.length>0||r?.schema&&!N.isBinarySchema(r.schema)?p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`JSON`),p.factory.createIdentifier(`stringify`)),[],[r?p.factory.createIdentifier(`req`):p.factory.createObjectLiteralExpression(l.map(e=>p.factory.createShorthandPropertyAssignment(p.factory.createIdentifier(e.name))),!0)]):p.factory.createIdentifier(`req`)):[]),!0);return c.push(p.factory.createReturnStatement(s?p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createCallExpression(p.factory.createIdentifier(a.name),void 0,[N.toUrlTemplate(e,n),d()]),p.factory.createIdentifier(`then`)),void 0,[p.factory.createArrowFunction([p.factory.createModifier(p.SyntaxKind.AsyncKeyword)],[],[p.factory.createParameterDeclaration(void 0,void 0,p.factory.createIdentifier(`response`))],void 0,p.factory.createToken(p.SyntaxKind.EqualsGreaterThanToken),i?.schema?p.factory.createAsExpression(p.factory.createParenthesizedExpression(p.factory.createAwaitExpression(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`response`),p.factory.createIdentifier(`json`)),void 0,[]))),i?.schema?N.toTypeNode(i.schema):p.factory.createToken(p.SyntaxKind.UnknownKeyword)):p.factory.createParenthesizedExpression(p.factory.createAwaitExpression(p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`response`),p.factory.createIdentifier(`json`)),void 0,[]))))]):p.factory.createCallExpression(p.factory.createIdentifier(a.name),void 0,[N.toUrlTemplate(e,n),d()]))),c}},I=class{doc;constructor(e){this.doc=e}resolvePathRef(e){let t=M.ref2name(e,this.doc);return this.doc.paths?.[t]}isOpenAPIArraySchema(e){return typeof e==`object`&&e.type===`array`}getSchemaByRef(e,t=!1,n=[],r=``){let i=``;if(M.isRef(e)){if(i=M.upperCamelCase(M.ref2name(e.$ref)),t)return{type:r+i};this.doc.definitions||(this.doc.definitions={}),e=this.doc.definitions[M.ref2name(e.$ref,this.doc)]}return this.toBaseSchema(e,n,``,r+i)}toBaseSchema(e,t=[],n=``,r=``){if(!e)return{type:`unknown`};if(M.isRef(e))return this.getSchemaByRef(e,!0);if(this.isOpenAPIArraySchema(e)){let{type:i,description:a,items:o,required:s}=e;return{type:i,required:!!s,description:a,items:this.toBaseSchema(o,t,n,r)}}else{let{required:i=[],allOf:a,anyOf:o,description:s,enum:c,format:l,oneOf:u,properties:d={}}=e,{type:f}=e;if(c&&f!==`boolean`){let a={name:M.upperCamelCase(M.normalize(r))+M.upperCamelCase(M.normalize(n)),enum:[...new Set(c)]},o=M.findSameSchema(a,t);return!o&&M.isValidEnumType(e)&&t.push(a),{type:o?o.name:M.isBooleanEnum(e)?`boolean`:a.name,required:i,description:s}}return f===void 0&&Object.keys(d).length>0&&(f=`object`),{type:f,required:i,description:s,enum:c,format:l,allOf:a?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),anyOf:o?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),oneOf:u?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),properties:Object.keys(d).reduce((e,n)=>{let i=d[n];return{...e,[n]:M.isRef(i)?{type:M.capitalize(M.ref2name(i.$ref,this.doc))}:this.toBaseSchema(i,t,n,r)}},{})}}}getParameterByRef(e,t=[],n=``){if(M.isRef(e)){let t=M.ref2name(e.$ref,this.doc),n=this.doc.parameters?.[t];if(!n)throw Error(`Parameter reference not found: ${e.$ref}`);e=n}let r=e,{name:i,required:a,description:o,type:s,items:c,enum:l,properties:u,schema:d}=r;if(l){let e=M.upperCamelCase(M.normalize(n))+M.upperCamelCase(M.normalize(i)),s={name:e,enum:[...new Set(l)]},c=M.findSameSchema(s,t);return!c&&M.isValidEnumType({type:e,enum:l})&&t.push(s),{name:i,required:a,description:o,in:r.in,schema:{type:c?.name??e}}}return c?{name:i,required:a,description:o,in:r.in,schema:{type:s,items:c}}:d&&M.isRef(d)?{name:i,required:a,description:o,in:r.in,schema:{type:M.capitalize(M.ref2name(d.$ref))}}:{name:i,required:a,description:o,in:r.in,schema:{type:s,properties:u}}}getResponseByRef(e){M.isRef(e)&&(e=this.doc.responses[M.ref2name(e.$ref,this.doc)]);let{schema:t}=e;return[{type:`application/json`,schema:t&&this.getSchemaByRef(t,!0)}]}init(){let{definitions:e={},responses:t={},paths:n={}}=this.doc,r=[],i=Object.keys(e).reduce((t,n)=>{let i=e[n];return{...t,[n]:this.getSchemaByRef(i,!1,r,n)}},{}),a=Object.keys(t).reduce((e,n)=>{let r=t[n];return{...e,[n]:this.getResponseByRef(r)}},{}),o=Object.keys(n).reduce((e,t)=>{let i=n[t]??{};if(i.$ref){let e=this.resolvePathRef(i.$ref);e&&(i=e)}let{parameters:a=[]}=i,o=[];return Object.values(j).forEach(e=>{let t=i[e];if(t){let{deprecated:n,operationId:i,summary:s,description:c,responses:l={}}=t,{parameters:u=[]}=t,d=[...a,...u].map(e=>this.getParameterByRef(e,r)),f=[...new Set(d.map(e=>e.name))];Object.keys(l).length===0&&Object.assign(l,{200:{description:`Successful response`}});let p=d.filter(e=>e.in===`body`||e.in===`formData`),m=d.filter(e=>e.in!==`body`&&e.in!==`formData`),h=Object.keys(l);for(let t of h)if(t in l){let r=l[t],a=this.getResponseByRef(r),u=p&&p.length===1&&p[0].in===`body`&&p[0].name===`body`;o.push({method:e,operationId:i,summary:s,deprecated:n,description:c,parameters:f.map(e=>m.find(t=>t.name===e)).filter(Boolean),responses:a,requestBody:p.length>0?u?[{type:`application/json`,schema:p[0].schema}]:[{type:`application/json`,schema:{type:`object`,properties:p.reduce((e,t)=>({...e,[t.name]:{type:t.schema?.type??`unknown`,required:t.schema?.required,items:t.schema?.items,description:t.schema?.description}}),{})}}]:void 0});break}}}),{...e,[t]:o}},{});return{enums:M.uniqueEnums(r),schemas:i,responses:a,parameters:{},requestBodies:{},apis:o}}},L=class{doc;constructor(e){this.doc=e}resolvePathRef(e){let t=M.ref2name(e,this.doc);return this.doc.paths?.[t]}isOpenAPIArraySchema(e){return typeof e==`object`&&e.type===`array`}getSchemaByRef(e,t=!1,n=[],r=``){let i=``;if(M.isRef(e)){if(i=M.capitalize(M.ref2name(e.$ref)),t)return{type:r+i};let n=this.doc.components?.schemas?.[M.ref2name(e.$ref,this.doc)];if(!n)return{type:`unknown`};e=n}return this.toBaseSchema(e,n,``,r+i)}getParameterByRef(e,t=[],n=``){if(M.isRef(e)){let t=this.doc.components?.parameters?.[M.ref2name(e.$ref,this.doc)];if(!t)return{name:`unknown`,in:`query`};e=t}let{name:r,required:i,deprecated:a,description:o,schema:s}=e;if(s&&!M.isRef(s)&&s.enum){let c=M.upperCamelCase(M.normalize(n))+M.upperCamelCase(M.normalize(r)),l={name:c,enum:[...new Set(s.enum)]},u=M.findSameSchema(l,t);return!u&&M.isValidEnumType(s)&&t.push(l),{name:r,required:i,description:o,deprecated:a,in:e.in,schema:{type:u?.name??c}}}return{name:r,required:i,description:o,deprecated:a,in:e.in,schema:e.schema&&this.getSchemaByRef(e.schema,!1,t,n+M.capitalize(r))}}getResponseByRef(e){if(M.isRef(e)){let t=this.doc.components?.responses?.[M.ref2name(e.$ref,this.doc)];if(!t)return[];e=t}let{content:t={}}=e;return Object.keys(t).map(e=>({type:e,schema:t[e].schema&&this.getSchemaByRef(t[e].schema,!0)}))}getRequestBodyByRef(e,t=[]){if(M.isRef(e)){let t=this.doc.components?.requestBodies?.[M.ref2name(e.$ref,this.doc)];if(!t)return[];e=t}let{content:n={}}=e;return Object.keys(n).map(e=>({type:e,schema:n[e].schema&&this.getSchemaByRef(n[e].schema,!1,t)}))}toBaseSchema(e,t=[],n=``,r=``){if(!e)return{type:`unknown`};if(M.isRef(e))return this.getSchemaByRef(e,!0);if(this.isOpenAPIArraySchema(e)){let{type:i,description:a,items:o,required:s}=e;return{type:i,required:!!s,description:a,items:this.toBaseSchema(o,t,n,r)}}else{let{required:i=[],allOf:a,anyOf:o,description:s,deprecated:c,enum:l,format:u,oneOf:d,properties:f={}}=e,{type:p}=e;if(l&&p!==`boolean`){let a={name:M.upperCamelCase(M.normalize(r))+M.upperCamelCase(M.normalize(n)),enum:[...new Set(l)]},o=M.findSameSchema(a,t);return!o&&M.isValidEnumType(e)&&t.push(a),{type:o?o.name:M.isBooleanEnum(e)?`boolean`:a.name,required:i,description:s,deprecated:c}}return p===void 0&&Object.keys(f).length>0&&(p=`object`),{type:p,required:i,description:s,deprecated:c,enum:l,format:u,allOf:a?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),anyOf:o?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),oneOf:d?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),properties:Object.keys(f).reduce((e,n)=>{let i=f[n];return{...e,[n]:M.isRef(i)?{type:M.capitalize(M.ref2name(i.$ref,this.doc))}:this.toBaseSchema(i,t,n,r)}},{})}}}init(){let{components:e={},paths:t={}}=this.doc,n=[],{requestBodies:r={},responses:i={},parameters:a={},schemas:o={}}=e,s=Object.keys(o).reduce((e,t)=>{let r=o[t];return{...e,[t]:this.getSchemaByRef(r,!1,n,t)}},{}),c=Object.keys(a).reduce((e,t)=>{let r=a[t];return{...e,[t]:this.getParameterByRef(r,n,t)}},{}),l=Object.keys(i).reduce((e,t)=>{let n=i[t];return{...e,[t]:this.getResponseByRef(n)}},{}),u=Object.keys(r).reduce((e,t)=>{let i=r[t];return{...e,[t]:this.getRequestBodyByRef(i,n)}},{}),d=Object.keys(t).reduce((e,r)=>{let i=t[r]??{};if(i.$ref){let e=this.resolvePathRef(i.$ref);e&&(i=e)}let{parameters:a=[],description:o,summary:s}=i,c=[];return Object.values(j).forEach(e=>{let t=i[e];if(t){let{deprecated:r,operationId:i,responses:l={},summary:u,description:d,requestBody:f={content:{}}}=t,{parameters:p=[]}=t,m=[...a,...p].map(e=>this.getParameterByRef(e,n)),h=this.getRequestBodyByRef(f,n),g=[...new Set(m.map(e=>e.name))];Object.keys(l).length===0&&Object.assign(l,{200:{description:`Successful response`}});let _=Object.keys(l);for(let t of _)if(t in l){let n=l[t],a=this.getResponseByRef(n);c.push({method:e,operationId:i,summary:u??s,description:d??o,deprecated:r,parameters:g.map(e=>m.find(t=>t.name===e)).filter(e=>e!==void 0),responses:a,requestBody:h});break}}}),{...e,[r]:c}},{});return{enums:M.uniqueEnums(n),schemas:s,responses:l,parameters:c,requestBodies:u,apis:d}}},R=class{doc;constructor(e){this.doc=e}resolvePathRef(e){let t=M.ref2name(e,this.doc);return this.doc.paths?.[t]}isOpenAPIArraySchema(e){return typeof e==`object`&&e.type===`array`}getSchemaByRef(e,t=!1,n=[],r=``){let i=``;if(M.isRef(e)){if(i=M.upperCamelCase(M.ref2name(e.$ref)),t)return{type:r+i};this.doc.components||(this.doc.components={schemas:{}});let n=this.doc.components.schemas?.[M.ref2name(e.$ref,this.doc)];if(!n)throw Error(`Schema reference not found: ${i}`);e=n}return this.toBaseSchema(e,n,``,r+i)}getParameterByRef(e,t=[],n=``){M.isRef(e)&&(e=this.doc.components?.parameters?.[M.ref2name(e.$ref,this.doc)]);let{name:r,required:i,deprecated:a,description:o,schema:s}=e;if(s&&!M.isRef(s)&&s.enum){let c=M.upperCamelCase(M.normalize(n))+M.upperCamelCase(M.normalize(r)),l={name:c,enum:[...new Set(s.enum)]},u=M.findSameSchema(l,t);return!u&&M.isValidEnumType(s)&&t.push(l),{name:r,required:i,description:o,deprecated:a,in:e.in,schema:{type:u?.name??c}}}return{name:r,required:i,description:o,deprecated:a,in:e.in,schema:e.schema&&this.getSchemaByRef(e.schema,!1,t,n+M.capitalize(r))}}getResponseByRef(e){M.isRef(e)&&(e=this.doc.components?.responses?.[M.ref2name(e.$ref,this.doc)]);let{content:t={}}=e;return Object.keys(t).map(e=>({type:e,schema:t[e].schema&&this.getSchemaByRef(t[e].schema,!0)}))}getRequestBodyByRef(e,t=[]){M.isRef(e)&&(e=this.doc.components?.requestBodies?.[M.ref2name(e.$ref,this.doc)]);let{content:n={}}=e;return Object.keys(n).map(e=>({type:e,schema:n[e].schema&&this.getSchemaByRef(n[e].schema,!0,t)}))}toBaseSchema(e,t=[],n=``,r=``){if(!e)return{type:`unknown`};if(M.isRef(e))return this.getSchemaByRef(e,!0);if(this.isOpenAPIArraySchema(e)){let{type:i,description:a,items:o,required:s}=e;return{type:i,required:!!s,description:a,items:this.toBaseSchema(o,t,n,r)}}else{let{required:i=[],allOf:a,anyOf:o,description:s,deprecated:c,enum:l,format:u,oneOf:d,properties:f={}}=e,{type:p}=e;if(l&&p!==`boolean`){let a={name:M.upperCamelCase(M.normalize(r))+M.upperCamelCase(M.normalize(n)),enum:[...new Set(l)]},o=M.findSameSchema(a,t);return!o&&M.isValidEnumType(e)&&t.push(a),{type:o?o.name:M.isBooleanEnum(e)?`boolean`:a.name,required:i,description:s,deprecated:c}}return p===void 0&&Object.keys(f).length>0&&(p=`object`),{type:p,required:i,description:s,deprecated:c,enum:l,format:u,allOf:a?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),anyOf:o?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),oneOf:d?.map(e=>M.isRef(e)?{...e,ref:e.$ref,type:M.capitalize(M.ref2name(e.$ref,this.doc))}:this.toBaseSchema(e,t)),properties:Object.keys(f).reduce((e,n)=>{let i=f[n];return{...e,[n]:M.isRef(i)?{type:M.capitalize(M.ref2name(i.$ref,this.doc))}:this.toBaseSchema(i,t,n,r)}},{})}}}init(){let{components:e={},paths:t={}}=this.doc,n=[],{requestBodies:r={},responses:i={},parameters:a={},schemas:o={}}=e,s=Object.keys(o).reduce((e,t)=>{let r=o[t];return{...e,[t]:this.getSchemaByRef(r,!1,n,t)}},{}),c=Object.keys(a).reduce((e,t)=>{let r=a[t];return{...e,[t]:this.getParameterByRef(r,n,t)}},{}),l=Object.keys(i).reduce((e,t)=>{let n=i[t];return{...e,[t]:this.getResponseByRef(n)}},{}),u=Object.keys(r).reduce((e,t)=>{let i=r[t];return{...e,[t]:this.getRequestBodyByRef(i,n)}},{}),d=Object.keys(t).reduce((e,r)=>{let i=t[r]??{};if(i.$ref){let e=this.resolvePathRef(i.$ref);e&&(i=e)}let{parameters:a=[],description:o,summary:s}=i,c=[];return Object.values(j).forEach(e=>{let t=i[e];if(t){let{deprecated:r,operationId:i,summary:l,description:u,responses:d={},requestBody:f={content:{}}}=t,{parameters:p=[]}=t,m=[...a,...p].map(e=>this.getParameterByRef(e,n)),h=this.getRequestBodyByRef(f,n),g=[...new Set(m.map(e=>e.name))];Object.keys(d).length===0&&Object.assign(d,{200:{description:`Successful response`}});let _=Object.keys(d);for(let t of _)if(t in d){let n=d[t],a=this.getResponseByRef(n);c.push({method:e,operationId:i,summary:l??s,description:u??o,deprecated:r,parameters:g.map(e=>m.find(t=>t.name===e)).filter(e=>e!==void 0),responses:a,requestBody:h});break}}}),{...e,[r]:c}},{});return{enums:M.uniqueEnums(n),schemas:s,responses:l,parameters:c,requestBodies:u,apis:d}}};const z=(0,d.createScopedLogger)(`OpenAPI`);function B(e){switch((e.openapi||e.swagger).slice(0,3)){case`3.1`:return`v3_1`;case`3.0`:return`v3`;case`2.0`:return`v2`;default:return`unknown`}}var V=class extends ne{parse(e){let t=B(e);switch(z.debug(`openapi version ${t}`),t){case`v2`:return new I(e).init();case`v3`:return new L(e).init();case`v3_1`:return new R(e).init();default:throw Error(`Not a valid OpenAPI version: ${t}`)}}};function H(e){switch(e){case`axios`:return new P;default:return new F}}async function U(e){let t=Date.now(),{verbose:n}=e;n?z.setLevel(`debug`):z.setLevel(`info`),z.info(`Fetch document from ${e.docURL}`);let{enums:r,schemas:i,parameters:a,responses:o,requestBodies:s,apis:c}=new V(e,await M.fetchDoc(e.docURL,e.requestOptions)),l=H(e.adaptor??`fetch`),u=await N.genCode({enums:r,schemas:i,parameters:a,responses:o,requestBodies:s,apis:c},e,l);e.output&&await N.write(u,e.output);let d=Date.now()-t;return{code:u,stats:{endpoints:Object.keys(c).length,schemas:Object.keys(i).length,duration:d}}}const W=e=>`\x1b[36m${e}\x1b[0m`,G=e=>`\x1b[32m${e}\x1b[0m`,K=e=>`\x1b[31m${e}\x1b[0m`,q=e=>`\x1b[34m${e}\x1b[0m`,J=e=>`\x1b[33m${e}\x1b[0m`,Y=e=>`\x1b[35m${e}\x1b[0m`,X=e=>`\x1b[90m${e}\x1b[0m`,Z={banner(e){console.log(W(`
11
+
12
+ β–„β–„β–„ β–ˆβ–ˆβ–“β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–“ β–„β–ˆβ–ˆβ–ˆβ–ˆβ–„ β–’β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–„ β–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–„β–ˆβ–ˆβ–ˆβ–ˆ β–“β–ˆβ–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–„ β–ˆ
13
+ β–’β–ˆβ–ˆβ–ˆβ–ˆβ–„ β–“β–ˆβ–ˆβ–‘ β–ˆβ–ˆβ–’β–“β–ˆβ–ˆβ–’β–’β–ˆβ–ˆβ–€ β–€β–ˆ β–’β–ˆβ–ˆβ–’ β–ˆβ–ˆβ–’β–’β–ˆβ–ˆβ–€ β–ˆβ–ˆβ–Œβ–“β–ˆ β–€ β–ˆβ–ˆβ–’ β–€β–ˆβ–’β–“β–ˆ β–€ β–ˆβ–ˆ β–€β–ˆ β–ˆ
14
+ β–’β–ˆβ–ˆ β–€β–ˆβ–„ β–“β–ˆβ–ˆβ–‘ β–ˆβ–ˆβ–“β–’β–’β–ˆβ–ˆβ–’β–’β–“β–ˆ β–„ β–’β–ˆβ–ˆβ–‘ β–ˆβ–ˆβ–’β–‘β–ˆβ–ˆ β–ˆβ–Œβ–’β–ˆβ–ˆβ–ˆ β–’β–ˆβ–ˆβ–‘β–„β–„β–„β–‘β–’β–ˆβ–ˆβ–ˆ β–“β–ˆβ–ˆ β–€β–ˆ β–ˆβ–ˆβ–’
15
+ β–‘β–ˆβ–ˆβ–„β–„β–„β–„β–ˆβ–ˆ β–’β–ˆβ–ˆβ–„β–ˆβ–“β–’ β–’β–‘β–ˆβ–ˆβ–‘β–’β–“β–“β–„ β–„β–ˆβ–ˆβ–’β–’β–ˆβ–ˆ β–ˆβ–ˆβ–‘β–‘β–“β–ˆβ–„ β–Œβ–’β–“β–ˆ β–„ β–‘β–“β–ˆ β–ˆβ–ˆβ–“β–’β–“β–ˆ β–„ β–“β–ˆβ–ˆβ–’ β–β–Œβ–ˆβ–ˆβ–’
16
+ β–“β–ˆ β–“β–ˆβ–ˆβ–’β–’β–ˆβ–ˆβ–’ β–‘ β–‘β–‘β–ˆβ–ˆβ–‘β–’ β–“β–ˆβ–ˆβ–ˆβ–€ β–‘β–‘ β–ˆβ–ˆβ–ˆβ–ˆβ–“β–’β–‘β–‘β–’β–ˆβ–ˆβ–ˆβ–ˆβ–“ β–‘β–’β–ˆβ–ˆβ–ˆβ–ˆβ–’β–‘β–’β–“β–ˆβ–ˆβ–ˆβ–€β–’β–‘β–’β–ˆβ–ˆβ–ˆβ–ˆβ–’β–’β–ˆβ–ˆβ–‘ β–“β–ˆβ–ˆβ–‘
17
+ β–’β–’ β–“β–’β–ˆβ–‘β–’β–“β–’β–‘ β–‘ β–‘β–‘β–“ β–‘ β–‘β–’ β–’ β–‘β–‘ β–’β–‘β–’β–‘β–’β–‘ β–’β–’β–“ β–’ β–‘β–‘ β–’β–‘ β–‘ β–‘β–’ β–’ β–‘β–‘ β–’β–‘ β–‘β–‘ β–’β–‘ β–’ β–’
18
+ β–’ β–’β–’ β–‘β–‘β–’ β–‘ β–’ β–‘ β–‘ β–’ β–‘ β–’ β–’β–‘ β–‘ β–’ β–’ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘β–‘ β–‘β–‘ β–‘ β–’β–‘
19
+ β–‘ β–’ β–‘β–‘ β–’ β–‘β–‘ β–‘ β–‘ β–‘ β–’ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘
20
+ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘ β–‘
21
+ β–‘ β–‘
22
+
23
+ API Code Generator v${e}
24
+ `))},success(e){console.log(`${G(`βœ“`)} ${e}`)},error(e,t=!1){if(D(e))console.error(`${K(`βœ—`)} ${e.toString(t)}`);else if(e instanceof Error){let n=`Error: ${e.message}`;console.error(`${K(`βœ—`)} ${n}${t&&e.stack?`\n${X(e.stack)}`:``}`)}else console.error(`${K(`βœ—`)} ${String(e)}`)},info(e){console.log(`${q(`β„Ή`)} ${e}`)},warn(e){console.log(`${J(`⚠`)} ${e}`)},loading(e){console.log(`${J(`πŸ”„`)} ${e}`)},watching(e){console.log(`${Y(`⟳`)} ${e}`)},fileChange(e){console.log(`${J(`↓`)} ${e}`)},fileAdd(e){console.log(`${G(`+`)} ${e}`)},shutdown(){console.log(`\n${X(`πŸ‘‹ Shutting down...`)}`)}},Q=g.version;async function re(e){let t=async()=>{try{let{endpoints:t,schemas:n,duration:r}=(await U(e)).stats;Z.success(`Regenerated ${e.output} (${t} endpoints, ${n} schemas) ${r}ms`)}catch(e){Z.error(e,!0)}},n=e.docURL,r=c.default.dirname(c.default.isAbsolute(n)?n:c.default.resolve(process.cwd(),n));return u.default.watch(r,{persistent:!0},async(e,n)=>{n&&(e===`change`||e===`rename`)&&(Z.fileChange(n),await t())})}function ie(e,t){return e.startsWith(`http://`)||e.startsWith(`https://`)?e:e.startsWith(`/`)||e.match(/^[A-Za-z]:/)?`file://${e}`:t?new URL(e,t).href:c.default.resolve(process.cwd(),e)}async function ae(e){if(e.startsWith(`http://`)||e.startsWith(`https://`))return;let t=e.replace(/^file:\/\//,``),n=c.default.isAbsolute(t)?t:c.default.resolve(process.cwd(),t);if(!await u.default.pathExists(n))throw E.specNotFound(n)}function oe(e){return e.startsWith(`http://`)||e.startsWith(`https://`)}const $=(0,l.createCommand)(`apicodegen`);$.name(`apicodegen`).version(Q).description(`API code generation from OpenAPI specifications`).argument(`[spec]`,`URL or path to OpenAPI documentation`).option(`-s, --spec <path>`,`OpenAPI spec file path or URL`).option(`-o, --output <path>`,`Output file path`).option(`-a, --adaptor <type>`,`HTTP client adaptor (fetch|axios)`,`fetch`).option(`-b, --baseURL <url>`,`Base URL for API endpoints`).option(`-c, --config <path>`,`Path to config file`).option(`-w, --watch`,`Watch for file changes and regenerate`).option(`-v, --verbose`,`Enable verbose logging`).option(`--importClientSource <path>`,`Custom client import source path`).action(async(e,t)=>{if(Z.banner(Q),!e&&!t.spec){Z.info(`Usage: apicodegen [options] [spec]`),Z.info(`Run 'apicodegen --help' for full options.`);return}let n={};t.spec&&(n.spec=t.spec),t.output&&(n.output=t.output),t.adaptor&&(n.adaptor=t.adaptor),t.baseURL&&(n.baseURL=t.baseURL),t.verbose&&(n.verbose=t.verbose),t.watch&&(n.watch=t.watch),t.importClientSource&&(n.importClientSource=t.importClientSource),t.config&&(n.configFile=t.config),e&&(n.spec=e);try{let e=await S({cwd:process.cwd(),cliOptions:n});await ae(e.spec);let t=ie(e.spec,e.baseURL),r={...C(e),docURL:t};if(e.watch){Z.watching(`Watching for changes...`);let e=[];if(!t.startsWith(`http`)){let n=t.replace(/^file:\/\//,``),r=c.default.dirname(n);e.push(`${r}/**/*.json`,`${r}/**/*.yaml`,`${r}/**/*.yml`)}let n=await re(r),i=async()=>{Z.shutdown(),n&&await n.close(),process.exit(0)};process.on(`SIGINT`,i),process.on(`SIGTERM`,i)}else{oe(t)&&Z.loading(`Fetching spec from ${t}...`);let{endpoints:n,schemas:i,duration:a}=(await U(r)).stats;Z.success(`Generated ${e.output} (${n} endpoints, ${i} schemas) ${a}ms`)}}catch(e){if(D(e))Z.error(e,t.verbose);else{let n=te(e,{code:`E_GENERATION_FAILED`,message:`An unexpected error occurred`});Z.error(n,t.verbose)}process.exit(1)}}),$.parse();