@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 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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ import { generate } from './generator.js';
3
+ generate(process.cwd()).catch((err) => {
4
+ console.error(err.message);
5
+ process.exit(1);
6
+ });
7
+ //# sourceMappingURL=cli.js.map
@@ -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"}
@@ -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,2 @@
1
+ export declare function generate(cwd: string): Promise<void>;
2
+ //# sourceMappingURL=generator.d.ts.map
@@ -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"}
@@ -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"}
@@ -0,0 +1,3 @@
1
+ import type { OpenAPIV3_1 } from 'openapi-types';
2
+ export declare function parseSpec(inputPath: string): Promise<OpenAPIV3_1.Document>;
3
+ //# sourceMappingURL=parser.d.ts.map
@@ -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,6 @@
1
+ import SwaggerParser from '@apidevtools/swagger-parser';
2
+ export async function parseSpec(inputPath) {
3
+ const api = await SwaggerParser.bundle(inputPath);
4
+ return api;
5
+ }
6
+ //# sourceMappingURL=parser.js.map
@@ -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,3 @@
1
+ import type { GeneratedFile } from './types.js';
2
+ export declare function generateClientConfig(): GeneratedFile;
3
+ //# sourceMappingURL=client-config.d.ts.map
@@ -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,4 @@
1
+ import type { OpenAPIV3_1 } from 'openapi-types';
2
+ import type { GeneratedFile } from './types.js';
3
+ export declare function generateClient(spec: OpenAPIV3_1.Document): GeneratedFile;
4
+ //# sourceMappingURL=client.d.ts.map
@@ -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,7 @@
1
+ import type { OpenAPIV3_1 } from 'openapi-types';
2
+ export interface GeneratedFile {
3
+ filename: string;
4
+ content: string;
5
+ }
6
+ export declare function generateTypes(spec: OpenAPIV3_1.Document): GeneratedFile;
7
+ //# sourceMappingURL=types.d.ts.map
@@ -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
+ }