@moccona/apicodegen 0.0.3 β 0.0.7
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 +320 -25
- package/bin/cli.cjs +23 -0
- package/npm/index.cjs +2156 -2382
- package/npm/index.cjs.map +1 -1
- package/npm/index.d.cts +608 -408
- package/npm/index.d.cts.map +1 -0
- package/npm/index.d.mts +736 -0
- package/npm/index.d.mts.map +1 -0
- package/npm/index.mjs +2137 -0
- package/npm/index.mjs.map +1 -0
- package/npm/vite/index.d.mts +39 -0
- package/npm/vite/index.d.mts.map +1 -0
- package/npm/vite/index.mjs +2049 -0
- package/npm/vite/index.mjs.map +1 -0
- package/package.json +42 -25
- package/bin/cli.js +0 -2248
- package/npm/index.d.ts +0 -536
- package/npm/index.js +0 -2367
- package/npm/index.js.map +0 -1
- package/npm/vite/index.d.ts +0 -29
- package/npm/vite/index.js +0 -2276
- package/npm/vite/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,48 +1,343 @@
|
|
|
1
1
|
# @moccona/apicodegen
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
A powerful OpenAPI code generator that automatically generates TypeScript API client code from OpenAPI specifications.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](https://www.npmjs.com/package/@moccona/apicodegen)
|
|
6
|
+
[](https://opensource.org/licenses/MIT)
|
|
7
|
+
[](https://nodejs.org)
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
## β¨ Features
|
|
8
10
|
|
|
9
|
-
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
89
|
+
### 3. Watch Mode
|
|
22
90
|
|
|
23
|
-
```
|
|
24
|
-
|
|
91
|
+
```bash
|
|
92
|
+
# Watch for file changes and regenerate
|
|
93
|
+
apicodegen ./openapi.yaml -w -o ./src/api.ts
|
|
25
94
|
```
|
|
26
95
|
|
|
27
|
-
|
|
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
|
-
|
|
98
|
+
Automatically integrate code generation into your Vite project:
|
|
35
99
|
|
|
36
|
-
|
|
100
|
+
```typescript
|
|
101
|
+
// vite.config.ts
|
|
102
|
+
import { defineConfig } from 'vite';
|
|
103
|
+
import { apiCodeGenPlugin } from '@moccona/apicodegen/vite';
|
|
37
104
|
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
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
|
-
|
|
339
|
+
Issues and Pull Requests are welcome!
|
|
45
340
|
|
|
46
|
-
|
|
341
|
+
---
|
|
47
342
|
|
|
48
|
-
|
|
343
|
+
Questions or suggestions? Visit [GitHub Issues](https://github.com/freemode1614/api-codegen/issues).
|
package/bin/cli.cjs
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
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.7`,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 ee(){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 v(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 y(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 b(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 x(e){if(!e.spec)throw Error(`Missing required field: spec (OpenAPI spec file path or URL)`);return!0}async function te(e={}){let t=e.cwd||process.cwd(),n=e.cliOptions||{},r=ee(),i={},a;if(e.configFile)a=c.default.resolve(t,e.configFile),i=await v(a);else{let e=await y(t);e&&(a=e,i=await v(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=b({spec:``,output:`./output.ts`},r,s,i,n);x(l);let d=e.name||l.baseURL||l.spec;return{...l,configFilePath:a,name:d}}function S(e){return{docURL:e.spec,output:e.output,adaptor:e.adaptor,baseURL:e.baseURL,importClientSource:e.importClientSource,verbose:e.verbose,requestOptions:e.requestOptions}}const C={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 w=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 T={specNotFound(e,t){return new w({code:C.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 w({code:C.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 w({code:C.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 w({code:C.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 w({code:C.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 w({code:C.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 w({code:C.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 w({code:C.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 w({code:C.VALIDATION_FAILED,message:`Missing required field: ${e}`,path:t,suggestions:[`Add the '${e}' field to your configuration`]})}};function E(e,t){return e instanceof w?e:e instanceof Error?new w({code:t?.code||C.GENERATION_FAILED,message:t?.message||e.message,location:t?.location,suggestions:t?.suggestions,cause:e}):new w({code:t?.code||C.GENERATION_FAILED,message:String(e),suggestions:t?.suggestions})}function D(e){return e instanceof w}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){t=t.trim();let n=t.split(`_`).filter(Boolean);for(;n[0]?.match(/^\d/);)n.shift();return n.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=t.map(e=>e.tag===`returns`?`* @returns {${e.type}} ${e.comment??``}`:e.tag===`param`?e.comment?`* @param ${e.paramName} - ${e.comment}`:`* @param ${e.paramName}`:e.tag?`* @${e.tag} ${e.comment??``}`:`* ${e.comment}`).join(`
|
|
6
|
+
`).trim()+`
|
|
7
|
+
`;(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 schemaToTypeString(t){if(t.type===`array`){let n=t;return n.items?`${e.schemaToTypeString(n.items)}[]`:`unknown`}let n=t;return t.type===`string`?`string`:t.type===`number`||t.type===`integer`?`number`:t.type===`boolean`?`boolean`:t.type===`object`||t.properties?`object`:n.format===`binary`||n.type===`file`||n.format===`blob`?`Blob`:n.ref?n.ref:`unknown`}static generateParamTags(t,n){let r=[];for(let n of t){let t=M.camelCase(M.normalize(n.name)),i=`unknown`;n.schema&&(i=e.schemaToTypeString(n.schema));let a=n.required===!1;r.push({tag:`param`,paramName:t,type:`${i}${a?` | undefined`:``}`,comment:n.description??``})}if(n?.schema&&`properties`in n.schema){let t=n.schema.properties,i=n.schema.required,a=Array.isArray(i)?i:[];for(let[n,i]of Object.entries(t??{})){let t=`req.${n}`,o=e.schemaToTypeString(i),s=!a.includes(n);r.push({tag:`param`,paramName:t,type:`${o}${s?` | undefined`:``}`,comment:i.description??``})}}return r}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`||e.isBinarySchema(i)||i.isRef?p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)):i.type===`array`||i.type===`object`?p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`JSON`),p.factory.createIdentifier(`stringify`)),void 0,[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`||e.isBinarySchema(i)||i.isRef?p.factory.createElementAccessExpression(p.factory.createIdentifier(`req`),p.factory.createStringLiteral(t)):i.type===`array`||i.type===`object`?p.factory.createCallExpression(p.factory.createPropertyAccessExpression(p.factory.createIdentifier(`JSON`),p.factory.createIdentifier(`stringify`)),void 0,[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)),g=[f,u].filter(Boolean).join(`. `);e.addComments(c,[g&&{comment:g},d&&{tag:`deprecated`},...e.generateParamTags(m,a)].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+`
|
|
8
|
+
|
|
9
|
+
`+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)),isRef:!0}: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)),isRef:!0}: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(`
|
|
10
|
+
|
|
11
|
+
βββ ββββββ βββ ββββββ ββββββ βββββββ ββββββ βββββ ββββββ ββββ β
|
|
12
|
+
ββββββ ββββ βββββββββββ ββ ββββ βββββββ βββββ β βββ βββββ β ββ ββ β
|
|
13
|
+
βββ βββ ββββ βββββββββββ β ββββ ββββββ ββββββ ββββββββββββ βββ ββ βββ
|
|
14
|
+
βββββββββ βββββββ βββββββββ βββββββ βββββββ ββββ β βββ ββββββ β ββββ βββββ
|
|
15
|
+
ββ ββββββββ β ββββββ βββββ ββ ββββββββββββββ ββββββββββββββββββββββββββ ββββ
|
|
16
|
+
ββ ββββββββ β βββ β ββ β ββ ββββββ βββ β ββ ββ β ββ β ββ ββ ββ ββ β β
|
|
17
|
+
β ββ βββ β β β β β β β ββ β β β β β β β β β β ββ ββ β ββ
|
|
18
|
+
β β ββ β ββ β β β β β β β β β β β β β β β
|
|
19
|
+
β β β β β β β β β β β β β β
|
|
20
|
+
β β
|
|
21
|
+
|
|
22
|
+
API Code Generator v${e}
|
|
23
|
+
`))},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 T.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 te({cwd:process.cwd(),cliOptions:n});await ae(e.spec);let t=ie(e.spec,e.baseURL),r={...S(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=E(e,{code:`E_GENERATION_FAILED`,message:`An unexpected error occurred`});Z.error(n,t.verbose)}process.exit(1)}}),$.parse();
|