@codewithagents/openapi-gen 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +174 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +7 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +12 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +40 -0
- package/dist/config.js.map +1 -0
- package/dist/generator.d.ts +2 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +30 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.d.ts +3 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +6 -0
- package/dist/parser.js.map +1 -0
- package/dist/plugins/client-config.d.ts +3 -0
- package/dist/plugins/client-config.d.ts.map +1 -0
- package/dist/plugins/client-config.js +41 -0
- package/dist/plugins/client-config.js.map +1 -0
- package/dist/plugins/client.d.ts +4 -0
- package/dist/plugins/client.d.ts.map +1 -0
- package/dist/plugins/client.js +295 -0
- package/dist/plugins/client.js.map +1 -0
- package/dist/plugins/types.d.ts +7 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +173 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/utils/naming.d.ts +10 -0
- package/dist/utils/naming.d.ts.map +1 -0
- package/dist/utils/naming.js +24 -0
- package/dist/utils/naming.js.map +1 -0
- package/package.json +39 -0
package/README.md
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
# @codewithagents/openapi-gen
|
|
2
|
+
|
|
3
|
+
Generate TypeScript models and a native `fetch` client from an OpenAPI 3.1 spec.
|
|
4
|
+
|
|
5
|
+
- **Zero runtime footprint** — generated code uses only `fetch`. No axios, no wrapper libraries.
|
|
6
|
+
- **SSR-ready** — every generated function accepts a per-request config override. No global singleton mutation.
|
|
7
|
+
- **OpenAPI 3.1 only** — `type: ['string', 'null']`, `$ref`, `allOf`, `anyOf`, `oneOf`. No legacy compat.
|
|
8
|
+
- **TypeScript strict mode** — all output passes `strict: true`.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Install
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
pnpm add -D @codewithagents/openapi-gen
|
|
16
|
+
# or
|
|
17
|
+
npm install -D @codewithagents/openapi-gen
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Quick start
|
|
23
|
+
|
|
24
|
+
**1. Create `openapi-gen.config.json` in your project root:**
|
|
25
|
+
|
|
26
|
+
```json
|
|
27
|
+
{
|
|
28
|
+
"input_openapi": "./openapi.json",
|
|
29
|
+
"output": "./src/api"
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**2. Run the generator:**
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npx openapi-gen
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
**3. Three files appear in `./src/api/`:**
|
|
40
|
+
|
|
41
|
+
| File | What it contains |
|
|
42
|
+
|---|---|
|
|
43
|
+
| `models.ts` | TypeScript types for every schema in `components.schemas` |
|
|
44
|
+
| `client-config.ts` | `configureClient()` — call once at startup to set your base URL and auth |
|
|
45
|
+
| `client.ts` | One `async function` per API operation, using native `fetch` |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Generated output
|
|
50
|
+
|
|
51
|
+
Given an OpenAPI spec with a `Task` schema and a `GET /tasks` endpoint, you get:
|
|
52
|
+
|
|
53
|
+
**`models.ts`**
|
|
54
|
+
```typescript
|
|
55
|
+
export interface Task {
|
|
56
|
+
id: string
|
|
57
|
+
title: string
|
|
58
|
+
done?: boolean
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**`client-config.ts`**
|
|
63
|
+
```typescript
|
|
64
|
+
export interface ClientConfig {
|
|
65
|
+
baseUrl: string
|
|
66
|
+
token?: string | (() => string | Promise<string>)
|
|
67
|
+
credentials?: RequestCredentials
|
|
68
|
+
headers?: Record<string, string>
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function configureClient(config: ClientConfig): void { ... }
|
|
72
|
+
export function getConfig(): Readonly<ClientConfig> { ... }
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**`client.ts`**
|
|
76
|
+
```typescript
|
|
77
|
+
export async function getTasks(
|
|
78
|
+
params?: { page?: number; status?: string },
|
|
79
|
+
config?: Partial<ClientConfig> // optional SSR override
|
|
80
|
+
): Promise<Task[]> { ... }
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## Auth configuration
|
|
86
|
+
|
|
87
|
+
### Bearer token (OAuth / JWT)
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
// Startup (e.g. main.ts or App.tsx)
|
|
91
|
+
import { configureClient } from './src/api/client-config'
|
|
92
|
+
|
|
93
|
+
configureClient({
|
|
94
|
+
baseUrl: 'https://api.example.com',
|
|
95
|
+
token: () => getAccessToken(), // sync or async — called per request
|
|
96
|
+
credentials: 'omit',
|
|
97
|
+
})
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Cookie-based auth
|
|
101
|
+
|
|
102
|
+
```typescript
|
|
103
|
+
configureClient({
|
|
104
|
+
baseUrl: 'https://api.example.com',
|
|
105
|
+
credentials: 'include', // sends HttpOnly cookies automatically
|
|
106
|
+
})
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## SSR support (Next.js, Remix, RSC)
|
|
112
|
+
|
|
113
|
+
Every generated function accepts an optional `config` override as its last parameter. This merges with the global config for that single call — no singleton mutation, safe for concurrent server requests.
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
// app/tasks/page.tsx (Next.js Server Component)
|
|
117
|
+
import { getTasks } from '@/api/client'
|
|
118
|
+
import { getServerSession } from 'next-auth'
|
|
119
|
+
|
|
120
|
+
export default async function TasksPage() {
|
|
121
|
+
const session = await getServerSession()
|
|
122
|
+
|
|
123
|
+
const tasks = await getTasks(undefined, {
|
|
124
|
+
baseUrl: process.env.API_URL, // absolute URL required on server
|
|
125
|
+
token: session.accessToken,
|
|
126
|
+
credentials: 'omit',
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
return <TaskList tasks={tasks} />
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
// Client component — uses global config set at startup, no override needed
|
|
135
|
+
const tasks = await getTasks({ page: 1 })
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Config reference
|
|
141
|
+
|
|
142
|
+
`openapi-gen.config.json`:
|
|
143
|
+
|
|
144
|
+
```json
|
|
145
|
+
{
|
|
146
|
+
"input_openapi": "./openapi.json", // required — path to OpenAPI 3.1 spec (JSON or YAML)
|
|
147
|
+
"output": "./src/api" // required — directory for generated files
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Error handling
|
|
154
|
+
|
|
155
|
+
Generated functions throw `ApiError` for non-2xx responses:
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { ApiError } from './src/api/client'
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
const task = await getTaskById('123')
|
|
162
|
+
} catch (err) {
|
|
163
|
+
if (err instanceof ApiError) {
|
|
164
|
+
console.error(err.status, err.body)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Roadmap
|
|
172
|
+
|
|
173
|
+
- **Zod schemas** — optional `input_schema` field: bootstrap a Zod schema from your spec, then customise it. Generated client validates requests before they leave the browser.
|
|
174
|
+
- **`@codewithagents/openapi-gen-react-query`** — separate package generating React Query v5 `queryOptions` + `useMutation` hooks on top of the generated client.
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/dist/cli.js
ADDED
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAU,EAAE,EAAE;IAC3C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface Config {
|
|
2
|
+
/** Path to the OpenAPI 3.1 spec file (JSON or YAML) */
|
|
3
|
+
input_openapi: string;
|
|
4
|
+
/** Path to user-owned Zod schema file (.ts). Optional — bootstrapped on first run if absent. */
|
|
5
|
+
input_schema?: string;
|
|
6
|
+
/** Directory to write generated files */
|
|
7
|
+
output: string;
|
|
8
|
+
/** Base URL prefix for generated fetch client (default: '') */
|
|
9
|
+
baseUrl?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function loadConfig(cwd: string): Promise<Config>;
|
|
12
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,MAAM;IACrB,uDAAuD;IACvD,aAAa,EAAE,MAAM,CAAA;IACrB,gGAAgG;IAChG,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAA;IACd,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyC7D"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export async function loadConfig(cwd) {
|
|
4
|
+
const configPath = join(cwd, 'openapi-gen.config.json');
|
|
5
|
+
let raw;
|
|
6
|
+
try {
|
|
7
|
+
raw = await readFile(configPath, 'utf-8');
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
throw new Error(`Config file not found: ${configPath}`);
|
|
11
|
+
}
|
|
12
|
+
let parsed;
|
|
13
|
+
try {
|
|
14
|
+
parsed = JSON.parse(raw);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
throw new Error(`Config file is not valid JSON: ${configPath}`);
|
|
18
|
+
}
|
|
19
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
20
|
+
throw new Error('Config must be a JSON object');
|
|
21
|
+
}
|
|
22
|
+
const config = parsed;
|
|
23
|
+
if (typeof config['input_openapi'] !== 'string' || !config['input_openapi']) {
|
|
24
|
+
throw new Error('Config missing required field: "input_openapi" (path to OpenAPI 3.1 spec)');
|
|
25
|
+
}
|
|
26
|
+
if (typeof config['output'] !== 'string' || !config['output']) {
|
|
27
|
+
throw new Error('Config missing required field: "output" (output directory)');
|
|
28
|
+
}
|
|
29
|
+
if (config['input_schema'] !== undefined &&
|
|
30
|
+
(typeof config['input_schema'] !== 'string' || !config['input_schema'])) {
|
|
31
|
+
throw new Error('"input_schema" must be a non-empty string path to your Zod schema file');
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
input_openapi: config['input_openapi'],
|
|
35
|
+
input_schema: config['input_schema'],
|
|
36
|
+
output: config['output'],
|
|
37
|
+
baseUrl: typeof config['baseUrl'] === 'string' ? config['baseUrl'] : undefined,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAahC,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAA;IACvD,IAAI,GAAW,CAAA;IACf,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAA;IACzD,CAAC;IAED,IAAI,MAAe,CAAA;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAA;IACjE,CAAC;IAED,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAA;IACjD,CAAC;IAED,MAAM,MAAM,GAAG,MAAiC,CAAA;IAEhD,IAAI,OAAO,MAAM,CAAC,eAAe,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAA;IAC9F,CAAC;IACD,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9D,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;IAC/E,CAAC;IACD,IACE,MAAM,CAAC,cAAc,CAAC,KAAK,SAAS;QACpC,CAAC,OAAO,MAAM,CAAC,cAAc,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,EACvE,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAA;IAC3F,CAAC;IAED,OAAO;QACL,aAAa,EAAE,MAAM,CAAC,eAAe,CAAW;QAChD,YAAY,EAAE,MAAM,CAAC,cAAc,CAAuB;QAC1D,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAW;QAClC,OAAO,EAAE,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;KAC/E,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAQA,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BzD"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { loadConfig } from './config.js';
|
|
4
|
+
import { parseSpec } from './parser.js';
|
|
5
|
+
import { generateTypes } from './plugins/types.js';
|
|
6
|
+
import { generateClientConfig } from './plugins/client-config.js';
|
|
7
|
+
import { generateClient } from './plugins/client.js';
|
|
8
|
+
export async function generate(cwd) {
|
|
9
|
+
console.log('Loading config...');
|
|
10
|
+
const config = await loadConfig(cwd);
|
|
11
|
+
const inputPath = resolve(cwd, config.input_openapi);
|
|
12
|
+
const outputDir = resolve(cwd, config.output);
|
|
13
|
+
console.log(`Parsing spec: ${inputPath}`);
|
|
14
|
+
const spec = await parseSpec(inputPath);
|
|
15
|
+
const generatedFiles = [];
|
|
16
|
+
// Phase 1: always generate types
|
|
17
|
+
generatedFiles.push(generateTypes(spec));
|
|
18
|
+
// Phase 2: always generate client config and fetch client
|
|
19
|
+
generatedFiles.push(generateClientConfig());
|
|
20
|
+
generatedFiles.push(generateClient(spec));
|
|
21
|
+
console.log(`Writing output to: ${outputDir}`);
|
|
22
|
+
await mkdir(outputDir, { recursive: true });
|
|
23
|
+
for (const file of generatedFiles) {
|
|
24
|
+
const filePath = join(outputDir, file.filename);
|
|
25
|
+
await writeFile(filePath, file.content, 'utf-8');
|
|
26
|
+
console.log(` ✓ ${file.filename}`);
|
|
27
|
+
}
|
|
28
|
+
console.log(`Done! Generated ${generatedFiles.length} file(s).`);
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW;IACxC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IAChC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAA;IAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,aAAa,CAAC,CAAA;IACpD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IAE7C,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAA;IACzC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;IAEvC,MAAM,cAAc,GAAG,EAAE,CAAA;IAEzB,iCAAiC;IACjC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAA;IAExC,0DAA0D;IAC1D,cAAc,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC,CAAA;IAC3C,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAA;IAEzC,OAAO,CAAC,GAAG,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAA;IAC9C,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAE3C,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC/C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAChD,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,cAAc,CAAC,MAAM,WAAW,CAAC,CAAA;AAClE,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { Config } from './config.js';
|
|
2
|
+
export { loadConfig } from './config.js';
|
|
3
|
+
export { parseSpec } from './parser.js';
|
|
4
|
+
export type { GeneratedFile } from './plugins/types.js';
|
|
5
|
+
export { generateTypes } from './plugins/types.js';
|
|
6
|
+
export { generateClientConfig } from './plugins/client-config.js';
|
|
7
|
+
export { generateClient } from './plugins/client.js';
|
|
8
|
+
export { generate } from './generator.js';
|
|
9
|
+
export { toTypeName, toPropertyKey } from './utils/naming.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { loadConfig } from './config.js';
|
|
2
|
+
export { parseSpec } from './parser.js';
|
|
3
|
+
export { generateTypes } from './plugins/types.js';
|
|
4
|
+
export { generateClientConfig } from './plugins/client-config.js';
|
|
5
|
+
export { generateClient } from './plugins/client.js';
|
|
6
|
+
export { generate } from './generator.js';
|
|
7
|
+
export { toTypeName, toPropertyKey } from './utils/naming.js';
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA"}
|
package/dist/parser.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAEhD,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,CAGhF"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,6BAA6B,CAAA;AAGvD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IACjD,OAAO,GAA2B,CAAA;AACpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-config.d.ts","sourceRoot":"","sources":["../../src/plugins/client-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAqC/C,wBAAgB,oBAAoB,IAAI,aAAa,CAKpD"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const CLIENT_CONFIG_CONTENT = `// This file is auto-generated by @codewithagents/openapi-gen — do not edit
|
|
2
|
+
|
|
3
|
+
export interface ClientConfig {
|
|
4
|
+
/** Base URL for all API requests (e.g. 'https://api.example.com') */
|
|
5
|
+
baseUrl: string
|
|
6
|
+
/**
|
|
7
|
+
* Bearer token or a function that returns one (supports async refresh).
|
|
8
|
+
* When provided, adds \`Authorization: Bearer <token>\` to every request.
|
|
9
|
+
*/
|
|
10
|
+
token?: string | (() => string | Promise<string>)
|
|
11
|
+
/**
|
|
12
|
+
* Fetch credentials mode. Use 'include' for cookie-based auth.
|
|
13
|
+
* Defaults to 'same-origin'.
|
|
14
|
+
*/
|
|
15
|
+
credentials?: RequestCredentials
|
|
16
|
+
/** Additional headers sent with every request */
|
|
17
|
+
headers?: Record<string, string>
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
let _config: ClientConfig = {
|
|
21
|
+
baseUrl: '',
|
|
22
|
+
credentials: 'same-origin',
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Configure the API client. Call once at app startup before making any requests. */
|
|
26
|
+
export function configureClient(config: ClientConfig): void {
|
|
27
|
+
_config = { ..._config, ...config }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** @internal — used by generated fetch functions */
|
|
31
|
+
export function getConfig(): Readonly<ClientConfig> {
|
|
32
|
+
return _config
|
|
33
|
+
}
|
|
34
|
+
`;
|
|
35
|
+
export function generateClientConfig() {
|
|
36
|
+
return {
|
|
37
|
+
filename: 'client-config.ts',
|
|
38
|
+
content: CLIENT_CONFIG_CONTENT,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=client-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-config.js","sourceRoot":"","sources":["../../src/plugins/client-config.ts"],"names":[],"mappings":"AAEA,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiC7B,CAAA;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,QAAQ,EAAE,kBAAkB;QAC5B,OAAO,EAAE,qBAAqB;KAC/B,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/plugins/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AA6Q/C,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,GAAG,aAAa,CAkFxE"}
|
|
@@ -0,0 +1,295 @@
|
|
|
1
|
+
const SUPPORTED_METHODS = ['get', 'post', 'put', 'patch', 'delete'];
|
|
2
|
+
function refToTypeName(ref) {
|
|
3
|
+
const parts = ref.split('/');
|
|
4
|
+
return parts[parts.length - 1];
|
|
5
|
+
}
|
|
6
|
+
function isRef(obj) {
|
|
7
|
+
return typeof obj === 'object' && obj !== null && '$ref' in obj;
|
|
8
|
+
}
|
|
9
|
+
function resolveSchema(schema) {
|
|
10
|
+
if (isRef(schema)) {
|
|
11
|
+
return { typeName: refToTypeName(schema.$ref), isArray: false };
|
|
12
|
+
}
|
|
13
|
+
const s = schema;
|
|
14
|
+
if (s.type === 'array' && s.items !== undefined) {
|
|
15
|
+
const items = s.items;
|
|
16
|
+
if (isRef(items)) {
|
|
17
|
+
return { typeName: refToTypeName(items.$ref), isArray: true };
|
|
18
|
+
}
|
|
19
|
+
// primitive array — return inline type
|
|
20
|
+
return { typeName: primitiveToTs(items.type), isArray: true };
|
|
21
|
+
}
|
|
22
|
+
return { typeName: 'unknown', isArray: false };
|
|
23
|
+
}
|
|
24
|
+
function primitiveToTs(type) {
|
|
25
|
+
switch (type) {
|
|
26
|
+
case 'string':
|
|
27
|
+
return 'string';
|
|
28
|
+
case 'number':
|
|
29
|
+
case 'integer':
|
|
30
|
+
return 'number';
|
|
31
|
+
case 'boolean':
|
|
32
|
+
return 'boolean';
|
|
33
|
+
default:
|
|
34
|
+
return 'unknown';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function queryParamType(schema) {
|
|
38
|
+
if (schema === undefined)
|
|
39
|
+
return 'string';
|
|
40
|
+
if (isRef(schema))
|
|
41
|
+
return 'string';
|
|
42
|
+
const s = schema;
|
|
43
|
+
if (s.type === 'array')
|
|
44
|
+
return 'string[]';
|
|
45
|
+
return primitiveToTs(s.type);
|
|
46
|
+
}
|
|
47
|
+
/** Convert a path like /api/v1/tasks/{id} to a template literal string with encodeURIComponent calls */
|
|
48
|
+
function pathToUrlExpression(path) {
|
|
49
|
+
// Replace {param} with ${encodeURIComponent(param)}
|
|
50
|
+
return path.replace(/\{([^}]+)\}/g, (_match, paramName) => {
|
|
51
|
+
return `\${encodeURIComponent(${paramName})}`;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function deriveOperationName(method, path) {
|
|
55
|
+
const prefixMap = {
|
|
56
|
+
get: 'get',
|
|
57
|
+
post: 'create',
|
|
58
|
+
put: 'update',
|
|
59
|
+
patch: 'patch',
|
|
60
|
+
delete: 'delete',
|
|
61
|
+
};
|
|
62
|
+
const prefix = prefixMap[method] ?? method;
|
|
63
|
+
// Strip /api/v1/ prefix
|
|
64
|
+
let segments = path.replace(/^\/api\/v\d+\//, '').replace(/^\//, '');
|
|
65
|
+
// Remove path params (e.g., {id}) — keep the segment name for "ById"
|
|
66
|
+
const parts = segments.split('/').map((seg) => {
|
|
67
|
+
if (seg.startsWith('{') && seg.endsWith('}')) {
|
|
68
|
+
const name = seg.slice(1, -1);
|
|
69
|
+
return 'By' + name.charAt(0).toUpperCase() + name.slice(1);
|
|
70
|
+
}
|
|
71
|
+
return seg.charAt(0).toUpperCase() + seg.slice(1);
|
|
72
|
+
});
|
|
73
|
+
const joined = parts.join('');
|
|
74
|
+
return prefix + joined;
|
|
75
|
+
}
|
|
76
|
+
function getReturnType(operation) {
|
|
77
|
+
const responses = operation.responses;
|
|
78
|
+
if (responses === undefined)
|
|
79
|
+
return { typeName: 'unknown', isArray: false, isVoid: false };
|
|
80
|
+
// Check 200 first, then 201
|
|
81
|
+
for (const code of ['200', '201']) {
|
|
82
|
+
const response = responses[code];
|
|
83
|
+
if (response === undefined)
|
|
84
|
+
continue;
|
|
85
|
+
if (isRef(response))
|
|
86
|
+
continue;
|
|
87
|
+
const resp = response;
|
|
88
|
+
const content = resp.content;
|
|
89
|
+
if (content === undefined)
|
|
90
|
+
continue;
|
|
91
|
+
const jsonContent = content['application/json'];
|
|
92
|
+
if (jsonContent === undefined || jsonContent.schema === undefined)
|
|
93
|
+
continue;
|
|
94
|
+
const resolved = resolveSchema(jsonContent.schema);
|
|
95
|
+
return { ...resolved, isVoid: false };
|
|
96
|
+
}
|
|
97
|
+
// Check for 204 (no content) or no successful response
|
|
98
|
+
if (responses['204'] !== undefined || Object.keys(responses).length === 0) {
|
|
99
|
+
return { typeName: 'void', isArray: false, isVoid: true };
|
|
100
|
+
}
|
|
101
|
+
// DELETE with no body response
|
|
102
|
+
return { typeName: 'void', isArray: false, isVoid: true };
|
|
103
|
+
}
|
|
104
|
+
function getPathParams(operation) {
|
|
105
|
+
const params = operation.parameters;
|
|
106
|
+
if (params === undefined)
|
|
107
|
+
return [];
|
|
108
|
+
return params
|
|
109
|
+
.filter((p) => !isRef(p) && p.in === 'path')
|
|
110
|
+
.map((p) => p.name);
|
|
111
|
+
}
|
|
112
|
+
function getQueryParams(operation) {
|
|
113
|
+
const params = operation.parameters;
|
|
114
|
+
if (params === undefined)
|
|
115
|
+
return [];
|
|
116
|
+
return params
|
|
117
|
+
.filter((p) => !isRef(p) && p.in === 'query')
|
|
118
|
+
.map((p) => ({
|
|
119
|
+
name: p.name,
|
|
120
|
+
type: queryParamType(p.schema),
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
123
|
+
function getRequestBodyType(operation) {
|
|
124
|
+
const requestBody = operation.requestBody;
|
|
125
|
+
if (requestBody === undefined)
|
|
126
|
+
return undefined;
|
|
127
|
+
if (isRef(requestBody))
|
|
128
|
+
return undefined;
|
|
129
|
+
const rb = requestBody;
|
|
130
|
+
const content = rb.content;
|
|
131
|
+
if (content === undefined)
|
|
132
|
+
return undefined;
|
|
133
|
+
const jsonContent = content['application/json'];
|
|
134
|
+
if (jsonContent === undefined || jsonContent.schema === undefined)
|
|
135
|
+
return undefined;
|
|
136
|
+
const schema = jsonContent.schema;
|
|
137
|
+
if (isRef(schema))
|
|
138
|
+
return refToTypeName(schema.$ref);
|
|
139
|
+
return 'unknown';
|
|
140
|
+
}
|
|
141
|
+
function generateFunctionCode(funcName, method, path, pathParams, queryParams, bodyTypeName, returnType) {
|
|
142
|
+
const lines = [];
|
|
143
|
+
// Build function signature
|
|
144
|
+
const sigParts = [];
|
|
145
|
+
// Path params first (positional)
|
|
146
|
+
for (const param of pathParams) {
|
|
147
|
+
sigParts.push(`${param}: string`);
|
|
148
|
+
}
|
|
149
|
+
// Body param
|
|
150
|
+
if (bodyTypeName !== undefined) {
|
|
151
|
+
sigParts.push(`body: ${bodyTypeName}`);
|
|
152
|
+
}
|
|
153
|
+
// Query params as optional object
|
|
154
|
+
if (queryParams.length > 0) {
|
|
155
|
+
const qpFields = queryParams.map((qp) => ` ${qp.name}?: ${qp.type}`).join('\n');
|
|
156
|
+
sigParts.push(`params?: {\n${qpFields}\n}`);
|
|
157
|
+
}
|
|
158
|
+
// Per-request config override — enables SSR without mutating the global singleton
|
|
159
|
+
sigParts.push(`config?: Partial<ClientConfig>`);
|
|
160
|
+
const returnTs = returnType.isVoid
|
|
161
|
+
? 'Promise<void>'
|
|
162
|
+
: returnType.isArray
|
|
163
|
+
? `Promise<${returnType.typeName}[]>`
|
|
164
|
+
: `Promise<${returnType.typeName}>`;
|
|
165
|
+
lines.push(`export async function ${funcName}(${sigParts.join(', ')}): ${returnTs} {`);
|
|
166
|
+
lines.push(` const { baseUrl, token, credentials, headers } = { ...getConfig(), ...config }`);
|
|
167
|
+
// Build URL
|
|
168
|
+
const urlExpression = pathToUrlExpression(path);
|
|
169
|
+
const hasPathParams = urlExpression !== path;
|
|
170
|
+
if (hasPathParams) {
|
|
171
|
+
lines.push(` const base = baseUrl ? baseUrl.replace(/\\/$/, '') : ''`);
|
|
172
|
+
lines.push(` const fullUrl = \`\${base}${urlExpression}\``);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
lines.push(` const base = baseUrl ? baseUrl.replace(/\\/$/, '') : ''`);
|
|
176
|
+
lines.push(` const fullUrl = \`\${base}${path}\``);
|
|
177
|
+
}
|
|
178
|
+
// Query params
|
|
179
|
+
if (queryParams.length > 0) {
|
|
180
|
+
lines.push(` const searchParams = new URLSearchParams()`);
|
|
181
|
+
for (const qp of queryParams) {
|
|
182
|
+
if (qp.type === 'number') {
|
|
183
|
+
lines.push(` if (params?.${qp.name} != null) searchParams.set('${qp.name}', String(params.${qp.name}))`);
|
|
184
|
+
}
|
|
185
|
+
else if (qp.type === 'boolean') {
|
|
186
|
+
lines.push(` if (params?.${qp.name} != null) searchParams.set('${qp.name}', String(params.${qp.name}))`);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
lines.push(` if (params?.${qp.name} != null) searchParams.set('${qp.name}', String(params.${qp.name}))`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
lines.push(` const qs = searchParams.toString()`);
|
|
193
|
+
lines.push(` const finalUrl = qs ? \`\${fullUrl}?\${qs}\` : fullUrl`);
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
lines.push(` const finalUrl = fullUrl`);
|
|
197
|
+
}
|
|
198
|
+
// Token resolution
|
|
199
|
+
lines.push(` const resolvedToken = typeof token === 'function' ? await token() : token`);
|
|
200
|
+
// Build fetch headers
|
|
201
|
+
const fetchHeaders = [];
|
|
202
|
+
if (bodyTypeName !== undefined) {
|
|
203
|
+
fetchHeaders.push(` 'Content-Type': 'application/json',`);
|
|
204
|
+
}
|
|
205
|
+
fetchHeaders.push(` ...headers,`);
|
|
206
|
+
fetchHeaders.push(` ...(resolvedToken ? { Authorization: \`Bearer \${resolvedToken}\` } : {}),`);
|
|
207
|
+
// Build fetch options
|
|
208
|
+
const fetchLines = [];
|
|
209
|
+
fetchLines.push(` const res = await fetch(finalUrl, {`);
|
|
210
|
+
fetchLines.push(` method: '${method.toUpperCase()}',`);
|
|
211
|
+
fetchLines.push(` credentials,`);
|
|
212
|
+
fetchLines.push(` headers: {`);
|
|
213
|
+
fetchLines.push(...fetchHeaders);
|
|
214
|
+
fetchLines.push(` },`);
|
|
215
|
+
if (bodyTypeName !== undefined) {
|
|
216
|
+
fetchLines.push(` body: JSON.stringify(body),`);
|
|
217
|
+
}
|
|
218
|
+
fetchLines.push(` })`);
|
|
219
|
+
lines.push(...fetchLines);
|
|
220
|
+
if (returnType.isVoid) {
|
|
221
|
+
lines.push(` if (!res.ok) throw new ApiError(res.status, null)`);
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
lines.push(` if (!res.ok) throw new ApiError(res.status, await res.json().catch(() => null))`);
|
|
225
|
+
lines.push(` return res.json()`);
|
|
226
|
+
}
|
|
227
|
+
lines.push(`}`);
|
|
228
|
+
return lines.join('\n');
|
|
229
|
+
}
|
|
230
|
+
export function generateClient(spec) {
|
|
231
|
+
const paths = spec.paths;
|
|
232
|
+
const collectedTypeNames = new Set();
|
|
233
|
+
const functionBlocks = [];
|
|
234
|
+
if (paths !== undefined) {
|
|
235
|
+
for (const [path, pathItem] of Object.entries(paths)) {
|
|
236
|
+
for (const method of SUPPORTED_METHODS) {
|
|
237
|
+
const operation = pathItem[method];
|
|
238
|
+
if (operation === undefined)
|
|
239
|
+
continue;
|
|
240
|
+
// Derive function name
|
|
241
|
+
let funcName;
|
|
242
|
+
if (operation.operationId !== undefined) {
|
|
243
|
+
const id = operation.operationId;
|
|
244
|
+
funcName = id.charAt(0).toLowerCase() + id.slice(1);
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
funcName = deriveOperationName(method, path);
|
|
248
|
+
}
|
|
249
|
+
const pathParams = getPathParams(operation);
|
|
250
|
+
const queryParams = getQueryParams(operation);
|
|
251
|
+
const bodyTypeName = getRequestBodyType(operation);
|
|
252
|
+
const returnType = getReturnType(operation);
|
|
253
|
+
// Collect type names for import
|
|
254
|
+
if (bodyTypeName !== undefined && bodyTypeName !== 'unknown') {
|
|
255
|
+
collectedTypeNames.add(bodyTypeName);
|
|
256
|
+
}
|
|
257
|
+
if (!returnType.isVoid && returnType.typeName !== 'unknown') {
|
|
258
|
+
collectedTypeNames.add(returnType.typeName);
|
|
259
|
+
}
|
|
260
|
+
const fnCode = generateFunctionCode(funcName, method, path, pathParams, queryParams, bodyTypeName, returnType);
|
|
261
|
+
functionBlocks.push(fnCode);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// Build file content
|
|
266
|
+
const lines = [];
|
|
267
|
+
lines.push('// This file is auto-generated by @codewithagents/openapi-gen — do not edit');
|
|
268
|
+
lines.push('');
|
|
269
|
+
if (collectedTypeNames.size > 0) {
|
|
270
|
+
const sortedTypes = Array.from(collectedTypeNames).sort();
|
|
271
|
+
lines.push(`import type { ${sortedTypes.join(', ')} } from './models'`);
|
|
272
|
+
}
|
|
273
|
+
lines.push(`import { getConfig, type ClientConfig } from './client-config'`);
|
|
274
|
+
lines.push('');
|
|
275
|
+
// ApiError class
|
|
276
|
+
lines.push(`export class ApiError extends Error {`);
|
|
277
|
+
lines.push(` constructor(`);
|
|
278
|
+
lines.push(` public readonly status: number,`);
|
|
279
|
+
lines.push(` public readonly body: unknown,`);
|
|
280
|
+
lines.push(` ) {`);
|
|
281
|
+
lines.push(` super(\`API error \${status}\`)`);
|
|
282
|
+
lines.push(` this.name = 'ApiError'`);
|
|
283
|
+
lines.push(` }`);
|
|
284
|
+
lines.push(`}`);
|
|
285
|
+
for (const fn of functionBlocks) {
|
|
286
|
+
lines.push('');
|
|
287
|
+
lines.push(fn);
|
|
288
|
+
}
|
|
289
|
+
lines.push('');
|
|
290
|
+
return {
|
|
291
|
+
filename: 'client.ts',
|
|
292
|
+
content: lines.join('\n'),
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/plugins/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhD,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AA0LD,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,GAAG,aAAa,CAqBvE"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { toPropertyKey } from '../utils/naming.js';
|
|
2
|
+
function isRef(schema) {
|
|
3
|
+
return '$ref' in schema;
|
|
4
|
+
}
|
|
5
|
+
function refToTypeName(ref) {
|
|
6
|
+
// '#/components/schemas/Foo' -> 'Foo'
|
|
7
|
+
const parts = ref.split('/');
|
|
8
|
+
return parts[parts.length - 1];
|
|
9
|
+
}
|
|
10
|
+
function schemaToTypeString(schema) {
|
|
11
|
+
if (isRef(schema)) {
|
|
12
|
+
return refToTypeName(schema.$ref);
|
|
13
|
+
}
|
|
14
|
+
// Handle nullable via OpenAPI 3.1 array type: type: ['string', 'null']
|
|
15
|
+
if (Array.isArray(schema.type)) {
|
|
16
|
+
const types = schema.type.map((t) => {
|
|
17
|
+
if (t === 'null')
|
|
18
|
+
return 'null';
|
|
19
|
+
return primitiveToTs(t);
|
|
20
|
+
});
|
|
21
|
+
return types.join(' | ');
|
|
22
|
+
}
|
|
23
|
+
// enum
|
|
24
|
+
if (schema.enum !== undefined && schema.enum.length > 0) {
|
|
25
|
+
return schema.enum
|
|
26
|
+
.map((v) => (typeof v === 'string' ? `'${v}'` : String(v)))
|
|
27
|
+
.join(' | ');
|
|
28
|
+
}
|
|
29
|
+
// allOf
|
|
30
|
+
if (schema.allOf !== undefined && schema.allOf.length > 0) {
|
|
31
|
+
return schema.allOf
|
|
32
|
+
.map(schemaToTypeString)
|
|
33
|
+
.join(' & ');
|
|
34
|
+
}
|
|
35
|
+
// anyOf
|
|
36
|
+
if (schema.anyOf !== undefined && schema.anyOf.length > 0) {
|
|
37
|
+
return schema.anyOf
|
|
38
|
+
.map(schemaToTypeString)
|
|
39
|
+
.join(' | ');
|
|
40
|
+
}
|
|
41
|
+
// oneOf
|
|
42
|
+
if (schema.oneOf !== undefined && schema.oneOf.length > 0) {
|
|
43
|
+
return schema.oneOf
|
|
44
|
+
.map(schemaToTypeString)
|
|
45
|
+
.join(' | ');
|
|
46
|
+
}
|
|
47
|
+
const type = schema.type;
|
|
48
|
+
// array
|
|
49
|
+
if (type === 'array') {
|
|
50
|
+
const arraySchema = schema;
|
|
51
|
+
const items = arraySchema.items;
|
|
52
|
+
if (items !== undefined) {
|
|
53
|
+
return `${schemaToTypeString(items)}[]`;
|
|
54
|
+
}
|
|
55
|
+
return 'unknown[]';
|
|
56
|
+
}
|
|
57
|
+
// object
|
|
58
|
+
if (type === 'object') {
|
|
59
|
+
// additionalProperties without explicit properties -> Record
|
|
60
|
+
if (schema.additionalProperties !== undefined &&
|
|
61
|
+
schema.additionalProperties !== false &&
|
|
62
|
+
schema.additionalProperties !== true &&
|
|
63
|
+
(schema.properties === undefined || Object.keys(schema.properties).length === 0)) {
|
|
64
|
+
const valType = schemaToTypeString(schema.additionalProperties);
|
|
65
|
+
return `Record<string, ${valType}>`;
|
|
66
|
+
}
|
|
67
|
+
// inline object with properties
|
|
68
|
+
if (schema.properties !== undefined) {
|
|
69
|
+
return inlineObjectType(schema);
|
|
70
|
+
}
|
|
71
|
+
return 'Record<string, unknown>';
|
|
72
|
+
}
|
|
73
|
+
if (type !== undefined) {
|
|
74
|
+
return primitiveToTs(type);
|
|
75
|
+
}
|
|
76
|
+
return 'unknown';
|
|
77
|
+
}
|
|
78
|
+
function primitiveToTs(type) {
|
|
79
|
+
switch (type) {
|
|
80
|
+
case 'string':
|
|
81
|
+
return 'string';
|
|
82
|
+
case 'number':
|
|
83
|
+
case 'integer':
|
|
84
|
+
return 'number';
|
|
85
|
+
case 'boolean':
|
|
86
|
+
return 'boolean';
|
|
87
|
+
case 'null':
|
|
88
|
+
return 'null';
|
|
89
|
+
default:
|
|
90
|
+
return 'unknown';
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function inlineObjectType(schema) {
|
|
94
|
+
const required = new Set(schema.required ?? []);
|
|
95
|
+
const props = schema.properties;
|
|
96
|
+
if (props === undefined || Object.keys(props).length === 0) {
|
|
97
|
+
return 'Record<string, unknown>';
|
|
98
|
+
}
|
|
99
|
+
const lines = Object.entries(props).map(([key, propSchema]) => {
|
|
100
|
+
const optional = !required.has(key);
|
|
101
|
+
const propKey = toPropertyKey(key);
|
|
102
|
+
const typStr = schemaToTypeString(propSchema);
|
|
103
|
+
return ` ${propKey}${optional ? '?' : ''}: ${typStr}`;
|
|
104
|
+
});
|
|
105
|
+
return `{\n${lines.join('\n')}\n}`;
|
|
106
|
+
}
|
|
107
|
+
function isEnumSchema(schema) {
|
|
108
|
+
return schema.enum !== undefined && schema.enum.length > 0 && schema.type === 'string';
|
|
109
|
+
}
|
|
110
|
+
function isObjectSchema(schema) {
|
|
111
|
+
// Has allOf/anyOf/oneOf - treated as type alias
|
|
112
|
+
if (schema.allOf !== undefined || schema.anyOf !== undefined || schema.oneOf !== undefined) {
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
return schema.type === 'object' || schema.properties !== undefined;
|
|
116
|
+
}
|
|
117
|
+
function generateSchemaDeclaration(name, schema) {
|
|
118
|
+
if (isRef(schema)) {
|
|
119
|
+
return `export type ${name} = ${refToTypeName(schema.$ref)}`;
|
|
120
|
+
}
|
|
121
|
+
if (isEnumSchema(schema)) {
|
|
122
|
+
const union = schema.enum
|
|
123
|
+
.map((v) => (typeof v === 'string' ? `'${v}'` : String(v)))
|
|
124
|
+
.join(' | ');
|
|
125
|
+
return `export type ${name} = ${union}`;
|
|
126
|
+
}
|
|
127
|
+
if (isObjectSchema(schema)) {
|
|
128
|
+
const required = new Set(schema.required ?? []);
|
|
129
|
+
const props = schema.properties;
|
|
130
|
+
// object with additionalProperties (no properties) -> type alias
|
|
131
|
+
if (schema.additionalProperties !== undefined &&
|
|
132
|
+
schema.additionalProperties !== false &&
|
|
133
|
+
schema.additionalProperties !== true &&
|
|
134
|
+
(props === undefined || Object.keys(props).length === 0)) {
|
|
135
|
+
const valType = schemaToTypeString(schema.additionalProperties);
|
|
136
|
+
return `export type ${name} = Record<string, ${valType}>`;
|
|
137
|
+
}
|
|
138
|
+
const propLines = [];
|
|
139
|
+
if (props !== undefined) {
|
|
140
|
+
for (const [key, propSchema] of Object.entries(props)) {
|
|
141
|
+
const optional = !required.has(key);
|
|
142
|
+
const propKey = toPropertyKey(key);
|
|
143
|
+
const typStr = schemaToTypeString(propSchema);
|
|
144
|
+
propLines.push(` ${propKey}${optional ? '?' : ''}: ${typStr}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (propLines.length === 0) {
|
|
148
|
+
return `export type ${name} = Record<string, unknown>`;
|
|
149
|
+
}
|
|
150
|
+
return `export interface ${name} {\n${propLines.join('\n')}\n}`;
|
|
151
|
+
}
|
|
152
|
+
// allOf / anyOf / oneOf or other -> type alias
|
|
153
|
+
const typeStr = schemaToTypeString(schema);
|
|
154
|
+
return `export type ${name} = ${typeStr}`;
|
|
155
|
+
}
|
|
156
|
+
export function generateTypes(spec) {
|
|
157
|
+
const schemas = spec.components?.schemas;
|
|
158
|
+
const lines = [
|
|
159
|
+
'// This file is auto-generated by @codewithagents/openapi-gen — do not edit',
|
|
160
|
+
'',
|
|
161
|
+
];
|
|
162
|
+
if (schemas !== undefined) {
|
|
163
|
+
for (const [name, schema] of Object.entries(schemas)) {
|
|
164
|
+
lines.push(generateSchemaDeclaration(name, schema));
|
|
165
|
+
lines.push('');
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
filename: 'models.ts',
|
|
170
|
+
content: lines.join('\n'),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a string to PascalCase, handling invalid identifier characters.
|
|
3
|
+
*/
|
|
4
|
+
export declare function toTypeName(name: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Return a property key, adding quotes if the name contains special characters
|
|
7
|
+
* that would make it invalid as an unquoted identifier.
|
|
8
|
+
*/
|
|
9
|
+
export declare function toPropertyKey(name: string): string;
|
|
10
|
+
//# sourceMappingURL=naming.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.d.ts","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQlD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert a string to PascalCase, handling invalid identifier characters.
|
|
3
|
+
*/
|
|
4
|
+
export function toTypeName(name) {
|
|
5
|
+
const result = name
|
|
6
|
+
.replace(/[^a-zA-Z0-9]+(.)/g, (_, char) => char.toUpperCase())
|
|
7
|
+
.replace(/^[^a-zA-Z_$]/, '_')
|
|
8
|
+
.replace(/^(.)/, (_, char) => char.toUpperCase());
|
|
9
|
+
return result.length > 0 ? result : '_';
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Return a property key, adding quotes if the name contains special characters
|
|
13
|
+
* that would make it invalid as an unquoted identifier.
|
|
14
|
+
*/
|
|
15
|
+
export function toPropertyKey(name) {
|
|
16
|
+
// Valid JS identifier: starts with letter, underscore, or $, followed by letters, digits, underscore, $
|
|
17
|
+
const isValidIdentifier = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name);
|
|
18
|
+
if (isValidIdentifier) {
|
|
19
|
+
return name;
|
|
20
|
+
}
|
|
21
|
+
// Escape backslashes and quotes, then wrap in quotes
|
|
22
|
+
return `'${name.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naming.js","sourceRoot":"","sources":["../../src/utils/naming.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,MAAM,GAAG,IAAI;SAChB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SACrE,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;IAC3D,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAA;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,wGAAwG;IACxG,MAAM,iBAAiB,GAAG,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACjE,IAAI,iBAAiB,EAAE,CAAC;QACtB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,qDAAqD;IACrD,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAA;AAChE,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@codewithagents/openapi-gen",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Generate TypeScript models, native fetch client and Zod schemas from OpenAPI 3.1 — zero runtime footprint",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"openapi-gen": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist"
|
|
17
|
+
],
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@apidevtools/swagger-parser": "^10.1.1",
|
|
20
|
+
"openapi-types": "^12.1.3"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^22.0.0",
|
|
24
|
+
"@vitest/coverage-v8": "^4.0.0",
|
|
25
|
+
"vitest": "^4.0.0",
|
|
26
|
+
"typescript": "^6.0.0"
|
|
27
|
+
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc -p tsconfig.build.json",
|
|
34
|
+
"lint": "tsc -p tsconfig.build.json --noEmit",
|
|
35
|
+
"test": "vitest run",
|
|
36
|
+
"test:coverage": "vitest run --coverage",
|
|
37
|
+
"dev": "tsc -p tsconfig.build.json --watch"
|
|
38
|
+
}
|
|
39
|
+
}
|