@hey-api/openapi-ts 0.90.9 → 0.91.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/dist/run.cjs DELETED
@@ -1,61 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
-
4
- const require_openApi = require('./openApi-BaGlRfMs.cjs');
5
- const require_src = require('./src-CO2t0IHm.cjs');
6
- let commander = require("commander");
7
-
8
- //#region package.json
9
- var version = "0.90.9";
10
- var bin = { "openapi-ts": "./bin/run.js" };
11
-
12
- //#endregion
13
- //#region src/cli/adapter.ts
14
- const cliToConfig = (cli) => {
15
- const config = {};
16
- if (cli.input) config.input = cli.input;
17
- if (cli.output) config.output = cli.output;
18
- if (cli.file) config.configFile = cli.file;
19
- if (cli.dryRun !== void 0) config.dryRun = cli.dryRun;
20
- const plugins = [];
21
- if (cli.plugins instanceof Array && cli.plugins.length > 0) plugins.push(...cli.plugins);
22
- if (cli.client) plugins.push(cli.client);
23
- if (plugins.length > 0) config.plugins = plugins;
24
- if (cli.debug || cli.silent || cli.logs || cli.logFile !== void 0) config.logs = {
25
- ...cli.logs && { path: cli.logs },
26
- ...cli.debug && { level: "debug" },
27
- ...cli.silent && { level: "silent" },
28
- ...cli.logFile !== void 0 && { file: cli.logFile }
29
- };
30
- if (cli.watch !== void 0) if (typeof cli.watch === "string") config.watch = Number.parseInt(cli.watch, 10);
31
- else config.watch = cli.watch;
32
- return config;
33
- };
34
-
35
- //#endregion
36
- //#region src/cli/index.ts
37
- const binName = Object.keys(bin)[0];
38
- const program = new commander.Command().name(binName).description("Generate TypeScript code from OpenAPI specifications").version(version);
39
- program.option("-i, --input <path...>", "OpenAPI specification (path, URL, or string)").option("-o, --output <path...>", "Output folder(s)").option("-c, --client <name>", "HTTP client to generate").option("-p, --plugins [names...]", "Plugins to use").option("-f, --file <path>", "Path to config file").option("-d, --debug", "Enable debug logging").option("-s, --silent", "Suppress all output").option("-l, --logs <path>", "Logs folder path").option("--no-log-file", "Disable log file output").option("--dry-run", "Skip writing files").option("-w, --watch [interval]", "Watch for changes").action(async (options) => {
40
- if (!(await require_src.createClient(cliToConfig(options)))[0]?.config.input.some((input) => input.watch?.enabled)) process.exit(0);
41
- });
42
- async function runCli() {
43
- try {
44
- await program.parseAsync(process.argv);
45
- } catch (error) {
46
- if (error instanceof commander.CommanderError && "code" in error) {
47
- if (error.code === "commander.optionMissingArgument") console.error(`\nMissing required argument. Run '${binName} --help' for usage.\n`);
48
- else if (error.code === "commander.unknownOption") console.error(`\nUnknown option. Run '${binName} --help' for available options.\n`);
49
- process.exit(error.exitCode);
50
- }
51
- console.error("Unexpected error:", error);
52
- process.exit(1);
53
- }
54
- }
55
-
56
- //#endregion
57
- //#region src/run.ts
58
- runCli();
59
-
60
- //#endregion
61
- //# sourceMappingURL=run.cjs.map
package/dist/run.cjs.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"run.cjs","names":["config: Partial<UserConfig>","plugins: ToArray<UserConfig['plugins']>","pkg.bin","Command","pkg.version","createClient","CommanderError"],"sources":["../package.json","../src/cli/adapter.ts","../src/cli/index.ts","../src/run.ts"],"sourcesContent":["","import type { ToArray } from '@hey-api/types';\n\nimport type { UserConfig } from '~/config/types';\n\nimport type { CliOptions } from './schema';\n\nexport const cliToConfig = (cli: CliOptions): Partial<UserConfig> => {\n const config: Partial<UserConfig> = {};\n\n if (cli.input) config.input = cli.input;\n if (cli.output) config.output = cli.output;\n if (cli.file) config.configFile = cli.file;\n if (cli.dryRun !== undefined) config.dryRun = cli.dryRun;\n\n const plugins: ToArray<UserConfig['plugins']> = [];\n if (cli.plugins instanceof Array && cli.plugins.length > 0) {\n plugins.push(...cli.plugins);\n }\n if (cli.client) plugins.push(cli.client);\n if (plugins.length > 0) config.plugins = plugins;\n\n if (cli.debug || cli.silent || cli.logs || cli.logFile !== undefined) {\n config.logs = {\n ...(cli.logs && { path: cli.logs }),\n ...(cli.debug && { level: 'debug' as const }),\n ...(cli.silent && { level: 'silent' as const }),\n ...(cli.logFile !== undefined && { file: cli.logFile }),\n };\n }\n\n if (cli.watch !== undefined) {\n if (typeof cli.watch === 'string') {\n config.watch = Number.parseInt(cli.watch, 10);\n } else {\n config.watch = cli.watch;\n }\n }\n\n return config;\n};\n","import { Command, CommanderError } from 'commander';\n\nimport { createClient } from '~/index';\n\nimport pkg from '../../package.json' assert { type: 'json' };\nimport { cliToConfig } from './adapter';\n\nconst binName = Object.keys(pkg.bin)[0]!;\n\nconst program = new Command()\n .name(binName)\n .description('Generate TypeScript code from OpenAPI specifications')\n .version(pkg.version);\n\nprogram\n .option(\n '-i, --input <path...>',\n 'OpenAPI specification (path, URL, or string)',\n )\n .option('-o, --output <path...>', 'Output folder(s)')\n .option('-c, --client <name>', 'HTTP client to generate')\n .option('-p, --plugins [names...]', 'Plugins to use')\n .option('-f, --file <path>', 'Path to config file')\n .option('-d, --debug', 'Enable debug logging')\n .option('-s, --silent', 'Suppress all output')\n .option('-l, --logs <path>', 'Logs folder path')\n .option('--no-log-file', 'Disable log file output')\n .option('--dry-run', 'Skip writing files')\n .option('-w, --watch [interval]', 'Watch for changes')\n .action(async (options) => {\n const config = cliToConfig(options);\n\n const context = await createClient(\n config as Parameters<typeof createClient>[0],\n );\n\n const hasActiveWatch = context[0]?.config.input.some(\n (input) => input.watch?.enabled,\n );\n\n if (!hasActiveWatch) {\n process.exit(0);\n }\n });\n\nexport async function runCli(): Promise<void> {\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n if (error instanceof CommanderError && 'code' in error) {\n if (error.code === 'commander.optionMissingArgument') {\n console.error(\n `\\nMissing required argument. Run '${binName} --help' for usage.\\n`,\n );\n } else if (error.code === 'commander.unknownOption') {\n console.error(\n `\\nUnknown option. Run '${binName} --help' for available options.\\n`,\n );\n }\n\n process.exit(error.exitCode);\n }\n\n console.error('Unexpected error:', error);\n process.exit(1);\n }\n}\n","#!/usr/bin/env node\n\nimport { runCli } from '~/cli';\n\nrunCli();\n"],"mappings":";;;;;;;;;;;;;;ACMA,MAAa,eAAe,QAAyC;CACnE,MAAMA,SAA8B,EAAE;AAEtC,KAAI,IAAI,MAAO,QAAO,QAAQ,IAAI;AAClC,KAAI,IAAI,OAAQ,QAAO,SAAS,IAAI;AACpC,KAAI,IAAI,KAAM,QAAO,aAAa,IAAI;AACtC,KAAI,IAAI,WAAW,OAAW,QAAO,SAAS,IAAI;CAElD,MAAMC,UAA0C,EAAE;AAClD,KAAI,IAAI,mBAAmB,SAAS,IAAI,QAAQ,SAAS,EACvD,SAAQ,KAAK,GAAG,IAAI,QAAQ;AAE9B,KAAI,IAAI,OAAQ,SAAQ,KAAK,IAAI,OAAO;AACxC,KAAI,QAAQ,SAAS,EAAG,QAAO,UAAU;AAEzC,KAAI,IAAI,SAAS,IAAI,UAAU,IAAI,QAAQ,IAAI,YAAY,OACzD,QAAO,OAAO;EACZ,GAAI,IAAI,QAAQ,EAAE,MAAM,IAAI,MAAM;EAClC,GAAI,IAAI,SAAS,EAAE,OAAO,SAAkB;EAC5C,GAAI,IAAI,UAAU,EAAE,OAAO,UAAmB;EAC9C,GAAI,IAAI,YAAY,UAAa,EAAE,MAAM,IAAI,SAAS;EACvD;AAGH,KAAI,IAAI,UAAU,OAChB,KAAI,OAAO,IAAI,UAAU,SACvB,QAAO,QAAQ,OAAO,SAAS,IAAI,OAAO,GAAG;KAE7C,QAAO,QAAQ,IAAI;AAIvB,QAAO;;;;;AC/BT,MAAM,UAAU,OAAO,KAAKC,IAAQ,CAAC;AAErC,MAAM,UAAU,IAAIC,mBAAS,CAC1B,KAAK,QAAQ,CACb,YAAY,uDAAuD,CACnE,QAAQC,QAAY;AAEvB,QACG,OACC,yBACA,+CACD,CACA,OAAO,0BAA0B,mBAAmB,CACpD,OAAO,uBAAuB,0BAA0B,CACxD,OAAO,4BAA4B,iBAAiB,CACpD,OAAO,qBAAqB,sBAAsB,CAClD,OAAO,eAAe,uBAAuB,CAC7C,OAAO,gBAAgB,sBAAsB,CAC7C,OAAO,qBAAqB,mBAAmB,CAC/C,OAAO,iBAAiB,0BAA0B,CAClD,OAAO,aAAa,qBAAqB,CACzC,OAAO,0BAA0B,oBAAoB,CACrD,OAAO,OAAO,YAAY;AAWzB,KAAI,EARY,MAAMC,yBAFP,YAAY,QAAQ,CAIlC,EAE8B,IAAI,OAAO,MAAM,MAC7C,UAAU,MAAM,OAAO,QACzB,CAGC,SAAQ,KAAK,EAAE;EAEjB;AAEJ,eAAsB,SAAwB;AAC5C,KAAI;AACF,QAAM,QAAQ,WAAW,QAAQ,KAAK;UAC/B,OAAO;AACd,MAAI,iBAAiBC,4BAAkB,UAAU,OAAO;AACtD,OAAI,MAAM,SAAS,kCACjB,SAAQ,MACN,qCAAqC,QAAQ,uBAC9C;YACQ,MAAM,SAAS,0BACxB,SAAQ,MACN,0BAA0B,QAAQ,mCACnC;AAGH,WAAQ,KAAK,MAAM,SAAS;;AAG9B,UAAQ,MAAM,qBAAqB,MAAM;AACzC,UAAQ,KAAK,EAAE;;;;;;AC5DnB,QAAQ"}
package/dist/run.d.cts DELETED
@@ -1,2 +0,0 @@
1
-
2
- export { };
@@ -1,476 +0,0 @@
1
-
2
- const require_openApi = require('./openApi-BaGlRfMs.cjs');
3
- let _hey_api_codegen_core = require("@hey-api/codegen-core");
4
- let ansi_colors = require("ansi-colors");
5
- ansi_colors = require_openApi.__toESM(ansi_colors);
6
- let color_support = require("color-support");
7
- color_support = require_openApi.__toESM(color_support);
8
- let node_fs = require("node:fs");
9
- node_fs = require_openApi.__toESM(node_fs);
10
- let node_path = require("node:path");
11
- node_path = require_openApi.__toESM(node_path);
12
- let _hey_api_json_schema_ref_parser = require("@hey-api/json-schema-ref-parser");
13
-
14
- //#region src/config/engine.ts
15
- const checkNodeVersion = () => {
16
- if (typeof Bun !== "undefined") {
17
- const [major] = Bun.version.split(".").map(Number);
18
- if (major < 1) throw new require_openApi.ConfigError(`Unsupported Bun version ${Bun.version}. Please use Bun 1.0.0 or newer.`);
19
- } else if (typeof process !== "undefined" && process.versions?.node) {
20
- const [major] = process.versions.node.split(".").map(Number);
21
- if (major < 20) throw new require_openApi.ConfigError(`Unsupported Node version ${process.versions.node}. Please use Node 20 or newer.`);
22
- }
23
- };
24
-
25
- //#endregion
26
- //#region src/ir/intents.ts
27
- var IntentContext = class {
28
- spec;
29
- constructor(spec) {
30
- this.spec = spec;
31
- }
32
- getOperation(path$2, method) {
33
- const paths = this.spec.paths;
34
- if (!paths) return;
35
- return paths[path$2]?.[method];
36
- }
37
- setExample(operation, example) {
38
- const source = this.getOperation(operation.path, operation.method);
39
- if (!source) return;
40
- source["x-codeSamples"] ||= [];
41
- source["x-codeSamples"].push(example);
42
- }
43
- };
44
-
45
- //#endregion
46
- //#region src/generate/output.ts
47
- const generateOutput = async ({ context }) => {
48
- const outputPath = node_path.default.resolve(context.config.output.path);
49
- if (context.config.output.clean) {
50
- if (node_fs.default.existsSync(outputPath)) node_fs.default.rmSync(outputPath, {
51
- force: true,
52
- recursive: true
53
- });
54
- }
55
- const client = require_openApi.getClientPlugin(context.config);
56
- if ("bundle" in client.config && client.config.bundle && !context.config.dryRun) context.config._FRAGILE_CLIENT_BUNDLE_RENAMED = require_openApi.generateClientBundle({
57
- meta: { importFileExtension: context.config.output.importFileExtension },
58
- outputPath,
59
- plugin: client,
60
- project: context.gen
61
- });
62
- for (const plugin of context.registerPlugins()) await plugin.run();
63
- context.gen.plan();
64
- const ctx = new IntentContext(context.spec);
65
- for (const intent of context.intents) await intent.run(ctx);
66
- for (const file of context.gen.render()) {
67
- const filePath = node_path.default.resolve(outputPath, file.path);
68
- const dir = node_path.default.dirname(filePath);
69
- if (!context.config.dryRun) {
70
- node_fs.default.mkdirSync(dir, { recursive: true });
71
- node_fs.default.writeFileSync(filePath, file.content, { encoding: "utf8" });
72
- }
73
- }
74
- const { source } = context.config.output;
75
- if (source.enabled) {
76
- const sourcePath = source.path === null ? void 0 : node_path.default.resolve(outputPath, source.path);
77
- if (!context.config.dryRun && sourcePath && sourcePath !== outputPath) node_fs.default.mkdirSync(sourcePath, { recursive: true });
78
- const serialized = await source.serialize(context.spec);
79
- if (!context.config.dryRun && sourcePath) node_fs.default.writeFileSync(node_path.default.resolve(sourcePath, `${source.fileName}.${source.extension}`), serialized, { encoding: "utf8" });
80
- if (source.callback) await source.callback(serialized);
81
- }
82
- };
83
-
84
- //#endregion
85
- //#region src/openApi/shared/utils/patch.ts
86
- const patchOpenApiSpec = ({ patchOptions, spec: _spec }) => {
87
- if (!patchOptions) return;
88
- const spec = _spec;
89
- if ("swagger" in spec) {
90
- if (patchOptions.version && spec.swagger) spec.swagger = typeof patchOptions.version === "string" ? patchOptions.version : patchOptions.version(spec.swagger);
91
- if (patchOptions.meta && spec.info) patchOptions.meta(spec.info);
92
- if (patchOptions.schemas && spec.definitions) for (const key in patchOptions.schemas) {
93
- const schema = spec.definitions[key];
94
- if (!schema || typeof schema !== "object") continue;
95
- const patchFn = patchOptions.schemas[key];
96
- patchFn(schema);
97
- }
98
- if (patchOptions.operations && spec.paths) for (const key in patchOptions.operations) {
99
- const [method, path$2] = key.split(" ");
100
- if (!method || !path$2) continue;
101
- const pathItem = spec.paths[path$2];
102
- if (!pathItem) continue;
103
- const operation = pathItem[method.toLocaleLowerCase()] || pathItem[method.toLocaleUpperCase()];
104
- if (!operation || typeof operation !== "object") continue;
105
- const patchFn = patchOptions.operations[key];
106
- patchFn(operation);
107
- }
108
- return;
109
- }
110
- if (patchOptions.version && spec.openapi) spec.openapi = typeof patchOptions.version === "string" ? patchOptions.version : patchOptions.version(spec.openapi);
111
- if (patchOptions.meta && spec.info) patchOptions.meta(spec.info);
112
- if (spec.components) {
113
- if (patchOptions.schemas && spec.components.schemas) for (const key in patchOptions.schemas) {
114
- const schema = spec.components.schemas[key];
115
- if (!schema || typeof schema !== "object") continue;
116
- const patchFn = patchOptions.schemas[key];
117
- patchFn(schema);
118
- }
119
- if (patchOptions.parameters && spec.components.parameters) for (const key in patchOptions.parameters) {
120
- const schema = spec.components.parameters[key];
121
- if (!schema || typeof schema !== "object") continue;
122
- const patchFn = patchOptions.parameters[key];
123
- patchFn(schema);
124
- }
125
- if (patchOptions.requestBodies && spec.components.requestBodies) for (const key in patchOptions.requestBodies) {
126
- const schema = spec.components.requestBodies[key];
127
- if (!schema || typeof schema !== "object") continue;
128
- const patchFn = patchOptions.requestBodies[key];
129
- patchFn(schema);
130
- }
131
- if (patchOptions.responses && spec.components.responses) for (const key in patchOptions.responses) {
132
- const schema = spec.components.responses[key];
133
- if (!schema || typeof schema !== "object") continue;
134
- const patchFn = patchOptions.responses[key];
135
- patchFn(schema);
136
- }
137
- }
138
- if (patchOptions.operations && spec.paths) for (const key in patchOptions.operations) {
139
- const [method, path$2] = key.split(" ");
140
- if (!method || !path$2) continue;
141
- const pathItem = spec.paths[path$2];
142
- if (!pathItem) continue;
143
- const operation = pathItem[method.toLocaleLowerCase()] || pathItem[method.toLocaleUpperCase()];
144
- if (!operation || typeof operation !== "object") continue;
145
- const patchFn = patchOptions.operations[key];
146
- patchFn(operation);
147
- }
148
- };
149
-
150
- //#endregion
151
- //#region src/createClient.ts
152
- const compileInputPath = (input) => {
153
- const result = {
154
- ...input,
155
- path: ""
156
- };
157
- if (input.path && (typeof input.path !== "string" || input.registry !== "hey-api")) {
158
- result.path = input.path;
159
- return result;
160
- }
161
- const [basePath, baseQuery] = input.path.split("?");
162
- const queryPath = (baseQuery || "").split("&").map((part) => part.split("="));
163
- let path$2 = basePath || "";
164
- if (path$2.endsWith("/")) path$2 = path$2.slice(0, path$2.length - 1);
165
- const [, pathUrl] = path$2.split("://");
166
- const [baseUrl, organization, project] = (pathUrl || "").split("/");
167
- result.organization = organization || input.organization;
168
- result.project = project || input.project;
169
- const queryParams = [];
170
- const kApiKey = "api_key";
171
- result.api_key = queryPath.find(([key]) => key === kApiKey)?.[1] || input.api_key || process.env.HEY_API_TOKEN;
172
- if (result.api_key) queryParams.push(`${kApiKey}=${result.api_key}`);
173
- const kBranch = "branch";
174
- result.branch = queryPath.find(([key]) => key === kBranch)?.[1] || input.branch;
175
- if (result.branch) queryParams.push(`${kBranch}=${result.branch}`);
176
- const kCommitSha = "commit_sha";
177
- result.commit_sha = queryPath.find(([key]) => key === kCommitSha)?.[1] || input.commit_sha;
178
- if (result.commit_sha) queryParams.push(`${kCommitSha}=${result.commit_sha}`);
179
- const kTags = "tags";
180
- result.tags = queryPath.find(([key]) => key === kTags)?.[1]?.split(",") || input.tags;
181
- if (result.tags?.length) queryParams.push(`${kTags}=${result.tags.join(",")}`);
182
- const kVersion = "version";
183
- result.version = queryPath.find(([key]) => key === kVersion)?.[1] || input.version;
184
- if (result.version) queryParams.push(`${kVersion}=${result.version}`);
185
- if (!result.organization) throw new Error("missing organization - from which Hey API Platform organization do you want to generate your output?");
186
- if (!result.project) throw new Error("missing project - from which Hey API Platform project do you want to generate your output?");
187
- const query = queryParams.join("&");
188
- const platformUrl = baseUrl || "get.heyapi.dev";
189
- const isLocalhost = platformUrl.startsWith("localhost");
190
- const platformUrlWithProtocol = [isLocalhost ? "http" : "https", platformUrl].join("://");
191
- const compiledPath = isLocalhost ? [
192
- platformUrlWithProtocol,
193
- "v1",
194
- "get",
195
- result.organization,
196
- result.project
197
- ].join("/") : [
198
- platformUrlWithProtocol,
199
- result.organization,
200
- result.project
201
- ].join("/");
202
- result.path = query ? `${compiledPath}?${query}` : compiledPath;
203
- return result;
204
- };
205
- const logInputPaths = (inputPaths, jobIndex) => {
206
- const lines = [];
207
- const jobPrefix = ansi_colors.default.gray(`[Job ${jobIndex + 1}] `);
208
- const count = inputPaths.length;
209
- const baseString = ansi_colors.default.cyan(`Generating from ${count} ${count === 1 ? "input" : "inputs"}:`);
210
- lines.push(`${jobPrefix}⏳ ${baseString}`);
211
- inputPaths.forEach((inputPath, index) => {
212
- const itemPrefixStr = ` [${index + 1}] `;
213
- const itemPrefix = ansi_colors.default.cyan(itemPrefixStr);
214
- const detailIndent = " ".repeat(itemPrefixStr.length);
215
- if (typeof inputPath.path !== "string") {
216
- lines.push(`${jobPrefix}${itemPrefix}raw OpenAPI specification`);
217
- return;
218
- }
219
- switch (inputPath.registry) {
220
- case "hey-api": {
221
- const baseInput = [inputPath.organization, inputPath.project].filter(Boolean).join("/");
222
- lines.push(`${jobPrefix}${itemPrefix}${baseInput}`);
223
- if (inputPath.branch) lines.push(`${jobPrefix}${detailIndent}${ansi_colors.default.gray("branch:")} ${ansi_colors.default.green(inputPath.branch)}`);
224
- if (inputPath.commit_sha) lines.push(`${jobPrefix}${detailIndent}${ansi_colors.default.gray("commit:")} ${ansi_colors.default.green(inputPath.commit_sha)}`);
225
- if (inputPath.tags?.length) lines.push(`${jobPrefix}${detailIndent}${ansi_colors.default.gray("tags:")} ${ansi_colors.default.green(inputPath.tags.join(", "))}`);
226
- if (inputPath.version) lines.push(`${jobPrefix}${detailIndent}${ansi_colors.default.gray("version:")} ${ansi_colors.default.green(inputPath.version)}`);
227
- lines.push(`${jobPrefix}${detailIndent}${ansi_colors.default.gray("registry:")} ${ansi_colors.default.green("Hey API")}`);
228
- break;
229
- }
230
- case "readme": {
231
- const baseInput = [inputPath.organization, inputPath.project].filter(Boolean).join("/");
232
- if (!baseInput) lines.push(`${jobPrefix}${itemPrefix}${inputPath.path}`);
233
- else lines.push(`${jobPrefix}${itemPrefix}${baseInput}`);
234
- if (inputPath.uuid) lines.push(`${jobPrefix}${detailIndent}${ansi_colors.default.gray("uuid:")} ${ansi_colors.default.green(inputPath.uuid)}`);
235
- lines.push(`${jobPrefix}${detailIndent}${ansi_colors.default.gray("registry:")} ${ansi_colors.default.green("ReadMe")}`);
236
- break;
237
- }
238
- case "scalar": {
239
- const baseInput = [inputPath.organization, inputPath.project].filter(Boolean).join("/");
240
- lines.push(`${jobPrefix}${itemPrefix}${baseInput}`);
241
- lines.push(`${jobPrefix}${detailIndent}${ansi_colors.default.gray("registry:")} ${ansi_colors.default.green("Scalar")}`);
242
- break;
243
- }
244
- default:
245
- lines.push(`${jobPrefix}${itemPrefix}${inputPath.path}`);
246
- break;
247
- }
248
- });
249
- for (const line of lines) console.log(line);
250
- };
251
- const createClient$1 = async ({ config, dependencies, jobIndex, logger, watches: _watches }) => {
252
- const watches = _watches || Array.from({ length: config.input.length }, () => ({ headers: new Headers() }));
253
- const inputPaths = config.input.map((input) => compileInputPath(input));
254
- if (config.logs.level !== "silent" && !_watches) logInputPaths(inputPaths, jobIndex);
255
- const getSpecData = async (input, index) => {
256
- const eventSpec = logger.timeEvent("spec");
257
- const { arrayBuffer, error, resolvedInput, response } = await require_openApi.getSpec({
258
- fetchOptions: input.fetch,
259
- inputPath: inputPaths[index].path,
260
- timeout: input.watch.timeout,
261
- watch: watches[index]
262
- });
263
- eventSpec.timeEnd();
264
- if (error && !_watches) throw new Error(`Request failed with status ${response.status}: ${response.statusText}`);
265
- return {
266
- arrayBuffer,
267
- resolvedInput
268
- };
269
- };
270
- const specData = (await Promise.all(config.input.map((input, index) => getSpecData(input, index)))).filter((data) => data.arrayBuffer || data.resolvedInput);
271
- let context;
272
- if (specData.length) {
273
- const refParser = new _hey_api_json_schema_ref_parser.$RefParser();
274
- const data = specData.length > 1 ? await refParser.bundleMany({
275
- arrayBuffer: specData.map((data$1) => data$1.arrayBuffer),
276
- pathOrUrlOrSchemas: [],
277
- resolvedInputs: specData.map((data$1) => data$1.resolvedInput)
278
- }) : await refParser.bundle({
279
- arrayBuffer: specData[0].arrayBuffer,
280
- pathOrUrlOrSchema: void 0,
281
- resolvedInput: specData[0].resolvedInput
282
- });
283
- if (config.logs.level !== "silent" && _watches) {
284
- console.clear();
285
- logInputPaths(inputPaths, jobIndex);
286
- }
287
- const eventInputPatch = logger.timeEvent("input.patch");
288
- patchOpenApiSpec({
289
- patchOptions: config.parser.patch,
290
- spec: data
291
- });
292
- eventInputPatch.timeEnd();
293
- const eventParser = logger.timeEvent("parser");
294
- context = require_openApi.parseOpenApiSpec({
295
- config,
296
- dependencies,
297
- logger,
298
- spec: data
299
- });
300
- context.graph = require_openApi.buildGraph(context.ir, logger).graph;
301
- eventParser.timeEnd();
302
- const eventGenerator = logger.timeEvent("generator");
303
- await generateOutput({ context });
304
- eventGenerator.timeEnd();
305
- const eventPostprocess = logger.timeEvent("postprocess");
306
- if (!config.dryRun) {
307
- const jobPrefix = ansi_colors.default.gray(`[Job ${jobIndex + 1}] `);
308
- require_openApi.postprocessOutput(config.output, jobPrefix);
309
- if (config.logs.level !== "silent") {
310
- const outputPath = process.env.INIT_CWD ? `./${node_path.default.relative(process.env.INIT_CWD, config.output.path)}` : config.output.path;
311
- console.log(`${jobPrefix}${ansi_colors.default.green("✅ Done!")} Your output is in ${ansi_colors.default.cyanBright(outputPath)}`);
312
- }
313
- }
314
- eventPostprocess.timeEnd();
315
- }
316
- const watchedInput = config.input.find((input, index) => input.watch.enabled && typeof inputPaths[index].path === "string");
317
- if (watchedInput) setTimeout(() => {
318
- createClient$1({
319
- config,
320
- dependencies,
321
- jobIndex,
322
- logger,
323
- watches
324
- });
325
- }, watchedInput.watch.interval);
326
- return context;
327
- };
328
-
329
- //#endregion
330
- //#region src/utils/cli.ts
331
- const textAscii = `
332
- 888 | e 888~-_ 888
333
- 888___| e88~~8e Y88b / d8b 888 \\ 888
334
- 888 | d888 88b Y888/ /Y88b 888 | 888
335
- 888 | 8888__888 Y8/ / Y88b 888 / 888
336
- 888 | Y888 , Y /____Y88b 888_-~ 888
337
- 888 | "88___/ / / Y88b 888 888
338
- _/
339
- `;
340
- const asciiToLines = (ascii, options) => {
341
- const lines = [];
342
- const padding = Array.from({ length: options?.padding ?? 0 }).fill("");
343
- lines.push(...padding);
344
- let maxLineLength = 0;
345
- let line = "";
346
- for (const char of ascii) if (char === "\n") {
347
- if (line) {
348
- lines.push(line);
349
- maxLineLength = Math.max(maxLineLength, line.length);
350
- line = "";
351
- }
352
- } else line += char;
353
- lines.push(...padding);
354
- return {
355
- lines,
356
- maxLineLength
357
- };
358
- };
359
- function printCliIntro(showLogo = false) {
360
- const packageJson = require_openApi.loadPackageJson();
361
- if (showLogo) {
362
- const text = asciiToLines(textAscii, { padding: 1 });
363
- for (const line of text.lines) console.log(ansi_colors.default.cyan(line));
364
- }
365
- console.log(ansi_colors.default.gray(`${packageJson.name} v${packageJson.version}`));
366
- console.log("");
367
- }
368
-
369
- //#endregion
370
- //#region src/generate.ts
371
- /**
372
- * Generate a client from the provided configuration.
373
- *
374
- * @param userConfig User provided {@link UserConfig} configuration(s).
375
- */
376
- async function createClient(userConfig, logger = new _hey_api_codegen_core.Logger()) {
377
- const resolvedConfig = typeof userConfig === "function" ? await userConfig() : userConfig;
378
- const userConfigs = resolvedConfig ? resolvedConfig instanceof Array ? resolvedConfig : [resolvedConfig] : [];
379
- let rawLogs = userConfigs.find((config) => require_openApi.getLogs(config).level !== "silent")?.logs;
380
- if (typeof rawLogs === "string") rawLogs = require_openApi.getLogs({ logs: rawLogs });
381
- let jobs = [];
382
- try {
383
- checkNodeVersion();
384
- const eventCreateClient = logger.timeEvent("createClient");
385
- const eventConfig = logger.timeEvent("config");
386
- const resolved = await require_openApi.resolveJobs({
387
- logger,
388
- userConfigs
389
- });
390
- const dependencies = resolved.dependencies;
391
- jobs = resolved.jobs;
392
- if (jobs.some((job) => job.config.logs.level !== "silent")) printCliIntro();
393
- eventConfig.timeEnd();
394
- const configErrors = jobs.flatMap((job) => job.errors.map((error) => ({
395
- error,
396
- jobIndex: job.index
397
- })));
398
- if (configErrors.length > 0) throw new require_openApi.ConfigValidationError(configErrors);
399
- const contexts = (await Promise.all(jobs.map(async (job) => {
400
- try {
401
- return await createClient$1({
402
- config: job.config,
403
- dependencies,
404
- jobIndex: job.index,
405
- logger
406
- });
407
- } catch (error) {
408
- throw new require_openApi.JobError("", {
409
- error,
410
- jobIndex: job.index
411
- });
412
- }
413
- }))).filter((ctx) => ctx !== void 0);
414
- eventCreateClient.timeEnd();
415
- logger.report(jobs.some((job) => job.config.logs.level === "debug"));
416
- return contexts;
417
- } catch (error) {
418
- const logs = jobs.find((job) => job.config.logs.level !== "silent")?.config.logs ?? jobs[0]?.config.logs ?? rawLogs;
419
- const dryRun = jobs.some((job) => job.config.dryRun) ?? userConfigs.some((config) => config.dryRun) ?? false;
420
- const logPath = logs?.file && !dryRun ? require_openApi.logCrashReport(error, logs.path ?? "") : void 0;
421
- if (!logs || logs.level !== "silent") {
422
- require_openApi.printCrashReport({
423
- error,
424
- logPath
425
- });
426
- if (await require_openApi.shouldReportCrash({
427
- error,
428
- isInteractive: jobs.some((job) => job.config.interactive) ?? userConfigs.some((config) => config.interactive) ?? false
429
- })) await require_openApi.openGitHubIssueWithCrashReport(error);
430
- }
431
- throw error;
432
- }
433
- }
434
-
435
- //#endregion
436
- //#region src/utils/exports.ts
437
- /**
438
- * Utilities shared across the package.
439
- */
440
- const utils = {
441
- stringCase({ case: casing, stripLeadingSeparators, value }) {
442
- return require_openApi.toCase(value, casing, { stripLeadingSeparators });
443
- },
444
- toCase: require_openApi.toCase
445
- };
446
-
447
- //#endregion
448
- //#region src/index.ts
449
- ansi_colors.default.enabled = (0, color_support.default)().hasBasic;
450
- /**
451
- * Type helper for configuration object, returns {@link MaybeArray<UserConfig>} object(s)
452
- */
453
- async function defineConfig(config) {
454
- return typeof config === "function" ? await config() : config;
455
- }
456
-
457
- //#endregion
458
- Object.defineProperty(exports, 'createClient', {
459
- enumerable: true,
460
- get: function () {
461
- return createClient;
462
- }
463
- });
464
- Object.defineProperty(exports, 'defineConfig', {
465
- enumerable: true,
466
- get: function () {
467
- return defineConfig;
468
- }
469
- });
470
- Object.defineProperty(exports, 'utils', {
471
- enumerable: true,
472
- get: function () {
473
- return utils;
474
- }
475
- });
476
- //# sourceMappingURL=src-CO2t0IHm.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"src-CO2t0IHm.cjs","names":["ConfigError","path","path","fs","getClientPlugin","generateClientBundle","path","result: Pick<\n Partial<Input>,\n | 'api_key'\n | 'branch'\n | 'commit_sha'\n | 'organization'\n | 'project'\n | 'registry'\n | 'tags'\n | 'version'\n > &\n Pick<Input, 'path'>","path","queryParams: Array<string>","lines: Array<string>","colors","createClient","watches: ReadonlyArray<WatchValues>","getSpec","context: Context | undefined","$RefParser","data","parseOpenApiSpec","buildGraph","lines: Array<string>","loadPackageJson","colors","Logger","getLogs","jobs: Configs['jobs']","resolveJobs","ConfigValidationError","pCreateClient","JobError","logCrashReport","shouldReportCrash","openGitHubIssueWithCrashReport","toCase"],"sources":["../src/config/engine.ts","../src/ir/intents.ts","../src/generate/output.ts","../src/openApi/shared/utils/patch.ts","../src/createClient.ts","../src/utils/cli.ts","../src/generate.ts","../src/utils/exports.ts","../src/index.ts"],"sourcesContent":["import { ConfigError } from '~/error';\n\nexport const checkNodeVersion = () => {\n if (typeof Bun !== 'undefined') {\n const [major] = Bun.version.split('.').map(Number);\n if (major! < 1) {\n throw new ConfigError(\n `Unsupported Bun version ${Bun.version}. Please use Bun 1.0.0 or newer.`,\n );\n }\n } else if (typeof process !== 'undefined' && process.versions?.node) {\n const [major] = process.versions.node.split('.').map(Number);\n if (major! < 20) {\n throw new ConfigError(\n `Unsupported Node version ${process.versions.node}. Please use Node 20 or newer.`,\n );\n }\n }\n};\n","import type { MaybePromise } from '@hey-api/types';\n\nimport type { CodeSampleObject } from '~/openApi/shared/types';\n\nimport type { IR } from './types';\n\nexport interface ExampleIntent {\n run(ctx: IntentContext): MaybePromise<void>;\n}\n\nexport class IntentContext<Spec extends Record<string, any> = any> {\n private spec: Spec;\n\n constructor(spec: Spec) {\n this.spec = spec;\n }\n\n private getOperation(\n path: string,\n method: string,\n ): Record<string, any> | undefined {\n const paths = (this.spec as any).paths;\n if (!paths) return;\n return paths[path]?.[method];\n }\n\n setExample(operation: IR.OperationObject, example: CodeSampleObject): void {\n const source = this.getOperation(operation.path, operation.method);\n if (!source) return;\n source['x-codeSamples'] ||= [];\n source['x-codeSamples'].push(example);\n }\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport type { Context } from '~/ir/context';\nimport { IntentContext } from '~/ir/intents';\nimport { getClientPlugin } from '~/plugins/@hey-api/client-core/utils';\n\nimport { generateClientBundle } from './client';\n\nexport const generateOutput = async ({ context }: { context: Context }) => {\n const outputPath = path.resolve(context.config.output.path);\n\n if (context.config.output.clean) {\n if (fs.existsSync(outputPath)) {\n fs.rmSync(outputPath, { force: true, recursive: true });\n }\n }\n\n const client = getClientPlugin(context.config);\n if (\n 'bundle' in client.config &&\n client.config.bundle &&\n !context.config.dryRun\n ) {\n // not proud of this one\n // @ts-expect-error\n context.config._FRAGILE_CLIENT_BUNDLE_RENAMED = generateClientBundle({\n meta: {\n importFileExtension: context.config.output.importFileExtension,\n },\n outputPath,\n // @ts-expect-error\n plugin: client,\n project: context.gen,\n });\n }\n\n for (const plugin of context.registerPlugins()) {\n await plugin.run();\n }\n\n context.gen.plan();\n\n const ctx = new IntentContext(context.spec);\n for (const intent of context.intents) {\n await intent.run(ctx);\n }\n\n for (const file of context.gen.render()) {\n const filePath = path.resolve(outputPath, file.path);\n const dir = path.dirname(filePath);\n if (!context.config.dryRun) {\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(filePath, file.content, { encoding: 'utf8' });\n }\n }\n\n const { source } = context.config.output;\n if (source.enabled) {\n const sourcePath =\n source.path === null ? undefined : path.resolve(outputPath, source.path);\n if (!context.config.dryRun && sourcePath && sourcePath !== outputPath) {\n fs.mkdirSync(sourcePath, { recursive: true });\n }\n const serialized = await source.serialize(context.spec);\n // TODO: handle yaml (convert before writing)\n if (!context.config.dryRun && sourcePath) {\n fs.writeFileSync(\n path.resolve(sourcePath, `${source.fileName}.${source.extension}`),\n serialized,\n { encoding: 'utf8' },\n );\n }\n if (source.callback) {\n await source.callback(serialized);\n }\n }\n};\n","import type { OpenApi } from '~/openApi/types';\n\nimport type { Patch } from '../../../types/parser';\n\nexport const patchOpenApiSpec = ({\n patchOptions,\n spec: _spec,\n}: {\n patchOptions: Patch | undefined;\n spec: unknown;\n}) => {\n if (!patchOptions) {\n return;\n }\n\n const spec = _spec as OpenApi.V2_0_X | OpenApi.V3_0_X | OpenApi.V3_1_X;\n\n if ('swagger' in spec) {\n if (patchOptions.version && spec.swagger) {\n spec.swagger = (\n typeof patchOptions.version === 'string'\n ? patchOptions.version\n : patchOptions.version(spec.swagger)\n ) as typeof spec.swagger;\n }\n\n if (patchOptions.meta && spec.info) {\n patchOptions.meta(spec.info);\n }\n\n if (patchOptions.schemas && spec.definitions) {\n for (const key in patchOptions.schemas) {\n const schema = spec.definitions[key];\n if (!schema || typeof schema !== 'object') continue;\n\n const patchFn = patchOptions.schemas[key]!;\n patchFn(schema);\n }\n }\n\n if (patchOptions.operations && spec.paths) {\n for (const key in patchOptions.operations) {\n const [method, path] = key.split(' ');\n if (!method || !path) continue;\n\n const pathItem = spec.paths[path as keyof typeof spec.paths];\n if (!pathItem) continue;\n\n const operation =\n pathItem[method.toLocaleLowerCase() as keyof typeof pathItem] ||\n pathItem[method.toLocaleUpperCase() as keyof typeof pathItem];\n if (!operation || typeof operation !== 'object') continue;\n\n const patchFn = patchOptions.operations[key]!;\n patchFn(operation as any);\n }\n }\n return;\n }\n\n if (patchOptions.version && spec.openapi) {\n spec.openapi = (\n typeof patchOptions.version === 'string'\n ? patchOptions.version\n : patchOptions.version(spec.openapi)\n ) as typeof spec.openapi;\n }\n\n if (patchOptions.meta && spec.info) {\n patchOptions.meta(spec.info);\n }\n\n if (spec.components) {\n if (patchOptions.schemas && spec.components.schemas) {\n for (const key in patchOptions.schemas) {\n const schema = spec.components.schemas[key];\n if (!schema || typeof schema !== 'object') continue;\n\n const patchFn = patchOptions.schemas[key]!;\n patchFn(schema as Parameters<typeof patchFn>[0]);\n }\n }\n\n if (patchOptions.parameters && spec.components.parameters) {\n for (const key in patchOptions.parameters) {\n const schema = spec.components.parameters[key];\n if (!schema || typeof schema !== 'object') continue;\n\n const patchFn = patchOptions.parameters[key]!;\n patchFn(schema);\n }\n }\n\n if (patchOptions.requestBodies && spec.components.requestBodies) {\n for (const key in patchOptions.requestBodies) {\n const schema = spec.components.requestBodies[key];\n if (!schema || typeof schema !== 'object') continue;\n\n const patchFn = patchOptions.requestBodies[key]!;\n patchFn(schema);\n }\n }\n\n if (patchOptions.responses && spec.components.responses) {\n for (const key in patchOptions.responses) {\n const schema = spec.components.responses[key];\n if (!schema || typeof schema !== 'object') continue;\n\n const patchFn = patchOptions.responses[key]!;\n patchFn(schema);\n }\n }\n }\n\n if (patchOptions.operations && spec.paths) {\n for (const key in patchOptions.operations) {\n const [method, path] = key.split(' ');\n if (!method || !path) continue;\n\n const pathItem = spec.paths[path as keyof typeof spec.paths];\n if (!pathItem) continue;\n\n const operation =\n pathItem[method.toLocaleLowerCase() as keyof typeof pathItem] ||\n pathItem[method.toLocaleUpperCase() as keyof typeof pathItem];\n if (!operation || typeof operation !== 'object') continue;\n\n const patchFn = patchOptions.operations[key]!;\n patchFn(operation as any);\n }\n }\n};\n","import path from 'node:path';\n\nimport type { Logger } from '@hey-api/codegen-core';\nimport { $RefParser } from '@hey-api/json-schema-ref-parser';\nimport colors from 'ansi-colors';\n\nimport { postprocessOutput } from '~/config/output';\nimport type { Config } from '~/config/types';\nimport { generateOutput } from '~/generate/output';\nimport { getSpec } from '~/getSpec';\nimport type { Context } from '~/ir/context';\nimport { parseOpenApiSpec } from '~/openApi';\nimport { buildGraph } from '~/openApi/shared/utils/graph';\nimport { patchOpenApiSpec } from '~/openApi/shared/utils/patch';\nimport type { Input } from '~/types/input';\nimport type { WatchValues } from '~/types/types';\n\nexport const compileInputPath = (input: Omit<Input, 'watch'>) => {\n const result: Pick<\n Partial<Input>,\n | 'api_key'\n | 'branch'\n | 'commit_sha'\n | 'organization'\n | 'project'\n | 'registry'\n | 'tags'\n | 'version'\n > &\n Pick<Input, 'path'> = {\n ...input,\n path: '',\n };\n\n if (\n input.path &&\n (typeof input.path !== 'string' || input.registry !== 'hey-api')\n ) {\n result.path = input.path;\n return result;\n }\n\n const [basePath, baseQuery] = input.path.split('?');\n const queryParts = (baseQuery || '').split('&');\n const queryPath = queryParts.map((part) => part.split('='));\n\n let path = basePath || '';\n if (path.endsWith('/')) {\n path = path.slice(0, path.length - 1);\n }\n\n const [, pathUrl] = path.split('://');\n const [baseUrl, organization, project] = (pathUrl || '').split('/');\n result.organization = organization || input.organization;\n result.project = project || input.project;\n\n const queryParams: Array<string> = [];\n\n const kApiKey = 'api_key';\n result.api_key =\n queryPath.find(([key]) => key === kApiKey)?.[1] ||\n input.api_key ||\n process.env.HEY_API_TOKEN;\n if (result.api_key) {\n queryParams.push(`${kApiKey}=${result.api_key}`);\n }\n\n const kBranch = 'branch';\n result.branch =\n queryPath.find(([key]) => key === kBranch)?.[1] || input.branch;\n if (result.branch) {\n queryParams.push(`${kBranch}=${result.branch}`);\n }\n\n const kCommitSha = 'commit_sha';\n result.commit_sha =\n queryPath.find(([key]) => key === kCommitSha)?.[1] || input.commit_sha;\n if (result.commit_sha) {\n queryParams.push(`${kCommitSha}=${result.commit_sha}`);\n }\n\n const kTags = 'tags';\n result.tags =\n queryPath.find(([key]) => key === kTags)?.[1]?.split(',') || input.tags;\n if (result.tags?.length) {\n queryParams.push(`${kTags}=${result.tags.join(',')}`);\n }\n\n const kVersion = 'version';\n result.version =\n queryPath.find(([key]) => key === kVersion)?.[1] || input.version;\n if (result.version) {\n queryParams.push(`${kVersion}=${result.version}`);\n }\n\n if (!result.organization) {\n throw new Error(\n 'missing organization - from which Hey API Platform organization do you want to generate your output?',\n );\n }\n\n if (!result.project) {\n throw new Error(\n 'missing project - from which Hey API Platform project do you want to generate your output?',\n );\n }\n\n const query = queryParams.join('&');\n const platformUrl = baseUrl || 'get.heyapi.dev';\n const isLocalhost = platformUrl.startsWith('localhost');\n const platformUrlWithProtocol = [\n isLocalhost ? 'http' : 'https',\n platformUrl,\n ].join('://');\n const compiledPath = isLocalhost\n ? [\n platformUrlWithProtocol,\n 'v1',\n 'get',\n result.organization,\n result.project,\n ].join('/')\n : [platformUrlWithProtocol, result.organization, result.project].join('/');\n result.path = query ? `${compiledPath}?${query}` : compiledPath;\n\n return result;\n};\n\nconst logInputPaths = (\n inputPaths: ReadonlyArray<ReturnType<typeof compileInputPath>>,\n jobIndex: number,\n) => {\n const lines: Array<string> = [];\n\n const jobPrefix = colors.gray(`[Job ${jobIndex + 1}] `);\n const count = inputPaths.length;\n const baseString = colors.cyan(\n `Generating from ${count} ${count === 1 ? 'input' : 'inputs'}:`,\n );\n lines.push(`${jobPrefix}⏳ ${baseString}`);\n\n inputPaths.forEach((inputPath, index) => {\n const itemPrefixStr = ` [${index + 1}] `;\n const itemPrefix = colors.cyan(itemPrefixStr);\n const detailIndent = ' '.repeat(itemPrefixStr.length);\n\n if (typeof inputPath.path !== 'string') {\n lines.push(`${jobPrefix}${itemPrefix}raw OpenAPI specification`);\n return;\n }\n\n switch (inputPath.registry) {\n case 'hey-api': {\n const baseInput = [inputPath.organization, inputPath.project]\n .filter(Boolean)\n .join('/');\n lines.push(`${jobPrefix}${itemPrefix}${baseInput}`);\n if (inputPath.branch) {\n lines.push(\n `${jobPrefix}${detailIndent}${colors.gray('branch:')} ${colors.green(\n inputPath.branch,\n )}`,\n );\n }\n if (inputPath.commit_sha) {\n lines.push(\n `${jobPrefix}${detailIndent}${colors.gray('commit:')} ${colors.green(\n inputPath.commit_sha,\n )}`,\n );\n }\n if (inputPath.tags?.length) {\n lines.push(\n `${jobPrefix}${detailIndent}${colors.gray('tags:')} ${colors.green(\n inputPath.tags.join(', '),\n )}`,\n );\n }\n if (inputPath.version) {\n lines.push(\n `${jobPrefix}${detailIndent}${colors.gray('version:')} ${colors.green(\n inputPath.version,\n )}`,\n );\n }\n lines.push(\n `${jobPrefix}${detailIndent}${colors.gray('registry:')} ${colors.green('Hey API')}`,\n );\n break;\n }\n case 'readme': {\n const baseInput = [inputPath.organization, inputPath.project]\n .filter(Boolean)\n .join('/');\n if (!baseInput) {\n lines.push(`${jobPrefix}${itemPrefix}${inputPath.path}`);\n } else {\n lines.push(`${jobPrefix}${itemPrefix}${baseInput}`);\n }\n // @ts-expect-error\n if (inputPath.uuid) {\n lines.push(\n `${jobPrefix}${detailIndent}${colors.gray('uuid:')} ${colors.green(\n // @ts-expect-error\n inputPath.uuid,\n )}`,\n );\n }\n lines.push(\n `${jobPrefix}${detailIndent}${colors.gray('registry:')} ${colors.green('ReadMe')}`,\n );\n break;\n }\n case 'scalar': {\n const baseInput = [inputPath.organization, inputPath.project]\n .filter(Boolean)\n .join('/');\n lines.push(`${jobPrefix}${itemPrefix}${baseInput}`);\n lines.push(\n `${jobPrefix}${detailIndent}${colors.gray('registry:')} ${colors.green('Scalar')}`,\n );\n break;\n }\n default:\n lines.push(`${jobPrefix}${itemPrefix}${inputPath.path}`);\n break;\n }\n });\n\n for (const line of lines) {\n console.log(line);\n }\n};\n\nexport const createClient = async ({\n config,\n dependencies,\n jobIndex,\n logger,\n watches: _watches,\n}: {\n config: Config;\n dependencies: Record<string, string>;\n jobIndex: number;\n logger: Logger;\n /**\n * Always undefined on the first run, defined on subsequent runs.\n */\n watches?: ReadonlyArray<WatchValues>;\n}): Promise<Context | undefined> => {\n const watches: ReadonlyArray<WatchValues> =\n _watches ||\n Array.from({ length: config.input.length }, () => ({\n headers: new Headers(),\n }));\n\n const inputPaths = config.input.map((input) => compileInputPath(input));\n\n // on first run, print the message as soon as possible\n if (config.logs.level !== 'silent' && !_watches) {\n logInputPaths(inputPaths, jobIndex);\n }\n\n const getSpecData = async (input: Input, index: number) => {\n const eventSpec = logger.timeEvent('spec');\n const { arrayBuffer, error, resolvedInput, response } = await getSpec({\n fetchOptions: input.fetch,\n inputPath: inputPaths[index]!.path,\n timeout: input.watch.timeout,\n watch: watches[index]!,\n });\n eventSpec.timeEnd();\n\n // throw on first run if there's an error to preserve user experience\n // if in watch mode, subsequent errors won't throw to gracefully handle\n // cases where server might be reloading\n if (error && !_watches) {\n throw new Error(\n `Request failed with status ${response.status}: ${response.statusText}`,\n );\n }\n\n return { arrayBuffer, resolvedInput };\n };\n const specData = (\n await Promise.all(\n config.input.map((input, index) => getSpecData(input, index)),\n )\n ).filter((data) => data.arrayBuffer || data.resolvedInput);\n\n let context: Context | undefined;\n\n if (specData.length) {\n const refParser = new $RefParser();\n const data =\n specData.length > 1\n ? await refParser.bundleMany({\n arrayBuffer: specData.map((data) => data.arrayBuffer!),\n pathOrUrlOrSchemas: [],\n resolvedInputs: specData.map((data) => data.resolvedInput!),\n })\n : await refParser.bundle({\n arrayBuffer: specData[0]!.arrayBuffer,\n pathOrUrlOrSchema: undefined,\n resolvedInput: specData[0]!.resolvedInput,\n });\n\n // on subsequent runs in watch mode, print the message only if we know we're\n // generating the output\n if (config.logs.level !== 'silent' && _watches) {\n console.clear();\n logInputPaths(inputPaths, jobIndex);\n }\n\n const eventInputPatch = logger.timeEvent('input.patch');\n patchOpenApiSpec({ patchOptions: config.parser.patch, spec: data });\n eventInputPatch.timeEnd();\n\n const eventParser = logger.timeEvent('parser');\n context = parseOpenApiSpec({ config, dependencies, logger, spec: data });\n context.graph = buildGraph(context.ir, logger).graph;\n eventParser.timeEnd();\n\n const eventGenerator = logger.timeEvent('generator');\n await generateOutput({ context });\n eventGenerator.timeEnd();\n\n const eventPostprocess = logger.timeEvent('postprocess');\n if (!config.dryRun) {\n const jobPrefix = colors.gray(`[Job ${jobIndex + 1}] `);\n postprocessOutput(config.output, jobPrefix);\n\n if (config.logs.level !== 'silent') {\n const outputPath = process.env.INIT_CWD\n ? `./${path.relative(process.env.INIT_CWD, config.output.path)}`\n : config.output.path;\n console.log(\n `${jobPrefix}${colors.green('✅ Done!')} Your output is in ${colors.cyanBright(outputPath)}`,\n );\n }\n }\n eventPostprocess.timeEnd();\n }\n\n const watchedInput = config.input.find(\n (input, index) =>\n input.watch.enabled && typeof inputPaths[index]!.path === 'string',\n );\n\n if (watchedInput) {\n setTimeout(() => {\n createClient({\n config,\n dependencies,\n jobIndex,\n logger,\n watches,\n });\n }, watchedInput.watch.interval);\n }\n\n return context;\n};\n","import colors from 'ansi-colors';\n\nimport { loadPackageJson } from '~/generate/tsConfig';\n\nconst textAscii = `\n888 | e 888~-_ 888\n888___| e88~~8e Y88b / d8b 888 \\\\ 888\n888 | d888 88b Y888/ /Y88b 888 | 888\n888 | 8888__888 Y8/ / Y88b 888 / 888\n888 | Y888 , Y /____Y88b 888_-~ 888\n888 | \"88___/ / / Y88b 888 888\n _/\n`;\n\nconst asciiToLines = (\n ascii: string,\n options?: {\n padding?: number;\n },\n) => {\n const lines: Array<string> = [];\n const padding = Array.from<string>({ length: options?.padding ?? 0 }).fill(\n '',\n );\n lines.push(...padding);\n let maxLineLength = 0;\n let line = '';\n for (const char of ascii) {\n if (char === '\\n') {\n if (line) {\n lines.push(line);\n maxLineLength = Math.max(maxLineLength, line.length);\n line = '';\n }\n } else {\n line += char;\n }\n }\n lines.push(...padding);\n return { lines, maxLineLength };\n};\n\n// TODO: show ascii logo only in `--help` and `--version` commands\nexport function printCliIntro(showLogo: boolean = false): void {\n const packageJson = loadPackageJson();\n if (showLogo) {\n const text = asciiToLines(textAscii, { padding: 1 });\n for (const line of text.lines) {\n console.log(colors.cyan(line));\n }\n }\n console.log(colors.gray(`${packageJson.name} v${packageJson.version}`));\n console.log('');\n}\n","import { Logger } from '@hey-api/codegen-core';\nimport type { LazyOrAsync, MaybeArray } from '@hey-api/types';\n\nimport { checkNodeVersion } from '~/config/engine';\nimport type { Configs } from '~/config/init';\nimport { resolveJobs } from '~/config/init';\nimport { getLogs } from '~/config/logs';\nimport type { UserConfig } from '~/config/types';\nimport { createClient as pCreateClient } from '~/createClient';\nimport {\n ConfigValidationError,\n JobError,\n logCrashReport,\n openGitHubIssueWithCrashReport,\n printCrashReport,\n shouldReportCrash,\n} from '~/error';\nimport type { Context } from '~/ir/context';\nimport { printCliIntro } from '~/utils/cli';\n\n/**\n * Generate a client from the provided configuration.\n *\n * @param userConfig User provided {@link UserConfig} configuration(s).\n */\nexport async function createClient(\n userConfig?: LazyOrAsync<MaybeArray<UserConfig>>,\n logger = new Logger(),\n): Promise<ReadonlyArray<Context>> {\n const resolvedConfig =\n typeof userConfig === 'function' ? await userConfig() : userConfig;\n const userConfigs = resolvedConfig\n ? resolvedConfig instanceof Array\n ? resolvedConfig\n : [resolvedConfig]\n : [];\n\n let rawLogs = userConfigs.find(\n (config) => getLogs(config).level !== 'silent',\n )?.logs;\n if (typeof rawLogs === 'string') {\n rawLogs = getLogs({ logs: rawLogs });\n }\n\n let jobs: Configs['jobs'] = [];\n\n try {\n checkNodeVersion();\n\n const eventCreateClient = logger.timeEvent('createClient');\n\n const eventConfig = logger.timeEvent('config');\n const resolved = await resolveJobs({ logger, userConfigs });\n const dependencies = resolved.dependencies;\n jobs = resolved.jobs;\n const printIntro = jobs.some((job) => job.config.logs.level !== 'silent');\n if (printIntro) printCliIntro();\n eventConfig.timeEnd();\n\n const configErrors = jobs.flatMap((job) =>\n job.errors.map((error) => ({ error, jobIndex: job.index })),\n );\n if (configErrors.length > 0) {\n throw new ConfigValidationError(configErrors);\n }\n\n const outputs = await Promise.all(\n jobs.map(async (job) => {\n try {\n return await pCreateClient({\n config: job.config,\n dependencies,\n jobIndex: job.index,\n logger,\n });\n } catch (error) {\n throw new JobError('', {\n error,\n jobIndex: job.index,\n });\n }\n }),\n );\n const contexts = outputs.filter((ctx): ctx is Context => ctx !== undefined);\n\n eventCreateClient.timeEnd();\n\n logger.report(jobs.some((job) => job.config.logs.level === 'debug'));\n\n return contexts;\n } catch (error) {\n const logs =\n jobs.find((job) => job.config.logs.level !== 'silent')?.config.logs ??\n jobs[0]?.config.logs ??\n rawLogs;\n const dryRun =\n jobs.some((job) => job.config.dryRun) ??\n userConfigs.some((config) => config.dryRun) ??\n false;\n const logPath =\n logs?.file && !dryRun\n ? logCrashReport(error, logs.path ?? '')\n : undefined;\n if (!logs || logs.level !== 'silent') {\n printCrashReport({ error, logPath });\n const isInteractive =\n jobs.some((job) => job.config.interactive) ??\n userConfigs.some((config) => config.interactive) ??\n false;\n if (await shouldReportCrash({ error, isInteractive })) {\n await openGitHubIssueWithCrashReport(error);\n }\n }\n\n throw error;\n }\n}\n","import type { Casing } from './naming';\nimport { toCase } from './naming';\n\n/**\n * Utilities shared across the package.\n */\nexport const utils = {\n /**\n * @deprecated use `toCase` instead\n */\n stringCase({\n case: casing,\n stripLeadingSeparators,\n value,\n }: {\n readonly case: Casing | undefined;\n /**\n * If leading separators have a semantic meaning, we might not want to\n * remove them.\n */\n stripLeadingSeparators?: boolean;\n value: string;\n }) {\n return toCase(value, casing, { stripLeadingSeparators });\n },\n /**\n * Converts the given string to the specified casing.\n */\n toCase,\n};\n","// OVERRIDES\n// hard-coded here because build process doesn't pick up overrides from separate files\nimport '@hey-api/codegen-core';\n\ndeclare module '@hey-api/codegen-core' {\n interface ProjectRenderMeta {\n /**\n * If specified, this will be the file extension used when importing\n * other modules. By default, we don't add a file extension and let the\n * runtime resolve it.\n *\n * @default null\n */\n importFileExtension?: (string & {}) | null;\n }\n\n interface SymbolMeta {\n category?:\n | 'client'\n | 'external'\n | 'hook'\n | 'schema'\n | 'sdk'\n | 'transform'\n | 'type'\n | 'utility'\n | (string & {});\n /**\n * Path to the resource this symbol represents.\n */\n path?: ReadonlyArray<string | number>;\n /**\n * Name of the plugin that registered this symbol.\n */\n pluginName?: string;\n resource?:\n | 'client'\n | 'definition'\n | 'operation'\n | 'webhook'\n | (string & {});\n resourceId?: string;\n role?:\n | 'data'\n | 'error'\n | 'errors'\n | 'options'\n | 'response'\n | 'responses'\n | (string & {});\n /**\n * Tags associated with this symbol.\n */\n tags?: ReadonlyArray<string>;\n tool?:\n | 'angular'\n | 'arktype'\n | 'fastify'\n | 'json-schema'\n | 'sdk'\n | 'typescript'\n | 'valibot'\n | 'zod'\n | (string & {});\n variant?: 'container' | (string & {});\n }\n}\n// END OVERRIDES\n\nimport type { LazyOrAsync, MaybeArray } from '@hey-api/types';\nimport colors from 'ansi-colors';\n// @ts-expect-error\nimport colorSupport from 'color-support';\n\nimport type { UserConfig } from '~/config/types';\n\ncolors.enabled = colorSupport().hasBasic;\n\nexport { createClient } from '~/generate';\n\n/**\n * Type helper for configuration object, returns {@link MaybeArray<UserConfig>} object(s)\n */\nexport async function defineConfig<T extends MaybeArray<UserConfig>>(\n config: LazyOrAsync<T>,\n): Promise<T> {\n return typeof config === 'function' ? await config() : config;\n}\n\nexport { Logger } from '@hey-api/codegen-core';\nexport { defaultPaginationKeywords } from '~/config/parser';\nexport { defaultPlugins } from '~/config/plugins';\nexport type { UserConfig } from '~/config/types';\nexport type { IR } from '~/ir/types';\nexport { OperationPath, OperationStrategy } from '~/openApi/shared/locations';\nexport type {\n OpenApi,\n OpenApiMetaObject,\n OpenApiOperationObject,\n OpenApiParameterObject,\n OpenApiRequestBodyObject,\n OpenApiResponseObject,\n OpenApiSchemaObject,\n} from '~/openApi/types';\nexport type { DefinePlugin, Plugin } from '~/plugins';\nexport type { AngularClient } from '~/plugins/@hey-api/client-angular';\nexport type { AxiosClient } from '~/plugins/@hey-api/client-axios';\nexport {\n clientDefaultConfig,\n clientDefaultMeta,\n} from '~/plugins/@hey-api/client-core/config';\nexport { clientPluginHandler } from '~/plugins/@hey-api/client-core/plugin';\nexport type { Client } from '~/plugins/@hey-api/client-core/types';\nexport type { FetchClient } from '~/plugins/@hey-api/client-fetch';\nexport type { NextClient } from '~/plugins/@hey-api/client-next';\nexport type { NuxtClient } from '~/plugins/@hey-api/client-nuxt';\nexport type { OfetchClient } from '~/plugins/@hey-api/client-ofetch';\nexport type { ExpressionTransformer } from '~/plugins/@hey-api/transformers/expressions';\nexport type { TypeTransformer } from '~/plugins/@hey-api/transformers/types';\nexport { definePluginConfig } from '~/plugins/shared/utils/config';\nexport * from '~/ts-dsl';\nexport { utils } from '~/utils/exports';\n"],"mappings":"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"}