@7nohe/openapi-react-query-codegen
Version:
OpenAPI React Query Codegen
72 lines (71 loc) • 2.77 kB
JavaScript
import { writeFile } from "node:fs/promises";
import path from "node:path";
import { createClient } from "@hey-api/openapi-ts";
import { buildQueriesOutputPath, buildRequestsOutputPath, formatOptions, } from "./common.mjs";
import { createSource } from "./createSource.mjs";
import { formatOutput, processOutput } from "./format.mjs";
import { print } from "./print.mjs";
export async function generate(options, version) {
const openApiOutputPath = buildRequestsOutputPath(options.output);
const formattedOptions = formatOptions(options);
// Map CLI options to new plugins system
const clientPlugin = formattedOptions.client === "@hey-api/client-axios"
? "@hey-api/client-axios"
: "@hey-api/client-fetch";
const typescriptPlugin = formattedOptions.enums
? {
name: "@hey-api/typescript",
enums: formattedOptions.enums,
}
: "@hey-api/typescript";
const sdkPlugin = formattedOptions.noOperationId
? {
name: "@hey-api/sdk",
// `operationId: false` was deprecated in favor of `operations.nesting`
operations: {
nesting: "id",
},
}
: "@hey-api/sdk";
const plugins = [
clientPlugin,
typescriptPlugin,
sdkPlugin,
];
// Conditionally add schemas plugin
if (!formattedOptions.noSchemas) {
plugins.push(formattedOptions.schemaType
? {
name: "@hey-api/schemas",
type: formattedOptions.schemaType,
}
: "@hey-api/schemas");
}
const config = {
dryRun: false,
input: formattedOptions.input,
output: openApiOutputPath,
plugins,
};
await createClient(config);
// Generate backward-compatible services.gen.ts shim
// client.gen.ts has the `client` instance; sdk.gen.ts has SDK functions
const shimContent = `// This file is auto-generated for backward compatibility\nexport * from './client.gen.js';\nexport * from './sdk.gen.js';\n`;
await writeFile(path.join(openApiOutputPath, "services.gen.ts"), shimContent);
const source = await createSource({
outputPath: openApiOutputPath,
client: formattedOptions.client,
version,
pageParam: formattedOptions.pageParam,
nextPageParam: formattedOptions.nextPageParam,
initialPageParam: formattedOptions.initialPageParam.toString(),
});
await print(source, formattedOptions);
const queriesOutputPath = buildQueriesOutputPath(options.output);
await formatOutput(queriesOutputPath);
await processOutput({
output: queriesOutputPath,
format: formattedOptions.format,
lint: formattedOptions.lint,
});
}