orval 8.4.2 → 8.5.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/bin/orval.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { c as description, i as startWatcher, l as name, n as loadConfigFile, r as generateSpec, s as normalizeOptions, t as findConfigFile, u as version } from "../config-
|
|
2
|
+
import { c as description, i as startWatcher, l as name, n as loadConfigFile, r as generateSpec, s as normalizeOptions, t as findConfigFile, u as version } from "../config-By98GXtB.mjs";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { Option, program } from "@commander-js/extra-typings";
|
|
5
5
|
import { ErrorWithTag, OutputClient, OutputMode, isString, log, logError, setVerbose, startMessage } from "@orval/core";
|
|
@@ -15,7 +15,7 @@ import query from "@orval/query";
|
|
|
15
15
|
import solidStart from "@orval/solid-start";
|
|
16
16
|
import swr from "@orval/swr";
|
|
17
17
|
import zod, { dereference, generateZodValidationSchemaDefinition, isZodVersionV4, parseZodValidationSchemaDefinition } from "@orval/zod";
|
|
18
|
-
import
|
|
18
|
+
import { styleText } from "node:util";
|
|
19
19
|
import { ExecaError, execa } from "execa";
|
|
20
20
|
import fs from "fs-extra";
|
|
21
21
|
import fs$1 from "node:fs/promises";
|
|
@@ -29,7 +29,7 @@ import { createJiti } from "jiti";
|
|
|
29
29
|
//#region package.json
|
|
30
30
|
var name = "orval";
|
|
31
31
|
var description = "A swagger client generator for typescript";
|
|
32
|
-
var version = "8.
|
|
32
|
+
var version = "8.5.0";
|
|
33
33
|
|
|
34
34
|
//#endregion
|
|
35
35
|
//#region src/client.ts
|
|
@@ -174,9 +174,9 @@ const generateOperations = (outputClient = DEFAULT_CLIENT, verbsOptions, options
|
|
|
174
174
|
}, {});
|
|
175
175
|
};
|
|
176
176
|
const generateExtraFiles = (outputClient = DEFAULT_CLIENT, verbsOptions, output, context) => {
|
|
177
|
-
const { extraFiles: generateExtraFiles
|
|
178
|
-
if (!generateExtraFiles
|
|
179
|
-
return generateExtraFiles
|
|
177
|
+
const { extraFiles: generateExtraFiles } = getGeneratorClient(outputClient, output);
|
|
178
|
+
if (!generateExtraFiles) return Promise.resolve([]);
|
|
179
|
+
return generateExtraFiles(verbsOptions, output, context);
|
|
180
180
|
};
|
|
181
181
|
|
|
182
182
|
//#endregion
|
|
@@ -475,8 +475,8 @@ async function formatWithPrettier(paths, projectTitle) {
|
|
|
475
475
|
});
|
|
476
476
|
await fs$1.writeFile(filePath, formatted);
|
|
477
477
|
} catch (error) {
|
|
478
|
-
if (error instanceof Error) if (error.name === "UndefinedParserError") {} else log(
|
|
479
|
-
else log(
|
|
478
|
+
if (error instanceof Error) if (error.name === "UndefinedParserError") {} else log(styleText("yellow", `⚠️ ${projectTitle ? `${projectTitle} - ` : ""}Failed to format file ${filePath}: ${error.toString()}`));
|
|
479
|
+
else log(styleText("yellow", `⚠️ ${projectTitle ? `${projectTitle} - ` : ""}Failed to format file ${filePath}: unknown error}`));
|
|
480
480
|
}
|
|
481
481
|
}));
|
|
482
482
|
return;
|
|
@@ -484,7 +484,7 @@ async function formatWithPrettier(paths, projectTitle) {
|
|
|
484
484
|
try {
|
|
485
485
|
await execa("prettier", ["--write", ...paths]);
|
|
486
486
|
} catch {
|
|
487
|
-
log(
|
|
487
|
+
log(styleText("yellow", `⚠️ ${projectTitle ? `${projectTitle} - ` : ""}prettier not found. Install it as a project dependency or globally.`));
|
|
488
488
|
}
|
|
489
489
|
}
|
|
490
490
|
/**
|
|
@@ -519,14 +519,14 @@ async function collectFilePaths(paths) {
|
|
|
519
519
|
|
|
520
520
|
//#endregion
|
|
521
521
|
//#region src/utils/execute-hook.ts
|
|
522
|
-
const executeHook = async (name
|
|
523
|
-
log(
|
|
522
|
+
const executeHook = async (name, commands = [], args = []) => {
|
|
523
|
+
log(styleText("white", `Running ${name} hook...`));
|
|
524
524
|
for (const command of commands) try {
|
|
525
525
|
if (isString(command)) await executeCommand(command, args);
|
|
526
526
|
else if (isFunction(command)) await command(args);
|
|
527
527
|
else if (isObject(command)) await executeObjectCommand(command, args);
|
|
528
528
|
} catch (error) {
|
|
529
|
-
logError(error, `Failed to run ${name
|
|
529
|
+
logError(error, `Failed to run ${name} hook`);
|
|
530
530
|
}
|
|
531
531
|
};
|
|
532
532
|
async function executeCommand(command, args) {
|
|
@@ -570,7 +570,7 @@ const resolveAndAttachVersions = (pkg, workspace, cacheKey) => {
|
|
|
570
570
|
if (Object.keys(resolved).length > 0) {
|
|
571
571
|
pkg.resolvedVersions = resolved;
|
|
572
572
|
resolvedCache.set(cacheKey, resolved);
|
|
573
|
-
for (const [name
|
|
573
|
+
for (const [name, version] of Object.entries(resolved)) logVerbose(styleText("dim", `Detected ${styleText("white", name)} v${styleText("white", version)}`));
|
|
574
574
|
}
|
|
575
575
|
return pkg;
|
|
576
576
|
};
|
|
@@ -625,7 +625,7 @@ const maybeReplaceCatalog = async (pkg, workspace) => {
|
|
|
625
625
|
if (!hasCatalogReferences(pkg)) return pkg;
|
|
626
626
|
const catalogData = await loadPnpmWorkspaceCatalog(workspace) ?? await loadPackageJsonCatalog(workspace) ?? await loadYarnrcCatalog(workspace);
|
|
627
627
|
if (!catalogData) {
|
|
628
|
-
log(`⚠️ ${
|
|
628
|
+
log(`⚠️ ${styleText("yellow", "package.json contains catalog: references, but no catalog source was found (checked: pnpm-workspace.yaml, package.json, .yarnrc.yml).")}`);
|
|
629
629
|
return pkg;
|
|
630
630
|
}
|
|
631
631
|
performSubstitution(pkg.dependencies, catalogData);
|
|
@@ -635,27 +635,27 @@ const maybeReplaceCatalog = async (pkg, workspace) => {
|
|
|
635
635
|
};
|
|
636
636
|
const performSubstitution = (dependencies, catalogData) => {
|
|
637
637
|
if (!dependencies) return;
|
|
638
|
-
for (const [packageName, version
|
|
638
|
+
for (const [packageName, version] of Object.entries(dependencies)) if (version === "catalog:" || version === "catalog:default") {
|
|
639
639
|
if (!catalogData.catalog) {
|
|
640
|
-
log(`⚠️ ${
|
|
640
|
+
log(`⚠️ ${styleText("yellow", `catalog: substitution for the package '${packageName}' failed as there is no default catalog.`)}`);
|
|
641
641
|
continue;
|
|
642
642
|
}
|
|
643
643
|
const sub = catalogData.catalog[packageName];
|
|
644
644
|
if (!sub) {
|
|
645
|
-
log(`⚠️ ${
|
|
645
|
+
log(`⚠️ ${styleText("yellow", `catalog: substitution for the package '${packageName}' failed as there is no matching package in the default catalog.`)}`);
|
|
646
646
|
continue;
|
|
647
647
|
}
|
|
648
648
|
dependencies[packageName] = sub;
|
|
649
|
-
} else if (version
|
|
650
|
-
const catalogName = version
|
|
649
|
+
} else if (version.startsWith("catalog:")) {
|
|
650
|
+
const catalogName = version.slice(8);
|
|
651
651
|
const catalog = catalogData.catalogs?.[catalogName];
|
|
652
652
|
if (!catalog) {
|
|
653
|
-
log(`⚠️ ${
|
|
653
|
+
log(`⚠️ ${styleText("yellow", `'${version}' substitution for the package '${packageName}' failed as there is no matching catalog named '${catalogName}'. (available named catalogs are: ${Object.keys(catalogData.catalogs ?? {}).join(", ")})`)}`);
|
|
654
654
|
continue;
|
|
655
655
|
}
|
|
656
656
|
const sub = catalog[packageName];
|
|
657
657
|
if (!sub) {
|
|
658
|
-
log(`⚠️ ${
|
|
658
|
+
log(`⚠️ ${styleText("yellow", `'${version}' substitution for the package '${packageName}' failed as there is no package in the catalog named '${catalogName}'. (packages in the catalog are: ${Object.keys(catalog).join(", ")})`)}`);
|
|
659
659
|
continue;
|
|
660
660
|
}
|
|
661
661
|
dependencies[packageName] = sub;
|
|
@@ -733,8 +733,8 @@ function normalizeSchemasOption(schemas, workspace) {
|
|
|
733
733
|
}
|
|
734
734
|
async function normalizeOptions(optionsExport, workspace = process.cwd(), globalOptions = {}) {
|
|
735
735
|
const options = await (isFunction(optionsExport) ? optionsExport() : optionsExport);
|
|
736
|
-
if (!options.input) throw new Error(
|
|
737
|
-
if (!options.output) throw new Error(
|
|
736
|
+
if (!options.input) throw new Error(styleText("red", `Config require an input`));
|
|
737
|
+
if (!options.output) throw new Error(styleText("red", `Config require an output`));
|
|
738
738
|
const inputOptions = isString(options.input) ? { target: options.input } : options.input;
|
|
739
739
|
const outputOptions = isString(options.output) ? { target: options.output } : options.output;
|
|
740
740
|
const outputWorkspace = normalizePath(outputOptions.workspace ?? "", workspace);
|
|
@@ -742,14 +742,14 @@ async function normalizeOptions(optionsExport, workspace = process.cwd(), global
|
|
|
742
742
|
const tsconfig = await loadTsconfig(outputOptions.tsconfig ?? globalOptions.tsconfig, workspace);
|
|
743
743
|
const packageJson = await loadPackageJson(outputOptions.packageJson ?? globalOptions.packageJson, workspace);
|
|
744
744
|
const mockOption = outputOptions.mock ?? globalOptions.mock;
|
|
745
|
-
let mock
|
|
746
|
-
if (isBoolean(mockOption) && mockOption) mock
|
|
747
|
-
else if (isFunction(mockOption)) mock
|
|
748
|
-
else if (mockOption) mock
|
|
745
|
+
let mock;
|
|
746
|
+
if (isBoolean(mockOption) && mockOption) mock = DEFAULT_MOCK_OPTIONS;
|
|
747
|
+
else if (isFunction(mockOption)) mock = mockOption;
|
|
748
|
+
else if (mockOption) mock = {
|
|
749
749
|
...DEFAULT_MOCK_OPTIONS,
|
|
750
750
|
...mockOption
|
|
751
751
|
};
|
|
752
|
-
else mock
|
|
752
|
+
else mock = void 0;
|
|
753
753
|
const defaultFileExtension = ".ts";
|
|
754
754
|
const globalQueryOptions = {
|
|
755
755
|
useQuery: true,
|
|
@@ -778,7 +778,7 @@ async function normalizeOptions(optionsExport, workspace = process.cwd(), global
|
|
|
778
778
|
client: outputOptions.client ?? client ?? OutputClient.AXIOS_FUNCTIONS,
|
|
779
779
|
httpClient: outputOptions.httpClient ?? httpClient ?? ((outputOptions.client ?? client) === OutputClient.ANGULAR_QUERY ? OutputHttpClient.ANGULAR : OutputHttpClient.FETCH),
|
|
780
780
|
mode: normalizeOutputMode(outputOptions.mode ?? mode),
|
|
781
|
-
mock
|
|
781
|
+
mock,
|
|
782
782
|
clean: outputOptions.clean ?? clean ?? false,
|
|
783
783
|
docs: outputOptions.docs ?? false,
|
|
784
784
|
prettier: outputOptions.prettier ?? prettier ?? false,
|
|
@@ -890,13 +890,13 @@ async function normalizeOptions(optionsExport, workspace = process.cwd(), global
|
|
|
890
890
|
},
|
|
891
891
|
hooks: options.hooks ? normalizeHooks(options.hooks) : {}
|
|
892
892
|
};
|
|
893
|
-
if (!normalizedOptions.input.target) throw new Error(
|
|
894
|
-
if (!normalizedOptions.output.target && !normalizedOptions.output.schemas) throw new Error(
|
|
893
|
+
if (!normalizedOptions.input.target) throw new Error(styleText("red", `Config require an input target`));
|
|
894
|
+
if (!normalizedOptions.output.target && !normalizedOptions.output.schemas) throw new Error(styleText("red", `Config require an output target or schemas`));
|
|
895
895
|
return normalizedOptions;
|
|
896
896
|
}
|
|
897
897
|
function normalizeMutator(workspace, mutator) {
|
|
898
898
|
if (isObject(mutator)) {
|
|
899
|
-
if (!mutator.path) throw new Error(
|
|
899
|
+
if (!mutator.path) throw new Error(styleText("red", `Mutator need a path`));
|
|
900
900
|
return {
|
|
901
901
|
...mutator,
|
|
902
902
|
path: upath.resolve(workspace, mutator.path),
|
|
@@ -909,51 +909,51 @@ function normalizeMutator(workspace, mutator) {
|
|
|
909
909
|
};
|
|
910
910
|
return mutator;
|
|
911
911
|
}
|
|
912
|
-
function normalizePathOrUrl(path
|
|
913
|
-
if (isString(path
|
|
914
|
-
return path
|
|
912
|
+
function normalizePathOrUrl(path, workspace) {
|
|
913
|
+
if (isString(path) && !isUrl(path)) return normalizePath(path, workspace);
|
|
914
|
+
return path;
|
|
915
915
|
}
|
|
916
|
-
function normalizePath(path
|
|
917
|
-
if (!isString(path
|
|
918
|
-
return upath.resolve(workspace, path
|
|
916
|
+
function normalizePath(path, workspace) {
|
|
917
|
+
if (!isString(path)) return path;
|
|
918
|
+
return upath.resolve(workspace, path);
|
|
919
919
|
}
|
|
920
920
|
function normalizeOperationsAndTags(operationsOrTags, workspace, global) {
|
|
921
|
-
return Object.fromEntries(Object.entries(operationsOrTags).map(([key, { transformer, mutator, formData, formUrlEncoded, paramsSerializer, query
|
|
921
|
+
return Object.fromEntries(Object.entries(operationsOrTags).map(([key, { transformer, mutator, formData, formUrlEncoded, paramsSerializer, query, zod, ...rest }]) => {
|
|
922
922
|
return [key, {
|
|
923
923
|
...rest,
|
|
924
|
-
...query
|
|
925
|
-
...zod
|
|
924
|
+
...query ? { query: normalizeQueryOptions(query, workspace, global.query) } : {},
|
|
925
|
+
...zod ? { zod: {
|
|
926
926
|
strict: {
|
|
927
|
-
param: zod
|
|
928
|
-
query: zod
|
|
929
|
-
header: zod
|
|
930
|
-
body: zod
|
|
931
|
-
response: zod
|
|
927
|
+
param: zod.strict?.param ?? false,
|
|
928
|
+
query: zod.strict?.query ?? false,
|
|
929
|
+
header: zod.strict?.header ?? false,
|
|
930
|
+
body: zod.strict?.body ?? false,
|
|
931
|
+
response: zod.strict?.response ?? false
|
|
932
932
|
},
|
|
933
933
|
generate: {
|
|
934
|
-
param: zod
|
|
935
|
-
query: zod
|
|
936
|
-
header: zod
|
|
937
|
-
body: zod
|
|
938
|
-
response: zod
|
|
934
|
+
param: zod.generate?.param ?? true,
|
|
935
|
+
query: zod.generate?.query ?? true,
|
|
936
|
+
header: zod.generate?.header ?? true,
|
|
937
|
+
body: zod.generate?.body ?? true,
|
|
938
|
+
response: zod.generate?.response ?? true
|
|
939
939
|
},
|
|
940
940
|
coerce: {
|
|
941
|
-
param: zod
|
|
942
|
-
query: zod
|
|
943
|
-
header: zod
|
|
944
|
-
body: zod
|
|
945
|
-
response: zod
|
|
941
|
+
param: zod.coerce?.param ?? false,
|
|
942
|
+
query: zod.coerce?.query ?? false,
|
|
943
|
+
header: zod.coerce?.header ?? false,
|
|
944
|
+
body: zod.coerce?.body ?? false,
|
|
945
|
+
response: zod.coerce?.response ?? false
|
|
946
946
|
},
|
|
947
947
|
preprocess: {
|
|
948
|
-
...zod
|
|
949
|
-
...zod
|
|
950
|
-
...zod
|
|
951
|
-
...zod
|
|
952
|
-
...zod
|
|
948
|
+
...zod.preprocess?.param ? { param: normalizeMutator(workspace, zod.preprocess.param) } : {},
|
|
949
|
+
...zod.preprocess?.query ? { query: normalizeMutator(workspace, zod.preprocess.query) } : {},
|
|
950
|
+
...zod.preprocess?.header ? { header: normalizeMutator(workspace, zod.preprocess.header) } : {},
|
|
951
|
+
...zod.preprocess?.body ? { body: normalizeMutator(workspace, zod.preprocess.body) } : {},
|
|
952
|
+
...zod.preprocess?.response ? { response: normalizeMutator(workspace, zod.preprocess.response) } : {}
|
|
953
953
|
},
|
|
954
|
-
generateEachHttpStatus: zod
|
|
955
|
-
dateTimeOptions: zod
|
|
956
|
-
timeOptions: zod
|
|
954
|
+
generateEachHttpStatus: zod.generateEachHttpStatus ?? false,
|
|
955
|
+
dateTimeOptions: zod.dateTimeOptions ?? {},
|
|
956
|
+
timeOptions: zod.timeOptions ?? {}
|
|
957
957
|
} } : {},
|
|
958
958
|
...transformer ? { transformer: normalizePath(transformer, workspace) } : {},
|
|
959
959
|
...mutator ? { mutator: normalizeMutator(workspace, mutator) } : {},
|
|
@@ -966,7 +966,7 @@ function normalizeOperationsAndTags(operationsOrTags, workspace, global) {
|
|
|
966
966
|
function normalizeOutputMode(mode) {
|
|
967
967
|
if (!mode) return OutputMode.SINGLE;
|
|
968
968
|
if (!Object.values(OutputMode).includes(mode)) {
|
|
969
|
-
createLogger().warn(
|
|
969
|
+
createLogger().warn(styleText("yellow", `Unknown the provided mode => ${mode}`));
|
|
970
970
|
return OutputMode.SINGLE;
|
|
971
971
|
}
|
|
972
972
|
return mode;
|
|
@@ -980,12 +980,12 @@ function normalizeHooks(hooks) {
|
|
|
980
980
|
else if (isObject(hooks[key])) result[key] = [hooks[key]];
|
|
981
981
|
return result;
|
|
982
982
|
}
|
|
983
|
-
function normalizeHonoOptions(hono
|
|
983
|
+
function normalizeHonoOptions(hono = {}, workspace) {
|
|
984
984
|
return {
|
|
985
|
-
...hono
|
|
986
|
-
compositeRoute: hono
|
|
987
|
-
validator: hono
|
|
988
|
-
validatorOutputPath: hono
|
|
985
|
+
...hono.handlers ? { handlers: upath.resolve(workspace, hono.handlers) } : {},
|
|
986
|
+
compositeRoute: hono.compositeRoute ?? "",
|
|
987
|
+
validator: hono.validator ?? true,
|
|
988
|
+
validatorOutputPath: hono.validatorOutputPath ? upath.resolve(workspace, hono.validatorOutputPath) : ""
|
|
989
989
|
};
|
|
990
990
|
}
|
|
991
991
|
function normalizeJSDocOptions(jsdoc = {}) {
|
|
@@ -1029,12 +1029,12 @@ function normalizeQueryOptions(queryOptions = {}, outputWorkspace, globalOptions
|
|
|
1029
1029
|
...isNullish(queryOptions.runtimeValidation) ? {} : { runtimeValidation: queryOptions.runtimeValidation }
|
|
1030
1030
|
};
|
|
1031
1031
|
}
|
|
1032
|
-
function getDefaultFilesHeader({ title, description
|
|
1032
|
+
function getDefaultFilesHeader({ title, description, version: version$1 } = {}) {
|
|
1033
1033
|
return [
|
|
1034
1034
|
`Generated by ${name} v${version} 🍺`,
|
|
1035
1035
|
`Do not edit manually.`,
|
|
1036
1036
|
...title ? [title] : [],
|
|
1037
|
-
...description
|
|
1037
|
+
...description ? [description] : [],
|
|
1038
1038
|
...version$1 ? [`OpenAPI spec version: ${version$1}`] : []
|
|
1039
1039
|
];
|
|
1040
1040
|
}
|
|
@@ -1086,15 +1086,15 @@ export type ${schemaName} = zod.input<typeof ${schemaName}>;`;
|
|
|
1086
1086
|
}).join("\n\n")}
|
|
1087
1087
|
`;
|
|
1088
1088
|
}
|
|
1089
|
-
const isValidSchemaIdentifier = (name
|
|
1090
|
-
const isPrimitiveSchemaName = (name
|
|
1089
|
+
const isValidSchemaIdentifier = (name) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(name);
|
|
1090
|
+
const isPrimitiveSchemaName = (name) => [
|
|
1091
1091
|
"string",
|
|
1092
1092
|
"number",
|
|
1093
1093
|
"boolean",
|
|
1094
1094
|
"void",
|
|
1095
1095
|
"unknown",
|
|
1096
1096
|
"Blob"
|
|
1097
|
-
].includes(name
|
|
1097
|
+
].includes(name);
|
|
1098
1098
|
const dedupeSchemasByName = (schemas) => {
|
|
1099
1099
|
const uniqueSchemas = /* @__PURE__ */ new Map();
|
|
1100
1100
|
for (const schema of schemas) if (!uniqueSchemas.has(schema.name)) uniqueSchemas.set(schema.name, schema);
|
|
@@ -1134,9 +1134,9 @@ async function writeZodSchemas(builder, schemasPath, fileExtension, header, outp
|
|
|
1134
1134
|
const strict = output.override.zod.strict.body;
|
|
1135
1135
|
const coerce = output.override.zod.coerce.body;
|
|
1136
1136
|
for (const generatorSchema of schemasWithOpenApiDef) {
|
|
1137
|
-
const { name
|
|
1137
|
+
const { name, schema: schemaObject } = generatorSchema;
|
|
1138
1138
|
if (!schemaObject) continue;
|
|
1139
|
-
const fileName = conventionName(name
|
|
1139
|
+
const fileName = conventionName(name, output.namingConvention);
|
|
1140
1140
|
const filePath = upath.join(schemasPath, `${fileName}${fileExtension}`);
|
|
1141
1141
|
const context = {
|
|
1142
1142
|
spec: builder.spec,
|
|
@@ -1144,9 +1144,9 @@ async function writeZodSchemas(builder, schemasPath, fileExtension, header, outp
|
|
|
1144
1144
|
workspace: "",
|
|
1145
1145
|
output
|
|
1146
1146
|
};
|
|
1147
|
-
const parsedZodDefinition = parseZodValidationSchemaDefinition(generateZodValidationSchemaDefinition(dereference(schemaObject, context), context, name
|
|
1147
|
+
const parsedZodDefinition = parseZodValidationSchemaDefinition(generateZodValidationSchemaDefinition(dereference(schemaObject, context), context, name, strict, isZodV4, { required: true }), context, coerce, strict, isZodV4);
|
|
1148
1148
|
schemasToWrite.push({
|
|
1149
|
-
schemaName: name
|
|
1149
|
+
schemaName: name,
|
|
1150
1150
|
filePath,
|
|
1151
1151
|
consts: parsedZodDefinition.consts,
|
|
1152
1152
|
zodExpression: parsedZodDefinition.zod
|
|
@@ -1181,7 +1181,7 @@ async function writeZodSchemasFromVerbs(verbOptions, schemasPath, fileExtension,
|
|
|
1181
1181
|
schema: {
|
|
1182
1182
|
type: "object",
|
|
1183
1183
|
properties: Object.fromEntries(queryParams.filter((p) => "schema" in p && p.schema).map((p) => [p.name, dereference(p.schema, zodContext)])),
|
|
1184
|
-
required: queryParams.filter((p) => p.required).map((p) => p.name).filter((name
|
|
1184
|
+
required: queryParams.filter((p) => p.required).map((p) => p.name).filter((name) => name !== void 0)
|
|
1185
1185
|
}
|
|
1186
1186
|
}] : [];
|
|
1187
1187
|
const headerParams = parameters?.filter((p) => "in" in p && p.in === "header");
|
|
@@ -1190,7 +1190,7 @@ async function writeZodSchemasFromVerbs(verbOptions, schemasPath, fileExtension,
|
|
|
1190
1190
|
schema: {
|
|
1191
1191
|
type: "object",
|
|
1192
1192
|
properties: Object.fromEntries(headerParams.filter((p) => "schema" in p && p.schema).map((p) => [p.name, dereference(p.schema, zodContext)])),
|
|
1193
|
-
required: headerParams.filter((p) => p.required).map((p) => p.name).filter((name
|
|
1193
|
+
required: headerParams.filter((p) => p.required).map((p) => p.name).filter((name) => name !== void 0)
|
|
1194
1194
|
}
|
|
1195
1195
|
}] : [];
|
|
1196
1196
|
const responseSchemas = [...verbOption.response.types.success, ...verbOption.response.types.errors].filter((responseType) => !!responseType.originalSchema && !responseType.isRef && isValidSchemaIdentifier(responseType.value) && !isPrimitiveSchemaName(responseType.value)).map((responseType) => ({
|
|
@@ -1205,12 +1205,12 @@ async function writeZodSchemasFromVerbs(verbOptions, schemasPath, fileExtension,
|
|
|
1205
1205
|
]);
|
|
1206
1206
|
}));
|
|
1207
1207
|
const schemasToWrite = [];
|
|
1208
|
-
for (const { name
|
|
1209
|
-
const fileName = conventionName(name
|
|
1208
|
+
for (const { name, schema } of uniqueVerbsSchemas) {
|
|
1209
|
+
const fileName = conventionName(name, output.namingConvention);
|
|
1210
1210
|
const filePath = upath.join(schemasPath, `${fileName}${fileExtension}`);
|
|
1211
|
-
const parsedZodDefinition = parseZodValidationSchemaDefinition(generateZodValidationSchemaDefinition(schema, zodContext, name
|
|
1211
|
+
const parsedZodDefinition = parseZodValidationSchemaDefinition(generateZodValidationSchemaDefinition(schema, zodContext, name, strict, isZodV4, { required: true }), zodContext, coerce, strict, isZodV4);
|
|
1212
1212
|
schemasToWrite.push({
|
|
1213
|
-
schemaName: name
|
|
1213
|
+
schemaName: name,
|
|
1214
1214
|
filePath,
|
|
1215
1215
|
consts: parsedZodDefinition.consts,
|
|
1216
1216
|
zodExpression: parsedZodDefinition.zod
|
|
@@ -1350,7 +1350,7 @@ async function writeSpecs(builder, workspace, options, projectName) {
|
|
|
1350
1350
|
});
|
|
1351
1351
|
if (output.workspace) {
|
|
1352
1352
|
const workspacePath = output.workspace;
|
|
1353
|
-
const imports = implementationPaths.filter((path
|
|
1353
|
+
const imports = implementationPaths.filter((path) => !output.mock || !path.endsWith(`.${getMockFileExtensionByTypeName(output.mock)}.ts`)).map((path) => upath.relativeSafe(workspacePath, getFileInfo(path).pathWithoutExtension));
|
|
1354
1354
|
if (output.schemas) {
|
|
1355
1355
|
const schemasPath = isString(output.schemas) ? output.schemas : output.schemas.path;
|
|
1356
1356
|
imports.push(upath.relativeSafe(workspacePath, getFileInfo(schemasPath).dirname));
|
|
@@ -1386,7 +1386,7 @@ async function writeSpecs(builder, workspace, options, projectName) {
|
|
|
1386
1386
|
} catch (error) {
|
|
1387
1387
|
let message = `⚠️ ${projectTitle ? `${projectTitle} - ` : ""}biome not found`;
|
|
1388
1388
|
if (error instanceof ExecaError && error.exitCode === 1) message = error.message;
|
|
1389
|
-
log(
|
|
1389
|
+
log(styleText("yellow", message));
|
|
1390
1390
|
}
|
|
1391
1391
|
if (output.docs) try {
|
|
1392
1392
|
let config = {};
|
|
@@ -1414,8 +1414,7 @@ async function writeSpecs(builder, workspace, options, projectName) {
|
|
|
1414
1414
|
if (output.prettier) await formatWithPrettier([outputPath], projectTitle);
|
|
1415
1415
|
} else throw new Error("TypeDoc not initialized");
|
|
1416
1416
|
} catch (error) {
|
|
1417
|
-
|
|
1418
|
-
log(chalk.yellow(message));
|
|
1417
|
+
log(styleText("yellow", error instanceof Error ? error.message : `⚠️ ${projectTitle ? `${projectTitle} - ` : ""}Unable to generate docs`));
|
|
1419
1418
|
}
|
|
1420
1419
|
createSuccessMessage(projectTitle);
|
|
1421
1420
|
}
|
|
@@ -1515,4 +1514,4 @@ async function loadConfigFile(configFilePath) {
|
|
|
1515
1514
|
|
|
1516
1515
|
//#endregion
|
|
1517
1516
|
export { defineConfig as a, description as c, startWatcher as i, name as l, loadConfigFile as n, defineTransformer as o, generateSpec as r, normalizeOptions as s, findConfigFile as t, version as u };
|
|
1518
|
-
//# sourceMappingURL=config-
|
|
1517
|
+
//# sourceMappingURL=config-By98GXtB.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-By98GXtB.mjs","names":["validateSpec","isNullish","fs","pkg.name","pkg.version","version","fs"],"sources":["../package.json","../src/client.ts","../src/api.ts","../src/import-open-api.ts","../src/import-specs.ts","../src/formatters/prettier.ts","../src/utils/execute-hook.ts","../src/utils/package-json.ts","../src/utils/tsconfig.ts","../src/utils/options.ts","../src/utils/watcher.ts","../src/write-zod-specs.ts","../src/write-specs.ts","../src/generate-spec.ts","../src/utils/config.ts"],"sourcesContent":["","import angular from '@orval/angular';\nimport axios from '@orval/axios';\nimport {\n asyncReduce,\n type ClientFileBuilder,\n type ClientMockBuilder,\n type ClientMockGeneratorBuilder,\n type ContextSpec,\n generateDependencyImports,\n type GeneratorClientFooter,\n type GeneratorClientHeader,\n type GeneratorClientImports,\n type GeneratorClients,\n type GeneratorClientTitle,\n type GeneratorOperations,\n type GeneratorOptions,\n type GeneratorVerbOptions,\n type GeneratorVerbsOptions,\n isFunction,\n type NormalizedOutputOptions,\n OutputClient,\n type OutputClientFunc,\n pascal,\n} from '@orval/core';\nimport fetchClient from '@orval/fetch';\nimport hono from '@orval/hono';\nimport mcp from '@orval/mcp';\nimport * as mock from '@orval/mock';\nimport query from '@orval/query';\nimport solidStart from '@orval/solid-start';\nimport swr from '@orval/swr';\nimport zod from '@orval/zod';\n\nconst DEFAULT_CLIENT = OutputClient.AXIOS;\n\nconst getGeneratorClient = (\n outputClient: OutputClient | OutputClientFunc,\n output: NormalizedOutputOptions,\n) => {\n const GENERATOR_CLIENT: GeneratorClients = {\n axios: axios({ type: 'axios' })(),\n 'axios-functions': axios({ type: 'axios-functions' })(),\n angular: angular()(),\n 'angular-query': query({ output, type: 'angular-query' })(),\n 'react-query': query({ output, type: 'react-query' })(),\n 'solid-start': solidStart()(),\n 'solid-query': query({ output, type: 'solid-query' })(),\n 'svelte-query': query({ output, type: 'svelte-query' })(),\n 'vue-query': query({ output, type: 'vue-query' })(),\n swr: swr()(),\n zod: zod()(),\n hono: hono()(),\n fetch: fetchClient()(),\n mcp: mcp()(),\n };\n\n const generator = isFunction(outputClient)\n ? outputClient(GENERATOR_CLIENT)\n : GENERATOR_CLIENT[outputClient];\n\n return generator;\n};\n\nexport const generateClientImports: GeneratorClientImports = ({\n client,\n implementation,\n imports,\n projectName,\n hasSchemaDir,\n isAllowSyntheticDefaultImports,\n hasGlobalMutator,\n hasTagsMutator,\n hasParamsSerializerOptions,\n packageJson,\n output,\n}) => {\n const { dependencies } = getGeneratorClient(client, output);\n return generateDependencyImports(\n implementation,\n dependencies\n ? [\n ...dependencies(\n hasGlobalMutator,\n hasParamsSerializerOptions,\n packageJson,\n output.httpClient,\n hasTagsMutator,\n output.override,\n ),\n ...imports,\n ]\n : imports,\n projectName,\n hasSchemaDir,\n isAllowSyntheticDefaultImports,\n );\n};\n\nexport const generateClientHeader: GeneratorClientHeader = ({\n outputClient = DEFAULT_CLIENT,\n isRequestOptions,\n isGlobalMutator,\n isMutator,\n provideIn,\n hasAwaitedType,\n titles,\n output,\n verbOptions,\n tag,\n clientImplementation,\n}) => {\n const { header } = getGeneratorClient(outputClient, output);\n return {\n implementation: header\n ? header({\n title: titles.implementation,\n isRequestOptions,\n isGlobalMutator,\n isMutator,\n provideIn,\n hasAwaitedType,\n output,\n verbOptions,\n tag,\n clientImplementation,\n })\n : '',\n implementationMock: `export const ${titles.implementationMock} = () => [\\n`,\n };\n};\n\nexport const generateClientFooter: GeneratorClientFooter = ({\n outputClient,\n operationNames,\n hasMutator,\n hasAwaitedType,\n titles,\n output,\n}) => {\n const { footer } = getGeneratorClient(outputClient, output);\n\n if (!footer) {\n return {\n implementation: '',\n implementationMock: `\\n]\\n`,\n };\n }\n\n let implementation: string;\n try {\n if (isFunction(outputClient)) {\n implementation = (footer as (operationNames: string[]) => string)(\n operationNames,\n );\n // being here means that the previous call worked\n console.warn(\n '[WARN] Passing an array of strings for operations names to the footer function is deprecated and will be removed in a future major release. Please pass them in an object instead: { operationNames: string[] }.',\n );\n } else {\n implementation = footer({\n operationNames,\n title: titles.implementation,\n hasMutator,\n hasAwaitedType,\n });\n }\n } catch {\n implementation = footer({\n operationNames,\n title: titles.implementation,\n hasMutator,\n hasAwaitedType,\n });\n }\n\n return {\n implementation,\n implementationMock: `]\\n`,\n };\n};\n\nexport const generateClientTitle: GeneratorClientTitle = ({\n outputClient = DEFAULT_CLIENT,\n title,\n customTitleFunc,\n output,\n}) => {\n const { title: generatorTitle } = getGeneratorClient(outputClient, output);\n\n if (!generatorTitle) {\n return {\n implementation: '',\n implementationMock: `get${pascal(title)}Mock`,\n };\n }\n\n if (customTitleFunc) {\n const customTitle = customTitleFunc(title);\n return {\n implementation: generatorTitle(customTitle),\n implementationMock: `get${pascal(customTitle)}Mock`,\n };\n }\n return {\n implementation: generatorTitle(title),\n implementationMock: `get${pascal(title)}Mock`,\n };\n};\n\nconst generateMock = (\n verbOption: GeneratorVerbOptions,\n options: GeneratorOptions,\n): ClientMockGeneratorBuilder => {\n if (!options.mock) {\n return {\n implementation: {\n function: '',\n handler: '',\n handlerName: '',\n },\n imports: [],\n };\n }\n\n if (isFunction(options.mock)) {\n return options.mock(verbOption, options);\n }\n\n return mock.generateMock(\n verbOption,\n options as typeof options & {\n mock: Exclude<(typeof options)['mock'], ClientMockBuilder | undefined>;\n },\n );\n};\n\nexport const generateOperations = (\n outputClient: OutputClient | OutputClientFunc = DEFAULT_CLIENT,\n verbsOptions: GeneratorVerbsOptions,\n options: GeneratorOptions,\n output: NormalizedOutputOptions,\n): Promise<GeneratorOperations> => {\n return asyncReduce(\n verbsOptions,\n async (acc, verbOption) => {\n const { client: generatorClient } = getGeneratorClient(\n outputClient,\n output,\n );\n const client = await generatorClient(\n verbOption,\n options,\n outputClient,\n output,\n );\n\n if (!client.implementation) {\n return acc;\n }\n\n const generatedMock = generateMock(verbOption, options);\n\n acc[verbOption.operationId] = {\n implementation: verbOption.doc + client.implementation,\n imports: client.imports,\n implementationMock: generatedMock.implementation,\n importsMock: generatedMock.imports,\n tags: verbOption.tags,\n mutator: verbOption.mutator,\n clientMutators: client.mutators,\n formData: verbOption.formData,\n formUrlEncoded: verbOption.formUrlEncoded,\n paramsSerializer: verbOption.paramsSerializer,\n operationName: verbOption.operationName,\n fetchReviver: verbOption.fetchReviver,\n };\n\n return acc;\n },\n {} as GeneratorOperations,\n );\n};\n\nexport const generateExtraFiles = (\n outputClient: OutputClient | OutputClientFunc = DEFAULT_CLIENT,\n verbsOptions: Record<string, GeneratorVerbOptions>,\n output: NormalizedOutputOptions,\n context: ContextSpec,\n): Promise<ClientFileBuilder[]> => {\n const { extraFiles: generateExtraFiles } = getGeneratorClient(\n outputClient,\n output,\n );\n\n if (!generateExtraFiles) {\n return Promise.resolve([]);\n }\n\n return generateExtraFiles(verbsOptions, output, context);\n};\n","import {\n asyncReduce,\n type ContextSpec,\n generateVerbsOptions,\n type GeneratorApiBuilder,\n type GeneratorApiOperations,\n type GeneratorSchema,\n getFullRoute,\n getRoute,\n GetterPropType,\n isReference,\n type NormalizedInputOptions,\n type NormalizedOutputOptions,\n type OpenApiPathItemObject,\n resolveRef,\n} from '@orval/core';\nimport { generateMockImports } from '@orval/mock';\n\nimport {\n generateClientFooter,\n generateClientHeader,\n generateClientImports,\n generateClientTitle,\n generateExtraFiles,\n generateOperations,\n} from './client';\n\nexport async function getApiBuilder({\n input,\n output,\n context,\n}: {\n input: NormalizedInputOptions;\n output: NormalizedOutputOptions;\n context: ContextSpec;\n}): Promise<GeneratorApiBuilder> {\n const api = await asyncReduce(\n Object.entries(context.spec.paths ?? {}),\n async (acc, [pathRoute, verbs]) => {\n const route = getRoute(pathRoute);\n\n let resolvedVerbs = verbs;\n\n if (isReference(verbs)) {\n const { schema } = resolveRef<OpenApiPathItemObject>(verbs, context);\n\n resolvedVerbs = schema;\n }\n\n let verbsOptions = await generateVerbsOptions({\n verbs: resolvedVerbs,\n input,\n output,\n route,\n pathRoute,\n context,\n });\n\n // GitHub #564 check if we want to exclude deprecated operations\n if (output.override.useDeprecatedOperations === false) {\n verbsOptions = verbsOptions.filter((verb) => {\n return !verb.deprecated;\n });\n }\n\n const schemas: GeneratorSchema[] = [];\n for (const {\n queryParams,\n headers,\n body,\n response,\n props,\n } of verbsOptions) {\n schemas.push(\n ...props.flatMap((param) =>\n param.type === GetterPropType.NAMED_PATH_PARAMS ? param.schema : [],\n ),\n );\n if (queryParams) {\n schemas.push(queryParams.schema, ...queryParams.deps);\n }\n if (headers) {\n schemas.push(headers.schema, ...headers.deps);\n }\n\n schemas.push(...body.schemas, ...response.schemas);\n }\n\n const fullRoute = getFullRoute(\n route,\n verbs.servers ?? context.spec.servers,\n output.baseUrl,\n );\n if (!output.target) {\n throw new Error('Output does not have a target');\n }\n const pathOperations = await generateOperations(\n output.client,\n verbsOptions,\n {\n route: fullRoute,\n pathRoute,\n override: output.override,\n context,\n mock: output.mock,\n output: output.target,\n },\n output,\n );\n\n for (const verbOption of verbsOptions) {\n acc.verbOptions[verbOption.operationId] = verbOption;\n }\n acc.schemas.push(...schemas);\n acc.operations = { ...acc.operations, ...pathOperations };\n\n return acc;\n },\n {\n operations: {},\n verbOptions: {},\n schemas: [],\n } as GeneratorApiOperations,\n );\n\n const extraFiles = await generateExtraFiles(\n output.client,\n api.verbOptions,\n output,\n context,\n );\n\n return {\n operations: api.operations,\n schemas: api.schemas,\n verbOptions: api.verbOptions,\n title: generateClientTitle,\n header: generateClientHeader,\n footer: generateClientFooter,\n imports: generateClientImports,\n importsMock: generateMockImports,\n extraFiles,\n };\n}\n","import {\n type ContextSpec,\n dynamicImport,\n generateComponentDefinition,\n generateParameterDefinition,\n generateSchemasDefinition,\n type ImportOpenApi,\n type InputOptions,\n type NormalizedOutputOptions,\n type OpenApiComponentsObject,\n type OpenApiDocument,\n type OverrideInput,\n type WriteSpecBuilder,\n} from '@orval/core';\nimport { validate } from '@scalar/openapi-parser';\n\nimport { getApiBuilder } from './api';\n\nexport async function importOpenApi({\n spec,\n input,\n output,\n target,\n workspace,\n projectName,\n}: ImportOpenApi): Promise<WriteSpecBuilder> {\n const transformedOpenApi = await applyTransformer(\n spec,\n input.override.transformer,\n workspace,\n );\n\n const schemas = getApiSchemas({\n input,\n output,\n target,\n workspace,\n spec: transformedOpenApi,\n });\n\n const api = await getApiBuilder({\n input,\n output,\n context: {\n projectName,\n target,\n workspace,\n spec: transformedOpenApi,\n output,\n } satisfies ContextSpec,\n });\n\n return {\n ...api,\n schemas: [...schemas, ...api.schemas],\n target,\n // a valid spec will have info\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n info: transformedOpenApi.info!,\n spec: transformedOpenApi,\n };\n}\n\nasync function applyTransformer(\n openApi: OpenApiDocument,\n transformer: OverrideInput['transformer'],\n workspace: string,\n): Promise<OpenApiDocument> {\n const transformerFn = transformer\n ? await dynamicImport(transformer, workspace)\n : undefined;\n\n if (!transformerFn) {\n return openApi;\n }\n\n const transformedOpenApi = transformerFn(openApi);\n\n const { valid, errors } = await validate(transformedOpenApi);\n if (!valid) {\n throw new Error(`Validation failed`, { cause: errors });\n }\n\n return transformedOpenApi;\n}\n\ninterface GetApiSchemasOptions {\n input: InputOptions;\n output: NormalizedOutputOptions;\n workspace: string;\n target: string;\n spec: OpenApiDocument;\n}\n\nfunction getApiSchemas({\n input,\n output,\n target,\n workspace,\n spec,\n}: GetApiSchemasOptions) {\n const context: ContextSpec = {\n target,\n workspace,\n spec,\n output,\n };\n\n const schemaDefinition = generateSchemasDefinition(\n spec.components?.schemas,\n context,\n output.override.components.schemas.suffix,\n input.filters,\n );\n\n const responseDefinition = generateComponentDefinition(\n spec.components?.responses,\n context,\n output.override.components.responses.suffix,\n );\n\n const swaggerResponseDefinition = generateComponentDefinition(\n 'responses' in spec\n ? (spec as { responses?: OpenApiComponentsObject['responses'] }).responses\n : undefined,\n context,\n '',\n );\n\n const bodyDefinition = generateComponentDefinition(\n spec.components?.requestBodies,\n context,\n output.override.components.requestBodies.suffix,\n );\n\n const parameters = generateParameterDefinition(\n spec.components?.parameters,\n context,\n output.override.components.parameters.suffix,\n );\n\n const schemas = [\n ...schemaDefinition,\n ...responseDefinition,\n ...swaggerResponseDefinition,\n ...bodyDefinition,\n ...parameters,\n ];\n\n return schemas;\n}\n","import {\n isObject,\n isString,\n type NormalizedOptions,\n type OpenApiDocument,\n type WriteSpecBuilder,\n} from '@orval/core';\nimport { bundle } from '@scalar/json-magic/bundle';\nimport {\n fetchUrls,\n parseJson,\n parseYaml,\n readFiles,\n} from '@scalar/json-magic/bundle/plugins/node';\nimport { upgrade, validate as validateSpec } from '@scalar/openapi-parser';\nimport { isNullish } from 'remeda';\n\nimport { importOpenApi } from './import-open-api';\n\nasync function resolveSpec(\n input: string | Record<string, unknown>,\n parserOptions?: {\n headers?: {\n domains: string[];\n headers: Record<string, string>;\n }[];\n },\n): Promise<OpenApiDocument> {\n const data = await bundle(input, {\n plugins: [\n readFiles(),\n fetchUrls({\n headers: parserOptions?.headers,\n }),\n parseJson(),\n parseYaml(),\n ],\n treeShake: false,\n });\n const dereferencedData = dereferenceExternalRef(\n data as Record<string, unknown>,\n );\n const { valid, errors } = await validateSpec(dereferencedData);\n if (!valid) {\n throw new Error('Validation failed', { cause: errors });\n }\n\n const { specification } = upgrade(dereferencedData);\n\n return specification;\n}\n\nexport async function importSpecs(\n workspace: string,\n options: NormalizedOptions,\n projectName?: string,\n): Promise<WriteSpecBuilder> {\n const { input, output } = options;\n\n const spec = await resolveSpec(input.target, input.parserOptions);\n\n return importOpenApi({\n spec,\n input,\n output,\n target: input.target,\n workspace,\n projectName,\n });\n}\n\n/**\n * The plugins from `@scalar/json-magic` does not dereference $ref.\n * Instead it fetches them and puts them under x-ext, and changes the $ref to point to #x-ext/<name>.\n * This function:\n * 1. Merges external schemas into main spec's components.schemas (with collision handling)\n * 2. Replaces x-ext refs with standard component refs or inlined content\n */\nexport function dereferenceExternalRef(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const extensions = (data['x-ext'] ?? {}) as Record<string, unknown>;\n\n // Step 1: Merge external schemas into main spec with collision handling\n const schemaNameMappings = mergeExternalSchemas(data, extensions);\n\n // Step 2: Replace all x-ext refs throughout the document\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (key !== 'x-ext') {\n result[key] = replaceXExtRefs(value, extensions, schemaNameMappings);\n }\n }\n\n return result;\n}\n\n/**\n * Merge external document schemas into main spec's components.schemas\n * Returns mapping of original schema names to final names (with suffixes for collisions)\n */\nfunction mergeExternalSchemas(\n data: Record<string, unknown>,\n extensions: Record<string, unknown>,\n): Record<string, Record<string, string>> {\n const schemaNameMappings: Record<string, Record<string, string>> = {};\n\n data.components ??= {};\n const mainComponents = data.components as Record<string, unknown>;\n mainComponents.schemas ??= {};\n const mainSchemas = mainComponents.schemas as Record<string, unknown>;\n\n // Merge schemas from each external doc\n // Collision handling:\n // - If schema already exists in main spec, add x-ext key as suffix (e.g., User -> User_external1)\n // - x-ext refs in main spec get replaced by actual schema from external doc\n for (const [extKey, extDoc] of Object.entries(extensions)) {\n schemaNameMappings[extKey] = {};\n\n if (isObject(extDoc) && 'components' in extDoc) {\n const extComponents = (extDoc as Record<string, unknown>)\n .components as Record<string, unknown>;\n if (isObject(extComponents) && 'schemas' in extComponents) {\n const extSchemas = extComponents.schemas as Record<string, unknown>;\n for (const [schemaName, schema] of Object.entries(extSchemas)) {\n // Check if main schema is just an x-ext ref - if so, replace it without suffix\n const existingSchema = mainSchemas[schemaName];\n const isXExtRef =\n isObject(existingSchema) &&\n '$ref' in existingSchema &&\n isString((existingSchema as Record<string, unknown>).$ref) &&\n (\n (existingSchema as Record<string, unknown>).$ref as string\n ).startsWith('#/x-ext/');\n\n let finalSchemaName = schemaName;\n\n if (schemaName in mainSchemas && !isXExtRef) {\n // Collision: add suffix to external schema\n const suffix = extKey.replaceAll(/[^a-zA-Z0-9]/g, '_');\n finalSchemaName = `${schemaName}_${suffix}`;\n schemaNameMappings[extKey][schemaName] = finalSchemaName;\n } else {\n // No collision or replacing x-ext ref\n schemaNameMappings[extKey][schemaName] = schemaName;\n }\n\n mainSchemas[finalSchemaName] = scrubUnwantedKeys(schema);\n }\n }\n }\n }\n\n // Apply internal ref updates to all schemas from external docs\n for (const [extKey, mapping] of Object.entries(schemaNameMappings)) {\n for (const [, finalName] of Object.entries(mapping)) {\n const schema = mainSchemas[finalName];\n if (schema) {\n mainSchemas[finalName] = updateInternalRefs(\n schema,\n extKey,\n schemaNameMappings,\n ) as Record<string, unknown>;\n }\n }\n }\n\n return schemaNameMappings;\n}\n\n/**\n * Remove unwanted keys like $schema and $id from objects\n */\nfunction scrubUnwantedKeys(obj: unknown): unknown {\n const UNWANTED_KEYS = new Set(['$schema', '$id']);\n\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map((x) => scrubUnwantedKeys(x));\n if (isObject(obj)) {\n const rec = obj as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(rec)) {\n if (UNWANTED_KEYS.has(k)) continue;\n out[k] = scrubUnwantedKeys(v);\n }\n return out;\n }\n return obj;\n}\n\n/**\n * Update internal refs within an external schema to use suffixed names\n */\nfunction updateInternalRefs(\n obj: unknown,\n extKey: string,\n schemaNameMappings: Record<string, Record<string, string>>,\n): unknown {\n if (obj === null || obj === undefined) return obj;\n\n if (Array.isArray(obj)) {\n return obj.map((element) =>\n updateInternalRefs(element, extKey, schemaNameMappings),\n );\n }\n\n if (isObject(obj)) {\n const record = obj as Record<string, unknown>;\n\n // Check if this is a $ref to #/components/schemas/...\n if ('$ref' in record && isString(record.$ref)) {\n const refValue = record.$ref;\n if (refValue.startsWith('#/components/schemas/')) {\n const schemaName = refValue.replace('#/components/schemas/', '');\n // If this schema was mapped to a suffixed name, update the ref\n const mappedName = schemaNameMappings[extKey][schemaName];\n if (mappedName) {\n return {\n $ref: `#/components/schemas/${mappedName}`,\n };\n }\n }\n }\n\n // Recursively process all properties\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n result[key] = updateInternalRefs(value, extKey, schemaNameMappings);\n }\n return result;\n }\n\n return obj;\n}\n\n/**\n * Replace x-ext refs with either standard component refs or inlined content\n */\nfunction replaceXExtRefs(\n obj: unknown,\n extensions: Record<string, unknown>,\n schemaNameMappings: Record<string, Record<string, string>>,\n): unknown {\n if (isNullish(obj)) return obj;\n\n if (Array.isArray(obj)) {\n return obj.map((element) =>\n replaceXExtRefs(element, extensions, schemaNameMappings),\n );\n }\n\n if (isObject(obj)) {\n const record = obj;\n\n // Check if this object is a $ref to x-ext\n if ('$ref' in record && isString(record.$ref)) {\n const refValue = record.$ref;\n if (refValue.startsWith('#/x-ext/')) {\n // Parse the x-ext ref\n const pathStr = refValue.replace('#/x-ext/', '');\n const parts = pathStr.split('/');\n const extKey = parts.shift();\n\n if (extKey) {\n // Check if this is a ref to components/schemas - if so, replace with standard ref\n if (\n parts.length >= 3 &&\n parts[0] === 'components' &&\n parts[1] === 'schemas'\n ) {\n const schemaName = parts.slice(2).join('/');\n // Use the mapped name (which may include suffix for collisions)\n const finalName =\n schemaNameMappings[extKey][schemaName] || schemaName;\n return { $ref: `#/components/schemas/${finalName}` };\n }\n\n // Otherwise, inline the referenced content\n const extDoc = extensions[extKey];\n let refObj: unknown = extDoc;\n for (const p of parts) {\n if (\n refObj &&\n (isObject(refObj) || Array.isArray(refObj)) &&\n p in (refObj as Record<string, unknown>)\n ) {\n refObj = (refObj as Record<string, unknown>)[p];\n } else {\n refObj = undefined;\n break;\n }\n }\n\n if (refObj) {\n const cleaned = scrubUnwantedKeys(refObj);\n return replaceXExtRefs(cleaned, extensions, schemaNameMappings);\n }\n }\n }\n }\n\n // Recursively process all properties\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n result[key] = replaceXExtRefs(value, extensions, schemaNameMappings);\n }\n return result;\n }\n\n return obj;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { styleText } from 'node:util';\n\nimport { log } from '@orval/core';\nimport { execa } from 'execa';\n\n/**\n * Format files with prettier.\n * Tries the programmatic API first (project dependency),\n * then falls back to the globally installed CLI.\n */\nexport async function formatWithPrettier(\n paths: string[],\n projectTitle?: string,\n): Promise<void> {\n const prettier = await tryImportPrettier();\n\n if (prettier) {\n const filePaths = await collectFilePaths(paths);\n const config = await prettier.resolveConfig(filePaths[0]);\n await Promise.all(\n filePaths.map(async (filePath) => {\n const content = await fs.readFile(filePath, 'utf8');\n try {\n const formatted = await prettier.format(content, {\n ...config,\n // options.filepath can be specified for Prettier to infer the parser from the file extension\n filepath: filePath,\n });\n await fs.writeFile(filePath, formatted);\n } catch (error) {\n if (error instanceof Error) {\n // prettier currently doesn't export UndefinedParserError, so having to do it the crude way\n if (error.name === 'UndefinedParserError') {\n // skip files with unsupported parsers\n // https://prettier.io/docs/options#parser\n } else {\n log(\n styleText(\n 'yellow',\n `⚠️ ${projectTitle ? `${projectTitle} - ` : ''}Failed to format file ${filePath}: ${error.toString()}`,\n ),\n );\n }\n } else {\n log(\n styleText(\n 'yellow',\n `⚠️ ${projectTitle ? `${projectTitle} - ` : ''}Failed to format file ${filePath}: unknown error}`,\n ),\n );\n }\n }\n }),\n );\n\n return;\n }\n\n // fallback to globally installed prettier\n try {\n await execa('prettier', ['--write', ...paths]);\n } catch {\n log(\n styleText(\n 'yellow',\n `⚠️ ${projectTitle ? `${projectTitle} - ` : ''}prettier not found. Install it as a project dependency or globally.`,\n ),\n );\n }\n}\n\n/**\n * Try to import prettier from the project's dependencies.\n * Returns undefined if prettier is not installed.\n */\nasync function tryImportPrettier() {\n try {\n return await import('prettier');\n } catch {\n return;\n }\n}\n\n/**\n * Recursively collect absolute file paths from a mix of files and directories.\n */\nasync function collectFilePaths(paths: string[]): Promise<string[]> {\n const results: string[] = [];\n\n for (const p of paths) {\n const absolute = path.resolve(p);\n try {\n const stat = await fs.stat(absolute);\n if (stat.isFile()) {\n results.push(absolute);\n } else if (stat.isDirectory()) {\n const entries = await fs.readdir(absolute);\n const subPaths = entries.map((entry) => path.join(absolute, entry));\n const subFiles = await collectFilePaths(subPaths);\n results.push(...subFiles);\n }\n } catch {\n // Skip paths that don't exist or can't be accessed\n }\n }\n\n return results;\n}\n","import { styleText } from 'node:util';\n\nimport {\n type Hook,\n type HookOption,\n isFunction,\n isObject,\n isString,\n log,\n logError,\n type NormalizedHookCommand,\n} from '@orval/core';\nimport { execa } from 'execa';\nimport { parseArgsStringToArgv } from 'string-argv';\n\nexport const executeHook = async (\n name: Hook,\n commands: NormalizedHookCommand = [],\n args: string[] = [],\n) => {\n log(styleText('white', `Running ${name} hook...`));\n\n for (const command of commands) {\n try {\n if (isString(command)) {\n await executeCommand(command, args);\n } else if (isFunction(command)) {\n await command(args);\n } else if (isObject(command)) {\n await executeObjectCommand(command as HookOption, args);\n }\n } catch (error) {\n logError(error, `Failed to run ${name} hook`);\n }\n }\n};\n\nasync function executeCommand(command: string, args: string[]) {\n const [cmd, ..._args] = [...parseArgsStringToArgv(command), ...args];\n\n await execa(cmd, _args);\n}\n\nasync function executeObjectCommand(command: HookOption, args: string[]) {\n if (command.injectGeneratedDirsAndFiles === false) {\n args = [];\n }\n\n if (isString(command.command)) {\n await executeCommand(command.command, args);\n } else if (isFunction(command.command)) {\n await command.command();\n }\n}\n","import { styleText } from 'node:util';\n\nimport {\n dynamicImport,\n isObject,\n isString,\n log,\n logVerbose,\n type PackageJson,\n resolveInstalledVersions,\n} from '@orval/core';\nimport { findUp, findUpMultiple } from 'find-up';\nimport fs from 'fs-extra';\nimport yaml from 'js-yaml';\n\nimport { normalizePath } from './options';\n\ntype CatalogData = Pick<PackageJson, 'catalog' | 'catalogs'>;\n\nexport const loadPackageJson = async (\n packageJson?: string,\n workspace = process.cwd(),\n): Promise<PackageJson | undefined> => {\n if (!packageJson) {\n const pkgPath = await findUp(['package.json'], { cwd: workspace });\n if (pkgPath) {\n const pkg = await dynamicImport<unknown>(pkgPath, workspace);\n\n if (isPackageJson(pkg)) {\n return resolveAndAttachVersions(\n await maybeReplaceCatalog(pkg, workspace),\n workspace,\n pkgPath,\n );\n } else {\n throw new Error('Invalid package.json file');\n }\n }\n return;\n }\n\n const normalizedPath = normalizePath(packageJson, workspace);\n if (fs.existsSync(normalizedPath)) {\n const pkg = await dynamicImport<unknown>(normalizedPath);\n\n if (isPackageJson(pkg)) {\n return resolveAndAttachVersions(\n await maybeReplaceCatalog(pkg, workspace),\n workspace,\n normalizedPath,\n );\n } else {\n throw new Error(`Invalid package.json file: ${normalizedPath}`);\n }\n }\n return;\n};\n\nconst isPackageJson = (obj: unknown): obj is PackageJson => isObject(obj);\n\nconst resolvedCache = new Map<string, Record<string, string>>();\n\n/** @internal visible for testing */\nexport const _resetResolvedCache = () => {\n resolvedCache.clear();\n};\n\nconst resolveAndAttachVersions = (\n pkg: PackageJson,\n workspace: string,\n cacheKey: string,\n): PackageJson => {\n const cached = resolvedCache.get(cacheKey);\n if (cached) {\n pkg.resolvedVersions = cached;\n return pkg;\n }\n\n const resolved = resolveInstalledVersions(pkg, workspace);\n if (Object.keys(resolved).length > 0) {\n pkg.resolvedVersions = resolved;\n resolvedCache.set(cacheKey, resolved);\n for (const [name, version] of Object.entries(resolved)) {\n logVerbose(\n styleText(\n 'dim',\n `Detected ${styleText('white', name)} v${styleText('white', version)}`,\n ),\n );\n }\n }\n return pkg;\n};\n\nconst hasCatalogReferences = (pkg: PackageJson): boolean => {\n return [\n ...Object.entries(pkg.dependencies ?? {}),\n ...Object.entries(pkg.devDependencies ?? {}),\n ...Object.entries(pkg.peerDependencies ?? {}),\n ].some(([, value]) => isString(value) && value.startsWith('catalog:'));\n};\n\nconst loadPnpmWorkspaceCatalog = async (\n workspace: string,\n): Promise<CatalogData | undefined> => {\n const filePath = await findUp('pnpm-workspace.yaml', { cwd: workspace });\n if (!filePath) return undefined;\n try {\n const file = await fs.readFile(filePath, 'utf8');\n const data = yaml.load(file) as Record<string, unknown> | undefined;\n if (!data?.catalog && !data?.catalogs) return undefined;\n return {\n catalog: data.catalog as CatalogData['catalog'],\n catalogs: data.catalogs as CatalogData['catalogs'],\n };\n } catch {\n return undefined;\n }\n};\n\nconst loadPackageJsonCatalog = async (\n workspace: string,\n): Promise<CatalogData | undefined> => {\n const filePaths = await findUpMultiple('package.json', { cwd: workspace });\n\n for (const filePath of filePaths) {\n try {\n const pkg = (await fs.readJson(filePath)) as Record<string, unknown>;\n if (pkg.catalog || pkg.catalogs) {\n return {\n catalog: pkg.catalog as CatalogData['catalog'],\n catalogs: pkg.catalogs as CatalogData['catalogs'],\n };\n }\n } catch {\n // Continue to next file\n }\n }\n return undefined;\n};\n\nconst loadYarnrcCatalog = async (\n workspace: string,\n): Promise<CatalogData | undefined> => {\n const filePath = await findUp('.yarnrc.yml', { cwd: workspace });\n if (!filePath) return undefined;\n try {\n const file = await fs.readFile(filePath, 'utf8');\n const data = yaml.load(file) as Record<string, unknown> | undefined;\n if (!data?.catalog && !data?.catalogs) return undefined;\n return {\n catalog: data.catalog as CatalogData['catalog'],\n catalogs: data.catalogs as CatalogData['catalogs'],\n };\n } catch {\n return undefined;\n }\n};\n\nconst maybeReplaceCatalog = async (\n pkg: PackageJson,\n workspace: string,\n): Promise<PackageJson> => {\n if (!hasCatalogReferences(pkg)) {\n return pkg;\n }\n\n const catalogData =\n (await loadPnpmWorkspaceCatalog(workspace)) ??\n (await loadPackageJsonCatalog(workspace)) ??\n (await loadYarnrcCatalog(workspace));\n\n if (!catalogData) {\n log(\n `⚠️ ${styleText('yellow', 'package.json contains catalog: references, but no catalog source was found (checked: pnpm-workspace.yaml, package.json, .yarnrc.yml).')}`,\n );\n return pkg;\n }\n\n performSubstitution(pkg.dependencies, catalogData);\n performSubstitution(pkg.devDependencies, catalogData);\n performSubstitution(pkg.peerDependencies, catalogData);\n\n return pkg;\n};\n\nconst performSubstitution = (\n dependencies: Record<string, string> | undefined,\n catalogData: CatalogData,\n) => {\n if (!dependencies) return;\n for (const [packageName, version] of Object.entries(dependencies)) {\n if (version === 'catalog:' || version === 'catalog:default') {\n if (!catalogData.catalog) {\n log(\n `⚠️ ${styleText('yellow', `catalog: substitution for the package '${packageName}' failed as there is no default catalog.`)}`,\n );\n continue;\n }\n const sub = catalogData.catalog[packageName];\n if (!sub) {\n log(\n `⚠️ ${styleText('yellow', `catalog: substitution for the package '${packageName}' failed as there is no matching package in the default catalog.`)}`,\n );\n continue;\n }\n dependencies[packageName] = sub;\n } else if (version.startsWith('catalog:')) {\n const catalogName = version.slice('catalog:'.length);\n const catalog = catalogData.catalogs?.[catalogName];\n if (!catalog) {\n log(\n `⚠️ ${styleText('yellow', `'${version}' substitution for the package '${packageName}' failed as there is no matching catalog named '${catalogName}'. (available named catalogs are: ${Object.keys(catalogData.catalogs ?? {}).join(', ')})`)}`,\n );\n continue;\n }\n const sub = catalog[packageName];\n if (!sub) {\n log(\n `⚠️ ${styleText('yellow', `'${version}' substitution for the package '${packageName}' failed as there is no package in the catalog named '${catalogName}'. (packages in the catalog are: ${Object.keys(catalog).join(', ')})`)}`,\n );\n continue;\n }\n dependencies[packageName] = sub;\n }\n }\n};\n","import { isNullish, isObject, isString, type Tsconfig } from '@orval/core';\nimport { findUp } from 'find-up';\nimport fs from 'fs-extra';\nimport { parse } from 'tsconfck';\n\nimport { normalizePath } from './options';\n\nexport const loadTsconfig = async (\n tsconfig?: Tsconfig | string,\n workspace = process.cwd(),\n): Promise<Tsconfig | undefined> => {\n if (isNullish(tsconfig)) {\n const configPath = await findUp(['tsconfig.json', 'jsconfig.json'], {\n cwd: workspace,\n });\n if (configPath) {\n const config = await parse(configPath);\n return config.tsconfig as Tsconfig;\n }\n return;\n }\n\n if (isString(tsconfig)) {\n const normalizedPath = normalizePath(tsconfig, workspace);\n if (fs.existsSync(normalizedPath)) {\n const config = await parse(normalizedPath);\n\n const tsconfig = (config.referenced?.find(\n ({ tsconfigFile }) => tsconfigFile === normalizedPath,\n )?.tsconfig ?? config.tsconfig) as Tsconfig;\n\n return tsconfig;\n }\n return;\n }\n\n if (isObject(tsconfig)) {\n return tsconfig;\n }\n return;\n};\n","import { styleText } from 'node:util';\n\nimport {\n type ClientMockBuilder,\n type ConfigExternal,\n createLogger,\n FormDataArrayHandling,\n type GlobalMockOptions,\n type GlobalOptions,\n type HonoOptions,\n type Hook,\n type HookFunction,\n type HookOption,\n type HooksOptions,\n type InputTransformerFn,\n isBoolean,\n isFunction,\n isNullish,\n isObject,\n isString,\n isUrl,\n type JsDocOptions,\n type Mutator,\n NamingConvention,\n type NormalizedHonoOptions,\n type NormalizedHookOptions,\n type NormalizedJsDocOptions,\n type NormalizedMutator,\n type NormalizedOperationOptions,\n type NormalizedOptions,\n type NormalizedOverrideOutput,\n type NormalizedQueryOptions,\n type NormalizedSchemaOptions,\n type OperationOptions,\n type OptionsExport,\n OutputClient,\n OutputHttpClient,\n OutputMode,\n type OverrideOutput,\n PropertySortOrder,\n type QueryOptions,\n RefComponentSuffix,\n type SchemaOptions,\n upath,\n} from '@orval/core';\nimport { DEFAULT_MOCK_OPTIONS } from '@orval/mock';\n\nimport pkg from '../../package.json';\nimport { loadPackageJson } from './package-json';\nimport { loadTsconfig } from './tsconfig';\n\n/**\n * Type helper to make it easier to use orval.config.ts\n * accepts a direct {@link ConfigExternal} object.\n */\nexport function defineConfig(options: ConfigExternal): ConfigExternal {\n return options;\n}\n\n/**\n * Type helper to make it easier to write input transformers.\n * accepts a direct {@link InputTransformerFn} function.\n */\nexport function defineTransformer(\n transformer: InputTransformerFn,\n): InputTransformerFn {\n return transformer;\n}\n\nfunction createFormData(\n workspace: string,\n formData: OverrideOutput['formData'],\n): NormalizedOverrideOutput['formData'] {\n const defaultArrayHandling = FormDataArrayHandling.SERIALIZE;\n if (formData === undefined)\n return { disabled: false, arrayHandling: defaultArrayHandling };\n if (isBoolean(formData))\n return { disabled: !formData, arrayHandling: defaultArrayHandling };\n if (isString(formData))\n return {\n disabled: false,\n mutator: normalizeMutator(workspace, formData),\n arrayHandling: defaultArrayHandling,\n };\n if ('mutator' in formData || 'arrayHandling' in formData)\n return {\n disabled: false,\n mutator: normalizeMutator(workspace, formData.mutator),\n arrayHandling: formData.arrayHandling ?? defaultArrayHandling,\n };\n return {\n disabled: false,\n mutator: normalizeMutator(workspace, formData),\n arrayHandling: defaultArrayHandling,\n };\n}\n\nfunction normalizeSchemasOption(\n schemas: string | SchemaOptions | undefined,\n workspace: string,\n): string | NormalizedSchemaOptions | undefined {\n if (!schemas) {\n return undefined;\n }\n\n if (isString(schemas)) {\n return normalizePath(schemas, workspace);\n }\n\n return {\n path: normalizePath(schemas.path, workspace),\n type: schemas.type,\n };\n}\n\nexport async function normalizeOptions(\n optionsExport: OptionsExport,\n workspace = process.cwd(),\n globalOptions: GlobalOptions = {},\n): Promise<NormalizedOptions> {\n const options = await (isFunction(optionsExport)\n ? optionsExport()\n : optionsExport);\n\n if (!options.input) {\n throw new Error(styleText('red', `Config require an input`));\n }\n\n if (!options.output) {\n throw new Error(styleText('red', `Config require an output`));\n }\n\n const inputOptions = isString(options.input)\n ? { target: options.input }\n : options.input;\n\n const outputOptions = isString(options.output)\n ? { target: options.output }\n : options.output;\n\n const outputWorkspace = normalizePath(\n outputOptions.workspace ?? '',\n workspace,\n );\n\n const { clean, prettier, client, httpClient, mode, biome } = globalOptions;\n\n const tsconfig = await loadTsconfig(\n outputOptions.tsconfig ?? globalOptions.tsconfig,\n workspace,\n );\n\n const packageJson = await loadPackageJson(\n outputOptions.packageJson ?? globalOptions.packageJson,\n workspace,\n );\n\n const mockOption = outputOptions.mock ?? globalOptions.mock;\n let mock: GlobalMockOptions | ClientMockBuilder | undefined;\n if (isBoolean(mockOption) && mockOption) {\n mock = DEFAULT_MOCK_OPTIONS;\n } else if (isFunction(mockOption)) {\n mock = mockOption;\n } else if (mockOption) {\n mock = {\n ...DEFAULT_MOCK_OPTIONS,\n ...mockOption,\n };\n } else {\n mock = undefined;\n }\n\n const defaultFileExtension = '.ts';\n\n const globalQueryOptions: NormalizedQueryOptions = {\n useQuery: true,\n useMutation: true,\n signal: true,\n shouldExportMutatorHooks: true,\n shouldExportHttpClient: true,\n shouldExportQueryKey: true,\n shouldSplitQueryKey: false,\n ...normalizeQueryOptions(outputOptions.override?.query, workspace),\n };\n\n const normalizedOptions: NormalizedOptions = {\n input: {\n target: globalOptions.input\n ? normalizePathOrUrl(globalOptions.input, process.cwd())\n : normalizePathOrUrl(inputOptions.target, workspace),\n override: {\n transformer: normalizePath(\n inputOptions.override?.transformer,\n workspace,\n ),\n },\n filters: inputOptions.filters,\n parserOptions: inputOptions.parserOptions,\n },\n output: {\n target: globalOptions.output\n ? normalizePath(globalOptions.output, process.cwd())\n : normalizePath(outputOptions.target, outputWorkspace),\n schemas: normalizeSchemasOption(outputOptions.schemas, outputWorkspace),\n operationSchemas: outputOptions.operationSchemas\n ? normalizePath(outputOptions.operationSchemas, outputWorkspace)\n : undefined,\n namingConvention:\n outputOptions.namingConvention ?? NamingConvention.CAMEL_CASE,\n fileExtension: outputOptions.fileExtension ?? defaultFileExtension,\n workspace: outputOptions.workspace ? outputWorkspace : undefined,\n client: outputOptions.client ?? client ?? OutputClient.AXIOS_FUNCTIONS,\n httpClient:\n outputOptions.httpClient ??\n httpClient ??\n // Auto-detect: use Angular HttpClient for angular-query by default\n ((outputOptions.client ?? client) === OutputClient.ANGULAR_QUERY\n ? OutputHttpClient.ANGULAR\n : OutputHttpClient.FETCH),\n mode: normalizeOutputMode(outputOptions.mode ?? mode),\n mock,\n clean: outputOptions.clean ?? clean ?? false,\n docs: outputOptions.docs ?? false,\n prettier: outputOptions.prettier ?? prettier ?? false,\n biome: outputOptions.biome ?? biome ?? false,\n tsconfig,\n packageJson,\n headers: outputOptions.headers ?? false,\n indexFiles: outputOptions.indexFiles ?? true,\n baseUrl: outputOptions.baseUrl,\n unionAddMissingProperties:\n outputOptions.unionAddMissingProperties ?? false,\n override: {\n ...outputOptions.override,\n mock: {\n arrayMin: outputOptions.override?.mock?.arrayMin ?? 1,\n arrayMax: outputOptions.override?.mock?.arrayMax ?? 10,\n stringMin: outputOptions.override?.mock?.stringMin ?? 10,\n stringMax: outputOptions.override?.mock?.stringMax ?? 20,\n fractionDigits: outputOptions.override?.mock?.fractionDigits ?? 2,\n ...outputOptions.override?.mock,\n },\n operations: normalizeOperationsAndTags(\n outputOptions.override?.operations ?? {},\n outputWorkspace,\n {\n query: globalQueryOptions,\n },\n ),\n tags: normalizeOperationsAndTags(\n outputOptions.override?.tags ?? {},\n outputWorkspace,\n {\n query: globalQueryOptions,\n },\n ),\n mutator: normalizeMutator(\n outputWorkspace,\n outputOptions.override?.mutator,\n ),\n formData: createFormData(\n outputWorkspace,\n outputOptions.override?.formData,\n ),\n formUrlEncoded:\n (isBoolean(outputOptions.override?.formUrlEncoded)\n ? outputOptions.override.formUrlEncoded\n : normalizeMutator(\n outputWorkspace,\n outputOptions.override?.formUrlEncoded,\n )) ?? true,\n paramsSerializer: normalizeMutator(\n outputWorkspace,\n outputOptions.override?.paramsSerializer,\n ),\n header:\n outputOptions.override?.header === false\n ? false\n : isFunction(outputOptions.override?.header)\n ? outputOptions.override.header\n : getDefaultFilesHeader,\n requestOptions: outputOptions.override?.requestOptions ?? true,\n namingConvention: outputOptions.override?.namingConvention ?? {},\n components: {\n schemas: {\n suffix: RefComponentSuffix.schemas,\n itemSuffix:\n outputOptions.override?.components?.schemas?.itemSuffix ?? 'Item',\n ...outputOptions.override?.components?.schemas,\n },\n responses: {\n suffix: RefComponentSuffix.responses,\n ...outputOptions.override?.components?.responses,\n },\n parameters: {\n suffix: RefComponentSuffix.parameters,\n ...outputOptions.override?.components?.parameters,\n },\n requestBodies: {\n suffix: RefComponentSuffix.requestBodies,\n ...outputOptions.override?.components?.requestBodies,\n },\n },\n hono: normalizeHonoOptions(outputOptions.override?.hono, workspace),\n jsDoc: normalizeJSDocOptions(outputOptions.override?.jsDoc),\n query: globalQueryOptions,\n zod: {\n strict: {\n param: outputOptions.override?.zod?.strict?.param ?? false,\n query: outputOptions.override?.zod?.strict?.query ?? false,\n header: outputOptions.override?.zod?.strict?.header ?? false,\n body: outputOptions.override?.zod?.strict?.body ?? false,\n response: outputOptions.override?.zod?.strict?.response ?? false,\n },\n generate: {\n param: outputOptions.override?.zod?.generate?.param ?? true,\n query: outputOptions.override?.zod?.generate?.query ?? true,\n header: outputOptions.override?.zod?.generate?.header ?? true,\n body: outputOptions.override?.zod?.generate?.body ?? true,\n response: outputOptions.override?.zod?.generate?.response ?? true,\n },\n coerce: {\n param: outputOptions.override?.zod?.coerce?.param ?? false,\n query: outputOptions.override?.zod?.coerce?.query ?? false,\n header: outputOptions.override?.zod?.coerce?.header ?? false,\n body: outputOptions.override?.zod?.coerce?.body ?? false,\n response: outputOptions.override?.zod?.coerce?.response ?? false,\n },\n preprocess: {\n ...(outputOptions.override?.zod?.preprocess?.param\n ? {\n param: normalizeMutator(\n workspace,\n outputOptions.override.zod.preprocess.param,\n ),\n }\n : {}),\n ...(outputOptions.override?.zod?.preprocess?.query\n ? {\n query: normalizeMutator(\n workspace,\n outputOptions.override.zod.preprocess.query,\n ),\n }\n : {}),\n ...(outputOptions.override?.zod?.preprocess?.header\n ? {\n header: normalizeMutator(\n workspace,\n outputOptions.override.zod.preprocess.header,\n ),\n }\n : {}),\n ...(outputOptions.override?.zod?.preprocess?.body\n ? {\n body: normalizeMutator(\n workspace,\n outputOptions.override.zod.preprocess.body,\n ),\n }\n : {}),\n ...(outputOptions.override?.zod?.preprocess?.response\n ? {\n response: normalizeMutator(\n workspace,\n outputOptions.override.zod.preprocess.response,\n ),\n }\n : {}),\n },\n generateEachHttpStatus:\n outputOptions.override?.zod?.generateEachHttpStatus ?? false,\n dateTimeOptions: outputOptions.override?.zod?.dateTimeOptions ?? {},\n timeOptions: outputOptions.override?.zod?.timeOptions ?? {},\n },\n swr: {\n generateErrorTypes: false,\n ...outputOptions.override?.swr,\n },\n angular: {\n provideIn: outputOptions.override?.angular?.provideIn ?? 'root',\n runtimeValidation:\n outputOptions.override?.angular?.runtimeValidation ?? false,\n },\n fetch: {\n includeHttpResponseReturnType:\n outputOptions.override?.fetch?.includeHttpResponseReturnType ??\n true,\n forceSuccessResponse:\n outputOptions.override?.fetch?.forceSuccessResponse ?? false,\n runtimeValidation:\n outputOptions.override?.fetch?.runtimeValidation ?? false,\n ...outputOptions.override?.fetch,\n },\n useDates: outputOptions.override?.useDates ?? false,\n useDeprecatedOperations:\n outputOptions.override?.useDeprecatedOperations ?? true,\n enumGenerationType:\n outputOptions.override?.enumGenerationType ?? 'const',\n suppressReadonlyModifier:\n outputOptions.override?.suppressReadonlyModifier ?? false,\n aliasCombinedTypes: outputOptions.override?.aliasCombinedTypes ?? false,\n },\n allParamsOptional: outputOptions.allParamsOptional ?? false,\n urlEncodeParameters: outputOptions.urlEncodeParameters ?? false,\n optionsParamRequired: outputOptions.optionsParamRequired ?? false,\n propertySortOrder:\n outputOptions.propertySortOrder ?? PropertySortOrder.SPECIFICATION,\n },\n hooks: options.hooks ? normalizeHooks(options.hooks) : {},\n };\n\n if (!normalizedOptions.input.target) {\n throw new Error(styleText('red', `Config require an input target`));\n }\n\n if (!normalizedOptions.output.target && !normalizedOptions.output.schemas) {\n throw new Error(\n styleText('red', `Config require an output target or schemas`),\n );\n }\n\n return normalizedOptions;\n}\n\nfunction normalizeMutator(\n workspace: string,\n mutator?: Mutator,\n): NormalizedMutator | undefined {\n if (isObject(mutator)) {\n if (!mutator.path) {\n throw new Error(styleText('red', `Mutator need a path`));\n }\n\n return {\n ...mutator,\n path: upath.resolve(workspace, mutator.path),\n default: mutator.default ?? !mutator.name,\n };\n }\n\n if (isString(mutator)) {\n return {\n path: upath.resolve(workspace, mutator),\n default: true,\n };\n }\n\n return mutator;\n}\n\nfunction normalizePathOrUrl<T>(path: T, workspace: string) {\n if (isString(path) && !isUrl(path)) {\n return normalizePath(path, workspace);\n }\n\n return path;\n}\n\nexport function normalizePath<T>(path: T, workspace: string) {\n if (!isString(path)) {\n return path;\n }\n return upath.resolve(workspace, path);\n}\n\nfunction normalizeOperationsAndTags(\n operationsOrTags: Record<string, OperationOptions>,\n workspace: string,\n global: {\n query: NormalizedQueryOptions;\n },\n): Record<string, NormalizedOperationOptions> {\n return Object.fromEntries(\n Object.entries(operationsOrTags).map(\n ([\n key,\n {\n transformer,\n mutator,\n formData,\n formUrlEncoded,\n paramsSerializer,\n query,\n zod,\n ...rest\n },\n ]) => {\n return [\n key,\n {\n ...rest,\n ...(query\n ? {\n query: normalizeQueryOptions(query, workspace, global.query),\n }\n : {}),\n ...(zod\n ? {\n zod: {\n strict: {\n param: zod.strict?.param ?? false,\n query: zod.strict?.query ?? false,\n header: zod.strict?.header ?? false,\n body: zod.strict?.body ?? false,\n response: zod.strict?.response ?? false,\n },\n generate: {\n param: zod.generate?.param ?? true,\n query: zod.generate?.query ?? true,\n header: zod.generate?.header ?? true,\n body: zod.generate?.body ?? true,\n response: zod.generate?.response ?? true,\n },\n coerce: {\n param: zod.coerce?.param ?? false,\n query: zod.coerce?.query ?? false,\n header: zod.coerce?.header ?? false,\n body: zod.coerce?.body ?? false,\n response: zod.coerce?.response ?? false,\n },\n preprocess: {\n ...(zod.preprocess?.param\n ? {\n param: normalizeMutator(\n workspace,\n zod.preprocess.param,\n ),\n }\n : {}),\n ...(zod.preprocess?.query\n ? {\n query: normalizeMutator(\n workspace,\n zod.preprocess.query,\n ),\n }\n : {}),\n ...(zod.preprocess?.header\n ? {\n header: normalizeMutator(\n workspace,\n zod.preprocess.header,\n ),\n }\n : {}),\n ...(zod.preprocess?.body\n ? {\n body: normalizeMutator(\n workspace,\n zod.preprocess.body,\n ),\n }\n : {}),\n ...(zod.preprocess?.response\n ? {\n response: normalizeMutator(\n workspace,\n zod.preprocess.response,\n ),\n }\n : {}),\n },\n generateEachHttpStatus: zod.generateEachHttpStatus ?? false,\n dateTimeOptions: zod.dateTimeOptions ?? {},\n timeOptions: zod.timeOptions ?? {},\n },\n }\n : {}),\n ...(transformer\n ? { transformer: normalizePath(transformer, workspace) }\n : {}),\n ...(mutator\n ? { mutator: normalizeMutator(workspace, mutator) }\n : {}),\n ...createFormData(workspace, formData),\n ...(formUrlEncoded\n ? {\n formUrlEncoded: isBoolean(formUrlEncoded)\n ? formUrlEncoded\n : normalizeMutator(workspace, formUrlEncoded),\n }\n : {}),\n ...(paramsSerializer\n ? {\n paramsSerializer: normalizeMutator(\n workspace,\n paramsSerializer,\n ),\n }\n : {}),\n },\n ];\n },\n ),\n );\n}\n\nfunction normalizeOutputMode(mode?: OutputMode): OutputMode {\n if (!mode) {\n return OutputMode.SINGLE;\n }\n\n if (!Object.values(OutputMode).includes(mode)) {\n createLogger().warn(\n styleText('yellow', `Unknown the provided mode => ${mode}`),\n );\n return OutputMode.SINGLE;\n }\n\n return mode;\n}\n\nfunction normalizeHooks(hooks: HooksOptions): NormalizedHookOptions {\n const keys = Object.keys(hooks) as unknown as Hook[];\n\n const result: NormalizedHookOptions = {};\n for (const key of keys) {\n if (isString(hooks[key])) {\n result[key] = [hooks[key]] as string[];\n } else if (Array.isArray(hooks[key])) {\n result[key] = hooks[key] as string[];\n } else if (isFunction(hooks[key])) {\n result[key] = [hooks[key]] as HookFunction[];\n } else if (isObject(hooks[key])) {\n result[key] = [hooks[key]] as HookOption[];\n }\n }\n return result;\n}\n\nfunction normalizeHonoOptions(\n hono: HonoOptions = {},\n workspace: string,\n): NormalizedHonoOptions {\n return {\n ...(hono.handlers\n ? { handlers: upath.resolve(workspace, hono.handlers) }\n : {}),\n compositeRoute: hono.compositeRoute ?? '',\n validator: hono.validator ?? true,\n validatorOutputPath: hono.validatorOutputPath\n ? upath.resolve(workspace, hono.validatorOutputPath)\n : '',\n };\n}\n\nfunction normalizeJSDocOptions(\n jsdoc: JsDocOptions = {},\n): NormalizedJsDocOptions {\n return {\n ...jsdoc,\n };\n}\n\nfunction normalizeQueryOptions(\n queryOptions: QueryOptions = {},\n outputWorkspace: string,\n globalOptions: NormalizedQueryOptions = {},\n): NormalizedQueryOptions {\n if (queryOptions.options) {\n console.warn(\n '[WARN] Using query options is deprecated and will be removed in a future major release. Please use queryOptions or mutationOptions instead.',\n );\n }\n\n return {\n ...(isNullish(queryOptions.usePrefetch)\n ? {}\n : { usePrefetch: queryOptions.usePrefetch }),\n ...(isNullish(queryOptions.useInvalidate)\n ? {}\n : { useInvalidate: queryOptions.useInvalidate }),\n ...(isNullish(queryOptions.useQuery)\n ? {}\n : { useQuery: queryOptions.useQuery }),\n ...(isNullish(queryOptions.useSuspenseQuery)\n ? {}\n : { useSuspenseQuery: queryOptions.useSuspenseQuery }),\n ...(isNullish(queryOptions.useMutation)\n ? {}\n : { useMutation: queryOptions.useMutation }),\n ...(isNullish(queryOptions.useInfinite)\n ? {}\n : { useInfinite: queryOptions.useInfinite }),\n ...(isNullish(queryOptions.useSuspenseInfiniteQuery)\n ? {}\n : { useSuspenseInfiniteQuery: queryOptions.useSuspenseInfiniteQuery }),\n ...(queryOptions.useInfiniteQueryParam\n ? { useInfiniteQueryParam: queryOptions.useInfiniteQueryParam }\n : {}),\n ...(queryOptions.options ? { options: queryOptions.options } : {}),\n ...(globalOptions.queryKey\n ? {\n queryKey: globalOptions.queryKey,\n }\n : {}),\n ...(queryOptions.queryKey\n ? {\n queryKey: normalizeMutator(outputWorkspace, queryOptions.queryKey),\n }\n : {}),\n ...(globalOptions.queryOptions\n ? {\n queryOptions: globalOptions.queryOptions,\n }\n : {}),\n ...(queryOptions.queryOptions\n ? {\n queryOptions: normalizeMutator(\n outputWorkspace,\n queryOptions.queryOptions,\n ),\n }\n : {}),\n ...(globalOptions.mutationOptions\n ? {\n mutationOptions: globalOptions.mutationOptions,\n }\n : {}),\n ...(queryOptions.mutationOptions\n ? {\n mutationOptions: normalizeMutator(\n outputWorkspace,\n queryOptions.mutationOptions,\n ),\n }\n : {}),\n ...(isNullish(globalOptions.shouldExportQueryKey)\n ? {}\n : {\n shouldExportQueryKey: globalOptions.shouldExportQueryKey,\n }),\n ...(isNullish(queryOptions.shouldExportQueryKey)\n ? {}\n : { shouldExportQueryKey: queryOptions.shouldExportQueryKey }),\n ...(isNullish(globalOptions.shouldExportHttpClient)\n ? {}\n : {\n shouldExportHttpClient: globalOptions.shouldExportHttpClient,\n }),\n ...(isNullish(queryOptions.shouldExportHttpClient)\n ? {}\n : { shouldExportHttpClient: queryOptions.shouldExportHttpClient }),\n ...(isNullish(globalOptions.shouldExportMutatorHooks)\n ? {}\n : {\n shouldExportMutatorHooks: globalOptions.shouldExportMutatorHooks,\n }),\n ...(isNullish(queryOptions.shouldExportMutatorHooks)\n ? {}\n : { shouldExportMutatorHooks: queryOptions.shouldExportMutatorHooks }),\n ...(isNullish(globalOptions.shouldSplitQueryKey)\n ? {}\n : {\n shouldSplitQueryKey: globalOptions.shouldSplitQueryKey,\n }),\n ...(isNullish(queryOptions.shouldSplitQueryKey)\n ? {}\n : { shouldSplitQueryKey: queryOptions.shouldSplitQueryKey }),\n ...(isNullish(globalOptions.signal)\n ? {}\n : {\n signal: globalOptions.signal,\n }),\n ...(isNullish(globalOptions.useOperationIdAsQueryKey)\n ? {}\n : {\n useOperationIdAsQueryKey: globalOptions.useOperationIdAsQueryKey,\n }),\n ...(isNullish(queryOptions.useOperationIdAsQueryKey)\n ? {}\n : { useOperationIdAsQueryKey: queryOptions.useOperationIdAsQueryKey }),\n ...(isNullish(globalOptions.signal)\n ? {}\n : {\n signal: globalOptions.signal,\n }),\n ...(isNullish(queryOptions.signal) ? {} : { signal: queryOptions.signal }),\n ...(isNullish(globalOptions.version)\n ? {}\n : {\n version: globalOptions.version,\n }),\n ...(isNullish(queryOptions.version)\n ? {}\n : { version: queryOptions.version }),\n ...(queryOptions.mutationInvalidates\n ? { mutationInvalidates: queryOptions.mutationInvalidates }\n : {}),\n ...(isNullish(globalOptions.runtimeValidation)\n ? {}\n : {\n runtimeValidation: globalOptions.runtimeValidation,\n }),\n ...(isNullish(queryOptions.runtimeValidation)\n ? {}\n : { runtimeValidation: queryOptions.runtimeValidation }),\n };\n}\n\nexport function getDefaultFilesHeader({\n title,\n description,\n version,\n}: {\n title?: string;\n description?: string;\n version?: string;\n} = {}) {\n return [\n `Generated by ${pkg.name} v${pkg.version} 🍺`,\n `Do not edit manually.`,\n ...(title ? [title] : []),\n ...(description ? [description] : []),\n ...(version ? [`OpenAPI spec version: ${version}`] : []),\n ];\n}\n","import { isBoolean, log, logError } from '@orval/core';\n\n/**\n * Start a file watcher and invoke an async callback on file changes.\n *\n * If `watchOptions` is falsy the watcher is not started. Supported shapes:\n * - boolean: when true the `defaultTarget` is watched\n * - string: a single path to watch\n * - string[]: an array of paths to watch\n *\n * @param watchOptions - false to disable watching, or a path/paths to watch\n * @param watchFn - async callback executed on change events\n * @param defaultTarget - path(s) to watch when `watchOptions` is `true` (default: '.')\n * @returns Resolves once the watcher has been started (or immediately if disabled)\n *\n * @example\n * await startWatcher(true, async () => { await buildProject(); }, 'src');\n */\nexport async function startWatcher(\n watchOptions: boolean | string | string[],\n watchFn: () => Promise<void>,\n defaultTarget: string | string[] = '.',\n) {\n if (!watchOptions) return;\n const { watch } = await import('chokidar');\n\n const ignored = ['**/{.git,node_modules}/**'];\n\n const watchPaths = isBoolean(watchOptions) ? defaultTarget : watchOptions;\n\n log(\n `Watching for changes in ${\n Array.isArray(watchPaths)\n ? watchPaths.map((v) => '\"' + v + '\"').join(' | ')\n : '\"' + watchPaths + '\"'\n }`,\n );\n\n const watcher = watch(watchPaths, {\n ignorePermissionErrors: true,\n ignored,\n });\n watcher.on('all', (type, file) => {\n log(`Change detected: ${type} ${file}`);\n\n watchFn().catch((error: unknown) => {\n logError(error);\n });\n });\n}\n","import {\n type ContextSpec,\n conventionName,\n type NamingConvention,\n type NormalizedOutputOptions,\n type OpenApiParameterObject,\n type OpenApiReferenceObject,\n type OpenApiRequestBodyObject,\n type OpenApiSchemaObject,\n pascal,\n upath,\n type ZodCoerceType,\n} from '@orval/core';\nimport {\n dereference,\n generateZodValidationSchemaDefinition,\n isZodVersionV4,\n parseZodValidationSchemaDefinition,\n} from '@orval/zod';\nimport fs from 'fs-extra';\n\ntype ZodSchemaFileEntry = {\n schemaName: string;\n consts: string;\n zodExpression: string;\n};\n\ntype ZodSchemaFileToWrite = ZodSchemaFileEntry & {\n filePath: string;\n};\n\ntype WriteZodOutputOptions = {\n namingConvention: NamingConvention;\n indexFiles: boolean;\n packageJson?: NormalizedOutputOptions['packageJson'];\n override: {\n zod: {\n strict: {\n body: boolean;\n };\n coerce: {\n body: boolean | ZodCoerceType[];\n };\n };\n };\n};\n\ntype WriteZodSchemasInput = {\n spec: ContextSpec['spec'];\n target: string;\n schemas: {\n name: string;\n schema?: OpenApiSchemaObject | OpenApiReferenceObject;\n }[];\n};\n\ntype WriteZodVerbResponseType = {\n value: string;\n isRef?: boolean;\n originalSchema?: OpenApiSchemaObject;\n};\n\ntype WriteZodSchemasFromVerbsInput = Record<\n string,\n {\n operationName: string;\n originalOperation: {\n requestBody?: OpenApiRequestBodyObject | OpenApiReferenceObject;\n parameters?: (OpenApiParameterObject | OpenApiReferenceObject)[];\n };\n response: {\n types: {\n success: WriteZodVerbResponseType[];\n errors: WriteZodVerbResponseType[];\n };\n };\n }\n>;\n\ntype WriteZodSchemasFromVerbsContext = {\n output: {\n override: {\n useDates?: boolean;\n zod: {\n dateTimeOptions?: Record<string, unknown>;\n timeOptions?: Record<string, unknown>;\n };\n };\n };\n spec: ContextSpec['spec'];\n target: string;\n workspace: string;\n};\n\nfunction generateZodSchemaFileContent(\n header: string,\n schemas: ZodSchemaFileEntry[],\n): string {\n const schemaContent = schemas\n .map(({ schemaName, consts, zodExpression }) => {\n const schemaConsts = consts ? `${consts}\\n` : '';\n\n return `${schemaConsts}export const ${schemaName} = ${zodExpression}\n\nexport type ${schemaName} = zod.input<typeof ${schemaName}>;`;\n })\n .join('\\n\\n');\n\n return `${header}import { z as zod } from 'zod';\n\n${schemaContent}\n`;\n}\n\nconst isValidSchemaIdentifier = (name: string) =>\n /^[A-Za-z_][A-Za-z0-9_]*$/.test(name);\n\nconst isPrimitiveSchemaName = (name: string) =>\n ['string', 'number', 'boolean', 'void', 'unknown', 'Blob'].includes(name);\n\nconst dedupeSchemasByName = <T extends { name: string }>(schemas: T[]) => {\n const uniqueSchemas = new Map<string, T>();\n\n for (const schema of schemas) {\n if (!uniqueSchemas.has(schema.name)) {\n uniqueSchemas.set(schema.name, schema);\n }\n }\n\n return [...uniqueSchemas.values()];\n};\n\nconst groupSchemasByFilePath = <T extends { filePath: string }>(\n schemas: T[],\n) => {\n const grouped = new Map<string, T[]>();\n\n for (const schema of schemas) {\n const key = schema.filePath.toLowerCase();\n const existingGroup = grouped.get(key);\n\n if (existingGroup) {\n existingGroup.push(schema);\n } else {\n grouped.set(key, [schema]);\n }\n }\n\n const sortedGroups = [...grouped.values()].map((group) =>\n [...group].toSorted((a, b) => a.filePath.localeCompare(b.filePath)),\n );\n\n return sortedGroups.toSorted((a, b) =>\n a[0].filePath.localeCompare(b[0].filePath),\n );\n};\n\nasync function writeZodSchemaIndex(\n schemasPath: string,\n fileExtension: string,\n header: string,\n schemaNames: string[],\n namingConvention: NamingConvention,\n shouldMergeExisting = false,\n) {\n const importFileExtension = fileExtension.replace(/\\.ts$/, '');\n const indexPath = upath.join(schemasPath, `index${fileExtension}`);\n\n let existingExports = '';\n if (shouldMergeExisting && (await fs.pathExists(indexPath))) {\n const existingContent = await fs.readFile(indexPath, 'utf8');\n const headerMatch = /^(\\/\\*\\*[\\s\\S]*?\\*\\/\\n)?/.exec(existingContent);\n const headerPart = headerMatch ? headerMatch[0] : '';\n existingExports = existingContent.slice(headerPart.length).trim();\n }\n\n const newExports = schemaNames\n .map((schemaName) => {\n const fileName = conventionName(schemaName, namingConvention);\n return `export * from './${fileName}${importFileExtension}';`;\n })\n .toSorted()\n .join('\\n');\n\n const allExports = existingExports\n ? `${existingExports}\\n${newExports}`\n : newExports;\n\n const uniqueExports = [...new Set(allExports.split('\\n'))]\n .filter((line) => line.trim())\n .toSorted()\n .join('\\n');\n\n await fs.outputFile(indexPath, `${header}\\n${uniqueExports}\\n`);\n}\n\nexport async function writeZodSchemas(\n builder: WriteZodSchemasInput,\n schemasPath: string,\n fileExtension: string,\n header: string,\n output: WriteZodOutputOptions,\n) {\n const schemasWithOpenApiDef = builder.schemas.filter((s) => s.schema);\n const schemasToWrite: ZodSchemaFileToWrite[] = [];\n const isZodV4 = !!output.packageJson && isZodVersionV4(output.packageJson);\n const strict = output.override.zod.strict.body;\n const coerce = output.override.zod.coerce.body;\n\n for (const generatorSchema of schemasWithOpenApiDef) {\n const { name, schema: schemaObject } = generatorSchema;\n\n if (!schemaObject) {\n continue;\n }\n\n const fileName = conventionName(name, output.namingConvention);\n const filePath = upath.join(schemasPath, `${fileName}${fileExtension}`);\n const context: ContextSpec = {\n spec: builder.spec,\n target: builder.target,\n workspace: '',\n output: output as ContextSpec['output'],\n };\n\n // Dereference the schema to resolve $ref\n const dereferencedSchema = dereference(schemaObject, context);\n\n const zodDefinition = generateZodValidationSchemaDefinition(\n dereferencedSchema,\n context,\n name,\n strict,\n isZodV4,\n {\n required: true,\n },\n );\n\n const parsedZodDefinition = parseZodValidationSchemaDefinition(\n zodDefinition,\n context,\n coerce,\n strict,\n isZodV4,\n );\n\n schemasToWrite.push({\n schemaName: name,\n filePath,\n consts: parsedZodDefinition.consts,\n zodExpression: parsedZodDefinition.zod,\n });\n }\n\n const groupedSchemasToWrite = groupSchemasByFilePath(schemasToWrite);\n\n for (const schemaGroup of groupedSchemasToWrite) {\n const fileContent = generateZodSchemaFileContent(header, schemaGroup);\n\n await fs.outputFile(schemaGroup[0].filePath, fileContent);\n }\n\n if (output.indexFiles) {\n const schemaNames = groupedSchemasToWrite.map(\n (schemaGroup) => schemaGroup[0].schemaName,\n );\n await writeZodSchemaIndex(\n schemasPath,\n fileExtension,\n header,\n schemaNames,\n output.namingConvention,\n false,\n );\n }\n}\n\nexport async function writeZodSchemasFromVerbs(\n verbOptions: WriteZodSchemasFromVerbsInput,\n schemasPath: string,\n fileExtension: string,\n header: string,\n output: WriteZodOutputOptions,\n context: WriteZodSchemasFromVerbsContext,\n) {\n const zodContext = context as ContextSpec;\n const verbOptionsArray = Object.values(verbOptions);\n\n if (verbOptionsArray.length === 0) {\n return;\n }\n\n const isZodV4 = !!output.packageJson && isZodVersionV4(output.packageJson);\n const strict = output.override.zod.strict.body;\n const coerce = output.override.zod.coerce.body;\n\n const generateVerbsSchemas = verbOptionsArray.flatMap((verbOption) => {\n const operation = verbOption.originalOperation;\n\n const requestBody = operation.requestBody as\n | OpenApiRequestBodyObject\n | OpenApiReferenceObject\n | undefined;\n const requestBodyContent =\n requestBody && 'content' in requestBody\n ? (requestBody as OpenApiRequestBodyObject).content\n : undefined;\n const bodySchema = requestBodyContent?.['application/json']?.schema as\n | OpenApiSchemaObject\n | undefined;\n\n const bodySchemas = bodySchema\n ? [\n {\n name: `${pascal(verbOption.operationName)}Body`,\n schema: dereference(bodySchema, zodContext),\n },\n ]\n : [];\n\n const parameters = operation.parameters;\n\n const queryParams = parameters?.filter(\n (p): p is OpenApiParameterObject => 'in' in p && p.in === 'query',\n );\n\n const queryParamsSchemas =\n queryParams && queryParams.length > 0\n ? [\n {\n name: `${pascal(verbOption.operationName)}Params`,\n schema: {\n type: 'object' as const,\n properties: Object.fromEntries(\n queryParams\n .filter((p) => 'schema' in p && p.schema)\n .map((p) => [\n p.name,\n dereference(p.schema as OpenApiSchemaObject, zodContext),\n ]),\n ) as Record<string, OpenApiSchemaObject>,\n required: queryParams\n .filter((p) => p.required)\n .map((p) => p.name)\n .filter((name): name is string => name !== undefined),\n },\n },\n ]\n : [];\n\n const headerParams = parameters?.filter(\n (p): p is OpenApiParameterObject => 'in' in p && p.in === 'header',\n );\n\n const headerParamsSchemas =\n headerParams && headerParams.length > 0\n ? [\n {\n name: `${pascal(verbOption.operationName)}Headers`,\n schema: {\n type: 'object' as const,\n properties: Object.fromEntries(\n headerParams\n .filter((p) => 'schema' in p && p.schema)\n .map((p) => [\n p.name,\n dereference(p.schema as OpenApiSchemaObject, zodContext),\n ]),\n ) as Record<string, OpenApiSchemaObject>,\n required: headerParams\n .filter((p) => p.required)\n .map((p) => p.name)\n .filter((name): name is string => name !== undefined),\n },\n },\n ]\n : [];\n\n const responseSchemas = [\n ...verbOption.response.types.success,\n ...verbOption.response.types.errors,\n ]\n .filter(\n (\n responseType,\n ): responseType is typeof responseType & {\n originalSchema: OpenApiSchemaObject;\n } =>\n !!responseType.originalSchema &&\n !responseType.isRef &&\n isValidSchemaIdentifier(responseType.value) &&\n !isPrimitiveSchemaName(responseType.value),\n )\n .map((responseType) => ({\n name: responseType.value,\n schema: dereference(responseType.originalSchema, zodContext),\n }));\n\n return dedupeSchemasByName([\n ...bodySchemas,\n ...queryParamsSchemas,\n ...headerParamsSchemas,\n ...responseSchemas,\n ]);\n });\n\n const uniqueVerbsSchemas = dedupeSchemasByName(generateVerbsSchemas);\n const schemasToWrite: ZodSchemaFileToWrite[] = [];\n\n for (const { name, schema } of uniqueVerbsSchemas) {\n const fileName = conventionName(name, output.namingConvention);\n const filePath = upath.join(schemasPath, `${fileName}${fileExtension}`);\n\n const zodDefinition = generateZodValidationSchemaDefinition(\n schema,\n zodContext,\n name,\n strict,\n isZodV4,\n {\n required: true,\n },\n );\n\n const parsedZodDefinition = parseZodValidationSchemaDefinition(\n zodDefinition,\n zodContext,\n coerce,\n strict,\n isZodV4,\n );\n\n schemasToWrite.push({\n schemaName: name,\n filePath,\n consts: parsedZodDefinition.consts,\n zodExpression: parsedZodDefinition.zod,\n });\n }\n\n const groupedSchemasToWrite = groupSchemasByFilePath(schemasToWrite);\n\n for (const schemaGroup of groupedSchemasToWrite) {\n const fileContent = generateZodSchemaFileContent(header, schemaGroup);\n\n await fs.outputFile(schemaGroup[0].filePath, fileContent);\n }\n\n if (output.indexFiles && uniqueVerbsSchemas.length > 0) {\n const schemaNames = groupedSchemasToWrite.map(\n (schemaGroup) => schemaGroup[0].schemaName,\n );\n await writeZodSchemaIndex(\n schemasPath,\n fileExtension,\n header,\n schemaNames,\n output.namingConvention,\n true,\n );\n }\n}\n","import { styleText } from 'node:util';\n\nimport {\n createSuccessMessage,\n fixCrossDirectoryImports,\n fixRegularSchemaImports,\n getFileInfo,\n getMockFileExtensionByTypeName,\n isObject,\n isString,\n jsDoc,\n log,\n type NormalizedOptions,\n type OpenApiInfoObject,\n OutputMode,\n splitSchemasByType,\n upath,\n writeSchemas,\n writeSingleMode,\n type WriteSpecBuilder,\n writeSplitMode,\n writeSplitTagsMode,\n writeTagsMode,\n} from '@orval/core';\nimport { execa, ExecaError } from 'execa';\nimport fs from 'fs-extra';\nimport { unique } from 'remeda';\nimport type { TypeDocOptions } from 'typedoc';\n\nimport { formatWithPrettier } from './formatters/prettier';\nimport { executeHook } from './utils';\nimport { writeZodSchemas, writeZodSchemasFromVerbs } from './write-zod-specs';\n\nfunction getHeader(\n option: false | ((info: OpenApiInfoObject) => string | string[]),\n info: OpenApiInfoObject,\n): string {\n if (!option) {\n return '';\n }\n\n const header = option(info);\n return Array.isArray(header) ? jsDoc({ description: header }) : header;\n}\n\n/**\n * Add re-export of operation schemas from the main schemas index file.\n * Handles the case where the index file doesn't exist (no regular schemas).\n */\nasync function addOperationSchemasReExport(\n schemaPath: string,\n operationSchemasPath: string,\n fileExtension: string,\n header: string,\n): Promise<void> {\n const relativePath = upath.relativeSafe(schemaPath, operationSchemasPath);\n const schemaIndexPath = upath.join(schemaPath, `index${fileExtension}`);\n const exportLine = `export * from '${relativePath}';\\n`;\n\n const indexExists = await fs.pathExists(schemaIndexPath);\n if (indexExists) {\n // Check if export already exists to prevent duplicates on re-runs\n // Use regex to handle both single and double quotes\n const existingContent = await fs.readFile(schemaIndexPath, 'utf8');\n const exportPattern = new RegExp(\n String.raw`export\\s*\\*\\s*from\\s*['\"]${relativePath.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)}['\"]`,\n );\n if (!exportPattern.test(existingContent)) {\n await fs.appendFile(schemaIndexPath, exportLine);\n }\n } else {\n // Create index with header if file doesn't exist (no regular schemas case)\n const content =\n header && header.trim().length > 0\n ? `${header}\\n${exportLine}`\n : exportLine;\n await fs.outputFile(schemaIndexPath, content);\n }\n}\n\nexport async function writeSpecs(\n builder: WriteSpecBuilder,\n workspace: string,\n options: NormalizedOptions,\n projectName?: string,\n) {\n const { info, schemas, target } = builder;\n const { output } = options;\n const projectTitle = projectName ?? info.title;\n\n const header = getHeader(output.override.header, info);\n\n if (output.schemas) {\n if (isString(output.schemas)) {\n const fileExtension = output.fileExtension || '.ts';\n const schemaPath = output.schemas;\n\n // Split schemas if operationSchemas path is configured\n if (output.operationSchemas) {\n const { regularSchemas, operationSchemas: opSchemas } =\n splitSchemasByType(schemas);\n\n // Fix cross-directory imports before writing (both directions)\n const regularSchemaNames = new Set(regularSchemas.map((s) => s.name));\n const operationSchemaNames = new Set(opSchemas.map((s) => s.name));\n fixCrossDirectoryImports(\n opSchemas,\n regularSchemaNames,\n schemaPath,\n output.operationSchemas,\n output.namingConvention,\n fileExtension,\n );\n fixRegularSchemaImports(\n regularSchemas,\n operationSchemaNames,\n schemaPath,\n output.operationSchemas,\n output.namingConvention,\n fileExtension,\n );\n\n // Write regular schemas to schemas path\n if (regularSchemas.length > 0) {\n await writeSchemas({\n schemaPath,\n schemas: regularSchemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n }\n\n // Write operation schemas to operationSchemas path\n if (opSchemas.length > 0) {\n await writeSchemas({\n schemaPath: output.operationSchemas,\n schemas: opSchemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n\n // Add re-export from operations in the main schemas index\n if (output.indexFiles) {\n await addOperationSchemasReExport(\n schemaPath,\n output.operationSchemas,\n fileExtension,\n header,\n );\n }\n }\n } else {\n await writeSchemas({\n schemaPath,\n schemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n }\n } else {\n const schemaType = output.schemas.type;\n\n if (schemaType === 'typescript') {\n const fileExtension = output.fileExtension || '.ts';\n\n // Split schemas if operationSchemas path is configured\n if (output.operationSchemas) {\n const { regularSchemas, operationSchemas: opSchemas } =\n splitSchemasByType(schemas);\n\n // Fix cross-directory imports before writing (both directions)\n const regularSchemaNames = new Set(regularSchemas.map((s) => s.name));\n const operationSchemaNames = new Set(opSchemas.map((s) => s.name));\n fixCrossDirectoryImports(\n opSchemas,\n regularSchemaNames,\n output.schemas.path,\n output.operationSchemas,\n output.namingConvention,\n fileExtension,\n );\n fixRegularSchemaImports(\n regularSchemas,\n operationSchemaNames,\n output.schemas.path,\n output.operationSchemas,\n output.namingConvention,\n fileExtension,\n );\n\n if (regularSchemas.length > 0) {\n await writeSchemas({\n schemaPath: output.schemas.path,\n schemas: regularSchemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n }\n\n if (opSchemas.length > 0) {\n await writeSchemas({\n schemaPath: output.operationSchemas,\n schemas: opSchemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n\n // Add re-export from operations in the main schemas index\n if (output.indexFiles) {\n await addOperationSchemasReExport(\n output.schemas.path,\n output.operationSchemas,\n fileExtension,\n header,\n );\n }\n }\n } else {\n await writeSchemas({\n schemaPath: output.schemas.path,\n schemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n }\n } else {\n // schemaType === 'zod'\n const fileExtension = '.zod.ts';\n\n await writeZodSchemas(\n builder,\n output.schemas.path,\n fileExtension,\n header,\n output,\n );\n\n await writeZodSchemasFromVerbs(\n builder.verbOptions,\n output.schemas.path,\n fileExtension,\n header,\n output,\n {\n spec: builder.spec,\n target: builder.target,\n workspace,\n output,\n },\n );\n }\n }\n }\n\n let implementationPaths: string[] = [];\n\n if (output.target) {\n const writeMode = getWriteMode(output.mode);\n implementationPaths = await writeMode({\n builder,\n workspace,\n output,\n projectName,\n header,\n needSchema: !output.schemas && output.client !== 'zod',\n });\n }\n\n if (output.workspace) {\n const workspacePath = output.workspace;\n const imports = implementationPaths\n .filter(\n (path) =>\n !output.mock ||\n !path.endsWith(`.${getMockFileExtensionByTypeName(output.mock)}.ts`),\n )\n .map((path) =>\n upath.relativeSafe(\n workspacePath,\n getFileInfo(path).pathWithoutExtension,\n ),\n );\n\n if (output.schemas) {\n const schemasPath = isString(output.schemas)\n ? output.schemas\n : output.schemas.path;\n imports.push(\n upath.relativeSafe(workspacePath, getFileInfo(schemasPath).dirname),\n );\n }\n\n if (output.operationSchemas) {\n imports.push(\n upath.relativeSafe(\n workspacePath,\n getFileInfo(output.operationSchemas).dirname,\n ),\n );\n }\n\n if (output.indexFiles) {\n const indexFile = upath.join(workspacePath, '/index.ts');\n\n if (await fs.pathExists(indexFile)) {\n const data = await fs.readFile(indexFile, 'utf8');\n const importsNotDeclared = imports.filter((imp) => !data.includes(imp));\n await fs.appendFile(\n indexFile,\n unique(importsNotDeclared)\n .map((imp) => `export * from '${imp}';\\n`)\n .join(''),\n );\n } else {\n await fs.outputFile(\n indexFile,\n unique(imports)\n .map((imp) => `export * from '${imp}';`)\n .join('\\n') + '\\n',\n );\n }\n\n implementationPaths = [indexFile, ...implementationPaths];\n }\n }\n\n if (builder.extraFiles.length > 0) {\n await Promise.all(\n builder.extraFiles.map(async (file) =>\n fs.outputFile(file.path, file.content),\n ),\n );\n\n implementationPaths = [\n ...implementationPaths,\n ...builder.extraFiles.map((file) => file.path),\n ];\n }\n\n const paths = [\n ...(output.schemas\n ? [\n getFileInfo(\n isString(output.schemas) ? output.schemas : output.schemas.path,\n ).dirname,\n ]\n : []),\n ...(output.operationSchemas\n ? [getFileInfo(output.operationSchemas).dirname]\n : []),\n ...implementationPaths,\n ];\n\n if (options.hooks.afterAllFilesWrite) {\n await executeHook(\n 'afterAllFilesWrite',\n options.hooks.afterAllFilesWrite,\n paths,\n );\n }\n\n if (output.prettier) {\n await formatWithPrettier(paths, projectTitle);\n }\n\n if (output.biome) {\n try {\n await execa('biome', ['check', '--write', ...paths]);\n } catch (error) {\n let message = `⚠️ ${projectTitle ? `${projectTitle} - ` : ''}biome not found`;\n if (error instanceof ExecaError && error.exitCode === 1)\n message = error.message;\n\n log(styleText('yellow', message));\n }\n }\n\n if (output.docs) {\n try {\n let config: Partial<TypeDocOptions> = {};\n let configPath: string | undefined;\n if (isObject(output.docs)) {\n ({ configPath, ...config } = output.docs);\n if (configPath) {\n config.options = configPath;\n }\n }\n\n const getTypedocApplication = async () => {\n const { Application } = await import('typedoc');\n return Application;\n };\n\n const Application = await getTypedocApplication();\n const app = await Application.bootstrapWithPlugins({\n entryPoints: paths,\n theme: 'markdown',\n // Set the custom config location if it has been provided.\n ...config,\n plugin: ['typedoc-plugin-markdown', ...(config.plugin ?? [])],\n });\n // Set defaults if the have not been provided by the external config.\n if (!app.options.isSet('readme')) {\n app.options.setValue('readme', 'none');\n }\n if (!app.options.isSet('logLevel')) {\n app.options.setValue('logLevel', 'None');\n }\n const project = await app.convert();\n if (project) {\n const outputPath = app.options.getValue('out');\n await app.generateDocs(project, outputPath);\n\n if (output.prettier) {\n await formatWithPrettier([outputPath], projectTitle);\n }\n } else {\n throw new Error('TypeDoc not initialized');\n }\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : `⚠️ ${projectTitle ? `${projectTitle} - ` : ''}Unable to generate docs`;\n\n log(styleText('yellow', message));\n }\n }\n\n createSuccessMessage(projectTitle);\n}\n\nfunction getWriteMode(mode: OutputMode) {\n switch (mode) {\n case OutputMode.SPLIT: {\n return writeSplitMode;\n }\n case OutputMode.TAGS: {\n return writeTagsMode;\n }\n case OutputMode.TAGS_SPLIT: {\n return writeSplitTagsMode;\n }\n default: {\n return writeSingleMode;\n }\n }\n}\n","import {\n getFileInfo,\n isString,\n log,\n type NormalizedOptions,\n removeFilesAndEmptyFolders,\n} from '@orval/core';\n\nimport { importSpecs } from './import-specs';\nimport { writeSpecs } from './write-specs';\n\n/**\n * Generate client/spec files for a single Orval project.\n *\n * @param workspace - Absolute or relative workspace path used to resolve imports.\n * @param options - Normalized generation options for this project.\n * @param projectName - Optional project name used in logging output.\n * @returns A promise that resolves once generation (and optional cleaning) completes.\n *\n * @example\n * await generateSpec(process.cwd(), normalizedOptions, 'my-project');\n */\nexport async function generateSpec(\n workspace: string,\n options: NormalizedOptions,\n projectName?: string,\n) {\n if (options.output.clean) {\n const extraPatterns = Array.isArray(options.output.clean)\n ? options.output.clean\n : [];\n\n if (options.output.target) {\n await removeFilesAndEmptyFolders(\n ['**/*', '!**/*.d.ts', ...extraPatterns],\n getFileInfo(options.output.target).dirname,\n );\n }\n if (options.output.schemas) {\n const schemasPath = isString(options.output.schemas)\n ? options.output.schemas\n : options.output.schemas.path;\n await removeFilesAndEmptyFolders(\n ['**/*', '!**/*.d.ts', ...extraPatterns],\n getFileInfo(schemasPath).dirname,\n );\n }\n log(`${projectName} Cleaning output folder`);\n }\n\n const writeSpecBuilder = await importSpecs(workspace, options, projectName);\n await writeSpecs(writeSpecBuilder, workspace, options, projectName);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { type Config, type ConfigExternal, isFunction } from '@orval/core';\nimport { createJiti } from 'jiti';\n\n/**\n * Resolve the Orval config file path.\n *\n * @param configFilePath - Optional path to the config file (absolute or relative).\n * @returns The absolute path to the resolved config file.\n * @throws If a provided path does not exist or if no config file is found.\n *\n * @example\n * // explicit path\n * const p = findConfigFile('./orval.config.ts');\n *\n * @example\n * // automatic discovery (searches process.cwd())\n * const p = findConfigFile();\n */\nexport function findConfigFile(configFilePath?: string) {\n if (configFilePath) {\n const absolutePath = path.isAbsolute(configFilePath)\n ? configFilePath\n : path.resolve(process.cwd(), configFilePath);\n\n if (!fs.existsSync(absolutePath))\n throw new Error(`Config file ${configFilePath} does not exist`);\n\n return absolutePath;\n }\n\n const root = process.cwd();\n const exts = ['.ts', '.js', '.mjs', '.mts'];\n for (const ext of exts) {\n const fullPath = path.resolve(root, `orval.config${ext}`);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n }\n\n throw new Error(`No config file found in ${root}`);\n}\n\n/**\n * Load an Orval config file\n * @param configFilePath - Path to the config file (absolute or relative).\n * @returns The resolved Orval `Config` object.\n * @throws If the module does not provide a default export or the default export resolves to `undefined`.\n *\n * @example\n * // load a config object\n * const cfg = await loadConfigFile('./orval.config.ts');\n */\nexport async function loadConfigFile(configFilePath: string): Promise<Config> {\n const jiti = createJiti(process.cwd(), {\n interopDefault: true,\n });\n\n const configExternal = await jiti.import<ConfigExternal | undefined>(\n configFilePath,\n {\n default: true,\n },\n );\n\n if (configExternal === undefined) {\n throw new Error(`${configFilePath} doesn't have a default export`);\n }\n\n const config = await (isFunction(configExternal)\n ? configExternal()\n : configExternal);\n\n return config;\n}\n"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as defineConfig, i as startWatcher, n as loadConfigFile, o as defineTransformer, r as generateSpec, s as normalizeOptions, t as findConfigFile } from "./config-
|
|
1
|
+
import { a as defineConfig, i as startWatcher, n as loadConfigFile, o as defineTransformer, r as generateSpec, s as normalizeOptions, t as findConfigFile } from "./config-By98GXtB.mjs";
|
|
2
2
|
import { isString, logError, setVerbose } from "@orval/core";
|
|
3
3
|
|
|
4
4
|
export * from "@orval/core"
|
|
@@ -11,18 +11,18 @@ async function generate(optionsExport, workspace = process.cwd(), options) {
|
|
|
11
11
|
const configs = Object.entries(configFile);
|
|
12
12
|
let hasErrors = false;
|
|
13
13
|
for (const [projectName, config] of configs) {
|
|
14
|
-
const normalizedOptions
|
|
14
|
+
const normalizedOptions = await normalizeOptions(config, workspace, options);
|
|
15
15
|
if (options?.watch === void 0) try {
|
|
16
|
-
await generateSpec(workspace, normalizedOptions
|
|
16
|
+
await generateSpec(workspace, normalizedOptions, projectName);
|
|
17
17
|
} catch (error) {
|
|
18
18
|
hasErrors = true;
|
|
19
19
|
logError(error, projectName);
|
|
20
20
|
}
|
|
21
21
|
else {
|
|
22
|
-
const fileToWatch = isString(normalizedOptions
|
|
22
|
+
const fileToWatch = isString(normalizedOptions.input.target) ? normalizedOptions.input.target : void 0;
|
|
23
23
|
await startWatcher(options.watch, async () => {
|
|
24
24
|
try {
|
|
25
|
-
await generateSpec(workspace, normalizedOptions
|
|
25
|
+
await generateSpec(workspace, normalizedOptions, projectName);
|
|
26
26
|
} catch (error) {
|
|
27
27
|
logError(error, projectName);
|
|
28
28
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/generate.ts"],"sourcesContent":["import {\n type GlobalOptions,\n isString,\n logError,\n type OptionsExport,\n setVerbose,\n} from '@orval/core';\n\nimport { generateSpec } from './generate-spec';\nimport { findConfigFile, loadConfigFile } from './utils/config';\nimport { normalizeOptions } from './utils/options';\nimport { startWatcher } from './utils/watcher';\n\nexport async function generate(\n optionsExport?: string | OptionsExport,\n workspace = process.cwd(),\n options?: GlobalOptions,\n) {\n setVerbose(!!options?.verbose);\n\n if (!optionsExport || isString(optionsExport)) {\n const configFilePath = findConfigFile(optionsExport);\n const configFile = await loadConfigFile(configFilePath);\n\n const configs = Object.entries(configFile);\n\n let hasErrors = false;\n for (const [projectName, config] of configs) {\n const normalizedOptions = await normalizeOptions(\n config,\n workspace,\n options,\n );\n\n if (options?.watch === undefined) {\n try {\n await generateSpec(workspace, normalizedOptions, projectName);\n } catch (error) {\n hasErrors = true;\n logError(error, projectName);\n }\n } else {\n const fileToWatch = isString(normalizedOptions.input.target)\n ? normalizedOptions.input.target\n : undefined;\n\n await startWatcher(\n options.watch,\n async () => {\n try {\n await generateSpec(workspace, normalizedOptions, projectName);\n } catch (error) {\n logError(error, projectName);\n }\n },\n fileToWatch,\n );\n }\n }\n\n if (hasErrors)\n logError('One or more project failed, see above for details');\n\n return;\n }\n\n const normalizedOptions = await normalizeOptions(\n optionsExport,\n workspace,\n options,\n );\n\n if (options?.watch) {\n await startWatcher(\n options.watch,\n async () => {\n try {\n await generateSpec(workspace, normalizedOptions);\n } catch (error) {\n logError(error);\n }\n },\n normalizedOptions.input.target as string,\n );\n } else {\n try {\n await generateSpec(workspace, normalizedOptions);\n } catch (error) {\n logError(error);\n }\n }\n}\n"],"mappings":";;;;;;AAaA,eAAsB,SACpB,eACA,YAAY,QAAQ,KAAK,EACzB,SACA;AACA,YAAW,CAAC,CAAC,SAAS,QAAQ;AAE9B,KAAI,CAAC,iBAAiB,SAAS,cAAc,EAAE;EAE7C,MAAM,aAAa,MAAM,eADF,eAAe,cAAc,CACG;EAEvD,MAAM,UAAU,OAAO,QAAQ,WAAW;EAE1C,IAAI,YAAY;AAChB,OAAK,MAAM,CAAC,aAAa,WAAW,SAAS;GAC3C,MAAM,oBAAoB,MAAM,iBAC9B,QACA,WACA,QACD;AAED,OAAI,SAAS,UAAU,OACrB,KAAI;AACF,UAAM,aAAa,WAAW,mBAAmB,YAAY;YACtD,OAAO;AACd,gBAAY;AACZ,aAAS,OAAO,YAAY;;QAEzB;IACL,MAAM,cAAc,SAAS,kBAAkB,MAAM,OAAO,GACxD,kBAAkB,MAAM,SACxB;AAEJ,UAAM,aACJ,QAAQ,OACR,YAAY;AACV,SAAI;AACF,YAAM,aAAa,WAAW,mBAAmB,YAAY;cACtD,OAAO;AACd,eAAS,OAAO,YAAY;;OAGhC,YACD;;;AAIL,MAAI,UACF,UAAS,oDAAoD;AAE/D;;CAGF,MAAM,oBAAoB,MAAM,iBAC9B,eACA,WACA,QACD;AAED,KAAI,SAAS,MACX,OAAM,aACJ,QAAQ,OACR,YAAY;AACV,MAAI;AACF,SAAM,aAAa,WAAW,kBAAkB;WACzC,OAAO;AACd,YAAS,MAAM;;IAGnB,kBAAkB,MAAM,OACzB;KAED,KAAI;AACF,QAAM,aAAa,WAAW,kBAAkB;UACzC,OAAO;AACd,WAAS,MAAM"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orval",
|
|
3
3
|
"description": "A swagger client generator for typescript",
|
|
4
|
-
"version": "8.
|
|
4
|
+
"version": "8.5.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"files": [
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"!dist/**/*.d.mts.map"
|
|
11
11
|
],
|
|
12
12
|
"bin": "./dist/bin/orval.mjs",
|
|
13
|
+
"types": "./dist/index.d.mts",
|
|
13
14
|
"exports": {
|
|
14
15
|
".": "./dist/index.mjs",
|
|
15
16
|
"./bin/orval": "./dist/bin/orval.mjs",
|
|
@@ -52,39 +53,28 @@
|
|
|
52
53
|
},
|
|
53
54
|
"scripts": {
|
|
54
55
|
"build": "tsdown --config-loader unrun",
|
|
55
|
-
"dev": "tsdown --config-loader unrun --watch src
|
|
56
|
+
"dev": "tsdown --config-loader unrun --watch src",
|
|
56
57
|
"lint": "eslint .",
|
|
57
|
-
"generate-api": "orval --config ../../samples/react-query/hook-mutator-fetch/orval.config.ts",
|
|
58
58
|
"test": "vitest",
|
|
59
59
|
"clean": "rimraf .turbo dist",
|
|
60
60
|
"nuke": "rimraf .turbo dist node_modules"
|
|
61
61
|
},
|
|
62
|
-
"devDependencies": {
|
|
63
|
-
"@types/fs-extra": "^11.0.4",
|
|
64
|
-
"@types/js-yaml": "^4.0.9",
|
|
65
|
-
"eslint": "9.39.2",
|
|
66
|
-
"rimraf": "6.1.2",
|
|
67
|
-
"tsdown": "0.18.2",
|
|
68
|
-
"typescript": "5.9.3",
|
|
69
|
-
"vitest": "4.0.18"
|
|
70
|
-
},
|
|
71
62
|
"dependencies": {
|
|
72
63
|
"@commander-js/extra-typings": "^14.0.0",
|
|
73
|
-
"@orval/angular": "8.
|
|
74
|
-
"@orval/axios": "8.
|
|
75
|
-
"@orval/core": "8.
|
|
76
|
-
"@orval/fetch": "8.
|
|
77
|
-
"@orval/hono": "8.
|
|
78
|
-
"@orval/mcp": "8.
|
|
79
|
-
"@orval/mock": "8.
|
|
80
|
-
"@orval/query": "8.
|
|
81
|
-
"@orval/solid-start": "8.
|
|
82
|
-
"@orval/swr": "8.
|
|
83
|
-
"@orval/zod": "8.
|
|
64
|
+
"@orval/angular": "8.5.0",
|
|
65
|
+
"@orval/axios": "8.5.0",
|
|
66
|
+
"@orval/core": "8.5.0",
|
|
67
|
+
"@orval/fetch": "8.5.0",
|
|
68
|
+
"@orval/hono": "8.5.0",
|
|
69
|
+
"@orval/mcp": "8.5.0",
|
|
70
|
+
"@orval/mock": "8.5.0",
|
|
71
|
+
"@orval/query": "8.5.0",
|
|
72
|
+
"@orval/solid-start": "8.5.0",
|
|
73
|
+
"@orval/swr": "8.5.0",
|
|
74
|
+
"@orval/zod": "8.5.0",
|
|
84
75
|
"@scalar/json-magic": "^0.11.4",
|
|
85
76
|
"@scalar/openapi-parser": "^0.24.13",
|
|
86
77
|
"@scalar/openapi-types": "0.5.3",
|
|
87
|
-
"chalk": "^5.6.2",
|
|
88
78
|
"chokidar": "^5.0.0",
|
|
89
79
|
"commander": "^14.0.2",
|
|
90
80
|
"enquirer": "^2.4.1",
|
|
@@ -100,6 +90,15 @@
|
|
|
100
90
|
"typedoc-plugin-coverage": "^4.0.2",
|
|
101
91
|
"typedoc-plugin-markdown": "^4.9.0"
|
|
102
92
|
},
|
|
93
|
+
"devDependencies": {
|
|
94
|
+
"@types/fs-extra": "^11.0.4",
|
|
95
|
+
"@types/js-yaml": "^4.0.9",
|
|
96
|
+
"eslint": "9.39.2",
|
|
97
|
+
"rimraf": "6.1.2",
|
|
98
|
+
"tsdown": "0.20.3",
|
|
99
|
+
"typescript": "5.9.3",
|
|
100
|
+
"vitest": "4.0.18"
|
|
101
|
+
},
|
|
103
102
|
"peerDependencies": {
|
|
104
103
|
"prettier": ">=3.0.0"
|
|
105
104
|
},
|
|
@@ -107,8 +106,5 @@
|
|
|
107
106
|
"prettier": {
|
|
108
107
|
"optional": true
|
|
109
108
|
}
|
|
110
|
-
}
|
|
111
|
-
"main": "./dist/index.mjs",
|
|
112
|
-
"module": "./dist/index.mjs",
|
|
113
|
-
"types": "./dist/index.d.mts"
|
|
109
|
+
}
|
|
114
110
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config-CJllRUfR.mjs","names":["GENERATOR_CLIENT: GeneratorClients","generateClientImports: GeneratorClientImports","generateClientHeader: GeneratorClientHeader","generateClientFooter: GeneratorClientFooter","implementation: string","generateClientTitle: GeneratorClientTitle","generateExtraFiles","schemas: GeneratorSchema[]","context: ContextSpec","validateSpec","result: Record<string, unknown>","schemaNameMappings: Record<string, Record<string, string>>","out: Record<string, unknown>","isNullish","refObj: unknown","fs","results: string[]","name","name","version","mock: GlobalMockOptions | ClientMockBuilder | undefined","globalQueryOptions: NormalizedQueryOptions","normalizedOptions: NormalizedOptions","path","query","zod","result: NormalizedHookOptions","hono","pkg.name","pkg.version","description","version","name","schemasToWrite: ZodSchemaFileToWrite[]","context: ContextSpec","implementationPaths: string[]","path","config: Partial<TypeDocOptions>","configPath: string | undefined","fs"],"sources":["../package.json","../src/client.ts","../src/api.ts","../src/import-open-api.ts","../src/import-specs.ts","../src/formatters/prettier.ts","../src/utils/execute-hook.ts","../src/utils/package-json.ts","../src/utils/tsconfig.ts","../src/utils/options.ts","../src/utils/watcher.ts","../src/write-zod-specs.ts","../src/write-specs.ts","../src/generate-spec.ts","../src/utils/config.ts"],"sourcesContent":["","import angular from '@orval/angular';\nimport axios from '@orval/axios';\nimport {\n asyncReduce,\n type ClientFileBuilder,\n type ClientMockBuilder,\n type ClientMockGeneratorBuilder,\n type ContextSpec,\n generateDependencyImports,\n type GeneratorClientFooter,\n type GeneratorClientHeader,\n type GeneratorClientImports,\n type GeneratorClients,\n type GeneratorClientTitle,\n type GeneratorOperations,\n type GeneratorOptions,\n type GeneratorVerbOptions,\n type GeneratorVerbsOptions,\n isFunction,\n type NormalizedOutputOptions,\n OutputClient,\n type OutputClientFunc,\n pascal,\n} from '@orval/core';\nimport fetchClient from '@orval/fetch';\nimport hono from '@orval/hono';\nimport mcp from '@orval/mcp';\nimport * as mock from '@orval/mock';\nimport query from '@orval/query';\nimport solidStart from '@orval/solid-start';\nimport swr from '@orval/swr';\nimport zod from '@orval/zod';\n\nconst DEFAULT_CLIENT = OutputClient.AXIOS;\n\nconst getGeneratorClient = (\n outputClient: OutputClient | OutputClientFunc,\n output: NormalizedOutputOptions,\n) => {\n const GENERATOR_CLIENT: GeneratorClients = {\n axios: axios({ type: 'axios' })(),\n 'axios-functions': axios({ type: 'axios-functions' })(),\n angular: angular()(),\n 'angular-query': query({ output, type: 'angular-query' })(),\n 'react-query': query({ output, type: 'react-query' })(),\n 'solid-start': solidStart()(),\n 'solid-query': query({ output, type: 'solid-query' })(),\n 'svelte-query': query({ output, type: 'svelte-query' })(),\n 'vue-query': query({ output, type: 'vue-query' })(),\n swr: swr()(),\n zod: zod()(),\n hono: hono()(),\n fetch: fetchClient()(),\n mcp: mcp()(),\n };\n\n const generator = isFunction(outputClient)\n ? outputClient(GENERATOR_CLIENT)\n : GENERATOR_CLIENT[outputClient];\n\n return generator;\n};\n\nexport const generateClientImports: GeneratorClientImports = ({\n client,\n implementation,\n imports,\n projectName,\n hasSchemaDir,\n isAllowSyntheticDefaultImports,\n hasGlobalMutator,\n hasTagsMutator,\n hasParamsSerializerOptions,\n packageJson,\n output,\n}) => {\n const { dependencies } = getGeneratorClient(client, output);\n return generateDependencyImports(\n implementation,\n dependencies\n ? [\n ...dependencies(\n hasGlobalMutator,\n hasParamsSerializerOptions,\n packageJson,\n output.httpClient,\n hasTagsMutator,\n output.override,\n ),\n ...imports,\n ]\n : imports,\n projectName,\n hasSchemaDir,\n isAllowSyntheticDefaultImports,\n );\n};\n\nexport const generateClientHeader: GeneratorClientHeader = ({\n outputClient = DEFAULT_CLIENT,\n isRequestOptions,\n isGlobalMutator,\n isMutator,\n provideIn,\n hasAwaitedType,\n titles,\n output,\n verbOptions,\n tag,\n clientImplementation,\n}) => {\n const { header } = getGeneratorClient(outputClient, output);\n return {\n implementation: header\n ? header({\n title: titles.implementation,\n isRequestOptions,\n isGlobalMutator,\n isMutator,\n provideIn,\n hasAwaitedType,\n output,\n verbOptions,\n tag,\n clientImplementation,\n })\n : '',\n implementationMock: `export const ${titles.implementationMock} = () => [\\n`,\n };\n};\n\nexport const generateClientFooter: GeneratorClientFooter = ({\n outputClient,\n operationNames,\n hasMutator,\n hasAwaitedType,\n titles,\n output,\n}) => {\n const { footer } = getGeneratorClient(outputClient, output);\n\n if (!footer) {\n return {\n implementation: '',\n implementationMock: `\\n]\\n`,\n };\n }\n\n let implementation: string;\n try {\n if (isFunction(outputClient)) {\n implementation = (footer as (operationNames: string[]) => string)(\n operationNames,\n );\n // being here means that the previous call worked\n console.warn(\n '[WARN] Passing an array of strings for operations names to the footer function is deprecated and will be removed in a future major release. Please pass them in an object instead: { operationNames: string[] }.',\n );\n } else {\n implementation = footer({\n operationNames,\n title: titles.implementation,\n hasMutator,\n hasAwaitedType,\n });\n }\n } catch {\n implementation = footer({\n operationNames,\n title: titles.implementation,\n hasMutator,\n hasAwaitedType,\n });\n }\n\n return {\n implementation,\n implementationMock: `]\\n`,\n };\n};\n\nexport const generateClientTitle: GeneratorClientTitle = ({\n outputClient = DEFAULT_CLIENT,\n title,\n customTitleFunc,\n output,\n}) => {\n const { title: generatorTitle } = getGeneratorClient(outputClient, output);\n\n if (!generatorTitle) {\n return {\n implementation: '',\n implementationMock: `get${pascal(title)}Mock`,\n };\n }\n\n if (customTitleFunc) {\n const customTitle = customTitleFunc(title);\n return {\n implementation: generatorTitle(customTitle),\n implementationMock: `get${pascal(customTitle)}Mock`,\n };\n }\n return {\n implementation: generatorTitle(title),\n implementationMock: `get${pascal(title)}Mock`,\n };\n};\n\nconst generateMock = (\n verbOption: GeneratorVerbOptions,\n options: GeneratorOptions,\n): ClientMockGeneratorBuilder => {\n if (!options.mock) {\n return {\n implementation: {\n function: '',\n handler: '',\n handlerName: '',\n },\n imports: [],\n };\n }\n\n if (isFunction(options.mock)) {\n return options.mock(verbOption, options);\n }\n\n return mock.generateMock(\n verbOption,\n options as typeof options & {\n mock: Exclude<(typeof options)['mock'], ClientMockBuilder | undefined>;\n },\n );\n};\n\nexport const generateOperations = (\n outputClient: OutputClient | OutputClientFunc = DEFAULT_CLIENT,\n verbsOptions: GeneratorVerbsOptions,\n options: GeneratorOptions,\n output: NormalizedOutputOptions,\n): Promise<GeneratorOperations> => {\n return asyncReduce(\n verbsOptions,\n async (acc, verbOption) => {\n const { client: generatorClient } = getGeneratorClient(\n outputClient,\n output,\n );\n const client = await generatorClient(\n verbOption,\n options,\n outputClient,\n output,\n );\n\n if (!client.implementation) {\n return acc;\n }\n\n const generatedMock = generateMock(verbOption, options);\n\n acc[verbOption.operationId] = {\n implementation: verbOption.doc + client.implementation,\n imports: client.imports,\n implementationMock: generatedMock.implementation,\n importsMock: generatedMock.imports,\n tags: verbOption.tags,\n mutator: verbOption.mutator,\n clientMutators: client.mutators,\n formData: verbOption.formData,\n formUrlEncoded: verbOption.formUrlEncoded,\n paramsSerializer: verbOption.paramsSerializer,\n operationName: verbOption.operationName,\n fetchReviver: verbOption.fetchReviver,\n };\n\n return acc;\n },\n {} as GeneratorOperations,\n );\n};\n\nexport const generateExtraFiles = (\n outputClient: OutputClient | OutputClientFunc = DEFAULT_CLIENT,\n verbsOptions: Record<string, GeneratorVerbOptions>,\n output: NormalizedOutputOptions,\n context: ContextSpec,\n): Promise<ClientFileBuilder[]> => {\n const { extraFiles: generateExtraFiles } = getGeneratorClient(\n outputClient,\n output,\n );\n\n if (!generateExtraFiles) {\n return Promise.resolve([]);\n }\n\n return generateExtraFiles(verbsOptions, output, context);\n};\n","import {\n asyncReduce,\n type ContextSpec,\n generateVerbsOptions,\n type GeneratorApiBuilder,\n type GeneratorApiOperations,\n type GeneratorSchema,\n getFullRoute,\n getRoute,\n GetterPropType,\n isReference,\n type NormalizedInputOptions,\n type NormalizedOutputOptions,\n type OpenApiPathItemObject,\n resolveRef,\n} from '@orval/core';\nimport { generateMockImports } from '@orval/mock';\n\nimport {\n generateClientFooter,\n generateClientHeader,\n generateClientImports,\n generateClientTitle,\n generateExtraFiles,\n generateOperations,\n} from './client';\n\nexport async function getApiBuilder({\n input,\n output,\n context,\n}: {\n input: NormalizedInputOptions;\n output: NormalizedOutputOptions;\n context: ContextSpec;\n}): Promise<GeneratorApiBuilder> {\n const api = await asyncReduce(\n Object.entries(context.spec.paths ?? {}),\n async (acc, [pathRoute, verbs]) => {\n const route = getRoute(pathRoute);\n\n let resolvedVerbs = verbs;\n\n if (isReference(verbs)) {\n const { schema } = resolveRef<OpenApiPathItemObject>(verbs, context);\n\n resolvedVerbs = schema;\n }\n\n let verbsOptions = await generateVerbsOptions({\n verbs: resolvedVerbs,\n input,\n output,\n route,\n pathRoute,\n context,\n });\n\n // GitHub #564 check if we want to exclude deprecated operations\n if (output.override.useDeprecatedOperations === false) {\n verbsOptions = verbsOptions.filter((verb) => {\n return !verb.deprecated;\n });\n }\n\n const schemas: GeneratorSchema[] = [];\n for (const {\n queryParams,\n headers,\n body,\n response,\n props,\n } of verbsOptions) {\n schemas.push(\n ...props.flatMap((param) =>\n param.type === GetterPropType.NAMED_PATH_PARAMS ? param.schema : [],\n ),\n );\n if (queryParams) {\n schemas.push(queryParams.schema, ...queryParams.deps);\n }\n if (headers) {\n schemas.push(headers.schema, ...headers.deps);\n }\n\n schemas.push(...body.schemas, ...response.schemas);\n }\n\n const fullRoute = getFullRoute(\n route,\n verbs.servers ?? context.spec.servers,\n output.baseUrl,\n );\n if (!output.target) {\n throw new Error('Output does not have a target');\n }\n const pathOperations = await generateOperations(\n output.client,\n verbsOptions,\n {\n route: fullRoute,\n pathRoute,\n override: output.override,\n context,\n mock: output.mock,\n output: output.target,\n },\n output,\n );\n\n for (const verbOption of verbsOptions) {\n acc.verbOptions[verbOption.operationId] = verbOption;\n }\n acc.schemas.push(...schemas);\n acc.operations = { ...acc.operations, ...pathOperations };\n\n return acc;\n },\n {\n operations: {},\n verbOptions: {},\n schemas: [],\n } as GeneratorApiOperations,\n );\n\n const extraFiles = await generateExtraFiles(\n output.client,\n api.verbOptions,\n output,\n context,\n );\n\n return {\n operations: api.operations,\n schemas: api.schemas,\n verbOptions: api.verbOptions,\n title: generateClientTitle,\n header: generateClientHeader,\n footer: generateClientFooter,\n imports: generateClientImports,\n importsMock: generateMockImports,\n extraFiles,\n };\n}\n","import {\n type ContextSpec,\n dynamicImport,\n generateComponentDefinition,\n generateParameterDefinition,\n generateSchemasDefinition,\n type ImportOpenApi,\n type InputOptions,\n type NormalizedOutputOptions,\n type OpenApiComponentsObject,\n type OpenApiDocument,\n type OverrideInput,\n type WriteSpecBuilder,\n} from '@orval/core';\nimport { validate } from '@scalar/openapi-parser';\n\nimport { getApiBuilder } from './api';\n\nexport async function importOpenApi({\n spec,\n input,\n output,\n target,\n workspace,\n projectName,\n}: ImportOpenApi): Promise<WriteSpecBuilder> {\n const transformedOpenApi = await applyTransformer(\n spec,\n input.override.transformer,\n workspace,\n );\n\n const schemas = getApiSchemas({\n input,\n output,\n target,\n workspace,\n spec: transformedOpenApi,\n });\n\n const api = await getApiBuilder({\n input,\n output,\n context: {\n projectName,\n target,\n workspace,\n spec: transformedOpenApi,\n output,\n } satisfies ContextSpec,\n });\n\n return {\n ...api,\n schemas: [...schemas, ...api.schemas],\n target,\n // a valid spec will have info\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n info: transformedOpenApi.info!,\n spec: transformedOpenApi,\n };\n}\n\nasync function applyTransformer(\n openApi: OpenApiDocument,\n transformer: OverrideInput['transformer'],\n workspace: string,\n): Promise<OpenApiDocument> {\n const transformerFn = transformer\n ? await dynamicImport(transformer, workspace)\n : undefined;\n\n if (!transformerFn) {\n return openApi;\n }\n\n const transformedOpenApi = transformerFn(openApi);\n\n const { valid, errors } = await validate(transformedOpenApi);\n if (!valid) {\n throw new Error(`Validation failed`, { cause: errors });\n }\n\n return transformedOpenApi;\n}\n\ninterface GetApiSchemasOptions {\n input: InputOptions;\n output: NormalizedOutputOptions;\n workspace: string;\n target: string;\n spec: OpenApiDocument;\n}\n\nfunction getApiSchemas({\n input,\n output,\n target,\n workspace,\n spec,\n}: GetApiSchemasOptions) {\n const context: ContextSpec = {\n target,\n workspace,\n spec,\n output,\n };\n\n const schemaDefinition = generateSchemasDefinition(\n spec.components?.schemas,\n context,\n output.override.components.schemas.suffix,\n input.filters,\n );\n\n const responseDefinition = generateComponentDefinition(\n spec.components?.responses,\n context,\n output.override.components.responses.suffix,\n );\n\n const swaggerResponseDefinition = generateComponentDefinition(\n 'responses' in spec\n ? (spec as { responses?: OpenApiComponentsObject['responses'] }).responses\n : undefined,\n context,\n '',\n );\n\n const bodyDefinition = generateComponentDefinition(\n spec.components?.requestBodies,\n context,\n output.override.components.requestBodies.suffix,\n );\n\n const parameters = generateParameterDefinition(\n spec.components?.parameters,\n context,\n output.override.components.parameters.suffix,\n );\n\n const schemas = [\n ...schemaDefinition,\n ...responseDefinition,\n ...swaggerResponseDefinition,\n ...bodyDefinition,\n ...parameters,\n ];\n\n return schemas;\n}\n","import {\n isObject,\n isString,\n type NormalizedOptions,\n type OpenApiDocument,\n type WriteSpecBuilder,\n} from '@orval/core';\nimport { bundle } from '@scalar/json-magic/bundle';\nimport {\n fetchUrls,\n parseJson,\n parseYaml,\n readFiles,\n} from '@scalar/json-magic/bundle/plugins/node';\nimport { upgrade, validate as validateSpec } from '@scalar/openapi-parser';\nimport { isNullish } from 'remeda';\n\nimport { importOpenApi } from './import-open-api';\n\nasync function resolveSpec(\n input: string | Record<string, unknown>,\n parserOptions?: {\n headers?: {\n domains: string[];\n headers: Record<string, string>;\n }[];\n },\n): Promise<OpenApiDocument> {\n const data = await bundle(input, {\n plugins: [\n readFiles(),\n fetchUrls({\n headers: parserOptions?.headers,\n }),\n parseJson(),\n parseYaml(),\n ],\n treeShake: false,\n });\n const dereferencedData = dereferenceExternalRef(\n data as Record<string, unknown>,\n );\n const { valid, errors } = await validateSpec(dereferencedData);\n if (!valid) {\n throw new Error('Validation failed', { cause: errors });\n }\n\n const { specification } = upgrade(dereferencedData);\n\n return specification;\n}\n\nexport async function importSpecs(\n workspace: string,\n options: NormalizedOptions,\n projectName?: string,\n): Promise<WriteSpecBuilder> {\n const { input, output } = options;\n\n const spec = await resolveSpec(input.target, input.parserOptions);\n\n return importOpenApi({\n spec,\n input,\n output,\n target: input.target,\n workspace,\n projectName,\n });\n}\n\n/**\n * The plugins from `@scalar/json-magic` does not dereference $ref.\n * Instead it fetches them and puts them under x-ext, and changes the $ref to point to #x-ext/<name>.\n * This function:\n * 1. Merges external schemas into main spec's components.schemas (with collision handling)\n * 2. Replaces x-ext refs with standard component refs or inlined content\n */\nexport function dereferenceExternalRef(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const extensions = (data['x-ext'] ?? {}) as Record<string, unknown>;\n\n // Step 1: Merge external schemas into main spec with collision handling\n const schemaNameMappings = mergeExternalSchemas(data, extensions);\n\n // Step 2: Replace all x-ext refs throughout the document\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n if (key !== 'x-ext') {\n result[key] = replaceXExtRefs(value, extensions, schemaNameMappings);\n }\n }\n\n return result;\n}\n\n/**\n * Merge external document schemas into main spec's components.schemas\n * Returns mapping of original schema names to final names (with suffixes for collisions)\n */\nfunction mergeExternalSchemas(\n data: Record<string, unknown>,\n extensions: Record<string, unknown>,\n): Record<string, Record<string, string>> {\n const schemaNameMappings: Record<string, Record<string, string>> = {};\n\n data.components ??= {};\n const mainComponents = data.components as Record<string, unknown>;\n mainComponents.schemas ??= {};\n const mainSchemas = mainComponents.schemas as Record<string, unknown>;\n\n // Merge schemas from each external doc\n // Collision handling:\n // - If schema already exists in main spec, add x-ext key as suffix (e.g., User -> User_external1)\n // - x-ext refs in main spec get replaced by actual schema from external doc\n for (const [extKey, extDoc] of Object.entries(extensions)) {\n schemaNameMappings[extKey] = {};\n\n if (isObject(extDoc) && 'components' in extDoc) {\n const extComponents = (extDoc as Record<string, unknown>)\n .components as Record<string, unknown>;\n if (isObject(extComponents) && 'schemas' in extComponents) {\n const extSchemas = extComponents.schemas as Record<string, unknown>;\n for (const [schemaName, schema] of Object.entries(extSchemas)) {\n // Check if main schema is just an x-ext ref - if so, replace it without suffix\n const existingSchema = mainSchemas[schemaName];\n const isXExtRef =\n isObject(existingSchema) &&\n '$ref' in existingSchema &&\n isString((existingSchema as Record<string, unknown>).$ref) &&\n (\n (existingSchema as Record<string, unknown>).$ref as string\n ).startsWith('#/x-ext/');\n\n let finalSchemaName = schemaName;\n\n if (schemaName in mainSchemas && !isXExtRef) {\n // Collision: add suffix to external schema\n const suffix = extKey.replaceAll(/[^a-zA-Z0-9]/g, '_');\n finalSchemaName = `${schemaName}_${suffix}`;\n schemaNameMappings[extKey][schemaName] = finalSchemaName;\n } else {\n // No collision or replacing x-ext ref\n schemaNameMappings[extKey][schemaName] = schemaName;\n }\n\n mainSchemas[finalSchemaName] = scrubUnwantedKeys(schema);\n }\n }\n }\n }\n\n // Apply internal ref updates to all schemas from external docs\n for (const [extKey, mapping] of Object.entries(schemaNameMappings)) {\n for (const [, finalName] of Object.entries(mapping)) {\n const schema = mainSchemas[finalName];\n if (schema) {\n mainSchemas[finalName] = updateInternalRefs(\n schema,\n extKey,\n schemaNameMappings,\n ) as Record<string, unknown>;\n }\n }\n }\n\n return schemaNameMappings;\n}\n\n/**\n * Remove unwanted keys like $schema and $id from objects\n */\nfunction scrubUnwantedKeys(obj: unknown): unknown {\n const UNWANTED_KEYS = new Set(['$schema', '$id']);\n\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map((x) => scrubUnwantedKeys(x));\n if (isObject(obj)) {\n const rec = obj as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(rec)) {\n if (UNWANTED_KEYS.has(k)) continue;\n out[k] = scrubUnwantedKeys(v);\n }\n return out;\n }\n return obj;\n}\n\n/**\n * Update internal refs within an external schema to use suffixed names\n */\nfunction updateInternalRefs(\n obj: unknown,\n extKey: string,\n schemaNameMappings: Record<string, Record<string, string>>,\n): unknown {\n if (obj === null || obj === undefined) return obj;\n\n if (Array.isArray(obj)) {\n return obj.map((element) =>\n updateInternalRefs(element, extKey, schemaNameMappings),\n );\n }\n\n if (isObject(obj)) {\n const record = obj as Record<string, unknown>;\n\n // Check if this is a $ref to #/components/schemas/...\n if ('$ref' in record && isString(record.$ref)) {\n const refValue = record.$ref;\n if (refValue.startsWith('#/components/schemas/')) {\n const schemaName = refValue.replace('#/components/schemas/', '');\n // If this schema was mapped to a suffixed name, update the ref\n const mappedName = schemaNameMappings[extKey][schemaName];\n if (mappedName) {\n return {\n $ref: `#/components/schemas/${mappedName}`,\n };\n }\n }\n }\n\n // Recursively process all properties\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n result[key] = updateInternalRefs(value, extKey, schemaNameMappings);\n }\n return result;\n }\n\n return obj;\n}\n\n/**\n * Replace x-ext refs with either standard component refs or inlined content\n */\nfunction replaceXExtRefs(\n obj: unknown,\n extensions: Record<string, unknown>,\n schemaNameMappings: Record<string, Record<string, string>>,\n): unknown {\n if (isNullish(obj)) return obj;\n\n if (Array.isArray(obj)) {\n return obj.map((element) =>\n replaceXExtRefs(element, extensions, schemaNameMappings),\n );\n }\n\n if (isObject(obj)) {\n const record = obj;\n\n // Check if this object is a $ref to x-ext\n if ('$ref' in record && isString(record.$ref)) {\n const refValue = record.$ref;\n if (refValue.startsWith('#/x-ext/')) {\n // Parse the x-ext ref\n const pathStr = refValue.replace('#/x-ext/', '');\n const parts = pathStr.split('/');\n const extKey = parts.shift();\n\n if (extKey) {\n // Check if this is a ref to components/schemas - if so, replace with standard ref\n if (\n parts.length >= 3 &&\n parts[0] === 'components' &&\n parts[1] === 'schemas'\n ) {\n const schemaName = parts.slice(2).join('/');\n // Use the mapped name (which may include suffix for collisions)\n const finalName =\n schemaNameMappings[extKey][schemaName] || schemaName;\n return { $ref: `#/components/schemas/${finalName}` };\n }\n\n // Otherwise, inline the referenced content\n const extDoc = extensions[extKey];\n let refObj: unknown = extDoc;\n for (const p of parts) {\n if (\n refObj &&\n (isObject(refObj) || Array.isArray(refObj)) &&\n p in (refObj as Record<string, unknown>)\n ) {\n refObj = (refObj as Record<string, unknown>)[p];\n } else {\n refObj = undefined;\n break;\n }\n }\n\n if (refObj) {\n const cleaned = scrubUnwantedKeys(refObj);\n return replaceXExtRefs(cleaned, extensions, schemaNameMappings);\n }\n }\n }\n }\n\n // Recursively process all properties\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(record)) {\n result[key] = replaceXExtRefs(value, extensions, schemaNameMappings);\n }\n return result;\n }\n\n return obj;\n}\n","import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nimport { log } from '@orval/core';\nimport chalk from 'chalk';\nimport { execa } from 'execa';\n\n/**\n * Format files with prettier.\n * Tries the programmatic API first (project dependency),\n * then falls back to the globally installed CLI.\n */\nexport async function formatWithPrettier(\n paths: string[],\n projectTitle?: string,\n): Promise<void> {\n const prettier = await tryImportPrettier();\n\n if (prettier) {\n const filePaths = await collectFilePaths(paths);\n const config = await prettier.resolveConfig(filePaths[0]);\n await Promise.all(\n filePaths.map(async (filePath) => {\n const content = await fs.readFile(filePath, 'utf8');\n try {\n const formatted = await prettier.format(content, {\n ...config,\n // options.filepath can be specified for Prettier to infer the parser from the file extension\n filepath: filePath,\n });\n await fs.writeFile(filePath, formatted);\n } catch (error) {\n if (error instanceof Error) {\n // prettier currently doesn't export UndefinedParserError, so having to do it the crude way\n if (error.name === 'UndefinedParserError') {\n // skip files with unsupported parsers\n // https://prettier.io/docs/options#parser\n } else {\n log(\n chalk.yellow(\n `⚠️ ${projectTitle ? `${projectTitle} - ` : ''}Failed to format file ${filePath}: ${error.toString()}`,\n ),\n );\n }\n } else {\n log(\n chalk.yellow(\n `⚠️ ${projectTitle ? `${projectTitle} - ` : ''}Failed to format file ${filePath}: unknown error}`,\n ),\n );\n }\n }\n }),\n );\n\n return;\n }\n\n // fallback to globally installed prettier\n try {\n await execa('prettier', ['--write', ...paths]);\n } catch {\n log(\n chalk.yellow(\n `⚠️ ${projectTitle ? `${projectTitle} - ` : ''}prettier not found. Install it as a project dependency or globally.`,\n ),\n );\n }\n}\n\n/**\n * Try to import prettier from the project's dependencies.\n * Returns undefined if prettier is not installed.\n */\nasync function tryImportPrettier() {\n try {\n return await import('prettier');\n } catch {\n return;\n }\n}\n\n/**\n * Recursively collect absolute file paths from a mix of files and directories.\n */\nasync function collectFilePaths(paths: string[]): Promise<string[]> {\n const results: string[] = [];\n\n for (const p of paths) {\n const absolute = path.resolve(p);\n try {\n const stat = await fs.stat(absolute);\n if (stat.isFile()) {\n results.push(absolute);\n } else if (stat.isDirectory()) {\n const entries = await fs.readdir(absolute);\n const subPaths = entries.map((entry) => path.join(absolute, entry));\n const subFiles = await collectFilePaths(subPaths);\n results.push(...subFiles);\n }\n } catch {\n // Skip paths that don't exist or can't be accessed\n }\n }\n\n return results;\n}\n","import {\n type Hook,\n type HookOption,\n isFunction,\n isObject,\n isString,\n log,\n logError,\n type NormalizedHookCommand,\n} from '@orval/core';\nimport chalk from 'chalk';\nimport { execa } from 'execa';\nimport { parseArgsStringToArgv } from 'string-argv';\n\nexport const executeHook = async (\n name: Hook,\n commands: NormalizedHookCommand = [],\n args: string[] = [],\n) => {\n log(chalk.white(`Running ${name} hook...`));\n\n for (const command of commands) {\n try {\n if (isString(command)) {\n await executeCommand(command, args);\n } else if (isFunction(command)) {\n await command(args);\n } else if (isObject(command)) {\n await executeObjectCommand(command as HookOption, args);\n }\n } catch (error) {\n logError(error, `Failed to run ${name} hook`);\n }\n }\n};\n\nasync function executeCommand(command: string, args: string[]) {\n const [cmd, ..._args] = [...parseArgsStringToArgv(command), ...args];\n\n await execa(cmd, _args);\n}\n\nasync function executeObjectCommand(command: HookOption, args: string[]) {\n if (command.injectGeneratedDirsAndFiles === false) {\n args = [];\n }\n\n if (isString(command.command)) {\n await executeCommand(command.command, args);\n } else if (isFunction(command.command)) {\n await command.command();\n }\n}\n","import {\n dynamicImport,\n isObject,\n isString,\n log,\n logVerbose,\n type PackageJson,\n resolveInstalledVersions,\n} from '@orval/core';\nimport chalk from 'chalk';\nimport { findUp, findUpMultiple } from 'find-up';\nimport fs from 'fs-extra';\nimport yaml from 'js-yaml';\n\nimport { normalizePath } from './options';\n\ntype CatalogData = Pick<PackageJson, 'catalog' | 'catalogs'>;\n\nexport const loadPackageJson = async (\n packageJson?: string,\n workspace = process.cwd(),\n): Promise<PackageJson | undefined> => {\n if (!packageJson) {\n const pkgPath = await findUp(['package.json'], { cwd: workspace });\n if (pkgPath) {\n const pkg = await dynamicImport<unknown>(pkgPath, workspace);\n\n if (isPackageJson(pkg)) {\n return resolveAndAttachVersions(\n await maybeReplaceCatalog(pkg, workspace),\n workspace,\n pkgPath,\n );\n } else {\n throw new Error('Invalid package.json file');\n }\n }\n return;\n }\n\n const normalizedPath = normalizePath(packageJson, workspace);\n if (fs.existsSync(normalizedPath)) {\n const pkg = await dynamicImport<unknown>(normalizedPath);\n\n if (isPackageJson(pkg)) {\n return resolveAndAttachVersions(\n await maybeReplaceCatalog(pkg, workspace),\n workspace,\n normalizedPath,\n );\n } else {\n throw new Error(`Invalid package.json file: ${normalizedPath}`);\n }\n }\n return;\n};\n\nconst isPackageJson = (obj: unknown): obj is PackageJson => isObject(obj);\n\nconst resolvedCache = new Map<string, Record<string, string>>();\n\n/** @internal visible for testing */\nexport const _resetResolvedCache = () => {\n resolvedCache.clear();\n};\n\nconst resolveAndAttachVersions = (\n pkg: PackageJson,\n workspace: string,\n cacheKey: string,\n): PackageJson => {\n const cached = resolvedCache.get(cacheKey);\n if (cached) {\n pkg.resolvedVersions = cached;\n return pkg;\n }\n\n const resolved = resolveInstalledVersions(pkg, workspace);\n if (Object.keys(resolved).length > 0) {\n pkg.resolvedVersions = resolved;\n resolvedCache.set(cacheKey, resolved);\n for (const [name, version] of Object.entries(resolved)) {\n logVerbose(\n chalk.dim(`Detected ${chalk.white(name)} v${chalk.white(version)}`),\n );\n }\n }\n return pkg;\n};\n\nconst hasCatalogReferences = (pkg: PackageJson): boolean => {\n return [\n ...Object.entries(pkg.dependencies ?? {}),\n ...Object.entries(pkg.devDependencies ?? {}),\n ...Object.entries(pkg.peerDependencies ?? {}),\n ].some(([, value]) => isString(value) && value.startsWith('catalog:'));\n};\n\nconst loadPnpmWorkspaceCatalog = async (\n workspace: string,\n): Promise<CatalogData | undefined> => {\n const filePath = await findUp('pnpm-workspace.yaml', { cwd: workspace });\n if (!filePath) return undefined;\n try {\n const file = await fs.readFile(filePath, 'utf8');\n const data = yaml.load(file) as Record<string, unknown> | undefined;\n if (!data?.catalog && !data?.catalogs) return undefined;\n return {\n catalog: data.catalog as CatalogData['catalog'],\n catalogs: data.catalogs as CatalogData['catalogs'],\n };\n } catch {\n return undefined;\n }\n};\n\nconst loadPackageJsonCatalog = async (\n workspace: string,\n): Promise<CatalogData | undefined> => {\n const filePaths = await findUpMultiple('package.json', { cwd: workspace });\n\n for (const filePath of filePaths) {\n try {\n const pkg = (await fs.readJson(filePath)) as Record<string, unknown>;\n if (pkg.catalog || pkg.catalogs) {\n return {\n catalog: pkg.catalog as CatalogData['catalog'],\n catalogs: pkg.catalogs as CatalogData['catalogs'],\n };\n }\n } catch {\n // Continue to next file\n }\n }\n return undefined;\n};\n\nconst loadYarnrcCatalog = async (\n workspace: string,\n): Promise<CatalogData | undefined> => {\n const filePath = await findUp('.yarnrc.yml', { cwd: workspace });\n if (!filePath) return undefined;\n try {\n const file = await fs.readFile(filePath, 'utf8');\n const data = yaml.load(file) as Record<string, unknown> | undefined;\n if (!data?.catalog && !data?.catalogs) return undefined;\n return {\n catalog: data.catalog as CatalogData['catalog'],\n catalogs: data.catalogs as CatalogData['catalogs'],\n };\n } catch {\n return undefined;\n }\n};\n\nconst maybeReplaceCatalog = async (\n pkg: PackageJson,\n workspace: string,\n): Promise<PackageJson> => {\n if (!hasCatalogReferences(pkg)) {\n return pkg;\n }\n\n const catalogData =\n (await loadPnpmWorkspaceCatalog(workspace)) ??\n (await loadPackageJsonCatalog(workspace)) ??\n (await loadYarnrcCatalog(workspace));\n\n if (!catalogData) {\n log(\n `⚠️ ${chalk.yellow('package.json contains catalog: references, but no catalog source was found (checked: pnpm-workspace.yaml, package.json, .yarnrc.yml).')}`,\n );\n return pkg;\n }\n\n performSubstitution(pkg.dependencies, catalogData);\n performSubstitution(pkg.devDependencies, catalogData);\n performSubstitution(pkg.peerDependencies, catalogData);\n\n return pkg;\n};\n\nconst performSubstitution = (\n dependencies: Record<string, string> | undefined,\n catalogData: CatalogData,\n) => {\n if (!dependencies) return;\n for (const [packageName, version] of Object.entries(dependencies)) {\n if (version === 'catalog:' || version === 'catalog:default') {\n if (!catalogData.catalog) {\n log(\n `⚠️ ${chalk.yellow(`catalog: substitution for the package '${packageName}' failed as there is no default catalog.`)}`,\n );\n continue;\n }\n const sub = catalogData.catalog[packageName];\n if (!sub) {\n log(\n `⚠️ ${chalk.yellow(`catalog: substitution for the package '${packageName}' failed as there is no matching package in the default catalog.`)}`,\n );\n continue;\n }\n dependencies[packageName] = sub;\n } else if (version.startsWith('catalog:')) {\n const catalogName = version.slice('catalog:'.length);\n const catalog = catalogData.catalogs?.[catalogName];\n if (!catalog) {\n log(\n `⚠️ ${chalk.yellow(`'${version}' substitution for the package '${packageName}' failed as there is no matching catalog named '${catalogName}'. (available named catalogs are: ${Object.keys(catalogData.catalogs ?? {}).join(', ')})`)}`,\n );\n continue;\n }\n const sub = catalog[packageName];\n if (!sub) {\n log(\n `⚠️ ${chalk.yellow(`'${version}' substitution for the package '${packageName}' failed as there is no package in the catalog named '${catalogName}'. (packages in the catalog are: ${Object.keys(catalog).join(', ')})`)}`,\n );\n continue;\n }\n dependencies[packageName] = sub;\n }\n }\n};\n","import { isNullish, isObject, isString, type Tsconfig } from '@orval/core';\nimport { findUp } from 'find-up';\nimport fs from 'fs-extra';\nimport { parse } from 'tsconfck';\n\nimport { normalizePath } from './options';\n\nexport const loadTsconfig = async (\n tsconfig?: Tsconfig | string,\n workspace = process.cwd(),\n): Promise<Tsconfig | undefined> => {\n if (isNullish(tsconfig)) {\n const configPath = await findUp(['tsconfig.json', 'jsconfig.json'], {\n cwd: workspace,\n });\n if (configPath) {\n const config = await parse(configPath);\n return config.tsconfig as Tsconfig;\n }\n return;\n }\n\n if (isString(tsconfig)) {\n const normalizedPath = normalizePath(tsconfig, workspace);\n if (fs.existsSync(normalizedPath)) {\n const config = await parse(normalizedPath);\n\n const tsconfig = (config.referenced?.find(\n ({ tsconfigFile }) => tsconfigFile === normalizedPath,\n )?.tsconfig ?? config.tsconfig) as Tsconfig;\n\n return tsconfig;\n }\n return;\n }\n\n if (isObject(tsconfig)) {\n return tsconfig;\n }\n return;\n};\n","import {\n type ClientMockBuilder,\n type ConfigExternal,\n createLogger,\n FormDataArrayHandling,\n type GlobalMockOptions,\n type GlobalOptions,\n type HonoOptions,\n type Hook,\n type HookFunction,\n type HookOption,\n type HooksOptions,\n type InputTransformerFn,\n isBoolean,\n isFunction,\n isNullish,\n isObject,\n isString,\n isUrl,\n type JsDocOptions,\n type Mutator,\n NamingConvention,\n type NormalizedHonoOptions,\n type NormalizedHookOptions,\n type NormalizedJsDocOptions,\n type NormalizedMutator,\n type NormalizedOperationOptions,\n type NormalizedOptions,\n type NormalizedOverrideOutput,\n type NormalizedQueryOptions,\n type NormalizedSchemaOptions,\n type OperationOptions,\n type OptionsExport,\n OutputClient,\n OutputHttpClient,\n OutputMode,\n type OverrideOutput,\n PropertySortOrder,\n type QueryOptions,\n RefComponentSuffix,\n type SchemaOptions,\n upath,\n} from '@orval/core';\nimport { DEFAULT_MOCK_OPTIONS } from '@orval/mock';\nimport chalk from 'chalk';\n\nimport pkg from '../../package.json';\nimport { loadPackageJson } from './package-json';\nimport { loadTsconfig } from './tsconfig';\n\n/**\n * Type helper to make it easier to use orval.config.ts\n * accepts a direct {@link ConfigExternal} object.\n */\nexport function defineConfig(options: ConfigExternal): ConfigExternal {\n return options;\n}\n\n/**\n * Type helper to make it easier to write input transformers.\n * accepts a direct {@link InputTransformerFn} function.\n */\nexport function defineTransformer(\n transformer: InputTransformerFn,\n): InputTransformerFn {\n return transformer;\n}\n\nfunction createFormData(\n workspace: string,\n formData: OverrideOutput['formData'],\n): NormalizedOverrideOutput['formData'] {\n const defaultArrayHandling = FormDataArrayHandling.SERIALIZE;\n if (formData === undefined)\n return { disabled: false, arrayHandling: defaultArrayHandling };\n if (isBoolean(formData))\n return { disabled: !formData, arrayHandling: defaultArrayHandling };\n if (isString(formData))\n return {\n disabled: false,\n mutator: normalizeMutator(workspace, formData),\n arrayHandling: defaultArrayHandling,\n };\n if ('mutator' in formData || 'arrayHandling' in formData)\n return {\n disabled: false,\n mutator: normalizeMutator(workspace, formData.mutator),\n arrayHandling: formData.arrayHandling ?? defaultArrayHandling,\n };\n return {\n disabled: false,\n mutator: normalizeMutator(workspace, formData),\n arrayHandling: defaultArrayHandling,\n };\n}\n\nfunction normalizeSchemasOption(\n schemas: string | SchemaOptions | undefined,\n workspace: string,\n): string | NormalizedSchemaOptions | undefined {\n if (!schemas) {\n return undefined;\n }\n\n if (isString(schemas)) {\n return normalizePath(schemas, workspace);\n }\n\n return {\n path: normalizePath(schemas.path, workspace),\n type: schemas.type,\n };\n}\n\nexport async function normalizeOptions(\n optionsExport: OptionsExport,\n workspace = process.cwd(),\n globalOptions: GlobalOptions = {},\n): Promise<NormalizedOptions> {\n const options = await (isFunction(optionsExport)\n ? optionsExport()\n : optionsExport);\n\n if (!options.input) {\n throw new Error(chalk.red(`Config require an input`));\n }\n\n if (!options.output) {\n throw new Error(chalk.red(`Config require an output`));\n }\n\n const inputOptions = isString(options.input)\n ? { target: options.input }\n : options.input;\n\n const outputOptions = isString(options.output)\n ? { target: options.output }\n : options.output;\n\n const outputWorkspace = normalizePath(\n outputOptions.workspace ?? '',\n workspace,\n );\n\n const { clean, prettier, client, httpClient, mode, biome } = globalOptions;\n\n const tsconfig = await loadTsconfig(\n outputOptions.tsconfig ?? globalOptions.tsconfig,\n workspace,\n );\n\n const packageJson = await loadPackageJson(\n outputOptions.packageJson ?? globalOptions.packageJson,\n workspace,\n );\n\n const mockOption = outputOptions.mock ?? globalOptions.mock;\n let mock: GlobalMockOptions | ClientMockBuilder | undefined;\n if (isBoolean(mockOption) && mockOption) {\n mock = DEFAULT_MOCK_OPTIONS;\n } else if (isFunction(mockOption)) {\n mock = mockOption;\n } else if (mockOption) {\n mock = {\n ...DEFAULT_MOCK_OPTIONS,\n ...mockOption,\n };\n } else {\n mock = undefined;\n }\n\n const defaultFileExtension = '.ts';\n\n const globalQueryOptions: NormalizedQueryOptions = {\n useQuery: true,\n useMutation: true,\n signal: true,\n shouldExportMutatorHooks: true,\n shouldExportHttpClient: true,\n shouldExportQueryKey: true,\n shouldSplitQueryKey: false,\n ...normalizeQueryOptions(outputOptions.override?.query, workspace),\n };\n\n const normalizedOptions: NormalizedOptions = {\n input: {\n target: globalOptions.input\n ? normalizePathOrUrl(globalOptions.input, process.cwd())\n : normalizePathOrUrl(inputOptions.target, workspace),\n override: {\n transformer: normalizePath(\n inputOptions.override?.transformer,\n workspace,\n ),\n },\n filters: inputOptions.filters,\n parserOptions: inputOptions.parserOptions,\n },\n output: {\n target: globalOptions.output\n ? normalizePath(globalOptions.output, process.cwd())\n : normalizePath(outputOptions.target, outputWorkspace),\n schemas: normalizeSchemasOption(outputOptions.schemas, outputWorkspace),\n operationSchemas: outputOptions.operationSchemas\n ? normalizePath(outputOptions.operationSchemas, outputWorkspace)\n : undefined,\n namingConvention:\n outputOptions.namingConvention ?? NamingConvention.CAMEL_CASE,\n fileExtension: outputOptions.fileExtension ?? defaultFileExtension,\n workspace: outputOptions.workspace ? outputWorkspace : undefined,\n client: outputOptions.client ?? client ?? OutputClient.AXIOS_FUNCTIONS,\n httpClient:\n outputOptions.httpClient ??\n httpClient ??\n // Auto-detect: use Angular HttpClient for angular-query by default\n ((outputOptions.client ?? client) === OutputClient.ANGULAR_QUERY\n ? OutputHttpClient.ANGULAR\n : OutputHttpClient.FETCH),\n mode: normalizeOutputMode(outputOptions.mode ?? mode),\n mock,\n clean: outputOptions.clean ?? clean ?? false,\n docs: outputOptions.docs ?? false,\n prettier: outputOptions.prettier ?? prettier ?? false,\n biome: outputOptions.biome ?? biome ?? false,\n tsconfig,\n packageJson,\n headers: outputOptions.headers ?? false,\n indexFiles: outputOptions.indexFiles ?? true,\n baseUrl: outputOptions.baseUrl,\n unionAddMissingProperties:\n outputOptions.unionAddMissingProperties ?? false,\n override: {\n ...outputOptions.override,\n mock: {\n arrayMin: outputOptions.override?.mock?.arrayMin ?? 1,\n arrayMax: outputOptions.override?.mock?.arrayMax ?? 10,\n stringMin: outputOptions.override?.mock?.stringMin ?? 10,\n stringMax: outputOptions.override?.mock?.stringMax ?? 20,\n fractionDigits: outputOptions.override?.mock?.fractionDigits ?? 2,\n ...outputOptions.override?.mock,\n },\n operations: normalizeOperationsAndTags(\n outputOptions.override?.operations ?? {},\n outputWorkspace,\n {\n query: globalQueryOptions,\n },\n ),\n tags: normalizeOperationsAndTags(\n outputOptions.override?.tags ?? {},\n outputWorkspace,\n {\n query: globalQueryOptions,\n },\n ),\n mutator: normalizeMutator(\n outputWorkspace,\n outputOptions.override?.mutator,\n ),\n formData: createFormData(\n outputWorkspace,\n outputOptions.override?.formData,\n ),\n formUrlEncoded:\n (isBoolean(outputOptions.override?.formUrlEncoded)\n ? outputOptions.override.formUrlEncoded\n : normalizeMutator(\n outputWorkspace,\n outputOptions.override?.formUrlEncoded,\n )) ?? true,\n paramsSerializer: normalizeMutator(\n outputWorkspace,\n outputOptions.override?.paramsSerializer,\n ),\n header:\n outputOptions.override?.header === false\n ? false\n : isFunction(outputOptions.override?.header)\n ? outputOptions.override.header\n : getDefaultFilesHeader,\n requestOptions: outputOptions.override?.requestOptions ?? true,\n namingConvention: outputOptions.override?.namingConvention ?? {},\n components: {\n schemas: {\n suffix: RefComponentSuffix.schemas,\n itemSuffix:\n outputOptions.override?.components?.schemas?.itemSuffix ?? 'Item',\n ...outputOptions.override?.components?.schemas,\n },\n responses: {\n suffix: RefComponentSuffix.responses,\n ...outputOptions.override?.components?.responses,\n },\n parameters: {\n suffix: RefComponentSuffix.parameters,\n ...outputOptions.override?.components?.parameters,\n },\n requestBodies: {\n suffix: RefComponentSuffix.requestBodies,\n ...outputOptions.override?.components?.requestBodies,\n },\n },\n hono: normalizeHonoOptions(outputOptions.override?.hono, workspace),\n jsDoc: normalizeJSDocOptions(outputOptions.override?.jsDoc),\n query: globalQueryOptions,\n zod: {\n strict: {\n param: outputOptions.override?.zod?.strict?.param ?? false,\n query: outputOptions.override?.zod?.strict?.query ?? false,\n header: outputOptions.override?.zod?.strict?.header ?? false,\n body: outputOptions.override?.zod?.strict?.body ?? false,\n response: outputOptions.override?.zod?.strict?.response ?? false,\n },\n generate: {\n param: outputOptions.override?.zod?.generate?.param ?? true,\n query: outputOptions.override?.zod?.generate?.query ?? true,\n header: outputOptions.override?.zod?.generate?.header ?? true,\n body: outputOptions.override?.zod?.generate?.body ?? true,\n response: outputOptions.override?.zod?.generate?.response ?? true,\n },\n coerce: {\n param: outputOptions.override?.zod?.coerce?.param ?? false,\n query: outputOptions.override?.zod?.coerce?.query ?? false,\n header: outputOptions.override?.zod?.coerce?.header ?? false,\n body: outputOptions.override?.zod?.coerce?.body ?? false,\n response: outputOptions.override?.zod?.coerce?.response ?? false,\n },\n preprocess: {\n ...(outputOptions.override?.zod?.preprocess?.param\n ? {\n param: normalizeMutator(\n workspace,\n outputOptions.override.zod.preprocess.param,\n ),\n }\n : {}),\n ...(outputOptions.override?.zod?.preprocess?.query\n ? {\n query: normalizeMutator(\n workspace,\n outputOptions.override.zod.preprocess.query,\n ),\n }\n : {}),\n ...(outputOptions.override?.zod?.preprocess?.header\n ? {\n header: normalizeMutator(\n workspace,\n outputOptions.override.zod.preprocess.header,\n ),\n }\n : {}),\n ...(outputOptions.override?.zod?.preprocess?.body\n ? {\n body: normalizeMutator(\n workspace,\n outputOptions.override.zod.preprocess.body,\n ),\n }\n : {}),\n ...(outputOptions.override?.zod?.preprocess?.response\n ? {\n response: normalizeMutator(\n workspace,\n outputOptions.override.zod.preprocess.response,\n ),\n }\n : {}),\n },\n generateEachHttpStatus:\n outputOptions.override?.zod?.generateEachHttpStatus ?? false,\n dateTimeOptions: outputOptions.override?.zod?.dateTimeOptions ?? {},\n timeOptions: outputOptions.override?.zod?.timeOptions ?? {},\n },\n swr: {\n generateErrorTypes: false,\n ...outputOptions.override?.swr,\n },\n angular: {\n provideIn: outputOptions.override?.angular?.provideIn ?? 'root',\n runtimeValidation:\n outputOptions.override?.angular?.runtimeValidation ?? false,\n },\n fetch: {\n includeHttpResponseReturnType:\n outputOptions.override?.fetch?.includeHttpResponseReturnType ??\n true,\n forceSuccessResponse:\n outputOptions.override?.fetch?.forceSuccessResponse ?? false,\n runtimeValidation:\n outputOptions.override?.fetch?.runtimeValidation ?? false,\n ...outputOptions.override?.fetch,\n },\n useDates: outputOptions.override?.useDates ?? false,\n useDeprecatedOperations:\n outputOptions.override?.useDeprecatedOperations ?? true,\n enumGenerationType:\n outputOptions.override?.enumGenerationType ?? 'const',\n suppressReadonlyModifier:\n outputOptions.override?.suppressReadonlyModifier ?? false,\n aliasCombinedTypes: outputOptions.override?.aliasCombinedTypes ?? false,\n },\n allParamsOptional: outputOptions.allParamsOptional ?? false,\n urlEncodeParameters: outputOptions.urlEncodeParameters ?? false,\n optionsParamRequired: outputOptions.optionsParamRequired ?? false,\n propertySortOrder:\n outputOptions.propertySortOrder ?? PropertySortOrder.SPECIFICATION,\n },\n hooks: options.hooks ? normalizeHooks(options.hooks) : {},\n };\n\n if (!normalizedOptions.input.target) {\n throw new Error(chalk.red(`Config require an input target`));\n }\n\n if (!normalizedOptions.output.target && !normalizedOptions.output.schemas) {\n throw new Error(chalk.red(`Config require an output target or schemas`));\n }\n\n return normalizedOptions;\n}\n\nfunction normalizeMutator(\n workspace: string,\n mutator?: Mutator,\n): NormalizedMutator | undefined {\n if (isObject(mutator)) {\n if (!mutator.path) {\n throw new Error(chalk.red(`Mutator need a path`));\n }\n\n return {\n ...mutator,\n path: upath.resolve(workspace, mutator.path),\n default: mutator.default ?? !mutator.name,\n };\n }\n\n if (isString(mutator)) {\n return {\n path: upath.resolve(workspace, mutator),\n default: true,\n };\n }\n\n return mutator;\n}\n\nfunction normalizePathOrUrl<T>(path: T, workspace: string) {\n if (isString(path) && !isUrl(path)) {\n return normalizePath(path, workspace);\n }\n\n return path;\n}\n\nexport function normalizePath<T>(path: T, workspace: string) {\n if (!isString(path)) {\n return path;\n }\n return upath.resolve(workspace, path);\n}\n\nfunction normalizeOperationsAndTags(\n operationsOrTags: Record<string, OperationOptions>,\n workspace: string,\n global: {\n query: NormalizedQueryOptions;\n },\n): Record<string, NormalizedOperationOptions> {\n return Object.fromEntries(\n Object.entries(operationsOrTags).map(\n ([\n key,\n {\n transformer,\n mutator,\n formData,\n formUrlEncoded,\n paramsSerializer,\n query,\n zod,\n ...rest\n },\n ]) => {\n return [\n key,\n {\n ...rest,\n ...(query\n ? {\n query: normalizeQueryOptions(query, workspace, global.query),\n }\n : {}),\n ...(zod\n ? {\n zod: {\n strict: {\n param: zod.strict?.param ?? false,\n query: zod.strict?.query ?? false,\n header: zod.strict?.header ?? false,\n body: zod.strict?.body ?? false,\n response: zod.strict?.response ?? false,\n },\n generate: {\n param: zod.generate?.param ?? true,\n query: zod.generate?.query ?? true,\n header: zod.generate?.header ?? true,\n body: zod.generate?.body ?? true,\n response: zod.generate?.response ?? true,\n },\n coerce: {\n param: zod.coerce?.param ?? false,\n query: zod.coerce?.query ?? false,\n header: zod.coerce?.header ?? false,\n body: zod.coerce?.body ?? false,\n response: zod.coerce?.response ?? false,\n },\n preprocess: {\n ...(zod.preprocess?.param\n ? {\n param: normalizeMutator(\n workspace,\n zod.preprocess.param,\n ),\n }\n : {}),\n ...(zod.preprocess?.query\n ? {\n query: normalizeMutator(\n workspace,\n zod.preprocess.query,\n ),\n }\n : {}),\n ...(zod.preprocess?.header\n ? {\n header: normalizeMutator(\n workspace,\n zod.preprocess.header,\n ),\n }\n : {}),\n ...(zod.preprocess?.body\n ? {\n body: normalizeMutator(\n workspace,\n zod.preprocess.body,\n ),\n }\n : {}),\n ...(zod.preprocess?.response\n ? {\n response: normalizeMutator(\n workspace,\n zod.preprocess.response,\n ),\n }\n : {}),\n },\n generateEachHttpStatus: zod.generateEachHttpStatus ?? false,\n dateTimeOptions: zod.dateTimeOptions ?? {},\n timeOptions: zod.timeOptions ?? {},\n },\n }\n : {}),\n ...(transformer\n ? { transformer: normalizePath(transformer, workspace) }\n : {}),\n ...(mutator\n ? { mutator: normalizeMutator(workspace, mutator) }\n : {}),\n ...createFormData(workspace, formData),\n ...(formUrlEncoded\n ? {\n formUrlEncoded: isBoolean(formUrlEncoded)\n ? formUrlEncoded\n : normalizeMutator(workspace, formUrlEncoded),\n }\n : {}),\n ...(paramsSerializer\n ? {\n paramsSerializer: normalizeMutator(\n workspace,\n paramsSerializer,\n ),\n }\n : {}),\n },\n ];\n },\n ),\n );\n}\n\nfunction normalizeOutputMode(mode?: OutputMode): OutputMode {\n if (!mode) {\n return OutputMode.SINGLE;\n }\n\n if (!Object.values(OutputMode).includes(mode)) {\n createLogger().warn(chalk.yellow(`Unknown the provided mode => ${mode}`));\n return OutputMode.SINGLE;\n }\n\n return mode;\n}\n\nfunction normalizeHooks(hooks: HooksOptions): NormalizedHookOptions {\n const keys = Object.keys(hooks) as unknown as Hook[];\n\n const result: NormalizedHookOptions = {};\n for (const key of keys) {\n if (isString(hooks[key])) {\n result[key] = [hooks[key]] as string[];\n } else if (Array.isArray(hooks[key])) {\n result[key] = hooks[key] as string[];\n } else if (isFunction(hooks[key])) {\n result[key] = [hooks[key]] as HookFunction[];\n } else if (isObject(hooks[key])) {\n result[key] = [hooks[key]] as HookOption[];\n }\n }\n return result;\n}\n\nfunction normalizeHonoOptions(\n hono: HonoOptions = {},\n workspace: string,\n): NormalizedHonoOptions {\n return {\n ...(hono.handlers\n ? { handlers: upath.resolve(workspace, hono.handlers) }\n : {}),\n compositeRoute: hono.compositeRoute ?? '',\n validator: hono.validator ?? true,\n validatorOutputPath: hono.validatorOutputPath\n ? upath.resolve(workspace, hono.validatorOutputPath)\n : '',\n };\n}\n\nfunction normalizeJSDocOptions(\n jsdoc: JsDocOptions = {},\n): NormalizedJsDocOptions {\n return {\n ...jsdoc,\n };\n}\n\nfunction normalizeQueryOptions(\n queryOptions: QueryOptions = {},\n outputWorkspace: string,\n globalOptions: NormalizedQueryOptions = {},\n): NormalizedQueryOptions {\n if (queryOptions.options) {\n console.warn(\n '[WARN] Using query options is deprecated and will be removed in a future major release. Please use queryOptions or mutationOptions instead.',\n );\n }\n\n return {\n ...(isNullish(queryOptions.usePrefetch)\n ? {}\n : { usePrefetch: queryOptions.usePrefetch }),\n ...(isNullish(queryOptions.useInvalidate)\n ? {}\n : { useInvalidate: queryOptions.useInvalidate }),\n ...(isNullish(queryOptions.useQuery)\n ? {}\n : { useQuery: queryOptions.useQuery }),\n ...(isNullish(queryOptions.useSuspenseQuery)\n ? {}\n : { useSuspenseQuery: queryOptions.useSuspenseQuery }),\n ...(isNullish(queryOptions.useMutation)\n ? {}\n : { useMutation: queryOptions.useMutation }),\n ...(isNullish(queryOptions.useInfinite)\n ? {}\n : { useInfinite: queryOptions.useInfinite }),\n ...(isNullish(queryOptions.useSuspenseInfiniteQuery)\n ? {}\n : { useSuspenseInfiniteQuery: queryOptions.useSuspenseInfiniteQuery }),\n ...(queryOptions.useInfiniteQueryParam\n ? { useInfiniteQueryParam: queryOptions.useInfiniteQueryParam }\n : {}),\n ...(queryOptions.options ? { options: queryOptions.options } : {}),\n ...(globalOptions.queryKey\n ? {\n queryKey: globalOptions.queryKey,\n }\n : {}),\n ...(queryOptions.queryKey\n ? {\n queryKey: normalizeMutator(outputWorkspace, queryOptions.queryKey),\n }\n : {}),\n ...(globalOptions.queryOptions\n ? {\n queryOptions: globalOptions.queryOptions,\n }\n : {}),\n ...(queryOptions.queryOptions\n ? {\n queryOptions: normalizeMutator(\n outputWorkspace,\n queryOptions.queryOptions,\n ),\n }\n : {}),\n ...(globalOptions.mutationOptions\n ? {\n mutationOptions: globalOptions.mutationOptions,\n }\n : {}),\n ...(queryOptions.mutationOptions\n ? {\n mutationOptions: normalizeMutator(\n outputWorkspace,\n queryOptions.mutationOptions,\n ),\n }\n : {}),\n ...(isNullish(globalOptions.shouldExportQueryKey)\n ? {}\n : {\n shouldExportQueryKey: globalOptions.shouldExportQueryKey,\n }),\n ...(isNullish(queryOptions.shouldExportQueryKey)\n ? {}\n : { shouldExportQueryKey: queryOptions.shouldExportQueryKey }),\n ...(isNullish(globalOptions.shouldExportHttpClient)\n ? {}\n : {\n shouldExportHttpClient: globalOptions.shouldExportHttpClient,\n }),\n ...(isNullish(queryOptions.shouldExportHttpClient)\n ? {}\n : { shouldExportHttpClient: queryOptions.shouldExportHttpClient }),\n ...(isNullish(globalOptions.shouldExportMutatorHooks)\n ? {}\n : {\n shouldExportMutatorHooks: globalOptions.shouldExportMutatorHooks,\n }),\n ...(isNullish(queryOptions.shouldExportMutatorHooks)\n ? {}\n : { shouldExportMutatorHooks: queryOptions.shouldExportMutatorHooks }),\n ...(isNullish(globalOptions.shouldSplitQueryKey)\n ? {}\n : {\n shouldSplitQueryKey: globalOptions.shouldSplitQueryKey,\n }),\n ...(isNullish(queryOptions.shouldSplitQueryKey)\n ? {}\n : { shouldSplitQueryKey: queryOptions.shouldSplitQueryKey }),\n ...(isNullish(globalOptions.signal)\n ? {}\n : {\n signal: globalOptions.signal,\n }),\n ...(isNullish(globalOptions.useOperationIdAsQueryKey)\n ? {}\n : {\n useOperationIdAsQueryKey: globalOptions.useOperationIdAsQueryKey,\n }),\n ...(isNullish(queryOptions.useOperationIdAsQueryKey)\n ? {}\n : { useOperationIdAsQueryKey: queryOptions.useOperationIdAsQueryKey }),\n ...(isNullish(globalOptions.signal)\n ? {}\n : {\n signal: globalOptions.signal,\n }),\n ...(isNullish(queryOptions.signal) ? {} : { signal: queryOptions.signal }),\n ...(isNullish(globalOptions.version)\n ? {}\n : {\n version: globalOptions.version,\n }),\n ...(isNullish(queryOptions.version)\n ? {}\n : { version: queryOptions.version }),\n ...(queryOptions.mutationInvalidates\n ? { mutationInvalidates: queryOptions.mutationInvalidates }\n : {}),\n ...(isNullish(globalOptions.runtimeValidation)\n ? {}\n : {\n runtimeValidation: globalOptions.runtimeValidation,\n }),\n ...(isNullish(queryOptions.runtimeValidation)\n ? {}\n : { runtimeValidation: queryOptions.runtimeValidation }),\n };\n}\n\nexport function getDefaultFilesHeader({\n title,\n description,\n version,\n}: {\n title?: string;\n description?: string;\n version?: string;\n} = {}) {\n return [\n `Generated by ${pkg.name} v${pkg.version} 🍺`,\n `Do not edit manually.`,\n ...(title ? [title] : []),\n ...(description ? [description] : []),\n ...(version ? [`OpenAPI spec version: ${version}`] : []),\n ];\n}\n","import { isBoolean, log, logError } from '@orval/core';\n\n/**\n * Start a file watcher and invoke an async callback on file changes.\n *\n * If `watchOptions` is falsy the watcher is not started. Supported shapes:\n * - boolean: when true the `defaultTarget` is watched\n * - string: a single path to watch\n * - string[]: an array of paths to watch\n *\n * @param watchOptions - false to disable watching, or a path/paths to watch\n * @param watchFn - async callback executed on change events\n * @param defaultTarget - path(s) to watch when `watchOptions` is `true` (default: '.')\n * @returns Resolves once the watcher has been started (or immediately if disabled)\n *\n * @example\n * await startWatcher(true, async () => { await buildProject(); }, 'src');\n */\nexport async function startWatcher(\n watchOptions: boolean | string | string[],\n watchFn: () => Promise<void>,\n defaultTarget: string | string[] = '.',\n) {\n if (!watchOptions) return;\n const { watch } = await import('chokidar');\n\n const ignored = ['**/{.git,node_modules}/**'];\n\n const watchPaths = isBoolean(watchOptions) ? defaultTarget : watchOptions;\n\n log(\n `Watching for changes in ${\n Array.isArray(watchPaths)\n ? watchPaths.map((v) => '\"' + v + '\"').join(' | ')\n : '\"' + watchPaths + '\"'\n }`,\n );\n\n const watcher = watch(watchPaths, {\n ignorePermissionErrors: true,\n ignored,\n });\n watcher.on('all', (type, file) => {\n log(`Change detected: ${type} ${file}`);\n\n watchFn().catch((error: unknown) => {\n logError(error);\n });\n });\n}\n","import {\n type ContextSpec,\n conventionName,\n type NamingConvention,\n type NormalizedOutputOptions,\n type OpenApiParameterObject,\n type OpenApiReferenceObject,\n type OpenApiRequestBodyObject,\n type OpenApiSchemaObject,\n pascal,\n upath,\n type ZodCoerceType,\n} from '@orval/core';\nimport {\n dereference,\n generateZodValidationSchemaDefinition,\n isZodVersionV4,\n parseZodValidationSchemaDefinition,\n} from '@orval/zod';\nimport fs from 'fs-extra';\n\ntype ZodSchemaFileEntry = {\n schemaName: string;\n consts: string;\n zodExpression: string;\n};\n\ntype ZodSchemaFileToWrite = ZodSchemaFileEntry & {\n filePath: string;\n};\n\ntype WriteZodOutputOptions = {\n namingConvention: NamingConvention;\n indexFiles: boolean;\n packageJson?: NormalizedOutputOptions['packageJson'];\n override: {\n zod: {\n strict: {\n body: boolean;\n };\n coerce: {\n body: boolean | ZodCoerceType[];\n };\n };\n };\n};\n\ntype WriteZodSchemasInput = {\n spec: ContextSpec['spec'];\n target: string;\n schemas: {\n name: string;\n schema?: OpenApiSchemaObject | OpenApiReferenceObject;\n }[];\n};\n\ntype WriteZodVerbResponseType = {\n value: string;\n isRef?: boolean;\n originalSchema?: OpenApiSchemaObject;\n};\n\ntype WriteZodSchemasFromVerbsInput = Record<\n string,\n {\n operationName: string;\n originalOperation: {\n requestBody?: OpenApiRequestBodyObject | OpenApiReferenceObject;\n parameters?: (OpenApiParameterObject | OpenApiReferenceObject)[];\n };\n response: {\n types: {\n success: WriteZodVerbResponseType[];\n errors: WriteZodVerbResponseType[];\n };\n };\n }\n>;\n\ntype WriteZodSchemasFromVerbsContext = {\n output: {\n override: {\n useDates?: boolean;\n zod: {\n dateTimeOptions?: Record<string, unknown>;\n timeOptions?: Record<string, unknown>;\n };\n };\n };\n spec: ContextSpec['spec'];\n target: string;\n workspace: string;\n};\n\nfunction generateZodSchemaFileContent(\n header: string,\n schemas: ZodSchemaFileEntry[],\n): string {\n const schemaContent = schemas\n .map(({ schemaName, consts, zodExpression }) => {\n const schemaConsts = consts ? `${consts}\\n` : '';\n\n return `${schemaConsts}export const ${schemaName} = ${zodExpression}\n\nexport type ${schemaName} = zod.input<typeof ${schemaName}>;`;\n })\n .join('\\n\\n');\n\n return `${header}import { z as zod } from 'zod';\n\n${schemaContent}\n`;\n}\n\nconst isValidSchemaIdentifier = (name: string) =>\n /^[A-Za-z_][A-Za-z0-9_]*$/.test(name);\n\nconst isPrimitiveSchemaName = (name: string) =>\n ['string', 'number', 'boolean', 'void', 'unknown', 'Blob'].includes(name);\n\nconst dedupeSchemasByName = <T extends { name: string }>(schemas: T[]) => {\n const uniqueSchemas = new Map<string, T>();\n\n for (const schema of schemas) {\n if (!uniqueSchemas.has(schema.name)) {\n uniqueSchemas.set(schema.name, schema);\n }\n }\n\n return [...uniqueSchemas.values()];\n};\n\nconst groupSchemasByFilePath = <T extends { filePath: string }>(\n schemas: T[],\n) => {\n const grouped = new Map<string, T[]>();\n\n for (const schema of schemas) {\n const key = schema.filePath.toLowerCase();\n const existingGroup = grouped.get(key);\n\n if (existingGroup) {\n existingGroup.push(schema);\n } else {\n grouped.set(key, [schema]);\n }\n }\n\n const sortedGroups = [...grouped.values()].map((group) =>\n [...group].toSorted((a, b) => a.filePath.localeCompare(b.filePath)),\n );\n\n return sortedGroups.toSorted((a, b) =>\n a[0].filePath.localeCompare(b[0].filePath),\n );\n};\n\nasync function writeZodSchemaIndex(\n schemasPath: string,\n fileExtension: string,\n header: string,\n schemaNames: string[],\n namingConvention: NamingConvention,\n shouldMergeExisting = false,\n) {\n const importFileExtension = fileExtension.replace(/\\.ts$/, '');\n const indexPath = upath.join(schemasPath, `index${fileExtension}`);\n\n let existingExports = '';\n if (shouldMergeExisting && (await fs.pathExists(indexPath))) {\n const existingContent = await fs.readFile(indexPath, 'utf8');\n const headerMatch = /^(\\/\\*\\*[\\s\\S]*?\\*\\/\\n)?/.exec(existingContent);\n const headerPart = headerMatch ? headerMatch[0] : '';\n existingExports = existingContent.slice(headerPart.length).trim();\n }\n\n const newExports = schemaNames\n .map((schemaName) => {\n const fileName = conventionName(schemaName, namingConvention);\n return `export * from './${fileName}${importFileExtension}';`;\n })\n .toSorted()\n .join('\\n');\n\n const allExports = existingExports\n ? `${existingExports}\\n${newExports}`\n : newExports;\n\n const uniqueExports = [...new Set(allExports.split('\\n'))]\n .filter((line) => line.trim())\n .toSorted()\n .join('\\n');\n\n await fs.outputFile(indexPath, `${header}\\n${uniqueExports}\\n`);\n}\n\nexport async function writeZodSchemas(\n builder: WriteZodSchemasInput,\n schemasPath: string,\n fileExtension: string,\n header: string,\n output: WriteZodOutputOptions,\n) {\n const schemasWithOpenApiDef = builder.schemas.filter((s) => s.schema);\n const schemasToWrite: ZodSchemaFileToWrite[] = [];\n const isZodV4 = !!output.packageJson && isZodVersionV4(output.packageJson);\n const strict = output.override.zod.strict.body;\n const coerce = output.override.zod.coerce.body;\n\n for (const generatorSchema of schemasWithOpenApiDef) {\n const { name, schema: schemaObject } = generatorSchema;\n\n if (!schemaObject) {\n continue;\n }\n\n const fileName = conventionName(name, output.namingConvention);\n const filePath = upath.join(schemasPath, `${fileName}${fileExtension}`);\n const context: ContextSpec = {\n spec: builder.spec,\n target: builder.target,\n workspace: '',\n output: output as ContextSpec['output'],\n };\n\n // Dereference the schema to resolve $ref\n const dereferencedSchema = dereference(schemaObject, context);\n\n const zodDefinition = generateZodValidationSchemaDefinition(\n dereferencedSchema,\n context,\n name,\n strict,\n isZodV4,\n {\n required: true,\n },\n );\n\n const parsedZodDefinition = parseZodValidationSchemaDefinition(\n zodDefinition,\n context,\n coerce,\n strict,\n isZodV4,\n );\n\n schemasToWrite.push({\n schemaName: name,\n filePath,\n consts: parsedZodDefinition.consts,\n zodExpression: parsedZodDefinition.zod,\n });\n }\n\n const groupedSchemasToWrite = groupSchemasByFilePath(schemasToWrite);\n\n for (const schemaGroup of groupedSchemasToWrite) {\n const fileContent = generateZodSchemaFileContent(header, schemaGroup);\n\n await fs.outputFile(schemaGroup[0].filePath, fileContent);\n }\n\n if (output.indexFiles) {\n const schemaNames = groupedSchemasToWrite.map(\n (schemaGroup) => schemaGroup[0].schemaName,\n );\n await writeZodSchemaIndex(\n schemasPath,\n fileExtension,\n header,\n schemaNames,\n output.namingConvention,\n false,\n );\n }\n}\n\nexport async function writeZodSchemasFromVerbs(\n verbOptions: WriteZodSchemasFromVerbsInput,\n schemasPath: string,\n fileExtension: string,\n header: string,\n output: WriteZodOutputOptions,\n context: WriteZodSchemasFromVerbsContext,\n) {\n const zodContext = context as ContextSpec;\n const verbOptionsArray = Object.values(verbOptions);\n\n if (verbOptionsArray.length === 0) {\n return;\n }\n\n const isZodV4 = !!output.packageJson && isZodVersionV4(output.packageJson);\n const strict = output.override.zod.strict.body;\n const coerce = output.override.zod.coerce.body;\n\n const generateVerbsSchemas = verbOptionsArray.flatMap((verbOption) => {\n const operation = verbOption.originalOperation;\n\n const requestBody = operation.requestBody as\n | OpenApiRequestBodyObject\n | OpenApiReferenceObject\n | undefined;\n const requestBodyContent =\n requestBody && 'content' in requestBody\n ? (requestBody as OpenApiRequestBodyObject).content\n : undefined;\n const bodySchema = requestBodyContent?.['application/json']?.schema as\n | OpenApiSchemaObject\n | undefined;\n\n const bodySchemas = bodySchema\n ? [\n {\n name: `${pascal(verbOption.operationName)}Body`,\n schema: dereference(bodySchema, zodContext),\n },\n ]\n : [];\n\n const parameters = operation.parameters;\n\n const queryParams = parameters?.filter(\n (p): p is OpenApiParameterObject => 'in' in p && p.in === 'query',\n );\n\n const queryParamsSchemas =\n queryParams && queryParams.length > 0\n ? [\n {\n name: `${pascal(verbOption.operationName)}Params`,\n schema: {\n type: 'object' as const,\n properties: Object.fromEntries(\n queryParams\n .filter((p) => 'schema' in p && p.schema)\n .map((p) => [\n p.name,\n dereference(p.schema as OpenApiSchemaObject, zodContext),\n ]),\n ) as Record<string, OpenApiSchemaObject>,\n required: queryParams\n .filter((p) => p.required)\n .map((p) => p.name)\n .filter((name): name is string => name !== undefined),\n },\n },\n ]\n : [];\n\n const headerParams = parameters?.filter(\n (p): p is OpenApiParameterObject => 'in' in p && p.in === 'header',\n );\n\n const headerParamsSchemas =\n headerParams && headerParams.length > 0\n ? [\n {\n name: `${pascal(verbOption.operationName)}Headers`,\n schema: {\n type: 'object' as const,\n properties: Object.fromEntries(\n headerParams\n .filter((p) => 'schema' in p && p.schema)\n .map((p) => [\n p.name,\n dereference(p.schema as OpenApiSchemaObject, zodContext),\n ]),\n ) as Record<string, OpenApiSchemaObject>,\n required: headerParams\n .filter((p) => p.required)\n .map((p) => p.name)\n .filter((name): name is string => name !== undefined),\n },\n },\n ]\n : [];\n\n const responseSchemas = [\n ...verbOption.response.types.success,\n ...verbOption.response.types.errors,\n ]\n .filter(\n (\n responseType,\n ): responseType is typeof responseType & {\n originalSchema: OpenApiSchemaObject;\n } =>\n !!responseType.originalSchema &&\n !responseType.isRef &&\n isValidSchemaIdentifier(responseType.value) &&\n !isPrimitiveSchemaName(responseType.value),\n )\n .map((responseType) => ({\n name: responseType.value,\n schema: dereference(responseType.originalSchema, zodContext),\n }));\n\n return dedupeSchemasByName([\n ...bodySchemas,\n ...queryParamsSchemas,\n ...headerParamsSchemas,\n ...responseSchemas,\n ]);\n });\n\n const uniqueVerbsSchemas = dedupeSchemasByName(generateVerbsSchemas);\n const schemasToWrite: ZodSchemaFileToWrite[] = [];\n\n for (const { name, schema } of uniqueVerbsSchemas) {\n const fileName = conventionName(name, output.namingConvention);\n const filePath = upath.join(schemasPath, `${fileName}${fileExtension}`);\n\n const zodDefinition = generateZodValidationSchemaDefinition(\n schema,\n zodContext,\n name,\n strict,\n isZodV4,\n {\n required: true,\n },\n );\n\n const parsedZodDefinition = parseZodValidationSchemaDefinition(\n zodDefinition,\n zodContext,\n coerce,\n strict,\n isZodV4,\n );\n\n schemasToWrite.push({\n schemaName: name,\n filePath,\n consts: parsedZodDefinition.consts,\n zodExpression: parsedZodDefinition.zod,\n });\n }\n\n const groupedSchemasToWrite = groupSchemasByFilePath(schemasToWrite);\n\n for (const schemaGroup of groupedSchemasToWrite) {\n const fileContent = generateZodSchemaFileContent(header, schemaGroup);\n\n await fs.outputFile(schemaGroup[0].filePath, fileContent);\n }\n\n if (output.indexFiles && uniqueVerbsSchemas.length > 0) {\n const schemaNames = groupedSchemasToWrite.map(\n (schemaGroup) => schemaGroup[0].schemaName,\n );\n await writeZodSchemaIndex(\n schemasPath,\n fileExtension,\n header,\n schemaNames,\n output.namingConvention,\n true,\n );\n }\n}\n","import {\n createSuccessMessage,\n fixCrossDirectoryImports,\n fixRegularSchemaImports,\n getFileInfo,\n getMockFileExtensionByTypeName,\n isObject,\n isString,\n jsDoc,\n log,\n type NormalizedOptions,\n type OpenApiInfoObject,\n OutputMode,\n splitSchemasByType,\n upath,\n writeSchemas,\n writeSingleMode,\n type WriteSpecBuilder,\n writeSplitMode,\n writeSplitTagsMode,\n writeTagsMode,\n} from '@orval/core';\nimport chalk from 'chalk';\nimport { execa, ExecaError } from 'execa';\nimport fs from 'fs-extra';\nimport { unique } from 'remeda';\nimport type { TypeDocOptions } from 'typedoc';\n\nimport { formatWithPrettier } from './formatters/prettier';\nimport { executeHook } from './utils';\nimport { writeZodSchemas, writeZodSchemasFromVerbs } from './write-zod-specs';\n\nfunction getHeader(\n option: false | ((info: OpenApiInfoObject) => string | string[]),\n info: OpenApiInfoObject,\n): string {\n if (!option) {\n return '';\n }\n\n const header = option(info);\n return Array.isArray(header) ? jsDoc({ description: header }) : header;\n}\n\n/**\n * Add re-export of operation schemas from the main schemas index file.\n * Handles the case where the index file doesn't exist (no regular schemas).\n */\nasync function addOperationSchemasReExport(\n schemaPath: string,\n operationSchemasPath: string,\n fileExtension: string,\n header: string,\n): Promise<void> {\n const relativePath = upath.relativeSafe(schemaPath, operationSchemasPath);\n const schemaIndexPath = upath.join(schemaPath, `index${fileExtension}`);\n const exportLine = `export * from '${relativePath}';\\n`;\n\n const indexExists = await fs.pathExists(schemaIndexPath);\n if (indexExists) {\n // Check if export already exists to prevent duplicates on re-runs\n // Use regex to handle both single and double quotes\n const existingContent = await fs.readFile(schemaIndexPath, 'utf8');\n const exportPattern = new RegExp(\n String.raw`export\\s*\\*\\s*from\\s*['\"]${relativePath.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`)}['\"]`,\n );\n if (!exportPattern.test(existingContent)) {\n await fs.appendFile(schemaIndexPath, exportLine);\n }\n } else {\n // Create index with header if file doesn't exist (no regular schemas case)\n const content =\n header && header.trim().length > 0\n ? `${header}\\n${exportLine}`\n : exportLine;\n await fs.outputFile(schemaIndexPath, content);\n }\n}\n\nexport async function writeSpecs(\n builder: WriteSpecBuilder,\n workspace: string,\n options: NormalizedOptions,\n projectName?: string,\n) {\n const { info, schemas, target } = builder;\n const { output } = options;\n const projectTitle = projectName ?? info.title;\n\n const header = getHeader(output.override.header, info);\n\n if (output.schemas) {\n if (isString(output.schemas)) {\n const fileExtension = output.fileExtension || '.ts';\n const schemaPath = output.schemas;\n\n // Split schemas if operationSchemas path is configured\n if (output.operationSchemas) {\n const { regularSchemas, operationSchemas: opSchemas } =\n splitSchemasByType(schemas);\n\n // Fix cross-directory imports before writing (both directions)\n const regularSchemaNames = new Set(regularSchemas.map((s) => s.name));\n const operationSchemaNames = new Set(opSchemas.map((s) => s.name));\n fixCrossDirectoryImports(\n opSchemas,\n regularSchemaNames,\n schemaPath,\n output.operationSchemas,\n output.namingConvention,\n fileExtension,\n );\n fixRegularSchemaImports(\n regularSchemas,\n operationSchemaNames,\n schemaPath,\n output.operationSchemas,\n output.namingConvention,\n fileExtension,\n );\n\n // Write regular schemas to schemas path\n if (regularSchemas.length > 0) {\n await writeSchemas({\n schemaPath,\n schemas: regularSchemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n }\n\n // Write operation schemas to operationSchemas path\n if (opSchemas.length > 0) {\n await writeSchemas({\n schemaPath: output.operationSchemas,\n schemas: opSchemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n\n // Add re-export from operations in the main schemas index\n if (output.indexFiles) {\n await addOperationSchemasReExport(\n schemaPath,\n output.operationSchemas,\n fileExtension,\n header,\n );\n }\n }\n } else {\n await writeSchemas({\n schemaPath,\n schemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n }\n } else {\n const schemaType = output.schemas.type;\n\n if (schemaType === 'typescript') {\n const fileExtension = output.fileExtension || '.ts';\n\n // Split schemas if operationSchemas path is configured\n if (output.operationSchemas) {\n const { regularSchemas, operationSchemas: opSchemas } =\n splitSchemasByType(schemas);\n\n // Fix cross-directory imports before writing (both directions)\n const regularSchemaNames = new Set(regularSchemas.map((s) => s.name));\n const operationSchemaNames = new Set(opSchemas.map((s) => s.name));\n fixCrossDirectoryImports(\n opSchemas,\n regularSchemaNames,\n output.schemas.path,\n output.operationSchemas,\n output.namingConvention,\n fileExtension,\n );\n fixRegularSchemaImports(\n regularSchemas,\n operationSchemaNames,\n output.schemas.path,\n output.operationSchemas,\n output.namingConvention,\n fileExtension,\n );\n\n if (regularSchemas.length > 0) {\n await writeSchemas({\n schemaPath: output.schemas.path,\n schemas: regularSchemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n }\n\n if (opSchemas.length > 0) {\n await writeSchemas({\n schemaPath: output.operationSchemas,\n schemas: opSchemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n\n // Add re-export from operations in the main schemas index\n if (output.indexFiles) {\n await addOperationSchemasReExport(\n output.schemas.path,\n output.operationSchemas,\n fileExtension,\n header,\n );\n }\n }\n } else {\n await writeSchemas({\n schemaPath: output.schemas.path,\n schemas,\n target,\n namingConvention: output.namingConvention,\n fileExtension,\n header,\n indexFiles: output.indexFiles,\n });\n }\n } else {\n // schemaType === 'zod'\n const fileExtension = '.zod.ts';\n\n await writeZodSchemas(\n builder,\n output.schemas.path,\n fileExtension,\n header,\n output,\n );\n\n await writeZodSchemasFromVerbs(\n builder.verbOptions,\n output.schemas.path,\n fileExtension,\n header,\n output,\n {\n spec: builder.spec,\n target: builder.target,\n workspace,\n output,\n },\n );\n }\n }\n }\n\n let implementationPaths: string[] = [];\n\n if (output.target) {\n const writeMode = getWriteMode(output.mode);\n implementationPaths = await writeMode({\n builder,\n workspace,\n output,\n projectName,\n header,\n needSchema: !output.schemas && output.client !== 'zod',\n });\n }\n\n if (output.workspace) {\n const workspacePath = output.workspace;\n const imports = implementationPaths\n .filter(\n (path) =>\n !output.mock ||\n !path.endsWith(`.${getMockFileExtensionByTypeName(output.mock)}.ts`),\n )\n .map((path) =>\n upath.relativeSafe(\n workspacePath,\n getFileInfo(path).pathWithoutExtension,\n ),\n );\n\n if (output.schemas) {\n const schemasPath = isString(output.schemas)\n ? output.schemas\n : output.schemas.path;\n imports.push(\n upath.relativeSafe(workspacePath, getFileInfo(schemasPath).dirname),\n );\n }\n\n if (output.operationSchemas) {\n imports.push(\n upath.relativeSafe(\n workspacePath,\n getFileInfo(output.operationSchemas).dirname,\n ),\n );\n }\n\n if (output.indexFiles) {\n const indexFile = upath.join(workspacePath, '/index.ts');\n\n if (await fs.pathExists(indexFile)) {\n const data = await fs.readFile(indexFile, 'utf8');\n const importsNotDeclared = imports.filter((imp) => !data.includes(imp));\n await fs.appendFile(\n indexFile,\n unique(importsNotDeclared)\n .map((imp) => `export * from '${imp}';\\n`)\n .join(''),\n );\n } else {\n await fs.outputFile(\n indexFile,\n unique(imports)\n .map((imp) => `export * from '${imp}';`)\n .join('\\n') + '\\n',\n );\n }\n\n implementationPaths = [indexFile, ...implementationPaths];\n }\n }\n\n if (builder.extraFiles.length > 0) {\n await Promise.all(\n builder.extraFiles.map(async (file) =>\n fs.outputFile(file.path, file.content),\n ),\n );\n\n implementationPaths = [\n ...implementationPaths,\n ...builder.extraFiles.map((file) => file.path),\n ];\n }\n\n const paths = [\n ...(output.schemas\n ? [\n getFileInfo(\n isString(output.schemas) ? output.schemas : output.schemas.path,\n ).dirname,\n ]\n : []),\n ...(output.operationSchemas\n ? [getFileInfo(output.operationSchemas).dirname]\n : []),\n ...implementationPaths,\n ];\n\n if (options.hooks.afterAllFilesWrite) {\n await executeHook(\n 'afterAllFilesWrite',\n options.hooks.afterAllFilesWrite,\n paths,\n );\n }\n\n if (output.prettier) {\n await formatWithPrettier(paths, projectTitle);\n }\n\n if (output.biome) {\n try {\n await execa('biome', ['check', '--write', ...paths]);\n } catch (error) {\n let message = `⚠️ ${projectTitle ? `${projectTitle} - ` : ''}biome not found`;\n if (error instanceof ExecaError && error.exitCode === 1)\n message = error.message;\n\n log(chalk.yellow(message));\n }\n }\n\n if (output.docs) {\n try {\n let config: Partial<TypeDocOptions> = {};\n let configPath: string | undefined;\n if (isObject(output.docs)) {\n ({ configPath, ...config } = output.docs);\n if (configPath) {\n config.options = configPath;\n }\n }\n\n const getTypedocApplication = async () => {\n const { Application } = await import('typedoc');\n return Application;\n };\n\n const Application = await getTypedocApplication();\n const app = await Application.bootstrapWithPlugins({\n entryPoints: paths,\n theme: 'markdown',\n // Set the custom config location if it has been provided.\n ...config,\n plugin: ['typedoc-plugin-markdown', ...(config.plugin ?? [])],\n });\n // Set defaults if the have not been provided by the external config.\n if (!app.options.isSet('readme')) {\n app.options.setValue('readme', 'none');\n }\n if (!app.options.isSet('logLevel')) {\n app.options.setValue('logLevel', 'None');\n }\n const project = await app.convert();\n if (project) {\n const outputPath = app.options.getValue('out');\n await app.generateDocs(project, outputPath);\n\n if (output.prettier) {\n await formatWithPrettier([outputPath], projectTitle);\n }\n } else {\n throw new Error('TypeDoc not initialized');\n }\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : `⚠️ ${projectTitle ? `${projectTitle} - ` : ''}Unable to generate docs`;\n\n log(chalk.yellow(message));\n }\n }\n\n createSuccessMessage(projectTitle);\n}\n\nfunction getWriteMode(mode: OutputMode) {\n switch (mode) {\n case OutputMode.SPLIT: {\n return writeSplitMode;\n }\n case OutputMode.TAGS: {\n return writeTagsMode;\n }\n case OutputMode.TAGS_SPLIT: {\n return writeSplitTagsMode;\n }\n default: {\n return writeSingleMode;\n }\n }\n}\n","import {\n getFileInfo,\n isString,\n log,\n type NormalizedOptions,\n removeFilesAndEmptyFolders,\n} from '@orval/core';\n\nimport { importSpecs } from './import-specs';\nimport { writeSpecs } from './write-specs';\n\n/**\n * Generate client/spec files for a single Orval project.\n *\n * @param workspace - Absolute or relative workspace path used to resolve imports.\n * @param options - Normalized generation options for this project.\n * @param projectName - Optional project name used in logging output.\n * @returns A promise that resolves once generation (and optional cleaning) completes.\n *\n * @example\n * await generateSpec(process.cwd(), normalizedOptions, 'my-project');\n */\nexport async function generateSpec(\n workspace: string,\n options: NormalizedOptions,\n projectName?: string,\n) {\n if (options.output.clean) {\n const extraPatterns = Array.isArray(options.output.clean)\n ? options.output.clean\n : [];\n\n if (options.output.target) {\n await removeFilesAndEmptyFolders(\n ['**/*', '!**/*.d.ts', ...extraPatterns],\n getFileInfo(options.output.target).dirname,\n );\n }\n if (options.output.schemas) {\n const schemasPath = isString(options.output.schemas)\n ? options.output.schemas\n : options.output.schemas.path;\n await removeFilesAndEmptyFolders(\n ['**/*', '!**/*.d.ts', ...extraPatterns],\n getFileInfo(schemasPath).dirname,\n );\n }\n log(`${projectName} Cleaning output folder`);\n }\n\n const writeSpecBuilder = await importSpecs(workspace, options, projectName);\n await writeSpecs(writeSpecBuilder, workspace, options, projectName);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { type Config, type ConfigExternal, isFunction } from '@orval/core';\nimport { createJiti } from 'jiti';\n\n/**\n * Resolve the Orval config file path.\n *\n * @param configFilePath - Optional path to the config file (absolute or relative).\n * @returns The absolute path to the resolved config file.\n * @throws If a provided path does not exist or if no config file is found.\n *\n * @example\n * // explicit path\n * const p = findConfigFile('./orval.config.ts');\n *\n * @example\n * // automatic discovery (searches process.cwd())\n * const p = findConfigFile();\n */\nexport function findConfigFile(configFilePath?: string) {\n if (configFilePath) {\n const absolutePath = path.isAbsolute(configFilePath)\n ? configFilePath\n : path.resolve(process.cwd(), configFilePath);\n\n if (!fs.existsSync(absolutePath))\n throw new Error(`Config file ${configFilePath} does not exist`);\n\n return absolutePath;\n }\n\n const root = process.cwd();\n const exts = ['.ts', '.js', '.mjs', '.mts'];\n for (const ext of exts) {\n const fullPath = path.resolve(root, `orval.config${ext}`);\n if (fs.existsSync(fullPath)) {\n return fullPath;\n }\n }\n\n throw new Error(`No config file found in ${root}`);\n}\n\n/**\n * Load an Orval config file\n * @param configFilePath - Path to the config file (absolute or relative).\n * @returns The resolved Orval `Config` object.\n * @throws If the module does not provide a default export or the default export resolves to `undefined`.\n *\n * @example\n * // load a config object\n * const cfg = await loadConfigFile('./orval.config.ts');\n */\nexport async function loadConfigFile(configFilePath: string): Promise<Config> {\n const jiti = createJiti(process.cwd(), {\n interopDefault: true,\n });\n\n const configExternal = await jiti.import<ConfigExternal | undefined>(\n configFilePath,\n {\n default: true,\n },\n );\n\n if (configExternal === undefined) {\n throw new Error(`${configFilePath} doesn't have a default export`);\n }\n\n const config = await (isFunction(configExternal)\n ? configExternal()\n : configExternal);\n\n return config;\n}\n"],"mappings":"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"}
|