@codewithagents/openapi-react-query 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/CHANGELOG.md +9 -0
- package/CLAUDE.md +26 -0
- package/__fixtures__/specs/task-hooks.json +155 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +131 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/src/config.ts.html +418 -0
- package/coverage/lcov-report/src/index.html +116 -0
- package/coverage/lcov-report/src/plugins/hooks.ts.html +1435 -0
- package/coverage/lcov-report/src/plugins/index.html +116 -0
- package/coverage/lcov.info +484 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +24 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +85 -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 +20 -0
- package/dist/generator.js.map +1 -0
- package/dist/plugins/hooks.d.ts +10 -0
- package/dist/plugins/hooks.d.ts.map +1 -0
- package/dist/plugins/hooks.js +370 -0
- package/dist/plugins/hooks.js.map +1 -0
- package/package.json +33 -0
- package/src/__tests__/config.test.ts +186 -0
- package/src/__tests__/hooks.test.ts +101 -0
- package/src/cli.ts +27 -0
- package/src/config.ts +111 -0
- package/src/generator.ts +20 -0
- package/src/plugins/hooks.ts +450 -0
- package/tsconfig.build.json +10 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +12 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
const FORBIDDEN_OUTPUT_PREFIXES = [
|
|
4
|
+
'/etc', '/usr', '/bin', '/sbin', '/lib', '/lib64',
|
|
5
|
+
'/sys', '/proc', '/dev', '/boot', '/run',
|
|
6
|
+
'C:\\Windows', 'C:\\Program Files',
|
|
7
|
+
];
|
|
8
|
+
const FORBIDDEN_INPUT_PREFIXES = [
|
|
9
|
+
'/etc', '/usr', '/bin', '/sbin', '/lib', '/lib64',
|
|
10
|
+
'/sys', '/proc', '/dev',
|
|
11
|
+
'C:\\Windows', 'C:\\Program Files',
|
|
12
|
+
];
|
|
13
|
+
export function validateConfigPath(configPath) {
|
|
14
|
+
// Must end in .json — prevents accidentally loading non-config files
|
|
15
|
+
if (!configPath.endsWith('.json')) {
|
|
16
|
+
throw new Error(`Config file must be a .json file, got: ${configPath}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export function validateOutputPath(resolvedOutput) {
|
|
20
|
+
const normalized = resolvedOutput.replace(/\\/g, '/');
|
|
21
|
+
for (const forbidden of FORBIDDEN_OUTPUT_PREFIXES) {
|
|
22
|
+
if (normalized.startsWith(forbidden.replace(/\\/g, '/'))) {
|
|
23
|
+
throw new Error(`Output path resolves to a system directory: "${resolvedOutput}". ` +
|
|
24
|
+
`This looks like a misconfiguration — please check your config file.`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function validateInputPath(resolvedInput) {
|
|
29
|
+
const normalized = resolvedInput.replace(/\\/g, '/');
|
|
30
|
+
for (const forbidden of FORBIDDEN_INPUT_PREFIXES) {
|
|
31
|
+
if (normalized.startsWith(forbidden.replace(/\\/g, '/'))) {
|
|
32
|
+
throw new Error(`Input spec path resolves to a system directory: "${resolvedInput}". ` +
|
|
33
|
+
`This looks like a misconfiguration — please check your config file.`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function loadConfig(cwd, configPath) {
|
|
38
|
+
const resolvedConfigPath = configPath ?? join(cwd, 'openapi-react-query.config.json');
|
|
39
|
+
// Security: validate config path extension when explicitly provided
|
|
40
|
+
if (configPath !== undefined) {
|
|
41
|
+
validateConfigPath(configPath);
|
|
42
|
+
}
|
|
43
|
+
let raw;
|
|
44
|
+
try {
|
|
45
|
+
raw = await readFile(resolvedConfigPath, 'utf-8');
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
throw new Error(`Config file not found: ${resolvedConfigPath}`);
|
|
49
|
+
}
|
|
50
|
+
let parsed;
|
|
51
|
+
try {
|
|
52
|
+
parsed = JSON.parse(raw);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new Error(`Config file is not valid JSON: ${resolvedConfigPath}`);
|
|
56
|
+
}
|
|
57
|
+
if (typeof parsed !== 'object' || parsed === null) {
|
|
58
|
+
throw new Error('Config must be a JSON object');
|
|
59
|
+
}
|
|
60
|
+
const config = parsed;
|
|
61
|
+
if (typeof config['input_openapi'] !== 'string' || !config['input_openapi']) {
|
|
62
|
+
throw new Error('Config missing required field: "input_openapi" (path to OpenAPI 3.1 spec)');
|
|
63
|
+
}
|
|
64
|
+
if (typeof config['output'] !== 'string' || !config['output']) {
|
|
65
|
+
throw new Error('Config missing required field: "output" (output directory)');
|
|
66
|
+
}
|
|
67
|
+
if (config['stale_time'] !== undefined && typeof config['stale_time'] !== 'number') {
|
|
68
|
+
throw new Error('"stale_time" must be a number (milliseconds)');
|
|
69
|
+
}
|
|
70
|
+
if (config['gc_time'] !== undefined && typeof config['gc_time'] !== 'number') {
|
|
71
|
+
throw new Error('"gc_time" must be a number (milliseconds)');
|
|
72
|
+
}
|
|
73
|
+
// Security: validate resolved input and output paths
|
|
74
|
+
const resolvedInput = resolve(cwd, config['input_openapi']);
|
|
75
|
+
const resolvedOutput = resolve(cwd, config['output']);
|
|
76
|
+
validateInputPath(resolvedInput);
|
|
77
|
+
validateOutputPath(resolvedOutput);
|
|
78
|
+
return {
|
|
79
|
+
input_openapi: config['input_openapi'],
|
|
80
|
+
output: config['output'],
|
|
81
|
+
stale_time: config['stale_time'],
|
|
82
|
+
gc_time: config['gc_time'],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAMA,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa9E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join, resolve } from 'node:path';
|
|
3
|
+
import { parseSpec } from '@codewithagents/openapi-gen';
|
|
4
|
+
import { loadConfig } from './config.js';
|
|
5
|
+
import { generateHooks } from './plugins/hooks.js';
|
|
6
|
+
export async function generate(cwd, configPath) {
|
|
7
|
+
const config = await loadConfig(cwd, configPath);
|
|
8
|
+
const inputPath = resolve(cwd, config.input_openapi);
|
|
9
|
+
const outputDir = resolve(cwd, config.output);
|
|
10
|
+
const spec = await parseSpec(inputPath);
|
|
11
|
+
const file = generateHooks(spec, {
|
|
12
|
+
staleTime: config.stale_time ?? 0,
|
|
13
|
+
gcTime: config.gc_time ?? 300_000,
|
|
14
|
+
});
|
|
15
|
+
await mkdir(outputDir, { recursive: true });
|
|
16
|
+
const filePath = join(outputDir, file.filename);
|
|
17
|
+
await writeFile(filePath, file.content, 'utf-8');
|
|
18
|
+
console.log(`✓ ${file.filename}`);
|
|
19
|
+
}
|
|
20
|
+
//# 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,SAAS,EAAE,MAAM,6BAA6B,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAElD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,UAAmB;IAC7D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;IAChD,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;IAC7C,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE;QAC/B,SAAS,EAAE,MAAM,CAAC,UAAU,IAAI,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC,OAAO,IAAI,OAAO;KAClC,CAAC,CAAA;IACF,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC/C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;AACnC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OpenAPIV3_1 } from 'openapi-types';
|
|
2
|
+
export interface HookGenOptions {
|
|
3
|
+
staleTime: number;
|
|
4
|
+
gcTime: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function generateHooks(spec: OpenAPIV3_1.Document, options: HookGenOptions): {
|
|
7
|
+
filename: string;
|
|
8
|
+
content: string;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/plugins/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAKhD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AA6QD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,CAAC,QAAQ,EAC1B,OAAO,EAAE,cAAc,GACtB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAyKvC"}
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
// ── Helpers ───────────────────────────────────────────────────────────────────
|
|
2
|
+
function isRef(obj) {
|
|
3
|
+
return typeof obj === 'object' && obj !== null && '$ref' in obj;
|
|
4
|
+
}
|
|
5
|
+
function refToName(ref) {
|
|
6
|
+
const parts = ref.split('/');
|
|
7
|
+
return parts[parts.length - 1];
|
|
8
|
+
}
|
|
9
|
+
function capitalize(s) {
|
|
10
|
+
return s.charAt(0).toUpperCase() + s.slice(1);
|
|
11
|
+
}
|
|
12
|
+
const SUPPORTED_METHODS = ['get', 'post', 'put', 'patch', 'delete'];
|
|
13
|
+
// Mirrors deriveOperationName from openapi-gen/src/plugins/client.ts
|
|
14
|
+
function deriveOperationName(method, path) {
|
|
15
|
+
const prefixMap = {
|
|
16
|
+
get: 'get',
|
|
17
|
+
post: 'create',
|
|
18
|
+
put: 'update',
|
|
19
|
+
patch: 'patch',
|
|
20
|
+
delete: 'delete',
|
|
21
|
+
};
|
|
22
|
+
const prefix = prefixMap[method] ?? method;
|
|
23
|
+
// Strip /api/v1/ prefix
|
|
24
|
+
let segments = path.replace(/^\/api\/v\d+\//, '').replace(/^\//, '');
|
|
25
|
+
const parts = segments.split('/').map((seg) => {
|
|
26
|
+
if (seg.startsWith('{') && seg.endsWith('}')) {
|
|
27
|
+
const name = seg.slice(1, -1);
|
|
28
|
+
return 'By' + name.charAt(0).toUpperCase() + name.slice(1);
|
|
29
|
+
}
|
|
30
|
+
return seg.charAt(0).toUpperCase() + seg.slice(1);
|
|
31
|
+
});
|
|
32
|
+
const joined = parts.join('');
|
|
33
|
+
return prefix + joined;
|
|
34
|
+
}
|
|
35
|
+
function extractPathParams(path) {
|
|
36
|
+
const matches = path.match(/\{([^}]+)\}/g);
|
|
37
|
+
if (matches === null)
|
|
38
|
+
return [];
|
|
39
|
+
return matches.map((m) => m.slice(1, -1));
|
|
40
|
+
}
|
|
41
|
+
/** Extract primary resource name from path (first static segment after stripping API prefix) */
|
|
42
|
+
function primaryResource(path) {
|
|
43
|
+
// Strip /api/v{N}/ prefix or leading /
|
|
44
|
+
const stripped = path.replace(/^\/api\/v\d+\//, '').replace(/^\//, '');
|
|
45
|
+
const firstSegment = stripped.split('/')[0] ?? 'resource';
|
|
46
|
+
// Remove any path param braces if somehow first seg is param
|
|
47
|
+
return firstSegment.replace(/[{}]/g, '');
|
|
48
|
+
}
|
|
49
|
+
/** singularize resource name for key factory naming, e.g. tasks → task */
|
|
50
|
+
function toKeyFactoryName(resource) {
|
|
51
|
+
// simple pluralization removal: trailing 's'
|
|
52
|
+
return resource.endsWith('s') ? resource.slice(0, -1) : resource;
|
|
53
|
+
}
|
|
54
|
+
function getBodyInfo(operation) {
|
|
55
|
+
const requestBody = operation.requestBody;
|
|
56
|
+
if (requestBody === undefined)
|
|
57
|
+
return { hasBody: false, bodyTypeName: undefined };
|
|
58
|
+
if (isRef(requestBody))
|
|
59
|
+
return { hasBody: true, bodyTypeName: undefined };
|
|
60
|
+
const rb = requestBody;
|
|
61
|
+
const content = rb.content;
|
|
62
|
+
if (content === undefined)
|
|
63
|
+
return { hasBody: true, bodyTypeName: undefined };
|
|
64
|
+
// Check multipart first
|
|
65
|
+
if (content['multipart/form-data'] !== undefined) {
|
|
66
|
+
return { hasBody: true, bodyTypeName: undefined };
|
|
67
|
+
}
|
|
68
|
+
const jsonContent = content['application/json'];
|
|
69
|
+
if (jsonContent === undefined || jsonContent.schema === undefined) {
|
|
70
|
+
return { hasBody: true, bodyTypeName: undefined };
|
|
71
|
+
}
|
|
72
|
+
const schema = jsonContent.schema;
|
|
73
|
+
if (isRef(schema)) {
|
|
74
|
+
return { hasBody: true, bodyTypeName: refToName(schema.$ref) };
|
|
75
|
+
}
|
|
76
|
+
// Inline schema
|
|
77
|
+
const s = schema;
|
|
78
|
+
if (s.type === 'object') {
|
|
79
|
+
return { hasBody: true, bodyTypeName: 'Record<string, unknown>' };
|
|
80
|
+
}
|
|
81
|
+
return { hasBody: true, bodyTypeName: undefined };
|
|
82
|
+
}
|
|
83
|
+
function buildKeyFactory(resource, entries) {
|
|
84
|
+
const factoryName = `${toKeyFactoryName(resource)}Keys`;
|
|
85
|
+
const lines = [];
|
|
86
|
+
lines.push(`export const ${factoryName} = {`);
|
|
87
|
+
lines.push(` all: () => ['${resource}'] as const,`);
|
|
88
|
+
for (const entry of entries) {
|
|
89
|
+
if (entry.pathParams.length === 0 && entry.hasQueryParams) {
|
|
90
|
+
// list: (params?) => ['resource', 'list', params]
|
|
91
|
+
lines.push(` ${entry.key}: (params?: Parameters<typeof ${entry.funcName}>[0]) => ['${resource}', '${entry.key}', params] as const,`);
|
|
92
|
+
}
|
|
93
|
+
else if (entry.pathParams.length === 0 && !entry.hasQueryParams) {
|
|
94
|
+
// list with no params
|
|
95
|
+
lines.push(` ${entry.key}: () => ['${resource}', '${entry.key}'] as const,`);
|
|
96
|
+
}
|
|
97
|
+
else if (entry.pathParams.length === 1) {
|
|
98
|
+
// detail: (id: string) => ['resource', id]
|
|
99
|
+
const param = entry.pathParams[0];
|
|
100
|
+
lines.push(` ${entry.key}: (${param}: string) => ['${resource}', ${param}] as const,`);
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// multiple path params
|
|
104
|
+
const paramList = entry.pathParams.map((p) => `${p}: string`).join(', ');
|
|
105
|
+
const paramValues = entry.pathParams.join(', ');
|
|
106
|
+
lines.push(` ${entry.key}: (${paramList}) => ['${resource}', ${paramValues}] as const,`);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
lines.push(`}`);
|
|
110
|
+
return lines.join('\n');
|
|
111
|
+
}
|
|
112
|
+
// ── Query hook generation ──────────────────────────────────────────────────────
|
|
113
|
+
function buildQueryHook(op, keyFactoryName, keyEntry, staleTime, gcTime) {
|
|
114
|
+
const lines = [];
|
|
115
|
+
const hasQueryParams = keyEntry.hasQueryParams;
|
|
116
|
+
const pathParams = op.pathParams;
|
|
117
|
+
// Build parameter list
|
|
118
|
+
const sigParts = [];
|
|
119
|
+
for (const p of pathParams) {
|
|
120
|
+
sigParts.push(`${p}: string`);
|
|
121
|
+
}
|
|
122
|
+
if (hasQueryParams) {
|
|
123
|
+
sigParts.push(`params?: Parameters<typeof ${op.funcName}>[${pathParams.length}]`);
|
|
124
|
+
}
|
|
125
|
+
sigParts.push(`options?: Omit<UseQueryOptions<Awaited<ReturnType<typeof ${op.funcName}>>, ApiError>, 'queryKey' | 'queryFn'>`);
|
|
126
|
+
// Build queryKey call
|
|
127
|
+
let queryKeyCall;
|
|
128
|
+
if (pathParams.length === 0 && hasQueryParams) {
|
|
129
|
+
queryKeyCall = `${keyFactoryName}.${keyEntry.key}(params)`;
|
|
130
|
+
}
|
|
131
|
+
else if (pathParams.length === 0 && !hasQueryParams) {
|
|
132
|
+
queryKeyCall = `${keyFactoryName}.${keyEntry.key}()`;
|
|
133
|
+
}
|
|
134
|
+
else if (pathParams.length === 1 && !hasQueryParams) {
|
|
135
|
+
queryKeyCall = `${keyFactoryName}.${keyEntry.key}(${pathParams[0]})`;
|
|
136
|
+
}
|
|
137
|
+
else if (pathParams.length === 1 && hasQueryParams) {
|
|
138
|
+
// path param + query params
|
|
139
|
+
queryKeyCall = `${keyFactoryName}.${keyEntry.key}(${pathParams[0]}, params)`;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
const paramValues = pathParams.join(', ');
|
|
143
|
+
queryKeyCall = `${keyFactoryName}.${keyEntry.key}(${paramValues})`;
|
|
144
|
+
}
|
|
145
|
+
// Build queryFn call
|
|
146
|
+
let queryFnArgs = [...pathParams];
|
|
147
|
+
if (hasQueryParams)
|
|
148
|
+
queryFnArgs.push('params');
|
|
149
|
+
const queryFnCall = `${op.funcName}(${queryFnArgs.join(', ')})`;
|
|
150
|
+
lines.push(`export function ${op.hookName}(`);
|
|
151
|
+
lines.push(` ${sigParts.join(',\n ')},`);
|
|
152
|
+
lines.push(`) {`);
|
|
153
|
+
lines.push(` return useQuery<Awaited<ReturnType<typeof ${op.funcName}>>, ApiError>({`);
|
|
154
|
+
lines.push(` queryKey: ${queryKeyCall},`);
|
|
155
|
+
lines.push(` queryFn: () => ${queryFnCall},`);
|
|
156
|
+
lines.push(` staleTime: ${staleTime},`);
|
|
157
|
+
lines.push(` gcTime: ${gcTime},`);
|
|
158
|
+
lines.push(` ...options,`);
|
|
159
|
+
lines.push(` })`);
|
|
160
|
+
lines.push(`}`);
|
|
161
|
+
return lines.join('\n');
|
|
162
|
+
}
|
|
163
|
+
// ── Mutation hook generation ───────────────────────────────────────────────────
|
|
164
|
+
function buildMutationHook(op) {
|
|
165
|
+
const lines = [];
|
|
166
|
+
const { funcName, hookName, pathParams, hasBody } = op;
|
|
167
|
+
// Determine variables type and mutationFn
|
|
168
|
+
let variablesType;
|
|
169
|
+
let mutationFnBody;
|
|
170
|
+
if (pathParams.length === 0 && !hasBody) {
|
|
171
|
+
variablesType = 'void';
|
|
172
|
+
mutationFnBody = `() => ${funcName}()`;
|
|
173
|
+
}
|
|
174
|
+
else if (pathParams.length === 0 && hasBody) {
|
|
175
|
+
variablesType = `Parameters<typeof ${funcName}>[0]`;
|
|
176
|
+
mutationFnBody = `(vars) => ${funcName}(vars)`;
|
|
177
|
+
}
|
|
178
|
+
else if (pathParams.length === 1 && !hasBody) {
|
|
179
|
+
variablesType = 'string';
|
|
180
|
+
mutationFnBody = `(${pathParams[0]}) => ${funcName}(${pathParams[0]})`;
|
|
181
|
+
}
|
|
182
|
+
else if (pathParams.length === 1 && hasBody) {
|
|
183
|
+
const param = pathParams[0];
|
|
184
|
+
variablesType = `{ ${param}: string; body: Parameters<typeof ${funcName}>[1] }`;
|
|
185
|
+
mutationFnBody = `({ ${param}, body }) => ${funcName}(${param}, body)`;
|
|
186
|
+
}
|
|
187
|
+
else if (pathParams.length > 1 && !hasBody) {
|
|
188
|
+
const fields = pathParams.map((p) => `${p}: string`).join('; ');
|
|
189
|
+
variablesType = `{ ${fields} }`;
|
|
190
|
+
const destructured = pathParams.join(', ');
|
|
191
|
+
mutationFnBody = `({ ${destructured} }) => ${funcName}(${destructured})`;
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
// multiple path params + body
|
|
195
|
+
const fields = pathParams.map((p) => `${p}: string`).join('; ');
|
|
196
|
+
variablesType = `{ ${fields}; body: Parameters<typeof ${funcName}>[${pathParams.length}] }`;
|
|
197
|
+
const destructured = [...pathParams, 'body'].join(', ');
|
|
198
|
+
mutationFnBody = `({ ${destructured} }) => ${funcName}(${[...pathParams, 'body'].join(', ')})`;
|
|
199
|
+
}
|
|
200
|
+
lines.push(`export function ${hookName}(`);
|
|
201
|
+
lines.push(` options?: Omit<UseMutationOptions<Awaited<ReturnType<typeof ${funcName}>>, ApiError, ${variablesType}>, 'mutationFn'>,`);
|
|
202
|
+
lines.push(`) {`);
|
|
203
|
+
lines.push(` return useMutation<Awaited<ReturnType<typeof ${funcName}>>, ApiError, ${variablesType}>({`);
|
|
204
|
+
lines.push(` mutationFn: ${mutationFnBody},`);
|
|
205
|
+
lines.push(` ...options,`);
|
|
206
|
+
lines.push(` })`);
|
|
207
|
+
lines.push(`}`);
|
|
208
|
+
return lines.join('\n');
|
|
209
|
+
}
|
|
210
|
+
// ── hasQueryParams detection ───────────────────────────────────────────────────
|
|
211
|
+
function operationHasQueryParams(operation) {
|
|
212
|
+
const params = operation.parameters;
|
|
213
|
+
if (params === undefined)
|
|
214
|
+
return false;
|
|
215
|
+
return params.some((p) => {
|
|
216
|
+
if (isRef(p))
|
|
217
|
+
return false;
|
|
218
|
+
const param = p;
|
|
219
|
+
return param.in === 'query';
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
// ── Main generator ─────────────────────────────────────────────────────────────
|
|
223
|
+
export function generateHooks(spec, options) {
|
|
224
|
+
const { staleTime, gcTime } = options;
|
|
225
|
+
const paths = spec.paths;
|
|
226
|
+
// Collect all operations
|
|
227
|
+
const operations = [];
|
|
228
|
+
if (paths !== undefined) {
|
|
229
|
+
for (const [path, pathItem] of Object.entries(paths)) {
|
|
230
|
+
for (const method of SUPPORTED_METHODS) {
|
|
231
|
+
const operation = pathItem[method];
|
|
232
|
+
if (operation === undefined)
|
|
233
|
+
continue;
|
|
234
|
+
let funcName;
|
|
235
|
+
if (operation.operationId !== undefined) {
|
|
236
|
+
const id = operation.operationId;
|
|
237
|
+
funcName = id.charAt(0).toLowerCase() + id.slice(1);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
funcName = deriveOperationName(method, path);
|
|
241
|
+
}
|
|
242
|
+
const hookName = 'use' + capitalize(funcName);
|
|
243
|
+
const pathParams = extractPathParams(path);
|
|
244
|
+
const { hasBody, bodyTypeName } = getBodyInfo(operation);
|
|
245
|
+
operations.push({
|
|
246
|
+
funcName,
|
|
247
|
+
hookName,
|
|
248
|
+
method,
|
|
249
|
+
path,
|
|
250
|
+
pathParams,
|
|
251
|
+
hasBody,
|
|
252
|
+
bodyTypeName,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Separate GET vs mutation operations
|
|
258
|
+
const getOps = operations.filter((op) => op.method === 'get');
|
|
259
|
+
const mutationOps = operations.filter((op) => op.method !== 'get');
|
|
260
|
+
// Group GET ops by resource for key factories
|
|
261
|
+
const resourceToGetOps = new Map();
|
|
262
|
+
for (const op of getOps) {
|
|
263
|
+
const resource = primaryResource(op.path);
|
|
264
|
+
const existing = resourceToGetOps.get(resource) ?? [];
|
|
265
|
+
existing.push(op);
|
|
266
|
+
resourceToGetOps.set(resource, existing);
|
|
267
|
+
}
|
|
268
|
+
// Build key factories and track which key factory + entry each GET op uses
|
|
269
|
+
const opToKeyInfo = new Map();
|
|
270
|
+
const keyFactoryBlocks = [];
|
|
271
|
+
for (const [resource, ops] of resourceToGetOps.entries()) {
|
|
272
|
+
const factoryName = `${toKeyFactoryName(resource)}Keys`;
|
|
273
|
+
// Determine entry keys — list vs detail, or operationId-derived if ambiguous
|
|
274
|
+
const listOps = ops.filter((op) => op.pathParams.length === 0);
|
|
275
|
+
const detailOps = ops.filter((op) => op.pathParams.length > 0);
|
|
276
|
+
const entries = [];
|
|
277
|
+
if (listOps.length === 1) {
|
|
278
|
+
const op = listOps[0];
|
|
279
|
+
const hasQueryParams = operationHasQueryParams(paths[op.path][op.method]);
|
|
280
|
+
const entry = { key: 'list', funcName: op.funcName, pathParams: [], hasQueryParams };
|
|
281
|
+
entries.push(entry);
|
|
282
|
+
opToKeyInfo.set(op.funcName, { factoryName, keyEntry: entry });
|
|
283
|
+
}
|
|
284
|
+
else if (listOps.length > 1) {
|
|
285
|
+
for (const op of listOps) {
|
|
286
|
+
const hasQueryParams = operationHasQueryParams(paths[op.path][op.method]);
|
|
287
|
+
const entry = { key: op.funcName, funcName: op.funcName, pathParams: [], hasQueryParams };
|
|
288
|
+
entries.push(entry);
|
|
289
|
+
opToKeyInfo.set(op.funcName, { factoryName, keyEntry: entry });
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
if (detailOps.length === 1) {
|
|
293
|
+
const op = detailOps[0];
|
|
294
|
+
const hasQueryParams = operationHasQueryParams(paths[op.path][op.method]);
|
|
295
|
+
const entry = { key: 'detail', funcName: op.funcName, pathParams: op.pathParams, hasQueryParams };
|
|
296
|
+
entries.push(entry);
|
|
297
|
+
opToKeyInfo.set(op.funcName, { factoryName, keyEntry: entry });
|
|
298
|
+
}
|
|
299
|
+
else if (detailOps.length > 1) {
|
|
300
|
+
for (const op of detailOps) {
|
|
301
|
+
const hasQueryParams = operationHasQueryParams(paths[op.path][op.method]);
|
|
302
|
+
const entry = { key: op.funcName, funcName: op.funcName, pathParams: op.pathParams, hasQueryParams };
|
|
303
|
+
entries.push(entry);
|
|
304
|
+
opToKeyInfo.set(op.funcName, { factoryName, keyEntry: entry });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
keyFactoryBlocks.push(buildKeyFactory(resource, entries));
|
|
308
|
+
}
|
|
309
|
+
// Build query hooks
|
|
310
|
+
const queryHookBlocks = [];
|
|
311
|
+
for (const op of getOps) {
|
|
312
|
+
const info = opToKeyInfo.get(op.funcName);
|
|
313
|
+
if (info === undefined)
|
|
314
|
+
continue;
|
|
315
|
+
const { factoryName, keyEntry } = info;
|
|
316
|
+
queryHookBlocks.push(buildQueryHook(op, factoryName, keyEntry, staleTime, gcTime));
|
|
317
|
+
}
|
|
318
|
+
// Build mutation hooks
|
|
319
|
+
const mutationHookBlocks = [];
|
|
320
|
+
for (const op of mutationOps) {
|
|
321
|
+
mutationHookBlocks.push(buildMutationHook(op));
|
|
322
|
+
}
|
|
323
|
+
// Determine which react-query exports to import
|
|
324
|
+
const needsUseQuery = getOps.length > 0;
|
|
325
|
+
const needsUseMutation = mutationOps.length > 0;
|
|
326
|
+
const rqImports = [];
|
|
327
|
+
if (needsUseQuery)
|
|
328
|
+
rqImports.push('useQuery', 'type UseQueryOptions');
|
|
329
|
+
if (needsUseMutation)
|
|
330
|
+
rqImports.push('useMutation', 'type UseMutationOptions');
|
|
331
|
+
// Collect all function names for client import
|
|
332
|
+
const allFuncNames = operations.map((op) => op.funcName).sort();
|
|
333
|
+
// Build file content
|
|
334
|
+
const lines = [];
|
|
335
|
+
lines.push('// This file is auto-generated by @codewithagents/openapi-react-query — do not edit');
|
|
336
|
+
lines.push('');
|
|
337
|
+
if (rqImports.length > 0) {
|
|
338
|
+
lines.push(`import { ${rqImports.join(', ')} } from '@tanstack/react-query'`);
|
|
339
|
+
}
|
|
340
|
+
if (allFuncNames.length > 0) {
|
|
341
|
+
lines.push(`import { ${allFuncNames.join(', ')}, type ApiError } from './client.js'`);
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
lines.push(`import { type ApiError } from './client.js'`);
|
|
345
|
+
}
|
|
346
|
+
lines.push('');
|
|
347
|
+
if (keyFactoryBlocks.length > 0) {
|
|
348
|
+
lines.push('// ── Query key factories ──────────────────────────────────────');
|
|
349
|
+
lines.push('');
|
|
350
|
+
lines.push(keyFactoryBlocks.join('\n\n'));
|
|
351
|
+
lines.push('');
|
|
352
|
+
}
|
|
353
|
+
if (queryHookBlocks.length > 0) {
|
|
354
|
+
lines.push('// ── Queries ──────────────────────────────────────────────────');
|
|
355
|
+
lines.push('');
|
|
356
|
+
lines.push(queryHookBlocks.join('\n\n'));
|
|
357
|
+
lines.push('');
|
|
358
|
+
}
|
|
359
|
+
if (mutationHookBlocks.length > 0) {
|
|
360
|
+
lines.push('// ── Mutations ────────────────────────────────────────────────');
|
|
361
|
+
lines.push('');
|
|
362
|
+
lines.push(mutationHookBlocks.join('\n\n'));
|
|
363
|
+
lines.push('');
|
|
364
|
+
}
|
|
365
|
+
return {
|
|
366
|
+
filename: 'hooks.ts',
|
|
367
|
+
content: lines.join('\n'),
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/plugins/hooks.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@codewithagents/openapi-react-query",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Generate typed React Query v5 hooks from OpenAPI 3.1 specs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": { "openapi-react-query": "dist/cli.js" },
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"exports": { ".": "./dist/index.js" },
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc -p tsconfig.build.json && chmod +x dist/cli.js",
|
|
11
|
+
"test": "vitest run",
|
|
12
|
+
"test:coverage": "vitest run --coverage",
|
|
13
|
+
"lint": "tsc -p tsconfig.build.json --noEmit"
|
|
14
|
+
},
|
|
15
|
+
"dependencies": {
|
|
16
|
+
"@codewithagents/openapi-gen": "workspace:*",
|
|
17
|
+
"openapi-types": "^12.1.3"
|
|
18
|
+
},
|
|
19
|
+
"peerDependencies": {
|
|
20
|
+
"@tanstack/react-query": "^5.0.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^22.0.0",
|
|
24
|
+
"@vitest/coverage-v8": "^4.0.0",
|
|
25
|
+
"typescript": "^6.0.0",
|
|
26
|
+
"vitest": "^4.0.0"
|
|
27
|
+
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"repository": { "type": "git", "url": "https://github.com/codewithagents/glue" },
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"access": "public"
|
|
32
|
+
}
|
|
33
|
+
}
|