@orval/core 8.12.2 → 8.13.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["isNullish","path","isString","isFunction","path","path","basepath","path","upath.getSchemaFileName","getSchema","getSchemaType","isNullish","isBoolean","upath.getRelativeImportPath","fs","fs","upath.relativeSafe","upath.joinSafe","upath\n .join","fs","upath.joinSafe","emptyMockOutputFull","flattenMockOutput","upath.getRelativeImportPath","upath.getRelativeImportPath","path","path","fs","upath.getRelativeImportPath","upath.joinSafe","upath.getRelativeImportPath","path"],"sources":["../src/types.ts","../src/constants.ts","../src/utils/assertion.ts","../src/utils/async-reduce.ts","../src/utils/case.ts","../src/utils/compare-version.ts","../src/utils/content-type.ts","../src/utils/debug.ts","../src/utils/doc.ts","../src/utils/dynamic-import.ts","../src/utils/extension.ts","../src/utils/file.ts","../src/utils/file-extensions.ts","../src/utils/get-property-safe.ts","../src/utils/is-body-verb.ts","../src/utils/logger.ts","../src/utils/merge-deep.ts","../src/utils/occurrence.ts","../src/utils/path.ts","../src/utils/resolve-version.ts","../src/utils/sort.ts","../src/utils/string.ts","../src/utils/tsconfig.ts","../src/getters/enum.ts","../src/getters/ref.ts","../src/resolvers/ref.ts","../src/resolvers/value.ts","../src/resolvers/object.ts","../src/getters/array.ts","../src/getters/res-req-types.ts","../src/getters/body.ts","../src/getters/imports.ts","../src/getters/keys.ts","../src/getters/object.ts","../src/getters/scalar.ts","../src/getters/combine.ts","../src/getters/discriminators.ts","../src/getters/operation.ts","../src/getters/parameters.ts","../src/getters/params.ts","../src/getters/props.ts","../src/getters/query-params.ts","../src/getters/response.ts","../src/getters/route.ts","../src/generators/component-definition.ts","../src/generators/imports.ts","../src/generators/input-filters.ts","../src/generators/models-inline.ts","../src/generators/mutator-info.ts","../src/generators/mutator.ts","../src/generators/options.ts","../src/generators/parameter-definition.ts","../src/generators/interface.ts","../src/generators/schema-definition.ts","../src/generators/verbs-options.ts","../src/writers/file.ts","../src/writers/schemas.ts","../src/writers/generate-imports-for-builder.ts","../src/writers/mock-outputs.ts","../src/writers/target.ts","../src/writers/types.ts","../src/writers/single-mode.ts","../src/writers/split-mode.ts","../src/writers/target-tags.ts","../src/writers/split-tags-mode.ts","../src/writers/tags-mode.ts"],"sourcesContent":["import type { allLocales } from '@faker-js/faker';\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types';\nimport type { TypeDocOptions } from 'typedoc';\n\nexport const SupportedFormatter = {\n PRETTIER: 'prettier',\n BIOME: 'biome',\n OXFMT: 'oxfmt',\n} as const;\n\nexport type SupportedFormatter =\n (typeof SupportedFormatter)[keyof typeof SupportedFormatter];\n\nexport interface Options {\n output?: string | OutputOptions;\n input?: string | string[] | InputOptions;\n hooks?: Partial<HooksOptions>;\n}\n\nexport type OptionsFn = () => Options | Promise<Options>;\nexport type OptionsExport = Options | Promise<Options> | OptionsFn;\n\nexport type Config = Record<string, OptionsExport>;\nexport type ConfigFn = () => Config | Promise<Config>;\n\nexport type ConfigExternal = Config | Promise<Config> | ConfigFn;\n\nexport type NormalizedConfig = Record<string, NormalizedOptions | undefined>;\n\nexport interface NormalizedOptions {\n output: NormalizedOutputOptions;\n input: NormalizedInputOptions;\n hooks: NormalizedHookOptions;\n}\n\nexport interface NormalizedOutputOptions {\n workspace?: string;\n target: string;\n schemas?: string | SchemaOptions;\n operationSchemas?: string;\n namingConvention: NamingConvention;\n fileExtension: string;\n mode: OutputMode;\n // Always normalized to an object form; an empty `generators` array means\n // no mocks are emitted.\n mock: NormalizedMocksConfig;\n override: NormalizedOverrideOutput;\n client: OutputClient | OutputClientFunc;\n httpClient: OutputHttpClient;\n clean: boolean | string[];\n docs: boolean | OutputDocsOptions;\n formatter?: SupportedFormatter;\n tsconfig?: Tsconfig;\n packageJson?: PackageJson;\n headers: boolean;\n indexFiles: boolean;\n baseUrl?: string | BaseUrlFromSpec | BaseUrlFromConstant | BaseUrlRuntime;\n allParamsOptional: boolean;\n urlEncodeParameters: boolean;\n unionAddMissingProperties: boolean;\n optionsParamRequired: boolean;\n propertySortOrder: PropertySortOrder;\n}\n\nexport interface NormalizedParamsSerializerOptions {\n qs?: Record<string, unknown>;\n}\n\n/**\n * Controls how readonly properties are treated when a schema is reused as a request body.\n *\n * Best practice:\n * - `strip` (default): recommended for most OpenAPI specs, because `readOnly`\n * properties are response-oriented and generally should not constrain request\n * payload authoring.\n * - `preserve`: use when your schema intentionally models immutable request DTOs\n * and you want generated request-body types to keep readonly modifiers.\n *\n * Note: this applies to request bodies regardless of the generated client style\n * (`httpClient`, `httpResource`, etc.). `httpResource` still issues request\n * payloads, so the same OpenAPI guidance applies.\n *\n * If we later want a stricter OpenAPI-aligned mode that omits `readOnly`\n * properties from request bodies entirely, that should be introduced as a new\n * explicit mode rather than overloading `preserve`.\n */\nexport type ReadonlyRequestBodiesMode = 'strip' | 'preserve';\n\nexport interface NormalizedOverrideOutput {\n title?: (title: string) => string;\n transformer?: OutputTransformer;\n mutator?: NormalizedMutator;\n operations: Record<string, NormalizedOperationOptions | undefined>;\n tags: Record<string, NormalizedOperationOptions | undefined>;\n mock?: OverrideMockOptions;\n contentType?: OverrideOutputContentType;\n header: false | ((info: OpenApiInfoObject) => string[] | string);\n formData: NormalizedFormDataType<NormalizedMutator>;\n formUrlEncoded: boolean | NormalizedMutator;\n paramsSerializer?: NormalizedMutator;\n paramsSerializerOptions?: NormalizedParamsSerializerOptions;\n paramsFilter?: NormalizedMutator;\n namingConvention: {\n enum?: NamingConvention;\n };\n components: {\n schemas: {\n suffix: string;\n itemSuffix: string;\n };\n responses: {\n suffix: string;\n };\n parameters: {\n suffix: string;\n };\n requestBodies: {\n suffix: string;\n };\n };\n hono: NormalizedHonoOptions;\n mcp: NormalizedMcpOptions;\n query: NormalizedQueryOptions;\n angular: NormalizedAngularOptions;\n swr: SwrOptions;\n zod: NormalizedZodOptions;\n fetch: NormalizedFetchOptions;\n operationName?: (\n operation: OpenApiOperationObject,\n route: string,\n verb: Verbs,\n ) => string;\n\n requestOptions: Record<string, unknown> | boolean;\n useDates?: boolean;\n useTypeOverInterfaces?: boolean;\n useDeprecatedOperations?: boolean;\n useBigInt?: boolean;\n useNamedParameters?: boolean;\n enumGenerationType: EnumGeneration;\n suppressReadonlyModifier?: boolean;\n /**\n * Controls how readonly properties are handled for generated request-body types.\n *\n * Prefer `strip` for most OpenAPI specs because `readOnly` fields are\n * response-oriented. Use `preserve` only when your request DTOs are\n * intentionally immutable and should remain readonly in generated types.\n */\n preserveReadonlyRequestBodies?: ReadonlyRequestBodiesMode;\n /**\n * When enabled, operations with multiple request body content-types\n * (e.g. both `multipart/form-data` and `application/json`) will generate\n * separate functions for each content type instead of a single function\n * with a union type parameter.\n *\n * @example\n * // With splitByContentType: true\n * updateProfileWithFormData(body: FormDataType) => { ... }\n * updateProfileWithJson(body: JsonType) => { ... }\n *\n * // With splitByContentType: false (default)\n * updateProfile(body: FormDataType | JsonType) => { ... }\n *\n * @default false\n */\n splitByContentType: boolean;\n jsDoc: NormalizedJsDocOptions;\n aliasCombinedTypes: boolean;\n /**\n * When enabled, optional properties will be typed as `T | null` instead of just `T`.\n * @default false\n */\n useNullForOptional?: boolean;\n}\n\nexport interface NormalizedMutator {\n path: string;\n name?: string;\n default: boolean;\n alias?: Record<string, string>;\n external?: string[];\n extension?: string;\n}\n\nexport interface NormalizedOperationOptions {\n transformer?: OutputTransformer;\n mutator?: NormalizedMutator;\n mock?: {\n data?: MockData;\n properties?: MockProperties;\n };\n contentType?: OverrideOutputContentType;\n query?: NormalizedQueryOptions;\n angular?: NormalizedAngularOptions;\n swr?: SwrOptions;\n zod?: NormalizedZodOptions;\n operationName?: (\n operation: OpenApiOperationObject,\n route: string,\n verb: Verbs,\n ) => string;\n fetch?: FetchOptions;\n formData?: NormalizedFormDataType<NormalizedMutator>;\n formUrlEncoded?: boolean | NormalizedMutator;\n paramsSerializer?: NormalizedMutator;\n paramsFilter?: NormalizedMutator;\n requestOptions?: object | boolean;\n}\n\nexport interface NormalizedInputOptions {\n target: string | OpenApiDocument;\n override: OverrideInput;\n unsafeDisableValidation: boolean;\n filters?: InputFiltersOptions;\n parserOptions?: {\n headers?: {\n domains: string[];\n headers: Record<string, string>;\n }[];\n };\n}\n\nexport type OutputClientFunc = (\n clients: GeneratorClients,\n) => ClientGeneratorsBuilder;\n\nexport interface BaseUrlFromSpec {\n getBaseUrlFromSpecification: true;\n variables?: Record<string, string>;\n index?: number;\n baseUrl?: never;\n}\n\nexport interface BaseUrlFromConstant {\n getBaseUrlFromSpecification: false;\n variables?: never;\n index?: never;\n baseUrl: string;\n}\n\n/**\n * Embed a runtime JavaScript expression into generated URL template literals\n * (e.g. `process.env.API_BASE_URL`) so the same build can target different hosts at runtime.\n */\nexport interface BaseUrlRuntime {\n runtime: string;\n /** Named imports for symbols used in `runtime` (e.g. `{ name: 'apiBase', importPath: '../config' }`). */\n imports?: GeneratorImport[];\n getBaseUrlFromSpecification?: never;\n baseUrl?: never;\n}\n\nexport const PropertySortOrder = {\n ALPHABETICAL: 'Alphabetical',\n SPECIFICATION: 'Specification',\n} as const;\n\nexport type PropertySortOrder =\n (typeof PropertySortOrder)[keyof typeof PropertySortOrder];\n\nexport const NamingConvention = {\n CAMEL_CASE: 'camelCase',\n PASCAL_CASE: 'PascalCase',\n SNAKE_CASE: 'snake_case',\n KEBAB_CASE: 'kebab-case',\n} as const;\n\nexport type NamingConvention =\n (typeof NamingConvention)[keyof typeof NamingConvention];\n\nexport const EnumGeneration = {\n CONST: 'const',\n ENUM: 'enum',\n UNION: 'union',\n} as const;\n\nexport type EnumGeneration =\n (typeof EnumGeneration)[keyof typeof EnumGeneration];\n\nexport type SchemaGenerationType = 'typescript' | 'zod';\n\nexport interface SchemaOptions {\n path: string;\n type: SchemaGenerationType;\n}\n\nexport interface NormalizedSchemaOptions {\n path: string;\n type: SchemaGenerationType;\n}\n\nexport interface OutputOptions {\n workspace?: string;\n target: string;\n schemas?: string | SchemaOptions | false;\n /**\n * Separate path for operation-derived types (params, bodies, responses).\n * When set, types matching operation patterns (e.g., *Params, *Body) are written here\n * while regular schema types remain in the `schemas` path.\n */\n operationSchemas?: string;\n namingConvention?: NamingConvention;\n fileExtension?: string;\n mode?: OutputMode;\n // Mocks config. Accepts:\n // - `true` shorthand: emits both msw + faker with defaults\n // - OutputMocksConfig object with `generators` array and optional `indexMockFiles`\n // - ClientMockBuilder function for advanced custom generators\n mock?: OutputMocksOption;\n override?: OverrideOutput;\n client?: OutputClient | OutputClientFunc;\n httpClient?: OutputHttpClient;\n clean?: boolean | string[];\n docs?: boolean | OutputDocsOptions;\n formatter?: SupportedFormatter;\n tsconfig?: string | Tsconfig;\n packageJson?: string;\n headers?: boolean;\n indexFiles?: boolean;\n baseUrl?: string | BaseUrlFromSpec | BaseUrlFromConstant | BaseUrlRuntime;\n allParamsOptional?: boolean;\n urlEncodeParameters?: boolean;\n unionAddMissingProperties?: boolean;\n optionsParamRequired?: boolean;\n propertySortOrder?: PropertySortOrder;\n}\n\nexport interface InputFiltersOptions {\n mode?: 'include' | 'exclude';\n tags?: (string | RegExp)[];\n schemas?: (string | RegExp)[];\n}\n\nexport interface InputOptions {\n target: string | string[] | Record<string, unknown> | OpenApiDocument;\n override?: OverrideInput;\n /**\n * Disable OpenAPI spec validation.\n *\n * **Use at your own risk** — code generation with invalid specs is not guaranteed\n * to work and may break in minor updates. Bug reports with validation disabled are\n * not accepted.\n *\n * @default false\n */\n unsafeDisableValidation?: boolean;\n filters?: InputFiltersOptions;\n parserOptions?: {\n headers?: {\n domains: string[];\n headers: Record<string, string>;\n }[];\n };\n}\n\nexport const OutputClient = {\n ANGULAR: 'angular',\n ANGULAR_QUERY: 'angular-query',\n AXIOS: 'axios',\n AXIOS_FUNCTIONS: 'axios-functions',\n REACT_QUERY: 'react-query',\n SOLID_START: 'solid-start',\n SOLID_QUERY: 'solid-query',\n SVELTE_QUERY: 'svelte-query',\n VUE_QUERY: 'vue-query',\n SWR: 'swr',\n ZOD: 'zod',\n HONO: 'hono',\n FETCH: 'fetch',\n MCP: 'mcp',\n} as const;\n\nexport type OutputClient = (typeof OutputClient)[keyof typeof OutputClient];\n\nexport const OutputHttpClient = {\n AXIOS: 'axios',\n FETCH: 'fetch',\n ANGULAR: 'angular',\n} as const;\n\nexport type OutputHttpClient =\n (typeof OutputHttpClient)[keyof typeof OutputHttpClient];\n\nexport const OutputMode = {\n SINGLE: 'single',\n SPLIT: 'split',\n TAGS: 'tags',\n TAGS_SPLIT: 'tags-split',\n} as const;\n\nexport type OutputMode = (typeof OutputMode)[keyof typeof OutputMode];\n\nexport type OutputDocsOptions = {\n configPath?: string;\n} & Partial<TypeDocOptions>;\n\n// TODO: add support for other mock types (like cypress or playwright)\nexport const OutputMockType = {\n MSW: 'msw',\n FAKER: 'faker',\n} as const;\n\nexport type OutputMockType =\n (typeof OutputMockType)[keyof typeof OutputMockType];\n\nexport type PreferredContentType =\n | 'application/json'\n | 'application/xml'\n | 'text/plain'\n | 'text/html'\n | 'application/octet-stream'\n | (string & {});\n\n// Shared by every mock generator.\nexport interface CommonMockOptions {\n // Use OpenAPI examples to seed mock values where available\n useExamples?: boolean;\n // Generate response factories for every HTTP status defined in the spec\n generateEachHttpStatus?: boolean;\n // Faker locale (controls the `@faker-js/faker/locale/<x>` import path)\n locale?: keyof typeof allLocales;\n // Selects which response schema is mocked when multiple content types exist\n preferredContentType?: string;\n}\n\nexport interface MswMockOptions extends CommonMockOptions {\n type: typeof OutputMockType.MSW;\n // Base URL prefix for the generated MSW route matchers\n baseUrl?: string;\n // Response delay before MSW handlers resolve (false disables delay)\n delay?: false | number | (() => number);\n // Execute the `delay` function at runtime rather than build time\n delayFunctionLazyExecute?: boolean;\n}\n\nexport interface FakerMockOptions extends CommonMockOptions {\n type: typeof OutputMockType.FAKER;\n}\n\nexport type GlobalMockOptions = MswMockOptions | FakerMockOptions;\n\n// The top-level `mock` key on OutputOptions accepts this object form:\n// mock: {\n// indexMockFiles: true,\n// generators: [\n// { type: OutputMockType.MSW, ... },\n// { type: OutputMockType.FAKER, ... },\n// ],\n// }\nexport interface OutputMocksConfig {\n // When true, emits one root-level `index.<ext>.ts` per generator entry\n // (e.g. `index.msw.ts` and/or `index.faker.ts`) in tags-split mode\n indexMockFiles?: boolean;\n generators: (GlobalMockOptions | ClientMockBuilder)[];\n}\n\n// Accepts:\n// - boolean shorthand (`mock: true` => both msw + faker with defaults)\n// - OutputMocksConfig (full object form)\n// - ClientMockBuilder (single function-form for advanced users)\nexport type OutputMocksOption = boolean | OutputMocksConfig | ClientMockBuilder;\n\n// Normalized result of resolving OutputMocksOption. Always an object so the\n// rest of the pipeline can iterate `generators` without branching on shape.\nexport interface NormalizedMocksConfig {\n indexMockFiles: boolean;\n generators: (GlobalMockOptions | ClientMockBuilder)[];\n}\n\nexport type OverrideMockOptions = Partial<GlobalMockOptions> & {\n arrayMin?: number;\n arrayMax?: number;\n stringMin?: number;\n stringMax?: number;\n numberMin?: number;\n numberMax?: number;\n required?: boolean;\n properties?: MockProperties;\n format?: Record<string, unknown>;\n fractionDigits?: number;\n};\n\nexport type MockOptions = Omit<OverrideMockOptions, 'properties'> & {\n properties?: Record<string, unknown>;\n operations?: Record<string, { properties: Record<string, unknown> }>;\n tags?: Record<string, { properties: Record<string, unknown> }>;\n};\n\nexport type MockPropertiesObject = Record<string, unknown>;\nexport type MockPropertiesObjectFn = (\n specs: OpenApiDocument,\n) => MockPropertiesObject;\n\nexport type MockProperties = MockPropertiesObject | MockPropertiesObjectFn;\n\nexport type MockDataObject = Record<string, unknown>;\n\nexport type MockDataObjectFn = (specs: OpenApiDocument) => MockDataObject;\n\nexport type MockDataArray = unknown[];\n\nexport type MockDataArrayFn = (specs: OpenApiDocument) => MockDataArray;\n\nexport type MockData =\n | MockDataObject\n | MockDataObjectFn\n | MockDataArray\n | MockDataArrayFn;\n\ntype OutputTransformerFn = (verb: GeneratorVerbOptions) => GeneratorVerbOptions;\n\ntype OutputTransformer = string | OutputTransformerFn;\n\nexport interface MutatorObject {\n path: string;\n name?: string;\n default?: boolean;\n alias?: Record<string, string>;\n external?: string[];\n extension?: string;\n}\n\nexport type Mutator = string | MutatorObject;\n\nexport interface ParamsSerializerOptions {\n qs?: Record<string, unknown>;\n}\n\nexport const FormDataArrayHandling = {\n SERIALIZE: 'serialize',\n EXPLODE: 'explode',\n SERIALIZE_WITH_BRACKETS: 'serialize-with-brackets',\n} as const;\n\nexport type FormDataArrayHandling =\n (typeof FormDataArrayHandling)[keyof typeof FormDataArrayHandling];\n\nexport type NormalizedFormDataType<TMutator> =\n | {\n disabled: true;\n mutator?: never;\n arrayHandling: FormDataArrayHandling;\n }\n | {\n disabled: false;\n mutator?: TMutator;\n arrayHandling: FormDataArrayHandling;\n };\nexport type FormDataType<TMutator> =\n | {\n mutator: TMutator;\n arrayHandling?: FormDataArrayHandling;\n }\n | {\n mutator?: TMutator;\n arrayHandling: FormDataArrayHandling;\n };\n\nexport interface OverrideOutput {\n title?: (title: string) => string;\n transformer?: OutputTransformer;\n mutator?: Mutator;\n operations?: Record<string, OperationOptions>;\n tags?: Record<string, OperationOptions>;\n mock?: OverrideMockOptions;\n contentType?: OverrideOutputContentType;\n header?: boolean | ((info: OpenApiInfoObject) => string[] | string);\n formData?: boolean | Mutator | FormDataType<Mutator>;\n formUrlEncoded?: boolean | Mutator;\n paramsSerializer?: Mutator;\n paramsSerializerOptions?: ParamsSerializerOptions;\n paramsFilter?: Mutator;\n namingConvention?: {\n enum?: NamingConvention;\n };\n components?: {\n schemas?: {\n suffix?: string;\n itemSuffix?: string;\n };\n responses?: {\n suffix?: string;\n };\n parameters?: {\n suffix?: string;\n };\n requestBodies?: {\n suffix?: string;\n };\n };\n hono?: HonoOptions;\n mcp?: McpOptions;\n query?: QueryOptions;\n swr?: SwrOptions;\n angular?: AngularOptions;\n zod?: ZodOptions;\n operationName?: (\n operation: OpenApiOperationObject,\n route: string,\n verb: Verbs,\n ) => string;\n fetch?: FetchOptions;\n\n requestOptions?: Record<string, unknown> | boolean;\n useDates?: boolean;\n useTypeOverInterfaces?: boolean;\n useDeprecatedOperations?: boolean;\n useBigInt?: boolean;\n useNamedParameters?: boolean;\n enumGenerationType?: EnumGeneration;\n suppressReadonlyModifier?: boolean;\n /**\n * Controls how readonly properties are handled for generated request-body types.\n *\n * Prefer `strip` for most OpenAPI specs because `readOnly` fields are\n * response-oriented. Use `preserve` only when your request DTOs are\n * intentionally immutable and should remain readonly in generated types.\n */\n preserveReadonlyRequestBodies?: ReadonlyRequestBodiesMode;\n /**\n * When enabled, operations with multiple request body content-types\n * (e.g. both `multipart/form-data` and `application/json`) will generate\n * separate functions for each content type instead of a single function\n * with a union type parameter.\n *\n * @default false\n */\n splitByContentType?: boolean;\n jsDoc?: JsDocOptions;\n aliasCombinedTypes?: boolean;\n /**\n * When enabled, optional properties will be typed as `T | null` instead of just `T`.\n * @default false\n */\n useNullForOptional?: boolean;\n}\n\nexport interface JsDocOptions {\n filter?: (\n schema: Record<string, unknown>,\n ) => { key: string; value: string }[];\n}\n\nexport interface NormalizedJsDocOptions {\n filter?: (\n schema: Record<string, unknown>,\n ) => { key: string; value: string }[];\n}\n\nexport interface OverrideOutputContentType {\n include?: string[];\n exclude?: string[];\n}\n\nexport interface NormalizedHonoOptions {\n handlers?: string;\n compositeRoute: string;\n validator: boolean | 'hono';\n validatorOutputPath: string;\n}\n\nexport interface ZodDateTimeOptions {\n offset?: boolean;\n local?: boolean;\n precision?: number;\n}\n\nexport interface ZodTimeOptions {\n precision?: -1 | 0 | 1 | 2 | 3;\n}\n\nexport interface ZodOptions {\n strict?: {\n param?: boolean;\n query?: boolean;\n header?: boolean;\n body?: boolean;\n response?: boolean;\n };\n generate?: {\n param?: boolean;\n query?: boolean;\n header?: boolean;\n body?: boolean;\n response?: boolean;\n };\n coerce?: {\n param?: boolean | ZodCoerceType[];\n query?: boolean | ZodCoerceType[];\n header?: boolean | ZodCoerceType[];\n body?: boolean | ZodCoerceType[];\n response?: boolean | ZodCoerceType[];\n };\n preprocess?: {\n param?: Mutator;\n query?: Mutator;\n header?: Mutator;\n body?: Mutator;\n response?: Mutator;\n };\n dateTimeOptions?: ZodDateTimeOptions;\n timeOptions?: ZodTimeOptions;\n generateEachHttpStatus?: boolean;\n useBrandedTypes?: boolean;\n}\n\nexport type ZodCoerceType = 'string' | 'number' | 'boolean' | 'bigint' | 'date';\n\nexport interface NormalizedZodOptions {\n strict: {\n param: boolean;\n query: boolean;\n header: boolean;\n body: boolean;\n response: boolean;\n };\n generate: {\n param: boolean;\n query: boolean;\n header: boolean;\n body: boolean;\n response: boolean;\n };\n coerce: {\n param: boolean | ZodCoerceType[];\n query: boolean | ZodCoerceType[];\n header: boolean | ZodCoerceType[];\n body: boolean | ZodCoerceType[];\n response: boolean | ZodCoerceType[];\n };\n preprocess?: {\n param?: NormalizedMutator;\n query?: NormalizedMutator;\n header?: NormalizedMutator;\n body?: NormalizedMutator;\n response?: NormalizedMutator;\n };\n generateEachHttpStatus: boolean;\n useBrandedTypes: boolean;\n dateTimeOptions: ZodDateTimeOptions;\n timeOptions: ZodTimeOptions;\n}\n\n/**\n * A single parameter value for `mutationInvalidates` params.\n *\n * - `string` – treated as a variable reference, e.g. `\"petId\"` → `variables.petId`\n * - `{ literal: string }` – emitted as a string literal, e.g. `{ literal: \"@me\" }` → `\"@me\"`\n */\nexport type InvalidateTargetParam = string | { literal: string };\n\nexport type InvalidateTarget =\n | string\n | {\n query: string;\n params?: InvalidateTargetParam[] | Record<string, InvalidateTargetParam>;\n invalidateMode?: 'invalidate' | 'reset';\n file?: string;\n };\n\nexport interface MutationInvalidatesRule {\n onMutations: string[];\n invalidates: InvalidateTarget[];\n}\n\nexport type MutationInvalidatesConfig = MutationInvalidatesRule[];\n\nexport interface HonoOptions {\n handlers?: string;\n compositeRoute?: string;\n validator?: boolean | 'hono';\n validatorOutputPath?: string;\n}\n\nexport interface McpServerOptions {\n path: string;\n name?: string;\n default?: boolean;\n}\n\nexport interface NormalizedMcpServerOptions {\n path: string;\n name?: string;\n default: boolean;\n}\n\nexport interface McpOptions {\n server?: McpServerOptions;\n}\n\nexport interface NormalizedMcpOptions {\n server?: NormalizedMcpServerOptions;\n}\n\nexport interface NormalizedQueryOptions {\n useQuery?: boolean;\n useSuspenseQuery?: boolean;\n useMutation?: boolean;\n useInfinite?: boolean;\n useSuspenseInfiniteQuery?: boolean;\n useInfiniteQueryParam?: string;\n usePrefetch?: boolean;\n useInvalidate?: boolean;\n useSetQueryData?: boolean;\n useGetQueryData?: boolean;\n\n options?: Record<string, unknown>;\n queryKey?: NormalizedMutator;\n queryOptions?: NormalizedMutator;\n mutationOptions?: NormalizedMutator;\n shouldExportMutatorHooks?: boolean;\n shouldExportHttpClient?: boolean;\n shouldExportQueryKey?: boolean;\n shouldSplitQueryKey?: boolean;\n useOperationIdAsQueryKey?: boolean;\n signal?: boolean;\n version?: 3 | 4 | 5;\n mutationInvalidates?: MutationInvalidatesConfig;\n runtimeValidation?: boolean;\n}\n\nexport interface QueryOptions {\n useQuery?: boolean;\n useSuspenseQuery?: boolean;\n useMutation?: boolean;\n useInfinite?: boolean;\n useSuspenseInfiniteQuery?: boolean;\n useInfiniteQueryParam?: string;\n usePrefetch?: boolean;\n useInvalidate?: boolean;\n useSetQueryData?: boolean;\n useGetQueryData?: boolean;\n\n options?: Record<string, unknown>;\n queryKey?: Mutator;\n queryOptions?: Mutator;\n mutationOptions?: Mutator;\n shouldExportMutatorHooks?: boolean;\n shouldExportHttpClient?: boolean;\n shouldExportQueryKey?: boolean;\n shouldSplitQueryKey?: boolean;\n useOperationIdAsQueryKey?: boolean;\n signal?: boolean;\n version?: 3 | 4 | 5;\n mutationInvalidates?: MutationInvalidatesConfig;\n runtimeValidation?: boolean;\n}\n\nexport interface AngularOptions {\n provideIn?: 'root' | 'any' | boolean;\n /**\n * Preferred name for configuring how retrieval-style operations are emitted.\n *\n * - `httpClient`: keep retrievals as service methods\n * - `httpResource`: emit retrievals as Angular `httpResource` helpers\n * - `both`: emit retrieval helpers and keep service methods where needed\n *\n * Mutation-style operations still use generated `HttpClient` service methods\n * by default unless a per-operation override forces a different behavior.\n */\n retrievalClient?: 'httpClient' | 'httpResource' | 'both';\n /**\n * Backward-compatible alias for `retrievalClient`.\n *\n * Kept for compatibility with existing configs.\n */\n client?: 'httpClient' | 'httpResource' | 'both';\n runtimeValidation?: boolean;\n httpResource?: AngularHttpResourceOptions;\n}\n\nexport interface NormalizedAngularOptions {\n provideIn: 'root' | 'any' | boolean;\n client: 'httpClient' | 'httpResource' | 'both';\n runtimeValidation: boolean;\n httpResource?: AngularHttpResourceOptions;\n}\n\nexport interface AngularHttpResourceOptions {\n /**\n * Value to expose while the resource is idle/loading.\n *\n * Serialized as a literal into generated code.\n */\n defaultValue?: unknown;\n /**\n * Debug name shown in Angular DevTools.\n */\n debugName?: string;\n /**\n * Raw code expression for HttpResourceOptions.injector.\n * Example: `inject(Injector)`.\n */\n injector?: string;\n /**\n * Raw code expression for HttpResourceOptions.equal.\n * Example: `(a, b) => a.id === b.id`.\n */\n equal?: string;\n}\n\nexport interface SwrOptions {\n useInfinite?: boolean;\n useSWRMutationForGet?: boolean;\n useSuspense?: boolean;\n generateErrorTypes?: boolean;\n swrOptions?: unknown;\n swrMutationOptions?: unknown;\n swrInfiniteOptions?: unknown;\n}\n\nexport interface NormalizedFetchOptions {\n includeHttpResponseReturnType: boolean;\n forceSuccessResponse: boolean;\n jsonReviver?: Mutator;\n runtimeValidation: boolean;\n useRuntimeFetcher: boolean;\n}\n\nexport interface FetchOptions {\n includeHttpResponseReturnType?: boolean;\n forceSuccessResponse?: boolean;\n jsonReviver?: Mutator;\n runtimeValidation?: boolean;\n useRuntimeFetcher?: boolean;\n}\n\nexport type InputTransformerFn = (\n spec: OpenApiDocument,\n) => OpenApiDocument | Promise<OpenApiDocument>;\n\ntype InputTransformer = string | InputTransformerFn;\n\nexport interface OverrideInput {\n transformer?: InputTransformer;\n}\n\nexport interface OperationOptions {\n transformer?: OutputTransformer;\n mutator?: Mutator;\n mock?: {\n data?: MockData;\n properties?: MockProperties;\n };\n query?: QueryOptions;\n angular?: AngularOptions;\n swr?: SwrOptions;\n zod?: ZodOptions;\n operationName?: (\n operation: OpenApiOperationObject,\n route: string,\n verb: Verbs,\n ) => string;\n fetch?: FetchOptions;\n formData?: boolean | Mutator | FormDataType<Mutator>;\n formUrlEncoded?: boolean | Mutator;\n paramsSerializer?: Mutator;\n paramsFilter?: Mutator;\n requestOptions?: object | boolean;\n}\n\nexport type Hook = 'afterAllFilesWrite';\n\nexport type HookFunction<TArgs extends unknown[] = unknown[]> = (\n ...args: TArgs\n) => void | Promise<void>;\n\nexport interface HookOption {\n command: string | HookFunction;\n injectGeneratedDirsAndFiles?: boolean;\n}\n\nexport type HookCommand =\n | string\n | HookFunction\n | HookOption\n | (string | HookFunction | HookOption)[];\n\nexport type NormalizedHookCommand = HookCommand[];\n\nexport type HooksOptions<T = HookCommand | NormalizedHookCommand> = Partial<\n Record<Hook, T>\n>;\n\nexport type NormalizedHookOptions = HooksOptions<NormalizedHookCommand>;\n\nexport type Verbs = 'post' | 'put' | 'get' | 'patch' | 'delete' | 'head';\n\nexport const Verbs = {\n POST: 'post' as Verbs,\n PUT: 'put' as Verbs,\n GET: 'get' as Verbs,\n PATCH: 'patch' as Verbs,\n DELETE: 'delete' as Verbs,\n HEAD: 'head' as Verbs,\n};\n\n/**\n * Canonical tag name used for the generated bucket that collects untagged operations.\n */\nexport const DefaultTag = 'default' as const;\n\nexport interface ImportOpenApi {\n spec: OpenApiDocument;\n input: NormalizedInputOptions;\n output: NormalizedOutputOptions;\n target: string;\n workspace: string;\n projectName?: string;\n}\n\nexport interface ContextSpec {\n projectName?: string;\n target: string;\n workspace: string;\n spec: OpenApiDocument;\n parents?: string[];\n output: NormalizedOutputOptions;\n}\n\nexport interface GlobalOptions {\n watch?: boolean | string | string[];\n verbose?: boolean;\n clean?: boolean | string[];\n formatter?: SupportedFormatter;\n mock?: OutputMocksOption;\n client?: OutputClient;\n httpClient?: OutputHttpClient;\n mode?: OutputMode;\n tsconfig?: string | Tsconfig;\n packageJson?: string;\n input?: string | string[];\n output?: string;\n failOnWarnings?: boolean;\n}\n\nexport interface Tsconfig {\n baseUrl?: string;\n compilerOptions?: {\n esModuleInterop?: boolean;\n allowSyntheticDefaultImports?: boolean;\n exactOptionalPropertyTypes?: boolean;\n paths?: Record<string, string[]>;\n target?: TsConfigTarget;\n module?: TsConfigModule;\n moduleResolution?: TsConfigModuleResolution;\n allowImportingTsExtensions?: boolean;\n };\n}\n\nexport type TsConfigTarget =\n | 'es3'\n | 'es5'\n | 'es6'\n | 'es2015'\n | 'es2016'\n | 'es2017'\n | 'es2018'\n | 'es2019'\n | 'es2020'\n | 'es2021'\n | 'es2022'\n | 'es2023'\n | 'es2024'\n | 'es2025'\n | 'esnext'; // https://www.typescriptlang.org/tsconfig#target\n\n/** Accepts both the canonical casing and the all-lowercase variant of a string literal. */\ntype CaseInsensitive<T extends string> = T | Lowercase<T>;\n\n/**\n * Valid values for the TypeScript `compilerOptions.module` setting.\n *\n * Both title-case (e.g. `\"NodeNext\"`) and lower-case (e.g. `\"nodenext\"`) are\n * accepted, matching TypeScript's own case-insensitive parsing.\n *\n * @see {@link https://www.typescriptlang.org/tsconfig#module}\n */\nexport type TsConfigModule = CaseInsensitive<\n | 'None'\n | 'CommonJS'\n | 'AMD'\n | 'UMD'\n | 'System'\n | 'ES6'\n | 'ES2015'\n | 'ES2020'\n | 'ES2022'\n | 'ESNext'\n | 'Node16'\n | 'Node18'\n | 'Node20'\n | 'NodeNext'\n | 'Preserve'\n>;\n\n/**\n * Valid values for the TypeScript `compilerOptions.moduleResolution` setting.\n *\n * Both title-case (e.g. `\"NodeNext\"`) and lower-case (e.g. `\"nodenext\"`) are\n * accepted, matching TypeScript's own case-insensitive parsing.\n *\n * @see https://www.typescriptlang.org/tsconfig#moduleResolution\n */\nexport type TsConfigModuleResolution = CaseInsensitive<\n 'Classic' | 'Node' | 'Node10' | 'Node16' | 'NodeNext' | 'Bundler'\n>;\n\nexport interface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n catalog?: Record<string, string>;\n catalogs?: Record<string, Record<string, string>>;\n resolvedVersions?: Record<string, string>;\n}\n\nexport interface GeneratorSchema {\n name: string;\n model: string;\n imports: GeneratorImport[];\n dependencies?: string[];\n schema?: OpenApiSchemaObject;\n}\n\nexport interface GeneratorImport {\n readonly name: string;\n readonly schemaName?: string;\n readonly isZodSchema?: boolean;\n readonly isConstant?: boolean;\n readonly alias?: string;\n readonly default?: boolean;\n readonly values?: boolean;\n readonly syntheticDefaultImport?: boolean;\n readonly namespaceImport?: boolean;\n readonly importPath?: string;\n}\n\nexport interface GeneratorDependency {\n readonly exports: readonly GeneratorImport[];\n readonly dependency: string;\n}\n\nexport interface GeneratorApiResponse {\n operations: GeneratorOperations;\n schemas: GeneratorSchema[];\n}\n\nexport type GeneratorOperations = Record<string, GeneratorOperation>;\n\n// A single generator's accumulated mock output, keyed by the generator's\n// `OutputMockType`. Writers iterate over `GeneratorTarget.mockOutputs` to\n// emit one file per entry (e.g. `<file>.msw.ts` and `<file>.faker.ts`).\nexport interface GeneratorMockOutput {\n type: OutputMockType;\n implementation: string;\n imports: GeneratorImport[];\n}\n\nexport interface GeneratorMockOutputFull {\n type: OutputMockType;\n implementation: {\n function: string;\n handler: string;\n handlerName: string;\n };\n imports: GeneratorImport[];\n}\n\nexport interface GeneratorTarget {\n imports: GeneratorImport[];\n implementation: string;\n mockOutputs: GeneratorMockOutput[];\n mutators?: GeneratorMutator[];\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator[];\n formUrlEncoded?: GeneratorMutator[];\n paramsSerializer?: GeneratorMutator[];\n paramsFilter?: GeneratorMutator[];\n fetchReviver?: GeneratorMutator[];\n}\n\nexport interface GeneratorTargetFull {\n imports: GeneratorImport[];\n implementation: string;\n mockOutputs: GeneratorMockOutputFull[];\n mutators?: GeneratorMutator[];\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator[];\n formUrlEncoded?: GeneratorMutator[];\n paramsSerializer?: GeneratorMutator[];\n paramsFilter?: GeneratorMutator[];\n fetchReviver?: GeneratorMutator[];\n}\n\nexport interface GeneratorOperation {\n imports: GeneratorImport[];\n implementation: string;\n mockOutputs: GeneratorMockOutputFull[];\n tags: string[];\n mutator?: GeneratorMutator;\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator;\n formUrlEncoded?: GeneratorMutator;\n paramsSerializer?: GeneratorMutator;\n paramsFilter?: GeneratorMutator;\n fetchReviver?: GeneratorMutator;\n operationName: string;\n types?: {\n result: (title?: string) => string;\n };\n}\n\nexport interface GeneratorVerbOptions {\n verb: Verbs;\n route: string;\n pathRoute: string;\n summary?: string;\n doc: string;\n tags: string[];\n operationId: string;\n operationName: string;\n response: GetterResponse;\n body: GetterBody;\n headers?: GetterQueryParam;\n queryParams?: GetterQueryParam;\n params: GetterParams;\n props: GetterProps;\n mutator?: GeneratorMutator;\n formData?: GeneratorMutator;\n formUrlEncoded?: GeneratorMutator;\n paramsSerializer?: GeneratorMutator;\n paramsFilter?: GeneratorMutator;\n fetchReviver?: GeneratorMutator;\n override: NormalizedOverrideOutput;\n deprecated?: boolean;\n originalOperation: OpenApiOperationObject;\n}\n\nexport type GeneratorVerbsOptions = GeneratorVerbOptions[];\n\nexport interface GeneratorOptions {\n route: string;\n pathRoute: string;\n override: NormalizedOverrideOutput;\n context: ContextSpec;\n mock?: GlobalMockOptions | ClientMockBuilder;\n output: string;\n}\n\nexport interface GeneratorClient {\n implementation: string;\n imports: GeneratorImport[];\n mutators?: GeneratorMutator[];\n /** When set, overrides the default verbOption.doc prepended to the implementation */\n docComment?: string;\n}\n\nexport interface GeneratorMutatorParsingInfo {\n numberOfParams: number;\n returnNumberOfParams?: number;\n}\nexport interface GeneratorMutator {\n name: string;\n path: string;\n default: boolean;\n hasErrorType: boolean;\n errorTypeName: string;\n hasSecondArg: boolean;\n hasThirdArg: boolean;\n isHook: boolean;\n bodyTypeName?: string;\n}\n\nexport type ClientBuilder = (\n verbOptions: GeneratorVerbOptions,\n options: GeneratorOptions,\n outputClient: OutputClient | OutputClientFunc,\n output?: NormalizedOutputOptions,\n) => GeneratorClient | Promise<GeneratorClient>;\n\nexport interface ClientFileBuilder {\n path: string;\n content: string;\n}\nexport type ClientExtraFilesBuilder = (\n verbOptions: Record<string, GeneratorVerbOptions>,\n output: NormalizedOutputOptions,\n context: ContextSpec,\n) => Promise<ClientFileBuilder[]>;\n\nexport type ClientHeaderBuilder = (params: {\n title: string;\n isRequestOptions: boolean;\n isMutator: boolean;\n noFunction?: boolean;\n isGlobalMutator: boolean;\n provideIn: boolean | 'root' | 'any';\n hasAwaitedType: boolean;\n output: NormalizedOutputOptions;\n verbOptions: Record<string, GeneratorVerbOptions>;\n tag?: string;\n isDefaultTagBucket?: boolean;\n clientImplementation: string;\n}) => string;\n\nexport type ClientFooterBuilder = (params: {\n noFunction?: boolean | undefined;\n operationNames: string[];\n title?: string;\n hasAwaitedType: boolean;\n hasMutator: boolean;\n}) => string;\n\nexport type ClientTitleBuilder = (title: string) => string;\n\nexport type ClientDependenciesBuilder = (\n hasGlobalMutator: boolean,\n hasParamsSerializerOptions: boolean,\n packageJson?: PackageJson,\n httpClient?: OutputHttpClient,\n hasTagsMutator?: boolean,\n override?: NormalizedOverrideOutput,\n) => GeneratorDependency[];\n\nexport interface ClientMockGeneratorImplementation {\n function: string;\n handlerName: string;\n handler: string;\n}\n\nexport interface ClientMockGeneratorBuilder {\n imports: GeneratorImport[];\n implementation: ClientMockGeneratorImplementation;\n}\n\nexport type ClientMockBuilder = (\n verbOptions: GeneratorVerbOptions,\n generatorOptions: GeneratorOptions,\n) => ClientMockGeneratorBuilder;\n\nexport interface ClientGeneratorsBuilder {\n client: ClientBuilder;\n header?: ClientHeaderBuilder;\n dependencies?: ClientDependenciesBuilder;\n footer?: ClientFooterBuilder;\n title?: ClientTitleBuilder;\n extraFiles?: ClientExtraFilesBuilder;\n}\n\nexport type GeneratorClients = Record<OutputClient, ClientGeneratorsBuilder>;\n\nexport interface GetterResponse {\n imports: GeneratorImport[];\n definition: {\n success: string;\n errors: string;\n };\n isBlob: boolean;\n types: {\n success: ResReqTypesValue[];\n errors: ResReqTypesValue[];\n };\n contentTypes: string[];\n schemas: GeneratorSchema[];\n\n originalSchema?: OpenApiResponsesObject;\n}\n\nexport interface GetterBody {\n originalSchema: OpenApiReferenceObject | OpenApiRequestBodyObject;\n imports: GeneratorImport[];\n definition: string;\n implementation: string;\n schemas: GeneratorSchema[];\n formData?: string;\n formUrlEncoded?: string;\n contentType: string;\n isOptional: boolean;\n}\n\nexport interface GetterParameters {\n query: { parameter: OpenApiParameterObject; imports: GeneratorImport[] }[];\n path: { parameter: OpenApiParameterObject; imports: GeneratorImport[] }[];\n header: { parameter: OpenApiParameterObject; imports: GeneratorImport[] }[];\n}\n\nexport interface GetterParam {\n name: string;\n definition: string;\n implementation: string;\n default: unknown;\n required: boolean;\n imports: GeneratorImport[];\n}\n\nexport type GetterParams = GetterParam[];\nexport interface GetterQueryParam {\n schema: GeneratorSchema;\n deps: GeneratorSchema[];\n isOptional: boolean;\n originalSchema?: OpenApiSchemaObject;\n requiredNullableKeys?: string[];\n /**\n * Names of query parameters whose declared schema is non-primitive\n * (object, array of objects, or untyped). Used by Angular generators to\n * preserve these values through the default `filterParams` helper instead\n * of silently dropping them — the user's `paramsSerializer`, `mutator`, or\n * `paramsFilter` is then responsible for handling them. See issue #3326.\n */\n nonPrimitiveKeys?: string[];\n}\n\nexport type GetterPropType =\n | 'param'\n | 'body'\n | 'queryParam'\n | 'header'\n | 'namedPathParams';\n\nexport const GetterPropType = {\n PARAM: 'param',\n NAMED_PATH_PARAMS: 'namedPathParams',\n BODY: 'body',\n QUERY_PARAM: 'queryParam',\n HEADER: 'header',\n} as const;\n\ninterface GetterPropBase {\n name: string;\n definition: string;\n implementation: string;\n default: unknown;\n required: boolean;\n}\n\nexport type GetterProp = GetterPropBase &\n (\n | { type: 'namedPathParams'; destructured: string; schema: GeneratorSchema }\n | { type: Exclude<GetterPropType, 'namedPathParams'> }\n );\n\nexport type GetterProps = GetterProp[];\n\nexport type SchemaType =\n | 'integer'\n | 'number'\n | 'string'\n | 'boolean'\n | 'object'\n | 'null'\n | 'array'\n | 'enum'\n | 'unknown';\n\nexport const SchemaType = {\n integer: 'integer',\n number: 'number',\n string: 'string',\n boolean: 'boolean',\n object: 'object',\n null: 'null',\n array: 'array',\n enum: 'enum',\n unknown: 'unknown',\n};\n\nexport interface ScalarValue {\n value: string;\n useTypeAlias?: boolean;\n isEnum: boolean;\n hasReadonlyProps: boolean;\n type: SchemaType;\n imports: GeneratorImport[];\n schemas: GeneratorSchema[];\n isRef: boolean;\n dependencies: string[];\n example?: unknown;\n examples?: Record<string, unknown> | unknown[];\n}\n\nexport type ResolverValue = ScalarValue & {\n originalSchema: OpenApiSchemaObject;\n};\n\nexport type ResReqTypesValue = ScalarValue & {\n formData?: string;\n formUrlEncoded?: string;\n isRef?: boolean;\n hasReadonlyProps?: boolean;\n key: string;\n contentType: string;\n originalSchema?: OpenApiSchemaObject;\n};\n\nexport interface WriteSpecBuilder {\n operations: GeneratorOperations;\n verbOptions: Record<string, GeneratorVerbOptions>;\n schemas: GeneratorSchema[];\n title: GeneratorClientTitle;\n header: GeneratorClientHeader;\n footer: GeneratorClientFooter;\n imports: GeneratorClientImports;\n importsMock: GenerateMockImports;\n extraFiles: ClientFileBuilder[];\n info: OpenApiInfoObject;\n target: string;\n spec: OpenApiDocument;\n}\n\nexport interface WriteModeProps {\n builder: WriteSpecBuilder;\n output: NormalizedOutputOptions;\n workspace: string;\n projectName?: string;\n header: string;\n needSchema: boolean;\n generateSchemasInline?: () => string;\n}\n\nexport interface GeneratorApiOperations {\n verbOptions: Record<string, GeneratorVerbOptions>;\n operations: GeneratorOperations;\n schemas: GeneratorSchema[];\n}\n\nexport interface GeneratorClientExtra {\n implementation: string;\n implementationMock: string;\n}\n\nexport type GeneratorClientTitle = (data: {\n outputClient?: OutputClient | OutputClientFunc;\n title: string;\n customTitleFunc?: (title: string) => string;\n output: NormalizedOutputOptions;\n}) => GeneratorClientExtra;\n\nexport type GeneratorClientHeader = (data: {\n outputClient?: OutputClient | OutputClientFunc;\n isRequestOptions: boolean;\n isMutator: boolean;\n isGlobalMutator: boolean;\n provideIn: boolean | 'root' | 'any';\n hasAwaitedType: boolean;\n titles: GeneratorClientExtra;\n output: NormalizedOutputOptions;\n verbOptions: Record<string, GeneratorVerbOptions>;\n tag?: string;\n isDefaultTagBucket?: boolean;\n clientImplementation: string;\n}) => GeneratorClientExtra;\n\nexport type GeneratorClientFooter = (data: {\n outputClient: OutputClient | OutputClientFunc;\n operationNames: string[];\n hasMutator: boolean;\n hasAwaitedType: boolean;\n titles: GeneratorClientExtra;\n output: NormalizedOutputOptions;\n}) => GeneratorClientExtra;\n\nexport type GeneratorClientImports = (data: {\n client: OutputClient | OutputClientFunc;\n implementation: string;\n imports: readonly GeneratorDependency[];\n projectName?: string;\n hasSchemaDir: boolean;\n isAllowSyntheticDefaultImports: boolean;\n hasGlobalMutator: boolean;\n hasTagsMutator: boolean;\n hasParamsSerializerOptions: boolean;\n packageJson?: PackageJson;\n output: NormalizedOutputOptions;\n}) => string;\n\nexport type GenerateMockImports = (data: {\n implementation: string;\n imports: readonly GeneratorDependency[];\n projectName?: string;\n hasSchemaDir: boolean;\n isAllowSyntheticDefaultImports: boolean;\n options?: GlobalMockOptions;\n}) => string;\n\nexport type GeneratorApiBuilder = GeneratorApiOperations & {\n title: GeneratorClientTitle;\n header: GeneratorClientHeader;\n footer: GeneratorClientFooter;\n imports: GeneratorClientImports;\n importsMock: GenerateMockImports;\n extraFiles: ClientFileBuilder[];\n};\n\nexport class ErrorWithTag extends Error {\n tag: string;\n constructor(message: string, tag: string, options?: ErrorOptions) {\n super(message, options);\n this.tag = tag;\n }\n}\n\nexport type OpenApiSchemaObjectType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'integer'\n | 'null'\n | 'array';\n\n// OpenAPI type aliases. Intended to make it easy to swap to OpenAPI v3.2 in the future\nexport type OpenApiDocument = OpenAPIV3_1.Document;\nexport type OpenApiSchemaObject = OpenAPIV3_1.SchemaObject;\nexport type OpenApiSchemasObject = Record<string, OpenApiSchemaObject>;\nexport type OpenApiReferenceObject = OpenAPIV3_1.ReferenceObject & {\n // https://github.com/scalar/scalar/issues/7405\n $ref?: string;\n};\nexport type OpenApiComponentsObject = OpenAPIV3_1.ComponentsObject;\nexport type OpenApiPathsObject = OpenAPIV3_1.PathsObject;\nexport type OpenApiPathItemObject = OpenAPIV3_1.PathItemObject;\nexport type OpenApiResponsesObject = OpenAPIV3_1.ResponsesObject;\nexport type OpenApiResponseObject = OpenAPIV3_1.ResponseObject;\nexport type OpenApiParameterObject = OpenAPIV3_1.ParameterObject;\nexport type OpenApiRequestBodyObject = OpenAPIV3_1.RequestBodyObject;\nexport type OpenApiInfoObject = OpenAPIV3_1.InfoObject;\nexport type OpenApiExampleObject = OpenAPIV3_1.ExampleObject;\nexport type OpenApiOperationObject = OpenAPIV3_1.OperationObject;\nexport type OpenApiMediaTypeObject = OpenAPIV3_1.MediaTypeObject;\nexport type OpenApiEncodingObject = OpenAPIV3_1.EncodingObject;\nexport type OpenApiServerObject = OpenAPIV3_1.ServerObject;\n","import { Verbs } from './types';\n\nexport const generalJSTypes = [\n 'number',\n 'string',\n 'null',\n 'unknown',\n 'undefined',\n 'object',\n 'blob',\n];\n\nexport const generalJSTypesWithArray = generalJSTypes.flatMap((type) => [\n type,\n `Array<${type}>`,\n `${type}[]`,\n]);\n\nexport const VERBS_WITH_BODY = [\n Verbs.POST,\n Verbs.PUT,\n Verbs.PATCH,\n Verbs.DELETE,\n];\n\nexport const URL_REGEX =\n /^(?:http(s)?:\\/\\/)?[\\w.-]+(?:\\.[\\w.-]+)+[\\w\\-._~:/?#[\\]@!$&'()*+,;=.]+$/;\n\nexport const TEMPLATE_TAG_REGEX = /\\${(.+?)}/g; // For replace of 'thing' ${thing}\n","import path from 'node:path';\n\nimport { isFunction, isNullish, isString } from 'remeda';\n\nimport {\n type ClientMockBuilder,\n type FakerMockOptions,\n type GlobalMockOptions,\n type MswMockOptions,\n type OpenApiReferenceObject,\n type OpenApiSchemaObject,\n OutputMockType,\n SchemaType,\n Verbs,\n} from '../types';\n\n/**\n * Discriminator helper for `ReferenceObject`\n *\n * @param property\n */\nexport function isReference(obj: object): obj is OpenApiReferenceObject {\n return !isNullish(obj) && Object.hasOwn(obj, '$ref');\n}\n\nexport function isDirectory(pathValue: string) {\n return !path.extname(pathValue);\n}\n\nexport function isObject(x: unknown): x is Record<string, unknown> {\n return Object.prototype.toString.call(x) === '[object Object]';\n}\n\nexport function isStringLike(val: unknown): val is string {\n if (isString(val)) {\n return true;\n }\n\n return Object.prototype.toString.call(val) === '[object String]';\n}\n\nexport function isModule(x: unknown): x is Record<string, unknown> {\n return Object.prototype.toString.call(x) === '[object Module]';\n}\n\nexport function isNumeric(x: unknown): x is number {\n if (typeof x === 'number') return Number.isInteger(x);\n return isString(x) && /^-?\\d+$/.test(x);\n}\n\nexport function isSchema(x: unknown): x is OpenApiSchemaObject {\n if (!isObject(x)) {\n return false;\n }\n\n if (isString(x.type) && Object.values(SchemaType).includes(x.type)) {\n return true;\n }\n\n const combine = x.allOf ?? x.anyOf ?? x.oneOf;\n if (Array.isArray(combine)) {\n return true;\n }\n\n if (isObject(x.properties)) {\n return true;\n }\n\n return false;\n}\n\nexport function isVerb(verb: string): verb is Verbs {\n return Object.values(Verbs).includes(verb as Verbs);\n}\n\nexport function isUrl(str: string) {\n if (!str.trim()) return false;\n\n try {\n const url = new URL(str);\n return ['http:', 'https:'].includes(url.protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * Type guard for the MSW mock generator. Use to narrow a\n * `GlobalMockOptions | ClientMockBuilder` value to `MswMockOptions`.\n */\nexport function isMswMock(\n mock: GlobalMockOptions | ClientMockBuilder,\n): mock is MswMockOptions {\n return !isFunction(mock) && mock.type === OutputMockType.MSW;\n}\n\n/**\n * Type guard for the Faker mock generator. Use to narrow a\n * `GlobalMockOptions | ClientMockBuilder` value to `FakerMockOptions`.\n */\nexport function isFakerMock(\n mock: GlobalMockOptions | ClientMockBuilder,\n): mock is FakerMockOptions {\n return !isFunction(mock) && mock.type === OutputMockType.FAKER;\n}\n\nexport { isBoolean, isFunction, isNullish, isNumber, isString } from 'remeda';\n","import { isFunction } from './assertion';\n\nexport async function asyncReduce<IterationItem, AccValue>(\n array: IterationItem[],\n reducer: (\n accumulate: AccValue,\n current: IterationItem,\n ) => AccValue | Promise<AccValue>,\n initValue: AccValue,\n): Promise<AccValue> {\n const shouldClone =\n initValue === null ||\n (initValue === Object(initValue) && !isFunction(initValue));\n let accumulate: AccValue = shouldClone\n ? (Object.create(initValue as unknown as object) as AccValue)\n : initValue;\n\n for (const item of array) {\n accumulate = await reducer(accumulate, item);\n }\n\n return accumulate;\n}\n","import { NamingConvention } from '../types';\n\nconst unicodes = function (s: string, prefix = '') {\n return s\n .replaceAll(/(^|-)/g, String.raw`$1\\u` + prefix)\n .replaceAll(',', String.raw`\\u` + prefix);\n};\n\nconst symbols = unicodes('20-26,28-2F,3A-40,5B-60,7B-7E,A0-BF,D7,F7', '00');\nconst lowers = 'a-z' + unicodes('DF-F6,F8-FF', '00');\nconst uppers = 'A-Z' + unicodes('C0-D6,D8-DE', '00');\nconst impropers = String.raw`A|An|And|As|At|But|By|En|For|If|In|Of|On|Or|The|To|Vs?\\.?|Via`;\n\nconst regexps = {\n capitalize: new RegExp('(^|[' + symbols + '])([' + lowers + '])', 'g'),\n pascal: new RegExp('(^|[' + symbols + '])+([' + lowers + uppers + '])', 'g'),\n fill: new RegExp('[' + symbols + ']+(.|$)', 'g'),\n sentence: new RegExp(\n String.raw`(^\\s*|[\\?\\!\\.]+\"?\\s+\"?|,\\s+\")([` + lowers + '])',\n 'g',\n ),\n improper: new RegExp(String.raw`\\b(` + impropers + String.raw`)\\b`, 'g'),\n relax: new RegExp(\n '([^' +\n uppers +\n '])([' +\n uppers +\n ']*)([' +\n uppers +\n '])(?=[^' +\n uppers +\n ']|$)',\n 'g',\n ),\n upper: new RegExp('^[^' + lowers + ']+$'),\n hole: /[^\\s]\\s[^\\s]/,\n apostrophe: /'/g,\n room: new RegExp('[' + symbols + ']'),\n};\n\nconst deapostrophe = (s: string) => {\n return s.replace(regexps.apostrophe, '');\n};\n\nconst up = (s: string) => s.toUpperCase();\nconst low = (s: string) => s.toLowerCase();\n\nconst fill = (s: string, fillWith: string, isDeapostrophe = false) => {\n s = s.replace(regexps.fill, function (m: string, next: string) {\n return next ? fillWith + next : '';\n });\n\n if (isDeapostrophe) {\n s = deapostrophe(s);\n }\n return s;\n};\n\nconst decap = (s: string, char = 0) => {\n return low(s.charAt(char)) + s.slice(char + 1);\n};\n\nconst relax = (\n m: string,\n before: string,\n acronym: string | undefined,\n caps: string,\n) => {\n return before + ' ' + (acronym ? acronym + ' ' : '') + caps;\n};\n\nconst prep = (s: string, isFill = false, isPascal = false, isUpper = false) => {\n // s is already typed as string, no coercion needed\n if (!isUpper && regexps.upper.test(s)) {\n s = low(s);\n }\n if (!isFill && !regexps.hole.test(s)) {\n // eslint-disable-next-line no-var\n var holey = fill(s, ' ');\n if (regexps.hole.test(holey)) {\n s = holey;\n }\n }\n if (!isPascal && !regexps.room.test(s)) {\n s = s.replace(regexps.relax, relax);\n }\n return s;\n};\n\nconst lower = (s: string, fillWith: string, isDeapostrophe: boolean) => {\n return fill(low(prep(s, !!fillWith)), fillWith, isDeapostrophe);\n};\n\n// Caches the previously converted strings to improve performance\nconst pascalMemory: Record<string, string> = {};\n\nexport function pascal(s = '') {\n if (pascalMemory[s]) {\n return pascalMemory[s];\n }\n\n const isStartWithUnderscore = s.startsWith('_');\n\n if (regexps.upper.test(s)) {\n s = low(s);\n }\n\n const pascalString = (s.match(/[a-zA-Z0-9\\u00C0-\\u017F]+/g) ?? [])\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join('');\n\n const pascalWithUnderscore = isStartWithUnderscore\n ? `_${pascalString}`\n : pascalString;\n\n pascalMemory[s] = pascalWithUnderscore;\n\n return pascalWithUnderscore;\n}\n\nexport function camel(s = '') {\n const isStartWithUnderscore = s.startsWith('_');\n const camelString = decap(pascal(s), isStartWithUnderscore ? 1 : 0);\n return isStartWithUnderscore ? `_${camelString}` : camelString;\n}\n\nexport function snake(s = '') {\n return lower(s, '_', true);\n}\n\nexport function kebab(s = '') {\n return lower(s, '-', true);\n}\n\nexport function upper(s: string, fillWith: string, isDeapostrophe?: boolean) {\n return fill(up(prep(s, !!fillWith, false, true)), fillWith, isDeapostrophe);\n}\n\nexport function conventionName(name: string, convention: NamingConvention) {\n let nameConventionTransform = camel;\n switch (convention) {\n case NamingConvention.PASCAL_CASE: {\n nameConventionTransform = pascal;\n\n break;\n }\n case NamingConvention.SNAKE_CASE: {\n nameConventionTransform = snake;\n\n break;\n }\n case NamingConvention.KEBAB_CASE: {\n nameConventionTransform = kebab;\n\n break;\n }\n // No default\n }\n\n return nameConventionTransform(name);\n}\n","import { compare, type CompareOperator } from 'compare-versions';\n\nexport function compareVersions(\n firstVersion: string,\n secondVersions: string,\n operator: CompareOperator = '>=',\n) {\n if (firstVersion === 'latest' || firstVersion === '*') {\n return true;\n }\n\n // Handle workspace catalog references (pnpm/bun)\n // catalog: or catalog:name format - assume latest version\n if (firstVersion.startsWith('catalog:')) {\n return true;\n }\n\n return compare(\n firstVersion.replace(/(\\s(.*))/, ''),\n secondVersions,\n operator,\n );\n}\n","import type { OpenApiSchemaObject } from '../types';\n\n// Known binary application/* types — add new entries here as needed\nconst binaryApplicationTypes = new Set([\n 'application/octet-stream',\n 'application/pdf',\n 'application/zip',\n]);\n\n/**\n * Determine if a content type is binary.\n * Only known binary types return true. Unknown types default to false (non-binary)\n * so that schema type information is preserved rather than being overridden with Blob.\n */\nexport function isBinaryContentType(contentType: string): boolean {\n // Strip parameters (e.g., \"; charset=utf-8\") to get the base MIME type\n const baseType = contentType.split(';')[0].trim();\n\n if (baseType.startsWith('image/')) return true;\n if (baseType.startsWith('audio/')) return true;\n if (baseType.startsWith('video/')) return true;\n if (baseType.startsWith('font/')) return true;\n\n return binaryApplicationTypes.has(baseType);\n}\n\n/**\n * Determine if a form-data field should be treated as a file (binary or text).\n *\n * Precedence (per OAS 3.1): encoding.contentType > schema.contentMediaType\n *\n * Returns:\n * - 'binary': binary file (Blob)\n * - 'text': text file (Blob | string)\n * - undefined: not a file, use standard string resolution\n */\nexport function getFormDataFieldFileType(\n resolvedSchema: OpenApiSchemaObject,\n partContentType: string | undefined,\n): 'binary' | 'text' | undefined {\n // Only override string fields - objects/arrays with encoding are just serialized\n if (resolvedSchema.type !== 'string') {\n return undefined;\n }\n\n // contentEncoding (e.g., base64) means the value is an encoded string, not a file\n if (resolvedSchema.contentEncoding) {\n return undefined;\n }\n\n const contentMediaType = resolvedSchema.contentMediaType as\n | string\n | undefined;\n const effectiveContentType = partContentType ?? contentMediaType;\n\n if (effectiveContentType) {\n return isBinaryContentType(effectiveContentType) ? 'binary' : 'text';\n }\n\n return undefined;\n}\n\n/**\n * Filter configuration for content types\n */\nexport interface ContentTypeFilter {\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * Filters items by content type based on include/exclude rules\n *\n * @param items - Array of items with contentType property\n * @param filter - Optional filter configuration\n * @returns Filtered array\n *\n * @example\n * ```ts\n * const types = [\n * { contentType: 'application/json', value: '...' },\n * { contentType: 'text/xml', value: '...' }\n * ];\n *\n * // Include only JSON\n * filterByContentType(types, { include: ['application/json'] });\n *\n * // Exclude XML\n * filterByContentType(types, { exclude: ['text/xml'] });\n * ```\n */\nexport function filterByContentType<T extends { contentType: string }>(\n items: T[],\n filter?: ContentTypeFilter,\n): T[] {\n if (!filter) {\n return items;\n }\n\n return items.filter((item) => {\n const shouldInclude =\n !filter.include || filter.include.includes(item.contentType);\n\n const shouldExclude = filter.exclude?.includes(item.contentType) ?? false;\n\n return shouldInclude && !shouldExclude;\n });\n}\n","import debug from 'debug';\n\nimport { isString } from './assertion';\n\nconst filter = process.env.ORVAL_DEBUG_FILTER;\nconst DEBUG = process.env.DEBUG;\n\ninterface DebuggerOptions {\n onlyWhenFocused?: boolean | string;\n}\n\nexport function createDebugger(\n ns: string,\n options: DebuggerOptions = {},\n): debug.Debugger['log'] {\n const log = debug(ns);\n const { onlyWhenFocused } = options;\n const focus = isString(onlyWhenFocused) ? onlyWhenFocused : ns;\n return (msg: string, ...args: unknown[]) => {\n if (filter && !msg.includes(filter)) {\n return;\n }\n if (onlyWhenFocused && !DEBUG?.includes(focus)) {\n return;\n }\n log(msg, ...args);\n };\n}\n","import type { ContextSpec } from '../types';\n\nconst search = String.raw`\\*/`; // Find '*/'\nconst replacement = String.raw`*\\/`; // Replace With '*\\/'\n\nconst regex = new RegExp(search, 'g');\n\ninterface JsDocSchema extends Record<string, unknown> {\n description?: string[] | string;\n deprecated?: boolean;\n summary?: string;\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n minItems?: number;\n maxItems?: number;\n type?: string | string[];\n pattern?: string;\n items?: JsDocSchema;\n}\n\ninterface JsDocEntry {\n key: string;\n value: boolean | number | string;\n}\n\nconst itemValidationKeys = [\n 'minLength',\n 'maxLength',\n 'minimum',\n 'maximum',\n 'exclusiveMinimum',\n 'exclusiveMaximum',\n 'minItems',\n 'maxItems',\n 'pattern',\n] as const satisfies readonly (keyof JsDocSchema)[];\n\nfunction getItemValidationDocEntries(\n schema?: JsDocSchema,\n prefix = 'items',\n visited = new WeakSet<JsDocSchema>(),\n): JsDocEntry[] {\n if (!schema) {\n return [];\n }\n if (visited.has(schema)) {\n return [];\n }\n visited.add(schema);\n\n const entries = itemValidationKeys.flatMap((key) => {\n const value = schema[key];\n\n return value === undefined ? [] : [{ key: `${prefix}.${key}`, value }];\n });\n\n return [\n ...entries,\n ...getItemValidationDocEntries(schema.items, `${prefix}.items`, visited),\n ];\n}\n\nexport function jsDoc(\n schema: object & JsDocSchema,\n tryOneLine = false,\n context?: ContextSpec,\n): string {\n if (context?.output.override.jsDoc) {\n const { filter } = context.output.override.jsDoc;\n if (filter) {\n return keyValuePairsToJsDoc(filter(schema));\n }\n }\n const {\n description,\n deprecated,\n summary,\n minLength,\n maxLength,\n minimum,\n maximum,\n exclusiveMinimum,\n exclusiveMaximum,\n minItems,\n maxItems,\n pattern,\n } = schema;\n const isNullable =\n schema.type === 'null' ||\n (Array.isArray(schema.type) && schema.type.includes('null'));\n const itemValidationDocEntries = getItemValidationDocEntries(schema.items);\n // Ensure there aren't any comment terminations in doc\n const lines = (\n Array.isArray(description)\n ? description.filter((d) => !d.includes('eslint-disable'))\n : [description ?? '']\n )\n .flatMap((line) => line.split(/\\r?\\n/))\n .map((line) => line.replaceAll(regex, replacement));\n\n const count = [\n description,\n deprecated,\n summary,\n minLength?.toString(),\n maxLength?.toString(),\n minimum?.toString(),\n maximum?.toString(),\n exclusiveMinimum?.toString(),\n exclusiveMaximum?.toString(),\n minItems?.toString(),\n maxItems?.toString(),\n isNullable ? 'null' : '',\n pattern,\n ...itemValidationDocEntries.map(({ value }) => value.toString()),\n ].filter(Boolean).length;\n\n if (!count) {\n return '';\n }\n\n const oneLine = count === 1 && tryOneLine;\n const eslintDisable = Array.isArray(description)\n ? description\n .find((d) => d.includes('eslint-disable'))\n ?.replaceAll(regex, replacement)\n : undefined;\n let doc = `${eslintDisable ? `/* ${eslintDisable} */\\n` : ''}/**`;\n\n if (description) {\n if (!oneLine) {\n doc += `\\n${tryOneLine ? ' ' : ''} *`;\n }\n doc += ` ${lines.join('\\n * ')}`;\n }\n\n function appendPrefix() {\n if (!oneLine) {\n doc += `\\n${tryOneLine ? ' ' : ''} *`;\n }\n }\n\n function tryAppendStringDocLine(key: string, value?: string) {\n if (value) {\n appendPrefix();\n doc += ` @${key} ${value.replaceAll(regex, replacement)}`;\n }\n }\n\n function tryAppendBooleanDocLine(key: string, value?: boolean) {\n if (value === true) {\n appendPrefix();\n doc += ` @${key}`;\n }\n }\n\n function tryAppendNumberDocLine(key: string, value?: number) {\n if (value !== undefined) {\n appendPrefix();\n doc += ` @${key} ${value}`;\n }\n }\n\n tryAppendBooleanDocLine('deprecated', deprecated);\n tryAppendStringDocLine('summary', summary?.replaceAll(regex, replacement));\n tryAppendNumberDocLine('minLength', minLength);\n tryAppendNumberDocLine('maxLength', maxLength);\n tryAppendNumberDocLine('minimum', minimum);\n tryAppendNumberDocLine('maximum', maximum);\n tryAppendNumberDocLine('exclusiveMinimum', exclusiveMinimum);\n tryAppendNumberDocLine('exclusiveMaximum', exclusiveMaximum);\n tryAppendNumberDocLine('minItems', minItems);\n tryAppendNumberDocLine('maxItems', maxItems);\n tryAppendBooleanDocLine('nullable', isNullable);\n tryAppendStringDocLine('pattern', pattern);\n\n for (const { key, value } of itemValidationDocEntries) {\n if (typeof value === 'string') {\n tryAppendStringDocLine(key, value);\n continue;\n }\n if (typeof value === 'number') {\n tryAppendNumberDocLine(key, value);\n continue;\n }\n tryAppendBooleanDocLine(key, value);\n }\n\n doc += oneLine ? ' ' : `\\n ${tryOneLine ? ' ' : ''}`;\n\n doc += '*/\\n';\n\n return doc;\n}\n\nexport function keyValuePairsToJsDoc(\n keyValues: {\n key: string;\n value: string;\n }[],\n) {\n if (keyValues.length === 0) return '';\n let doc = '/**\\n';\n for (const { key, value } of keyValues) {\n doc += ` * @${key} ${value}\\n`;\n }\n doc += ' */\\n';\n return doc;\n}\n","import path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport { createJiti } from 'jiti';\n\nimport { isModule, isObject, isString } from './assertion';\n\nconst TS_MODULE_EXTENSIONS = new Set(['.ts', '.mts', '.cts', '.tsx', '.jsx']);\n\nexport async function dynamicImport<T>(\n toImport: T | string,\n from = process.cwd(),\n takeDefault = true,\n): Promise<T> {\n if (!toImport) {\n return toImport as T;\n }\n\n try {\n if (isString(toImport)) {\n const filePath = path.resolve(from, toImport);\n const extension = path.extname(filePath);\n\n if (TS_MODULE_EXTENSIONS.has(extension)) {\n const jiti = createJiti(from, {\n interopDefault: true,\n });\n const data = await jiti.import(filePath);\n\n if (takeDefault && (isObject(data) || isModule(data)) && data.default) {\n return data.default as T;\n }\n\n return data as T;\n }\n\n // use pathToFileURL to solve issue #1332.\n // https://github.com/nodejs/node/issues/31710\n const fileUrl = pathToFileURL(filePath);\n const isJson = extension === '.json';\n const data = (\n isJson\n ? await import(fileUrl.href, { with: { type: 'json' } })\n : await import(fileUrl.href)\n ) as Record<string, unknown>;\n if (takeDefault && (isObject(data) || isModule(data)) && data.default) {\n return data.default as T;\n }\n\n return data as unknown as T;\n }\n\n return toImport as T;\n } catch (error) {\n throw new Error(\n `Oups... 🍻. Path: ${String(toImport)} => ${String(error)}`,\n { cause: error },\n );\n }\n}\n","export function getExtension(path: string) {\n return path.toLowerCase().includes('.yaml') ||\n path.toLowerCase().includes('.yml')\n ? 'yaml'\n : 'json';\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { glob } from 'tinyglobby';\n\nimport { isDirectory } from './assertion';\n\nexport function getFileInfo(\n target = '',\n {\n backupFilename = 'filename',\n extension = '.ts',\n }: { backupFilename?: string; extension?: string } = {},\n) {\n const isDir = isDirectory(target);\n const filePath = isDir\n ? path.join(target, backupFilename + extension)\n : target;\n const pathWithoutExtension = filePath.replace(/\\.[^/.]+$/, '');\n const dir = path.dirname(filePath);\n const filename = path.basename(\n filePath,\n extension.startsWith('.') ? extension : `.${extension}`,\n );\n\n return {\n path: filePath,\n pathWithoutExtension,\n extension,\n isDirectory: isDir,\n dirname: dir,\n filename,\n };\n}\n\nexport async function removeFilesAndEmptyFolders(\n patterns: string[],\n dir: string,\n) {\n const files = await glob(patterns, {\n cwd: dir,\n absolute: true,\n });\n\n // Remove files\n await Promise.all(files.map((file) => fs.promises.unlink(file)));\n\n // Find and remove empty directories\n const directories = await glob(['**/*'], {\n cwd: dir,\n absolute: true,\n onlyDirectories: true,\n });\n\n // Sort directories by depth (deepest first) to ensure we can remove nested empty folders\n const sortedDirectories = directories.toSorted((a, b) => {\n const depthA = a.split('/').length;\n const depthB = b.split('/').length;\n return depthB - depthA;\n });\n\n // Remove empty directories\n for (const directory of sortedDirectories) {\n try {\n const contents = await fs.promises.readdir(directory);\n if (contents.length === 0) {\n await fs.promises.rmdir(directory);\n }\n } catch {\n // Directory might have been removed already or doesn't exist\n // Continue with next directory\n }\n }\n}\n","import {\n type ClientMockBuilder,\n type GlobalMockOptions,\n OutputMockType,\n} from '../types';\nimport { isFunction } from './assertion';\n\n/**\n * Returns the filename suffix for a given mock entry's output file. For\n * example a `{ type: OutputMockType.MSW }` entry produces `<file>.msw.ts` and\n * a `{ type: OutputMockType.FAKER }` entry produces `<file>.faker.ts`.\n *\n * Custom `ClientMockBuilder` functions default to the `msw` suffix to preserve\n * the historical behavior.\n */\nexport function getMockFileExtensionByTypeName(\n mock: GlobalMockOptions | ClientMockBuilder,\n): OutputMockType {\n if (isFunction(mock)) {\n return OutputMockType.MSW;\n }\n return mock.type;\n}\n","/**\n * Type safe way to get arbitrary property from an object.\n *\n * @param obj - The object from which to retrieve the property.\n * @param propertyName - The name of the property to retrieve.\n * @returns Object with `hasProperty: true` and `value` of the property if it exists; otherwise `hasProperty: false` and undefined.\n *\n * @remarks Until TypeScript adds type-narrowing for Object.hasOwn we have to use this workaround\n */\nexport function getPropertySafe<T extends object, K extends keyof T>(\n obj: T,\n propertyName: K | string,\n):\n | { hasProperty: true; value: T[K] }\n | { hasProperty: false; value: undefined } {\n if (Object.hasOwn(obj, propertyName)) {\n // safe to cast here because of the above check\n return { hasProperty: true, value: obj[propertyName as K] };\n }\n\n return { hasProperty: false, value: undefined };\n}\n","import { VERBS_WITH_BODY } from '../constants';\nimport { Verbs } from '../types';\n\nexport function getIsBodyVerb(verb: Verbs) {\n return VERBS_WITH_BODY.includes(verb);\n}\n","import readline from 'node:readline';\nimport { styleText } from 'node:util';\n\nimport { isString } from './assertion';\n\nexport const log = console.log;\n\nlet _warningCount = 0;\n\nexport function logWarning(message: string) {\n _warningCount++;\n log(styleText('yellow', message));\n}\n\nexport function getWarningCount(): number {\n return _warningCount;\n}\n\nexport function resetWarnings(): void {\n _warningCount = 0;\n}\n\nlet _verbose = false;\n\nexport function setVerbose(v: boolean) {\n _verbose = v;\n}\n\nexport function isVerbose(): boolean {\n return _verbose;\n}\n\nexport const logVerbose: typeof console.log = (...args) => {\n if (_verbose) log(...args);\n};\n\nexport function startMessage({\n name,\n version,\n description,\n}: {\n name: string;\n version: string;\n description: string;\n}): string {\n return `🍻 ${styleText(['cyan', 'bold'], name)} ${styleText('green', `v${version}`)}${\n description ? ` - ${description}` : ''\n }`;\n}\n\nexport function logError(err: unknown, tag?: string) {\n let message;\n\n if (err instanceof Error) {\n message = (err.message || err.stack) ?? 'Unknown error';\n if (err.cause) {\n const causeMsg =\n err.cause instanceof Error\n ? err.cause.message\n : isString(err.cause)\n ? err.cause\n : JSON.stringify(err.cause, undefined, 2);\n message += `\\n Cause: ${causeMsg}`;\n }\n } else {\n message = String(err);\n }\n\n log(\n styleText(\n 'red',\n ['🛑', tag ? `${tag} -` : undefined, message].filter(Boolean).join(' '),\n ),\n );\n}\n\nexport function mismatchArgsMessage(mismatchArgs: string[]) {\n logWarning(\n `${mismatchArgs.join(', ')} ${\n mismatchArgs.length === 1 ? 'is' : 'are'\n } not defined in your configuration!`,\n );\n}\n\nexport function createSuccessMessage(backend?: string) {\n log(\n `🎉 ${\n backend ? `${styleText('green', backend)} - ` : ''\n }Your OpenAPI spec has been converted into ready to use orval!`,\n );\n}\n\nexport type LogType = 'error' | 'warn' | 'info';\nexport type LogLevel = LogType | 'silent';\nexport interface Logger {\n info(msg: string, options?: LogOptions): void;\n warn(msg: string, options?: LogOptions): void;\n warnOnce(msg: string, options?: LogOptions): void;\n error(msg: string, options?: LogOptions): void;\n clearScreen(type: LogType): void;\n hasWarned: boolean;\n}\n\nexport interface LogOptions {\n clear?: boolean;\n timestamp?: boolean;\n}\n\nexport const LogLevels: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n};\n\nlet lastType: LogType | undefined;\nlet lastMsg: string | undefined;\nlet sameCount = 0;\n\nfunction clearScreen() {\n const repeatCount = process.stdout.rows - 2;\n const blank = repeatCount > 0 ? '\\n'.repeat(repeatCount) : '';\n console.log(blank);\n readline.cursorTo(process.stdout, 0, 0);\n readline.clearScreenDown(process.stdout);\n}\n\nexport interface LoggerOptions {\n prefix?: string;\n allowClearScreen?: boolean;\n}\n\nexport function createLogger(\n level: LogLevel = 'info',\n options: LoggerOptions = {},\n): Logger {\n const { prefix = '[vite]', allowClearScreen = true } = options;\n\n const thresh = LogLevels[level];\n const clear =\n allowClearScreen && process.stdout.isTTY && !process.env.CI\n ? clearScreen\n : () => {\n /* noop */\n };\n\n function output(type: LogType, msg: string, options: LogOptions = {}) {\n if (thresh >= LogLevels[type]) {\n const method = type === 'info' ? 'log' : type;\n const format = () => {\n if (options.timestamp) {\n const tag =\n type === 'info'\n ? styleText(['cyan', 'bold'], prefix)\n : type === 'warn'\n ? styleText(['yellow', 'bold'], prefix)\n : styleText(['red', 'bold'], prefix);\n return `${styleText('dim', new Date().toLocaleTimeString())} ${tag} ${msg}`;\n } else {\n return msg;\n }\n };\n if (type === lastType && msg === lastMsg) {\n sameCount++;\n clear();\n console[method](format(), styleText('yellow', `(x${sameCount + 1})`));\n } else {\n sameCount = 0;\n lastMsg = msg;\n lastType = type;\n if (options.clear) {\n clear();\n }\n console[method](format());\n }\n }\n }\n\n const warnedMessages = new Set<string>();\n\n const logger: Logger = {\n hasWarned: false,\n info(msg, opts) {\n output('info', msg, opts);\n },\n warn(msg, opts) {\n logger.hasWarned = true;\n output('warn', msg, opts);\n },\n warnOnce(msg, opts) {\n if (warnedMessages.has(msg)) return;\n logger.hasWarned = true;\n output('warn', msg, opts);\n warnedMessages.add(msg);\n },\n error(msg, opts) {\n logger.hasWarned = true;\n output('error', msg, opts);\n },\n clearScreen(type) {\n if (thresh >= LogLevels[type]) {\n clear();\n }\n },\n };\n\n return logger;\n}\n","import { isObject } from './assertion';\n\nexport function mergeDeep<T extends object, U extends object>(\n source: T,\n target: U,\n): T & U {\n if (!isObject(target) || !isObject(source)) {\n return source as T & U;\n }\n\n const acc = Object.assign({}, source) as Record<string, unknown>;\n for (const [key, value] of Object.entries(target)) {\n const sourceValue = acc[key];\n\n if (Array.isArray(sourceValue) && Array.isArray(value)) {\n acc[key] = [...(sourceValue as unknown[]), ...(value as unknown[])];\n } else if (isObject(sourceValue) && isObject(value)) {\n acc[key] = mergeDeep(sourceValue, value);\n } else {\n acc[key] = value;\n }\n }\n return acc as T & U;\n}\n","export function count(str = '', key: string) {\n if (!str) {\n return 0;\n }\n\n return (str.match(new RegExp(key, 'g')) ?? []).length;\n}\n","import basepath from 'node:path';\n\nimport { getExtension } from './extension';\n\nexport function toUnix(value: string): string {\n value = value.replaceAll('\\\\', '/');\n value = value.replaceAll(/(?<!^)\\/+/g, '/'); // deduplicate except leading for UNC paths\n return value;\n}\n\nexport function join(...args: string[]): string {\n return toUnix(basepath.join(...args.map((a) => toUnix(a))));\n}\n\n/**\n * Behaves exactly like `path.relative(from, to)`, but keeps the first meaningful \"./\"\n */\nexport function relativeSafe(from: string, to: string) {\n const normalizedRelativePath = toUnix(\n basepath.relative(toUnix(from), toUnix(to)),\n );\n const relativePath = normalizeSafe(`.${separator}${normalizedRelativePath}`);\n return relativePath;\n}\n\nexport function getSchemaFileName(path: string) {\n return path\n .replace(`.${getExtension(path)}`, '')\n .slice(path.lastIndexOf('/') + 1);\n}\n\nexport const separator = '/';\n\nexport function normalizeSafe(value: string) {\n let result;\n value = toUnix(value);\n result = toUnix(basepath.normalize(value));\n if (\n value.startsWith('./') &&\n !result.startsWith('./') &&\n !result.startsWith('..')\n ) {\n result = './' + result;\n } else if (value.startsWith('//') && !result.startsWith('//')) {\n result = value.startsWith('//./') ? '//.' + result : '/' + result;\n }\n return result;\n}\n\nexport function joinSafe(...values: string[]) {\n let result = toUnix(basepath.join(...values.map((v) => toUnix(v))));\n\n if (values.length > 0) {\n const firstValue = toUnix(values[0]);\n if (\n firstValue.startsWith('./') &&\n !result.startsWith('./') &&\n !result.startsWith('..')\n ) {\n result = './' + result;\n } else if (firstValue.startsWith('//') && !result.startsWith('//')) {\n result = firstValue.startsWith('//./') ? '//.' + result : '/' + result;\n }\n }\n return result;\n}\n\n/**\n * Given two absolute file paths, generates a valid ESM relative import path\n * from the 'importer' file to the 'exporter' file.\n *\n * @example\n * ```ts\n * getRelativeImportPath('/path/to/importer.ts', '/path/to/exporter.ts')\n * // => './exporter'\n * getRelativeImportPath('/path/to/importer.ts', '/path/to/sub/exporter.ts')\n * // => './sub/exporter'\n * getRelativeImportPath('/path/to/importer.ts', '/path/sibling/exporter.ts')\n * // => '../sibling/exporter'\n * ```\n *\n * This function handles path normalization, cross-platform separators, and\n * ensures the path is a valid ESM relative specifier (e.g., starts with './').\n *\n * @param importerFilePath - The absolute path of the file that will contain the import statement.\n * @param exporterFilePath - The absolute path of the file being imported.\n * @param [includeFileExtension=false] - Whether the import path should include the file extension, defaults to false.\n * @returns The relative import path string.\n */\nexport function getRelativeImportPath(\n importerFilePath: string,\n exporterFilePath: string,\n includeFileExtension = false,\n): string {\n if (!basepath.isAbsolute(importerFilePath))\n throw new Error(\n `'importerFilePath' is not an absolute path. \"${importerFilePath}\"`,\n );\n if (!basepath.isAbsolute(exporterFilePath))\n throw new Error(\n `'exporterFilePath' is not an absolute path. \"${exporterFilePath}\"`,\n );\n\n // Get the directory of the importer file.\n const importerDir = basepath.dirname(importerFilePath);\n\n // Calculate the relative path from the importer's directory to the exporter file.\n const relativePath = basepath.relative(importerDir, exporterFilePath);\n\n // Convert to posix path\n let posixPath = basepath.posix.join(...relativePath.split(basepath.sep));\n\n // Ensure the path starts with './' for same-directory imports.\n // A relative specifier must start with './' or '../'.\n if (!posixPath.startsWith('./') && !posixPath.startsWith('../')) {\n posixPath = `./${posixPath}`;\n }\n\n if (!includeFileExtension) {\n const ext = basepath.extname(posixPath);\n if (ext && posixPath.endsWith(ext)) {\n posixPath = posixPath.slice(0, -ext.length);\n }\n }\n\n return posixPath;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport type { PackageJson } from '../types';\n\nexport function resolveInstalledVersion(\n packageName: string,\n fromDir: string,\n): string | undefined {\n try {\n const require = createRequire(path.join(fromDir, 'noop.js'));\n try {\n const pkg = require(`${packageName}/package.json`) as {\n version?: string;\n };\n return pkg.version;\n } catch (directError: unknown) {\n if (\n directError instanceof Error &&\n 'code' in directError &&\n (directError as NodeJS.ErrnoException).code ===\n 'ERR_PACKAGE_PATH_NOT_EXPORTED'\n ) {\n const entryPath = require.resolve(packageName);\n let dir = path.dirname(entryPath);\n while (dir !== path.parse(dir).root) {\n const pkgPath = path.join(dir, 'package.json');\n if (existsSync(pkgPath)) {\n const pkgData = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n name?: string;\n version?: string;\n };\n if (pkgData.name === packageName) {\n return pkgData.version;\n }\n }\n dir = path.dirname(dir);\n }\n return undefined;\n }\n throw directError;\n }\n } catch {\n return undefined;\n }\n}\n\nexport function resolveInstalledVersions(\n packageJson: PackageJson,\n fromDir: string,\n): Record<string, string> {\n const resolved: Record<string, string> = {};\n const allDeps = new Set([\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.devDependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ]);\n for (const pkgName of allDeps) {\n const version = resolveInstalledVersion(pkgName, fromDir);\n if (version) {\n resolved[pkgName] = version;\n }\n }\n return resolved;\n}\n","export const sortByPriority = <T>(\n arr: (T & { default?: unknown; required?: boolean })[],\n) =>\n arr.toSorted((a, b) => {\n if (a.default) {\n return 1;\n }\n\n if (b.default) {\n return -1;\n }\n\n if (a.required && b.required) {\n return 0;\n }\n\n if (a.required) {\n return -1;\n }\n\n if (b.required) {\n return 1;\n }\n return 0;\n });\n","import { keyword } from 'esutils';\n\nimport {\n isBoolean,\n isFunction,\n isNumber,\n isObject,\n isString,\n} from './assertion';\n\n/**\n * Converts data to a string representation suitable for code generation.\n * Handles strings, numbers, booleans, functions, arrays, and objects.\n *\n * @param data - The data to stringify. Can be a string, array, object, number, boolean, function, null, or undefined.\n * @returns A string representation of the data, `null` for null, or undefined if data is undefined.\n * @example\n * stringify('hello') // returns \"'hello'\"\n * stringify(42) // returns \"42\"\n * stringify([1, 2, 3]) // returns \"[1, 2, 3]\"\n * stringify({ a: 1, b: 'test' }) // returns \"{ a: 1, b: 'test', }\"\n */\nexport function stringify(data?: unknown): string | undefined {\n if (data === undefined) {\n return;\n }\n\n if (data === null) {\n return 'null';\n }\n\n if (isString(data)) {\n return `'${data.replaceAll(\"'\", String.raw`\\'`)}'`;\n }\n\n if (isNumber(data) || isBoolean(data) || isFunction(data)) {\n return String(data);\n }\n\n if (Array.isArray(data)) {\n return `[${data.map((item: unknown) => stringify(item as string | unknown[] | Record<string, unknown>)).join(', ')}]`;\n }\n\n const entries = Object.entries(data);\n let result = '';\n for (const [index, [key, value]] of entries.entries()) {\n const strValue = stringify(\n value as string | unknown[] | Record<string, unknown>,\n );\n if (entries.length === 1) {\n result = `{ ${key}: ${strValue}, }`;\n } else if (!index) {\n result = `{ ${key}: ${strValue}, `;\n } else if (entries.length - 1 === index) {\n result += `${key}: ${strValue}, }`;\n } else {\n result += `${key}: ${strValue}, `;\n }\n }\n return result;\n}\n\n/**\n * Sanitizes a string value by removing or replacing special characters and ensuring\n * it conforms to JavaScript identifier naming rules if needed.\n *\n * @param value - The string value to sanitize.\n * @param options - Configuration options for sanitization:\n * - `whitespace` - Replacement string for whitespace characters, or `true` to keep them.\n * - `underscore` - Replacement string for underscores, or `true` to keep them.\n * - `dot` - Replacement string for dots, or `true` to keep them.\n * - `dash` - Replacement string for dashes, or `true` to keep them.\n * - `es5keyword` - If true, prefixes the value with underscore if it's an ES5 keyword.\n * - `es5IdentifierName` - If true, ensures the value is a valid ES5 identifier name.\n * - `special` - If true, preserves special characters that would otherwise be removed.\n * @returns The sanitized string value.\n * @example\n * sanitize('hello-world', { dash: '_' }) // returns \"hello_world\"\n * sanitize('class', { es5keyword: true }) // returns \"_class\"\n * sanitize('123abc', { es5IdentifierName: true }) // returns \"N123abc\"\n */\nexport function sanitize(\n value: string,\n options?: {\n whitespace?: string | true;\n underscore?: string | true;\n dot?: string | true;\n dash?: string | true;\n es5keyword?: boolean;\n es5IdentifierName?: boolean;\n special?: boolean;\n },\n) {\n const {\n whitespace = '',\n underscore = '',\n dot = '',\n dash = '',\n es5keyword = false,\n es5IdentifierName = false,\n special = false,\n } = options ?? {};\n let newValue = value;\n\n if (!special) {\n newValue = newValue.replaceAll(/[!\"`'#%&,:;<>=@{}~$()*+/\\\\?[\\]^|]/g, '');\n }\n\n if (whitespace !== true) {\n newValue = newValue.replaceAll(/[\\s]/g, whitespace);\n }\n\n if (underscore !== true) {\n newValue = newValue.replaceAll(/['_']/g, underscore);\n }\n\n if (dot !== true) {\n newValue = newValue.replaceAll(/[.]/g, dot);\n }\n\n if (dash !== true) {\n newValue = newValue.replaceAll(/[-]/g, dash);\n }\n\n if (es5keyword) {\n newValue = keyword.isKeywordES5(newValue, true) ? `_${newValue}` : newValue;\n }\n\n if (es5IdentifierName) {\n if (/^[0-9]/.test(newValue)) {\n newValue = `N${newValue}`;\n } else {\n newValue = keyword.isIdentifierNameES5(newValue)\n ? newValue\n : `_${newValue}`;\n }\n }\n\n return newValue;\n}\n\n/**\n * Converts an array of objects to a comma-separated string representation.\n * Optionally extracts a nested property from each object using a dot-notation path.\n *\n * @param props - Array of objects to convert to string.\n * @param path - Optional dot-notation path to extract a property from each object (e.g., \"user.name\").\n * @returns A comma-separated string of values, with each value on a new line indented.\n * @example\n * toObjectString([{ name: 'John' }, { name: 'Jane' }], 'name')\n * // returns \"John,\\n Jane,\"\n * toObjectString(['a', 'b', 'c'])\n * // returns \"a,\\n b,\\n c,\"\n */\nexport function toObjectString<T>(props: T[], path?: keyof T) {\n if (props.length === 0) {\n return '';\n }\n\n const arrayOfString = isString(path)\n ? props.map((prop) => {\n let obj: unknown = prop;\n for (const key of path.split('.')) {\n obj =\n obj && (isObject(obj) || Array.isArray(obj))\n ? (obj as Record<string, unknown>)[key]\n : undefined;\n }\n return obj as string;\n })\n : props;\n\n return arrayOfString.join(',\\n ') + ',';\n}\n\nconst NUMBERS = {\n '0': 'zero',\n '1': 'one',\n '2': 'two',\n '3': 'three',\n '4': 'four',\n '5': 'five',\n '6': 'six',\n '7': 'seven',\n '8': 'eight',\n '9': 'nine',\n};\n\n/**\n * Converts a number to its word representation by translating each digit to its word form.\n *\n * @param num - The number to convert to words.\n * @returns A string containing the word representation of each digit concatenated together.\n * @example\n * getNumberWord(123) // returns \"onetwothree\"\n * getNumberWord(42) // returns \"fourtwo\"\n */\nexport function getNumberWord(num: number) {\n // eslint-disable-next-line @typescript-eslint/no-misused-spread -- digits 0-9 only, no unicode concerns\n const arrayOfNumber = [...num.toString()] as (keyof typeof NUMBERS)[];\n return arrayOfNumber.reduce((acc, n) => acc + NUMBERS[n], '');\n}\n\n/**\n * Escapes a specific character in a string by prefixing all of its occurrences with a backslash.\n *\n * @param str - The string to escape, or null.\n * @param char - The character to escape. Defaults to single quote (').\n * @returns The escaped string, or null if the input is null.\n * @example\n * escape(\"don't\") // returns \"don\\'t\"\n * escape(\"it's John's\") // returns \"it\\'s John\\'s\"\n * escape('say \"hello\"', '\"') // returns 'say \\\\\"hello\\\\\"'\n * escape(\"a'''b\", \"'\") // returns \"a\\'\\'\\'b\"\n */\nexport function escape(str: string | null, char = \"'\") {\n return str?.replaceAll(char, `\\\\${char}`);\n}\n\n/**\n * Escapes regular expression metacharacters in a string so it can be safely\n * embedded inside a RegExp pattern.\n *\n * @param value - The raw string value to escape for regex usage.\n * @returns The escaped string.\n * @example\n * escapeRegExp('foo$bar') // returns 'foo\\\\$bar'\n */\nexport function escapeRegExp(value: string) {\n return value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`);\n}\n\n/**\n * Escape all characters not included in SingleStringCharacters and\n * DoubleStringCharacters on\n * http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4\n *\n * Based on https://github.com/joliss/js-string-escape/blob/master/index.js\n *\n * @param input String to escape\n */\nexport function jsStringEscape(input: string) {\n return input.replaceAll(/[\"'\\\\\\n\\r\\u2028\\u2029/*]/g, (character) => {\n switch (character) {\n case '\"':\n case \"'\":\n case '\\\\':\n case '/':\n case '*': {\n return '\\\\' + character;\n }\n // Four possible LineTerminator characters need to be escaped:\n case '\\n': {\n return String.raw`\\n`;\n }\n case '\\r': {\n return String.raw`\\r`;\n }\n case '\\u2028': {\n return String.raw`\\u2028`;\n }\n case '\\u2029': {\n return String.raw`\\u2029`;\n }\n default: {\n return '';\n }\n }\n });\n}\n\n/**\n * Deduplicates a TypeScript union type string.\n * Handles types like \"A | B | B\" → \"A | B\" and \"null | null\" → \"null\".\n * Only splits on top-level | (not inside {} () [] <> or string literals).\n */\nexport function dedupeUnionType(unionType: string): string {\n const parts: string[] = [];\n let current = '';\n let depth = 0;\n let quote = ''; // current open quote char, or '' if outside string\n let escaped = false; // true if previous char was unescaped \\ inside string\n\n for (const c of unionType) {\n if (!escaped && (c === \"'\" || c === '\"')) {\n if (!quote) quote = c;\n else if (quote === c) quote = '';\n }\n\n if (!quote) {\n if ('{([<'.includes(c)) depth++;\n if ('})]>'.includes(c)) depth--;\n if (c === '|' && depth === 0) {\n parts.push(current.trim());\n current = '';\n continue;\n }\n }\n current += c;\n escaped = !!quote && !escaped && c === '\\\\';\n }\n if (current.trim()) parts.push(current.trim());\n\n return [...new Set(parts)].join(' | ');\n}\n","import type { Tsconfig } from '../types';\n\nexport function isSyntheticDefaultImportsAllow(config?: Tsconfig) {\n if (!config) {\n return true;\n }\n\n return !!(\n config.compilerOptions?.allowSyntheticDefaultImports ??\n config.compilerOptions?.esModuleInterop\n );\n}\n\nconst NODE_NEXT_MODULES = new Set(['nodenext', 'node16']);\n\nconst NODE_NEXT_EXTENSION_MAP: readonly (readonly [string, string])[] = [\n ['.tsx', '.jsx'],\n ['.mts', '.mjs'],\n ['.cts', '.cjs'],\n ['.ts', '.js'],\n];\n\nexport function getImportExtension(\n fileExtension: string,\n tsconfig?: Tsconfig,\n): string {\n const compilerOptions = tsconfig?.compilerOptions;\n\n if (compilerOptions?.allowImportingTsExtensions) {\n return fileExtension;\n }\n\n const module = compilerOptions?.module?.toLowerCase();\n const moduleResolution = compilerOptions?.moduleResolution?.toLowerCase();\n if (\n (module && NODE_NEXT_MODULES.has(module)) ||\n (moduleResolution && NODE_NEXT_MODULES.has(moduleResolution))\n ) {\n for (const [from, to] of NODE_NEXT_EXTENSION_MAP) {\n if (fileExtension.endsWith(from)) {\n return `${fileExtension.slice(0, -from.length)}${to}`;\n }\n }\n return fileExtension;\n }\n\n return fileExtension.replace(/\\.ts$/, '') || '';\n}\n","import { keyword } from 'esutils';\n\nimport {\n EnumGeneration,\n NamingConvention,\n type OpenApiSchemaObject,\n} from '../types';\nimport {\n conventionName,\n escape,\n isNumeric,\n isString,\n jsStringEscape,\n sanitize,\n} from '../utils';\n\n/** Bridge type for enum values from AnyOtherAttribute-infected schema extensions */\ntype SchemaEnumValue = string | number | boolean | null;\n\n/**\n * Map of special characters to semantic word replacements.\n *\n * Applied before naming convention transforms (PascalCase, camelCase, …) so\n * that characters which would otherwise be stripped still contribute a unique\n * segment to the generated key. Without this, values like \"created_at\" and\n * \"-created_at\" both PascalCase to \"CreatedAt\", silently overwriting one\n * another in the generated const/enum object.\n *\n * Only characters that appear as leading/trailing modifiers in real-world\n * OpenAPI enums are mapped — the list is intentionally conservative to avoid\n * changing output for schemas that don't hit collisions.\n */\nconst ENUM_SPECIAL_CHARACTER_MAP: Record<string, string> = {\n '-': 'minus',\n '+': 'plus',\n};\n\n/**\n * Replace special characters with semantic words (plus an underscore separator)\n * so that naming convention transforms (PascalCase, etc.) produce unique keys.\n *\n * The trailing underscore acts as a word boundary so that PascalCase treats the\n * replacement as a separate word: \"-created_at\" → \"minus_created_at\" → \"MinusCreatedAt\".\n */\nfunction replaceSpecialCharacters(key: string): string {\n let result = '';\n for (const char of key) {\n const replacement = ENUM_SPECIAL_CHARACTER_MAP[char];\n result += replacement ? replacement + '_' : char;\n }\n return result;\n}\n\nexport function getEnumNames(schemaObject: OpenApiSchemaObject | undefined) {\n const names = (schemaObject?.['x-enumNames'] ??\n schemaObject?.['x-enumnames'] ??\n schemaObject?.['x-enum-varnames']) as\n | string[]\n | Record<string, string>\n | undefined;\n\n if (!names) return;\n\n if (Array.isArray(names)) {\n return names.map((name: string) => jsStringEscape(name));\n }\n\n // Object/Map format: keys correspond to enum values, values are the names.\n // Convert to an array ordered by the schema's enum values.\n if (typeof names === 'object') {\n const enumValues = (schemaObject?.enum ?? []) as SchemaEnumValue[];\n return enumValues.map((enumVal) => {\n const key = String(enumVal);\n return key in names ? jsStringEscape(names[key]) : undefined;\n });\n }\n\n return;\n}\n\nexport function getEnumDescriptions(\n schemaObject: OpenApiSchemaObject | undefined,\n) {\n const descriptions = (schemaObject?.['x-enumDescriptions'] ??\n schemaObject?.['x-enumdescriptions'] ??\n schemaObject?.['x-enum-descriptions']) as\n | string[]\n | Record<string, string>\n | undefined;\n\n if (!descriptions) return;\n\n if (Array.isArray(descriptions)) {\n return descriptions.map((description: string) =>\n jsStringEscape(description),\n );\n }\n\n // Object/Map format: keys correspond to enum values, values are the descriptions.\n // Convert to an array ordered by the schema's enum values.\n if (typeof descriptions === 'object') {\n const enumValues = (schemaObject?.enum ?? []) as SchemaEnumValue[];\n return enumValues.map((enumVal) => {\n const key = String(enumVal);\n return key in descriptions\n ? jsStringEscape(descriptions[key])\n : undefined;\n });\n }\n\n return;\n}\n\nexport function getEnum(\n value: string,\n enumName: string,\n names: (string | undefined)[] | undefined,\n enumGenerationType: EnumGeneration,\n descriptions?: (string | undefined)[],\n enumNamingConvention?: NamingConvention,\n) {\n if (enumGenerationType === EnumGeneration.CONST)\n return getTypeConstEnum(\n value,\n enumName,\n names,\n descriptions,\n enumNamingConvention,\n );\n if (enumGenerationType === EnumGeneration.ENUM)\n return getNativeEnum(value, enumName, names, enumNamingConvention);\n return getUnion(value, enumName);\n}\n\nconst getTypeConstEnum = (\n value: string,\n enumName: string,\n names?: (string | undefined)[],\n descriptions?: (string | undefined)[],\n enumNamingConvention?: NamingConvention,\n) => {\n let enumValue = `export type ${enumName} = typeof ${enumName}[keyof typeof ${enumName}]`;\n\n if (value.endsWith(' | null')) {\n value = value.replace(' | null', '');\n enumValue += ' | null';\n }\n\n enumValue += ';\\n';\n\n const implementation = getEnumImplementation(\n value,\n names,\n descriptions,\n enumNamingConvention,\n );\n\n enumValue += '\\n\\n';\n\n enumValue += `export const ${enumName} = {\\n${implementation}} as const;\\n`;\n\n return enumValue;\n};\n\n/**\n * Derive the object/enum key for a single enum value.\n *\n * Handles numeric prefixes, sanitization, and optional naming convention\n * transforms. When `disambiguate` is true, special characters (-/+) are\n * replaced with semantic words before the convention transform to prevent\n * key collisions.\n */\nfunction deriveEnumKey(\n val: string,\n enumNamingConvention?: NamingConvention,\n disambiguate = false,\n): string {\n let key = val.startsWith(\"'\") ? val.slice(1, -1) : val;\n\n if (isNumeric(key)) {\n key = toNumberKey(key);\n }\n\n if (key.length > 1) {\n key = sanitize(key, {\n whitespace: '_',\n underscore: true,\n dash: true,\n special: true,\n });\n }\n\n if (enumNamingConvention) {\n if (disambiguate) {\n key = replaceSpecialCharacters(key);\n }\n key = conventionName(key, enumNamingConvention);\n }\n\n return key;\n}\n\nexport function getEnumImplementation(\n value: string,\n names?: (string | undefined)[],\n descriptions?: (string | undefined)[],\n enumNamingConvention?: NamingConvention,\n) {\n // empty enum or null-only enum\n if (value === '') return '';\n\n const uniqueValues = [...new Set(value.split(' | '))];\n\n // Check whether the naming convention produces duplicate keys.\n // Only apply special-character disambiguation when it does,\n // so that existing output is preserved for non-colliding enums.\n const disambiguate =\n !!enumNamingConvention &&\n new Set(uniqueValues.map((v) => deriveEnumKey(v, enumNamingConvention)))\n .size < uniqueValues.length;\n\n let result = '';\n for (const [index, val] of uniqueValues.entries()) {\n const name = names?.[index];\n const description = descriptions?.[index];\n const comment = description ? ` /** ${description} */\\n` : '';\n\n if (name) {\n result +=\n comment +\n ` ${keyword.isIdentifierNameES5(name) ? name : `'${name}'`}: ${val},\\n`;\n continue;\n }\n\n const key = deriveEnumKey(val, enumNamingConvention, disambiguate);\n\n result +=\n comment +\n ` ${keyword.isIdentifierNameES5(key) ? key : `'${key}'`}: ${val},\\n`;\n }\n return result;\n}\n\nconst getNativeEnum = (\n value: string,\n enumName: string,\n names?: (string | undefined)[],\n enumNamingConvention?: NamingConvention,\n) => {\n const enumItems = getNativeEnumItems(value, names, enumNamingConvention);\n const enumValue = `export enum ${enumName} {\\n${enumItems}\\n}`;\n\n return enumValue;\n};\n\nconst getNativeEnumItems = (\n value: string,\n names?: (string | undefined)[],\n enumNamingConvention?: NamingConvention,\n) => {\n if (value === '') return '';\n\n const uniqueValues = [...new Set(value.split(' | '))];\n\n const disambiguate =\n !!enumNamingConvention &&\n new Set(uniqueValues.map((v) => deriveEnumKey(v, enumNamingConvention)))\n .size < uniqueValues.length;\n\n let result = '';\n for (const [index, val] of uniqueValues.entries()) {\n const name = names?.[index];\n if (name) {\n result += ` ${keyword.isIdentifierNameES5(name) ? name : `'${name}'`}= ${val},\\n`;\n continue;\n }\n\n const key = deriveEnumKey(val, enumNamingConvention, disambiguate);\n\n result += ` ${keyword.isIdentifierNameES5(key) ? key : `'${key}'`}= ${val},\\n`;\n }\n return result;\n};\n\nconst toNumberKey = (value: string) => {\n if (value.startsWith('-')) {\n return `NUMBER_MINUS_${value.slice(1)}`;\n }\n if (value.startsWith('+')) {\n return `NUMBER_PLUS_${value.slice(1)}`;\n }\n return `NUMBER_${value}`;\n};\n\nconst getUnion = (value: string, enumName: string) => {\n return `export type ${enumName} = ${value};`;\n};\n\ninterface CombinedEnumInput {\n value: string;\n isRef: boolean;\n schema: OpenApiSchemaObject | undefined;\n}\n\ninterface CombinedEnumValue {\n value: string;\n valueImports: string[];\n hasNull: boolean;\n}\n\nexport function getEnumUnionFromSchema(\n schema: OpenApiSchemaObject | undefined,\n) {\n if (!schema?.enum) return '';\n const schemaEnum = schema.enum as SchemaEnumValue[];\n return schemaEnum\n .filter((val): val is Exclude<SchemaEnumValue, null> => val !== null)\n .map((val) => (isString(val) ? `'${escape(val)}'` : String(val)))\n .join(' | ');\n}\n\nconst stripNullUnion = (value: string) =>\n value.replaceAll(/\\s*\\|\\s*null/g, '').trim();\n\nconst isSpreadableEnumRef = (\n schema: OpenApiSchemaObject | undefined,\n refName: string,\n) => {\n if (!schema?.enum || !refName) return false;\n if (!getEnumUnionFromSchema(schema)) return false;\n const type = schema.type as string | string[] | undefined;\n if (type === 'boolean' || (Array.isArray(type) && type.includes('boolean'))) {\n return false;\n }\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(refName);\n};\n\nconst buildInlineEnum = (\n schema: OpenApiSchemaObject | undefined,\n enumValue?: string,\n) => {\n const names = getEnumNames(schema);\n const descriptions = getEnumDescriptions(schema);\n const unionValue = enumValue ?? getEnumUnionFromSchema(schema);\n return getEnumImplementation(unionValue, names, descriptions);\n};\n\nexport function getCombinedEnumValue(\n inputs: CombinedEnumInput[],\n): CombinedEnumValue {\n const valueImports: string[] = [];\n const hasNull = inputs.some((input) => {\n if (input.value.includes('| null')) return true;\n const schema = input.schema;\n if (!schema) return false;\n if (schema.nullable === true) return true;\n if (Array.isArray(schema.type) && schema.type.includes('null')) return true;\n const schemaEnum = schema.enum as SchemaEnumValue[] | undefined;\n // eslint-disable-next-line unicorn/no-null -- OpenAPI enum values include literal null\n return schemaEnum?.includes(null) ?? false;\n });\n\n const addValueImport = (name: string) => {\n if (!valueImports.includes(name)) {\n valueImports.push(name);\n }\n };\n\n if (inputs.length === 1) {\n const input = inputs[0];\n if (input.isRef) {\n const refName = stripNullUnion(input.value);\n if (isSpreadableEnumRef(input.schema, refName)) {\n addValueImport(refName);\n return { value: refName, valueImports, hasNull };\n }\n return {\n value: `{${buildInlineEnum(input.schema)}} as const`,\n valueImports,\n hasNull,\n };\n }\n\n return {\n value: `{${buildInlineEnum(input.schema, stripNullUnion(input.value))}} as const`,\n valueImports,\n hasNull,\n };\n }\n\n const enums = inputs\n .map((input) => {\n if (input.isRef) {\n const refName = stripNullUnion(input.value);\n if (isSpreadableEnumRef(input.schema, refName)) {\n addValueImport(refName);\n return `...${refName},`;\n }\n return buildInlineEnum(input.schema);\n }\n\n return buildInlineEnum(input.schema, stripNullUnion(input.value));\n })\n .join('');\n\n return { value: `{${enums}} as const`, valueImports, hasNull };\n}\n","import type { ContextSpec, NormalizedOverrideOutput } from '../types';\nimport { pascal, sanitize, upath } from '../utils';\n\n/**\n * `$ref`s targeting these sections under `#/components/...` are emitted as\n * named TypeScript imports (e.g. `import type { Pet } from './model'`).\n * Refs to any other location — for example `#/paths/.../schema` produced by\n * JSON-Schema-Ref-Parser `bundle()` — have no corresponding `export type`\n * and must be inlined by the resolver. See issue #398.\n */\nexport const NAMED_COMPONENT_SECTIONS = [\n 'schemas',\n 'responses',\n 'parameters',\n 'requestBodies',\n] as const;\n\ntype RefComponent = (typeof NAMED_COMPONENT_SECTIONS)[number];\n\nexport const RefComponentSuffix: Record<RefComponent, string> = {\n schemas: '',\n responses: 'Response',\n parameters: 'Parameter',\n requestBodies: 'Body',\n};\n\nconst COMPONENT_REF_PATTERN = new RegExp(\n String.raw`^#\\/components\\/(${NAMED_COMPONENT_SECTIONS.join('|')})\\/[^/]+$`,\n);\n\n/**\n * True iff `ref` targets a named slot eligible for emission as a TypeScript\n * import. Used by `resolveValue` to decide between named import vs inlining\n * the resolved schema.\n */\nexport function isComponentRef(ref: string): boolean {\n return COMPONENT_REF_PATTERN.test(ref);\n}\n\nconst TILDE_1 = /~1/g;\nconst TILDE_0 = /~0/g;\n\nexport interface RefInfo {\n name: string;\n originalName: string;\n refPaths?: string[];\n}\n/**\n * Return the output type from the $ref\n *\n * @param $ref\n */\nexport function getRefInfo($ref: string, context: ContextSpec): RefInfo {\n const [pathname, ref] = $ref.split('#');\n\n const refPaths = ref\n .slice(1)\n .split('/')\n .map((part) =>\n decodeURIComponent(part)\n .replaceAll(TILDE_1, '/')\n .replaceAll(TILDE_0, '~'),\n );\n\n const getOverrideSuffix = (\n override: NormalizedOverrideOutput,\n paths: string[],\n ) => {\n const firstLevel = override[paths[0] as keyof NormalizedOverrideOutput];\n if (!firstLevel) return '';\n\n const secondLevel = (\n firstLevel as Record<string, { suffix?: string } | undefined>\n )[paths[1]];\n return secondLevel?.suffix ?? '';\n };\n\n const suffix = getOverrideSuffix(context.output.override, refPaths);\n\n const originalName = ref\n ? (refPaths.at(-1) ?? '')\n : upath.getSchemaFileName(pathname);\n\n if (!pathname) {\n return {\n name: sanitize(pascal(originalName) + suffix, {\n es5keyword: true,\n es5IdentifierName: true,\n underscore: true,\n dash: true,\n }),\n originalName,\n refPaths,\n };\n }\n\n return {\n name: sanitize(pascal(originalName) + suffix, {\n es5keyword: true,\n es5IdentifierName: true,\n underscore: true,\n dash: true,\n }),\n originalName,\n refPaths,\n };\n}\n","import { isDereferenced } from '@scalar/openapi-types/helpers';\nimport { prop } from 'remeda';\n\nimport { getRefInfo, type RefInfo } from '../getters/ref';\nimport type {\n ContextSpec,\n GeneratorImport,\n OpenApiComponentsObject,\n OpenApiExampleObject,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n} from '../types';\nimport { isObject, isReference } from '../utils';\n\ntype Example = OpenApiExampleObject | OpenApiReferenceObject;\ntype ResolvedExample = unknown;\ntype Examples =\n | Example[]\n | Record<string, Example>\n | ResolvedExample[]\n | Record<string, ResolvedExample>\n | undefined;\n\ninterface WithOptionalExamples {\n examples?: Examples;\n}\n\nconst REF_NOT_FOUND_PREFIX = 'Oops... 🍻. Ref not found';\n\n/* eslint-disable @typescript-eslint/no-unnecessary-type-parameters -- TSchema constrains return type for callers (e.g. resolveRef<OpenApiExampleObject>) */\n\n/**\n * Recursively resolves a `$ref` in an OpenAPI document, following\n * nested schema refs and collecting imports along the way.\n *\n * Handles OpenAPI 3.0 `nullable` and 3.1 type-array hints on direct refs.\n *\n * @see https://spec.openapis.org/oas/v3.0.3#reference-object\n * @see https://spec.openapis.org/oas/v3.1.0#reference-object\n */\nexport function resolveRef<TSchema extends object = OpenApiComponentsObject>(\n schema: OpenApiComponentsObject | OpenApiReferenceObject,\n context: ContextSpec,\n imports: GeneratorImport[] = [],\n): {\n schema: TSchema;\n imports: GeneratorImport[];\n} {\n const refPath = '$ref' in schema ? schema.$ref : undefined;\n const nestedSchema =\n 'schema' in schema ? (schema as { schema?: unknown }).schema : undefined;\n\n // the schema is referring to another object\n if (\n isObject(nestedSchema) &&\n isReference(nestedSchema) &&\n typeof nestedSchema.$ref === 'string'\n ) {\n const resolvedRef = resolveRef<TSchema>(nestedSchema, context, imports);\n\n if ('examples' in schema) {\n const schemaWithExamples = schema as WithOptionalExamples;\n schemaWithExamples.examples = resolveExampleRefs(\n schemaWithExamples.examples,\n context,\n );\n }\n\n if ('examples' in resolvedRef.schema) {\n const resolvedWithExamples = resolvedRef.schema as WithOptionalExamples;\n resolvedWithExamples.examples = resolveExampleRefs(\n resolvedWithExamples.examples,\n context,\n );\n }\n\n return {\n schema: {\n ...schema,\n schema: resolvedRef.schema,\n } as TSchema,\n imports: resolvedRef.imports,\n };\n }\n\n if (isDereferenced(schema)) {\n if ('examples' in schema) {\n const schemaWithExamples = schema as WithOptionalExamples;\n schemaWithExamples.examples = resolveExampleRefs(\n schemaWithExamples.examples,\n context,\n );\n }\n return { schema: schema as TSchema, imports };\n }\n\n if (!refPath) {\n throw new Error(`${REF_NOT_FOUND_PREFIX}: missing $ref`);\n }\n\n const {\n currentSchema,\n refInfo: { name, originalName },\n } = getSchema(schema, context);\n\n if (!currentSchema) {\n throw new Error(`${REF_NOT_FOUND_PREFIX}: ${refPath}`);\n }\n\n return resolveRef<TSchema>(currentSchema, { ...context }, [\n ...imports,\n { name, schemaName: originalName },\n ]);\n}\n\n/**\n * Looks up a schema by its `$ref` path in the spec, applying suffix resolution.\n *\n * Preserves OpenAPI 3.0 `nullable` and 3.1 type-array (`[\"object\", \"null\"]`)\n * hints from the referencing schema onto the resolved target.\n *\n * @see https://spec.openapis.org/oas/v3.0.3#fixed-fields-18 (nullable)\n * @see https://spec.openapis.org/oas/v3.1.0#schema-object (type as array)\n */\nfunction getSchema<TSchema extends object = OpenApiComponentsObject>(\n schema: OpenApiReferenceObject,\n context: ContextSpec,\n): {\n refInfo: RefInfo;\n currentSchema: TSchema | undefined;\n} {\n if (!schema.$ref) {\n throw new Error(`${REF_NOT_FOUND_PREFIX}: missing $ref`);\n }\n\n const refInfo = getRefInfo(schema.$ref, context);\n\n const { refPaths } = refInfo;\n\n const schemaByRefPaths:\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | undefined = Array.isArray(refPaths)\n ? (prop(\n context.spec,\n // @ts-expect-error: [ts2556] refPaths are not guaranteed to be valid keys of the spec\n ...refPaths,\n ) as OpenApiSchemaObject | OpenApiReferenceObject | undefined)\n : undefined;\n\n if (isObject(schemaByRefPaths) && isReference(schemaByRefPaths)) {\n return getSchema(schemaByRefPaths, context);\n }\n\n let currentSchema: OpenApiSchemaObject | OpenApiReferenceObject | undefined =\n schemaByRefPaths;\n\n // Handle OpenAPI 3.0 nullable property\n // Bridge assertion: schema properties are `any` due to AnyOtherAttribute\n if (isObject(currentSchema) && 'nullable' in schema) {\n const nullable = schema.nullable as boolean | undefined;\n const currentSchemaObject = currentSchema as Record<string, unknown>;\n currentSchema = {\n ...currentSchemaObject,\n nullable,\n } as OpenApiSchemaObject | OpenApiReferenceObject;\n }\n\n // Handle OpenAPI 3.1 type array (e.g., type: [\"object\", \"null\"])\n // This preserves nullable information when using direct $ref with types array\n if (\n isObject(currentSchema) &&\n 'type' in schema &&\n Array.isArray(schema.type)\n ) {\n const type = schema.type as string[];\n const currentSchemaObject = currentSchema as Record<string, unknown>;\n currentSchema = {\n ...currentSchemaObject,\n type,\n } as OpenApiSchemaObject | OpenApiReferenceObject;\n }\n\n return {\n currentSchema: currentSchema as TSchema | undefined,\n refInfo,\n };\n}\n\n/* eslint-enable @typescript-eslint/no-unnecessary-type-parameters */\n\n/** Recursively resolves `$ref` entries in an examples array or record. */\nexport function resolveExampleRefs(\n examples: Examples,\n context: ContextSpec,\n): ResolvedExample[] | Record<string, ResolvedExample> | undefined {\n if (!examples) {\n return undefined;\n }\n return Array.isArray(examples)\n ? examples.map((example) => {\n if (isObject(example) && isReference(example)) {\n const { schema }: { schema: OpenApiExampleObject } = resolveRef(\n example,\n context,\n );\n // Bridge assertion: ExampleObject.value is typed as `any`\n return schema.value as ResolvedExample;\n }\n return example;\n })\n : (() => {\n const result: Record<string, ResolvedExample> = {};\n for (const [key, example] of Object.entries(examples)) {\n // Bridge assertion: ExampleObject.value is typed as `any`\n result[key] =\n isObject(example) && isReference(example)\n ? ((\n resolveRef(example, context) as {\n schema: OpenApiExampleObject;\n }\n ).schema.value as ResolvedExample)\n : example;\n }\n return result;\n })();\n}\n","import { getScalar } from '../getters';\nimport type { FormDataContext } from '../getters/object';\nimport { isComponentRef } from '../getters/ref';\nimport type {\n ContextSpec,\n GeneratorImport,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n ResolverValue,\n SchemaType,\n} from '../types';\nimport { isReference } from '../utils';\nimport { resolveRef } from './ref';\n\ninterface ResolveValueOptions {\n schema: OpenApiSchemaObject | OpenApiReferenceObject;\n name?: string;\n context: ContextSpec;\n formDataContext?: FormDataContext;\n}\n\nexport function resolveValue({\n schema,\n name,\n context,\n formDataContext,\n}: ResolveValueOptions): ResolverValue {\n if (isReference(schema)) {\n const refValue = schema.$ref;\n const {\n schema: schemaObject,\n imports,\n }: {\n schema: OpenApiSchemaObject;\n imports: GeneratorImport[];\n } = resolveRef(schema, context);\n\n // Refs that don't target a named component slot (e.g. bundler-emitted\n // `#/paths/.../schema`) have no corresponding `export type`, so emitting\n // a named import would dangle. Inline the resolved schema instead.\n // See issue #398.\n if (refValue && !isComponentRef(refValue)) {\n // Inlining walks nested $refs via getScalar -> resolveValue. A\n // self-referential path-ref would recurse forever because the named-ref\n // cycle guard below tracks `resolvedImport.name`, not the ref string.\n // Fall back to `unknown` to break the chain — anonymous recursive types\n // can't be expressed in TypeScript anyway.\n if (context.parents?.includes(refValue)) {\n return {\n value: 'unknown',\n imports: [],\n schemas: [],\n type: 'unknown',\n isEnum: false,\n originalSchema: schemaObject,\n hasReadonlyProps: false,\n isRef: false,\n dependencies: [],\n };\n }\n const scalar = getScalar({\n item: schemaObject,\n name,\n context: {\n ...context,\n parents: [...(context.parents ?? []), refValue],\n },\n formDataContext,\n });\n return { ...scalar, originalSchema: schemaObject, isRef: false };\n }\n\n const resolvedImport = imports[0];\n\n let hasReadonlyProps = false;\n\n // Avoid infinite loop - use resolvedImport.name for tracking since name may be undefined\n const refName = resolvedImport.name;\n if (!context.parents?.includes(refName)) {\n const scalar = getScalar({\n item: schemaObject,\n name: refName,\n context: {\n ...context,\n parents: [...(context.parents ?? []), refName],\n },\n });\n\n hasReadonlyProps = scalar.hasReadonlyProps;\n }\n\n // Bridge assertion: schemaObject.anyOf is `any` due to AnyOtherAttribute\n const anyOfItems = schemaObject.anyOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const isAnyOfNullable = anyOfItems?.some(\n (anyOfItem) =>\n !isReference(anyOfItem) &&\n (anyOfItem.type === 'null' ||\n (Array.isArray(anyOfItem.type) && anyOfItem.type.includes('null'))),\n );\n\n const schemaType = schemaObject.type as string | string[] | undefined;\n const nullable =\n (Array.isArray(schemaType) && schemaType.includes('null')) ||\n schemaObject.nullable === true ||\n isAnyOfNullable\n ? ' | null'\n : '';\n\n return {\n value: resolvedImport.name + nullable,\n imports: [\n {\n name: resolvedImport.name,\n schemaName: resolvedImport.schemaName,\n },\n ],\n type: (schemaObject.type as SchemaType | undefined) ?? 'object',\n schemas: [],\n isEnum: !!schemaObject.enum,\n originalSchema: schemaObject,\n hasReadonlyProps,\n isRef: true,\n dependencies: [resolvedImport.name],\n };\n }\n\n const scalar = getScalar({\n item: schema,\n name,\n context,\n formDataContext,\n });\n\n return {\n ...scalar,\n originalSchema: schema,\n isRef: false,\n };\n}\n","import { getEnum, getEnumDescriptions, getEnumNames } from '../getters/enum';\nimport type { FormDataContext } from '../getters/object';\nimport type {\n ContextSpec,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n ResolverValue,\n ScalarValue,\n} from '../types';\nimport { jsDoc } from '../utils';\nimport { resolveValue } from './value';\n\ninterface ResolveOptions {\n schema: OpenApiSchemaObject | OpenApiReferenceObject;\n propName?: string;\n combined?: boolean;\n context: ContextSpec;\n formDataContext?: FormDataContext;\n}\n\ninterface CreateTypeAliasOptions {\n resolvedValue: ResolverValue;\n propName: string | undefined;\n context: ContextSpec;\n}\n\n/**\n * Wraps inline object type in a type alias.\n * E.g. `{ foo: string }` → value becomes `FooBody`, schema gets `export type FooBody = { foo: string };`\n */\nexport function createTypeAliasIfNeeded({\n resolvedValue,\n propName,\n context,\n}: CreateTypeAliasOptions): ScalarValue | undefined {\n if (!propName) {\n return undefined;\n }\n\n if (resolvedValue.isEnum || resolvedValue.type !== 'object') {\n return undefined;\n }\n\n // aliasCombinedTypes (v7 compat): match '|' and '&' so 'string | number' creates named type\n // v8 default: only match '{' so combined primitives are inlined\n const aliasPattern = context.output.override.aliasCombinedTypes\n ? String.raw`{|&|\\|`\n : '{';\n if (!new RegExp(aliasPattern).test(resolvedValue.value)) {\n return undefined;\n }\n\n const { originalSchema } = resolvedValue;\n const doc = jsDoc(originalSchema);\n const isConstant = 'const' in originalSchema;\n const constantIsString =\n 'type' in originalSchema &&\n (originalSchema.type === 'string' ||\n (Array.isArray(originalSchema.type) &&\n originalSchema.type.includes('string')));\n\n const model = isConstant\n ? `${doc}export const ${propName} = ${constantIsString ? `'${originalSchema.const}'` : originalSchema.const} as const;\\n`\n : `${doc}export type ${propName} = ${resolvedValue.value};\\n`;\n\n return {\n value: propName,\n imports: [{ name: propName, isConstant }],\n schemas: [\n ...resolvedValue.schemas,\n {\n name: propName,\n model,\n imports: resolvedValue.imports,\n dependencies: resolvedValue.dependencies,\n },\n ],\n isEnum: false,\n type: 'object',\n isRef: resolvedValue.isRef,\n hasReadonlyProps: resolvedValue.hasReadonlyProps,\n dependencies: resolvedValue.dependencies,\n };\n}\n\nfunction resolveObjectOriginal({\n schema,\n propName,\n combined = false,\n context,\n formDataContext,\n}: ResolveOptions): ResolverValue {\n const resolvedValue = resolveValue({\n schema,\n name: propName,\n context,\n formDataContext,\n });\n\n // Try to create a type alias for object types\n const aliased = createTypeAliasIfNeeded({\n resolvedValue,\n propName,\n context,\n });\n if (aliased) {\n return {\n ...aliased,\n originalSchema: resolvedValue.originalSchema,\n };\n }\n\n if (propName && resolvedValue.isEnum && !combined && !resolvedValue.isRef) {\n const doc = jsDoc(resolvedValue.originalSchema);\n const enumValue = getEnum(\n resolvedValue.value,\n propName,\n getEnumNames(resolvedValue.originalSchema),\n context.output.override.enumGenerationType,\n getEnumDescriptions(resolvedValue.originalSchema),\n context.output.override.namingConvention.enum,\n );\n\n return {\n value: propName,\n imports: [{ name: propName }],\n schemas: [\n ...resolvedValue.schemas,\n {\n name: propName,\n model: doc + enumValue,\n imports: resolvedValue.imports,\n dependencies: resolvedValue.dependencies,\n },\n ],\n isEnum: false,\n type: 'enum',\n originalSchema: resolvedValue.originalSchema,\n isRef: resolvedValue.isRef,\n hasReadonlyProps: resolvedValue.hasReadonlyProps,\n dependencies: [...resolvedValue.dependencies, propName],\n };\n }\n\n return resolvedValue;\n}\n\nconst resolveObjectCacheMap = new Map<string, ResolverValue>();\n\nexport function resolveObject({\n schema,\n propName,\n combined = false,\n context,\n formDataContext,\n}: ResolveOptions): ResolverValue {\n const hashKey = JSON.stringify({\n schema,\n propName,\n combined,\n projectName: context.projectName ?? context.output.target,\n formDataContext,\n });\n\n if (resolveObjectCacheMap.has(hashKey)) {\n // .has(...) guarantees existence\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return resolveObjectCacheMap.get(hashKey)!;\n }\n\n const result = resolveObjectOriginal({\n schema,\n propName,\n combined,\n context,\n formDataContext,\n });\n\n resolveObjectCacheMap.set(hashKey, result);\n\n return result;\n}\n","import { resolveExampleRefs } from '../resolvers';\nimport { resolveObject } from '../resolvers/object';\nimport type {\n ContextSpec,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n ResolverValue,\n ScalarValue,\n} from '../types';\nimport { compareVersions } from '../utils';\nimport type { FormDataContext } from './object';\n\ninterface GetArrayOptions {\n schema: OpenApiSchemaObject;\n name?: string;\n context: ContextSpec;\n formDataContext?: FormDataContext;\n}\n\n/**\n * Return the output type from an array\n *\n * @param item item with type === \"array\"\n */\nexport function getArray({\n schema,\n name,\n context,\n formDataContext,\n}: GetArrayOptions): ScalarValue {\n // Bridge assertions: extract typed values from AnyOtherAttribute-infected schema\n const schemaPrefixItems = schema.prefixItems as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const schemaItems = schema.items as\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | undefined;\n const schemaExample = schema.example as unknown;\n const schemaExamples = schema.examples as Parameters<\n typeof resolveExampleRefs\n >[0];\n\n const itemSuffix = context.output.override.components.schemas.itemSuffix;\n if (schemaPrefixItems) {\n const resolvedObjects: ResolverValue[] = schemaPrefixItems.map(\n (item, index) =>\n resolveObject({\n schema: item,\n propName: name ? name + itemSuffix + String(index) : undefined,\n context,\n }),\n );\n if (schemaItems) {\n const additional = resolveObject({\n schema: schemaItems,\n propName: name ? name + itemSuffix + 'Additional' : undefined,\n context,\n });\n resolvedObjects.push({\n ...additional,\n value: `...${additional.value}[]`,\n });\n }\n return {\n type: 'array',\n isEnum: false,\n isRef: false,\n value: `[${resolvedObjects.map((o) => o.value).join(', ')}]`,\n imports: resolvedObjects.flatMap((o) => o.imports),\n schemas: resolvedObjects.flatMap((o) => o.schemas),\n dependencies: resolvedObjects.flatMap((o) => o.dependencies),\n hasReadonlyProps: resolvedObjects.some((o) => o.hasReadonlyProps),\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n }\n if (schemaItems) {\n const resolvedObject = resolveObject({\n schema: schemaItems,\n propName: name ? name + itemSuffix : undefined,\n context,\n formDataContext,\n });\n return {\n value: `${\n schema.readOnly === true &&\n !context.output.override.suppressReadonlyModifier\n ? 'readonly '\n : ''\n }${\n resolvedObject.value.includes('|') || resolvedObject.value.includes('&')\n ? `(${resolvedObject.value})[]`\n : `${resolvedObject.value}[]`\n }`,\n imports: resolvedObject.imports,\n schemas: resolvedObject.schemas,\n dependencies: resolvedObject.dependencies,\n isEnum: false,\n type: 'array',\n isRef: false,\n hasReadonlyProps: resolvedObject.hasReadonlyProps,\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n } else if (compareVersions(context.spec.openapi ?? '3.0.0', '3.1', '>=')) {\n return {\n value: 'unknown[]',\n imports: [],\n schemas: [],\n dependencies: [],\n isEnum: false,\n type: 'array',\n isRef: false,\n hasReadonlyProps: false,\n };\n } else {\n throw new Error(\n `All arrays must have an \\`items\\` key defined (name=${name}, schema=${JSON.stringify(schema)})`,\n );\n }\n}\n","import { keyword } from 'esutils';\nimport { uniqueBy } from 'remeda';\n\nimport { resolveObject } from '../resolvers/object';\nimport { resolveExampleRefs, resolveRef } from '../resolvers/ref';\nimport {\n type ContextSpec,\n FormDataArrayHandling,\n type GeneratorImport,\n type GetterResponse,\n type OpenApiEncodingObject,\n type OpenApiMediaTypeObject,\n type OpenApiReferenceObject,\n type OpenApiRequestBodyObject,\n type OpenApiResponseObject,\n type OpenApiSchemaObject,\n type ResReqTypesValue,\n} from '../types';\nimport { camel } from '../utils';\nimport { isReference } from '../utils/assertion';\nimport { pascal } from '../utils/case';\nimport {\n getFormDataFieldFileType,\n isBinaryContentType,\n} from '../utils/content-type';\nimport { getNumberWord } from '../utils/string';\nimport type { FormDataContext } from './object';\n\n// Bridge assertion helpers for AnyOtherAttribute-infected schema properties.\n// OpenAPI SchemaObject includes `[key: string]: any` which infects all property access.\n// These helpers centralize the cast so it appears once rather than at each access site.\nconst getSchemaType = (s: OpenApiSchemaObject) =>\n s.type as string | string[] | undefined;\nconst getSchemaCombined = (s: OpenApiSchemaObject) =>\n (s.oneOf ?? s.anyOf ?? s.allOf) as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\nconst getSchemaOneOf = (s: OpenApiSchemaObject) =>\n s.oneOf as (OpenApiSchemaObject | OpenApiReferenceObject)[] | undefined;\nconst getSchemaAnyOf = (s: OpenApiSchemaObject) =>\n s.anyOf as (OpenApiSchemaObject | OpenApiReferenceObject)[] | undefined;\nconst getSchemaItems = (s: OpenApiSchemaObject) =>\n s.items as OpenApiSchemaObject | OpenApiReferenceObject | undefined;\nconst getSchemaRequired = (s: OpenApiSchemaObject) =>\n s.required as string[] | undefined;\nconst getSchemaProperties = (s: OpenApiSchemaObject) =>\n s.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\nconst resolveSchemaRef = (\n schema: OpenApiSchemaObject | OpenApiReferenceObject,\n context: ContextSpec,\n) =>\n resolveRef(schema, context) as {\n schema: OpenApiSchemaObject;\n imports: GeneratorImport[];\n };\nconst resolveResponseOrRequestRef = (\n schema: OpenApiReferenceObject,\n context: ContextSpec,\n) =>\n resolveRef(schema, context) as {\n schema: OpenApiResponseObject | OpenApiRequestBodyObject;\n imports: GeneratorImport[];\n };\n\nconst formDataContentTypes = new Set(['multipart/form-data']);\n\nconst formUrlEncodedContentTypes = new Set([\n 'application/x-www-form-urlencoded',\n]);\n\ninterface GetResReqContentTypesOptions {\n mediaType: OpenApiMediaTypeObject;\n propName?: string;\n context: ContextSpec;\n isFormData?: boolean;\n contentType: string;\n}\n\nfunction getResReqContentTypes({\n mediaType,\n propName,\n context,\n isFormData,\n contentType,\n}: GetResReqContentTypesOptions) {\n if (!mediaType.schema) {\n return;\n }\n\n // For form bodies, pass context that tracks encoding for file type\n // detection. url-encoded bodies additionally flag `urlEncoded` so file/binary\n // fields are typed as `string` rather than `Blob` (#1624).\n const isFormUrlEncoded = formUrlEncodedContentTypes.has(contentType);\n const formDataContext: FormDataContext | undefined = isFormData\n ? { atPart: false, encoding: mediaType.encoding ?? {} }\n : isFormUrlEncoded\n ? { atPart: false, encoding: mediaType.encoding ?? {}, urlEncoded: true }\n : undefined;\n\n const resolvedObject = resolveObject({\n schema: mediaType.schema,\n propName,\n context,\n formDataContext,\n });\n\n // Known binary content type → Blob (overrides schema)\n // This ensures correct responseType ('blob') even when schema lacks format: binary.\n if (!isFormData && isBinaryContentType(contentType)) {\n return {\n ...resolvedObject,\n value: 'Blob',\n };\n }\n\n return resolvedObject;\n}\n\nexport function getResReqTypes(\n responsesOrRequests: [\n string,\n OpenApiReferenceObject | OpenApiResponseObject | OpenApiRequestBodyObject,\n ][],\n name: string,\n context: ContextSpec,\n defaultType = 'unknown',\n uniqueKey: (\n item: ResReqTypesValue,\n index: number,\n data: ResReqTypesValue[],\n ) => unknown = (item) => item.value,\n): ResReqTypesValue[] {\n const typesArray = responsesOrRequests\n .filter(([, res]) => Boolean(res))\n .map(([key, res]) => {\n if (isReference(res)) {\n const {\n schema: bodySchema,\n imports: [{ name, schemaName }],\n } = resolveResponseOrRequestRef(res, context);\n\n const firstEntry = Object.entries(bodySchema.content ?? {}).at(0);\n\n if (!firstEntry) {\n return [\n {\n value: name,\n imports: [{ name, schemaName }],\n schemas: [],\n type: 'unknown',\n isEnum: false,\n isRef: true,\n hasReadonlyProps: false,\n dependencies: [name],\n originalSchema: undefined,\n example: undefined,\n examples: undefined,\n key,\n contentType: '',\n },\n ] as ResReqTypesValue[];\n }\n\n const [contentType, mediaType] = firstEntry;\n\n const isFormData = formDataContentTypes.has(contentType);\n const isFormUrlEncoded = formUrlEncodedContentTypes.has(contentType);\n\n if ((!isFormData && !isFormUrlEncoded) || !mediaType.schema) {\n return [\n {\n value: name,\n imports: [{ name, schemaName }],\n schemas: [],\n type: 'unknown',\n isEnum: false,\n isRef: true,\n hasReadonlyProps: false,\n dependencies: [name],\n originalSchema: mediaType.schema,\n example: mediaType.example as unknown,\n examples: resolveExampleRefs(\n mediaType.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n key,\n contentType,\n },\n ] as ResReqTypesValue[];\n }\n\n const formData = isFormData\n ? getSchemaFormDataAndUrlEncoded({\n name,\n schemaObject: mediaType.schema,\n context,\n isRequestBodyOptional: bodySchema.required !== true,\n isRef: true,\n encoding: mediaType.encoding,\n })\n : undefined;\n\n const formUrlEncoded = isFormUrlEncoded\n ? getSchemaFormDataAndUrlEncoded({\n name,\n schemaObject: mediaType.schema,\n context,\n isRequestBodyOptional: bodySchema.required !== true,\n isUrlEncoded: true,\n isRef: true,\n encoding: mediaType.encoding,\n })\n : undefined;\n\n const additionalImports = getFormDataAdditionalImports({\n schemaObject: mediaType.schema,\n context,\n });\n\n return [\n {\n value: name,\n imports: [{ name, schemaName }, ...additionalImports],\n schemas: [],\n type: 'unknown',\n isEnum: false,\n hasReadonlyProps: false,\n dependencies: [name],\n formData,\n formUrlEncoded,\n isRef: true,\n originalSchema: mediaType.schema,\n example: mediaType.example,\n examples: resolveExampleRefs(mediaType.examples, context),\n key,\n contentType,\n },\n ] as ResReqTypesValue[];\n }\n\n if (res.content) {\n const contents = Object.entries(res.content).map(\n ([contentType, mediaType], index, arr) => {\n let propName = key ? pascal(name) + pascal(key) : undefined;\n\n if (propName && arr.length > 1) {\n propName = propName + pascal(getNumberWord(index + 1));\n }\n\n const isFormData = formDataContentTypes.has(contentType);\n const isFormUrlEncoded =\n formUrlEncodedContentTypes.has(contentType);\n\n // When schema is a $ref, use schema name for consistent param naming\n let effectivePropName = propName;\n if (mediaType.schema && isReference(mediaType.schema)) {\n const { imports } = resolveSchemaRef(mediaType.schema, context);\n if (imports[0]?.name) {\n effectivePropName = imports[0].name;\n }\n } else if ((isFormData || isFormUrlEncoded) && mediaType.schema) {\n // For form-data and url-encoded, the param name is also the\n // runtime variable iterated by the FormData/URLSearchParams code.\n // Derive it from the inner DTO names so it matches the function\n // parameter (#3242). Scoped to these content types: forcing the\n // schema name elsewhere aliases the import to `Foo as __Foo` in\n // split mode and broke the MSW mock filter (#3269).\n const combinedRefs =\n getSchemaOneOf(mediaType.schema) ??\n getSchemaAnyOf(mediaType.schema);\n if (combinedRefs) {\n const names: string[] = [];\n for (const ref of combinedRefs) {\n if (!isReference(ref)) continue;\n const refName = resolveSchemaRef(ref, context).imports[0]\n ?.name;\n if (refName) {\n names.push(refName);\n }\n }\n if (names.length > 0) {\n effectivePropName = names.join('');\n }\n }\n }\n\n const resolvedValue = getResReqContentTypes({\n mediaType,\n propName: effectivePropName,\n context,\n isFormData,\n contentType,\n });\n\n if (!resolvedValue) {\n // openapi spec 3.1 allows describing binary responses with only a content type\n if (isBinaryContentType(contentType)) {\n return {\n value: 'Blob',\n imports: [],\n schemas: [],\n type: 'Blob',\n isEnum: false,\n key,\n isRef: false,\n hasReadonlyProps: false,\n contentType,\n };\n }\n\n return;\n }\n\n if (\n (!isFormData && !isFormUrlEncoded) ||\n !effectivePropName ||\n !mediaType.schema\n ) {\n return {\n ...resolvedValue,\n imports: resolvedValue.imports,\n dependencies: resolvedValue.dependencies,\n contentType,\n example: mediaType.example,\n examples: resolveExampleRefs(mediaType.examples, context),\n };\n }\n\n const formData = isFormData\n ? getSchemaFormDataAndUrlEncoded({\n name: effectivePropName,\n schemaObject: mediaType.schema,\n context,\n isRequestBodyOptional: res.required !== true,\n isRef: true,\n encoding: mediaType.encoding,\n })\n : undefined;\n\n const formUrlEncoded = isFormUrlEncoded\n ? getSchemaFormDataAndUrlEncoded({\n name: effectivePropName,\n schemaObject: mediaType.schema,\n context,\n isUrlEncoded: true,\n isRequestBodyOptional: res.required !== true,\n isRef: true,\n encoding: mediaType.encoding,\n })\n : undefined;\n\n const additionalImports = getFormDataAdditionalImports({\n schemaObject: mediaType.schema,\n context,\n });\n return {\n ...resolvedValue,\n imports: [...resolvedValue.imports, ...additionalImports],\n formData,\n formUrlEncoded,\n contentType,\n example: mediaType.example as unknown,\n examples: resolveExampleRefs(\n mediaType.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n };\n },\n );\n\n return contents\n .filter(Boolean)\n .map((x) => ({ ...x, key })) as ResReqTypesValue[];\n }\n const swaggerSchema =\n 'schema' in res\n ? (\n res as {\n schema?: OpenApiSchemaObject | OpenApiReferenceObject;\n }\n ).schema\n : undefined;\n\n if (swaggerSchema) {\n const propName = key ? pascal(name) + pascal(key) : undefined;\n const resolvedValue = resolveObject({\n schema: swaggerSchema,\n propName,\n context,\n });\n\n return [\n {\n ...resolvedValue,\n contentType: 'application/json',\n key,\n },\n ] as ResReqTypesValue[];\n }\n\n return [\n {\n value: defaultType,\n imports: [],\n schemas: [],\n type: defaultType,\n isEnum: false,\n dependencies: [],\n key,\n isRef: false,\n hasReadonlyProps: false,\n contentType: 'application/json',\n },\n ] as ResReqTypesValue[];\n });\n\n return uniqueBy(typesArray.flat(), uniqueKey);\n}\n\n/**\n * Response type categories for HTTP client response parsing.\n * Maps to Angular HttpClient's responseType, Axios responseType, and Fetch response methods.\n */\nexport type ResponseTypeCategory = 'json' | 'text' | 'blob' | 'arraybuffer';\n\n/**\n * Determine the responseType option based on success content types only.\n * This avoids error-response content types influencing the responseType.\n */\nexport function getSuccessResponseType(\n response: GetterResponse,\n): 'blob' | 'text' | undefined {\n const successContentTypes = response.types.success\n .map((t) => t.contentType)\n .filter(Boolean);\n\n if (response.isBlob) {\n return 'blob' as const;\n }\n\n const hasJsonResponse = successContentTypes.some(\n (contentType) =>\n contentType.includes('json') || contentType.includes('+json'),\n );\n const hasTextResponse = successContentTypes.some(\n (contentType) =>\n contentType.startsWith('text/') || contentType.includes('xml'),\n );\n\n if (!hasJsonResponse && hasTextResponse) {\n return 'text' as const;\n }\n\n return undefined;\n}\n\n/**\n * Determine the response type category for a given content type.\n * Used to set the correct responseType option in HTTP clients.\n *\n * @param contentType - The MIME content type (e.g., 'application/json', 'text/plain')\n * @returns The response type category to use for parsing\n */\nexport function getResponseTypeCategory(\n contentType: string,\n): ResponseTypeCategory {\n // Binary types → blob\n if (isBinaryContentType(contentType)) {\n return 'blob';\n }\n\n // JSON types\n if (\n contentType === 'application/json' ||\n contentType.includes('+json') ||\n contentType.includes('-json')\n ) {\n return 'json';\n }\n\n // Everything else is text (text/*, application/xml, etc.)\n return 'text';\n}\n\n/**\n * Get the default content type from a list of content types.\n * Priority: application/json > any JSON-like type > first in list\n *\n * @param contentTypes - Array of content types from OpenAPI spec\n * @returns The default content type to use\n */\nexport function getDefaultContentType(contentTypes: string[]): string {\n if (contentTypes.length === 0) {\n return 'application/json';\n }\n\n // Prefer application/json\n if (contentTypes.includes('application/json')) {\n return 'application/json';\n }\n\n // Prefer any JSON-like type\n const jsonType = contentTypes.find(\n (ct) => ct.includes('+json') || ct.includes('-json'),\n );\n if (jsonType) {\n return jsonType;\n }\n\n // Default to first\n return contentTypes[0];\n}\n\ninterface GetFormDataAdditionalImportsOptions {\n schemaObject: OpenApiSchemaObject | OpenApiReferenceObject;\n context: ContextSpec;\n}\n\nfunction getFormDataAdditionalImports({\n schemaObject,\n context,\n}: GetFormDataAdditionalImportsOptions): GeneratorImport[] {\n const { schema } = resolveSchemaRef(schemaObject, context);\n\n if (schema.type !== 'object') {\n return [];\n }\n\n const combinedSchemas = getSchemaOneOf(schema) ?? getSchemaAnyOf(schema);\n\n if (!combinedSchemas) {\n return [];\n }\n\n return combinedSchemas\n .map((subSchema) => resolveSchemaRef(subSchema, context).imports[0])\n .filter(Boolean);\n}\n\ninterface GetSchemaFormDataAndUrlEncodedOptions {\n name: string;\n schemaObject: OpenApiSchemaObject | OpenApiReferenceObject;\n context: ContextSpec;\n isRequestBodyOptional: boolean;\n isUrlEncoded?: boolean;\n isRef?: boolean;\n encoding?: Record<string, OpenApiEncodingObject>;\n}\n\nfunction getSchemaFormDataAndUrlEncoded({\n name,\n schemaObject,\n context,\n isRequestBodyOptional,\n isUrlEncoded,\n isRef,\n encoding,\n}: GetSchemaFormDataAndUrlEncodedOptions): string {\n const { schema, imports } = resolveSchemaRef(schemaObject, context);\n const propName = camel(\n !isRef && isReference(schemaObject) ? imports[0].name : name,\n );\n\n const variableName = isUrlEncoded ? 'formUrlEncoded' : 'formData';\n let form = isUrlEncoded\n ? `const ${variableName} = new URLSearchParams();\\n`\n : `const ${variableName} = new FormData();\\n`;\n\n const combinedSchemas = getSchemaCombined(schema);\n if (\n schema.type === 'object' ||\n (schema.type === undefined && combinedSchemas)\n ) {\n if (combinedSchemas) {\n const shouldCast = !!getSchemaOneOf(schema) || !!getSchemaAnyOf(schema);\n\n if (shouldCast) {\n // If the outer schema also has direct properties, those are handled\n // below by the dedicated properties branch. Skip them here to avoid\n // appending the same key twice. Exclude readOnly direct properties\n // so they can still flow through the runtime loop if a variant\n // declares the same key as writable.\n const directProperties = getSchemaProperties(schema);\n const directKeys = directProperties\n ? Object.entries(directProperties)\n .filter(\n ([, value]) =>\n !resolveSchemaRef(value, context).schema.readOnly,\n )\n .map(([key]) => key)\n : [];\n const skipLine =\n directKeys.length > 0\n ? ` if ([${directKeys.map((k) => JSON.stringify(k)).join(', ')}].includes(key)) return;\\n`\n : '';\n\n form += `Object.entries(${propName} ?? {}).forEach(([key, value]) => {\\n`;\n form += skipLine;\n form += ` if (value !== undefined && value !== null) {\\n`;\n if (isUrlEncoded) {\n // url-encoded: URLSearchParams holds strings only, so File/Blob/\n // Buffer handling does not apply — coerce every value to string (#1624)\n form += ` if (Array.isArray(value)) {\\n`;\n form += ` value.forEach(v => {\\n`;\n form += ` ${variableName}.append(key, typeof v === 'object' ? JSON.stringify(v) : String(v));\\n`;\n form += ` });\\n`;\n form += ` } else if (typeof value === 'object') {\\n`;\n form += ` ${variableName}.append(key, JSON.stringify(value));\\n`;\n form += ` } else {\\n`;\n form += ` ${variableName}.append(key, String(value));\\n`;\n form += ` }\\n`;\n } else {\n form += ` if ((typeof File !== 'undefined' && value instanceof File) || value instanceof Blob) {\\n`;\n form += ` ${variableName}.append(key, value);\\n`;\n form += ` } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\\n`;\n form += ` ${variableName}.append(key, new Blob([Uint8Array.from(value)]));\\n`;\n form += ` } else if (Array.isArray(value)) {\\n`;\n form += ` value.forEach(v => {\\n`;\n form += ` if ((typeof File !== 'undefined' && v instanceof File) || v instanceof Blob) {\\n`;\n form += ` ${variableName}.append(key, v);\\n`;\n form += ` } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(v)) {\\n`;\n form += ` ${variableName}.append(key, new Blob([Uint8Array.from(v)]));\\n`;\n form += ` } else {\\n`;\n form += ` ${variableName}.append(key, typeof v === 'object' ? JSON.stringify(v) : String(v));\\n`;\n form += ` }\\n`;\n form += ` });\\n`;\n form += ` } else if (typeof value === 'object') {\\n`;\n form += ` ${variableName}.append(key, JSON.stringify(value));\\n`;\n form += ` } else {\\n`;\n form += ` ${variableName}.append(key, String(value));\\n`;\n form += ` }\\n`;\n }\n form += ` }\\n`;\n form += `});\\n`;\n } else {\n const combinedSchemasFormData = combinedSchemas\n .map((subSchema) => {\n const { schema: combinedSchema } = resolveSchemaRef(\n subSchema,\n context,\n );\n return resolveSchemaPropertiesToFormData({\n schema: combinedSchema,\n variableName,\n propName,\n context,\n isRequestBodyOptional,\n encoding,\n });\n })\n .filter(Boolean)\n .join('\\n');\n\n form += combinedSchemasFormData;\n }\n }\n\n if (schema.properties) {\n const formDataValues = resolveSchemaPropertiesToFormData({\n schema,\n variableName,\n propName,\n context,\n isRequestBodyOptional,\n encoding,\n });\n\n form += formDataValues;\n }\n\n return form;\n }\n\n if (schema.type === 'array') {\n let valueStr = 'value';\n const schemaItems = getSchemaItems(schema);\n if (schemaItems) {\n const { schema: itemSchema } = resolveSchemaRef(schemaItems, context);\n if (itemSchema.type === 'object' || itemSchema.type === 'array') {\n valueStr = 'JSON.stringify(value)';\n } else if (\n itemSchema.type === 'number' ||\n itemSchema.type === 'integer' ||\n itemSchema.type === 'boolean'\n ) {\n valueStr = 'value.toString()';\n }\n }\n\n return `${form}${propName}.forEach(value => ${variableName}.append('data', ${valueStr}))\\n`;\n }\n\n if (\n schema.type === 'number' ||\n schema.type === 'integer' ||\n schema.type === 'boolean'\n ) {\n return `${form}${variableName}.append('data', ${propName}.toString())\\n`;\n }\n\n return `${form}${variableName}.append('data', ${propName})\\n`;\n}\n\ninterface ResolveSchemaPropertiesToFormDataOptions {\n schema: OpenApiSchemaObject;\n variableName: string;\n propName: string;\n context: ContextSpec;\n isRequestBodyOptional: boolean;\n keyPrefix?: string;\n depth?: number;\n encoding?: Record<string, OpenApiEncodingObject>;\n}\n\nfunction resolveSchemaPropertiesToFormData({\n schema,\n variableName,\n propName,\n context,\n isRequestBodyOptional,\n keyPrefix = '',\n depth = 0,\n encoding,\n}: ResolveSchemaPropertiesToFormDataOptions): string {\n let formDataValues = '';\n // url-encoded bodies use URLSearchParams (string values only), so file/binary\n // fields are appended as plain strings rather than wrapped in a Blob (#1624).\n const isUrlEncoded = variableName === 'formUrlEncoded';\n const schemaProps = getSchemaProperties(schema) ?? {};\n for (const [key, value] of Object.entries(schemaProps)) {\n const { schema: property } = resolveSchemaRef(value, context);\n\n // Skip readOnly properties for formData\n if (property.readOnly) {\n continue;\n }\n\n let formDataValue = '';\n\n // Get encoding.contentType for this field (only at top level, depth === 0)\n const fieldEncoding = depth === 0 ? encoding?.[key] : undefined;\n const partContentType = fieldEncoding?.contentType;\n\n const formattedKeyPrefix = isRequestBodyOptional\n ? keyword.isIdentifierNameES5(key)\n ? '?'\n : '?.'\n : '';\n const formattedKey = keyword.isIdentifierNameES5(key)\n ? `.${key}`\n : `['${key}']`;\n\n const valueKey = `${propName}${formattedKeyPrefix}${formattedKey}`;\n const nonOptionalValueKey = `${propName}${formattedKey}`;\n\n // Use shared file type detection (same logic as type generation)\n const fileType = getFormDataFieldFileType(property, partContentType);\n const effectiveContentType =\n partContentType ?? (property.contentMediaType as string | undefined);\n\n if (isUrlEncoded && (fileType || property.format === 'binary')) {\n // url-encoded: file/binary fields are plain strings (URLSearchParams)\n formDataValue = `${variableName}.append(\\`${keyPrefix}${key}\\`, ${nonOptionalValueKey});\\n`;\n } else if (fileType === 'binary' || property.format === 'binary') {\n // Binary: append directly (value is Blob)\n formDataValue = `${variableName}.append(\\`${keyPrefix}${key}\\`, ${nonOptionalValueKey});\\n`;\n } else if (fileType === 'text') {\n // Text file: value is Blob | string, check at runtime\n formDataValue = `${variableName}.append(\\`${keyPrefix}${key}\\`, ${nonOptionalValueKey} instanceof Blob ? ${nonOptionalValueKey} : new Blob([${nonOptionalValueKey}], { type: '${effectiveContentType}' }));\\n`;\n } else if (\n property.type === 'object' ||\n (Array.isArray(property.type) && property.type.includes('object'))\n ) {\n formDataValue =\n context.output.override.formData.arrayHandling ===\n FormDataArrayHandling.EXPLODE\n ? resolveSchemaPropertiesToFormData({\n schema: property,\n variableName,\n propName: nonOptionalValueKey,\n context,\n isRequestBodyOptional,\n keyPrefix: `${keyPrefix}${key}.`,\n depth: depth + 1,\n encoding,\n })\n : `${variableName}.append(\\`${keyPrefix}${key}\\`, JSON.stringify(${nonOptionalValueKey}));\\n`;\n } else if (\n property.type === 'array' ||\n (Array.isArray(property.type) && property.type.includes('array'))\n ) {\n let valueStr = 'value';\n let hasNonPrimitiveChild = false;\n const propertyItems = getSchemaItems(property);\n if (propertyItems) {\n const { schema: itemSchema } = resolveSchemaRef(propertyItems, context);\n if (itemSchema.type === 'object' || itemSchema.type === 'array') {\n if (\n context.output.override.formData.arrayHandling ===\n FormDataArrayHandling.EXPLODE\n ) {\n hasNonPrimitiveChild = true;\n const resolvedValue = resolveSchemaPropertiesToFormData({\n schema: itemSchema,\n variableName,\n propName: 'value',\n context,\n isRequestBodyOptional,\n keyPrefix: `${keyPrefix}${key}[\\${index${depth > 0 ? depth : ''}}].`,\n depth: depth + 1,\n });\n formDataValue = `${valueKey}.forEach((value, index${depth > 0 ? depth : ''}) => {\n ${resolvedValue}});\\n`;\n } else {\n valueStr = 'JSON.stringify(value)';\n }\n } else {\n const itemType = getSchemaType(itemSchema);\n if (\n itemType === 'number' ||\n (Array.isArray(itemType) && itemType.includes('number')) ||\n itemType === 'integer' ||\n (Array.isArray(itemType) && itemType.includes('integer')) ||\n itemType === 'boolean' ||\n (Array.isArray(itemType) && itemType.includes('boolean'))\n ) {\n valueStr = 'value.toString()';\n }\n }\n }\n if (\n context.output.override.formData.arrayHandling ===\n FormDataArrayHandling.EXPLODE\n ) {\n if (!hasNonPrimitiveChild) {\n formDataValue = `${valueKey}.forEach((value, index${depth > 0 ? depth : ''}) => ${variableName}.append(\\`${keyPrefix}${key}[\\${index${depth > 0 ? depth : ''}}]\\`, ${valueStr}));\\n`;\n }\n } else {\n formDataValue = `${valueKey}.forEach(value => ${variableName}.append(\\`${keyPrefix}${key}${context.output.override.formData.arrayHandling === FormDataArrayHandling.SERIALIZE_WITH_BRACKETS ? '[]' : ''}\\`, ${valueStr}));\\n`;\n }\n } else if (\n (() => {\n const propType = getSchemaType(property);\n return (\n propType === 'number' ||\n (Array.isArray(propType) && propType.includes('number')) ||\n propType === 'integer' ||\n (Array.isArray(propType) && propType.includes('integer')) ||\n propType === 'boolean' ||\n (Array.isArray(propType) && propType.includes('boolean'))\n );\n })()\n ) {\n formDataValue = `${variableName}.append(\\`${keyPrefix}${key}\\`, ${nonOptionalValueKey}.toString())\\n`;\n } else {\n formDataValue = `${variableName}.append(\\`${keyPrefix}${key}\\`, ${nonOptionalValueKey});\\n`;\n }\n\n let existSubSchemaNullable = false;\n const combine = getSchemaCombined(property);\n if (combine) {\n const subSchemas = combine.map((c) =>\n resolveObject({ schema: c, combined: true, context: context }),\n );\n if (\n subSchemas.some((subSchema) => {\n return ['number', 'integer', 'boolean'].includes(subSchema.type);\n })\n ) {\n formDataValue = `${variableName}.append(\\`${key}\\`, ${nonOptionalValueKey}.toString())\\n`;\n }\n\n if (\n subSchemas.some((subSchema) => {\n return subSchema.type === 'null';\n })\n ) {\n existSubSchemaNullable = true;\n }\n }\n\n const schemaRequired = getSchemaRequired(schema);\n const isRequired = schemaRequired?.includes(key) && !isRequestBodyOptional;\n\n const propType = getSchemaType(property);\n if (\n property.nullable ||\n (Array.isArray(propType) && propType.includes('null')) ||\n existSubSchemaNullable\n ) {\n if (isRequired) {\n formDataValues += `if(${valueKey} !== null) {\\n ${formDataValue} }\\n`;\n continue;\n }\n\n formDataValues += `if(${valueKey} !== undefined && ${nonOptionalValueKey} !== null) {\\n ${formDataValue} }\\n`;\n continue;\n }\n\n if (isRequired) {\n formDataValues += formDataValue;\n continue;\n }\n\n formDataValues += `if(${valueKey} !== undefined) {\\n ${formDataValue} }\\n`;\n }\n\n return formDataValues;\n}\n","import { generalJSTypesWithArray } from '../constants';\nimport { resolveRef } from '../resolvers';\nimport type {\n ContextSpec,\n GetterBody,\n OpenApiReferenceObject,\n OpenApiRequestBodyObject,\n OverrideOutputContentType,\n ResReqTypesValue,\n} from '../types';\nimport { camel, filterByContentType, isReference, sanitize } from '../utils';\nimport { getResReqTypes } from './res-req-types';\n\ninterface GetBodyOptions {\n requestBody: OpenApiReferenceObject | OpenApiRequestBodyObject;\n operationName: string;\n context: ContextSpec;\n contentType?: OverrideOutputContentType;\n}\n\nfunction buildBody(\n filteredBodyTypes: ResReqTypesValue[],\n requestBody: OpenApiReferenceObject | OpenApiRequestBodyObject,\n operationName: string,\n context: ContextSpec,\n): GetterBody {\n const imports = filteredBodyTypes.flatMap(({ imports }) => imports);\n const schemas = filteredBodyTypes.flatMap(({ schemas }) => schemas);\n\n const definition = filteredBodyTypes.map(({ value }) => value).join(' | ');\n const hasReadonlyProps = filteredBodyTypes.some((x) => x.hasReadonlyProps);\n const nonReadonlyDefinition =\n hasReadonlyProps &&\n definition &&\n context.output.override.preserveReadonlyRequestBodies !== 'preserve'\n ? `NonReadonly<${definition}>`\n : definition;\n\n let implementation =\n generalJSTypesWithArray.includes(definition.toLowerCase()) ||\n filteredBodyTypes.length > 1\n ? camel(operationName) +\n context.output.override.components.requestBodies.suffix\n : camel(definition);\n\n let isOptional = false;\n if (implementation) {\n implementation = sanitize(implementation, {\n underscore: '_',\n whitespace: '_',\n dash: true,\n es5keyword: true,\n es5IdentifierName: true,\n });\n if (isReference(requestBody)) {\n const { schema: bodySchema }: { schema: OpenApiRequestBodyObject } =\n resolveRef(requestBody, context);\n isOptional = bodySchema.required !== true;\n } else {\n isOptional = requestBody.required !== true;\n }\n }\n\n return {\n originalSchema: requestBody,\n definition: nonReadonlyDefinition,\n implementation,\n imports,\n schemas,\n isOptional,\n ...(filteredBodyTypes.length === 1\n ? {\n formData: filteredBodyTypes[0].formData,\n formUrlEncoded: filteredBodyTypes[0].formUrlEncoded,\n contentType: filteredBodyTypes[0].contentType,\n }\n : {\n formData: '',\n formUrlEncoded: '',\n contentType: '',\n }),\n };\n}\n\nexport function getBody({\n requestBody,\n operationName,\n context,\n contentType,\n}: GetBodyOptions): GetterBody {\n const allBodyTypes = getResReqTypes(\n [[context.output.override.components.requestBodies.suffix, requestBody]],\n operationName,\n context,\n );\n\n const filteredBodyTypes = filterByContentType(allBodyTypes, contentType);\n\n return buildBody(filteredBodyTypes, requestBody, operationName, context);\n}\n\n/**\n * Returns per-content-type bodies when `splitByContentType` is enabled.\n * Each entry includes a `contentTypeSuffix` for generating distinct function names.\n */\nexport function getBodiesByContentType({\n requestBody,\n operationName,\n context,\n contentType,\n}: GetBodyOptions): (GetterBody & { contentTypeSuffix: string })[] {\n const allBodyTypes = getResReqTypes(\n [[context.output.override.components.requestBodies.suffix, requestBody]],\n operationName,\n context,\n undefined,\n (item) => `${item.value}::${item.contentType}`,\n );\n\n const filteredBodyTypes = filterByContentType(allBodyTypes, contentType);\n\n // If there's only one content type, no need to split\n if (filteredBodyTypes.length <= 1) {\n return [\n {\n ...buildBody(filteredBodyTypes, requestBody, operationName, context),\n contentTypeSuffix: '',\n },\n ];\n }\n\n return filteredBodyTypes.map((bodyType) => {\n const suffix = getContentTypeSuffix(bodyType.contentType);\n const body = buildBody([bodyType], requestBody, operationName, context);\n return {\n ...body,\n contentTypeSuffix: suffix,\n };\n });\n}\n\nconst CONTENT_TYPE_SUFFIX_MAP: Record<string, string> = {\n 'application/json': 'Json',\n 'multipart/form-data': 'FormData',\n 'application/x-www-form-urlencoded': 'UrlEncoded',\n 'text/plain': 'Text',\n 'application/xml': 'Xml',\n 'text/xml': 'Xml',\n 'application/octet-stream': 'Blob',\n};\n\nfunction getContentTypeSuffix(contentType: string): string {\n if (CONTENT_TYPE_SUFFIX_MAP[contentType]) {\n return CONTENT_TYPE_SUFFIX_MAP[contentType];\n }\n // For unknown content types, derive a PascalCase suffix from the subtype\n const subtype = contentType.split('/')[1] ?? contentType;\n return subtype\n .split(/[-+.]/)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n}\n","import type { ContextSpec, GeneratorImport, ResolverValue } from '../types';\n\ninterface GetAliasedImportsOptions {\n name?: string;\n resolvedValue: ResolverValue;\n context: ContextSpec;\n}\n\nexport function getAliasedImports({\n name,\n resolvedValue,\n context,\n}: GetAliasedImportsOptions): GeneratorImport[] {\n return context.output.schemas && resolvedValue.isRef\n ? resolvedValue.imports.map((imp) => {\n if (\n !needCreateImportAlias({\n name,\n imp,\n })\n ) {\n return imp;\n }\n\n return {\n ...imp,\n alias: `__${imp.name}`,\n };\n })\n : resolvedValue.imports;\n}\n\ninterface NeedCreateImportAliasOptions {\n name?: string;\n imp: GeneratorImport;\n}\n\nexport function needCreateImportAlias({\n imp,\n name,\n}: NeedCreateImportAliasOptions): boolean {\n return !imp.alias && imp.name === name;\n}\n\ninterface GetImportAliasForRefOrValueOptions {\n resolvedValue: ResolverValue;\n imports: GeneratorImport[];\n context: ContextSpec;\n}\n\nexport function getImportAliasForRefOrValue({\n context,\n imports,\n resolvedValue,\n}: GetImportAliasForRefOrValueOptions): string {\n if (!context.output.schemas || !resolvedValue.isRef) {\n return resolvedValue.value;\n }\n const importWithSameName = imports.find(\n (imp) => imp.name === resolvedValue.value,\n );\n return importWithSameName?.alias ?? resolvedValue.value;\n}\n","import { keyword } from 'esutils';\n\nexport function getKey(key: string) {\n return keyword.isIdentifierNameES5(key) ? key : `'${key}'`;\n}\n","import { resolveExampleRefs, resolveValue } from '../resolvers';\nimport { resolveObject } from '../resolvers/object';\nimport {\n type ContextSpec,\n type GeneratorImport,\n type OpenApiReferenceObject,\n type OpenApiSchemaObject,\n PropertySortOrder,\n type ScalarValue,\n SchemaType,\n} from '../types';\nimport { escape, isReference, isString, jsDoc, pascal } from '../utils';\nimport { combineSchemas } from './combine';\nimport { getAliasedImports, getImportAliasForRefOrValue } from './imports';\nimport { getKey } from './keys';\nimport { getRefInfo } from './ref';\n\ninterface PropertyNamesKeyType {\n value: string;\n imports: GeneratorImport[];\n dependencies: string[];\n}\n\nfunction getPropertyNamesEnumKeyType(\n item: OpenApiSchemaObject,\n): PropertyNamesKeyType | undefined {\n if (!('propertyNames' in item) || !item.propertyNames) {\n return undefined;\n }\n\n const propertyNames = item.propertyNames as {\n enum?: unknown[];\n const?: unknown;\n };\n\n if (Array.isArray(propertyNames.enum)) {\n const enumValues = propertyNames.enum.filter((val): val is string =>\n isString(val),\n );\n\n if (enumValues.length > 0) {\n return {\n value: enumValues.map((val) => `'${escape(val)}'`).join(' | '),\n imports: [],\n dependencies: [],\n };\n }\n }\n\n if (isString(propertyNames.const)) {\n return {\n value: `'${escape(propertyNames.const)}'`,\n imports: [],\n dependencies: [],\n };\n }\n\n return undefined;\n}\n\n/**\n * Resolve a narrowed key type from OpenAPI 3.1 propertyNames.\n * Supports inline enum/const and $ref string enums.\n */\nfunction getPropertyNamesKeyType(\n item: OpenApiSchemaObject,\n context: ContextSpec,\n): PropertyNamesKeyType | undefined {\n const inlineKeyType = getPropertyNamesEnumKeyType(item);\n if (inlineKeyType) {\n return inlineKeyType;\n }\n\n const propertyNames = item.propertyNames as\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | undefined;\n if (!propertyNames || !isReference(propertyNames)) {\n return undefined;\n }\n\n const resolvedValue = resolveValue({\n schema: propertyNames,\n context,\n });\n\n const resolvedConst = resolvedValue.originalSchema.const as unknown;\n const isStringConst =\n resolvedValue.type === 'string' && isString(resolvedConst);\n\n if (!resolvedValue.isEnum && !isStringConst) {\n return undefined;\n }\n\n return {\n value: resolvedValue.value,\n imports: resolvedValue.imports,\n dependencies: resolvedValue.dependencies,\n };\n}\n\n/**\n * Generate index signature key type based on propertyNames enum or const\n * Returns union type string like \"'foo' | 'bar'\", \"'x'\", or 'string' if neither\n */\nfunction getIndexSignatureKey(item: OpenApiSchemaObject): string {\n return getPropertyNamesEnumKeyType(item)?.value ?? 'string';\n}\n\nfunction getPropertyNamesRecordType(\n item: OpenApiSchemaObject,\n valueType: string,\n context: ContextSpec,\n): (PropertyNamesKeyType & { value: string }) | undefined {\n const keyType = getPropertyNamesKeyType(item, context);\n if (!keyType) {\n return undefined;\n }\n\n return {\n ...keyType,\n value: `Partial<Record<${keyType.value}, ${valueType}>>`,\n };\n}\n\n/**\n * Context for form request body (multipart/form-data and\n * application/x-www-form-urlencoded) type generation.\n * Discriminated union with two states:\n *\n * 1. `{ atPart: false, encoding }` - At form root, before property iteration\n * - May traverse through allOf/anyOf/oneOf to reach properties\n * - Carries encoding map so getObject can look up `encoding[key]`\n *\n * 2. `{ atPart: true, partContentType }` - At a multipart part (top-level property)\n * - `partContentType` = Encoding Object's `contentType` for this part\n * - Used by getScalar for file type detection (precedence over contentMediaType)\n * - Arrays pass this through to items; combiners inside arrays also get context\n *\n * `urlEncoded` marks an application/x-www-form-urlencoded body. Such bodies are\n * built with URLSearchParams, whose values are always strings, so getScalar\n * keeps file/binary fields as `string` instead of `Blob` (#1624).\n *\n * `undefined` means not in form context (or nested inside plain object field = JSON)\n */\nexport type FormDataContext =\n | {\n atPart: false;\n encoding: Record<string, { contentType?: string }>;\n urlEncoded?: boolean;\n }\n | { atPart: true; partContentType?: string; urlEncoded?: boolean };\n\ninterface GetObjectOptions {\n item: OpenApiSchemaObject;\n name?: string;\n context: ContextSpec;\n nullable: string;\n /**\n * Multipart/form-data context for file type handling.\n * @see FormDataContext\n */\n formDataContext?: FormDataContext;\n}\n\n/**\n * Return the output type from an object\n *\n * @param item item with type === \"object\"\n */\nexport function getObject({\n item,\n name,\n context,\n nullable,\n formDataContext,\n}: GetObjectOptions): ScalarValue {\n if (isReference(item)) {\n const { name } = getRefInfo(item.$ref as string, context);\n return {\n value: name + nullable,\n imports: [{ name }],\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: true,\n hasReadonlyProps: (item.readOnly as boolean | undefined) ?? false,\n dependencies: [name],\n example: item.example as unknown,\n examples: resolveExampleRefs(\n item.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n };\n }\n\n const schemaItem = item as OpenApiSchemaObject & Record<string, unknown>;\n const itemAllOf = schemaItem.allOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const itemOneOf = schemaItem.oneOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const itemAnyOf = schemaItem.anyOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const itemType = schemaItem.type as string | string[] | undefined;\n\n if (itemAllOf || itemOneOf || itemAnyOf) {\n const separator = itemAllOf ? 'allOf' : itemOneOf ? 'oneOf' : 'anyOf';\n\n return combineSchemas({\n schema: schemaItem,\n name,\n separator,\n context,\n nullable,\n formDataContext,\n });\n }\n\n if (Array.isArray(itemType)) {\n const typeArray = itemType;\n // Bridge: item is OpenApiSchemaObject which includes AnyOtherAttribute index signature.\n // Spreading it directly would carry `any` into the result. Cast to break the chain.\n const baseItem = schemaItem as Record<string, unknown>;\n return combineSchemas({\n schema: {\n anyOf: typeArray.map(\n (type) => ({ ...baseItem, type }) as OpenApiSchemaObject,\n ),\n },\n name,\n separator: 'anyOf',\n context,\n nullable,\n });\n }\n\n // Bridge assertion: item.properties is typed as { [name: string]: ReferenceObject | SchemaObject }\n // but AnyOtherAttribute index signature infects all property access to return `any`\n const itemProperties = schemaItem.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\n\n if (itemProperties && Object.entries(itemProperties).length > 0) {\n const entries = Object.entries(itemProperties);\n if (context.output.propertySortOrder === PropertySortOrder.ALPHABETICAL) {\n entries.sort((a, b) => {\n return a[0].localeCompare(b[0], 'en', {\n numeric: true,\n });\n });\n }\n const acc: ScalarValue = {\n imports: [],\n schemas: [],\n value: '',\n isEnum: false,\n type: 'object' as SchemaType,\n isRef: false,\n hasReadonlyProps: false,\n useTypeAlias: false,\n dependencies: [],\n example: schemaItem.example as unknown,\n examples: resolveExampleRefs(\n schemaItem.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n };\n const itemRequired = schemaItem.required as string[] | undefined;\n for (const [index, [key, schema]] of entries.entries()) {\n const isRequired = (\n Array.isArray(itemRequired) ? itemRequired : []\n ).includes(key);\n\n let propName = '';\n\n if (name) {\n const isKeyStartWithUnderscore = key.startsWith('_');\n\n propName += pascal(\n `${isKeyStartWithUnderscore ? '_' : ''}${name}_${key}`,\n );\n }\n\n const allSpecSchemas = context.spec.components?.schemas ?? {};\n\n const isNameAlreadyTaken = Object.keys(allSpecSchemas).some(\n (schemaName) => pascal(schemaName) === propName,\n );\n\n if (isNameAlreadyTaken) {\n propName = propName + 'Property';\n }\n\n // Transition form context: atPart: false → atPart: true\n // Look up encoding[key].contentType and pass to property resolution.\n // The urlEncoded flag is carried through so nested scalars stay strings.\n const propertyFormDataContext: FormDataContext | undefined =\n formDataContext && !formDataContext.atPart\n ? {\n atPart: true,\n partContentType: formDataContext.encoding[key]?.contentType, // eslint-disable-line @typescript-eslint/no-unnecessary-condition -- Record index access can return undefined at runtime\n urlEncoded: formDataContext.urlEncoded,\n }\n : undefined;\n\n const resolvedValue = resolveObject({\n schema,\n propName,\n context,\n formDataContext: propertyFormDataContext,\n });\n\n const isReadOnly =\n Boolean(schemaItem.readOnly) ||\n Boolean((schema as OpenApiSchemaObject).readOnly);\n if (!index) {\n acc.value += '{';\n }\n\n const doc = jsDoc(schema, true, context);\n const propertyDoc = doc\n ? `${doc\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n')}\\n`\n : '';\n\n // Propagate readonly state from nested schemas ($ref targets or inline\n // objects), not just this property's own readOnly flag. Otherwise an\n // object whose readonly props come solely from nested schemas is never\n // wrapped in `NonReadonly<>`, leaking the readonly modifier into request\n // body types. See issue #826.\n if (isReadOnly || resolvedValue.hasReadonlyProps) {\n acc.hasReadonlyProps = true;\n }\n\n const constValue =\n 'const' in schema ? (schema.const as unknown) : undefined;\n const hasConst = constValue !== undefined;\n let constLiteral: string | undefined;\n\n if (!hasConst) {\n constLiteral = undefined;\n } else if (isString(constValue)) {\n constLiteral = `'${escape(constValue)}'`;\n } else {\n constLiteral = JSON.stringify(constValue);\n }\n\n const needsValueImport =\n hasConst && (resolvedValue.isEnum || resolvedValue.type === 'enum');\n const usedResolvedValue = !hasConst || needsValueImport;\n\n const aliasedImports: GeneratorImport[] = needsValueImport\n ? resolvedValue.imports.map((imp) => ({ ...imp, isConstant: true }))\n : hasConst\n ? []\n : getAliasedImports({ name, context, resolvedValue });\n\n if (aliasedImports.length > 0) {\n acc.imports.push(...aliasedImports);\n }\n\n const alias = getImportAliasForRefOrValue({\n context,\n resolvedValue,\n imports: aliasedImports,\n });\n\n const propValue = needsValueImport ? alias : (constLiteral ?? alias);\n\n const finalPropValue = isRequired\n ? propValue\n : context.output.override.useNullForOptional === true\n ? `${propValue} | null`\n : propValue;\n\n acc.value += `\\n${propertyDoc}${\n isReadOnly && !context.output.override.suppressReadonlyModifier\n ? ' readonly '\n : ' '\n }${getKey(key)}${isRequired ? '' : '?'}: ${finalPropValue};`;\n if (usedResolvedValue) {\n acc.schemas.push(...resolvedValue.schemas);\n acc.dependencies.push(...resolvedValue.dependencies);\n }\n\n if (entries.length - 1 === index) {\n // Bridge assertion: additionalProperties is boolean | ReferenceObject | SchemaObject\n // but AnyOtherAttribute infects property access\n const additionalProps = schemaItem.additionalProperties as\n | boolean\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | undefined;\n if (additionalProps) {\n if (additionalProps === true) {\n const recordType = getPropertyNamesRecordType(\n schemaItem,\n 'unknown',\n context,\n );\n if (recordType) {\n acc.value += '\\n}';\n acc.value += ` & ${recordType.value}`;\n acc.useTypeAlias = true;\n acc.imports.push(...recordType.imports);\n acc.dependencies.push(...recordType.dependencies);\n } else {\n const keyType = getIndexSignatureKey(schemaItem);\n acc.value += `\\n [key: ${keyType}]: unknown;\\n }`;\n }\n } else {\n const resolvedValue = resolveValue({\n schema: additionalProps as\n | OpenApiSchemaObject\n | OpenApiReferenceObject,\n name,\n context,\n });\n const recordType = getPropertyNamesRecordType(\n schemaItem,\n resolvedValue.value,\n context,\n );\n if (recordType) {\n acc.value += '\\n}';\n acc.value += ` & ${recordType.value}`;\n acc.useTypeAlias = true;\n acc.imports.push(...recordType.imports);\n acc.dependencies.push(...recordType.dependencies);\n } else {\n const keyType = getIndexSignatureKey(schemaItem);\n acc.value += `\\n [key: ${keyType}]: ${resolvedValue.value};\\n}`;\n }\n acc.imports.push(...resolvedValue.imports);\n acc.schemas.push(...resolvedValue.schemas);\n acc.dependencies.push(...resolvedValue.dependencies);\n }\n } else {\n acc.value += '\\n}';\n }\n\n acc.value += nullable;\n }\n }\n return acc;\n }\n\n // Bridge assertion: additionalProperties is boolean | ReferenceObject | SchemaObject\n const outerAdditionalProps = schemaItem.additionalProperties as\n | boolean\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | undefined;\n const readOnlyFlag = schemaItem.readOnly as boolean | undefined;\n if (outerAdditionalProps) {\n if (outerAdditionalProps === true) {\n const recordType = getPropertyNamesRecordType(\n schemaItem,\n 'unknown',\n context,\n );\n if (recordType) {\n return {\n value: recordType.value + nullable,\n imports: recordType.imports,\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: true,\n dependencies: recordType.dependencies,\n };\n }\n const keyType = getIndexSignatureKey(schemaItem);\n return {\n value: `{ [key: ${keyType}]: unknown }` + nullable,\n imports: [],\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: false,\n dependencies: [],\n };\n }\n const resolvedValue = resolveValue({\n schema: outerAdditionalProps as\n | OpenApiSchemaObject\n | OpenApiReferenceObject,\n name,\n context,\n });\n const recordType = getPropertyNamesRecordType(\n schemaItem,\n resolvedValue.value,\n context,\n );\n if (recordType) {\n return {\n value: recordType.value + nullable,\n imports: [...recordType.imports, ...resolvedValue.imports],\n schemas: resolvedValue.schemas,\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: resolvedValue.hasReadonlyProps,\n useTypeAlias: true,\n dependencies: [\n ...recordType.dependencies,\n ...resolvedValue.dependencies,\n ],\n };\n }\n const keyType = getIndexSignatureKey(schemaItem);\n return {\n value: `{[key: ${keyType}]: ${resolvedValue.value}}` + nullable,\n imports: resolvedValue.imports,\n schemas: resolvedValue.schemas,\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: resolvedValue.hasReadonlyProps,\n useTypeAlias: false,\n dependencies: resolvedValue.dependencies,\n };\n }\n\n const constValue = schemaItem.const as unknown;\n if (constValue !== undefined) {\n let type: SchemaType;\n if (Array.isArray(constValue)) {\n type = 'array';\n } else if (constValue === null) {\n type = 'null';\n } else if (typeof constValue === 'string') {\n type = 'string';\n } else if (typeof constValue === 'number') {\n type = 'number';\n } else if (typeof constValue === 'boolean') {\n type = 'boolean';\n } else {\n type = 'object';\n }\n\n return {\n value:\n typeof constValue === 'string'\n ? `'${escape(constValue)}'`\n : JSON.stringify(constValue),\n imports: [],\n schemas: [],\n isEnum: false,\n type,\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n dependencies: [],\n };\n }\n\n const keyType =\n itemType === 'object' ? getIndexSignatureKey(schemaItem) : 'string';\n const recordType = getPropertyNamesRecordType(schemaItem, 'unknown', context);\n if (itemType === 'object' && recordType) {\n return {\n value: recordType.value + nullable,\n imports: recordType.imports,\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: true,\n dependencies: recordType.dependencies,\n };\n }\n return {\n value:\n (itemType === 'object' ? `{ [key: ${keyType}]: unknown }` : 'unknown') +\n nullable,\n imports: [],\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: false,\n dependencies: [],\n };\n}\n","import { isArray } from 'remeda';\n\nimport { resolveExampleRefs } from '../resolvers';\nimport type {\n ContextSpec,\n OpenApiSchemaObject,\n OpenApiSchemaObjectType,\n ScalarValue,\n} from '../types';\nimport { escape, isString } from '../utils';\nimport { getFormDataFieldFileType } from '../utils/content-type';\nimport { getArray } from './array';\nimport { combineSchemas } from './combine';\nimport type { FormDataContext } from './object';\nimport { getObject } from './object';\n\n/** Bridge type for enum values extracted from OpenAPI schemas infected by AnyOtherAttribute */\ntype SchemaEnumValue = string | number | boolean | null;\n\ninterface GetScalarOptions {\n item: OpenApiSchemaObject;\n name?: string;\n context: ContextSpec;\n formDataContext?: FormDataContext;\n}\n\n/**\n * Return the typescript equivalent of open-api data type\n *\n * @param item\n * @ref https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.1.md#data-types\n */\nexport function getScalar({\n item,\n name,\n context,\n formDataContext,\n}: GetScalarOptions): ScalarValue {\n // Bridge assertions: extract typed values from AnyOtherAttribute-infected schema\n const schemaEnum = item.enum as SchemaEnumValue[] | undefined;\n const schemaType = item.type as\n | OpenApiSchemaObjectType\n | OpenApiSchemaObjectType[]\n | undefined;\n const schemaReadOnly = item.readOnly as boolean | undefined;\n const schemaExample = item.example as unknown;\n const schemaExamples = item.examples as Parameters<\n typeof resolveExampleRefs\n >[0];\n const schemaConst = item.const as string | undefined;\n const schemaFormat = item.format as string | undefined;\n const schemaNullable = item.nullable as boolean | undefined;\n const schemaContentMediaType = item.contentMediaType as string | undefined;\n const schemaContentEncoding = item.contentEncoding as string | undefined;\n\n const nullable =\n (isArray(schemaType) && schemaType.includes('null')) ||\n schemaNullable === true\n ? ' | null'\n : '';\n\n const enumItems = schemaEnum?.filter(\n (enumItem): enumItem is Exclude<SchemaEnumValue, null> => enumItem !== null,\n );\n\n let itemType:\n | OpenApiSchemaObjectType\n | OpenApiSchemaObjectType[]\n | undefined = schemaType;\n if (!itemType && item.items) {\n item.type = 'array';\n itemType = 'array';\n }\n if (isArray(schemaType) && schemaType.includes('null')) {\n const typesWithoutNull = schemaType.filter(\n (x): x is OpenApiSchemaObjectType => x !== 'null',\n );\n itemType =\n typesWithoutNull.length === 1 ? typesWithoutNull[0] : typesWithoutNull;\n }\n\n switch (itemType) {\n case 'number':\n case 'integer': {\n let value =\n context.output.override.useBigInt &&\n (schemaFormat === 'int64' || schemaFormat === 'uint64')\n ? 'bigint'\n : 'number';\n let isEnum = false;\n\n if (enumItems) {\n value = enumItems.map((enumItem) => `${enumItem}`).join(' | ');\n isEnum = true;\n }\n\n value += nullable;\n\n if (schemaConst !== undefined) {\n value = schemaConst;\n }\n\n return {\n value,\n isEnum,\n type: 'number',\n schemas: [],\n imports: [],\n isRef: false,\n hasReadonlyProps: schemaReadOnly ?? false,\n dependencies: [],\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n }\n\n case 'boolean': {\n let value = 'boolean';\n\n if (\n enumItems &&\n !(enumItems.includes(true) && enumItems.includes(false))\n ) {\n value = enumItems.map((enumItem) => `${enumItem}`).join(' | ');\n }\n\n value += nullable;\n\n if (schemaConst !== undefined) {\n value = schemaConst;\n }\n\n return {\n value: value,\n type: 'boolean',\n isEnum: false,\n schemas: [],\n imports: [],\n isRef: false,\n hasReadonlyProps: schemaReadOnly ?? false,\n dependencies: [],\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n }\n\n case 'array': {\n const { value, ...rest } = getArray({\n schema: item,\n name,\n context,\n formDataContext,\n });\n return {\n value: value + nullable,\n ...rest,\n dependencies: rest.dependencies,\n };\n }\n\n case 'string': {\n let value = 'string';\n let isEnum = false;\n\n if (enumItems) {\n value = enumItems\n .map((enumItem) =>\n isString(enumItem) ? `'${escape(enumItem)}'` : `${enumItem}`,\n )\n .filter(Boolean)\n .join(` | `);\n\n isEnum = true;\n }\n\n // application/x-www-form-urlencoded bodies are built with URLSearchParams,\n // whose values are always strings. Skip Blob/file coercion so file/binary\n // fields stay `string`; enum unions computed above are left intact (#1624).\n if (!formDataContext?.urlEncoded) {\n if (schemaFormat === 'binary') {\n value = 'Blob';\n } else if (formDataContext?.atPart) {\n const fileType = getFormDataFieldFileType(\n item,\n formDataContext.partContentType,\n );\n if (fileType) {\n value = fileType === 'binary' ? 'Blob' : 'Blob | string';\n }\n } else if (\n schemaContentMediaType === 'application/octet-stream' &&\n !schemaContentEncoding\n ) {\n // The @scalar/openapi-parser upgrader converts format: binary to\n // contentMediaType: application/octet-stream when upgrading\n // Swagger 2.0 / OAS 3.0 → OAS 3.1. Treat it the same as\n // format: binary so $ref-based model types generate Blob.\n value = 'Blob';\n }\n }\n\n if (\n context.output.override.useDates &&\n (schemaFormat === 'date' || schemaFormat === 'date-time')\n ) {\n value = 'Date';\n }\n\n value += nullable;\n\n if (schemaConst) {\n value = `'${schemaConst}'`;\n }\n\n return {\n value: value,\n isEnum,\n type: 'string',\n imports: [],\n schemas: [],\n isRef: false,\n hasReadonlyProps: schemaReadOnly ?? false,\n dependencies: [],\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n }\n\n case 'null': {\n return {\n value: 'null',\n isEnum: false,\n type: 'null',\n imports: [],\n schemas: [],\n isRef: false,\n hasReadonlyProps: schemaReadOnly ?? false,\n dependencies: [],\n };\n }\n\n default: {\n if (isArray(itemType)) {\n const anyOfVariants = itemType.map((type) =>\n Object.assign({}, item, { type }),\n ) as OpenApiSchemaObject[];\n return combineSchemas({\n schema: { anyOf: anyOfVariants } as OpenApiSchemaObject,\n name,\n separator: 'anyOf',\n context,\n nullable,\n });\n }\n\n if (enumItems) {\n const value = enumItems\n .map((enumItem) =>\n isString(enumItem) ? `'${escape(enumItem)}'` : String(enumItem),\n )\n .filter(Boolean)\n .join(` | `);\n\n return {\n value: value + nullable,\n isEnum: true,\n type: 'string',\n imports: [],\n schemas: [],\n isRef: false,\n hasReadonlyProps: schemaReadOnly ?? false,\n dependencies: [],\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n }\n\n // Determine if we should pass form-data context:\n // - atPart: false -> always pass (navigating to properties)\n // - atPart: true + combiner -> pass (combiner members are still the same part)\n // - atPart: true + plain object -> don't pass (nested properties are JSON)\n const hasCombiners = (item.allOf ?? item.anyOf ?? item.oneOf) as\n | unknown[]\n | undefined;\n const shouldPassContext =\n formDataContext?.atPart === false ||\n (formDataContext?.atPart && hasCombiners);\n\n const { value, ...rest } = getObject({\n item,\n name,\n context,\n nullable,\n formDataContext: shouldPassContext ? formDataContext : undefined,\n });\n return { value: value, ...rest };\n }\n }\n}\n","import { isNullish, unique } from 'remeda';\n\nimport { resolveExampleRefs, resolveObject } from '../resolvers';\nimport {\n type ContextSpec,\n EnumGeneration,\n type GeneratorImport,\n type GeneratorSchema,\n type OpenApiReferenceObject,\n type OpenApiSchemaObject,\n type ScalarValue,\n SchemaType,\n} from '../types';\nimport { dedupeUnionType, getNumberWord, isSchema, pascal } from '../utils';\nimport { getCombinedEnumValue } from './enum';\nimport { getAliasedImports, getImportAliasForRefOrValue } from './imports';\nimport type { FormDataContext } from './object';\nimport { getScalar } from './scalar';\n\ninterface CombinedData {\n imports: GeneratorImport[];\n schemas: GeneratorSchema[];\n originalSchema: (OpenApiSchemaObject | undefined)[];\n values: string[];\n isRef: boolean[];\n isEnum: boolean[];\n types: string[];\n hasReadonlyProps: boolean;\n dependencies: string[];\n /**\n * List of all properties in all subschemas\n * - used to add missing properties in subschemas to avoid TS error described in @see https://github.com/orval-labs/orval/issues/935\n */\n allProperties: string[];\n requiredProperties: string[];\n example?: unknown;\n examples?: Record<string, unknown> | unknown[];\n}\n\ntype Separator = 'allOf' | 'anyOf' | 'oneOf';\nconst mergeableAllOfKeys = new Set(['type', 'properties', 'required']);\n\nfunction isMergeableAllOfObject(schema: OpenApiSchemaObject): boolean {\n // Must have properties to be worth merging\n if (isNullish(schema.properties)) {\n return false;\n }\n\n // Cannot merge if it contains nested composition\n if (schema.allOf || schema.anyOf || schema.oneOf) {\n return false;\n }\n\n // Only object types can be merged\n if (!isNullish(schema.type) && schema.type !== 'object') {\n return false;\n }\n\n // Only merge schemas with safe keys (type, properties, required)\n return Object.keys(schema).every((key) => mergeableAllOfKeys.has(key));\n}\n\nfunction normalizeAllOfSchema(\n schema: OpenApiSchemaObject,\n): OpenApiSchemaObject {\n // Bridge assertions: AnyOtherAttribute infects all schema property access\n const schemaAllOf = schema.allOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n if (!schemaAllOf) {\n return schema;\n }\n\n let didMerge = false;\n const schemaProperties = schema.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\n const schemaRequired = schema.required as string[] | undefined;\n const mergedProperties: Record<\n string,\n OpenApiSchemaObject | OpenApiReferenceObject\n > = schemaProperties ? { ...schemaProperties } : {};\n const mergedRequired = new Set(schemaRequired);\n const remainingAllOf: (OpenApiSchemaObject | OpenApiReferenceObject)[] = [];\n\n for (const subSchema of schemaAllOf) {\n if (isSchema(subSchema) && isMergeableAllOfObject(subSchema)) {\n didMerge = true;\n if (subSchema.properties) {\n Object.assign(mergedProperties, subSchema.properties);\n }\n const subRequired = subSchema.required as string[] | undefined;\n if (subRequired) {\n for (const prop of subRequired) {\n mergedRequired.add(prop);\n }\n }\n continue;\n }\n\n remainingAllOf.push(subSchema);\n }\n\n if (!didMerge || remainingAllOf.length === 0) {\n return schema;\n }\n\n return {\n ...(schema as Record<string, unknown>),\n ...(Object.keys(mergedProperties).length > 0 && {\n properties: mergedProperties,\n }),\n ...(mergedRequired.size > 0 && { required: [...mergedRequired] }),\n ...(remainingAllOf.length > 0 && { allOf: remainingAllOf }),\n } as OpenApiSchemaObject;\n}\n\ninterface CombineValuesOptions {\n resolvedData: CombinedData;\n resolvedValue?: ScalarValue;\n separator: Separator;\n context: ContextSpec;\n parentSchema?: OpenApiSchemaObject;\n}\n\nfunction combineValues({\n resolvedData,\n resolvedValue,\n separator,\n context,\n parentSchema,\n}: CombineValuesOptions) {\n const isAllEnums = resolvedData.isEnum.every(Boolean);\n\n if (isAllEnums) {\n return `${resolvedData.values.join(` | `)}${\n resolvedValue ? ` | ${resolvedValue.value}` : ''\n }`;\n }\n\n if (separator === 'allOf') {\n // Wrap values containing unions in parens to preserve precedence\n // e.g. allOf: [A, oneOf: [B, C]] should be A & (B | C), not A & B | C\n let resolvedDataValue = resolvedData.values\n .map((v) => (v.includes(' | ') ? `(${v})` : v))\n .join(` & `);\n if (resolvedData.originalSchema.length > 0 && resolvedValue) {\n // Bridge: discriminator is typed but AnyOtherAttribute infects access\n interface Discriminator {\n propertyName?: string;\n mapping?: Record<string, string>;\n }\n const discriminatedPropertySchemas = resolvedData.originalSchema.filter(\n (s) => {\n const disc = s?.discriminator as Discriminator | undefined;\n return disc && resolvedValue.value.includes(` ${disc.propertyName}:`);\n },\n ) as OpenApiSchemaObject[];\n if (discriminatedPropertySchemas.length > 0) {\n resolvedDataValue = `Omit<${resolvedDataValue}, '${discriminatedPropertySchemas.map((s) => (s.discriminator as Discriminator | undefined)?.propertyName).join(\"' | '\")}'>`;\n }\n }\n // Also wrap resolvedValue if it contains union (sibling pattern: allOf + oneOf at same level)\n const resolvedValueStr = resolvedValue?.value.includes(' | ')\n ? `(${resolvedValue.value})`\n : resolvedValue?.value;\n const joined = `${resolvedDataValue}${\n resolvedValue ? ` & ${resolvedValueStr}` : ''\n }`;\n\n // Parent object may have set required properties that only exist in child\n // objects. Make sure the resulting object has these properties as required,\n // but there is no need to override properties that are already required\n const overrideRequiredProperties = resolvedData.requiredProperties.filter(\n (prop) =>\n !resolvedData.originalSchema.some((schema) => {\n const props = schema?.properties as\n | Record<string, unknown>\n | undefined;\n const req = schema?.required as string[] | undefined;\n return props?.[prop] && req?.includes(prop);\n }) &&\n !((): boolean => {\n const parentProps = parentSchema?.properties as\n | Record<string, unknown>\n | undefined;\n const parentReq = parentSchema?.required as string[] | undefined;\n return !!(parentProps?.[prop] && parentReq?.includes(prop));\n })(),\n );\n if (overrideRequiredProperties.length > 0) {\n return `${joined} & Required<Pick<${joined}, '${overrideRequiredProperties.join(\"' | '\")}'>>`;\n }\n return joined;\n }\n\n let values = resolvedData.values;\n const hasObjectSubschemas = resolvedData.allProperties.length;\n if (hasObjectSubschemas && context.output.unionAddMissingProperties) {\n values = []; // the list of values will be rebuilt to add missing properties (if exist) in subschemas\n for (let i = 0; i < resolvedData.values.length; i += 1) {\n const subSchema = resolvedData.originalSchema[i];\n if (subSchema?.type !== 'object' || !subSchema.properties) {\n values.push(resolvedData.values[i]);\n continue;\n }\n\n const subSchemaProps = subSchema.properties as Record<string, unknown>;\n const missingProperties = unique(\n resolvedData.allProperties.filter(\n (p) => !Object.keys(subSchemaProps).includes(p),\n ),\n );\n values.push(\n `${resolvedData.values[i]}${\n missingProperties.length > 0\n ? ` & {${missingProperties.map((p) => `${p}?: never`).join('; ')}}`\n : ''\n }`,\n );\n }\n }\n\n if (resolvedValue) {\n return `(${values.join(` & ${resolvedValue.value}) | (`)} & ${\n resolvedValue.value\n })`;\n }\n\n return values.join(' | ');\n}\n\nexport function combineSchemas({\n name,\n schema,\n separator,\n context,\n nullable,\n formDataContext,\n}: {\n name?: string;\n schema: OpenApiSchemaObject;\n separator: Separator;\n context: ContextSpec;\n nullable: string;\n formDataContext?: FormDataContext;\n}): ScalarValue {\n // Normalize allOf schemas by merging inline objects into parent (fixes #2458)\n // Only applies when: using allOf, not in v7 compat mode, no sibling oneOf/anyOf\n const canMergeInlineAllOf =\n separator === 'allOf' &&\n !context.output.override.aliasCombinedTypes &&\n !schema.oneOf &&\n !schema.anyOf;\n\n const normalizedSchema = canMergeInlineAllOf\n ? normalizeAllOfSchema(schema)\n : schema;\n\n // Bridge assertions: AnyOtherAttribute infects all schema property access\n const items = (normalizedSchema[separator] ?? []) as (\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n )[];\n\n const resolvedData: CombinedData = {\n values: [],\n imports: [],\n schemas: [],\n isEnum: [], // check if only enums\n isRef: [],\n types: [],\n dependencies: [],\n originalSchema: [],\n allProperties: [],\n hasReadonlyProps: false,\n example: schema.example as unknown,\n examples: resolveExampleRefs(\n schema.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n requiredProperties:\n separator === 'allOf'\n ? ((schema.required as string[] | undefined) ?? [])\n : [],\n };\n for (const subSchema of items) {\n // aliasCombinedTypes (v7 compat): create intermediate types like ResponseAnyOf\n // v8 default: propName stays undefined so combined types are inlined directly\n let propName: string | undefined;\n if (context.output.override.aliasCombinedTypes) {\n propName = name ? name + pascal(separator) : undefined;\n if (propName && resolvedData.schemas.length > 0) {\n propName =\n propName + pascal(getNumberWord(resolvedData.schemas.length + 1));\n }\n }\n\n if (separator === 'allOf' && isSchema(subSchema) && subSchema.required) {\n resolvedData.requiredProperties.push(...(subSchema.required as string[]));\n }\n\n const resolvedValue = resolveObject({\n schema: subSchema,\n propName,\n combined: true,\n context,\n formDataContext,\n });\n\n const aliasedImports = getAliasedImports({\n context,\n name,\n resolvedValue,\n });\n\n const value = getImportAliasForRefOrValue({\n context,\n resolvedValue,\n imports: aliasedImports,\n });\n\n resolvedData.values.push(value);\n resolvedData.imports.push(...aliasedImports);\n resolvedData.schemas.push(...resolvedValue.schemas);\n resolvedData.dependencies.push(...resolvedValue.dependencies);\n resolvedData.isEnum.push(resolvedValue.isEnum);\n resolvedData.types.push(resolvedValue.type);\n resolvedData.isRef.push(resolvedValue.isRef);\n resolvedData.originalSchema.push(resolvedValue.originalSchema);\n if (resolvedValue.hasReadonlyProps) {\n resolvedData.hasReadonlyProps = true;\n }\n\n // Bridge: originalSchema.properties is infected by AnyOtherAttribute\n const originalProps = resolvedValue.originalSchema.properties as\n | Record<string, unknown>\n | undefined;\n if (resolvedValue.type === 'object' && originalProps) {\n resolvedData.allProperties.push(...Object.keys(originalProps));\n }\n }\n\n const isAllEnums = resolvedData.isEnum.every(Boolean);\n const isAvailableToGenerateCombinedEnum =\n isAllEnums &&\n name &&\n items.length > 1 &&\n context.output.override.enumGenerationType !== EnumGeneration.UNION;\n\n // Only generate a combined const when enum values exist at runtime.\n if (isAvailableToGenerateCombinedEnum) {\n const {\n value: combinedEnumValue,\n valueImports,\n hasNull,\n } = getCombinedEnumValue(\n resolvedData.values.map((value, index) => ({\n value,\n isRef: resolvedData.isRef[index],\n schema: resolvedData.originalSchema[index],\n })),\n );\n const newEnum = `export const ${pascal(name)} = ${combinedEnumValue}`;\n const valueImportSet = new Set(valueImports);\n const enumNullSuffix =\n hasNull && !nullable.includes('null') ? ' | null' : '';\n const typeSuffix = `${nullable}${enumNullSuffix}`;\n\n return {\n value: `typeof ${pascal(name)}[keyof typeof ${pascal(name)}]${typeSuffix}`,\n imports: [\n {\n name: pascal(name),\n },\n ],\n schemas: [\n ...resolvedData.schemas,\n {\n imports: resolvedData.imports\n .filter((toImport) =>\n valueImportSet.has(toImport.alias ?? toImport.name),\n )\n .map<GeneratorImport>((toImport) => ({\n ...toImport,\n values: true,\n })),\n model: newEnum,\n name: name,\n },\n ],\n isEnum: false,\n type: 'object' as SchemaType,\n isRef: false,\n hasReadonlyProps: resolvedData.hasReadonlyProps,\n dependencies: resolvedData.dependencies,\n example: schema.example as unknown,\n examples: resolveExampleRefs(\n schema.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n };\n }\n\n let resolvedValue: ScalarValue | undefined;\n\n const normalizedProperties = normalizedSchema.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\n const schemaOneOf = schema.oneOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const schemaAnyOf = schema.anyOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n\n if (normalizedProperties) {\n resolvedValue = getScalar({\n item: Object.fromEntries(\n Object.entries(normalizedSchema).filter(([key]) => key !== separator),\n ),\n name,\n context,\n formDataContext,\n });\n } else if (separator === 'allOf' && (schemaOneOf || schemaAnyOf)) {\n // Handle sibling pattern: allOf + oneOf/anyOf at same level\n // e.g. { allOf: [A], oneOf: [B, C] } should produce A & (B | C)\n const siblingCombiner = schemaOneOf ? 'oneOf' : 'anyOf';\n const siblingSchemas = schemaOneOf ?? schemaAnyOf;\n resolvedValue = combineSchemas({\n schema: { [siblingCombiner]: siblingSchemas },\n name,\n separator: siblingCombiner,\n context,\n nullable: '',\n });\n }\n\n const value = combineValues({\n resolvedData,\n separator,\n resolvedValue,\n context,\n parentSchema: normalizedSchema,\n });\n\n return {\n value: dedupeUnionType(value + nullable),\n imports: resolvedValue\n ? [...resolvedData.imports, ...resolvedValue.imports]\n : resolvedData.imports,\n schemas: resolvedValue\n ? [...resolvedData.schemas, ...resolvedValue.schemas]\n : resolvedData.schemas,\n dependencies: resolvedValue\n ? [...resolvedData.dependencies, ...resolvedValue.dependencies]\n : resolvedData.dependencies,\n isEnum: false,\n type: 'object' as SchemaType,\n isRef: false,\n hasReadonlyProps:\n resolvedData.hasReadonlyProps ||\n (resolvedValue?.hasReadonlyProps ?? false),\n example: schema.example as unknown,\n examples: resolveExampleRefs(\n schema.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n };\n}\n","import { isArray, isBoolean } from 'remeda';\n\nimport type { ContextSpec, OpenApiSchemasObject } from '../types';\nimport { getPropertySafe, isReference, pascal } from '../utils';\nimport { getRefInfo } from './ref';\n\nexport function resolveDiscriminators(\n schemas: OpenApiSchemasObject,\n context: ContextSpec,\n): OpenApiSchemasObject {\n const transformedSchemas = schemas;\n for (const schema of Object.values(transformedSchemas)) {\n if (isBoolean(schema)) {\n continue; // skip boolean schemas as we can't do anything meaningful with them\n }\n\n // Some specs incorrectly nest `oneOf` under `discriminator`.\n // hoist it to the schema level so union generation still works.\n const discriminator = schema.discriminator as\n | { oneOf?: OpenApiSchemasObject[string][] }\n | undefined;\n\n if (!schema.oneOf && isArray(discriminator?.oneOf)) {\n schema.oneOf = discriminator.oneOf;\n }\n\n if (schema.discriminator?.mapping) {\n const { mapping, propertyName } = schema.discriminator;\n\n for (const [mappingKey, mappingValue] of Object.entries(mapping)) {\n let subTypeSchema;\n\n try {\n const { originalName } = getRefInfo(mappingValue, context);\n // name from getRefInfo may contain a suffix, which we don't want\n const name = pascal(originalName);\n subTypeSchema =\n transformedSchemas[name] ?? transformedSchemas[originalName];\n } catch {\n subTypeSchema = transformedSchemas[mappingValue];\n }\n\n if (isBoolean(subTypeSchema) || propertyName === undefined) {\n continue;\n }\n\n const property = subTypeSchema.properties?.[propertyName];\n if (isBoolean(property)) {\n continue;\n }\n\n const schemaProperty =\n property && !isReference(property) ? property : undefined;\n\n const enumProperty = schemaProperty\n ? getPropertySafe(schemaProperty, 'enum')\n : { hasProperty: false as const, value: undefined };\n\n const enumValues: unknown[] | undefined =\n enumProperty.hasProperty && Array.isArray(enumProperty.value)\n ? enumProperty.value\n : undefined;\n\n const propertyType =\n (schemaProperty?.type as string | undefined) ?? 'string';\n\n let typedMappingKey: string | number | boolean = mappingKey;\n if (propertyType === 'boolean') {\n typedMappingKey = mappingKey === 'true';\n } else if (propertyType === 'number' || propertyType === 'integer') {\n const parsed = Number(mappingKey);\n if (!Number.isNaN(parsed)) {\n typedMappingKey = parsed;\n }\n }\n\n const mergedEnumValues = [\n ...(enumValues ?? []).filter((value) => value !== typedMappingKey),\n typedMappingKey,\n ];\n\n // @see https://github.com/orval-labs/orval/issues/3139\n const mergedProperty = {\n ...schemaProperty,\n type: propertyType,\n enum: mergedEnumValues,\n };\n delete (mergedProperty as Record<string, unknown>).const;\n\n subTypeSchema.properties = {\n ...subTypeSchema.properties,\n [propertyName]: mergedProperty,\n };\n subTypeSchema.required = [\n ...new Set([...(subTypeSchema.required ?? []), propertyName]),\n ];\n }\n }\n }\n\n return transformedSchemas;\n}\n","import { type OpenApiOperationObject, Verbs } from '../types';\nimport { isString, pascal, sanitize } from '../utils';\n\nexport function getOperationId(\n operation: OpenApiOperationObject,\n route: string,\n verb: Verbs,\n): string {\n if (isString(operation.operationId)) {\n return operation.operationId;\n }\n\n return pascal(\n [\n verb,\n ...route.split('/').map((p) =>\n sanitize(p, {\n dash: true,\n underscore: '-',\n dot: '-',\n whitespace: '-',\n }),\n ),\n ].join('-'),\n );\n}\n","import { resolveRef } from '../resolvers/ref';\nimport type {\n ContextSpec,\n GetterParameters,\n OpenApiParameterObject,\n OpenApiReferenceObject,\n} from '../types';\nimport { isReference } from '../utils';\nimport { isComponentRef } from './ref';\n\ninterface GetParametersOptions {\n parameters: (OpenApiReferenceObject | OpenApiParameterObject)[];\n context: ContextSpec;\n}\n\nexport function getParameters({\n parameters,\n context,\n}: GetParametersOptions): GetterParameters {\n const result: GetterParameters = { path: [], query: [], header: [] };\n for (const p of parameters) {\n if (isReference(p)) {\n const { schema, imports } = resolveRef(p, context);\n const parameter = schema as OpenApiParameterObject;\n\n const location = parameter.in;\n if (\n location === 'path' ||\n location === 'query' ||\n location === 'header'\n ) {\n // Refs that don't target a named component slot (e.g. bundler-emitted\n // `#/paths/.../parameters/0`) have no corresponding `export type` from\n // `generateParameterDefinition`, so emitting a named import would\n // dangle. Inline the resolved parameter's schema instead. Mirrors the\n // #398 fix in `resolvers/value.ts`. See issue #1879.\n const safeImports = p.$ref && isComponentRef(p.$ref) ? imports : [];\n result[location].push({ parameter, imports: safeImports });\n }\n } else {\n if (p.in === 'query' || p.in === 'path' || p.in === 'header') {\n result[p.in].push({ parameter: p, imports: [] });\n }\n }\n }\n return result;\n}\n","import { resolveValue } from '../resolvers';\nimport type {\n ContextSpec,\n GetterParameters,\n GetterParams,\n NormalizedOutputOptions,\n} from '../types';\nimport { camel, sanitize, stringify } from '../utils';\n\n/**\n * Return every params in a path\n *\n * @example\n * ```\n * getParamsInPath(\"/pet/{category}/{name}/\");\n * // => [\"category\", \"name\"]\n * ```\n * @param path\n */\nexport function getParamsInPath(path: string) {\n let n;\n const output = [];\n const templatePathRegex = /\\{(.*?)\\}/g;\n while ((n = templatePathRegex.exec(path)) !== null) {\n output.push(n[1]);\n }\n\n return output;\n}\n\ninterface GetParamsOptions {\n route: string;\n pathParams?: GetterParameters['query'];\n operationId: string;\n context: ContextSpec;\n output: NormalizedOutputOptions;\n}\n\nexport function getParams({\n route,\n pathParams = [],\n operationId,\n context,\n output,\n}: GetParamsOptions): GetterParams {\n const params = getParamsInPath(route);\n return params.map((p) => {\n const pathParam = pathParams.find(\n ({ parameter }) =>\n sanitize(camel(parameter.name), {\n es5keyword: true,\n underscore: true,\n dash: true,\n }) === p,\n );\n\n if (!pathParam) {\n throw new Error(\n `The path params ${p} can't be found in parameters (${operationId})`,\n );\n }\n\n const {\n name: nameWithoutSanitize,\n required = false,\n schema,\n } = pathParam.parameter;\n\n const name = sanitize(camel(nameWithoutSanitize), { es5keyword: true });\n\n if (!schema) {\n return {\n name,\n definition: `${name}${required ? '' : '?'}: unknown`,\n implementation: `${name}${required ? '' : '?'}: unknown`,\n default: false,\n required,\n imports: [],\n };\n }\n\n const resolvedValue = resolveValue({\n schema,\n context,\n });\n\n const originalSchema = resolvedValue.originalSchema;\n\n // Bridge assertion: .default returns any due to AnyOtherAttribute on OpenApiSchemaObject\n const schemaDefault = originalSchema.default as\n | string\n | Record<string, unknown>\n | unknown[]\n | undefined;\n\n let paramType = resolvedValue.value;\n if (output.allParamsOptional) {\n paramType = `${paramType} | undefined | null`; // TODO: maybe check that `paramType` isn't already undefined or null\n }\n\n const definition = `${name}${\n !required || schemaDefault ? '?' : ''\n }: ${paramType}`;\n\n const implementation = `${name}${!required && !schemaDefault ? '?' : ''}${\n schemaDefault\n ? `: ${paramType} = ${stringify(schemaDefault)}`\n : `: ${paramType}` // FIXME: in Vue if we have `version: MaybeRef<number | undefined | null> = 1` and we don't pass version, the unref(version) will be `undefined` and not `1`, so we need to handle default value somewhere in implementation and not in the definition\n }`;\n\n return {\n name,\n definition,\n implementation,\n default: schemaDefault,\n required,\n imports: resolvedValue.imports,\n originalSchema,\n };\n });\n}\n","import {\n type ContextSpec,\n type GetterBody,\n type GetterParams,\n type GetterProps,\n GetterPropType,\n type GetterQueryParam,\n} from '../types';\nimport { isNullish, pascal, sortByPriority, stringify } from '../utils';\n\ninterface GetPropsOptions {\n body: GetterBody;\n queryParams?: GetterQueryParam;\n params: GetterParams;\n operationName: string;\n headers?: GetterQueryParam;\n context: ContextSpec;\n}\n\nexport function getProps({\n body,\n queryParams,\n params,\n operationName,\n headers,\n context,\n}: GetPropsOptions): GetterProps {\n const bodyProp = {\n name: body.implementation,\n definition: `${body.implementation}${body.isOptional && !context.output.optionsParamRequired ? '?' : ''}: ${body.definition}`,\n implementation: `${body.implementation}${body.isOptional && !context.output.optionsParamRequired ? '?' : ''}: ${body.definition}`,\n default: false,\n required: !body.isOptional || context.output.optionsParamRequired,\n type: GetterPropType.BODY,\n };\n\n const queryParamsProp = {\n name: 'params',\n definition: getQueryParamDefinition(queryParams, context),\n implementation: getQueryParamDefinition(queryParams, context),\n default: false,\n required: isNullish(queryParams?.isOptional)\n ? !context.output.allParamsOptional || context.output.optionsParamRequired\n : (!queryParams.isOptional && !context.output.allParamsOptional) ||\n context.output.optionsParamRequired,\n type: GetterPropType.QUERY_PARAM,\n };\n\n const headersProp = {\n name: 'headers',\n definition: `headers${headers?.isOptional && !context.output.optionsParamRequired ? '?' : ''}: ${\n headers?.schema.name\n }`,\n implementation: `headers${headers?.isOptional && !context.output.optionsParamRequired ? '?' : ''}: ${\n headers?.schema.name\n }`,\n default: false,\n required: isNullish(headers?.isOptional)\n ? false\n : !headers.isOptional || context.output.optionsParamRequired,\n type: GetterPropType.HEADER,\n };\n\n let paramGetterProps: GetterProps;\n if (context.output.override.useNamedParameters && params.length > 0) {\n const parameterTypeName = `${pascal(operationName)}PathParameters`;\n\n const name = 'pathParams';\n\n // needs a special model\n const namedParametersTypeDefinition = `export type ${parameterTypeName} = {\\n ${params\n .map((property) => property.definition)\n .join(',\\n ')},\\n }`;\n\n const isOptional =\n context.output.optionsParamRequired ||\n params.every((param) => param.default !== undefined);\n\n const implementation = `{ ${params\n .map(\n (property) =>\n property.default === undefined\n ? property.name\n : `${property.name} = ${stringify(property.default)}`, // if we use property.implementation, we will get `{ version: number = 1 }: ListPetsPathParameters = {}` which isn't valid\n )\n .join(', ')} }: ${parameterTypeName}${isOptional ? ' = {}' : ''}`;\n\n const destructured = `{ ${params\n .map((property) => property.name)\n .join(', ')} }`;\n\n paramGetterProps = [\n {\n type: GetterPropType.NAMED_PATH_PARAMS,\n name,\n definition: `${name}: ${parameterTypeName}`,\n implementation,\n default: false,\n destructured,\n required: true,\n schema: {\n name: parameterTypeName,\n model: namedParametersTypeDefinition,\n imports: params.flatMap((property) => property.imports),\n },\n },\n ];\n } else {\n paramGetterProps = params.map((param) => ({\n ...param,\n type: GetterPropType.PARAM,\n }));\n }\n\n const props = [\n ...paramGetterProps,\n ...(body.definition ? [bodyProp] : []),\n ...(queryParams ? [queryParamsProp] : []),\n ...(headers ? [headersProp] : []),\n ];\n\n const sortedProps = sortByPriority(props);\n\n return sortedProps;\n}\n\nfunction getQueryParamDefinition(\n queryParams: GetterQueryParam | undefined,\n context: ContextSpec,\n): string {\n const paramType = queryParams?.schema.name;\n return `params${(queryParams?.isOptional || context.output.allParamsOptional) && !context.output.optionsParamRequired ? '?' : ''}: ${paramType}`;\n}\n","import { resolveValue } from '../resolvers';\nimport type {\n ContextSpec,\n GeneratorImport,\n GeneratorSchema,\n GetterParameters,\n GetterQueryParam,\n OpenApiParameterObject,\n OpenApiSchemaObject,\n} from '../types';\nimport { jsDoc, pascal, sanitize } from '../utils';\nimport { getEnum, getEnumDescriptions, getEnumNames } from './enum';\nimport { getKey } from './keys';\n\ninterface QueryParamsType {\n name: string;\n required: boolean;\n definition: string;\n imports: GeneratorImport[];\n schemas: GeneratorSchema[];\n originalSchema: OpenApiSchemaObject;\n}\n\nconst isOpenApiSchemaObject = (\n value: unknown,\n): value is OpenApiSchemaObject => {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n return !('$ref' in value);\n};\n\n/**\n * A `$ref` schema object (e.g. array `items` or a oneOf/anyOf/allOf variant\n * pointing at a component). We don't resolve the reference here, but a query\n * parameter behind a `$ref` is virtually always a complex (object-like) type,\n * so it must be treated as non-primitive. Over-flagging is harmless: the only\n * consumer (the Angular `nonPrimitiveKeys` passthrough) is gated on a\n * configured `paramsSerializer`, which is precisely what handles raw values.\n */\nconst isRefObject = (value: unknown): boolean =>\n !!value && typeof value === 'object' && '$ref' in value;\n\nconst getSchemaType = (\n schema: OpenApiSchemaObject,\n): string | string[] | undefined => {\n const type = (schema as { type?: unknown }).type;\n\n if (typeof type === 'string') {\n return type;\n }\n\n if (\n Array.isArray(type) &&\n type.every((variant): variant is string => typeof variant === 'string')\n ) {\n return type;\n }\n\n return undefined;\n};\n/**\n * Detects whether a query parameter's resolved schema is non-primitive — i.e.\n * an object, an array of objects, or a composition (oneOf/anyOf/allOf) that\n * resolves to a non-primitive shape.\n *\n * Used by Angular generators so the default `filterParams` helper preserves\n * such values instead of silently dropping them. Angular's `HttpParams` only\n * accepts primitives, but a user-provided `paramsSerializer`, `mutator`, or\n * `paramsFilter` may need the raw object to flatten or stringify it.\n */\nconst isSchemaNonPrimitive = (schema: OpenApiSchemaObject): boolean => {\n const schemaType = getSchemaType(schema);\n const type = Array.isArray(schemaType)\n ? schemaType.filter((variant) => variant !== 'null')\n : schemaType;\n const additionalProperties = (schema as { additionalProperties?: unknown })\n .additionalProperties;\n\n if (type === 'object') {\n return true;\n }\n if (Array.isArray(type) && type.includes('object')) {\n return true;\n }\n if (type === 'array' || (Array.isArray(type) && type.includes('array'))) {\n const items = (schema as { items?: unknown }).items;\n if (isOpenApiSchemaObject(items)) {\n return isSchemaNonPrimitive(items);\n }\n // Arrays with missing/unknown `items` are still non-primitive for our\n // Angular passthrough purposes: without a serializer/filter, HttpParams\n // cannot safely represent them. `$ref` items also land here because\n // isOpenApiSchemaObject rejects references.\n return true;\n }\n\n const compositions = [\n ...(Array.isArray(schema.oneOf) ? (schema.oneOf as unknown[]) : []),\n ...(Array.isArray(schema.anyOf) ? (schema.anyOf as unknown[]) : []),\n ...(Array.isArray(schema.allOf) ? (schema.allOf as unknown[]) : []),\n ];\n if (compositions.length > 0) {\n return compositions.some((variant) =>\n isOpenApiSchemaObject(variant)\n ? isSchemaNonPrimitive(variant)\n : isRefObject(variant),\n );\n }\n\n if (\n !type &&\n ((schema as { properties?: unknown }).properties !== undefined ||\n (additionalProperties !== undefined && additionalProperties !== false))\n ) {\n return true;\n }\n return false;\n};\n\nconst isSchemaNullable = (schema: OpenApiSchemaObject): boolean => {\n if (schema.nullable === true) {\n return true;\n }\n\n if (schema.type === 'null') {\n return true;\n }\n\n if (Array.isArray(schema.type) && schema.type.includes('null')) {\n return true;\n }\n\n const oneOfVariants = Array.isArray(schema.oneOf)\n ? (schema.oneOf as unknown[])\n : [];\n const anyOfVariants = Array.isArray(schema.anyOf)\n ? (schema.anyOf as unknown[])\n : [];\n const variants = [...oneOfVariants, ...anyOfVariants];\n\n return variants.some((variant) => {\n if (!isOpenApiSchemaObject(variant)) {\n return false;\n }\n\n return isSchemaNullable(variant);\n });\n};\n\nfunction getQueryParamsTypes(\n queryParams: GetterParameters['query'],\n operationName: string,\n context: ContextSpec,\n): QueryParamsType[] {\n return queryParams.map(({ parameter, imports: parameterImports }) => {\n const {\n name,\n required,\n schema: schemaParam,\n content,\n } = parameter as {\n name: string;\n required: boolean;\n schema: OpenApiSchemaObject | undefined;\n content: OpenApiParameterObject['content'];\n };\n\n const queryName = sanitize(`${pascal(operationName)}${pascal(name)}`, {\n underscore: '_',\n whitespace: '_',\n dash: true,\n es5keyword: true,\n es5IdentifierName: true,\n });\n\n const schema = schemaParam ?? content?.['application/json']?.schema;\n if (!schema) {\n throw new Error(\n `Query parameter \"${name}\" has no schema or content definition`,\n );\n }\n\n const resolvedValue = resolveValue({\n schema,\n context,\n name: queryName,\n });\n\n const key = getKey(name);\n // Bridge assertion: cast schema to jsDoc's expected parameter shape\n // to avoid AnyOtherAttribute spreading error type\n const schemaForDoc = schema as {\n description?: string | string[];\n deprecated?: boolean;\n summary?: string;\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n minItems?: number;\n maxItems?: number;\n type?: string | string[];\n pattern?: string;\n };\n const doc = jsDoc(\n {\n description: parameter.description,\n ...schemaForDoc,\n },\n void 0,\n context,\n );\n\n if (parameterImports.length > 0) {\n return {\n name,\n required,\n definition: `${doc}${key}${!required || schema.default ? '?' : ''}: ${\n parameterImports[0].name\n };`,\n imports: parameterImports,\n schemas: [],\n originalSchema: resolvedValue.originalSchema,\n };\n }\n\n if (resolvedValue.isEnum && !resolvedValue.isRef) {\n const enumName = queryName;\n const enumValue = getEnum(\n resolvedValue.value,\n enumName,\n getEnumNames(resolvedValue.originalSchema),\n context.output.override.enumGenerationType,\n getEnumDescriptions(resolvedValue.originalSchema),\n context.output.override.namingConvention.enum,\n );\n\n return {\n name,\n required,\n definition: `${doc}${key}${\n !required || schema.default ? '?' : ''\n }: ${enumName};`,\n imports: [{ name: enumName }],\n schemas: [\n ...resolvedValue.schemas,\n { name: enumName, model: enumValue, imports: resolvedValue.imports },\n ],\n originalSchema: resolvedValue.originalSchema,\n };\n }\n\n const definition = `${doc}${key}${\n !required || schema.default ? '?' : ''\n }: ${resolvedValue.value};`;\n\n return {\n name,\n required,\n definition,\n imports: resolvedValue.imports,\n schemas: resolvedValue.schemas,\n originalSchema: resolvedValue.originalSchema,\n };\n });\n}\n\ninterface GetQueryParamsOptions {\n queryParams: GetterParameters['query'];\n operationName: string;\n context: ContextSpec;\n suffix?: string;\n}\n\nexport function getQueryParams({\n queryParams,\n operationName,\n context,\n suffix = 'params',\n}: GetQueryParamsOptions): GetterQueryParam | undefined {\n if (queryParams.length === 0) {\n return;\n }\n const types = getQueryParamsTypes(queryParams, operationName, context);\n const imports = types.flatMap(({ imports }) => imports);\n const schemas = types.flatMap(({ schemas }) => schemas);\n const name = `${pascal(operationName)}${pascal(suffix)}`;\n\n const type = types.map(({ definition }) => definition).join('\\n');\n const allOptional = queryParams.every(({ parameter }) => !parameter.required);\n const requiredNullableKeys = types\n .filter(\n ({ required, originalSchema }) =>\n required && isSchemaNullable(originalSchema),\n )\n .map(({ name }) => name);\n const nonPrimitiveKeys = types\n .filter(({ originalSchema }) => isSchemaNonPrimitive(originalSchema))\n .map(({ name }) => name);\n\n const schema = {\n name,\n model: `export type ${name} = {\\n${type}\\n};\\n`,\n imports,\n };\n\n return {\n schema,\n deps: schemas,\n isOptional: allOptional,\n requiredNullableKeys,\n ...(nonPrimitiveKeys.length > 0 ? { nonPrimitiveKeys } : {}),\n };\n}\n","import type {\n ContextSpec,\n GetterResponse,\n OpenApiResponsesObject,\n OverrideOutputContentType,\n ResReqTypesValue,\n} from '../types';\nimport {\n dedupeUnionType,\n filterByContentType,\n isBinaryContentType,\n} from '../utils';\nimport { getResReqTypes } from './res-req-types';\n\ninterface GetResponseOptions {\n responses: OpenApiResponsesObject;\n operationName: string;\n context: ContextSpec;\n contentType?: OverrideOutputContentType;\n}\n\nexport function getResponse({\n responses,\n operationName,\n context,\n contentType,\n}: GetResponseOptions): GetterResponse {\n const types = getResReqTypes(\n Object.entries(responses),\n operationName,\n context,\n 'void',\n (type) => `${type.key}-${type.value}-${type.contentType}`,\n );\n\n const filteredTypes = filterByContentType(types, contentType);\n\n const imports = filteredTypes.flatMap(({ imports }) => imports);\n const schemas = filteredTypes.flatMap(({ schemas }) => schemas);\n\n const contentTypes = [\n ...new Set(filteredTypes.map(({ contentType }) => contentType)),\n ];\n\n const groupedByStatus: {\n success: ResReqTypesValue[];\n errors: ResReqTypesValue[];\n } = { success: [], errors: [] };\n for (const type of filteredTypes) {\n if (type.key.startsWith('2')) {\n groupedByStatus.success.push(type);\n } else {\n groupedByStatus.errors.push(type);\n }\n }\n\n const success = dedupeUnionType(\n groupedByStatus.success\n .map(({ value, formData }) => (formData ? 'Blob' : value))\n .join(' | '),\n );\n const errors = dedupeUnionType(\n groupedByStatus.errors.map(({ value }) => value).join(' | '),\n );\n\n const defaultType = filteredTypes.find(({ key }) => key === 'default')?.value;\n\n return {\n imports,\n definition: {\n success: success || (defaultType ?? 'unknown'),\n errors: errors || (defaultType ?? 'unknown'),\n },\n isBlob: groupedByStatus.success.some(\n (t) =>\n (!!t.contentType && isBinaryContentType(t.contentType)) ||\n t.originalSchema?.format === 'binary' ||\n (t.originalSchema?.contentMediaType === 'application/octet-stream' &&\n !t.originalSchema.contentEncoding),\n ),\n types: groupedByStatus,\n contentTypes,\n schemas,\n originalSchema: responses,\n };\n}\n","import { TEMPLATE_TAG_REGEX } from '../constants';\nimport type {\n BaseUrlFromConstant,\n BaseUrlFromSpec,\n BaseUrlRuntime,\n GeneratorImport,\n NormalizedOutputOptions,\n OpenApiServerObject,\n} from '../types';\nimport { camel, isObject, isString, sanitize } from '../utils';\n\nfunction isBaseUrlRuntime(\n baseUrl: string | BaseUrlFromConstant | BaseUrlFromSpec | BaseUrlRuntime,\n): baseUrl is BaseUrlRuntime {\n return (\n isObject(baseUrl) &&\n 'runtime' in baseUrl &&\n typeof baseUrl.runtime === 'string'\n );\n}\n\n/**\n * Wraps a runtime expression for generated URL template literals.\n * Pass the expression only (e.g. `process.env.API_BASE_URL`), not a `${...}` fragment.\n */\nfunction runtimeExpressionToUrlPrefix(expression: string): string {\n const t = expression.trim();\n if (!t) return '';\n return '${' + t + '}';\n}\n\nconst hasParam = (path: string): boolean => /[^{]*{[\\w*_-]*}.*/.test(path);\n\nconst getRoutePath = (path: string): string => {\n const matches = /([^{]*){?([\\w*_-]*)}?(.*)/.exec(path);\n if (!matches?.length) return path; // impossible due to regexp grouping here, but for TS\n\n const prev = matches[1];\n const rawParam = matches[2];\n const rest = matches[3];\n const param = sanitize(camel(rawParam), {\n es5keyword: true,\n underscore: true,\n dash: true,\n dot: true,\n });\n const next = hasParam(rest) ? getRoutePath(rest) : rest;\n\n return hasParam(path)\n ? `${prev}\\${${param}}${next}`\n : `${prev}${param}${next}`;\n};\n\nexport function getRoute(route: string) {\n const splittedRoute = route.split('/');\n\n let result = '';\n for (const [i, path] of splittedRoute.entries()) {\n if (!path && !i) {\n continue;\n }\n\n result += path.includes('{') ? `/${getRoutePath(path)}` : `/${path}`;\n }\n return result;\n}\n\nexport function getFullRoute(\n route: string,\n servers: OpenApiServerObject[] | undefined,\n baseUrl:\n | string\n | BaseUrlFromConstant\n | BaseUrlFromSpec\n | BaseUrlRuntime\n | undefined,\n): string {\n const getBaseUrl = (): string => {\n if (!baseUrl) return '';\n if (isString(baseUrl)) return baseUrl;\n if (isBaseUrlRuntime(baseUrl)) {\n return runtimeExpressionToUrlPrefix(baseUrl.runtime);\n }\n if (baseUrl.getBaseUrlFromSpecification) {\n if (!servers) {\n throw new Error(\n \"Orval is configured to use baseUrl from the specifications 'servers' field, but there exist no servers in the specification.\",\n );\n }\n const server = servers.at(\n Math.min(baseUrl.index ?? 0, servers.length - 1),\n );\n if (!server) return '';\n const serverUrl = server.url ?? '';\n if (!server.variables) return serverUrl;\n\n let url = serverUrl;\n const variables = baseUrl.variables;\n for (const variableKey of Object.keys(server.variables)) {\n const variable = server.variables[variableKey];\n if (variables?.[variableKey]) {\n if (\n variable.enum &&\n !variable.enum.some((e) => e == variables[variableKey])\n ) {\n throw new Error(\n `Invalid variable value '${variables[variableKey]}' for variable '${variableKey}' when resolving ${serverUrl}. Valid values are: ${variable.enum.join(', ')}.`,\n );\n }\n url = url.replaceAll(`{${variableKey}}`, variables[variableKey]);\n } else {\n url = url.replaceAll(`{${variableKey}}`, String(variable.default));\n }\n }\n return url;\n }\n return baseUrl.baseUrl;\n };\n\n let fullRoute = route;\n const base = getBaseUrl();\n if (base) {\n if (base.endsWith('/') && route.startsWith('/')) {\n fullRoute = route.slice(1);\n }\n fullRoute = `${base}${fullRoute}`;\n }\n return fullRoute;\n}\n\n/**\n * Returns `GeneratorImport` entries for {@link BaseUrlRuntime.imports} when `baseUrl` is a runtime config.\n *\n * Defaults `values` to true so symbols in `runtime` emit as value imports in the\n * generated client. Set `values: false` explicitly only for unusual cases (e.g.\n * type-only symbols referenced from the expression).\n */\nexport function getBaseUrlRuntimeImports(\n baseUrl?: NormalizedOutputOptions['baseUrl'],\n): GeneratorImport[] {\n if (!baseUrl) return [];\n if (!isBaseUrlRuntime(baseUrl)) return [];\n return (baseUrl.imports ?? []).map((imp) => ({\n ...imp,\n values: imp.values ?? true,\n }));\n}\n\n// Emits a codegen string: wraps each `${param}` segment of a template-literal\n// route so the generated client encodes path parameters at request time.\nexport const wrapRouteParameters = (\n route: string,\n prepend: string,\n append: string,\n): string => route.replaceAll(TEMPLATE_TAG_REGEX, `\\${${prepend}$1${append}}`);\n\nexport const makeRouteSafe = (route: string): string =>\n wrapRouteParameters(route, 'encodeURIComponent(String(', '))');\n\n// Creates a mixed use array with path variables and string from template string route\nexport function getRouteAsArray(route: string): string {\n return route\n .split('/')\n .filter((i) => i !== '')\n .flatMap((segment) => {\n if (!segment.includes('${')) {\n return [`'${segment}'`];\n }\n // Split by template tags, keeping the delimiters\n return segment\n .split(/(\\$\\{.+?\\})/g)\n .filter(Boolean)\n .map((part) => {\n const match = /^\\$\\{(.+?)\\}$/.exec(part);\n return match ? match[1] : `'${part}'`;\n });\n })\n .join(',');\n}\n","import { entries, isEmptyish } from 'remeda';\n\nimport { getResReqTypes } from '../getters';\nimport type {\n ContextSpec,\n GeneratorSchema,\n OpenApiComponentsObject,\n} from '../types';\nimport { jsDoc, pascal, sanitize } from '../utils';\n\nexport function generateComponentDefinition(\n responses:\n | OpenApiComponentsObject['responses']\n | OpenApiComponentsObject['requestBodies'] = {},\n context: ContextSpec,\n suffix: string,\n): GeneratorSchema[] {\n if (isEmptyish(responses)) {\n return [];\n }\n\n const generatorSchemas: GeneratorSchema[] = [];\n for (const [name, response] of entries(responses)) {\n const allResponseTypes = getResReqTypes(\n [[suffix, response]],\n name,\n context,\n 'void',\n );\n\n const imports = allResponseTypes.flatMap(({ imports }) => imports);\n const schemas = allResponseTypes.flatMap(({ schemas }) => schemas);\n\n const type = allResponseTypes.map(({ value }) => value).join(' | ');\n\n const modelName = sanitize(`${pascal(name)}${suffix}`, {\n underscore: '_',\n whitespace: '_',\n dash: true,\n es5keyword: true,\n es5IdentifierName: true,\n });\n const doc = jsDoc(response);\n const model = `${doc}export type ${modelName} = ${type || 'unknown'};\\n`;\n\n generatorSchemas.push(...schemas);\n\n if (modelName !== type) {\n generatorSchemas.push({\n name: modelName,\n model,\n imports,\n });\n }\n }\n\n return generatorSchemas;\n}\n","import { groupBy, unique, uniqueWith } from 'remeda';\n\nimport {\n type GeneratorImport,\n type GeneratorMutator,\n type GeneratorVerbOptions,\n GetterPropType,\n NamingConvention,\n} from '../types';\nimport { conventionName } from '../utils';\nimport { escapeRegExp } from '../utils/string';\n\ninterface GenerateImportsOptions {\n imports: readonly GeneratorImport[];\n namingConvention?: NamingConvention;\n importExtension?: string;\n}\n\nexport function generateImports({\n imports,\n namingConvention = NamingConvention.CAMEL_CASE,\n importExtension = '',\n}: GenerateImportsOptions) {\n if (imports.length === 0) {\n return '';\n }\n\n const normalized = uniqueWith(\n imports,\n (a, b) =>\n a.name === b.name &&\n a.default === b.default &&\n a.alias === b.alias &&\n a.values === b.values &&\n a.isConstant === b.isConstant &&\n a.namespaceImport === b.namespaceImport &&\n a.syntheticDefaultImport === b.syntheticDefaultImport &&\n a.importPath === b.importPath,\n ).map((imp) => ({\n ...imp,\n importPath:\n imp.importPath ??\n `./${conventionName(imp.name, namingConvention)}${importExtension}`,\n }));\n\n const grouped = groupBy(normalized, (imp) =>\n !imp.default &&\n !imp.namespaceImport &&\n !imp.syntheticDefaultImport &&\n !imp.values &&\n !imp.isConstant\n ? `aggregate|${imp.importPath}`\n : `single|${imp.importPath}|${imp.name}|${imp.alias ?? ''}|${String(\n imp.default,\n )}|${String(imp.namespaceImport)}|${String(imp.syntheticDefaultImport)}|${String(\n imp.values,\n )}|${String(imp.isConstant)}`,\n );\n\n return Object.entries(grouped)\n .toSorted(([a], [b]) => a.localeCompare(b, 'en', { numeric: true }))\n .map(([, group]) => {\n const sample = group[0];\n const canAggregate =\n !sample.default &&\n !sample.namespaceImport &&\n !sample.syntheticDefaultImport &&\n !sample.values &&\n !sample.isConstant;\n\n if (canAggregate) {\n const names = [\n ...new Set(\n group.map(\n ({ name, alias }) => `${name}${alias ? ` as ${alias}` : ''}`,\n ),\n ),\n ]\n .toSorted()\n .join(', ');\n\n return `import type { ${names} } from '${sample.importPath}';`;\n }\n\n const { name, values, alias, isConstant, importPath } = sample;\n return `import ${!values && !isConstant ? 'type ' : ''}{ ${name}${\n alias ? ` as ${alias}` : ''\n } } from '${importPath}';`;\n })\n .join('\\n');\n}\n\ninterface GenerateMutatorImportsOptions {\n mutators: GeneratorMutator[];\n implementation?: string;\n oneMore?: boolean;\n}\n\nexport function generateMutatorImports({\n mutators,\n implementation,\n oneMore,\n}: GenerateMutatorImportsOptions) {\n let imports = '';\n for (const mutator of uniqueWith(\n mutators,\n (a, b) => a.name === b.name && a.default === b.default,\n )) {\n // Relative mutator paths are written relative to the output root, so in\n // tags-split mode (`oneMore`) they need an extra `../` to reach the file\n // from the deeper per-tag directory. Bare specifiers (e.g. `@scope/axios`)\n // and absolute paths do not depend on the importer's location and must be\n // left untouched.\n const isRelativeImport = mutator.path.startsWith('.');\n const path = `${oneMore && isRelativeImport ? '../' : ''}${mutator.path}`;\n const importDefault = mutator.default\n ? mutator.name\n : `{ ${mutator.name} }`;\n\n imports += `import ${importDefault} from '${path}';`;\n imports += '\\n';\n\n if (implementation && (mutator.hasErrorType || mutator.bodyTypeName)) {\n let errorImportName = '';\n const targetErrorImportName = mutator.default\n ? `ErrorType as ${mutator.errorTypeName}`\n : mutator.errorTypeName;\n if (\n mutator.hasErrorType &&\n implementation.includes(mutator.errorTypeName) &&\n !imports.includes(`{ ${targetErrorImportName} `)\n ) {\n errorImportName = targetErrorImportName;\n }\n\n let bodyImportName = '';\n const targetBodyImportName = mutator.default\n ? `BodyType as ${mutator.bodyTypeName}`\n : mutator.bodyTypeName;\n if (\n mutator.bodyTypeName &&\n implementation.includes(mutator.bodyTypeName) &&\n !imports.includes(` ${targetBodyImportName} }`)\n ) {\n bodyImportName = targetBodyImportName ?? '';\n }\n\n if (bodyImportName || errorImportName) {\n imports += `import type { ${errorImportName}${\n errorImportName && bodyImportName ? ' , ' : ''\n }${bodyImportName} } from '${path}';`;\n imports += '\\n';\n }\n }\n }\n\n return imports;\n}\n\ninterface GenerateDependencyOptions {\n key: string;\n deps: readonly GeneratorImport[];\n dependency: string;\n projectName?: string;\n isAllowSyntheticDefaultImports: boolean;\n onlyTypes: boolean;\n}\n\nfunction generateDependency({\n deps,\n isAllowSyntheticDefaultImports,\n dependency,\n projectName,\n key,\n onlyTypes,\n}: GenerateDependencyOptions) {\n // find default import if dependency either is not a synthetic import or synthetic imports are allowed\n const defaultDep = deps.find(\n (e) =>\n e.default &&\n (isAllowSyntheticDefaultImports || !e.syntheticDefaultImport),\n );\n\n // if default dependency could not be created, check for namespace import or a synthetic import that is not allowed\n const namespaceImportDep = defaultDep\n ? undefined\n : deps.find(\n (e) =>\n !!e.namespaceImport ||\n (!isAllowSyntheticDefaultImports && e.syntheticDefaultImport),\n );\n\n // find all named imports\n const depsString = unique(\n deps\n .filter(\n (e) => !e.default && !e.syntheticDefaultImport && !e.namespaceImport,\n )\n .map(({ name, alias }) => (alias ? `${name} as ${alias}` : name)),\n )\n .toSorted()\n .join(',\\n ');\n\n let importString = '';\n\n // generate namespace import string\n const namespaceImportString = namespaceImportDep\n ? `import * as ${namespaceImportDep.name} from '${dependency}';`\n : '';\n\n if (namespaceImportString) {\n if (deps.length === 1) {\n // only namespace import, return it directly\n return namespaceImportString;\n }\n importString += `${namespaceImportString}\\n`;\n }\n\n importString += `import ${onlyTypes ? 'type ' : ''}${\n defaultDep ? `${defaultDep.name}${depsString ? ',' : ''}` : ''\n }${depsString ? `{\\n ${depsString}\\n}` : ''} from '${dependency}${\n key !== 'default' && projectName ? `/${projectName}` : ''\n }';`;\n\n return importString;\n}\n\ninterface AddDependencyOptions {\n implementation: string;\n exports: readonly GeneratorImport[];\n dependency: string;\n projectName?: string;\n hasSchemaDir: boolean;\n isAllowSyntheticDefaultImports: boolean;\n}\n\nexport function addDependency({\n implementation,\n exports,\n dependency,\n projectName,\n isAllowSyntheticDefaultImports,\n}: AddDependencyOptions) {\n const toAdds = exports.filter((e) => {\n const searchWords = [e.alias, e.name]\n .filter((p): p is string => Boolean(p?.length))\n .map((part) => escapeRegExp(part))\n .join('|');\n\n if (!searchWords) {\n return false;\n }\n\n const pattern = new RegExp(String.raw`\\b(${searchWords})\\b`, 'g');\n\n return implementation.match(pattern);\n });\n\n if (toAdds.length === 0) {\n return;\n }\n\n const groupedBySpecKey: Record<\n string,\n { types: GeneratorImport[]; values: GeneratorImport[] }\n > = { default: { types: [], values: [] } };\n for (const dep of toAdds) {\n const key = 'default';\n\n if (\n dep.values &&\n (isAllowSyntheticDefaultImports || !dep.syntheticDefaultImport)\n ) {\n groupedBySpecKey[key].values.push(dep);\n } else {\n groupedBySpecKey[key].types.push(dep);\n }\n }\n\n return (\n Object.entries(groupedBySpecKey)\n .map(([key, { values, types }]) => {\n let dep = '';\n\n if (values.length > 0) {\n dep += generateDependency({\n deps: values,\n isAllowSyntheticDefaultImports,\n dependency,\n projectName,\n key,\n onlyTypes: false,\n });\n }\n\n if (types.length > 0) {\n let uniqueTypes = types;\n if (values.length > 0) {\n uniqueTypes = types.filter(\n (t) =>\n !values.some(\n (v) =>\n v.name === t.name && (v.alias ?? '') === (t.alias ?? ''),\n ),\n );\n }\n if (uniqueTypes.length > 0) {\n if (values.length > 0) {\n dep += '\\n';\n }\n dep += generateDependency({\n deps: uniqueTypes,\n isAllowSyntheticDefaultImports,\n dependency,\n projectName,\n key,\n onlyTypes: true,\n });\n }\n }\n\n return dep;\n })\n .join('\\n') + '\\n'\n );\n}\n\nfunction getLibName(code: string) {\n const splitString = code.split(' from ');\n return (splitString.at(-1) ?? '').split(';')[0].trim();\n}\n\nexport function generateDependencyImports(\n implementation: string,\n imports: {\n exports: readonly GeneratorImport[];\n dependency: string;\n }[],\n projectName: string | undefined,\n hasSchemaDir: boolean,\n isAllowSyntheticDefaultImports: boolean,\n): string {\n const dependencies = imports\n .map((dep) =>\n addDependency({\n ...dep,\n implementation,\n projectName,\n hasSchemaDir,\n isAllowSyntheticDefaultImports,\n }),\n )\n // eslint-disable-next-line unicorn/prefer-native-coercion-functions -- type predicate (x is string) required for narrowing\n .filter((x): x is string => Boolean(x))\n .toSorted((a, b) => {\n const aLib = getLibName(a);\n const bLib = getLibName(b);\n\n if (aLib === bLib) {\n return 0;\n }\n\n if (aLib.startsWith(\"'.\") && !bLib.startsWith(\"'.\")) {\n return 1;\n }\n return aLib < bLib ? -1 : 1;\n })\n .join('\\n');\n\n return dependencies ? dependencies + '\\n' : '';\n}\n\nexport function generateVerbImports({\n response,\n body,\n queryParams,\n props,\n headers,\n params,\n}: GeneratorVerbOptions): GeneratorImport[] {\n const imports: GeneratorImport[] = [\n ...response.imports,\n ...body.imports,\n ...props.flatMap((prop) =>\n prop.type === GetterPropType.NAMED_PATH_PARAMS\n ? [{ name: prop.schema.name }]\n : [],\n ),\n ...(queryParams ? [{ name: queryParams.schema.name }] : []),\n ...(headers ? [{ name: headers.schema.name }] : []),\n ...params.flatMap<GeneratorImport>(({ imports }) => imports),\n ];\n\n // Zod schema named `Error` is a common collision with the global `Error` value.\n // If we need it as a runtime value (e.g. `.parse()`), alias the value import to\n // `ErrorSchema` while keeping the `Error` type available.\n return imports.flatMap((imp) => {\n if (imp.name !== 'Error' || !imp.values || imp.alias) {\n return [imp];\n }\n\n return [\n // Type-only import keeps `Error` usable as a type.\n { ...imp, values: undefined },\n // Value import is aliased to avoid shadowing `globalThis.Error`.\n { ...imp, alias: 'ErrorSchema', values: true },\n ];\n });\n}\n","import type {\n InputFiltersOptions,\n NormalizedInputOptions,\n OpenApiDocument,\n OpenApiOperationObject,\n OpenApiPathItemObject,\n} from '../types';\n\nconst COMPONENT_TYPES = [\n 'schemas',\n 'responses',\n 'parameters',\n 'requestBodies',\n] as const;\n\ntype ComponentType = (typeof COMPONENT_TYPES)[number];\n\nexport function filteredVerbs(\n verbs: OpenApiPathItemObject,\n filters: NormalizedInputOptions['filters'],\n) {\n if (filters?.tags === undefined) {\n return Object.entries(verbs);\n }\n\n const filterTags = filters.tags;\n const filterMode = filters.mode ?? 'include';\n\n return Object.entries(verbs).filter(\n ([, operation]: [string, OpenApiOperationObject]) => {\n // Bridge assertion: operation.tags is `any` due to AnyOtherAttribute\n const operationTags = (operation.tags ?? []) as string[];\n\n const isMatch = operationTags.some((tag) =>\n filterTags.some((filterTag) =>\n filterTag instanceof RegExp ? filterTag.test(tag) : filterTag === tag,\n ),\n );\n\n return filterMode === 'exclude' ? !isMatch : isMatch;\n },\n );\n}\n\nfunction findRefs(value: unknown): string[] {\n if (!value || typeof value !== 'object') return [];\n if (Array.isArray(value)) return value.flatMap((item) => findRefs(item));\n\n const obj = value as Record<string, unknown>;\n\n if (typeof obj.$ref === 'string') return [obj.$ref];\n\n return Object.values(obj).flatMap((val) => findRefs(val));\n}\n\nfunction parseComponentRef(\n ref: string,\n): { type: ComponentType; name: string } | undefined {\n const parts = ref.split('/');\n\n if (parts[0] !== '#' || parts[1] !== 'components' || parts.length < 4) {\n return undefined;\n }\n\n const type = parts[2];\n const name = parts[3];\n\n if (!COMPONENT_TYPES.includes(type as ComponentType)) {\n return undefined;\n }\n\n return { type: type as ComponentType, name };\n}\n\nfunction getComponentNames(\n refs: string[],\n spec: OpenApiDocument,\n): { type: ComponentType; name: string }[] {\n return refs\n .map((ref) => parseComponentRef(ref))\n .filter(\n (parsed): parsed is { type: ComponentType; name: string } =>\n !!parsed && !!spec.components?.[parsed.type]?.[parsed.name],\n );\n}\n\nfunction resolveReferencedComponents(\n refs: string[],\n spec: OpenApiDocument,\n resolved: Record<ComponentType, string[]>,\n): Record<ComponentType, string[]> {\n const newComponents = getComponentNames(refs, spec).filter(\n ({ type, name }) => !resolved[type].includes(name),\n );\n\n if (newComponents.length === 0) return resolved;\n\n const nextResolved: Record<ComponentType, string[]> = {\n schemas: [...resolved.schemas],\n responses: [...resolved.responses],\n parameters: [...resolved.parameters],\n requestBodies: [...resolved.requestBodies],\n };\n\n for (const { type, name } of newComponents) {\n nextResolved[type].push(name);\n }\n\n const nextRefs = newComponents.flatMap(({ type, name }) =>\n findRefs(spec.components?.[type]?.[name]),\n );\n\n return resolveReferencedComponents(nextRefs, spec, nextResolved);\n}\n\nexport const collectReferencedComponents = (\n spec: OpenApiDocument,\n tags: (string | RegExp)[],\n mode: InputFiltersOptions['mode'],\n): Record<ComponentType, string[]> => {\n const filters = { tags, mode };\n const refs = Object.values(spec.paths ?? {})\n .filter((pathItem): pathItem is OpenApiPathItemObject => !!pathItem)\n .flatMap((pathItem) => {\n const verbs = filteredVerbs(pathItem, filters);\n return [\n ...verbs.flatMap(([, operation]) => findRefs(operation)),\n ...findRefs(pathItem.parameters),\n ];\n });\n\n return resolveReferencedComponents(refs, spec, {\n schemas: [],\n responses: [],\n parameters: [],\n requestBodies: [],\n });\n};\n","import type { GeneratorSchema } from '../types';\n\nexport function generateModelInline(acc: string, model: string): string {\n return acc + `${model}\\n`;\n}\n\nexport function generateModelsInline(\n obj: Record<string, GeneratorSchema[]> | GeneratorSchema[],\n): string {\n const schemas = Array.isArray(obj) ? obj : Object.values(obj).flat();\n\n let result = '';\n for (const { model } of schemas) {\n result = generateModelInline(result, model);\n }\n return result;\n}\n","import { Parser, type Program } from 'acorn';\nimport { build, type BuildOptions } from 'esbuild';\nimport { isArray } from 'remeda';\n\nimport type { GeneratorMutatorParsingInfo, Tsconfig } from '../types';\n\nexport async function getMutatorInfo(\n filePath: string,\n options?: {\n root?: string;\n namedExport?: string;\n alias?: Record<string, string>;\n external?: string[];\n tsconfig?: Tsconfig;\n },\n): Promise<GeneratorMutatorParsingInfo | undefined> {\n const {\n root = process.cwd(),\n namedExport = 'default',\n alias,\n external,\n tsconfig,\n } = options ?? {};\n\n const code = await bundleFile(\n root,\n filePath,\n alias,\n external,\n tsconfig?.compilerOptions,\n );\n\n return parseFile(code, namedExport);\n}\n\nasync function bundleFile(\n root: string,\n fileName: string,\n alias?: Record<string, string>,\n external?: string[],\n compilerOptions?: Tsconfig['compilerOptions'],\n): Promise<string> {\n const result = await build({\n absWorkingDir: root,\n entryPoints: [fileName],\n write: false,\n platform: 'node',\n bundle: true,\n format: 'esm',\n metafile: false,\n target: compilerOptions?.target ?? 'es6',\n minify: false,\n minifyIdentifiers: false,\n minifySyntax: false,\n minifyWhitespace: false,\n treeShaking: false,\n keepNames: false,\n alias,\n external: external ?? ['*'],\n } satisfies BuildOptions);\n const { text } = result.outputFiles[0];\n\n return text;\n}\n\nfunction parseFile(\n file: string,\n name: string,\n): GeneratorMutatorParsingInfo | undefined {\n try {\n // `file` is esbuild's bundled output, not the user's source. esbuild may\n // emit any modern syntax (notably dynamic `import()`, which it preserves\n // even when targeting es6 in ESM mode), so we parse with the latest\n // ecmaVersion to avoid spurious SyntaxErrors that would mask the export\n // we are looking for. See https://github.com/orval-labs/orval/issues/1634.\n const ast = Parser.parse(file, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n });\n\n const foundSpecifier = ast.body\n .filter((x) => x.type === 'ExportNamedDeclaration')\n .flatMap((x) => x.specifiers)\n .find(\n (x) =>\n x.exported.type === 'Identifier' &&\n x.exported.name === name &&\n x.local.type === 'Identifier',\n );\n\n if (foundSpecifier && 'name' in foundSpecifier.local) {\n const exportedFuncName = foundSpecifier.local.name;\n\n return parseFunction(ast, exportedFuncName);\n }\n } catch {\n return;\n }\n}\n\nfunction parseFunction(\n ast: Program,\n funcName: string,\n): GeneratorMutatorParsingInfo | undefined {\n const node = ast.body.find((childNode) => {\n if (childNode.type === 'VariableDeclaration') {\n return childNode.declarations.find(\n (d) => d.id.type === 'Identifier' && d.id.name === funcName,\n );\n }\n if (\n childNode.type === 'FunctionDeclaration' &&\n childNode.id.name === funcName\n ) {\n return childNode;\n }\n });\n\n if (!node) {\n return;\n }\n\n if (node.type === 'FunctionDeclaration') {\n const returnStatement = node.body.body.find(\n (b) => b.type === 'ReturnStatement',\n );\n\n // If the function directly returns an arrow function\n if (returnStatement?.argument && 'params' in returnStatement.argument) {\n return {\n numberOfParams: node.params.length,\n returnNumberOfParams: returnStatement.argument.params.length,\n };\n // If the function returns a CallExpression (e.g., return useCallback(...))\n } else if (returnStatement?.argument?.type === 'CallExpression') {\n const arrowFn = returnStatement.argument.arguments.at(0);\n if (arrowFn?.type === 'ArrowFunctionExpression') {\n return {\n numberOfParams: node.params.length,\n returnNumberOfParams: arrowFn.params.length,\n };\n }\n }\n return {\n numberOfParams: node.params.length,\n };\n }\n\n const declaration =\n 'declarations' in node\n ? node.declarations.find(\n (d) => d.id.type === 'Identifier' && d.id.name === funcName,\n )\n : undefined;\n\n if (declaration?.init) {\n if ('name' in declaration.init) {\n return parseFunction(ast, declaration.init.name);\n }\n\n if (\n 'body' in declaration.init &&\n 'params' in declaration.init &&\n declaration.init.body.type === 'ArrowFunctionExpression'\n ) {\n return {\n numberOfParams: declaration.init.params.length,\n returnNumberOfParams: declaration.init.body.params.length,\n };\n }\n\n const returnStatement =\n 'body' in declaration.init &&\n 'body' in declaration.init.body &&\n isArray(declaration.init.body.body)\n ? declaration.init.body.body.find((b) => b.type === 'ReturnStatement')\n : undefined;\n\n if ('params' in declaration.init) {\n if (returnStatement?.argument && 'params' in returnStatement.argument) {\n return {\n numberOfParams: declaration.init.params.length,\n returnNumberOfParams: returnStatement.argument.params.length,\n };\n } else if (\n returnStatement?.argument?.type === 'CallExpression' &&\n returnStatement.argument.arguments[0]?.type ===\n 'ArrowFunctionExpression'\n ) {\n const arrowFn = returnStatement.argument.arguments[0];\n return {\n numberOfParams: declaration.init.params.length,\n returnNumberOfParams: arrowFn.params.length,\n };\n }\n\n return {\n numberOfParams: declaration.init.params.length,\n };\n }\n }\n}\n","import { styleText } from 'node:util';\n\nimport fs from 'fs-extra';\n\nimport type { GeneratorMutator, NormalizedMutator, Tsconfig } from '../types';\nimport { getFileInfo, pascal, upath } from '../utils';\nimport { getMutatorInfo } from './mutator-info';\n\nexport const BODY_TYPE_NAME = 'BodyType';\n\nconst getImport = (output: string, mutator: NormalizedMutator) => {\n const outputFile = getFileInfo(output).path;\n return `${upath.getRelativeImportPath(outputFile, mutator.path)}${mutator.extension ?? ''}`;\n};\n\ninterface GenerateMutatorOptions {\n output?: string;\n mutator?: NormalizedMutator;\n name: string;\n workspace: string;\n tsconfig?: Tsconfig;\n}\n\nexport async function generateMutator({\n output,\n mutator,\n name,\n workspace,\n tsconfig,\n}: GenerateMutatorOptions): Promise<GeneratorMutator | undefined> {\n if (!mutator || !output) {\n return;\n }\n const isDefault = mutator.default;\n const importName = mutator.name ?? `${name}Mutator`;\n const importPath = mutator.path;\n const mutatorInfoName = isDefault ? 'default' : mutator.name;\n\n if (mutatorInfoName === undefined) {\n throw new Error(\n styleText(\n 'red',\n `Mutator ${importPath} must have a named or default export.`,\n ),\n );\n }\n\n let rawFile = await fs.readFile(importPath, 'utf8');\n rawFile = removeComments(rawFile);\n\n const hasErrorType =\n rawFile.includes('export type ErrorType') ||\n rawFile.includes('export interface ErrorType');\n\n const hasBodyType =\n rawFile.includes(`export type ${BODY_TYPE_NAME}`) ||\n rawFile.includes(`export interface ${BODY_TYPE_NAME}`);\n\n const errorTypeName = mutator.default\n ? `${pascal(name)}ErrorType`\n : 'ErrorType';\n\n const bodyTypeName = mutator.default\n ? `${pascal(name)}${BODY_TYPE_NAME}`\n : BODY_TYPE_NAME;\n\n const mutatorInfo = await getMutatorInfo(importPath, {\n root: workspace,\n namedExport: mutatorInfoName,\n alias: mutator.alias,\n external: mutator.external,\n tsconfig,\n });\n\n if (!mutatorInfo) {\n throw new Error(\n styleText(\n 'red',\n `Your mutator file doesn't have the ${mutatorInfoName} exported function`,\n ),\n );\n }\n\n const importStatementPath = getImport(output, mutator);\n\n const isHook = mutator.name\n ? mutator.name.startsWith('use') && !mutatorInfo.numberOfParams\n : !mutatorInfo.numberOfParams;\n\n return {\n name: mutator.name || !isHook ? importName : `use${pascal(importName)}`,\n path: importStatementPath,\n default: isDefault,\n hasErrorType,\n errorTypeName,\n hasSecondArg: isHook\n ? (mutatorInfo.returnNumberOfParams ?? 0) > 1\n : mutatorInfo.numberOfParams > 1,\n hasThirdArg: mutatorInfo.numberOfParams > 2,\n isHook,\n ...(hasBodyType ? { bodyTypeName } : {}),\n };\n}\n\nfunction removeComments(file: string) {\n // Regular expression to match single-line and multi-line comments\n const commentRegex = /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//g;\n\n // Remove comments from the rawFile string\n const cleanedFile = file.replaceAll(commentRegex, '');\n\n return cleanedFile;\n}\n","import { getSuccessResponseType } from '../getters/res-req-types';\nimport {\n type GeneratorMutator,\n type GeneratorSchema,\n type GetterBody,\n type GetterQueryParam,\n type GetterResponse,\n type ParamsSerializerOptions,\n Verbs,\n} from '../types';\nimport { getIsBodyVerb, isObject, stringify } from '../utils';\n\n/**\n * Filters query params for Angular's HttpClient.\n *\n * Why: Angular's HttpParams / HttpClient `params` type does not accept `null` or\n * `undefined` values, and arrays must only contain string/number/boolean.\n * Orval models often include nullable query params, so we remove nullish values\n * (including nulls inside arrays) before passing params to HttpClient or a\n * paramsSerializer to avoid runtime and type issues.\n *\n * Returns an inline IIFE expression. For paths that benefit from a shared helper\n * (e.g. observe-mode branches), prefer getAngularFilteredParamsCallExpression +\n * getAngularFilteredParamsHelperBody instead.\n */\nexport const getAngularFilteredParamsExpression = (\n paramsExpression: string,\n requiredNullableParamKeys: string[] = [],\n preserveRequiredNullables = false,\n nonPrimitiveKeys: string[] = [],\n): string => {\n const hasPassthrough = nonPrimitiveKeys.length > 0;\n const filteredParamValueType = hasPassthrough\n ? 'unknown'\n : `string | number | boolean${preserveRequiredNullables ? ' | null' : ''} | Array<string | number | boolean>`;\n const passthroughBranch = hasPassthrough\n ? ` if (passthroughKeys.has(key)) {\n if (value !== undefined) {\n filteredParams[key] = value;\n }\n continue;\n }\n`\n : '';\n const preserveNullableBranch = preserveRequiredNullables\n ? ` } else if (value === null && requiredNullableParamKeys.has(key)) {\n filteredParams[key] = null;\n`\n : '';\n const scalarBranch = ` } else if (\n value != null &&\n (typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean')\n ) {\n filteredParams[key] = value;\n }\n`;\n const passthroughDecl = hasPassthrough\n ? ` const passthroughKeys = new Set<string>(${JSON.stringify(nonPrimitiveKeys)});\\n`\n : '';\n\n return `(() => {\n${passthroughDecl} const requiredNullableParamKeys = new Set<string>(${JSON.stringify(requiredNullableParamKeys)});\n const filteredParams: Record<string, ${filteredParamValueType}> = {};\n for (const [key, value] of Object.entries(${paramsExpression})) {\n${passthroughBranch} if (Array.isArray(value)) {\n const filtered = value.filter(\n (item) =>\n item != null &&\n (typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean'),\n ) as Array<string | number | boolean>;\n if (filtered.length) {\n filteredParams[key] = filtered;\n }\n${preserveNullableBranch}${scalarBranch} }\n return filteredParams;\n})()`;\n};\n\n/**\n * Returns the body of a standalone `filterParams` helper function\n * to be emitted once in the generated file header, replacing the\n * inline IIFE that was previously duplicated in every method.\n */\nexport const getAngularFilteredParamsHelperBody = (): string =>\n `type AngularHttpParamValue = string | number | boolean | Array<string | number | boolean>;\ntype AngularHttpParamValueWithNullable = AngularHttpParamValue | null;\n\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys?: ReadonlySet<string>,\n preserveRequiredNullables?: false,\n passthroughKeys?: undefined,\n): Record<string, AngularHttpParamValue>;\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys: ReadonlySet<string> | undefined,\n preserveRequiredNullables: true,\n passthroughKeys?: undefined,\n): Record<string, AngularHttpParamValueWithNullable>;\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys: ReadonlySet<string> | undefined,\n preserveRequiredNullables: boolean | undefined,\n passthroughKeys: ReadonlySet<string>,\n): Record<string, unknown>;\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys: ReadonlySet<string> = new Set(),\n preserveRequiredNullables = false,\n passthroughKeys: ReadonlySet<string> = new Set(),\n): Record<string, unknown> {\n const filteredParams: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (passthroughKeys.has(key)) {\n if (value !== undefined) {\n filteredParams[key] = value;\n }\n continue;\n }\n if (Array.isArray(value)) {\n const filtered = value.filter(\n (item) =>\n item != null &&\n (typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean'),\n ) as Array<string | number | boolean>;\n if (filtered.length) {\n filteredParams[key] = filtered;\n }\n } else if (\n preserveRequiredNullables &&\n value === null &&\n requiredNullableKeys.has(key)\n ) {\n filteredParams[key] = null;\n } else if (\n value != null &&\n (typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean')\n ) {\n filteredParams[key] = value;\n }\n }\n return filteredParams;\n}`;\n\n/**\n * Returns a call expression to the `filterParams` helper function.\n */\nexport const getAngularFilteredParamsCallExpression = (\n paramsExpression: string,\n requiredNullableParamKeys: string[] = [],\n preserveRequiredNullables = false,\n nonPrimitiveKeys: string[] = [],\n): string => {\n const baseArgs = `${paramsExpression}, new Set<string>(${JSON.stringify(requiredNullableParamKeys)})`;\n if (nonPrimitiveKeys.length > 0) {\n return `filterParams(${baseArgs}, ${preserveRequiredNullables}, new Set<string>(${JSON.stringify(nonPrimitiveKeys)}))`;\n }\n return `filterParams(${baseArgs}${preserveRequiredNullables ? ', true' : ''})`;\n};\n\n/**\n * Returns the filter call/IIFE used to massage query params before passing\n * them to Angular's HttpParams. When the user supplied a `paramsFilter`\n * mutator, the built-in `filterParams` is bypassed entirely and the user's\n * function is called with the raw params — they own nullish-stripping and\n * any object/array handling. Otherwise the built-in filter is used (either\n * the shared helper or an inline IIFE), and callers should only pass\n * `nonPrimitiveKeys` when a downstream serializer or custom consumer can\n * legally handle raw object/array values.\n */\nexport const buildAngularParamsFilterExpression = ({\n paramsExpression,\n requiredNullableParamKeys = [],\n preserveRequiredNullables = false,\n nonPrimitiveKeys = [],\n paramsFilter,\n useSharedHelper,\n}: {\n paramsExpression: string;\n requiredNullableParamKeys?: string[];\n preserveRequiredNullables?: boolean;\n nonPrimitiveKeys?: string[];\n paramsFilter?: GeneratorMutator;\n useSharedHelper: boolean;\n}): string => {\n if (paramsFilter) {\n return `${paramsFilter.name}(${paramsExpression})`;\n }\n if (useSharedHelper) {\n return getAngularFilteredParamsCallExpression(\n paramsExpression,\n requiredNullableParamKeys,\n preserveRequiredNullables,\n nonPrimitiveKeys,\n );\n }\n return getAngularFilteredParamsExpression(\n paramsExpression,\n requiredNullableParamKeys,\n preserveRequiredNullables,\n nonPrimitiveKeys,\n );\n};\n\ninterface GenerateFormDataAndUrlEncodedFunctionOptions {\n body: GetterBody;\n formData?: GeneratorMutator;\n formUrlEncoded?: GeneratorMutator;\n isFormData: boolean;\n isFormUrlEncoded: boolean;\n}\n\nexport function generateBodyOptions(\n body: GetterBody,\n isFormData: boolean,\n isFormUrlEncoded: boolean,\n): string | undefined {\n if (isFormData && body.formData) {\n return 'formData';\n }\n\n if (isFormUrlEncoded && body.formUrlEncoded) {\n return 'formUrlEncoded';\n }\n\n if (body.implementation) {\n return body.implementation;\n }\n\n return undefined;\n}\n\ninterface GenerateAxiosOptions {\n response: GetterResponse;\n isExactOptionalPropertyTypes: boolean;\n angularObserve?: 'body' | 'events' | 'response';\n angularParamsRef?: string;\n requiredNullableQueryParamKeys?: string[];\n nonPrimitiveQueryParamKeys?: string[];\n queryParams?: GeneratorSchema;\n headers?: GeneratorSchema;\n requestOptions?: object | boolean;\n hasSignal: boolean;\n hasSignalParam?: boolean;\n isVue: boolean;\n isAngular: boolean;\n paramsSerializer?: GeneratorMutator;\n paramsSerializerOptions?: ParamsSerializerOptions;\n paramsFilter?: GeneratorMutator;\n}\n\nexport function generateAxiosOptions({\n response,\n isExactOptionalPropertyTypes,\n angularObserve,\n angularParamsRef,\n requiredNullableQueryParamKeys,\n nonPrimitiveQueryParamKeys,\n queryParams,\n headers,\n requestOptions,\n hasSignal,\n hasSignalParam = false,\n isVue,\n isAngular,\n paramsSerializer,\n paramsSerializerOptions,\n paramsFilter,\n}: GenerateAxiosOptions) {\n const isRequestOptions = requestOptions !== false;\n const angularPassthroughQueryParamKeys = paramsSerializer\n ? nonPrimitiveQueryParamKeys\n : [];\n // Use querySignal if API has a param named \"signal\" to avoid conflict\n const signalVar = hasSignalParam ? 'querySignal' : 'signal';\n const signalProp = hasSignalParam ? `signal: ${signalVar}` : 'signal';\n\n if (\n !queryParams &&\n !headers &&\n !response.isBlob &&\n response.definition.success !== 'string'\n ) {\n if (isRequestOptions) {\n return isAngular\n ? angularObserve\n ? `{\n ...(options as Omit<NonNullable<typeof options>, 'observe'>),\n observe: '${angularObserve}',\n }`\n : \"(options as Omit<NonNullable<typeof options>, 'observe'>)\"\n : 'options';\n }\n if (hasSignal) {\n return isExactOptionalPropertyTypes\n ? `...(${signalVar} ? { ${signalProp} } : {})`\n : signalProp;\n }\n return '';\n }\n\n let value = '';\n\n if (!isRequestOptions) {\n if (queryParams) {\n if (isAngular) {\n const iifeExpr = buildAngularParamsFilterExpression({\n paramsExpression: 'params ?? {}',\n requiredNullableParamKeys: requiredNullableQueryParamKeys,\n preserveRequiredNullables: !!paramsSerializer,\n nonPrimitiveKeys: angularPassthroughQueryParamKeys,\n paramsFilter,\n useSharedHelper: false,\n });\n value += paramsSerializer\n ? `\\n params: ${paramsSerializer.name}(${iifeExpr}),`\n : `\\n params: ${iifeExpr},`;\n } else {\n value += '\\n params,';\n }\n }\n\n if (headers) {\n value += '\\n headers,';\n }\n\n if (hasSignal) {\n value += isExactOptionalPropertyTypes\n ? `\\n ...(${signalVar} ? { ${signalProp} } : {}),`\n : `\\n ${signalProp},`;\n }\n }\n\n if (\n !isObject(requestOptions) ||\n !Object.hasOwn(requestOptions, 'responseType')\n ) {\n const successResponseType = getSuccessResponseType(response);\n if (successResponseType) {\n value += `\\n responseType: '${successResponseType}',`;\n }\n }\n\n if (isObject(requestOptions)) {\n value += `\\n ${stringify(requestOptions)?.slice(1, -1)}`;\n }\n\n if (isRequestOptions) {\n value += isAngular\n ? \"\\n ...(options as Omit<NonNullable<typeof options>, 'observe'>),\"\n : '\\n ...options,';\n\n if (isAngular && angularObserve) {\n value += `\\n observe: '${angularObserve}',`;\n }\n\n if (queryParams) {\n if (isVue) {\n value += '\\n params: {...unref(params), ...options?.params},';\n } else if (isAngular && angularParamsRef) {\n value += `\\n params: ${angularParamsRef},`;\n } else if (isAngular && paramsSerializer) {\n const callExpr = buildAngularParamsFilterExpression({\n paramsExpression: '{...params, ...options?.params}',\n requiredNullableParamKeys: requiredNullableQueryParamKeys,\n preserveRequiredNullables: true,\n nonPrimitiveKeys: angularPassthroughQueryParamKeys,\n paramsFilter,\n useSharedHelper: true,\n });\n value += `\\n params: ${paramsSerializer.name}(${callExpr}),`;\n } else if (isAngular) {\n const callExpr = buildAngularParamsFilterExpression({\n paramsExpression: '{...params, ...options?.params}',\n requiredNullableParamKeys: requiredNullableQueryParamKeys,\n nonPrimitiveKeys: angularPassthroughQueryParamKeys,\n paramsFilter,\n useSharedHelper: true,\n });\n value += `\\n params: ${callExpr},`;\n } else {\n value += '\\n params: {...params, ...options?.params},';\n }\n }\n\n if (headers) {\n value += '\\n headers: {...headers, ...options?.headers},';\n }\n }\n\n if (\n !isAngular &&\n queryParams &&\n (paramsSerializer || paramsSerializerOptions?.qs)\n ) {\n const qsOptions = paramsSerializerOptions?.qs;\n value += paramsSerializer\n ? `\\n paramsSerializer: ${paramsSerializer.name},`\n : `\\n paramsSerializer: (params) => qs.stringify(params, ${JSON.stringify(\n qsOptions,\n )}),`;\n }\n\n return value;\n}\n\ninterface GenerateOptionsOptions {\n route: string;\n body: GetterBody;\n angularObserve?: 'body' | 'events' | 'response';\n angularParamsRef?: string;\n headers?: GetterQueryParam;\n queryParams?: GetterQueryParam;\n response: GetterResponse;\n verb: Verbs;\n requestOptions?: object | boolean;\n isFormData: boolean;\n isFormUrlEncoded: boolean;\n isAngular?: boolean;\n isExactOptionalPropertyTypes: boolean;\n hasSignal: boolean;\n hasSignalParam?: boolean;\n isVue?: boolean;\n paramsSerializer?: GeneratorMutator;\n paramsSerializerOptions?: ParamsSerializerOptions;\n paramsFilter?: GeneratorMutator;\n}\n\nexport function generateOptions({\n route,\n body,\n angularObserve,\n angularParamsRef,\n headers,\n queryParams,\n response,\n verb,\n requestOptions,\n isFormData,\n isFormUrlEncoded,\n isAngular,\n isExactOptionalPropertyTypes,\n hasSignal,\n hasSignalParam,\n isVue,\n paramsSerializer,\n paramsSerializerOptions,\n paramsFilter,\n}: GenerateOptionsOptions) {\n const bodyIdentifier = getIsBodyVerb(verb)\n ? generateBodyOptions(body, isFormData, isFormUrlEncoded)\n : undefined;\n\n const axiosOptions = generateAxiosOptions({\n response,\n angularObserve,\n angularParamsRef,\n requiredNullableQueryParamKeys: queryParams?.requiredNullableKeys,\n nonPrimitiveQueryParamKeys: queryParams?.nonPrimitiveKeys,\n queryParams: queryParams?.schema,\n headers: headers?.schema,\n requestOptions,\n isExactOptionalPropertyTypes,\n hasSignal,\n hasSignalParam,\n isVue: isVue ?? false,\n isAngular: isAngular ?? false,\n paramsSerializer,\n paramsSerializerOptions,\n paramsFilter,\n });\n\n const trimmedAxiosOptions = axiosOptions.trim();\n const isRawOptionsArgument =\n trimmedAxiosOptions === 'options' ||\n (trimmedAxiosOptions.startsWith('(') &&\n trimmedAxiosOptions.endsWith(')')) ||\n (trimmedAxiosOptions.startsWith('{') && trimmedAxiosOptions.endsWith('}'));\n\n const optionsArgument = axiosOptions\n ? isRawOptionsArgument\n ? axiosOptions\n : `{${axiosOptions}}`\n : '';\n\n if (verb === Verbs.DELETE) {\n if (!bodyIdentifier) {\n return `\\n \\`${route}\\`${optionsArgument ? `,${optionsArgument}` : ''}\\n `;\n }\n\n const deleteBodyOptions = isRawOptionsArgument\n ? `...${optionsArgument}`\n : axiosOptions;\n const deleteBodyField = `${isAngular ? 'body' : 'data'}: ${bodyIdentifier}`;\n\n return `\\n \\`${route}\\`,{${deleteBodyField}${axiosOptions ? `,${deleteBodyOptions}` : ''}}\\n `;\n }\n\n const bodyOrOptions = getIsBodyVerb(verb)\n ? `\\n ${bodyIdentifier ?? 'undefined'},`\n : '';\n const separator = bodyOrOptions || optionsArgument ? ',' : '';\n\n return `\\n \\`${route}\\`${separator}${bodyOrOptions}${optionsArgument}\\n `;\n}\n\nexport function generateBodyMutatorConfig(\n body: GetterBody,\n isFormData: boolean,\n isFormUrlEncoded: boolean,\n) {\n if (isFormData && body.formData) {\n return ',\\n data: formData';\n }\n\n if (isFormUrlEncoded && body.formUrlEncoded) {\n return ',\\n data: formUrlEncoded';\n }\n\n if (body.implementation) {\n return `,\\n data: ${body.implementation}`;\n }\n\n return '';\n}\n\nexport function generateQueryParamsAxiosConfig(\n response: GetterResponse,\n isVue: boolean,\n isAngular: boolean,\n requiredNullableQueryParamKeys?: string[],\n queryParams?: GetterQueryParam,\n paramsFilter?: GeneratorMutator,\n) {\n if (!queryParams && !response.isBlob) {\n return '';\n }\n\n let value = '';\n\n if (queryParams) {\n if (isVue) {\n value += ',\\n params: unref(params)';\n } else if (isAngular) {\n const paramsExpr = buildAngularParamsFilterExpression({\n paramsExpression: 'params ?? {}',\n requiredNullableParamKeys: requiredNullableQueryParamKeys,\n nonPrimitiveKeys: queryParams.nonPrimitiveKeys,\n paramsFilter,\n useSharedHelper: false,\n });\n value += `,\\n params: ${paramsExpr}`;\n } else {\n value += ',\\n params';\n }\n }\n\n if (response.isBlob) {\n value += `,\\n responseType: 'blob'`;\n }\n\n return value;\n}\n\ninterface GenerateMutatorConfigOptions {\n route: string;\n body: GetterBody;\n headers?: GetterQueryParam;\n queryParams?: GetterQueryParam;\n response: GetterResponse;\n verb: Verbs;\n isFormData: boolean;\n isFormUrlEncoded: boolean;\n hasSignal: boolean;\n hasSignalParam?: boolean;\n isExactOptionalPropertyTypes: boolean;\n isVue?: boolean;\n isAngular?: boolean;\n paramsFilter?: GeneratorMutator;\n}\n\nexport function generateMutatorConfig({\n route,\n body,\n headers,\n queryParams,\n response,\n verb,\n isFormData,\n isFormUrlEncoded,\n hasSignal,\n hasSignalParam = false,\n isExactOptionalPropertyTypes,\n isVue,\n isAngular,\n paramsFilter,\n}: GenerateMutatorConfigOptions) {\n const bodyOptions = getIsBodyVerb(verb)\n ? generateBodyMutatorConfig(body, isFormData, isFormUrlEncoded)\n : '';\n\n const queryParamsOptions = generateQueryParamsAxiosConfig(\n response,\n isVue ?? false,\n isAngular ?? false,\n queryParams?.requiredNullableKeys,\n queryParams,\n paramsFilter,\n );\n\n const ignoreContentTypes = isAngular ? ['multipart/form-data'] : [];\n const shouldSetContentType =\n body.contentType && !ignoreContentTypes.includes(body.contentType);\n\n const headerOptions = shouldSetContentType\n ? `,\\n headers: {'Content-Type': '${body.contentType}', ${\n headers ? '...headers' : ''\n }}`\n : headers\n ? ',\\n headers'\n : '';\n\n // Use querySignal if API has a param named \"signal\" to avoid conflict\n const signalVar = hasSignalParam ? 'querySignal' : 'signal';\n const signalProp = hasSignalParam ? `signal: ${signalVar}` : 'signal';\n\n return `{url: \\`${route}\\`, method: '${verb.toUpperCase()}'${headerOptions}${bodyOptions}${queryParamsOptions}${\n hasSignal\n ? `, ${\n isExactOptionalPropertyTypes\n ? `...(${signalVar} ? { ${signalProp} }: {})`\n : signalProp\n }`\n : ''\n }\\n }`;\n}\n\nexport function generateMutatorRequestOptions(\n requestOptions: boolean | object | undefined,\n hasSecondArgument: boolean,\n) {\n if (!hasSecondArgument) {\n return isObject(requestOptions)\n ? `{${stringify(requestOptions)?.slice(1, -1)}}`\n : '';\n }\n\n if (isObject(requestOptions)) {\n return `{${stringify(requestOptions)?.slice(1, -1)} ...options}`;\n }\n\n return 'options';\n}\n\nexport function generateFormDataAndUrlEncodedFunction({\n body,\n formData,\n formUrlEncoded,\n isFormData,\n isFormUrlEncoded,\n}: GenerateFormDataAndUrlEncodedFunctionOptions) {\n if (isFormData && body.formData) {\n if (formData) {\n return `const formData = ${formData.name}(${body.implementation})`;\n }\n\n return body.formData;\n }\n\n if (isFormUrlEncoded && body.formUrlEncoded) {\n if (formUrlEncoded) {\n return `const formUrlEncoded = ${formUrlEncoded.name}(${body.implementation})`;\n }\n\n return body.formUrlEncoded;\n }\n\n return '';\n}\n","import { entries, isEmptyish } from 'remeda';\n\nimport { resolveObject, resolveRef } from '../resolvers';\nimport type {\n ContextSpec,\n GeneratorImport,\n GeneratorSchema,\n OpenApiComponentsObject,\n OpenApiParameterObject,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n} from '../types';\nimport { jsDoc, pascal, sanitize } from '../utils';\n\nexport function generateParameterDefinition(\n parameters: OpenApiComponentsObject['parameters'] = {},\n context: ContextSpec,\n suffix: string,\n): GeneratorSchema[] {\n if (isEmptyish(parameters)) {\n return [];\n }\n\n const generatorSchemas: GeneratorSchema[] = [];\n for (const [parameterName, parameter] of entries(parameters)) {\n const modelName = sanitize(`${pascal(parameterName)}${suffix}`, {\n underscore: '_',\n whitespace: '_',\n dash: true,\n es5keyword: true,\n es5IdentifierName: true,\n });\n const {\n schema,\n imports,\n }: {\n schema: OpenApiParameterObject;\n imports: GeneratorImport[];\n } = resolveRef(parameter, context);\n\n if (schema.in !== 'query' && schema.in !== 'header') {\n continue;\n }\n\n if (!schema.schema || imports.length > 0) {\n generatorSchemas.push({\n name: modelName,\n imports:\n imports.length > 0\n ? [\n {\n name: imports[0].name,\n schemaName: imports[0].schemaName,\n },\n ]\n : [],\n model: `export type ${modelName} = ${\n imports.length > 0 ? imports[0].name : 'unknown'\n };\\n`,\n dependencies: imports.length > 0 ? [imports[0].name] : [],\n });\n\n continue;\n }\n\n const resolvedObject = resolveObject({\n schema: schema.schema as OpenApiSchemaObject | OpenApiReferenceObject,\n propName: modelName,\n context,\n });\n\n const doc = jsDoc(schema);\n\n const model = `${doc}export type ${modelName} = ${\n resolvedObject.value || 'unknown'\n };\\n`;\n\n generatorSchemas.push(...resolvedObject.schemas);\n\n if (modelName !== resolvedObject.value) {\n generatorSchemas.push({\n name: modelName,\n model,\n imports: resolvedObject.imports,\n dependencies: resolvedObject.dependencies,\n });\n }\n }\n\n return generatorSchemas;\n}\n","import { getScalar } from '../getters';\nimport type {\n ContextSpec,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n} from '../types';\nimport { jsDoc } from '../utils';\n\ninterface GenerateInterfaceOptions {\n name: string;\n schema: OpenApiSchemaObject;\n context: ContextSpec;\n}\n\n/**\n * Generate the interface string\n * An eslint comment is insert if the resulted object is empty\n *\n * @param name interface name\n * @param schema\n */\nexport function generateInterface({\n name,\n schema,\n context,\n}: GenerateInterfaceOptions) {\n const scalar = getScalar({\n item: schema,\n name,\n context,\n });\n const isEmptyObject = scalar.value === '{}';\n const shouldUseTypeAlias =\n context.output.override.useTypeOverInterfaces ?? scalar.useTypeAlias;\n\n let model = '';\n\n model += jsDoc(schema);\n\n if (isEmptyObject) {\n model +=\n '// eslint-disable-next-line @typescript-eslint/no-empty-interface\\n';\n }\n\n if (scalar.type === 'object' && !shouldUseTypeAlias) {\n // Bridge assertion: schema.properties is `any` due to AnyOtherAttribute\n const properties = schema.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\n if (\n properties &&\n Object.values(properties).length > 0 &&\n Object.values(properties).every((item) => 'const' in item)\n ) {\n const mappedScalarValue = scalar.value\n .replaceAll(';', ',')\n .replaceAll('?:', ':');\n\n model += `export const ${name}Value = ${mappedScalarValue} as const;\\nexport type ${name} = typeof ${name}Value;\\n`;\n } else {\n const blankInterfaceValue =\n scalar.value === 'unknown' ? '{}' : scalar.value;\n\n model += `export interface ${name} ${blankInterfaceValue}\\n`;\n }\n } else {\n model += `export type ${name} = ${scalar.value};\\n`;\n }\n\n // Filter out imports that refer to the type defined in current file (OpenAPI recursive schema definitions)\n const externalModulesImportsOnly = scalar.imports.filter((importName) =>\n importName.alias ? importName.alias !== name : importName.name !== name,\n );\n\n return [\n ...scalar.schemas,\n {\n name,\n model,\n imports: externalModulesImportsOnly,\n dependencies: scalar.dependencies,\n schema,\n },\n ];\n}\n","import { isDereferenced } from '@scalar/openapi-types/helpers';\nimport { isArray, isEmptyish } from 'remeda';\n\nimport {\n getEnum,\n getEnumDescriptions,\n getEnumNames,\n resolveDiscriminators,\n} from '../getters';\nimport { resolveRef, resolveValue } from '../resolvers';\nimport type {\n ContextSpec,\n GeneratorSchema,\n InputFiltersOptions,\n OpenApiSchemaObject,\n OpenApiSchemasObject,\n} from '../types';\nimport {\n conventionName,\n isBoolean,\n isString,\n jsDoc,\n pascal,\n sanitize,\n} from '../utils';\nimport { generateInterface } from './interface';\n\n/**\n * Extract all types from #/components/schemas\n */\nexport function generateSchemasDefinition(\n schemas: OpenApiSchemasObject = {},\n context: ContextSpec,\n suffix: string,\n filters?: InputFiltersOptions,\n): GeneratorSchema[] {\n if (isEmptyish(schemas)) {\n return [];\n }\n\n const transformedSchemas = resolveDiscriminators(schemas, context);\n\n let generateSchemas = Object.entries(transformedSchemas);\n if (filters?.schemas) {\n const schemasFilters = filters.schemas;\n const mode = filters.mode ?? 'include';\n\n generateSchemas = generateSchemas.filter(([schemaName]) => {\n const isMatch = schemasFilters.some((filter) =>\n isString(filter) ? filter === schemaName : filter.test(schemaName),\n );\n\n return mode === 'include' ? isMatch : !isMatch;\n });\n }\n\n const models = generateSchemas.flatMap(([schemaName, schema]) =>\n generateSchemaDefinitions(schemaName, schema, context, suffix),\n );\n\n // Deduplicate schemas by normalized name to prevent duplicate exports\n // This handles cases where different source schemas produce the same normalized name\n const seenNames = new Set<string>();\n const deduplicatedModels: GeneratorSchema[] = [];\n for (const schema of models) {\n const normalizedName = conventionName(\n schema.name,\n context.output.namingConvention,\n );\n if (!seenNames.has(normalizedName)) {\n seenNames.add(normalizedName);\n deduplicatedModels.push(schema);\n }\n }\n\n return sortSchemasByDependencies(deduplicatedModels);\n}\n\nfunction sortSchemasByDependencies(\n schemas: GeneratorSchema[],\n): GeneratorSchema[] {\n if (schemas.length === 0) {\n return schemas;\n }\n\n const schemaNames = new Set(schemas.map((schema) => schema.name));\n const dependencyMap = new Map<string, Set<string>>();\n\n for (const schema of schemas) {\n const dependencies = new Set<string>();\n\n if (schema.dependencies)\n for (const dependencyName of schema.dependencies) {\n if (dependencyName && schemaNames.has(dependencyName)) {\n dependencies.add(dependencyName);\n }\n }\n\n for (const imp of schema.imports) {\n const dependencyName = imp.alias ?? imp.name;\n if (dependencyName && schemaNames.has(dependencyName)) {\n dependencies.add(dependencyName);\n }\n }\n\n dependencyMap.set(schema.name, dependencies);\n }\n\n const sorted: GeneratorSchema[] = [];\n const temporary = new Set<string>();\n const permanent = new Set<string>();\n const schemaMap = new Map(schemas.map((schema) => [schema.name, schema]));\n\n const visit = (name: string) => {\n if (permanent.has(name)) {\n return;\n }\n\n if (temporary.has(name)) {\n // Circular dependency detected; retain current DFS order for this cycle\n return;\n }\n\n temporary.add(name);\n\n const dependencies = dependencyMap.get(name);\n if (dependencies)\n for (const dep of dependencies) {\n if (dep !== name) {\n visit(dep);\n }\n }\n\n temporary.delete(name);\n permanent.add(name);\n\n const schema = schemaMap.get(name);\n if (schema) {\n sorted.push(schema);\n }\n };\n\n for (const schema of schemas) visit(schema.name);\n\n return sorted;\n}\n\nfunction shouldCreateInterface(schema: OpenApiSchemaObject) {\n const isNullable = isArray(schema.type) && schema.type.includes('null');\n\n return (\n (!schema.type || schema.type === 'object') &&\n !schema.allOf &&\n !schema.oneOf &&\n !schema.anyOf &&\n isDereferenced(schema) &&\n !schema.enum &&\n !isNullable\n );\n}\n\nfunction generateSchemaDefinitions(\n schemaName: string,\n schema: OpenApiSchemaObject,\n context: ContextSpec,\n suffix: string,\n): GeneratorSchema[] {\n const sanitizedSchemaName = sanitize(`${pascal(schemaName)}${suffix}`, {\n underscore: '_',\n whitespace: '_',\n dash: true,\n es5keyword: true,\n es5IdentifierName: true,\n });\n\n if (isBoolean(schema)) {\n return [\n {\n name: sanitizedSchemaName,\n model: `export type ${sanitizedSchemaName} = ${schema ? 'any' : 'never'};\\n`,\n imports: [],\n schema: schema as OpenApiSchemaObject,\n },\n ];\n }\n\n if (shouldCreateInterface(schema)) {\n return generateInterface({\n name: sanitizedSchemaName,\n schema,\n context,\n });\n }\n\n const resolvedValue = resolveValue({\n schema,\n name: sanitizedSchemaName,\n context,\n });\n\n let output = '';\n\n let imports = resolvedValue.imports;\n\n output += jsDoc(schema);\n\n if (resolvedValue.isEnum && !resolvedValue.isRef) {\n output += getEnum(\n resolvedValue.value,\n sanitizedSchemaName,\n getEnumNames(resolvedValue.originalSchema),\n context.output.override.enumGenerationType,\n getEnumDescriptions(resolvedValue.originalSchema),\n context.output.override.namingConvention.enum,\n );\n } else if (\n sanitizedSchemaName === resolvedValue.value &&\n resolvedValue.isRef\n ) {\n // Don't add type if schema has same name and the referred schema will be an interface\n const { schema: referredSchema } = resolveRef(schema, context);\n if (!shouldCreateInterface(referredSchema as OpenApiSchemaObject)) {\n const imp = resolvedValue.imports.find(\n (imp) => imp.name === sanitizedSchemaName,\n );\n\n if (imp) {\n const alias = `${resolvedValue.value}Bis`;\n\n output += `export type ${sanitizedSchemaName} = ${alias};\\n`;\n\n imports = imports.map((imp) =>\n imp.name === sanitizedSchemaName ? { ...imp, alias } : imp,\n );\n resolvedValue.dependencies = [imp.name];\n } else {\n output += `export type ${sanitizedSchemaName} = ${resolvedValue.value};\\n`;\n }\n }\n } else {\n resolvedValue.schemas = resolvedValue.schemas.filter((schema) => {\n if (schema.name !== sanitizedSchemaName) {\n return true;\n }\n\n output += `${schema.model}\\n`;\n imports = [...imports, ...schema.imports];\n resolvedValue.dependencies.push(...(schema.dependencies ?? []));\n\n return false;\n });\n output += `export type ${sanitizedSchemaName} = ${resolvedValue.value};\\n`;\n }\n\n return [\n ...resolvedValue.schemas,\n {\n name: sanitizedSchemaName,\n model: output,\n imports,\n dependencies: resolvedValue.dependencies,\n schema,\n },\n ];\n}\n","import {\n getBodiesByContentType,\n getBody,\n getOperationId,\n getParameters,\n getParams,\n getProps,\n getQueryParams,\n getResponse,\n} from '../getters';\nimport type {\n ContextSpec,\n GeneratorVerbOptions,\n GeneratorVerbsOptions,\n GetterBody,\n NormalizedInputOptions,\n NormalizedMutator,\n NormalizedOperationOptions,\n NormalizedOutputOptions,\n NormalizedOverrideOutput,\n OpenApiComponentsObject,\n OpenApiOperationObject,\n OpenApiPathItemObject,\n OpenApiRequestBodyObject,\n Verbs,\n} from '../types';\nimport {\n asyncReduce,\n camel,\n dynamicImport,\n isObject,\n isString,\n isVerb,\n jsDoc,\n mergeDeep,\n sanitize,\n} from '../utils';\nimport { filteredVerbs } from './input-filters';\nimport { generateMutator } from './mutator';\n\nexport interface GenerateVerbOptionsParams {\n verb: Verbs;\n output: NormalizedOutputOptions;\n operation: OpenApiOperationObject;\n route: string;\n pathRoute: string;\n verbParameters?: OpenApiPathItemObject['parameters'];\n components?: OpenApiComponentsObject;\n context: ContextSpec;\n}\n\nasync function buildVerbOption({\n verb,\n output,\n operation,\n route,\n pathRoute,\n verbParameters = [],\n context,\n body,\n operationName,\n operationId,\n override,\n tags,\n deprecated,\n description,\n summary,\n}: {\n verb: Verbs;\n output: NormalizedOutputOptions;\n operation: OpenApiOperationObject;\n route: string;\n pathRoute: string;\n verbParameters: OpenApiPathItemObject['parameters'];\n context: ContextSpec;\n body: GetterBody;\n operationName: string;\n operationId: string;\n override: NormalizedOverrideOutput;\n tags: string[];\n deprecated: boolean | undefined;\n description: string | undefined;\n summary: string | undefined;\n}): Promise<GeneratorVerbOptions> {\n const response = getResponse({\n responses: operation.responses ?? {},\n operationName,\n context,\n contentType: override.contentType,\n });\n\n const parameters = getParameters({\n parameters: [...verbParameters, ...(operation.parameters ?? [])],\n context,\n });\n\n const queryParams = getQueryParams({\n queryParams: parameters.query,\n operationName,\n context,\n });\n\n const headers = output.headers\n ? getQueryParams({\n queryParams: parameters.header,\n operationName,\n context,\n suffix: 'headers',\n })\n : undefined;\n\n const params = getParams({\n route,\n pathParams: parameters.path,\n operationId,\n context,\n output,\n });\n\n const props = getProps({\n body,\n queryParams,\n params,\n headers,\n operationName,\n context,\n });\n\n const mutator = await generateMutator({\n output: output.target,\n name: operationName,\n mutator: override.mutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n });\n\n const formData =\n !override.formData.disabled && body.formData\n ? await generateMutator({\n output: output.target,\n name: operationName,\n mutator: override.formData.mutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const formUrlEncoded =\n isString(override.formUrlEncoded) || isObject(override.formUrlEncoded)\n ? await generateMutator({\n output: output.target,\n name: operationName,\n mutator: override.formUrlEncoded as NormalizedMutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const paramsSerializer =\n isString(override.paramsSerializer) || isObject(override.paramsSerializer)\n ? await generateMutator({\n output: output.target,\n name: 'paramsSerializer',\n mutator: override.paramsSerializer as NormalizedMutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const paramsFilter =\n isString(override.paramsFilter) || isObject(override.paramsFilter)\n ? await generateMutator({\n output: output.target,\n name: 'paramsFilter',\n mutator: override.paramsFilter as NormalizedMutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const fetchReviver =\n isString(override.fetch.jsonReviver) || isObject(override.fetch.jsonReviver)\n ? await generateMutator({\n output: output.target,\n name: 'fetchReviver',\n mutator: override.fetch.jsonReviver as NormalizedMutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n const doc = jsDoc({ description, deprecated, summary });\n\n const verbOption: GeneratorVerbOptions = {\n verb,\n tags,\n route,\n pathRoute,\n summary,\n operationId,\n operationName,\n response,\n body,\n headers,\n queryParams,\n params,\n props,\n mutator,\n formData,\n formUrlEncoded,\n paramsSerializer,\n paramsFilter,\n fetchReviver,\n override,\n doc,\n deprecated,\n originalOperation: operation,\n };\n\n const transformer = await dynamicImport(\n override.transformer,\n context.workspace,\n );\n\n return transformer ? transformer(verbOption) : verbOption;\n}\n\nexport async function generateVerbOptions({\n verb,\n output,\n operation,\n route,\n pathRoute,\n verbParameters = [],\n context,\n}: GenerateVerbOptionsParams): Promise<GeneratorVerbOptions[]> {\n const {\n requestBody,\n tags: rawTags,\n deprecated: rawDeprecated,\n description: rawDescription,\n summary: rawSummary,\n } = operation;\n\n // Bridge assertions: OpenApiOperationObject has AnyOtherAttribute index signature\n // which makes all destructured properties `any`. Assert to their declared types.\n const tags = (rawTags ?? []) as string[];\n const deprecated = rawDeprecated as boolean | undefined;\n const description = rawDescription as string | undefined;\n const summary = rawSummary as string | undefined;\n const operationId = getOperationId(operation, route, verb);\n const overrideOperation = output.override.operations[operationId];\n let overrideTag: NormalizedOperationOptions = {};\n for (const [tag, options] of Object.entries(output.override.tags)) {\n if (tags.includes(tag) && options) {\n overrideTag = mergeDeep(overrideTag, options);\n }\n }\n\n const override = mergeDeep(\n mergeDeep(output.override, overrideTag),\n overrideOperation ?? {},\n ) as NormalizedOverrideOutput;\n\n const overrideOperationName =\n overrideOperation?.operationName ?? output.override.operationName;\n const operationName = overrideOperationName\n ? overrideOperationName(operation, route, verb)\n : sanitize(camel(operationId), { es5keyword: true });\n\n const splitByContentType = override.splitByContentType;\n\n if (splitByContentType && requestBody) {\n const bodies = getBodiesByContentType({\n requestBody,\n operationName,\n context,\n contentType: override.contentType,\n });\n\n const results: GeneratorVerbOptions[] = [];\n for (const bodyEntry of bodies) {\n const { contentTypeSuffix, ...body } = bodyEntry;\n const suffixedName = contentTypeSuffix\n ? `${operationName}With${contentTypeSuffix}`\n : operationName;\n\n const verbOption = await buildVerbOption({\n verb,\n output,\n operation,\n route,\n pathRoute,\n verbParameters,\n context,\n body,\n operationName: suffixedName,\n operationId,\n override,\n tags,\n deprecated,\n description,\n summary,\n });\n results.push(verbOption);\n }\n return results;\n }\n\n const body = requestBody\n ? getBody({\n requestBody,\n operationName,\n context,\n contentType: override.contentType,\n })\n : {\n originalSchema: {} as OpenApiRequestBodyObject,\n definition: '',\n implementation: '',\n imports: [],\n schemas: [],\n formData: '',\n formUrlEncoded: '',\n contentType: '',\n isOptional: false,\n };\n\n const verbOption = await buildVerbOption({\n verb,\n output,\n operation,\n route,\n pathRoute,\n verbParameters,\n context,\n body,\n operationName,\n operationId,\n override,\n tags,\n deprecated,\n description,\n summary,\n });\n\n return [verbOption];\n}\n\nexport interface GenerateVerbsOptionsParams {\n verbs: OpenApiPathItemObject;\n input: NormalizedInputOptions;\n output: NormalizedOutputOptions;\n route: string;\n pathRoute: string;\n context: ContextSpec;\n}\n\nexport function generateVerbsOptions({\n verbs,\n input,\n output,\n route,\n pathRoute,\n context,\n}: GenerateVerbsOptionsParams): Promise<GeneratorVerbsOptions> {\n return asyncReduce(\n filteredVerbs(verbs, input.filters),\n async (acc, [verb, operation]: [string, OpenApiOperationObject]) => {\n if (isVerb(verb)) {\n const verbOptions = await generateVerbOptions({\n verb,\n output,\n verbParameters: verbs.parameters,\n route,\n pathRoute,\n operation,\n context,\n });\n\n acc.push(...verbOptions);\n }\n\n return acc;\n },\n [] as GeneratorVerbsOptions,\n );\n}\n","import fs from 'fs-extra';\n\nconst TRAILING_WHITESPACE_RE = /[^\\S\\r\\n]+$/gm;\n\n/**\n * Write generated code to a file, stripping trailing whitespace from each line.\n *\n * Template literals in code generators can produce lines with only whitespace\n * when conditional expressions evaluate to empty strings. This function\n * ensures the output is always clean regardless of generator implementation.\n */\nexport async function writeGeneratedFile(\n filePath: string,\n content: string,\n): Promise<void> {\n await fs.outputFile(filePath, content.replaceAll(TRAILING_WHITESPACE_RE, ''));\n}\n","import nodePath from 'node:path';\n\nimport fs from 'fs-extra';\nimport { groupBy } from 'remeda';\n\nimport { generateImports } from '../generators';\nimport {\n type GeneratorImport,\n type GeneratorSchema,\n NamingConvention,\n type Tsconfig,\n} from '../types';\nimport { conventionName, getImportExtension, upath } from '../utils';\nimport { writeGeneratedFile } from './file';\n\ntype CanonicalInfo = Pick<GeneratorImport, 'importPath' | 'name'>;\n\n/**\n * Patterns to detect operation-derived types (params, bodies, responses).\n * These types are auto-generated from OpenAPI operations, not from component schemas.\n */\nconst OPERATION_TYPE_PATTERNS = [\n /Params$/i, // GetUserParams, ListUsersParams\n /Body$/, // CreateUserBody, UpdatePostBody (case-sensitive to avoid \"Antibody\")\n /Body(One|Two|Three|Four|Five|Item)$/, // BodyOne, BodyTwo (union body types)\n /Parameter$/i, // PageParameter, LimitParameter\n /Query$/i, // GetUserQuery\n /Header$/i, // AuthHeader\n /Response\\d*$/i, // GetUser200Response, NotFoundResponse\n /^[1-5]\\d{2}$/, // 200, 201, 404 (valid HTTP status codes: 1xx-5xx)\n /\\d{3}(One|Two|Three|Four|Five|Item)$/i, // 200One, 200Two (union response types)\n /^(get|post|put|patch|delete|head|options)[A-Z].*\\d{3}$/, // operation types with status codes (get...200, post...404)\n];\n\n/**\n * Check if a schema name matches operation type patterns.\n */\nfunction isOperationType(schemaName: string): boolean {\n return OPERATION_TYPE_PATTERNS.some((pattern) => pattern.test(schemaName));\n}\n\n/**\n * Split schemas into regular and operation types.\n */\nexport function splitSchemasByType(schemas: GeneratorSchema[]): {\n regularSchemas: GeneratorSchema[];\n operationSchemas: GeneratorSchema[];\n} {\n const regularSchemas: GeneratorSchema[] = [];\n const operationSchemas: GeneratorSchema[] = [];\n\n for (const schema of schemas) {\n if (isOperationType(schema.name)) {\n operationSchemas.push(schema);\n } else {\n regularSchemas.push(schema);\n }\n }\n\n return { regularSchemas, operationSchemas };\n}\n\n/**\n * Fix cross-directory imports when schemas reference other schemas in a different directory.\n * Updates import paths to use correct relative paths between directories.\n */\nfunction fixSchemaImports(\n schemas: GeneratorSchema[],\n targetSchemaNames: Set<string>,\n fromPath: string,\n toPath: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n tsconfig?: Tsconfig,\n): void {\n const relativePath = upath.relativeSafe(fromPath, toPath);\n const importExtension = getImportExtension(fileExtension, tsconfig);\n\n for (const schema of schemas) {\n schema.imports = schema.imports.map((imp) => {\n if (targetSchemaNames.has(imp.name)) {\n const fileName = conventionName(imp.name, namingConvention);\n return {\n ...imp,\n importPath: upath.joinSafe(relativePath, fileName) + importExtension,\n };\n }\n return imp;\n });\n }\n}\n\n/**\n * Fix imports in operation schemas that reference regular schemas.\n */\nexport function fixCrossDirectoryImports(\n operationSchemas: GeneratorSchema[],\n regularSchemaNames: Set<string>,\n schemaPath: string,\n operationSchemaPath: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n tsconfig?: Tsconfig,\n): void {\n fixSchemaImports(\n operationSchemas,\n regularSchemaNames,\n operationSchemaPath,\n schemaPath,\n namingConvention,\n fileExtension,\n tsconfig,\n );\n}\n\n/**\n * Fix imports in regular schemas that reference operation schemas.\n */\nexport function fixRegularSchemaImports(\n regularSchemas: GeneratorSchema[],\n operationSchemaNames: Set<string>,\n schemaPath: string,\n operationSchemaPath: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n tsconfig?: Tsconfig,\n): void {\n fixSchemaImports(\n regularSchemas,\n operationSchemaNames,\n schemaPath,\n operationSchemaPath,\n namingConvention,\n fileExtension,\n tsconfig,\n );\n}\n\nfunction getSchemaKey(\n schemaPath: string,\n schemaName: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n) {\n return getPath(\n schemaPath,\n conventionName(schemaName, namingConvention),\n fileExtension,\n )\n .toLowerCase()\n .replaceAll('\\\\', '/');\n}\n\nfunction getSchemaGroups(\n schemaPath: string,\n schemas: GeneratorSchema[],\n namingConvention: NamingConvention,\n fileExtension: string,\n) {\n return groupBy(schemas, (schema) =>\n getSchemaKey(schemaPath, schema.name, namingConvention, fileExtension),\n );\n}\n\nfunction getCanonicalMap(\n schemaGroups: Record<string, GeneratorSchema[]>,\n schemaPath: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n) {\n const canonicalPathMap = new Map<string, CanonicalInfo>();\n const canonicalNameMap = new Map<string, CanonicalInfo>();\n\n for (const [key, groupSchemas] of Object.entries(schemaGroups)) {\n const canonicalPath = getPath(\n schemaPath,\n conventionName(groupSchemas[0].name, namingConvention),\n fileExtension,\n );\n\n const canonicalInfo = {\n importPath: canonicalPath,\n name: groupSchemas[0].name,\n };\n\n canonicalPathMap.set(key, canonicalInfo);\n for (const schema of groupSchemas) {\n canonicalNameMap.set(schema.name, canonicalInfo);\n }\n }\n\n return {\n canonicalPathMap,\n canonicalNameMap,\n };\n}\n\nfunction normalizeCanonicalImportPaths(\n schemas: GeneratorSchema[],\n canonicalPathMap: Map<string, CanonicalInfo>,\n canonicalNameMap: Map<string, CanonicalInfo>,\n schemaPath: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n tsconfig?: Tsconfig,\n) {\n const importExtension = getImportExtension(fileExtension, tsconfig);\n for (const schema of schemas) {\n schema.imports = schema.imports.map((imp) => {\n const canonicalByName = canonicalNameMap.get(imp.name);\n\n const resolvedImportKey = resolveImportKey(\n schemaPath,\n imp.importPath ?? `./${conventionName(imp.name, namingConvention)}`,\n fileExtension,\n );\n const canonicalByPath = canonicalPathMap.get(resolvedImportKey);\n const canonical = canonicalByName ?? canonicalByPath;\n if (!canonical?.importPath) return imp;\n\n const relative = upath.relativeSafe(\n schemaPath,\n canonical.importPath.replaceAll('\\\\', '/'),\n );\n // `relative` derives from canonical.importPath (built via getPath) so it\n // normally ends with `fileExtension`; the `.ts$` branch is a defensive\n // fallback for legacy/hardcoded `.ts` paths that don't match the\n // configured fileExtension (e.g. `.gen.ts`).\n const withoutFileExtension = relative.endsWith(fileExtension)\n ? relative.slice(0, -fileExtension.length)\n : relative.replace(/\\.ts$/, '');\n const importPath = `${withoutFileExtension}${importExtension}`;\n\n return { ...imp, importPath };\n });\n }\n}\n\nfunction mergeSchemaGroup(schemas: GeneratorSchema[]): GeneratorSchema {\n const baseSchemaName = schemas[0].name;\n const baseSchema = schemas[0].schema;\n const mergedImports = [\n ...new Map(\n schemas\n .flatMap((schema) => schema.imports)\n .map((imp) => [JSON.stringify(imp), imp]),\n ).values(),\n ];\n const mergedDependencies = [\n ...new Set(schemas.flatMap((schema) => schema.dependencies ?? [])),\n ];\n return {\n name: baseSchemaName,\n schema: baseSchema,\n model: schemas.map((schema) => schema.model).join('\\n'),\n imports: mergedImports,\n dependencies: mergedDependencies,\n };\n}\n\nfunction resolveImportKey(\n schemaPath: string,\n importPath: string,\n fileExtension: string,\n) {\n return upath\n .join(schemaPath, `${importPath}${fileExtension}`)\n .toLowerCase()\n .replaceAll('\\\\', '/');\n}\n\ninterface GetSchemaOptions {\n schema: GeneratorSchema;\n target: string;\n header: string;\n namingConvention?: NamingConvention;\n importExtension?: string;\n}\n\nfunction getSchema({\n schema: { imports, model },\n header,\n namingConvention = NamingConvention.CAMEL_CASE,\n importExtension,\n}: GetSchemaOptions): string {\n let file = header;\n file += generateImports({\n imports: imports.filter(\n (imp) =>\n !model.includes(`type ${imp.alias ?? imp.name} =`) &&\n !model.includes(`interface ${imp.alias ?? imp.name} {`),\n ),\n namingConvention,\n importExtension,\n });\n file += imports.length > 0 ? '\\n\\n' : '\\n';\n file += model;\n return file;\n}\n\nfunction getPath(path: string, name: string, fileExtension: string): string {\n return nodePath.join(path, `${name}${fileExtension}`);\n}\n\nexport function writeModelInline(acc: string, model: string): string {\n return acc + `${model}\\n`;\n}\n\nexport function writeModelsInline(array: GeneratorSchema[]): string {\n let acc = '';\n for (const { model } of array) {\n acc = writeModelInline(acc, model);\n }\n return acc;\n}\n\ninterface WriteSchemaOptions {\n path: string;\n schema: GeneratorSchema;\n target: string;\n namingConvention: NamingConvention;\n fileExtension: string;\n header: string;\n tsconfig?: Tsconfig;\n}\n\nexport async function writeSchema({\n path,\n schema,\n target,\n namingConvention,\n fileExtension,\n header,\n tsconfig,\n}: WriteSchemaOptions) {\n const name = conventionName(schema.name, namingConvention);\n\n try {\n await writeGeneratedFile(\n getPath(path, name, fileExtension),\n getSchema({\n schema,\n target,\n header,\n namingConvention,\n importExtension: getImportExtension(fileExtension, tsconfig),\n }),\n );\n } catch (error) {\n throw new Error(\n `Oups... 🍻. An Error occurred while writing schema ${name} => ${String(error)}`,\n { cause: error },\n );\n }\n}\n\ninterface WriteSchemasOptions {\n schemaPath: string;\n schemas: GeneratorSchema[];\n target: string;\n namingConvention: NamingConvention;\n fileExtension: string;\n header: string;\n indexFiles: boolean;\n tsconfig?: Tsconfig;\n}\n\nexport async function writeSchemas({\n schemaPath,\n schemas,\n target,\n namingConvention,\n fileExtension,\n header,\n indexFiles,\n tsconfig,\n}: WriteSchemasOptions) {\n const schemaGroups = getSchemaGroups(\n schemaPath,\n schemas,\n namingConvention,\n fileExtension,\n );\n\n const { canonicalPathMap, canonicalNameMap } = getCanonicalMap(\n schemaGroups,\n schemaPath,\n namingConvention,\n fileExtension,\n );\n\n normalizeCanonicalImportPaths(\n schemas,\n canonicalPathMap,\n canonicalNameMap,\n schemaPath,\n namingConvention,\n fileExtension,\n tsconfig,\n );\n\n for (const groupSchemas of Object.values(schemaGroups)) {\n if (groupSchemas.length === 1) {\n await writeSchema({\n path: schemaPath,\n schema: groupSchemas[0],\n target,\n namingConvention,\n fileExtension,\n header,\n tsconfig,\n });\n continue;\n }\n\n const mergedSchema = mergeSchemaGroup(groupSchemas);\n\n await writeSchema({\n path: schemaPath,\n schema: mergedSchema,\n target,\n namingConvention,\n fileExtension,\n header,\n tsconfig,\n });\n }\n\n if (indexFiles) {\n const schemaFilePath = nodePath.join(schemaPath, `index.ts`);\n await fs.ensureFile(schemaFilePath);\n\n // Ensure separate files are used for parallel schema writing.\n // Throw an exception if duplicates are detected (using convention names)\n const ext = getImportExtension(fileExtension, tsconfig);\n const conventionNamesSet = new Set(\n Object.values(schemaGroups).map((group) =>\n conventionName(group[0].name, namingConvention),\n ),\n );\n\n try {\n // Create unique export statements from schemas (deduplicate by schema name)\n const uniqueSchemaNames = [...conventionNamesSet];\n\n // Create export statements\n const currentExports = uniqueSchemaNames\n .map((schemaName) => `export * from './${schemaName}${ext}';`)\n .toSorted((a, b) => a.localeCompare(b, 'en', { numeric: true }));\n\n const exports = currentExports.join('\\n');\n\n const fileContent = `${header}\\n${exports}\\n`;\n\n await writeGeneratedFile(schemaFilePath, fileContent);\n } catch (error) {\n throw new Error(\n `Oups... 🍻. An Error occurred while writing schema index file ${schemaFilePath} => ${String(error)}`,\n { cause: error },\n );\n }\n }\n}\n","import { uniqueBy } from 'remeda';\n\nimport type {\n GeneratorDependency,\n GeneratorImport,\n NormalizedOutputOptions,\n} from '../types';\nimport { conventionName, getImportExtension, isObject, upath } from '../utils';\n\nexport function generateImportsForBuilder(\n output: NormalizedOutputOptions,\n imports: readonly GeneratorImport[],\n relativeSchemasPath: string,\n): GeneratorDependency[] {\n const isZodSchemaOutput =\n isObject(output.schemas) && output.schemas.type === 'zod';\n\n let schemaImports: GeneratorDependency[];\n if (output.indexFiles) {\n schemaImports = isZodSchemaOutput\n ? [\n {\n exports: imports.filter((i) => !i.importPath),\n dependency: relativeSchemasPath,\n },\n ]\n : [\n {\n exports: imports.filter((i) => !i.importPath),\n dependency: relativeSchemasPath,\n },\n ];\n } else {\n const importsByDependency = new Map<string, GeneratorImport[]>();\n\n for (const schemaImport of imports.filter((i) => !i.importPath)) {\n const baseName = isZodSchemaOutput\n ? schemaImport.name\n : (schemaImport.schemaName ?? schemaImport.name);\n const normalizedName = conventionName(baseName, output.namingConvention);\n const suffix = isZodSchemaOutput ? '.zod' : '';\n const importExtension = getImportExtension(\n output.fileExtension,\n output.tsconfig,\n );\n const dependency = upath.joinSafe(\n relativeSchemasPath,\n `${normalizedName}${suffix}${importExtension}`,\n );\n\n if (!importsByDependency.has(dependency)) {\n importsByDependency.set(dependency, []);\n }\n importsByDependency.get(dependency)?.push(schemaImport);\n }\n\n schemaImports = [...importsByDependency.entries()].map(\n ([dependency, dependencyImports]) => ({\n dependency,\n exports: uniqueBy(\n dependencyImports,\n (entry) =>\n `${entry.name}|${entry.alias ?? ''}|${String(entry.values)}|${String(\n entry.default,\n )}`,\n ),\n }),\n );\n }\n\n const otherImports = uniqueBy(\n imports.filter(\n (i): i is GeneratorImport & { importPath: string } => !!i.importPath,\n ),\n (x) => x.name + x.importPath,\n ).map<GeneratorDependency>((i) => {\n return {\n exports: [i],\n dependency: i.importPath,\n };\n });\n\n return [...schemaImports, ...otherImports];\n}\n","import {\n type GeneratorMockOutput,\n type GeneratorMockOutputFull,\n OutputMockType,\n} from '../types';\n\n/**\n * Collapses the per-generator mock outputs for \"inline\" writer modes\n * (`single`, `tags`) where every mock generator's content is concatenated\n * into the implementation file. The MSW generator already emits the\n * response-factory functions (`get<Op>ResponseMock`) that Faker would emit,\n * so when both generators are configured we keep MSW and drop Faker to\n * avoid duplicate function declarations and re-imported faker bindings.\n */\nexport function collapseInlineMockOutputs<\n T extends GeneratorMockOutput | GeneratorMockOutputFull,\n>(mockOutputs: T[]): T[] {\n const hasMsw = mockOutputs.some((m) => m.type === OutputMockType.MSW);\n if (!hasMsw) return mockOutputs;\n return mockOutputs.filter((m) => m.type !== OutputMockType.FAKER);\n}\n","import {\n type GeneratorMockOutput,\n type GeneratorMockOutputFull,\n type GeneratorTarget,\n type GeneratorTargetFull,\n type NormalizedOutputOptions,\n OutputClient,\n type WriteSpecBuilder,\n} from '../types';\nimport { compareVersions, pascal } from '../utils';\n\nfunction emptyMockOutputFull(\n type: GeneratorMockOutputFull['type'],\n): GeneratorMockOutputFull {\n return {\n type,\n implementation: { function: '', handler: '', handlerName: '' },\n imports: [],\n };\n}\n\nfunction flattenMockOutput(full: GeneratorMockOutputFull): GeneratorMockOutput {\n return {\n type: full.type,\n implementation: full.implementation.function + full.implementation.handler,\n imports: full.imports,\n };\n}\n\nexport function generateTarget(\n builder: WriteSpecBuilder,\n options: NormalizedOutputOptions,\n): GeneratorTarget {\n const operationNames = Object.values(builder.operations).map(\n ({ operationName }) => operationName,\n );\n const isAngularClient = options.client === OutputClient.ANGULAR;\n\n const titles = builder.title({\n outputClient: options.client,\n title: pascal(builder.info.title),\n customTitleFunc: options.override.title,\n output: options,\n });\n\n const target: Required<Omit<GeneratorTargetFull, 'mockOutputs'>> & {\n mockOutputs: GeneratorMockOutputFull[];\n } = {\n imports: [],\n implementation: '',\n mockOutputs: [],\n mutators: [],\n clientMutators: [],\n formData: [],\n formUrlEncoded: [],\n paramsSerializer: [],\n paramsFilter: [],\n fetchReviver: [],\n };\n const operations = Object.values(builder.operations);\n for (const [index, operation] of operations.entries()) {\n target.imports.push(...operation.imports);\n target.implementation += operation.implementation + '\\n';\n\n // Merge per-mock-type outputs from this operation into the accumulator.\n for (const opMock of operation.mockOutputs) {\n let acc = target.mockOutputs.find((m) => m.type === opMock.type);\n if (!acc) {\n acc = emptyMockOutputFull(opMock.type);\n target.mockOutputs.push(acc);\n }\n acc.imports.push(...opMock.imports);\n acc.implementation.function += opMock.implementation.function;\n acc.implementation.handler += opMock.implementation.handler;\n if (opMock.implementation.handlerName) {\n const separator =\n acc.implementation.handlerName.length > 0 ? ',\\n ' : ' ';\n acc.implementation.handlerName +=\n separator + opMock.implementation.handlerName + '()';\n }\n }\n\n if (operation.mutator) {\n target.mutators.push(operation.mutator);\n }\n\n if (operation.formData) {\n target.formData.push(operation.formData);\n }\n if (operation.formUrlEncoded) {\n target.formUrlEncoded.push(operation.formUrlEncoded);\n }\n if (operation.paramsSerializer) {\n target.paramsSerializer.push(operation.paramsSerializer);\n }\n if (operation.paramsFilter) {\n target.paramsFilter.push(operation.paramsFilter);\n }\n\n if (operation.clientMutators) {\n target.clientMutators.push(...operation.clientMutators);\n }\n\n if (operation.fetchReviver) {\n target.fetchReviver.push(operation.fetchReviver);\n }\n\n if (index === operations.length - 1) {\n const isMutator = target.mutators.some((mutator) =>\n isAngularClient ? mutator.hasThirdArg : mutator.hasSecondArg,\n );\n\n const typescriptVersion =\n options.packageJson?.dependencies?.typescript ??\n options.packageJson?.devDependencies?.typescript ??\n '4.4.0';\n\n const hasAwaitedType = compareVersions(typescriptVersion, '4.5.0');\n\n const header = builder.header({\n outputClient: options.client,\n isRequestOptions: options.override.requestOptions !== false,\n isMutator,\n isGlobalMutator: !!options.override.mutator,\n provideIn: options.override.angular.provideIn,\n hasAwaitedType,\n titles,\n output: options,\n verbOptions: builder.verbOptions,\n clientImplementation: target.implementation,\n });\n\n target.implementation = header.implementation + target.implementation;\n\n const footer = builder.footer({\n outputClient: options.client,\n operationNames,\n hasMutator: target.mutators.length > 0,\n hasAwaitedType,\n titles,\n output: options,\n });\n target.implementation += footer.implementation;\n\n // Append the aggregated handler array (header + footer wrap) to every\n // mock output that has at least one handler. Faker-only outputs (no\n // handlerName) do not get the wrapper.\n for (const acc of target.mockOutputs) {\n if (acc.implementation.handlerName) {\n acc.implementation.handler =\n acc.implementation.handler +\n header.implementationMock +\n acc.implementation.handlerName +\n footer.implementationMock;\n }\n }\n }\n }\n\n return {\n imports: target.imports,\n implementation: target.implementation,\n mockOutputs: target.mockOutputs.map((m) => flattenMockOutput(m)),\n mutators: target.mutators,\n clientMutators: target.clientMutators,\n formData: target.formData,\n formUrlEncoded: target.formUrlEncoded,\n paramsSerializer: target.paramsSerializer,\n paramsFilter: target.paramsFilter,\n fetchReviver: target.fetchReviver,\n };\n}\n","export function getOrvalGeneratedTypes() {\n return `\n// https://stackoverflow.com/questions/49579094/typescript-conditional-types-filter-out-readonly-properties-pick-only-requir/49579497#49579497\ntype IfEquals<X, Y, A = X, B = never> = (<T>() => T extends X ? 1 : 2) extends <\nT,\n>() => T extends Y ? 1 : 2\n? A\n: B;\n\ntype WritableKeys<T> = {\n[P in keyof T]-?: IfEquals<\n { [Q in P]: T[P] },\n { -readonly [Q in P]: T[P] },\n P\n>;\n}[keyof T];\n\ntype UnionToIntersection<U> =\n (U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never;\ntype DistributeReadOnlyOverUnions<T> = T extends any ? NonReadonly<T> : never;\n\ntype Writable<T> = Pick<T, WritableKeys<T>>;\ntype NonReadonly<T> = [T] extends [UnionToIntersection<T>] ? {\n [P in keyof Writable<T>]: T[P] extends object\n ? NonReadonly<NonNullable<T[P]>>\n : T[P];\n} : DistributeReadOnlyOverUnions<T>;\n`;\n}\n\nexport function getTypedResponse() {\n return `\ninterface TypedResponse<T> extends Response {\n json(): Promise<T>;\n}\n`;\n}\n","import { generateModelsInline, generateMutatorImports } from '../generators';\nimport type { WriteModeProps } from '../types';\nimport {\n conventionName,\n getFileInfo,\n isFunction,\n isString,\n isSyntheticDefaultImportsAllow,\n upath,\n} from '../utils';\nimport { escapeRegExp } from '../utils/string';\nimport { writeGeneratedFile } from './file';\nimport { generateImportsForBuilder } from './generate-imports-for-builder';\nimport { collapseInlineMockOutputs } from './mock-outputs';\nimport { generateTarget } from './target';\nimport { getOrvalGeneratedTypes, getTypedResponse } from './types';\n\nexport async function writeSingleMode({\n builder,\n output,\n projectName,\n header,\n needSchema,\n generateSchemasInline,\n}: WriteModeProps): Promise<string[]> {\n try {\n const { path } = getFileInfo(output.target, {\n backupFilename: conventionName(\n builder.info.title ?? 'filename',\n output.namingConvention,\n ),\n extension: output.fileExtension,\n });\n\n const {\n imports,\n mockOutputs: rawMockOutputs,\n implementation,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n paramsSerializer,\n paramsFilter,\n fetchReviver,\n } = generateTarget(builder, output);\n\n // Single-mode appends every mock generator's output into the same\n // `<filename>.ts` file. MSW already emits the response factories that\n // Faker would emit, so when both generators are configured we drop the\n // Faker entry to avoid duplicate function declarations.\n const mockOutputs = collapseInlineMockOutputs(rawMockOutputs);\n\n // Combined mock content emitted at the bottom of the single-mode output\n // file (one block per generator entry).\n const implementationMock = mockOutputs\n .map((m) => m.implementation)\n .join('\\n\\n');\n // Aggregate imports across all mock entries for the value-import promotion\n // pass below.\n const importsMock = mockOutputs.flatMap((m) => m.imports);\n\n let data = header;\n\n const schemasPath = output.schemas\n ? upath.getRelativeImportPath(\n path,\n getFileInfo(\n isString(output.schemas) ? output.schemas : output.schemas.path,\n { extension: output.fileExtension },\n ).dirname,\n )\n : undefined;\n\n const isAllowSyntheticDefaultImports = isSyntheticDefaultImportsAllow(\n output.tsconfig,\n );\n\n const implementationImports = imports.filter((imp) => {\n const searchWords = [imp.alias, imp.name]\n .filter((part): part is string => Boolean(part?.length))\n .map((part) => escapeRegExp(part))\n .join('|');\n if (!searchWords) {\n return false;\n }\n\n return new RegExp(String.raw`\\b(${searchWords})\\b`, 'g').test(\n implementation,\n );\n });\n\n const normalizedImports = implementationImports.map((imp) => ({ ...imp }));\n for (const mockImport of importsMock) {\n const matchingImport = normalizedImports.find(\n (imp) =>\n imp.name === mockImport.name &&\n (imp.alias ?? '') === (mockImport.alias ?? ''),\n );\n if (!matchingImport) continue;\n\n const mockNeedsRuntimeValue =\n !!mockImport.values ||\n !!mockImport.isConstant ||\n !!mockImport.default ||\n !!mockImport.namespaceImport ||\n !!mockImport.syntheticDefaultImport;\n if (mockNeedsRuntimeValue) {\n matchingImport.values = true;\n }\n }\n\n // When `schemas` is unset there is no schemasPath. We must still emit imports\n // that carry `importPath` (e.g. baseUrl.runtime imports), but we must not\n // pass `'.'` for schema-relative imports: that becomes `from '.'` and breaks\n // TS (see samples with a real `schemas` path). So only `importPath` entries\n // use the `.` placeholder when `schemasPath` is missing.\n const importsForBuilder = schemasPath\n ? generateImportsForBuilder(output, normalizedImports, schemasPath)\n : generateImportsForBuilder(\n output,\n normalizedImports.filter((imp) => !!imp.importPath),\n '.',\n );\n\n data += builder.imports({\n client: output.client,\n implementation,\n imports: importsForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n hasGlobalMutator: !!output.override.mutator,\n hasTagsMutator: Object.values(output.override.tags).some(\n (tag) => !!tag?.mutator,\n ),\n hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,\n packageJson: output.packageJson,\n output,\n });\n\n // Emit per-generator-entry mock imports. Each entry produces its own\n // import header (e.g. `from 'msw'` for msw, `from '@faker-js/faker'` for\n // faker) by passing its `options` (with discriminating `type`). Match\n // each mockOutput back to its source generator entry by type so the\n // collapse step above (which drops faker when msw is present) does not\n // misalign indices.\n for (const mockOutput of mockOutputs) {\n const entry = output.mock.generators.find(\n (g) => !isFunction(g) && g.type === mockOutput.type,\n );\n const filteredMockImports = mockOutput.imports.filter(\n (impMock) =>\n !normalizedImports.some(\n (imp) =>\n imp.name === impMock.name &&\n (imp.alias ?? '') === (impMock.alias ?? ''),\n ),\n );\n const importsMockForBuilder = schemasPath\n ? generateImportsForBuilder(output, filteredMockImports, schemasPath)\n : generateImportsForBuilder(\n output,\n filteredMockImports.filter((imp) => !!imp.importPath),\n '.',\n );\n data += builder.importsMock({\n implementation: mockOutput.implementation,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: entry && !isFunction(entry) ? entry : undefined,\n });\n }\n\n if (mutators) {\n data += generateMutatorImports({ mutators, implementation });\n }\n\n if (clientMutators) {\n data += generateMutatorImports({ mutators: clientMutators });\n }\n\n if (formData) {\n data += generateMutatorImports({ mutators: formData });\n }\n\n if (formUrlEncoded) {\n data += generateMutatorImports({ mutators: formUrlEncoded });\n }\n\n if (paramsSerializer) {\n data += generateMutatorImports({ mutators: paramsSerializer });\n }\n\n if (paramsFilter) {\n data += generateMutatorImports({ mutators: paramsFilter });\n }\n\n if (fetchReviver) {\n data += generateMutatorImports({ mutators: fetchReviver });\n }\n\n if (implementation.includes('NonReadonly<')) {\n data += getOrvalGeneratedTypes();\n data += '\\n';\n }\n\n if (implementation.includes('TypedResponse<')) {\n data += getTypedResponse();\n data += '\\n';\n }\n\n if (!output.schemas && needSchema) {\n data += generateSchemasInline\n ? generateSchemasInline()\n : generateModelsInline(builder.schemas);\n }\n\n data += `${implementation.trim()}\\n`;\n\n if (mockOutputs.length > 0) {\n data += '\\n\\n';\n data += implementationMock;\n }\n\n await writeGeneratedFile(path, data);\n\n return [path];\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : 'unknown error';\n throw new Error(\n `Oups... 🍻. An Error occurred while writing file => ${errorMsg}`,\n { cause: error },\n );\n }\n}\n","import path from 'node:path';\n\nimport { generateModelsInline, generateMutatorImports } from '../generators';\nimport {\n type GlobalMockOptions,\n OutputClient,\n type WriteModeProps,\n} from '../types';\nimport {\n conventionName,\n getFileInfo,\n isFunction,\n isString,\n isSyntheticDefaultImportsAllow,\n upath,\n} from '../utils';\nimport { getMockFileExtensionByTypeName } from '../utils/file-extensions';\nimport { writeGeneratedFile } from './file';\nimport { generateImportsForBuilder } from './generate-imports-for-builder';\nimport { generateTarget } from './target';\nimport { getOrvalGeneratedTypes, getTypedResponse } from './types';\n\nexport async function writeSplitMode({\n builder,\n output,\n projectName,\n header,\n needSchema,\n generateSchemasInline,\n}: WriteModeProps): Promise<string[]> {\n try {\n const {\n path: targetPath,\n filename,\n dirname,\n extension,\n } = getFileInfo(output.target, {\n backupFilename: conventionName(\n builder.info.title ?? 'filename',\n output.namingConvention,\n ),\n extension: output.fileExtension,\n });\n\n const {\n imports,\n implementation,\n mockOutputs,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n paramsSerializer,\n paramsFilter,\n fetchReviver,\n } = generateTarget(builder, output);\n\n let implementationData = header;\n\n const relativeSchemasPath = output.schemas\n ? upath.getRelativeImportPath(\n targetPath,\n getFileInfo(\n isString(output.schemas) ? output.schemas : output.schemas.path,\n { extension: output.fileExtension },\n ).dirname,\n )\n : './' + filename + '.schemas' + extension.replace(/\\.ts$/, '');\n\n const isAllowSyntheticDefaultImports = isSyntheticDefaultImportsAllow(\n output.tsconfig,\n );\n\n const importsForBuilder = generateImportsForBuilder(\n output,\n imports,\n relativeSchemasPath,\n );\n\n implementationData += builder.imports({\n client: output.client,\n implementation,\n imports: importsForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n hasGlobalMutator: !!output.override.mutator,\n hasTagsMutator: Object.values(output.override.tags).some(\n (tag) => !!tag?.mutator,\n ),\n hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,\n packageJson: output.packageJson,\n output,\n });\n\n const schemasPath =\n !output.schemas && needSchema\n ? path.join(dirname, filename + '.schemas' + extension)\n : undefined;\n\n if (schemasPath) {\n const schemasData = generateSchemasInline\n ? header + generateSchemasInline()\n : header + generateModelsInline(builder.schemas);\n\n await writeGeneratedFile(schemasPath, schemasData);\n }\n\n if (mutators) {\n implementationData += generateMutatorImports({\n mutators,\n implementation,\n });\n }\n\n if (clientMutators) {\n implementationData += generateMutatorImports({\n mutators: clientMutators,\n });\n }\n\n if (formData) {\n implementationData += generateMutatorImports({ mutators: formData });\n }\n\n if (formUrlEncoded) {\n implementationData += generateMutatorImports({\n mutators: formUrlEncoded,\n });\n }\n\n if (paramsSerializer) {\n implementationData += generateMutatorImports({\n mutators: paramsSerializer,\n });\n }\n\n if (paramsFilter) {\n implementationData += generateMutatorImports({\n mutators: paramsFilter,\n });\n }\n\n if (fetchReviver) {\n implementationData += generateMutatorImports({\n mutators: fetchReviver,\n });\n }\n\n if (implementation.includes('NonReadonly<')) {\n implementationData += getOrvalGeneratedTypes();\n implementationData += '\\n';\n }\n\n if (implementation.includes('TypedResponse<')) {\n implementationData += getTypedResponse();\n implementationData += '\\n';\n }\n\n implementationData += `\\n${implementation}`;\n\n const implementationFilename =\n filename +\n (OutputClient.ANGULAR === output.client ? '.service' : '') +\n extension;\n\n const implementationPath = path.join(dirname, implementationFilename);\n await writeGeneratedFile(implementationPath, implementationData);\n\n // Emit one mock file per configured generator entry. The output filename\n // suffix comes from `getMockFileExtensionByTypeName(entry)` (e.g. `.msw.ts`\n // or `.faker.ts`).\n const mockPaths: string[] = [];\n for (const mockOutput of mockOutputs) {\n const entry = output.mock.generators.find(\n (g): g is GlobalMockOptions =>\n !isFunction(g) && g.type === mockOutput.type,\n );\n if (!entry) continue;\n\n const importsMockForBuilder = generateImportsForBuilder(\n output,\n mockOutput.imports,\n relativeSchemasPath,\n );\n let mockData = header;\n mockData += builder.importsMock({\n implementation: mockOutput.implementation,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: entry,\n });\n mockData += `\\n${mockOutput.implementation}`;\n\n const mockPath = path.join(\n dirname,\n filename + '.' + getMockFileExtensionByTypeName(entry) + extension,\n );\n await writeGeneratedFile(mockPath, mockData);\n mockPaths.push(mockPath);\n }\n\n return [\n implementationPath,\n ...(schemasPath ? [schemasPath] : []),\n ...mockPaths,\n ];\n } catch (error) {\n throw new Error(\n `Oups... 🍻. An Error occurred while splitting => ${String(error)}`,\n { cause: error },\n );\n }\n}\n","import {\n DefaultTag,\n type GeneratorMockOutput,\n type GeneratorMockOutputFull,\n type GeneratorOperation,\n type GeneratorTarget,\n type GeneratorTargetFull,\n type NormalizedOutputOptions,\n OutputClient,\n type WriteSpecBuilder,\n} from '../types';\nimport { compareVersions, kebab, pascal } from '../utils';\n\n/**\n * Ensures every operation has at least one tag by falling back to the\n * {@link DefaultTag} constant for untagged operations, so the tag-routing\n * logic in {@link generateTargetTags} always has a bucket to assign the\n * operation to.\n */\nfunction addDefaultTagIfEmpty(operation: GeneratorOperation) {\n return {\n ...operation,\n tags: operation.tags.length > 0 ? operation.tags : [DefaultTag],\n };\n}\n\nfunction emptyMockOutputFull(\n type: GeneratorMockOutputFull['type'],\n): GeneratorMockOutputFull {\n return {\n type,\n implementation: { function: '', handler: '', handlerName: '' },\n imports: [],\n };\n}\n\nfunction flattenMockOutput(full: GeneratorMockOutputFull): GeneratorMockOutput {\n return {\n type: full.type,\n implementation: full.implementation.function + full.implementation.handler,\n imports: full.imports,\n };\n}\n\nfunction mergeOperationMockOutputs(\n accMockOutputs: GeneratorMockOutputFull[],\n opMockOutputs: GeneratorMockOutputFull[],\n): GeneratorMockOutputFull[] {\n const result: GeneratorMockOutputFull[] = accMockOutputs.map((m) => ({\n type: m.type,\n implementation: { ...m.implementation },\n imports: [...m.imports],\n }));\n for (const op of opMockOutputs) {\n let acc = result.find((m) => m.type === op.type);\n if (!acc) {\n acc = emptyMockOutputFull(op.type);\n result.push(acc);\n }\n acc.imports.push(...op.imports);\n acc.implementation.function += op.implementation.function;\n acc.implementation.handler += op.implementation.handler;\n if (op.implementation.handlerName) {\n const separator =\n acc.implementation.handlerName.length > 0 ? ',\\n ' : ' ';\n acc.implementation.handlerName +=\n separator + op.implementation.handlerName + '()';\n }\n }\n return result;\n}\n\nfunction initialMockOutputsForOperation(\n op: GeneratorOperation,\n): GeneratorMockOutputFull[] {\n return op.mockOutputs.map((m) => ({\n type: m.type,\n implementation: {\n function: m.implementation.function,\n handler: m.implementation.handler,\n handlerName: m.implementation.handlerName\n ? ' ' + m.implementation.handlerName + '()'\n : '',\n },\n imports: [...m.imports],\n }));\n}\n\nfunction generateTargetTags(\n currentAcc: Record<string, GeneratorTargetFull>,\n operation: GeneratorOperation,\n): Record<string, GeneratorTargetFull> {\n const tag = kebab(operation.tags[0]);\n\n if (!(tag in currentAcc)) {\n currentAcc[tag] = {\n imports: operation.imports,\n mockOutputs: initialMockOutputsForOperation(operation),\n mutators: operation.mutator ? [operation.mutator] : [],\n clientMutators: operation.clientMutators ?? [],\n formData: operation.formData ? [operation.formData] : [],\n formUrlEncoded: operation.formUrlEncoded\n ? [operation.formUrlEncoded]\n : [],\n paramsSerializer: operation.paramsSerializer\n ? [operation.paramsSerializer]\n : [],\n paramsFilter: operation.paramsFilter ? [operation.paramsFilter] : [],\n fetchReviver: operation.fetchReviver ? [operation.fetchReviver] : [],\n implementation: operation.implementation,\n };\n\n return currentAcc;\n }\n\n const currentOperation = currentAcc[tag];\n currentAcc[tag] = {\n implementation: currentOperation.implementation + operation.implementation,\n imports: [...currentOperation.imports, ...operation.imports],\n mockOutputs: mergeOperationMockOutputs(\n currentOperation.mockOutputs,\n operation.mockOutputs,\n ),\n mutators: operation.mutator\n ? [...(currentOperation.mutators ?? []), operation.mutator]\n : currentOperation.mutators,\n clientMutators: operation.clientMutators\n ? [\n ...(currentOperation.clientMutators ?? []),\n ...operation.clientMutators,\n ]\n : currentOperation.clientMutators,\n formData: operation.formData\n ? [...(currentOperation.formData ?? []), operation.formData]\n : currentOperation.formData,\n formUrlEncoded: operation.formUrlEncoded\n ? [...(currentOperation.formUrlEncoded ?? []), operation.formUrlEncoded]\n : currentOperation.formUrlEncoded,\n paramsSerializer: operation.paramsSerializer\n ? [\n ...(currentOperation.paramsSerializer ?? []),\n operation.paramsSerializer,\n ]\n : currentOperation.paramsSerializer,\n paramsFilter: operation.paramsFilter\n ? [...(currentOperation.paramsFilter ?? []), operation.paramsFilter]\n : currentOperation.paramsFilter,\n fetchReviver: operation.fetchReviver\n ? [...(currentOperation.fetchReviver ?? []), operation.fetchReviver]\n : currentOperation.fetchReviver,\n };\n return currentAcc;\n}\n\nexport function generateTargetForTags(\n builder: WriteSpecBuilder,\n options: NormalizedOutputOptions,\n) {\n const isAngularClient = options.client === OutputClient.ANGULAR;\n\n const operations = Object.values(builder.operations).map((operation) =>\n addDefaultTagIfEmpty(operation),\n );\n let allTargetTags: Record<string, GeneratorTargetFull> = {};\n for (const [index, operation] of operations.entries()) {\n allTargetTags = generateTargetTags(allTargetTags, operation);\n\n if (index === operations.length - 1) {\n const transformed: Record<string, GeneratorTargetFull> = {};\n for (const [tag, target] of Object.entries(allTargetTags)) {\n const isMutator = !!target.mutators?.some((mutator) =>\n isAngularClient ? mutator.hasThirdArg : mutator.hasSecondArg,\n );\n const operationNames = Object.values(builder.operations)\n // Operations can have multiple tags, but they are grouped by the first\n // tag, therefore we only want to handle the case where the tag\n // is the first in the list of tags.\n .filter(\n ({ tags }) =>\n tags.map((tag) => kebab(tag)).indexOf(kebab(tag)) === 0,\n )\n .map(({ operationName }) => operationName);\n\n const typescriptVersion =\n options.packageJson?.dependencies?.typescript ??\n options.packageJson?.devDependencies?.typescript ??\n '4.4.0';\n\n const hasAwaitedType = compareVersions(typescriptVersion, '4.5.0');\n\n const titles = builder.title({\n outputClient: options.client,\n title: pascal(tag),\n customTitleFunc: options.override.title,\n output: options,\n });\n\n const footer = builder.footer({\n outputClient: options.client,\n operationNames,\n hasMutator: !!target.mutators?.length,\n hasAwaitedType,\n titles,\n output: options,\n });\n\n const header = builder.header({\n outputClient: options.client,\n isRequestOptions: options.override.requestOptions !== false,\n isMutator,\n isGlobalMutator: !!options.override.mutator,\n provideIn: options.override.angular.provideIn,\n hasAwaitedType,\n titles,\n output: options,\n verbOptions: builder.verbOptions,\n tag,\n isDefaultTagBucket:\n tag === 'default' &&\n Object.values(builder.operations).some(\n (operation) => operation.tags.length === 0,\n ),\n clientImplementation: target.implementation,\n });\n\n // Apply the per-tag header/footer wrap to each mock output that has\n // accumulated handler entries. Mock outputs without a handler (faker\n // only) skip the wrap.\n const wrappedMockOutputs: GeneratorMockOutputFull[] =\n target.mockOutputs.map((m) => ({\n type: m.type,\n implementation: {\n function: m.implementation.function,\n handler: m.implementation.handlerName\n ? m.implementation.handler +\n header.implementationMock +\n m.implementation.handlerName +\n footer.implementationMock\n : m.implementation.handler,\n handlerName: m.implementation.handlerName,\n },\n imports: m.imports,\n }));\n\n transformed[tag] = {\n implementation:\n header.implementation +\n target.implementation +\n footer.implementation,\n mockOutputs: wrappedMockOutputs,\n imports: target.imports,\n mutators: target.mutators,\n clientMutators: target.clientMutators,\n formData: target.formData,\n formUrlEncoded: target.formUrlEncoded,\n paramsSerializer: target.paramsSerializer,\n paramsFilter: target.paramsFilter,\n fetchReviver: target.fetchReviver,\n };\n }\n allTargetTags = transformed;\n }\n }\n\n const result: Record<string, GeneratorTarget> = {};\n for (const [tag, target] of Object.entries(allTargetTags)) {\n result[tag] = {\n ...target,\n mockOutputs: target.mockOutputs.map((m) => flattenMockOutput(m)),\n };\n }\n return result;\n}\n","import path from 'node:path';\n\nimport fs from 'fs-extra';\n\nimport { generateModelsInline, generateMutatorImports } from '../generators';\nimport {\n type GlobalMockOptions,\n OutputClient,\n OutputMockType,\n type WriteModeProps,\n} from '../types';\nimport {\n conventionName,\n getFileInfo,\n isFunction,\n isString,\n isSyntheticDefaultImportsAllow,\n pascal,\n upath,\n} from '../utils';\nimport { getMockFileExtensionByTypeName } from '../utils/file-extensions';\nimport { writeGeneratedFile } from './file';\nimport { generateImportsForBuilder } from './generate-imports-for-builder';\nimport { generateTargetForTags } from './target-tags';\nimport { getOrvalGeneratedTypes, getTypedResponse } from './types';\n\nexport async function writeSplitTagsMode({\n builder,\n output,\n projectName,\n header,\n needSchema,\n generateSchemasInline,\n}: WriteModeProps): Promise<string[]> {\n const { filename, dirname, extension } = getFileInfo(output.target, {\n backupFilename: conventionName(\n builder.info.title ?? 'filename',\n output.namingConvention,\n ),\n extension: output.fileExtension,\n });\n\n const target = generateTargetForTags(builder, output);\n\n const isAllowSyntheticDefaultImports = isSyntheticDefaultImportsAllow(\n output.tsconfig,\n );\n\n const hasFunctionGenerators = output.mock.generators.some((g) =>\n isFunction(g),\n );\n if (hasFunctionGenerators) {\n throw new Error(\n 'Function mock generators (ClientMockBuilder) are not supported in tags-split mode. Use typed generators ({ type: \"msw\" } or { type: \"faker\" }).',\n );\n }\n\n const generatorEntries = output.mock.generators.filter(\n (g): g is GlobalMockOptions => !isFunction(g),\n );\n\n // Pre-create per-generator-entry index files (one per entry, e.g.\n // `index.msw.ts` and `index.faker.ts`) so they can be appended to during\n // the per-tag write loop.\n const indexFilePathsByType = new Map<string, string>();\n if (output.mock.indexMockFiles) {\n for (const entry of generatorEntries) {\n const ext = getMockFileExtensionByTypeName(entry);\n const indexPath = path.join(dirname, `index.${ext}${extension}`);\n indexFilePathsByType.set(ext, indexPath);\n await fs.outputFile(indexPath, '');\n }\n }\n\n const tagEntries = Object.entries(target);\n\n const generatedFilePathsArray = await Promise.all(\n tagEntries.map(async ([tag, target]) => {\n try {\n const {\n imports,\n implementation,\n mockOutputs,\n mutators,\n clientMutators,\n formData,\n fetchReviver,\n formUrlEncoded,\n paramsSerializer,\n paramsFilter,\n } = target;\n\n let implementationData = header;\n\n const importerPath = path.join(dirname, tag, tag + extension);\n const relativeSchemasPath = output.schemas\n ? upath.getRelativeImportPath(\n importerPath,\n getFileInfo(\n isString(output.schemas) ? output.schemas : output.schemas.path,\n { extension: output.fileExtension },\n ).dirname,\n )\n : '../' + filename + '.schemas' + extension.replace(/\\.ts$/, '');\n\n // In tags-split mode, each tag lives in its own subdirectory\n // (dirname/tag/tag.ext). Imports with a custom `importPath` (from the\n // `file` option in mutationInvalidates) are specified relative to the\n // output root (dirname) but the consuming file is one level deeper.\n // Resolve these paths so that the generated import is correct.\n const tagNames = new Set(tagEntries.map(([t]) => t));\n const serviceSuffix =\n OutputClient.ANGULAR === output.client ? '.service' : '';\n\n const adjustedImports = imports.map((imp) => {\n if (!imp.importPath) return imp;\n\n // Only adjust relative paths (./foo, ../bar). Package imports\n // like 'rxjs' or '@tanstack/react-query' must be left as-is.\n if (!imp.importPath.startsWith('.')) return imp;\n\n const resolvedPath = path.resolve(dirname, imp.importPath);\n const targetBasename = path.basename(resolvedPath);\n\n let targetFile: string;\n if (tagNames.has(targetBasename)) {\n // Target is a known tag directory. Use the real generated\n // filename which includes the Angular `.service` suffix when\n // applicable (e.g. dirname/health/health.service.ts).\n const tagFilename = targetBasename + serviceSuffix + extension;\n targetFile = path.join(resolvedPath, tagFilename);\n } else {\n targetFile = resolvedPath + extension;\n }\n\n const adjustedPath = upath.getRelativeImportPath(\n importerPath,\n targetFile,\n );\n\n return { ...imp, importPath: adjustedPath };\n });\n\n const importsForBuilder = generateImportsForBuilder(\n output,\n adjustedImports,\n relativeSchemasPath,\n );\n\n implementationData += builder.imports({\n client: output.client,\n implementation,\n imports: importsForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n hasGlobalMutator: !!output.override.mutator,\n hasTagsMutator: Object.values(output.override.tags).some(\n (tag) => !!tag?.mutator,\n ),\n hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,\n packageJson: output.packageJson,\n output,\n });\n\n const schemasPath =\n !output.schemas && needSchema\n ? path.join(dirname, filename + '.schemas' + extension)\n : undefined;\n\n if (schemasPath) {\n const schemasData = generateSchemasInline\n ? header + generateSchemasInline()\n : header + generateModelsInline(builder.schemas);\n\n await writeGeneratedFile(schemasPath, schemasData);\n }\n\n if (mutators) {\n implementationData += generateMutatorImports({\n mutators,\n implementation,\n oneMore: true,\n });\n }\n\n if (clientMutators) {\n implementationData += generateMutatorImports({\n mutators: clientMutators,\n oneMore: true,\n });\n }\n\n if (formData) {\n implementationData += generateMutatorImports({\n mutators: formData,\n oneMore: true,\n });\n }\n if (formUrlEncoded) {\n implementationData += generateMutatorImports({\n mutators: formUrlEncoded,\n oneMore: true,\n });\n }\n if (paramsSerializer) {\n implementationData += generateMutatorImports({\n mutators: paramsSerializer,\n oneMore: true,\n });\n }\n if (paramsFilter) {\n implementationData += generateMutatorImports({\n mutators: paramsFilter,\n oneMore: true,\n });\n }\n\n if (fetchReviver) {\n implementationData += generateMutatorImports({\n mutators: fetchReviver,\n oneMore: true,\n });\n }\n\n if (implementation.includes('NonReadonly<')) {\n implementationData += getOrvalGeneratedTypes();\n implementationData += '\\n';\n }\n\n if (implementation.includes('TypedResponse<')) {\n implementationData += getTypedResponse();\n implementationData += '\\n';\n }\n\n implementationData += `\\n${implementation}`;\n\n const implementationFilename =\n tag +\n (OutputClient.ANGULAR === output.client ? '.service' : '') +\n extension;\n\n const implementationPath = path.join(\n dirname,\n tag,\n implementationFilename,\n );\n await writeGeneratedFile(implementationPath, implementationData);\n\n // Emit one mock file per configured generator entry. Per the\n // current design only non-function generator entries get their own\n // file; ClientMockBuilder functions are not yet supported here.\n const mockPaths: string[] = [];\n for (const mockOutput of mockOutputs) {\n const entry = output.mock.generators.find(\n (g): g is GlobalMockOptions =>\n !isFunction(g) && g.type === mockOutput.type,\n );\n if (!entry) continue;\n\n const importsMockForBuilder = generateImportsForBuilder(\n output,\n mockOutput.imports,\n relativeSchemasPath,\n );\n\n let mockData = header;\n mockData += builder.importsMock({\n implementation: mockOutput.implementation,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: entry,\n });\n mockData += `\\n${mockOutput.implementation}`;\n\n const mockPath = path.join(\n dirname,\n tag,\n tag + '.' + getMockFileExtensionByTypeName(entry) + extension,\n );\n await writeGeneratedFile(mockPath, mockData);\n mockPaths.push(mockPath);\n }\n\n return [\n implementationPath,\n ...(schemasPath ? [schemasPath] : []),\n ...mockPaths,\n ];\n } catch (error) {\n throw new Error(\n `Oups... 🍻. An Error occurred while splitting tag ${tag} => ${String(error)}`,\n { cause: error },\n );\n }\n }),\n );\n\n // Write per-generator-entry index files after Promise.all to ensure\n // deterministic export order. MSW entries re-export the aggregated\n // `get<Tag>Mock` handler function; Faker entries use `export *` since\n // faker has no aggregate handler.\n if (output.mock.indexMockFiles) {\n for (const entry of generatorEntries) {\n const ext = getMockFileExtensionByTypeName(entry);\n const indexFilePath = indexFilePathsByType.get(ext);\n if (!indexFilePath) continue;\n\n const indexContent = tagEntries\n .map(([tag]) => {\n const localMockPath = upath.joinSafe('./', tag, tag + '.' + ext);\n // MSW entries use the named re-export shape so existing\n // `import { get<Tag>Mock } from './api/index.msw'` consumers keep\n // working unchanged.\n return ext === OutputMockType.MSW\n ? `export { get${pascal(tag)}Mock } from '${localMockPath}'\\n`\n : `export * from '${localMockPath}'\\n`;\n })\n .join('');\n await fs.appendFile(indexFilePath, indexContent);\n }\n }\n\n return [\n ...new Set([\n ...indexFilePathsByType.values(),\n ...generatedFilePathsArray.flat(),\n ]),\n ];\n}\n","import path from 'node:path';\n\nimport { generateModelsInline, generateMutatorImports } from '../generators';\nimport type { WriteModeProps } from '../types';\nimport {\n conventionName,\n getFileInfo,\n isFunction,\n isString,\n isSyntheticDefaultImportsAllow,\n kebab,\n upath,\n} from '../utils';\nimport { escapeRegExp } from '../utils/string';\nimport { writeGeneratedFile } from './file';\nimport { generateImportsForBuilder } from './generate-imports-for-builder';\nimport { collapseInlineMockOutputs } from './mock-outputs';\nimport { generateTargetForTags } from './target-tags';\nimport { getOrvalGeneratedTypes, getTypedResponse } from './types';\n\nexport async function writeTagsMode({\n builder,\n output,\n projectName,\n header,\n needSchema,\n generateSchemasInline,\n}: WriteModeProps): Promise<string[]> {\n const {\n path: targetPath,\n filename,\n dirname,\n extension,\n } = getFileInfo(output.target, {\n backupFilename: conventionName(\n builder.info.title ?? 'filename',\n output.namingConvention,\n ),\n extension: output.fileExtension,\n });\n\n const target = generateTargetForTags(builder, output);\n\n const isAllowSyntheticDefaultImports = isSyntheticDefaultImportsAllow(\n output.tsconfig,\n );\n\n const generatedFilePathsArray = await Promise.all(\n Object.entries(target).map(async ([tag, target]) => {\n try {\n const {\n imports,\n implementation,\n mockOutputs: rawMockOutputs,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n fetchReviver,\n paramsSerializer,\n paramsFilter,\n } = target;\n\n // Tags-mode inlines mock content into the per-tag implementation\n // file, so collapse duplicate factories (drop faker when msw is\n // present) before emitting.\n const mockOutputs = collapseInlineMockOutputs(rawMockOutputs);\n\n const importsMock = mockOutputs.flatMap((m) => m.imports);\n const implementationMock = mockOutputs\n .map((m) => m.implementation)\n .join('\\n\\n');\n\n let data = header;\n\n const schemasPathRelative = output.schemas\n ? upath.getRelativeImportPath(\n targetPath,\n getFileInfo(\n isString(output.schemas) ? output.schemas : output.schemas.path,\n { extension: output.fileExtension },\n ).dirname,\n )\n : './' + filename + '.schemas' + extension.replace(/\\.ts$/, '');\n\n const implementationImports = imports.filter((imp) => {\n const searchWords = [imp.alias, imp.name]\n .filter((part): part is string => Boolean(part?.length))\n .map((part) => escapeRegExp(part))\n .join('|');\n if (!searchWords) {\n return false;\n }\n\n return new RegExp(String.raw`\\b(${searchWords})\\b`, 'g').test(\n implementation,\n );\n });\n\n const normalizedImports = implementationImports.map((imp) => ({\n ...imp,\n }));\n for (const mockImport of importsMock) {\n const matchingImport = normalizedImports.find(\n (imp) =>\n imp.name === mockImport.name &&\n (imp.alias ?? '') === (mockImport.alias ?? ''),\n );\n if (!matchingImport) continue;\n\n const mockNeedsRuntimeValue =\n !!mockImport.values ||\n !!mockImport.isConstant ||\n !!mockImport.default ||\n !!mockImport.namespaceImport ||\n !!mockImport.syntheticDefaultImport;\n if (mockNeedsRuntimeValue) {\n matchingImport.values = true;\n }\n }\n\n const importsForBuilder = generateImportsForBuilder(\n output,\n normalizedImports,\n schemasPathRelative,\n );\n\n data += builder.imports({\n client: output.client,\n implementation,\n imports: importsForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n hasGlobalMutator: !!output.override.mutator,\n hasTagsMutator: Object.values(output.override.tags).some(\n (tag) => !!tag?.mutator,\n ),\n hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,\n packageJson: output.packageJson,\n output,\n });\n\n // Emit per-generator-entry mock imports so each entry's specific\n // import header is included (msw vs faker, etc.). Match by type so\n // collapsing the mockOutputs array does not misalign indices.\n for (const mockOutput of mockOutputs) {\n const entry = output.mock.generators.find(\n (g) => !isFunction(g) && g.type === mockOutput.type,\n );\n const importsMockForBuilder = generateImportsForBuilder(\n output,\n mockOutput.imports.filter(\n (impMock) =>\n !normalizedImports.some(\n (imp) =>\n imp.name === impMock.name &&\n (imp.alias ?? '') === (impMock.alias ?? ''),\n ),\n ),\n schemasPathRelative,\n );\n\n data += builder.importsMock({\n implementation: mockOutput.implementation,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: entry && !isFunction(entry) ? entry : undefined,\n });\n }\n\n const schemasPath =\n !output.schemas && needSchema\n ? path.join(dirname, filename + '.schemas' + extension)\n : undefined;\n\n if (schemasPath) {\n const schemasData = generateSchemasInline\n ? header + generateSchemasInline()\n : header + generateModelsInline(builder.schemas);\n\n await writeGeneratedFile(schemasPath, schemasData);\n }\n\n if (mutators) {\n data += generateMutatorImports({ mutators, implementation });\n }\n\n if (clientMutators) {\n data += generateMutatorImports({\n mutators: clientMutators,\n });\n }\n\n if (formData) {\n data += generateMutatorImports({ mutators: formData });\n }\n\n if (formUrlEncoded) {\n data += generateMutatorImports({ mutators: formUrlEncoded });\n }\n\n if (paramsSerializer) {\n data += generateMutatorImports({ mutators: paramsSerializer });\n }\n\n if (paramsFilter) {\n data += generateMutatorImports({ mutators: paramsFilter });\n }\n\n if (fetchReviver) {\n data += generateMutatorImports({ mutators: fetchReviver });\n }\n\n data += '\\n\\n';\n\n if (implementation.includes('NonReadonly<')) {\n data += getOrvalGeneratedTypes();\n data += '\\n';\n }\n\n if (implementation.includes('TypedResponse<')) {\n data += getTypedResponse();\n data += '\\n';\n }\n\n data += implementation;\n\n if (mockOutputs.length > 0) {\n data += '\\n\\n';\n\n data += implementationMock;\n }\n\n const implementationPath = path.join(\n dirname,\n `${kebab(tag)}${extension}`,\n );\n await writeGeneratedFile(implementationPath, data);\n\n return [implementationPath, ...(schemasPath ? [schemasPath] : [])];\n } catch (error) {\n throw new Error(\n `Oups... 🍻. An Error occurred while writing tag ${tag} => ${String(error)}`,\n { cause: error },\n );\n }\n }),\n );\n\n return generatedFilePathsArray.flat();\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["isNullish","path","isString","isFunction","path","path","basepath","path","upath.getSchemaFileName","isNullish","getSchema","getSchemaType","isBoolean","upath.normalizeSafe","upath.joinSafe","upath.isAbsolute","upath.resolve","upath.relativeSafe","isReference","upath.getRelativeImportPath","fs","fs","upath.relativeSafe","upath.joinSafe","upath\n .join","fs","upath.normalizeSafe","upath.joinSafe","emptyMockOutputFull","flattenMockOutput","upath.getRelativeImportPath","upath.getRelativeImportPath","path","path","fs","upath.getRelativeImportPath","upath.joinSafe","upath.getRelativeImportPath","path"],"sources":["../src/types.ts","../src/constants.ts","../src/utils/assertion.ts","../src/utils/async-reduce.ts","../src/utils/case.ts","../src/utils/compare-version.ts","../src/utils/content-type.ts","../src/utils/debug.ts","../src/utils/doc.ts","../src/utils/dynamic-import.ts","../src/utils/extension.ts","../src/utils/file.ts","../src/utils/file-extensions.ts","../src/utils/get-property-safe.ts","../src/utils/is-body-verb.ts","../src/utils/logger.ts","../src/utils/merge-deep.ts","../src/utils/occurrence.ts","../src/utils/path.ts","../src/utils/resolve-version.ts","../src/utils/sort.ts","../src/utils/string.ts","../src/utils/tsconfig.ts","../src/getters/enum.ts","../src/getters/ref.ts","../src/getters/imports.ts","../src/getters/combine.ts","../src/getters/keys.ts","../src/getters/object.ts","../src/getters/scalar.ts","../src/resolvers/ref.ts","../src/resolvers/value.ts","../src/resolvers/object.ts","../src/getters/array.ts","../src/getters/res-req-types.ts","../src/getters/body.ts","../src/getters/discriminators.ts","../src/getters/operation.ts","../src/getters/parameters.ts","../src/getters/params.ts","../src/getters/props.ts","../src/getters/query-params.ts","../src/getters/response.ts","../src/getters/route.ts","../src/generators/component-definition.ts","../src/generators/factory.ts","../src/generators/imports.ts","../src/generators/input-filters.ts","../src/generators/models-inline.ts","../src/generators/mutator-info.ts","../src/generators/mutator.ts","../src/generators/options.ts","../src/generators/parameter-definition.ts","../src/generators/interface.ts","../src/generators/schema-definition.ts","../src/generators/verbs-options.ts","../src/writers/file.ts","../src/writers/schemas.ts","../src/writers/generate-imports-for-builder.ts","../src/writers/mock-outputs.ts","../src/writers/target.ts","../src/writers/types.ts","../src/writers/single-mode.ts","../src/writers/split-mode.ts","../src/writers/target-tags.ts","../src/writers/split-tags-mode.ts","../src/writers/tags-mode.ts"],"sourcesContent":["import type { allLocales } from '@faker-js/faker';\nimport type { OpenAPIV3_1 } from '@scalar/openapi-types';\nimport type { TypeDocOptions } from 'typedoc';\n\nexport const SupportedFormatter = {\n PRETTIER: 'prettier',\n BIOME: 'biome',\n OXFMT: 'oxfmt',\n} as const;\n\nexport type SupportedFormatter =\n (typeof SupportedFormatter)[keyof typeof SupportedFormatter];\n\nexport interface Options {\n output?: string | OutputOptions;\n input?: string | string[] | InputOptions;\n hooks?: Partial<HooksOptions>;\n}\n\nexport type OptionsFn = () => Options | Promise<Options>;\nexport type OptionsExport = Options | Promise<Options> | OptionsFn;\n\nexport type Config = Record<string, OptionsExport>;\nexport type ConfigFn = () => Config | Promise<Config>;\n\nexport type ConfigExternal = Config | Promise<Config> | ConfigFn;\n\nexport type NormalizedConfig = Record<string, NormalizedOptions | undefined>;\n\nexport interface NormalizedOptions {\n output: NormalizedOutputOptions;\n input: NormalizedInputOptions;\n hooks: NormalizedHookOptions;\n}\n\nexport interface NormalizedOutputOptions {\n workspace?: string;\n target: string;\n schemas?: string | SchemaOptions;\n operationSchemas?: string;\n namingConvention: NamingConvention;\n fileExtension: string;\n /**\n * File extension for schema artifacts (TS types or Zod schemas) under\n * `schemas:`. Defaults to `.zod.ts` when the output is Zod schemas\n * (`schemas: { type: 'zod' }` or `client: 'zod'` + `generateReusableSchemas`),\n * otherwise `.ts`. A user-set `output.fileExtension` always wins.\n */\n schemaFileExtension: string;\n mode: OutputMode;\n // Always normalized to an object form; an empty `generators` array means\n // no mocks are emitted.\n mock: NormalizedMocksConfig;\n override: NormalizedOverrideOutput;\n client: OutputClient | OutputClientFunc;\n httpClient: OutputHttpClient;\n clean: boolean | string[];\n docs: boolean | OutputDocsOptions;\n formatter?: SupportedFormatter;\n tsconfig?: Tsconfig;\n packageJson?: PackageJson;\n headers: boolean;\n indexFiles: boolean;\n baseUrl?: string | BaseUrlFromSpec | BaseUrlFromConstant | BaseUrlRuntime;\n allParamsOptional: boolean;\n urlEncodeParameters: boolean;\n unionAddMissingProperties: boolean;\n optionsParamRequired: boolean;\n propertySortOrder: PropertySortOrder;\n factoryMethods?: NormalizedFactoryMethodsOptions;\n}\n\nexport interface NormalizedParamsSerializerOptions {\n qs?: Record<string, unknown>;\n}\n\n/**\n * Controls how readonly properties are treated when a schema is reused as a request body.\n *\n * Best practice:\n * - `strip` (default): recommended for most OpenAPI specs, because `readOnly`\n * properties are response-oriented and generally should not constrain request\n * payload authoring.\n * - `preserve`: use when your schema intentionally models immutable request DTOs\n * and you want generated request-body types to keep readonly modifiers.\n *\n * Note: this applies to request bodies regardless of the generated client style\n * (`httpClient`, `httpResource`, etc.). `httpResource` still issues request\n * payloads, so the same OpenAPI guidance applies.\n *\n * If we later want a stricter OpenAPI-aligned mode that omits `readOnly`\n * properties from request bodies entirely, that should be introduced as a new\n * explicit mode rather than overloading `preserve`.\n */\nexport type ReadonlyRequestBodiesMode = 'strip' | 'preserve';\n\nexport interface NormalizedOverrideOutput {\n title?: (title: string) => string;\n transformer?: OutputTransformer;\n mutator?: NormalizedMutator;\n operations: Record<string, NormalizedOperationOptions | undefined>;\n tags: Record<string, NormalizedOperationOptions | undefined>;\n mock?: OverrideMockOptions;\n contentType?: OverrideOutputContentType;\n header: false | ((info: OpenApiInfoObject) => string[] | string);\n formData: NormalizedFormDataType<NormalizedMutator>;\n formUrlEncoded: boolean | NormalizedMutator;\n paramsSerializer?: NormalizedMutator;\n paramsSerializerOptions?: NormalizedParamsSerializerOptions;\n paramsFilter?: NormalizedMutator;\n namingConvention: {\n enum?: NamingConvention;\n };\n components: {\n schemas: {\n suffix: string;\n itemSuffix: string;\n };\n responses: {\n suffix: string;\n };\n parameters: {\n suffix: string;\n };\n requestBodies: {\n suffix: string;\n };\n };\n hono: NormalizedHonoOptions;\n mcp: NormalizedMcpOptions;\n query: NormalizedQueryOptions;\n angular: NormalizedAngularOptions;\n swr: SwrOptions;\n zod: NormalizedZodOptions;\n fetch: NormalizedFetchOptions;\n operationName?: (\n operation: OpenApiOperationObject,\n route: string,\n verb: Verbs,\n ) => string;\n\n requestOptions: Record<string, unknown> | boolean;\n useDates?: boolean;\n useTypeOverInterfaces?: boolean;\n useDeprecatedOperations?: boolean;\n useBigInt?: boolean;\n useNamedParameters?: boolean;\n enumGenerationType: EnumGeneration;\n suppressReadonlyModifier?: boolean;\n /**\n * Controls how readonly properties are handled for generated request-body types.\n *\n * Prefer `strip` for most OpenAPI specs because `readOnly` fields are\n * response-oriented. Use `preserve` only when your request DTOs are\n * intentionally immutable and should remain readonly in generated types.\n */\n preserveReadonlyRequestBodies?: ReadonlyRequestBodiesMode;\n /**\n * When enabled, operations with multiple request body content-types\n * (e.g. both `multipart/form-data` and `application/json`) will generate\n * separate functions for each content type instead of a single function\n * with a union type parameter.\n *\n * @example\n * // With splitByContentType: true\n * updateProfileWithFormData(body: FormDataType) => { ... }\n * updateProfileWithJson(body: JsonType) => { ... }\n *\n * // With splitByContentType: false (default)\n * updateProfile(body: FormDataType | JsonType) => { ... }\n *\n * @default false\n */\n splitByContentType: boolean;\n jsDoc: NormalizedJsDocOptions;\n aliasCombinedTypes: boolean;\n /**\n * When enabled, optional properties will be typed as `T | null` instead of just `T`.\n * @default false\n */\n useNullForOptional?: boolean;\n}\n\nexport interface NormalizedMutator {\n path: string;\n name?: string;\n default: boolean;\n alias?: Record<string, string>;\n external?: string[];\n extension?: string;\n}\n\nexport interface NormalizedOperationOptions {\n transformer?: OutputTransformer;\n mutator?: NormalizedMutator;\n mock?: {\n data?: MockData;\n properties?: MockProperties;\n };\n contentType?: OverrideOutputContentType;\n query?: NormalizedQueryOptions;\n angular?: NormalizedAngularOptions;\n swr?: SwrOptions;\n zod?: NormalizedZodOptions;\n operationName?: (\n operation: OpenApiOperationObject,\n route: string,\n verb: Verbs,\n ) => string;\n fetch?: FetchOptions;\n formData?: NormalizedFormDataType<NormalizedMutator>;\n formUrlEncoded?: boolean | NormalizedMutator;\n paramsSerializer?: NormalizedMutator;\n paramsFilter?: NormalizedMutator;\n requestOptions?: object | boolean;\n}\n\nexport interface NormalizedInputOptions {\n target: string | OpenApiDocument;\n override: OverrideInput;\n unsafeDisableValidation: boolean;\n filters?: InputFiltersOptions;\n parserOptions?: {\n headers?: {\n domains: string[];\n headers: Record<string, string>;\n }[];\n };\n}\n\nexport type OutputClientFunc = (\n clients: GeneratorClients,\n) => ClientGeneratorsBuilder;\n\nexport interface BaseUrlFromSpec {\n getBaseUrlFromSpecification: true;\n variables?: Record<string, string>;\n index?: number;\n baseUrl?: never;\n}\n\nexport interface BaseUrlFromConstant {\n getBaseUrlFromSpecification: false;\n variables?: never;\n index?: never;\n baseUrl: string;\n}\n\n/**\n * Embed a runtime JavaScript expression into generated URL template literals\n * (e.g. `process.env.API_BASE_URL`) so the same build can target different hosts at runtime.\n */\nexport interface BaseUrlRuntime {\n runtime: string;\n /** Named imports for symbols used in `runtime` (e.g. `{ name: 'apiBase', importPath: '../config' }`). */\n imports?: GeneratorImport[];\n getBaseUrlFromSpecification?: never;\n baseUrl?: never;\n}\n\nexport const PropertySortOrder = {\n ALPHABETICAL: 'Alphabetical',\n SPECIFICATION: 'Specification',\n} as const;\n\nexport type PropertySortOrder =\n (typeof PropertySortOrder)[keyof typeof PropertySortOrder];\n\nexport const NamingConvention = {\n CAMEL_CASE: 'camelCase',\n PASCAL_CASE: 'PascalCase',\n SNAKE_CASE: 'snake_case',\n KEBAB_CASE: 'kebab-case',\n} as const;\n\nexport type NamingConvention =\n (typeof NamingConvention)[keyof typeof NamingConvention];\n\nexport const EnumGeneration = {\n CONST: 'const',\n ENUM: 'enum',\n UNION: 'union',\n} as const;\n\nexport type EnumGeneration =\n (typeof EnumGeneration)[keyof typeof EnumGeneration];\n\nexport type SchemaGenerationType = 'typescript' | 'zod';\n\nexport type FactoryMethodsMode = 'single' | 'split' | 'single-split';\n\nexport interface FactoryMethodsOptions {\n functionNamePrefix?: string;\n mode?: FactoryMethodsMode;\n outputDirectory?: string;\n includeOptionalProperty?: boolean;\n}\n\nexport interface NormalizedFactoryMethodsOptions {\n functionNamePrefix: string;\n mode: FactoryMethodsMode;\n outputDirectory: string;\n includeOptionalProperty: boolean;\n}\n\nexport interface SchemaOptions {\n path: string;\n type: SchemaGenerationType;\n}\n\nexport interface NormalizedSchemaOptions {\n path: string;\n type: SchemaGenerationType;\n}\n\nexport interface OutputOptions {\n workspace?: string;\n target: string;\n schemas?: string | SchemaOptions | false;\n /**\n * Separate path for operation-derived types (params, bodies, responses).\n * When set, types matching operation patterns (e.g., *Params, *Body) are written here\n * while regular schema types remain in the `schemas` path.\n */\n operationSchemas?: string;\n namingConvention?: NamingConvention;\n fileExtension?: string;\n /**\n * Optional file extension applied only to schema artifacts (TS types or\n * Zod schemas) under `schemas:`. Takes precedence over `fileExtension`\n * for schema files. Defaults to `.zod.ts` when the output is Zod schemas\n * (`schemas: { type: 'zod' }` or `client: 'zod'` + `generateReusableSchemas`),\n * otherwise mirrors `fileExtension`.\n */\n schemaFileExtension?: string;\n mode?: OutputMode;\n // Mocks config. Accepts:\n // - `true` shorthand: emits both msw + faker with defaults\n // - OutputMocksConfig object with `generators` array and optional `indexMockFiles`\n // - ClientMockBuilder function for advanced custom generators\n mock?: OutputMocksOption;\n override?: OverrideOutput;\n client?: OutputClient | OutputClientFunc;\n httpClient?: OutputHttpClient;\n clean?: boolean | string[];\n docs?: boolean | OutputDocsOptions;\n formatter?: SupportedFormatter;\n tsconfig?: string | Tsconfig;\n packageJson?: string;\n headers?: boolean;\n indexFiles?: boolean;\n baseUrl?: string | BaseUrlFromSpec | BaseUrlFromConstant | BaseUrlRuntime;\n allParamsOptional?: boolean;\n urlEncodeParameters?: boolean;\n unionAddMissingProperties?: boolean;\n optionsParamRequired?: boolean;\n propertySortOrder?: PropertySortOrder;\n factoryMethods?: FactoryMethodsOptions;\n}\n\nexport interface InputFiltersOptions {\n mode?: 'include' | 'exclude';\n tags?: (string | RegExp)[];\n schemas?: (string | RegExp)[];\n}\n\nexport interface InputOptions {\n target: string | string[] | Record<string, unknown> | OpenApiDocument;\n override?: OverrideInput;\n /**\n * Disable OpenAPI spec validation.\n *\n * **Use at your own risk** — code generation with invalid specs is not guaranteed\n * to work and may break in minor updates. Bug reports with validation disabled are\n * not accepted.\n *\n * @default false\n */\n unsafeDisableValidation?: boolean;\n filters?: InputFiltersOptions;\n parserOptions?: {\n headers?: {\n domains: string[];\n headers: Record<string, string>;\n }[];\n };\n}\n\nexport const OutputClient = {\n ANGULAR: 'angular',\n ANGULAR_QUERY: 'angular-query',\n AXIOS: 'axios',\n AXIOS_FUNCTIONS: 'axios-functions',\n REACT_QUERY: 'react-query',\n SOLID_START: 'solid-start',\n SOLID_QUERY: 'solid-query',\n SVELTE_QUERY: 'svelte-query',\n VUE_QUERY: 'vue-query',\n SWR: 'swr',\n ZOD: 'zod',\n HONO: 'hono',\n FETCH: 'fetch',\n MCP: 'mcp',\n} as const;\n\nexport type OutputClient = (typeof OutputClient)[keyof typeof OutputClient];\n\nexport const OutputHttpClient = {\n AXIOS: 'axios',\n FETCH: 'fetch',\n ANGULAR: 'angular',\n} as const;\n\nexport type OutputHttpClient =\n (typeof OutputHttpClient)[keyof typeof OutputHttpClient];\n\nexport const OutputMode = {\n SINGLE: 'single',\n SPLIT: 'split',\n TAGS: 'tags',\n TAGS_SPLIT: 'tags-split',\n} as const;\n\nexport type OutputMode = (typeof OutputMode)[keyof typeof OutputMode];\n\nexport type OutputDocsOptions = {\n configPath?: string;\n} & Partial<TypeDocOptions>;\n\n// TODO: add support for other mock types (like cypress or playwright)\nexport const OutputMockType = {\n MSW: 'msw',\n FAKER: 'faker',\n} as const;\n\nexport type OutputMockType =\n (typeof OutputMockType)[keyof typeof OutputMockType];\n\nexport type PreferredContentType =\n | 'application/json'\n | 'application/xml'\n | 'text/plain'\n | 'text/html'\n | 'application/octet-stream'\n | (string & {});\n\n// Shared by every mock generator.\nexport interface CommonMockOptions {\n // Use OpenAPI examples to seed mock values where available\n useExamples?: boolean;\n // Generate response factories for every HTTP status defined in the spec\n generateEachHttpStatus?: boolean;\n // Faker locale (controls the `@faker-js/faker/locale/<x>` import path)\n locale?: keyof typeof allLocales;\n // Selects which response schema is mocked when multiple content types exist\n preferredContentType?: string;\n}\n\nexport interface MswMockOptions extends CommonMockOptions {\n type: typeof OutputMockType.MSW;\n // Base URL prefix for the generated MSW route matchers\n baseUrl?: string;\n // Response delay before MSW handlers resolve (false disables delay)\n delay?: false | number | (() => number);\n // Execute the `delay` function at runtime rather than build time\n delayFunctionLazyExecute?: boolean;\n}\n\nexport interface FakerMockOptions extends CommonMockOptions {\n type: typeof OutputMockType.FAKER;\n // Emit a consolidated mock factory file for every entry under\n // `components/schemas` (one `get<SchemaName>Mock` per schema). Defaults to\n // `false` — schema factories are opt-in to preserve existing output.\n schemas?: boolean;\n // Emit per-operation response mock factories (the historical behavior).\n // Defaults to `true`. Set to `false` together with `schemas: true` to get\n // only the consolidated schema factories.\n operationResponses?: boolean;\n}\n\nexport type GlobalMockOptions = MswMockOptions | FakerMockOptions;\n\n// The top-level `mock` key on OutputOptions accepts this object form:\n// mock: {\n// indexMockFiles: true,\n// generators: [\n// { type: OutputMockType.MSW, ... },\n// { type: OutputMockType.FAKER, ... },\n// ],\n// }\nexport interface OutputMocksConfig {\n // When true, emits one root-level `index.<ext>.ts` per generator entry\n // (e.g. `index.msw.ts` and/or `index.faker.ts`) in tags-split mode\n indexMockFiles?: boolean;\n generators: (GlobalMockOptions | ClientMockBuilder)[];\n}\n\n// Accepts:\n// - boolean shorthand (`mock: true` => both msw + faker with defaults)\n// - OutputMocksConfig (full object form)\n// - ClientMockBuilder (single function-form for advanced users)\nexport type OutputMocksOption = boolean | OutputMocksConfig | ClientMockBuilder;\n\n// Normalized result of resolving OutputMocksOption. Always an object so the\n// rest of the pipeline can iterate `generators` without branching on shape.\nexport interface NormalizedMocksConfig {\n indexMockFiles: boolean;\n generators: (GlobalMockOptions | ClientMockBuilder)[];\n}\n\nexport type OverrideMockOptions = Partial<GlobalMockOptions> & {\n arrayMin?: number;\n arrayMax?: number;\n stringMin?: number;\n stringMax?: number;\n numberMin?: number;\n numberMax?: number;\n required?: boolean;\n properties?: MockProperties;\n format?: Record<string, unknown>;\n fractionDigits?: number;\n};\n\nexport type MockOptions = Omit<OverrideMockOptions, 'properties'> & {\n properties?: Record<string, unknown>;\n operations?: Record<string, { properties: Record<string, unknown> }>;\n tags?: Record<string, { properties: Record<string, unknown> }>;\n};\n\nexport type MockPropertiesObject = Record<string, unknown>;\nexport type MockPropertiesObjectFn = (\n specs: OpenApiDocument,\n) => MockPropertiesObject;\n\nexport type MockProperties = MockPropertiesObject | MockPropertiesObjectFn;\n\nexport type MockDataObject = Record<string, unknown>;\n\nexport type MockDataObjectFn = (specs: OpenApiDocument) => MockDataObject;\n\nexport type MockDataArray = unknown[];\n\nexport type MockDataArrayFn = (specs: OpenApiDocument) => MockDataArray;\n\nexport type MockData =\n | MockDataObject\n | MockDataObjectFn\n | MockDataArray\n | MockDataArrayFn;\n\ntype OutputTransformerFn = (verb: GeneratorVerbOptions) => GeneratorVerbOptions;\n\ntype OutputTransformer = string | OutputTransformerFn;\n\nexport interface MutatorObject {\n path: string;\n name?: string;\n default?: boolean;\n alias?: Record<string, string>;\n external?: string[];\n extension?: string;\n}\n\nexport type Mutator = string | MutatorObject;\n\nexport interface ParamsSerializerOptions {\n qs?: Record<string, unknown>;\n}\n\nexport const FormDataArrayHandling = {\n SERIALIZE: 'serialize',\n EXPLODE: 'explode',\n SERIALIZE_WITH_BRACKETS: 'serialize-with-brackets',\n} as const;\n\nexport type FormDataArrayHandling =\n (typeof FormDataArrayHandling)[keyof typeof FormDataArrayHandling];\n\nexport type NormalizedFormDataType<TMutator> =\n | {\n disabled: true;\n mutator?: never;\n arrayHandling: FormDataArrayHandling;\n }\n | {\n disabled: false;\n mutator?: TMutator;\n arrayHandling: FormDataArrayHandling;\n };\nexport type FormDataType<TMutator> =\n | {\n mutator: TMutator;\n arrayHandling?: FormDataArrayHandling;\n }\n | {\n mutator?: TMutator;\n arrayHandling: FormDataArrayHandling;\n };\n\nexport interface OverrideOutput {\n title?: (title: string) => string;\n transformer?: OutputTransformer;\n mutator?: Mutator;\n operations?: Record<string, OperationOptions>;\n tags?: Record<string, OperationOptions>;\n mock?: OverrideMockOptions;\n contentType?: OverrideOutputContentType;\n header?: boolean | ((info: OpenApiInfoObject) => string[] | string);\n formData?: boolean | Mutator | FormDataType<Mutator>;\n formUrlEncoded?: boolean | Mutator;\n paramsSerializer?: Mutator;\n paramsSerializerOptions?: ParamsSerializerOptions;\n paramsFilter?: Mutator;\n namingConvention?: {\n enum?: NamingConvention;\n };\n components?: {\n schemas?: {\n suffix?: string;\n itemSuffix?: string;\n };\n responses?: {\n suffix?: string;\n };\n parameters?: {\n suffix?: string;\n };\n requestBodies?: {\n suffix?: string;\n };\n };\n hono?: HonoOptions;\n mcp?: McpOptions;\n query?: QueryOptions;\n swr?: SwrOptions;\n angular?: AngularOptions;\n zod?: ZodOptions;\n operationName?: (\n operation: OpenApiOperationObject,\n route: string,\n verb: Verbs,\n ) => string;\n fetch?: FetchOptions;\n\n requestOptions?: Record<string, unknown> | boolean;\n useDates?: boolean;\n useTypeOverInterfaces?: boolean;\n useDeprecatedOperations?: boolean;\n useBigInt?: boolean;\n useNamedParameters?: boolean;\n enumGenerationType?: EnumGeneration;\n suppressReadonlyModifier?: boolean;\n /**\n * Controls how readonly properties are handled for generated request-body types.\n *\n * Prefer `strip` for most OpenAPI specs because `readOnly` fields are\n * response-oriented. Use `preserve` only when your request DTOs are\n * intentionally immutable and should remain readonly in generated types.\n */\n preserveReadonlyRequestBodies?: ReadonlyRequestBodiesMode;\n /**\n * When enabled, operations with multiple request body content-types\n * (e.g. both `multipart/form-data` and `application/json`) will generate\n * separate functions for each content type instead of a single function\n * with a union type parameter.\n *\n * @default false\n */\n splitByContentType?: boolean;\n jsDoc?: JsDocOptions;\n aliasCombinedTypes?: boolean;\n /**\n * When enabled, optional properties will be typed as `T | null` instead of just `T`.\n * @default false\n */\n useNullForOptional?: boolean;\n}\n\nexport interface JsDocOptions {\n filter?: (\n schema: Record<string, unknown>,\n ) => { key: string; value: string }[];\n}\n\nexport interface NormalizedJsDocOptions {\n filter?: (\n schema: Record<string, unknown>,\n ) => { key: string; value: string }[];\n}\n\nexport interface OverrideOutputContentType {\n include?: string[];\n exclude?: string[];\n}\n\nexport interface NormalizedHonoOptions {\n handlers?: string;\n compositeRoute: string;\n validator: boolean | 'hono';\n validatorOutputPath: string;\n}\n\nexport interface ZodDateTimeOptions {\n offset?: boolean;\n local?: boolean;\n precision?: number;\n}\n\nexport interface ZodTimeOptions {\n precision?: -1 | 0 | 1 | 2 | 3;\n}\n\nexport interface ZodOptions {\n strict?: {\n param?: boolean;\n query?: boolean;\n header?: boolean;\n body?: boolean;\n response?: boolean;\n };\n generate?: {\n param?: boolean;\n query?: boolean;\n header?: boolean;\n body?: boolean;\n response?: boolean;\n };\n coerce?: {\n param?: boolean | ZodCoerceType[];\n query?: boolean | ZodCoerceType[];\n header?: boolean | ZodCoerceType[];\n body?: boolean | ZodCoerceType[];\n response?: boolean | ZodCoerceType[];\n };\n preprocess?: {\n param?: Mutator;\n query?: Mutator;\n header?: Mutator;\n body?: Mutator;\n response?: Mutator;\n };\n dateTimeOptions?: ZodDateTimeOptions;\n timeOptions?: ZodTimeOptions;\n generateEachHttpStatus?: boolean;\n useBrandedTypes?: boolean;\n /**\n * When true, emits one reusable Zod schema per `#/components/schemas/*` `$ref`\n * (with `namingConvention` applied to the name) and references it everywhere\n * instead of inlining. Default `false`. See `docs/superpowers/specs/2026-05-26-reusable-zod-schemas-design.md`.\n */\n generateReusableSchemas?: boolean;\n}\n\nexport type ZodCoerceType = 'string' | 'number' | 'boolean' | 'bigint' | 'date';\n\nexport interface NormalizedZodOptions {\n strict: {\n param: boolean;\n query: boolean;\n header: boolean;\n body: boolean;\n response: boolean;\n };\n generate: {\n param: boolean;\n query: boolean;\n header: boolean;\n body: boolean;\n response: boolean;\n };\n coerce: {\n param: boolean | ZodCoerceType[];\n query: boolean | ZodCoerceType[];\n header: boolean | ZodCoerceType[];\n body: boolean | ZodCoerceType[];\n response: boolean | ZodCoerceType[];\n };\n preprocess?: {\n param?: NormalizedMutator;\n query?: NormalizedMutator;\n header?: NormalizedMutator;\n body?: NormalizedMutator;\n response?: NormalizedMutator;\n };\n generateEachHttpStatus: boolean;\n useBrandedTypes: boolean;\n generateReusableSchemas: boolean;\n dateTimeOptions: ZodDateTimeOptions;\n timeOptions: ZodTimeOptions;\n}\n\n/**\n * A single parameter value for `mutationInvalidates` params.\n *\n * - `string` – treated as a variable reference, e.g. `\"petId\"` → `variables.petId`\n * - `{ literal: string }` – emitted as a string literal, e.g. `{ literal: \"@me\" }` → `\"@me\"`\n */\nexport type InvalidateTargetParam = string | { literal: string };\n\nexport type InvalidateTarget =\n | string\n | {\n query: string;\n params?: InvalidateTargetParam[] | Record<string, InvalidateTargetParam>;\n invalidateMode?: 'invalidate' | 'reset';\n file?: string;\n };\n\nexport interface MutationInvalidatesRule {\n onMutations: string[];\n invalidates: InvalidateTarget[];\n}\n\nexport type MutationInvalidatesConfig = MutationInvalidatesRule[];\n\nexport interface HonoOptions {\n handlers?: string;\n compositeRoute?: string;\n validator?: boolean | 'hono';\n validatorOutputPath?: string;\n}\n\nexport interface McpServerOptions {\n path: string;\n name?: string;\n default?: boolean;\n}\n\nexport interface NormalizedMcpServerOptions {\n path: string;\n name?: string;\n default: boolean;\n}\n\nexport interface McpOptions {\n server?: McpServerOptions;\n}\n\nexport interface NormalizedMcpOptions {\n server?: NormalizedMcpServerOptions;\n}\n\nexport interface NormalizedQueryOptions {\n useQuery?: boolean;\n useSuspenseQuery?: boolean;\n useMutation?: boolean;\n useInfinite?: boolean;\n useSuspenseInfiniteQuery?: boolean;\n useInfiniteQueryParam?: string;\n usePrefetch?: boolean;\n useInvalidate?: boolean;\n useSetQueryData?: boolean;\n useGetQueryData?: boolean;\n\n options?: Record<string, unknown>;\n queryKey?: NormalizedMutator;\n queryOptions?: NormalizedMutator;\n mutationOptions?: NormalizedMutator;\n shouldExportMutatorHooks?: boolean;\n shouldExportHttpClient?: boolean;\n shouldExportQueryKey?: boolean;\n shouldSplitQueryKey?: boolean;\n useOperationIdAsQueryKey?: boolean;\n signal?: boolean;\n version?: 3 | 4 | 5;\n mutationInvalidates?: MutationInvalidatesConfig;\n runtimeValidation?: boolean;\n}\n\nexport interface QueryOptions {\n useQuery?: boolean;\n useSuspenseQuery?: boolean;\n useMutation?: boolean;\n useInfinite?: boolean;\n useSuspenseInfiniteQuery?: boolean;\n useInfiniteQueryParam?: string;\n usePrefetch?: boolean;\n useInvalidate?: boolean;\n useSetQueryData?: boolean;\n useGetQueryData?: boolean;\n\n options?: Record<string, unknown>;\n queryKey?: Mutator;\n queryOptions?: Mutator;\n mutationOptions?: Mutator;\n shouldExportMutatorHooks?: boolean;\n shouldExportHttpClient?: boolean;\n shouldExportQueryKey?: boolean;\n shouldSplitQueryKey?: boolean;\n useOperationIdAsQueryKey?: boolean;\n signal?: boolean;\n version?: 3 | 4 | 5;\n mutationInvalidates?: MutationInvalidatesConfig;\n runtimeValidation?: boolean;\n}\n\nexport interface AngularOptions {\n provideIn?: 'root' | 'any' | boolean;\n /**\n * Preferred name for configuring how retrieval-style operations are emitted.\n *\n * - `httpClient`: keep retrievals as service methods\n * - `httpResource`: emit retrievals as Angular `httpResource` helpers\n * - `both`: emit retrieval helpers and keep service methods where needed\n *\n * Mutation-style operations still use generated `HttpClient` service methods\n * by default unless a per-operation override forces a different behavior.\n */\n retrievalClient?: 'httpClient' | 'httpResource' | 'both';\n /**\n * Backward-compatible alias for `retrievalClient`.\n *\n * Kept for compatibility with existing configs.\n */\n client?: 'httpClient' | 'httpResource' | 'both';\n runtimeValidation?: boolean;\n httpResource?: AngularHttpResourceOptions;\n}\n\nexport interface NormalizedAngularOptions {\n provideIn: 'root' | 'any' | boolean;\n client: 'httpClient' | 'httpResource' | 'both';\n runtimeValidation: boolean;\n httpResource?: AngularHttpResourceOptions;\n}\n\nexport interface AngularHttpResourceOptions {\n /**\n * Value to expose while the resource is idle/loading.\n *\n * Serialized as a literal into generated code.\n */\n defaultValue?: unknown;\n /**\n * Debug name shown in Angular DevTools.\n */\n debugName?: string;\n /**\n * Raw code expression for HttpResourceOptions.injector.\n * Example: `inject(Injector)`.\n */\n injector?: string;\n /**\n * Raw code expression for HttpResourceOptions.equal.\n * Example: `(a, b) => a.id === b.id`.\n */\n equal?: string;\n}\n\nexport interface SwrOptions {\n useInfinite?: boolean;\n useSWRMutationForGet?: boolean;\n useSuspense?: boolean;\n generateErrorTypes?: boolean;\n swrOptions?: unknown;\n swrMutationOptions?: unknown;\n swrInfiniteOptions?: unknown;\n}\n\nexport interface NormalizedFetchOptions {\n includeHttpResponseReturnType: boolean;\n forceSuccessResponse: boolean;\n jsonReviver?: Mutator;\n runtimeValidation: boolean;\n useRuntimeFetcher: boolean;\n}\n\nexport interface FetchOptions {\n includeHttpResponseReturnType?: boolean;\n forceSuccessResponse?: boolean;\n jsonReviver?: Mutator;\n runtimeValidation?: boolean;\n useRuntimeFetcher?: boolean;\n}\n\nexport type InputTransformerFn = (\n spec: OpenApiDocument,\n) => OpenApiDocument | Promise<OpenApiDocument>;\n\ntype InputTransformer = string | InputTransformerFn;\n\nexport interface OverrideInput {\n transformer?: InputTransformer;\n}\n\nexport interface OperationOptions {\n transformer?: OutputTransformer;\n mutator?: Mutator;\n mock?: {\n data?: MockData;\n properties?: MockProperties;\n };\n query?: QueryOptions;\n angular?: AngularOptions;\n swr?: SwrOptions;\n zod?: ZodOptions;\n operationName?: (\n operation: OpenApiOperationObject,\n route: string,\n verb: Verbs,\n ) => string;\n fetch?: FetchOptions;\n formData?: boolean | Mutator | FormDataType<Mutator>;\n formUrlEncoded?: boolean | Mutator;\n paramsSerializer?: Mutator;\n paramsFilter?: Mutator;\n requestOptions?: object | boolean;\n}\n\nexport type Hook = 'afterAllFilesWrite';\n\nexport type HookFunction<TArgs extends unknown[] = unknown[]> = (\n ...args: TArgs\n) => void | Promise<void>;\n\nexport interface HookOption {\n command: string | HookFunction;\n injectGeneratedDirsAndFiles?: boolean;\n}\n\nexport type HookCommand =\n | string\n | HookFunction\n | HookOption\n | (string | HookFunction | HookOption)[];\n\nexport type NormalizedHookCommand = HookCommand[];\n\nexport type HooksOptions<T = HookCommand | NormalizedHookCommand> = Partial<\n Record<Hook, T>\n>;\n\nexport type NormalizedHookOptions = HooksOptions<NormalizedHookCommand>;\n\nexport type Verbs = 'post' | 'put' | 'get' | 'patch' | 'delete' | 'head';\n\nexport const Verbs = {\n POST: 'post' as Verbs,\n PUT: 'put' as Verbs,\n GET: 'get' as Verbs,\n PATCH: 'patch' as Verbs,\n DELETE: 'delete' as Verbs,\n HEAD: 'head' as Verbs,\n};\n\n/**\n * Canonical tag name used for the generated bucket that collects untagged operations.\n */\nexport const DefaultTag = 'default' as const;\n\nexport interface ImportOpenApi {\n spec: OpenApiDocument;\n input: NormalizedInputOptions;\n output: NormalizedOutputOptions;\n target: string;\n workspace: string;\n projectName?: string;\n}\n\nexport interface ContextSpec {\n projectName?: string;\n target: string;\n workspace: string;\n spec: OpenApiDocument;\n parents?: string[];\n output: NormalizedOutputOptions;\n /**\n * Per-schema dynamic scope mapping `$dynamicAnchor` names to concrete schema\n * entries or generic parameter placeholders. Populated by `buildDynamicScope`.\n */\n dynamicScope?: Partial<Record<string, DynamicScopeEntry>>;\n}\n\n/**\n * Maps a `$dynamicAnchor` name to its resolution target.\n *\n * Concrete entry (bound via `$ref`):\n * - `name` — the generated TypeScript type name (e.g. `User`)\n * - `schemaName` — the original key in `components.schemas` (e.g. `User`)\n *\n * Parameter entry (unbound `$defs` placeholder):\n * - `isParameter` — `true`, signals this is a generic type parameter\n * - `name` — the `$dynamicAnchor` name used as the type parameter (e.g. `itemType`)\n * - `schemaName` — same as `name` for parameters\n */\nexport interface DynamicScopeEntry {\n name: string;\n schemaName: string;\n isParameter?: boolean;\n}\n\nexport interface GlobalOptions {\n watch?: boolean | string | string[];\n verbose?: boolean;\n clean?: boolean | string[];\n formatter?: SupportedFormatter;\n mock?: OutputMocksOption;\n client?: OutputClient;\n httpClient?: OutputHttpClient;\n mode?: OutputMode;\n tsconfig?: string | Tsconfig;\n packageJson?: string;\n input?: string | string[];\n output?: string;\n failOnWarnings?: boolean;\n}\n\nexport interface Tsconfig {\n baseUrl?: string;\n compilerOptions?: {\n esModuleInterop?: boolean;\n allowSyntheticDefaultImports?: boolean;\n exactOptionalPropertyTypes?: boolean;\n paths?: Record<string, string[]>;\n target?: TsConfigTarget;\n module?: TsConfigModule;\n moduleResolution?: TsConfigModuleResolution;\n allowImportingTsExtensions?: boolean;\n };\n}\n\nexport type TsConfigTarget =\n | 'es3'\n | 'es5'\n | 'es6'\n | 'es2015'\n | 'es2016'\n | 'es2017'\n | 'es2018'\n | 'es2019'\n | 'es2020'\n | 'es2021'\n | 'es2022'\n | 'es2023'\n | 'es2024'\n | 'es2025'\n | 'esnext'; // https://www.typescriptlang.org/tsconfig#target\n\n/** Accepts both the canonical casing and the all-lowercase variant of a string literal. */\ntype CaseInsensitive<T extends string> = T | Lowercase<T>;\n\n/**\n * Valid values for the TypeScript `compilerOptions.module` setting.\n *\n * Both title-case (e.g. `\"NodeNext\"`) and lower-case (e.g. `\"nodenext\"`) are\n * accepted, matching TypeScript's own case-insensitive parsing.\n *\n * @see {@link https://www.typescriptlang.org/tsconfig#module}\n */\nexport type TsConfigModule = CaseInsensitive<\n | 'None'\n | 'CommonJS'\n | 'AMD'\n | 'UMD'\n | 'System'\n | 'ES6'\n | 'ES2015'\n | 'ES2020'\n | 'ES2022'\n | 'ESNext'\n | 'Node16'\n | 'Node18'\n | 'Node20'\n | 'NodeNext'\n | 'Preserve'\n>;\n\n/**\n * Valid values for the TypeScript `compilerOptions.moduleResolution` setting.\n *\n * Both title-case (e.g. `\"NodeNext\"`) and lower-case (e.g. `\"nodenext\"`) are\n * accepted, matching TypeScript's own case-insensitive parsing.\n *\n * @see https://www.typescriptlang.org/tsconfig#moduleResolution\n */\nexport type TsConfigModuleResolution = CaseInsensitive<\n 'Classic' | 'Node' | 'Node10' | 'Node16' | 'NodeNext' | 'Bundler'\n>;\n\nexport interface PackageJson {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n catalog?: Record<string, string>;\n catalogs?: Record<string, Record<string, string>>;\n resolvedVersions?: Record<string, string>;\n}\n\nexport interface GeneratorSchema {\n name: string;\n model: string;\n imports: GeneratorImport[];\n dependencies?: string[];\n schema?: OpenApiSchemaObject;\n factory?: string;\n factoryImports?: GeneratorImport[];\n factoryMode?: FactoryMethodsMode;\n}\n\nexport interface GeneratorImport {\n readonly name: string;\n readonly schemaName?: string;\n readonly isZodSchema?: boolean;\n readonly isConstant?: boolean;\n readonly alias?: string;\n readonly default?: boolean;\n readonly values?: boolean;\n readonly syntheticDefaultImport?: boolean;\n readonly namespaceImport?: boolean;\n readonly importPath?: string;\n // True when this import points at a generated schema-level faker factory\n // (e.g. `getPetMock`). The mock-file writer routes it to\n // `<schemas-dir>/index.faker` instead of `<schemas-dir>/<schemaName>`.\n readonly schemaFactory?: boolean;\n}\n\nexport interface GeneratorDependency {\n readonly exports: readonly GeneratorImport[];\n readonly dependency: string;\n}\n\nexport interface GeneratorApiResponse {\n operations: GeneratorOperations;\n schemas: GeneratorSchema[];\n}\n\nexport type GeneratorOperations = Record<string, GeneratorOperation>;\n\n// A single generator's accumulated mock output, keyed by the generator's\n// `OutputMockType`. Writers iterate over `GeneratorTarget.mockOutputs` to\n// emit one file per entry (e.g. `<file>.msw.ts` and `<file>.faker.ts`).\nexport interface GeneratorMockOutput {\n type: OutputMockType;\n implementation: string;\n imports: GeneratorImport[];\n}\n\nexport interface GeneratorMockOutputFull {\n type: OutputMockType;\n implementation: {\n function: string;\n handler: string;\n handlerName: string;\n };\n imports: GeneratorImport[];\n}\n\nexport interface GeneratorTarget {\n imports: GeneratorImport[];\n implementation: string;\n mockOutputs: GeneratorMockOutput[];\n mutators?: GeneratorMutator[];\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator[];\n formUrlEncoded?: GeneratorMutator[];\n paramsSerializer?: GeneratorMutator[];\n paramsFilter?: GeneratorMutator[];\n fetchReviver?: GeneratorMutator[];\n}\n\nexport interface GeneratorTargetFull {\n imports: GeneratorImport[];\n implementation: string;\n mockOutputs: GeneratorMockOutputFull[];\n mutators?: GeneratorMutator[];\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator[];\n formUrlEncoded?: GeneratorMutator[];\n paramsSerializer?: GeneratorMutator[];\n paramsFilter?: GeneratorMutator[];\n fetchReviver?: GeneratorMutator[];\n}\n\nexport interface GeneratorOperation {\n imports: GeneratorImport[];\n implementation: string;\n mockOutputs: GeneratorMockOutputFull[];\n tags: string[];\n mutator?: GeneratorMutator;\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator;\n formUrlEncoded?: GeneratorMutator;\n paramsSerializer?: GeneratorMutator;\n paramsFilter?: GeneratorMutator;\n fetchReviver?: GeneratorMutator;\n operationName: string;\n types?: {\n result: (title?: string) => string;\n };\n}\n\nexport interface GeneratorVerbOptions {\n verb: Verbs;\n route: string;\n pathRoute: string;\n summary?: string;\n doc: string;\n tags: string[];\n operationId: string;\n operationName: string;\n response: GetterResponse;\n body: GetterBody;\n headers?: GetterQueryParam;\n queryParams?: GetterQueryParam;\n params: GetterParams;\n props: GetterProps;\n mutator?: GeneratorMutator;\n formData?: GeneratorMutator;\n formUrlEncoded?: GeneratorMutator;\n paramsSerializer?: GeneratorMutator;\n paramsFilter?: GeneratorMutator;\n fetchReviver?: GeneratorMutator;\n override: NormalizedOverrideOutput;\n deprecated?: boolean;\n originalOperation: OpenApiOperationObject;\n}\n\nexport type GeneratorVerbsOptions = GeneratorVerbOptions[];\n\nexport interface GeneratorOptions {\n route: string;\n pathRoute: string;\n override: NormalizedOverrideOutput;\n context: ContextSpec;\n mock?: GlobalMockOptions | ClientMockBuilder;\n output: string;\n}\n\nexport interface GeneratorClient {\n implementation: string;\n imports: GeneratorImport[];\n mutators?: GeneratorMutator[];\n /** When set, overrides the default verbOption.doc prepended to the implementation */\n docComment?: string;\n}\n\nexport interface GeneratorMutatorParsingInfo {\n numberOfParams: number;\n returnNumberOfParams?: number;\n}\nexport interface GeneratorMutator {\n name: string;\n path: string;\n default: boolean;\n hasErrorType: boolean;\n errorTypeName: string;\n hasSecondArg: boolean;\n hasThirdArg: boolean;\n isHook: boolean;\n bodyTypeName?: string;\n}\n\nexport type ClientBuilder = (\n verbOptions: GeneratorVerbOptions,\n options: GeneratorOptions,\n outputClient: OutputClient | OutputClientFunc,\n output?: NormalizedOutputOptions,\n) => GeneratorClient | Promise<GeneratorClient>;\n\nexport interface ClientFileBuilder {\n path: string;\n content: string;\n}\nexport type ClientExtraFilesBuilder = (\n verbOptions: Record<string, GeneratorVerbOptions>,\n output: NormalizedOutputOptions,\n context: ContextSpec,\n) => Promise<ClientFileBuilder[]>;\n\nexport type ClientHeaderBuilder = (params: {\n title: string;\n isRequestOptions: boolean;\n isMutator: boolean;\n noFunction?: boolean;\n isGlobalMutator: boolean;\n provideIn: boolean | 'root' | 'any';\n hasAwaitedType: boolean;\n output: NormalizedOutputOptions;\n verbOptions: Record<string, GeneratorVerbOptions>;\n tag?: string;\n isDefaultTagBucket?: boolean;\n clientImplementation: string;\n}) => string;\n\nexport type ClientFooterBuilder = (params: {\n noFunction?: boolean | undefined;\n operationNames: string[];\n title?: string;\n hasAwaitedType: boolean;\n hasMutator: boolean;\n}) => string;\n\nexport type ClientTitleBuilder = (title: string) => string;\n\nexport type ClientDependenciesBuilder = (\n hasGlobalMutator: boolean,\n hasParamsSerializerOptions: boolean,\n packageJson?: PackageJson,\n httpClient?: OutputHttpClient,\n hasTagsMutator?: boolean,\n override?: NormalizedOverrideOutput,\n) => GeneratorDependency[];\n\nexport interface ClientMockGeneratorImplementation {\n function: string;\n handlerName: string;\n handler: string;\n}\n\nexport interface ClientMockGeneratorBuilder {\n imports: GeneratorImport[];\n implementation: ClientMockGeneratorImplementation;\n}\n\nexport type ClientMockBuilder = (\n verbOptions: GeneratorVerbOptions,\n generatorOptions: GeneratorOptions,\n) => ClientMockGeneratorBuilder;\n\nexport interface ClientGeneratorsBuilder {\n client: ClientBuilder;\n header?: ClientHeaderBuilder;\n dependencies?: ClientDependenciesBuilder;\n footer?: ClientFooterBuilder;\n title?: ClientTitleBuilder;\n extraFiles?: ClientExtraFilesBuilder;\n}\n\nexport type GeneratorClients = Record<OutputClient, ClientGeneratorsBuilder>;\n\nexport interface GetterResponse {\n imports: GeneratorImport[];\n definition: {\n success: string;\n errors: string;\n };\n isBlob: boolean;\n types: {\n success: ResReqTypesValue[];\n errors: ResReqTypesValue[];\n };\n contentTypes: string[];\n schemas: GeneratorSchema[];\n\n originalSchema?: OpenApiResponsesObject;\n}\n\nexport interface GetterBody {\n originalSchema: OpenApiReferenceObject | OpenApiRequestBodyObject;\n imports: GeneratorImport[];\n definition: string;\n implementation: string;\n schemas: GeneratorSchema[];\n formData?: string;\n formUrlEncoded?: string;\n contentType: string;\n isOptional: boolean;\n}\n\nexport interface GetterParameters {\n query: { parameter: OpenApiParameterObject; imports: GeneratorImport[] }[];\n path: { parameter: OpenApiParameterObject; imports: GeneratorImport[] }[];\n header: { parameter: OpenApiParameterObject; imports: GeneratorImport[] }[];\n}\n\nexport interface GetterParam {\n name: string;\n definition: string;\n implementation: string;\n default: unknown;\n required: boolean;\n imports: GeneratorImport[];\n}\n\nexport type GetterParams = GetterParam[];\nexport interface GetterQueryParam {\n schema: GeneratorSchema;\n deps: GeneratorSchema[];\n isOptional: boolean;\n paramNames?: string[];\n originalSchema?: OpenApiSchemaObject;\n requiredNullableKeys?: string[];\n /**\n * Names of query parameters whose declared schema is non-primitive\n * (object, array of objects, or untyped). Used by Angular generators to\n * preserve these values through the default `filterParams` helper instead\n * of silently dropping them — the user's `paramsSerializer`, `mutator`, or\n * `paramsFilter` is then responsible for handling them. See issue #3326.\n */\n nonPrimitiveKeys?: string[];\n}\n\nexport type GetterPropType =\n | 'param'\n | 'body'\n | 'queryParam'\n | 'header'\n | 'namedPathParams';\n\nexport const GetterPropType = {\n PARAM: 'param',\n NAMED_PATH_PARAMS: 'namedPathParams',\n BODY: 'body',\n QUERY_PARAM: 'queryParam',\n HEADER: 'header',\n} as const;\n\ninterface GetterPropBase {\n name: string;\n definition: string;\n implementation: string;\n default: unknown;\n required: boolean;\n}\n\nexport type GetterProp = GetterPropBase &\n (\n | { type: 'namedPathParams'; destructured: string; schema: GeneratorSchema }\n | { type: Exclude<GetterPropType, 'namedPathParams'> }\n );\n\nexport type GetterProps = GetterProp[];\n\nexport type SchemaType =\n | 'integer'\n | 'number'\n | 'string'\n | 'boolean'\n | 'object'\n | 'null'\n | 'array'\n | 'enum'\n | 'unknown';\n\nexport const SchemaType = {\n integer: 'integer',\n number: 'number',\n string: 'string',\n boolean: 'boolean',\n object: 'object',\n null: 'null',\n array: 'array',\n enum: 'enum',\n unknown: 'unknown',\n};\n\nexport interface ScalarValue {\n value: string;\n useTypeAlias?: boolean;\n isEnum: boolean;\n hasReadonlyProps: boolean;\n type: SchemaType;\n imports: GeneratorImport[];\n schemas: GeneratorSchema[];\n isRef: boolean;\n dependencies: string[];\n example?: unknown;\n examples?: Record<string, unknown> | unknown[];\n}\n\nexport type ResolverValue = ScalarValue & {\n originalSchema: OpenApiSchemaObject;\n};\n\nexport type ResReqTypesValue = ScalarValue & {\n formData?: string;\n formUrlEncoded?: string;\n isRef?: boolean;\n hasReadonlyProps?: boolean;\n key: string;\n contentType: string;\n originalSchema?: OpenApiSchemaObject;\n};\n\nexport interface WriteSpecBuilder {\n operations: GeneratorOperations;\n verbOptions: Record<string, GeneratorVerbOptions>;\n schemas: GeneratorSchema[];\n title: GeneratorClientTitle;\n header: GeneratorClientHeader;\n footer: GeneratorClientFooter;\n imports: GeneratorClientImports;\n importsMock: GenerateMockImports;\n extraFiles: ClientFileBuilder[];\n info: OpenApiInfoObject;\n target: string;\n spec: OpenApiDocument;\n}\n\nexport interface WriteModeProps {\n builder: WriteSpecBuilder;\n output: NormalizedOutputOptions;\n workspace: string;\n projectName?: string;\n header: string;\n needSchema: boolean;\n generateSchemasInline?: () => string;\n}\n\nexport interface GeneratorApiOperations {\n verbOptions: Record<string, GeneratorVerbOptions>;\n operations: GeneratorOperations;\n schemas: GeneratorSchema[];\n}\n\nexport interface GeneratorClientExtra {\n implementation: string;\n implementationMock: string;\n}\n\nexport type GeneratorClientTitle = (data: {\n outputClient?: OutputClient | OutputClientFunc;\n title: string;\n customTitleFunc?: (title: string) => string;\n output: NormalizedOutputOptions;\n}) => GeneratorClientExtra;\n\nexport type GeneratorClientHeader = (data: {\n outputClient?: OutputClient | OutputClientFunc;\n isRequestOptions: boolean;\n isMutator: boolean;\n isGlobalMutator: boolean;\n provideIn: boolean | 'root' | 'any';\n hasAwaitedType: boolean;\n titles: GeneratorClientExtra;\n output: NormalizedOutputOptions;\n verbOptions: Record<string, GeneratorVerbOptions>;\n tag?: string;\n isDefaultTagBucket?: boolean;\n clientImplementation: string;\n}) => GeneratorClientExtra;\n\nexport type GeneratorClientFooter = (data: {\n outputClient: OutputClient | OutputClientFunc;\n operationNames: string[];\n hasMutator: boolean;\n hasAwaitedType: boolean;\n titles: GeneratorClientExtra;\n output: NormalizedOutputOptions;\n}) => GeneratorClientExtra;\n\nexport type GeneratorClientImports = (data: {\n client: OutputClient | OutputClientFunc;\n implementation: string;\n imports: readonly GeneratorDependency[];\n projectName?: string;\n hasSchemaDir: boolean;\n isAllowSyntheticDefaultImports: boolean;\n hasGlobalMutator: boolean;\n hasTagsMutator: boolean;\n hasParamsSerializerOptions: boolean;\n packageJson?: PackageJson;\n output: NormalizedOutputOptions;\n}) => string;\n\nexport type GenerateMockImports = (data: {\n implementation: string;\n imports: readonly GeneratorDependency[];\n projectName?: string;\n hasSchemaDir: boolean;\n isAllowSyntheticDefaultImports: boolean;\n options?: GlobalMockOptions;\n}) => string;\n\nexport type GeneratorApiBuilder = GeneratorApiOperations & {\n title: GeneratorClientTitle;\n header: GeneratorClientHeader;\n footer: GeneratorClientFooter;\n imports: GeneratorClientImports;\n importsMock: GenerateMockImports;\n extraFiles: ClientFileBuilder[];\n};\n\nexport class ErrorWithTag extends Error {\n tag: string;\n constructor(message: string, tag: string, options?: ErrorOptions) {\n super(message, options);\n this.tag = tag;\n }\n}\n\nexport type OpenApiSchemaObjectType =\n | 'string'\n | 'number'\n | 'boolean'\n | 'object'\n | 'integer'\n | 'null'\n | 'array';\n\n// OpenAPI type aliases. Intended to make it easy to swap to OpenAPI v3.2 in the future\nexport type OpenApiDocument = OpenAPIV3_1.Document;\nexport type OpenApiSchemaObject = OpenAPIV3_1.SchemaObject;\nexport type OpenApiSchemasObject = Record<string, OpenApiSchemaObject>;\nexport type OpenApiReferenceObject = OpenAPIV3_1.ReferenceObject & {\n // https://github.com/scalar/scalar/issues/7405\n $ref?: string;\n};\nexport type OpenApiComponentsObject = OpenAPIV3_1.ComponentsObject;\nexport type OpenApiPathsObject = OpenAPIV3_1.PathsObject;\nexport type OpenApiPathItemObject = OpenAPIV3_1.PathItemObject;\nexport type OpenApiResponsesObject = OpenAPIV3_1.ResponsesObject;\nexport type OpenApiResponseObject = OpenAPIV3_1.ResponseObject;\nexport type OpenApiParameterObject = OpenAPIV3_1.ParameterObject;\nexport type OpenApiRequestBodyObject = OpenAPIV3_1.RequestBodyObject;\nexport type OpenApiInfoObject = OpenAPIV3_1.InfoObject;\nexport type OpenApiExampleObject = OpenAPIV3_1.ExampleObject;\nexport type OpenApiOperationObject = OpenAPIV3_1.OperationObject;\nexport type OpenApiMediaTypeObject = OpenAPIV3_1.MediaTypeObject;\nexport type OpenApiEncodingObject = OpenAPIV3_1.EncodingObject;\nexport type OpenApiServerObject = OpenAPIV3_1.ServerObject;\n","import { Verbs } from './types';\n\nexport const generalJSTypes = [\n 'number',\n 'string',\n 'null',\n 'unknown',\n 'undefined',\n 'object',\n 'blob',\n];\n\nexport const generalJSTypesWithArray = generalJSTypes.flatMap((type) => [\n type,\n `Array<${type}>`,\n `${type}[]`,\n]);\n\nexport const VERBS_WITH_BODY = [\n Verbs.POST,\n Verbs.PUT,\n Verbs.PATCH,\n Verbs.DELETE,\n];\n\nexport const URL_REGEX =\n /^(?:http(s)?:\\/\\/)?[\\w.-]+(?:\\.[\\w.-]+)+[\\w\\-._~:/?#[\\]@!$&'()*+,;=.]+$/;\n\nexport const TEMPLATE_TAG_REGEX = /\\${(.+?)}/g; // For replace of 'thing' ${thing}\n","import path from 'node:path';\n\nimport { isFunction, isNullish, isString } from 'remeda';\n\nimport {\n type ClientMockBuilder,\n type FakerMockOptions,\n type GlobalMockOptions,\n type MswMockOptions,\n type OpenApiReferenceObject,\n type OpenApiSchemaObject,\n OutputMockType,\n SchemaType,\n Verbs,\n} from '../types';\n\n/**\n * Discriminator helper for `ReferenceObject`\n *\n * @param property\n */\nexport function isReference(obj: object): obj is OpenApiReferenceObject {\n return !isNullish(obj) && Object.hasOwn(obj, '$ref');\n}\n\n/**\n * Represents an OpenAPI 3.1 schema object that contains a `$dynamicRef`\n * keyword, used for recursive or polymorphic schema references.\n *\n * @see https://json-schema.org/draft/2020-12/json-schema-core#section-8.2.4\n */\nexport interface OpenApiDynamicReferenceObject {\n $dynamicRef: string;\n [key: string]: unknown;\n}\n\n/**\n * Discriminator helper for {@link OpenApiDynamicReferenceObject}.\n *\n * Returns `true` when `obj` has a `$dynamicRef` string property,\n * indicating it is an OpenAPI 3.1 dynamic reference rather than a\n * static `$ref`.\n */\nexport function isDynamicReference(\n obj: object,\n): obj is OpenApiDynamicReferenceObject {\n return (\n !isNullish(obj) &&\n Object.hasOwn(obj, '$dynamicRef') &&\n typeof (obj as Record<string, unknown>).$dynamicRef === 'string'\n );\n}\n\nexport function isDirectory(pathValue: string) {\n return !path.extname(pathValue);\n}\n\nexport function isObject(x: unknown): x is Record<string, unknown> {\n return Object.prototype.toString.call(x) === '[object Object]';\n}\n\nexport function isStringLike(val: unknown): val is string {\n if (isString(val)) {\n return true;\n }\n\n return Object.prototype.toString.call(val) === '[object String]';\n}\n\nexport function isModule(x: unknown): x is Record<string, unknown> {\n return Object.prototype.toString.call(x) === '[object Module]';\n}\n\nexport function isNumeric(x: unknown): x is number {\n if (typeof x === 'number') return Number.isInteger(x);\n return isString(x) && /^-?\\d+$/.test(x);\n}\n\nexport function isSchema(x: unknown): x is OpenApiSchemaObject {\n if (!isObject(x)) {\n return false;\n }\n\n if (isString(x.type) && Object.values(SchemaType).includes(x.type)) {\n return true;\n }\n\n const combine = x.allOf ?? x.anyOf ?? x.oneOf;\n if (Array.isArray(combine)) {\n return true;\n }\n\n if (isObject(x.properties)) {\n return true;\n }\n\n return false;\n}\n\nexport function isVerb(verb: string): verb is Verbs {\n return Object.values(Verbs).includes(verb as Verbs);\n}\n\nexport function isUrl(str: string) {\n if (!str.trim()) return false;\n\n try {\n const url = new URL(str);\n return ['http:', 'https:'].includes(url.protocol);\n } catch {\n return false;\n }\n}\n\n/**\n * Type guard for the MSW mock generator. Use to narrow a\n * `GlobalMockOptions | ClientMockBuilder` value to `MswMockOptions`.\n */\nexport function isMswMock(\n mock: GlobalMockOptions | ClientMockBuilder,\n): mock is MswMockOptions {\n return !isFunction(mock) && mock.type === OutputMockType.MSW;\n}\n\n/**\n * Type guard for the Faker mock generator. Use to narrow a\n * `GlobalMockOptions | ClientMockBuilder` value to `FakerMockOptions`.\n */\nexport function isFakerMock(\n mock: GlobalMockOptions | ClientMockBuilder,\n): mock is FakerMockOptions {\n return !isFunction(mock) && mock.type === OutputMockType.FAKER;\n}\n\nexport { isBoolean, isFunction, isNullish, isNumber, isString } from 'remeda';\n","import { isFunction } from './assertion';\n\nexport async function asyncReduce<IterationItem, AccValue>(\n array: IterationItem[],\n reducer: (\n accumulate: AccValue,\n current: IterationItem,\n ) => AccValue | Promise<AccValue>,\n initValue: AccValue,\n): Promise<AccValue> {\n const shouldClone =\n initValue === null ||\n (initValue === Object(initValue) && !isFunction(initValue));\n let accumulate: AccValue = shouldClone\n ? (Object.create(initValue as unknown as object) as AccValue)\n : initValue;\n\n for (const item of array) {\n accumulate = await reducer(accumulate, item);\n }\n\n return accumulate;\n}\n","import { NamingConvention } from '../types';\n\nconst unicodes = function (s: string, prefix = '') {\n return s\n .replaceAll(/(^|-)/g, String.raw`$1\\u` + prefix)\n .replaceAll(',', String.raw`\\u` + prefix);\n};\n\nconst symbols = unicodes('20-26,28-2F,3A-40,5B-60,7B-7E,A0-BF,D7,F7', '00');\nconst lowers = 'a-z' + unicodes('DF-F6,F8-FF', '00');\nconst uppers = 'A-Z' + unicodes('C0-D6,D8-DE', '00');\nconst impropers = String.raw`A|An|And|As|At|But|By|En|For|If|In|Of|On|Or|The|To|Vs?\\.?|Via`;\n\nconst regexps = {\n capitalize: new RegExp('(^|[' + symbols + '])([' + lowers + '])', 'g'),\n pascal: new RegExp('(^|[' + symbols + '])+([' + lowers + uppers + '])', 'g'),\n fill: new RegExp('[' + symbols + ']+(.|$)', 'g'),\n sentence: new RegExp(\n String.raw`(^\\s*|[\\?\\!\\.]+\"?\\s+\"?|,\\s+\")([` + lowers + '])',\n 'g',\n ),\n improper: new RegExp(String.raw`\\b(` + impropers + String.raw`)\\b`, 'g'),\n relax: new RegExp(\n '([^' +\n uppers +\n '])([' +\n uppers +\n ']*)([' +\n uppers +\n '])(?=[^' +\n uppers +\n ']|$)',\n 'g',\n ),\n upper: new RegExp('^[^' + lowers + ']+$'),\n hole: /[^\\s]\\s[^\\s]/,\n apostrophe: /'/g,\n room: new RegExp('[' + symbols + ']'),\n};\n\nconst deapostrophe = (s: string) => {\n return s.replace(regexps.apostrophe, '');\n};\n\nconst up = (s: string) => s.toUpperCase();\nconst low = (s: string) => s.toLowerCase();\n\nconst fill = (s: string, fillWith: string, isDeapostrophe = false) => {\n s = s.replace(regexps.fill, function (m: string, next: string) {\n return next ? fillWith + next : '';\n });\n\n if (isDeapostrophe) {\n s = deapostrophe(s);\n }\n return s;\n};\n\nconst decap = (s: string, char = 0) => {\n return low(s.charAt(char)) + s.slice(char + 1);\n};\n\nconst relax = (\n m: string,\n before: string,\n acronym: string | undefined,\n caps: string,\n) => {\n return before + ' ' + (acronym ? acronym + ' ' : '') + caps;\n};\n\nconst prep = (s: string, isFill = false, isPascal = false, isUpper = false) => {\n // s is already typed as string, no coercion needed\n if (!isUpper && regexps.upper.test(s)) {\n s = low(s);\n }\n if (!isFill && !regexps.hole.test(s)) {\n // eslint-disable-next-line no-var\n var holey = fill(s, ' ');\n if (regexps.hole.test(holey)) {\n s = holey;\n }\n }\n if (!isPascal && !regexps.room.test(s)) {\n s = s.replace(regexps.relax, relax);\n }\n return s;\n};\n\nconst lower = (s: string, fillWith: string, isDeapostrophe: boolean) => {\n return fill(low(prep(s, !!fillWith)), fillWith, isDeapostrophe);\n};\n\n// Caches the previously converted strings to improve performance\nconst pascalMemory: Record<string, string> = {};\n\nexport function pascal(s = '') {\n if (pascalMemory[s]) {\n return pascalMemory[s];\n }\n\n const isStartWithUnderscore = s.startsWith('_');\n\n if (regexps.upper.test(s)) {\n s = low(s);\n }\n\n const pascalString = (s.match(/[a-zA-Z0-9\\u00C0-\\u017F]+/g) ?? [])\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join('');\n\n const pascalWithUnderscore = isStartWithUnderscore\n ? `_${pascalString}`\n : pascalString;\n\n pascalMemory[s] = pascalWithUnderscore;\n\n return pascalWithUnderscore;\n}\n\nexport function camel(s = '') {\n const isStartWithUnderscore = s.startsWith('_');\n const camelString = decap(pascal(s), isStartWithUnderscore ? 1 : 0);\n return isStartWithUnderscore ? `_${camelString}` : camelString;\n}\n\nexport function snake(s = '') {\n return lower(s, '_', true);\n}\n\nexport function kebab(s = '') {\n return lower(s, '-', true);\n}\n\nexport function upper(s: string, fillWith: string, isDeapostrophe?: boolean) {\n return fill(up(prep(s, !!fillWith, false, true)), fillWith, isDeapostrophe);\n}\n\nexport function conventionName(name: string, convention: NamingConvention) {\n let nameConventionTransform = camel;\n switch (convention) {\n case NamingConvention.PASCAL_CASE: {\n nameConventionTransform = pascal;\n\n break;\n }\n case NamingConvention.SNAKE_CASE: {\n nameConventionTransform = snake;\n\n break;\n }\n case NamingConvention.KEBAB_CASE: {\n nameConventionTransform = kebab;\n\n break;\n }\n // No default\n }\n\n return nameConventionTransform(name);\n}\n","import { compare, type CompareOperator } from 'compare-versions';\n\nexport function compareVersions(\n firstVersion: string,\n secondVersions: string,\n operator: CompareOperator = '>=',\n) {\n if (firstVersion === 'latest' || firstVersion === '*') {\n return true;\n }\n\n // Handle workspace catalog references (pnpm/bun)\n // catalog: or catalog:name format - assume latest version\n if (firstVersion.startsWith('catalog:')) {\n return true;\n }\n\n return compare(\n firstVersion.replace(/(\\s(.*))/, ''),\n secondVersions,\n operator,\n );\n}\n","import type { OpenApiSchemaObject } from '../types';\n\n// Known binary application/* types — add new entries here as needed\nconst binaryApplicationTypes = new Set([\n 'application/octet-stream',\n 'application/pdf',\n 'application/zip',\n]);\n\n/**\n * Determine if a content type is binary.\n * Only known binary types return true. Unknown types default to false (non-binary)\n * so that schema type information is preserved rather than being overridden with Blob.\n */\nexport function isBinaryContentType(contentType: string): boolean {\n // Strip parameters (e.g., \"; charset=utf-8\") to get the base MIME type\n const baseType = contentType.split(';')[0].trim();\n\n if (baseType.startsWith('image/')) return true;\n if (baseType.startsWith('audio/')) return true;\n if (baseType.startsWith('video/')) return true;\n if (baseType.startsWith('font/')) return true;\n\n return binaryApplicationTypes.has(baseType);\n}\n\n/**\n * Determine if a form-data field should be treated as a file (binary or text).\n *\n * Precedence (per OAS 3.1): encoding.contentType > schema.contentMediaType\n *\n * Returns:\n * - 'binary': binary file (Blob)\n * - 'text': text file (Blob | string)\n * - undefined: not a file, use standard string resolution\n */\nexport function getFormDataFieldFileType(\n resolvedSchema: OpenApiSchemaObject,\n partContentType: string | undefined,\n): 'binary' | 'text' | undefined {\n // Only override string fields - objects/arrays with encoding are just serialized\n if (resolvedSchema.type !== 'string') {\n return undefined;\n }\n\n // contentEncoding (e.g., base64) means the value is an encoded string, not a file\n if (resolvedSchema.contentEncoding) {\n return undefined;\n }\n\n const contentMediaType = resolvedSchema.contentMediaType as\n | string\n | undefined;\n const effectiveContentType = partContentType ?? contentMediaType;\n\n if (effectiveContentType) {\n return isBinaryContentType(effectiveContentType) ? 'binary' : 'text';\n }\n\n return undefined;\n}\n\n/**\n * Filter configuration for content types\n */\nexport interface ContentTypeFilter {\n include?: string[];\n exclude?: string[];\n}\n\n/**\n * Filters items by content type based on include/exclude rules\n *\n * @param items - Array of items with contentType property\n * @param filter - Optional filter configuration\n * @returns Filtered array\n *\n * @example\n * ```ts\n * const types = [\n * { contentType: 'application/json', value: '...' },\n * { contentType: 'text/xml', value: '...' }\n * ];\n *\n * // Include only JSON\n * filterByContentType(types, { include: ['application/json'] });\n *\n * // Exclude XML\n * filterByContentType(types, { exclude: ['text/xml'] });\n * ```\n */\nexport function filterByContentType<T extends { contentType: string }>(\n items: T[],\n filter?: ContentTypeFilter,\n): T[] {\n if (!filter) {\n return items;\n }\n\n return items.filter((item) => {\n const shouldInclude =\n !filter.include || filter.include.includes(item.contentType);\n\n const shouldExclude = filter.exclude?.includes(item.contentType) ?? false;\n\n return shouldInclude && !shouldExclude;\n });\n}\n","import debug from 'debug';\n\nimport { isString } from './assertion';\n\nconst filter = process.env.ORVAL_DEBUG_FILTER;\nconst DEBUG = process.env.DEBUG;\n\ninterface DebuggerOptions {\n onlyWhenFocused?: boolean | string;\n}\n\nexport function createDebugger(\n ns: string,\n options: DebuggerOptions = {},\n): debug.Debugger['log'] {\n const log = debug(ns);\n const { onlyWhenFocused } = options;\n const focus = isString(onlyWhenFocused) ? onlyWhenFocused : ns;\n return (msg: string, ...args: unknown[]) => {\n if (filter && !msg.includes(filter)) {\n return;\n }\n if (onlyWhenFocused && !DEBUG?.includes(focus)) {\n return;\n }\n log(msg, ...args);\n };\n}\n","import type { ContextSpec } from '../types';\n\nconst search = String.raw`\\*/`; // Find '*/'\nconst replacement = String.raw`*\\/`; // Replace With '*\\/'\n\nconst regex = new RegExp(search, 'g');\n\ninterface JsDocSchema extends Record<string, unknown> {\n description?: string[] | string;\n deprecated?: boolean;\n summary?: string;\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n minItems?: number;\n maxItems?: number;\n type?: string | string[];\n pattern?: string;\n items?: JsDocSchema;\n}\n\ninterface JsDocEntry {\n key: string;\n value: boolean | number | string;\n}\n\nconst itemValidationKeys = [\n 'minLength',\n 'maxLength',\n 'minimum',\n 'maximum',\n 'exclusiveMinimum',\n 'exclusiveMaximum',\n 'minItems',\n 'maxItems',\n 'pattern',\n] as const satisfies readonly (keyof JsDocSchema)[];\n\nfunction getItemValidationDocEntries(\n schema?: JsDocSchema,\n prefix = 'items',\n visited = new WeakSet<JsDocSchema>(),\n): JsDocEntry[] {\n if (!schema) {\n return [];\n }\n if (visited.has(schema)) {\n return [];\n }\n visited.add(schema);\n\n const entries = itemValidationKeys.flatMap((key) => {\n const value = schema[key];\n\n return value === undefined ? [] : [{ key: `${prefix}.${key}`, value }];\n });\n\n return [\n ...entries,\n ...getItemValidationDocEntries(schema.items, `${prefix}.items`, visited),\n ];\n}\n\nexport function jsDoc(\n schema: object & JsDocSchema,\n tryOneLine = false,\n context?: ContextSpec,\n): string {\n if (context?.output.override.jsDoc) {\n const { filter } = context.output.override.jsDoc;\n if (filter) {\n return keyValuePairsToJsDoc(filter(schema));\n }\n }\n const {\n description,\n deprecated,\n summary,\n minLength,\n maxLength,\n minimum,\n maximum,\n exclusiveMinimum,\n exclusiveMaximum,\n minItems,\n maxItems,\n pattern,\n } = schema;\n const isNullable =\n schema.type === 'null' ||\n (Array.isArray(schema.type) && schema.type.includes('null'));\n const itemValidationDocEntries = getItemValidationDocEntries(schema.items);\n // Ensure there aren't any comment terminations in doc\n const lines = (\n Array.isArray(description)\n ? description.filter((d) => !d.includes('eslint-disable'))\n : [description ?? '']\n )\n .flatMap((line) => line.split(/\\r?\\n/))\n .map((line) => line.replaceAll(regex, replacement));\n\n const count = [\n description,\n deprecated,\n summary,\n minLength?.toString(),\n maxLength?.toString(),\n minimum?.toString(),\n maximum?.toString(),\n exclusiveMinimum?.toString(),\n exclusiveMaximum?.toString(),\n minItems?.toString(),\n maxItems?.toString(),\n isNullable ? 'null' : '',\n pattern,\n ...itemValidationDocEntries.map(({ value }) => value.toString()),\n ].filter(Boolean).length;\n\n if (!count) {\n return '';\n }\n\n const oneLine = count === 1 && tryOneLine;\n const eslintDisable = Array.isArray(description)\n ? description\n .find((d) => d.includes('eslint-disable'))\n ?.replaceAll(regex, replacement)\n : undefined;\n let doc = `${eslintDisable ? `/* ${eslintDisable} */\\n` : ''}/**`;\n\n if (description) {\n if (!oneLine) {\n doc += `\\n${tryOneLine ? ' ' : ''} *`;\n }\n doc += ` ${lines.join('\\n * ')}`;\n }\n\n function appendPrefix() {\n if (!oneLine) {\n doc += `\\n${tryOneLine ? ' ' : ''} *`;\n }\n }\n\n function tryAppendStringDocLine(key: string, value?: string) {\n if (value) {\n appendPrefix();\n doc += ` @${key} ${value.replaceAll(regex, replacement)}`;\n }\n }\n\n function tryAppendBooleanDocLine(key: string, value?: boolean) {\n if (value === true) {\n appendPrefix();\n doc += ` @${key}`;\n }\n }\n\n function tryAppendNumberDocLine(key: string, value?: number) {\n if (value !== undefined) {\n appendPrefix();\n doc += ` @${key} ${value}`;\n }\n }\n\n tryAppendBooleanDocLine('deprecated', deprecated);\n tryAppendStringDocLine('summary', summary?.replaceAll(regex, replacement));\n tryAppendNumberDocLine('minLength', minLength);\n tryAppendNumberDocLine('maxLength', maxLength);\n tryAppendNumberDocLine('minimum', minimum);\n tryAppendNumberDocLine('maximum', maximum);\n tryAppendNumberDocLine('exclusiveMinimum', exclusiveMinimum);\n tryAppendNumberDocLine('exclusiveMaximum', exclusiveMaximum);\n tryAppendNumberDocLine('minItems', minItems);\n tryAppendNumberDocLine('maxItems', maxItems);\n tryAppendBooleanDocLine('nullable', isNullable);\n tryAppendStringDocLine('pattern', pattern);\n\n for (const { key, value } of itemValidationDocEntries) {\n if (typeof value === 'string') {\n tryAppendStringDocLine(key, value);\n continue;\n }\n if (typeof value === 'number') {\n tryAppendNumberDocLine(key, value);\n continue;\n }\n tryAppendBooleanDocLine(key, value);\n }\n\n doc += oneLine ? ' ' : `\\n ${tryOneLine ? ' ' : ''}`;\n\n doc += '*/\\n';\n\n return doc;\n}\n\nexport function keyValuePairsToJsDoc(\n keyValues: {\n key: string;\n value: string;\n }[],\n) {\n if (keyValues.length === 0) return '';\n let doc = '/**\\n';\n for (const { key, value } of keyValues) {\n doc += ` * @${key} ${value}\\n`;\n }\n doc += ' */\\n';\n return doc;\n}\n","import path from 'node:path';\nimport { pathToFileURL } from 'node:url';\n\nimport { createJiti } from 'jiti';\n\nimport { isModule, isObject, isString } from './assertion';\n\nconst TS_MODULE_EXTENSIONS = new Set(['.ts', '.mts', '.cts', '.tsx', '.jsx']);\n\nexport async function dynamicImport<T>(\n toImport: T | string,\n from = process.cwd(),\n takeDefault = true,\n): Promise<T> {\n if (!toImport) {\n return toImport as T;\n }\n\n try {\n if (isString(toImport)) {\n const filePath = path.resolve(from, toImport);\n const extension = path.extname(filePath);\n\n if (TS_MODULE_EXTENSIONS.has(extension)) {\n const jiti = createJiti(from, {\n interopDefault: true,\n });\n const data = await jiti.import(filePath);\n\n if (takeDefault && (isObject(data) || isModule(data)) && data.default) {\n return data.default as T;\n }\n\n return data as T;\n }\n\n // use pathToFileURL to solve issue #1332.\n // https://github.com/nodejs/node/issues/31710\n const fileUrl = pathToFileURL(filePath);\n const isJson = extension === '.json';\n const data = (\n isJson\n ? await import(fileUrl.href, { with: { type: 'json' } })\n : await import(fileUrl.href)\n ) as Record<string, unknown>;\n if (takeDefault && (isObject(data) || isModule(data)) && data.default) {\n return data.default as T;\n }\n\n return data as unknown as T;\n }\n\n return toImport as T;\n } catch (error) {\n throw new Error(\n `Oups... 🍻. Path: ${String(toImport)} => ${String(error)}`,\n { cause: error },\n );\n }\n}\n","export function getExtension(path: string) {\n return path.toLowerCase().includes('.yaml') ||\n path.toLowerCase().includes('.yml')\n ? 'yaml'\n : 'json';\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nimport { glob } from 'tinyglobby';\n\nimport { isDirectory } from './assertion';\n\nexport function getFileInfo(\n target = '',\n {\n backupFilename = 'filename',\n extension = '.ts',\n }: { backupFilename?: string; extension?: string } = {},\n) {\n const isDir = isDirectory(target);\n const filePath = isDir\n ? path.join(target, backupFilename + extension)\n : target;\n const pathWithoutExtension = filePath.replace(/\\.[^/.]+$/, '');\n const dir = path.dirname(filePath);\n const filename = path.basename(\n filePath,\n extension.startsWith('.') ? extension : `.${extension}`,\n );\n\n return {\n path: filePath,\n pathWithoutExtension,\n extension,\n isDirectory: isDir,\n dirname: dir,\n filename,\n };\n}\n\nexport async function removeFilesAndEmptyFolders(\n patterns: string[],\n dir: string,\n) {\n const files = await glob(patterns, {\n cwd: dir,\n absolute: true,\n });\n\n // Remove files\n await Promise.all(files.map((file) => fs.promises.unlink(file)));\n\n // Find and remove empty directories\n const directories = await glob(['**/*'], {\n cwd: dir,\n absolute: true,\n onlyDirectories: true,\n });\n\n // Sort directories by depth (deepest first) to ensure we can remove nested empty folders\n const sortedDirectories = directories.toSorted((a, b) => {\n const depthA = a.split('/').length;\n const depthB = b.split('/').length;\n return depthB - depthA;\n });\n\n // Remove empty directories\n for (const directory of sortedDirectories) {\n try {\n const contents = await fs.promises.readdir(directory);\n if (contents.length === 0) {\n await fs.promises.rmdir(directory);\n }\n } catch {\n // Directory might have been removed already or doesn't exist\n // Continue with next directory\n }\n }\n}\n","import {\n type ClientMockBuilder,\n type GlobalMockOptions,\n OutputMockType,\n} from '../types';\nimport { isFunction } from './assertion';\n\n/**\n * Returns the filename suffix for a given mock entry's output file. For\n * example a `{ type: OutputMockType.MSW }` entry produces `<file>.msw.ts` and\n * a `{ type: OutputMockType.FAKER }` entry produces `<file>.faker.ts`.\n *\n * Custom `ClientMockBuilder` functions default to the `msw` suffix to preserve\n * the historical behavior.\n */\nexport function getMockFileExtensionByTypeName(\n mock: GlobalMockOptions | ClientMockBuilder,\n): OutputMockType {\n if (isFunction(mock)) {\n return OutputMockType.MSW;\n }\n return mock.type;\n}\n","/**\n * Type safe way to get arbitrary property from an object.\n *\n * @param obj - The object from which to retrieve the property.\n * @param propertyName - The name of the property to retrieve.\n * @returns Object with `hasProperty: true` and `value` of the property if it exists; otherwise `hasProperty: false` and undefined.\n *\n * @remarks Until TypeScript adds type-narrowing for Object.hasOwn we have to use this workaround\n */\nexport function getPropertySafe<T extends object, K extends keyof T>(\n obj: T,\n propertyName: K | string,\n):\n | { hasProperty: true; value: T[K] }\n | { hasProperty: false; value: undefined } {\n if (Object.hasOwn(obj, propertyName)) {\n // safe to cast here because of the above check\n return { hasProperty: true, value: obj[propertyName as K] };\n }\n\n return { hasProperty: false, value: undefined };\n}\n","import { VERBS_WITH_BODY } from '../constants';\nimport { Verbs } from '../types';\n\nexport function getIsBodyVerb(verb: Verbs) {\n return VERBS_WITH_BODY.includes(verb);\n}\n","import readline from 'node:readline';\nimport { styleText } from 'node:util';\n\nimport { isString } from './assertion';\n\nexport const log = console.log;\n\nlet _warningCount = 0;\n\nexport function logWarning(message: string) {\n _warningCount++;\n log(styleText('yellow', message));\n}\n\nexport function getWarningCount(): number {\n return _warningCount;\n}\n\nexport function resetWarnings(): void {\n _warningCount = 0;\n}\n\nlet _verbose = false;\n\nexport function setVerbose(v: boolean) {\n _verbose = v;\n}\n\nexport function isVerbose(): boolean {\n return _verbose;\n}\n\nexport const logVerbose: typeof console.log = (...args) => {\n if (_verbose) log(...args);\n};\n\nexport function startMessage({\n name,\n version,\n description,\n}: {\n name: string;\n version: string;\n description: string;\n}): string {\n return `🍻 ${styleText(['cyan', 'bold'], name)} ${styleText('green', `v${version}`)}${\n description ? ` - ${description}` : ''\n }`;\n}\n\nexport function logError(err: unknown, tag?: string) {\n let message;\n\n if (err instanceof Error) {\n message = (err.message || err.stack) ?? 'Unknown error';\n if (err.cause) {\n const causeMsg =\n err.cause instanceof Error\n ? err.cause.message\n : isString(err.cause)\n ? err.cause\n : JSON.stringify(err.cause, undefined, 2);\n message += `\\n Cause: ${causeMsg}`;\n }\n } else {\n message = String(err);\n }\n\n log(\n styleText(\n 'red',\n ['🛑', tag ? `${tag} -` : undefined, message].filter(Boolean).join(' '),\n ),\n );\n}\n\nexport function mismatchArgsMessage(mismatchArgs: string[]) {\n logWarning(\n `${mismatchArgs.join(', ')} ${\n mismatchArgs.length === 1 ? 'is' : 'are'\n } not defined in your configuration!`,\n );\n}\n\nexport function createSuccessMessage(backend?: string) {\n log(\n `🎉 ${\n backend ? `${styleText('green', backend)} - ` : ''\n }Your OpenAPI spec has been converted into ready to use orval!`,\n );\n}\n\nexport type LogType = 'error' | 'warn' | 'info';\nexport type LogLevel = LogType | 'silent';\nexport interface Logger {\n info(msg: string, options?: LogOptions): void;\n warn(msg: string, options?: LogOptions): void;\n warnOnce(msg: string, options?: LogOptions): void;\n error(msg: string, options?: LogOptions): void;\n clearScreen(type: LogType): void;\n hasWarned: boolean;\n}\n\nexport interface LogOptions {\n clear?: boolean;\n timestamp?: boolean;\n}\n\nexport const LogLevels: Record<LogLevel, number> = {\n silent: 0,\n error: 1,\n warn: 2,\n info: 3,\n};\n\nlet lastType: LogType | undefined;\nlet lastMsg: string | undefined;\nlet sameCount = 0;\n\nfunction clearScreen() {\n const repeatCount = process.stdout.rows - 2;\n const blank = repeatCount > 0 ? '\\n'.repeat(repeatCount) : '';\n console.log(blank);\n readline.cursorTo(process.stdout, 0, 0);\n readline.clearScreenDown(process.stdout);\n}\n\nexport interface LoggerOptions {\n prefix?: string;\n allowClearScreen?: boolean;\n}\n\nexport function createLogger(\n level: LogLevel = 'info',\n options: LoggerOptions = {},\n): Logger {\n const { prefix = '[vite]', allowClearScreen = true } = options;\n\n const thresh = LogLevels[level];\n const clear =\n allowClearScreen && process.stdout.isTTY && !process.env.CI\n ? clearScreen\n : () => {\n /* noop */\n };\n\n function output(type: LogType, msg: string, options: LogOptions = {}) {\n if (thresh >= LogLevels[type]) {\n const method = type === 'info' ? 'log' : type;\n const format = () => {\n if (options.timestamp) {\n const tag =\n type === 'info'\n ? styleText(['cyan', 'bold'], prefix)\n : type === 'warn'\n ? styleText(['yellow', 'bold'], prefix)\n : styleText(['red', 'bold'], prefix);\n return `${styleText('dim', new Date().toLocaleTimeString())} ${tag} ${msg}`;\n } else {\n return msg;\n }\n };\n if (type === lastType && msg === lastMsg) {\n sameCount++;\n clear();\n console[method](format(), styleText('yellow', `(x${sameCount + 1})`));\n } else {\n sameCount = 0;\n lastMsg = msg;\n lastType = type;\n if (options.clear) {\n clear();\n }\n console[method](format());\n }\n }\n }\n\n const warnedMessages = new Set<string>();\n\n const logger: Logger = {\n hasWarned: false,\n info(msg, opts) {\n output('info', msg, opts);\n },\n warn(msg, opts) {\n logger.hasWarned = true;\n output('warn', msg, opts);\n },\n warnOnce(msg, opts) {\n if (warnedMessages.has(msg)) return;\n logger.hasWarned = true;\n output('warn', msg, opts);\n warnedMessages.add(msg);\n },\n error(msg, opts) {\n logger.hasWarned = true;\n output('error', msg, opts);\n },\n clearScreen(type) {\n if (thresh >= LogLevels[type]) {\n clear();\n }\n },\n };\n\n return logger;\n}\n","import { isObject } from './assertion';\n\nexport function mergeDeep<T extends object, U extends object>(\n source: T,\n target: U,\n): T & U {\n if (!isObject(target) || !isObject(source)) {\n return source as T & U;\n }\n\n const acc = Object.assign({}, source) as Record<string, unknown>;\n for (const [key, value] of Object.entries(target)) {\n const sourceValue = acc[key];\n\n if (Array.isArray(sourceValue) && Array.isArray(value)) {\n acc[key] = [...(sourceValue as unknown[]), ...(value as unknown[])];\n } else if (isObject(sourceValue) && isObject(value)) {\n acc[key] = mergeDeep(sourceValue, value);\n } else {\n acc[key] = value;\n }\n }\n return acc as T & U;\n}\n","export function count(str = '', key: string) {\n if (!str) {\n return 0;\n }\n\n return (str.match(new RegExp(key, 'g')) ?? []).length;\n}\n","import basepath from 'node:path';\n\nimport { getExtension } from './extension';\n\nexport function isAbsolute(value: string): boolean {\n return basepath.isAbsolute(value);\n}\n\nexport function resolve(...args: string[]): string {\n return toUnix(basepath.resolve(...args));\n}\n\nexport function toUnix(value: string): string {\n value = value.replaceAll('\\\\', '/');\n value = value.replaceAll(/(?<!^)\\/+/g, '/'); // deduplicate except leading for UNC paths\n return value;\n}\n\nexport function join(...args: string[]): string {\n return toUnix(basepath.join(...args.map((a) => toUnix(a))));\n}\n\n/**\n * Behaves exactly like `path.relative(from, to)`, but keeps the first meaningful \"./\"\n */\nexport function relativeSafe(from: string, to: string) {\n const normalizedRelativePath = toUnix(\n basepath.relative(toUnix(from), toUnix(to)),\n );\n const relativePath = normalizeSafe(`.${separator}${normalizedRelativePath}`);\n return relativePath;\n}\n\nexport function getSchemaFileName(path: string) {\n return path\n .replace(`.${getExtension(path)}`, '')\n .slice(path.lastIndexOf('/') + 1);\n}\n\nexport const separator = '/';\n\nexport function normalizeSafe(value: string) {\n let result;\n value = toUnix(value);\n result = toUnix(basepath.normalize(value));\n if (\n value.startsWith('./') &&\n !result.startsWith('./') &&\n !result.startsWith('..')\n ) {\n result = './' + result;\n } else if (value.startsWith('//') && !result.startsWith('//')) {\n result = value.startsWith('//./') ? '//.' + result : '/' + result;\n }\n return result;\n}\n\nexport function joinSafe(...values: string[]) {\n let result = toUnix(basepath.join(...values.map((v) => toUnix(v))));\n\n if (values.length > 0) {\n const firstValue = toUnix(values[0]);\n if (\n firstValue.startsWith('./') &&\n !result.startsWith('./') &&\n !result.startsWith('..')\n ) {\n result = './' + result;\n } else if (firstValue.startsWith('//') && !result.startsWith('//')) {\n result = firstValue.startsWith('//./') ? '//.' + result : '/' + result;\n }\n }\n return result;\n}\n\n/**\n * Given two absolute file paths, generates a valid ESM relative import path\n * from the 'importer' file to the 'exporter' file.\n *\n * @example\n * ```ts\n * getRelativeImportPath('/path/to/importer.ts', '/path/to/exporter.ts')\n * // => './exporter'\n * getRelativeImportPath('/path/to/importer.ts', '/path/to/sub/exporter.ts')\n * // => './sub/exporter'\n * getRelativeImportPath('/path/to/importer.ts', '/path/sibling/exporter.ts')\n * // => '../sibling/exporter'\n * ```\n *\n * This function handles path normalization, cross-platform separators, and\n * ensures the path is a valid ESM relative specifier (e.g., starts with './').\n *\n * @param importerFilePath - The absolute path of the file that will contain the import statement.\n * @param exporterFilePath - The absolute path of the file being imported.\n * @param [includeFileExtension=false] - Whether the import path should include the file extension, defaults to false.\n * @returns The relative import path string.\n */\nexport function getRelativeImportPath(\n importerFilePath: string,\n exporterFilePath: string,\n includeFileExtension = false,\n): string {\n if (!basepath.isAbsolute(importerFilePath))\n throw new Error(\n `'importerFilePath' is not an absolute path. \"${importerFilePath}\"`,\n );\n if (!basepath.isAbsolute(exporterFilePath))\n throw new Error(\n `'exporterFilePath' is not an absolute path. \"${exporterFilePath}\"`,\n );\n\n // Get the directory of the importer file.\n const importerDir = basepath.dirname(importerFilePath);\n\n // Calculate the relative path from the importer's directory to the exporter file.\n const relativePath = basepath.relative(importerDir, exporterFilePath);\n\n // Convert to posix path\n let posixPath = basepath.posix.join(...relativePath.split(basepath.sep));\n\n // Ensure the path starts with './' for same-directory imports.\n // A relative specifier must start with './' or '../'.\n if (!posixPath.startsWith('./') && !posixPath.startsWith('../')) {\n posixPath = `./${posixPath}`;\n }\n\n if (!includeFileExtension) {\n const ext = basepath.extname(posixPath);\n if (ext && posixPath.endsWith(ext)) {\n posixPath = posixPath.slice(0, -ext.length);\n }\n }\n\n return posixPath;\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\n\nimport type { PackageJson } from '../types';\n\nexport function resolveInstalledVersion(\n packageName: string,\n fromDir: string,\n): string | undefined {\n try {\n const require = createRequire(path.join(fromDir, 'noop.js'));\n try {\n const pkg = require(`${packageName}/package.json`) as {\n version?: string;\n };\n return pkg.version;\n } catch (directError: unknown) {\n if (\n directError instanceof Error &&\n 'code' in directError &&\n (directError as NodeJS.ErrnoException).code ===\n 'ERR_PACKAGE_PATH_NOT_EXPORTED'\n ) {\n const entryPath = require.resolve(packageName);\n let dir = path.dirname(entryPath);\n while (dir !== path.parse(dir).root) {\n const pkgPath = path.join(dir, 'package.json');\n if (existsSync(pkgPath)) {\n const pkgData = JSON.parse(readFileSync(pkgPath, 'utf8')) as {\n name?: string;\n version?: string;\n };\n if (pkgData.name === packageName) {\n return pkgData.version;\n }\n }\n dir = path.dirname(dir);\n }\n return undefined;\n }\n throw directError;\n }\n } catch {\n return undefined;\n }\n}\n\nexport function resolveInstalledVersions(\n packageJson: PackageJson,\n fromDir: string,\n): Record<string, string> {\n const resolved: Record<string, string> = {};\n const allDeps = new Set([\n ...Object.keys(packageJson.dependencies ?? {}),\n ...Object.keys(packageJson.devDependencies ?? {}),\n ...Object.keys(packageJson.peerDependencies ?? {}),\n ]);\n for (const pkgName of allDeps) {\n const version = resolveInstalledVersion(pkgName, fromDir);\n if (version) {\n resolved[pkgName] = version;\n }\n }\n return resolved;\n}\n","export const sortByPriority = <T>(\n arr: (T & { default?: unknown; required?: boolean })[],\n) =>\n arr.toSorted((a, b) => {\n if (a.default) {\n return 1;\n }\n\n if (b.default) {\n return -1;\n }\n\n if (a.required && b.required) {\n return 0;\n }\n\n if (a.required) {\n return -1;\n }\n\n if (b.required) {\n return 1;\n }\n return 0;\n });\n","import { keyword } from 'esutils';\n\nimport {\n isBoolean,\n isFunction,\n isNumber,\n isObject,\n isString,\n} from './assertion';\n\n/**\n * Converts data to a string representation suitable for code generation.\n * Handles strings, numbers, booleans, functions, arrays, and objects.\n *\n * @param data - The data to stringify. Can be a string, array, object, number, boolean, function, null, or undefined.\n * @returns A string representation of the data, `null` for null, or undefined if data is undefined.\n * @example\n * stringify('hello') // returns \"'hello'\"\n * stringify(42) // returns \"42\"\n * stringify([1, 2, 3]) // returns \"[1, 2, 3]\"\n * stringify({ a: 1, b: 'test' }) // returns \"{ a: 1, b: 'test', }\"\n */\nexport function stringify(data?: unknown): string | undefined {\n if (data === undefined) {\n return;\n }\n\n if (data === null) {\n return 'null';\n }\n\n if (isString(data)) {\n return `'${data.replaceAll(\"'\", String.raw`\\'`)}'`;\n }\n\n if (isNumber(data) || isBoolean(data) || isFunction(data)) {\n return String(data);\n }\n\n if (Array.isArray(data)) {\n return `[${data.map((item: unknown) => stringify(item as string | unknown[] | Record<string, unknown>)).join(', ')}]`;\n }\n\n const entries = Object.entries(data);\n let result = '';\n for (const [index, [key, value]] of entries.entries()) {\n const strValue = stringify(\n value as string | unknown[] | Record<string, unknown>,\n );\n if (entries.length === 1) {\n result = `{ ${key}: ${strValue}, }`;\n } else if (!index) {\n result = `{ ${key}: ${strValue}, `;\n } else if (entries.length - 1 === index) {\n result += `${key}: ${strValue}, }`;\n } else {\n result += `${key}: ${strValue}, `;\n }\n }\n return result;\n}\n\n/**\n * Sanitizes a string value by removing or replacing special characters and ensuring\n * it conforms to JavaScript identifier naming rules if needed.\n *\n * @param value - The string value to sanitize.\n * @param options - Configuration options for sanitization:\n * - `whitespace` - Replacement string for whitespace characters, or `true` to keep them.\n * - `underscore` - Replacement string for underscores, or `true` to keep them.\n * - `dot` - Replacement string for dots, or `true` to keep them.\n * - `dash` - Replacement string for dashes, or `true` to keep them.\n * - `es5keyword` - If true, prefixes the value with underscore if it's an ES5 keyword.\n * - `es5IdentifierName` - If true, ensures the value is a valid ES5 identifier name.\n * - `special` - If true, preserves special characters that would otherwise be removed.\n * @returns The sanitized string value.\n * @example\n * sanitize('hello-world', { dash: '_' }) // returns \"hello_world\"\n * sanitize('class', { es5keyword: true }) // returns \"_class\"\n * sanitize('123abc', { es5IdentifierName: true }) // returns \"N123abc\"\n */\nexport function sanitize(\n value: string,\n options?: {\n whitespace?: string | true;\n underscore?: string | true;\n dot?: string | true;\n dash?: string | true;\n es5keyword?: boolean;\n es5IdentifierName?: boolean;\n special?: boolean;\n },\n) {\n const {\n whitespace = '',\n underscore = '',\n dot = '',\n dash = '',\n es5keyword = false,\n es5IdentifierName = false,\n special = false,\n } = options ?? {};\n let newValue = value;\n\n if (!special) {\n newValue = newValue.replaceAll(/[!\"`'#%&,:;<>=@{}~$()*+/\\\\?[\\]^|]/g, '');\n }\n\n if (whitespace !== true) {\n newValue = newValue.replaceAll(/[\\s]/g, whitespace);\n }\n\n if (underscore !== true) {\n newValue = newValue.replaceAll(/['_']/g, underscore);\n }\n\n if (dot !== true) {\n newValue = newValue.replaceAll(/[.]/g, dot);\n }\n\n if (dash !== true) {\n newValue = newValue.replaceAll(/[-]/g, dash);\n }\n\n if (es5keyword) {\n newValue = keyword.isKeywordES5(newValue, true) ? `_${newValue}` : newValue;\n }\n\n if (es5IdentifierName) {\n if (/^[0-9]/.test(newValue)) {\n newValue = `N${newValue}`;\n } else {\n newValue = keyword.isIdentifierNameES5(newValue)\n ? newValue\n : `_${newValue}`;\n }\n }\n\n return newValue;\n}\n\n/**\n * Converts an array of objects to a comma-separated string representation.\n * Optionally extracts a nested property from each object using a dot-notation path.\n *\n * @param props - Array of objects to convert to string.\n * @param path - Optional dot-notation path to extract a property from each object (e.g., \"user.name\").\n * @returns A comma-separated string of values, with each value on a new line indented.\n * @example\n * toObjectString([{ name: 'John' }, { name: 'Jane' }], 'name')\n * // returns \"John,\\n Jane,\"\n * toObjectString(['a', 'b', 'c'])\n * // returns \"a,\\n b,\\n c,\"\n */\nexport function toObjectString<T>(props: T[], path?: keyof T) {\n if (props.length === 0) {\n return '';\n }\n\n const arrayOfString = isString(path)\n ? props.map((prop) => {\n let obj: unknown = prop;\n for (const key of path.split('.')) {\n obj =\n obj && (isObject(obj) || Array.isArray(obj))\n ? (obj as Record<string, unknown>)[key]\n : undefined;\n }\n return obj as string;\n })\n : props;\n\n return arrayOfString.join(',\\n ') + ',';\n}\n\nconst NUMBERS = {\n '0': 'zero',\n '1': 'one',\n '2': 'two',\n '3': 'three',\n '4': 'four',\n '5': 'five',\n '6': 'six',\n '7': 'seven',\n '8': 'eight',\n '9': 'nine',\n};\n\n/**\n * Converts a number to its word representation by translating each digit to its word form.\n *\n * @param num - The number to convert to words.\n * @returns A string containing the word representation of each digit concatenated together.\n * @example\n * getNumberWord(123) // returns \"onetwothree\"\n * getNumberWord(42) // returns \"fourtwo\"\n */\nexport function getNumberWord(num: number) {\n // eslint-disable-next-line @typescript-eslint/no-misused-spread -- digits 0-9 only, no unicode concerns\n const arrayOfNumber = [...num.toString()] as (keyof typeof NUMBERS)[];\n return arrayOfNumber.reduce((acc, n) => acc + NUMBERS[n], '');\n}\n\n/**\n * Escapes a specific character in a string by prefixing all of its occurrences with a backslash.\n *\n * @param str - The string to escape, or null.\n * @param char - The character to escape. Defaults to single quote (').\n * @returns The escaped string, or null if the input is null.\n * @example\n * escape(\"don't\") // returns \"don\\'t\"\n * escape(\"it's John's\") // returns \"it\\'s John\\'s\"\n * escape('say \"hello\"', '\"') // returns 'say \\\\\"hello\\\\\"'\n * escape(\"a'''b\", \"'\") // returns \"a\\'\\'\\'b\"\n */\nexport function escape(str: string | null, char = \"'\") {\n return str?.replaceAll(char, `\\\\${char}`);\n}\n\n/**\n * Escapes regular expression metacharacters in a string so it can be safely\n * embedded inside a RegExp pattern.\n *\n * @param value - The raw string value to escape for regex usage.\n * @returns The escaped string.\n * @example\n * escapeRegExp('foo$bar') // returns 'foo\\\\$bar'\n */\nexport function escapeRegExp(value: string) {\n return value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, String.raw`\\$&`);\n}\n\n/**\n * Escape all characters not included in SingleStringCharacters and\n * DoubleStringCharacters on\n * http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4\n *\n * Based on https://github.com/joliss/js-string-escape/blob/master/index.js\n *\n * @param input String to escape\n */\nexport function jsStringEscape(input: string) {\n return input.replaceAll(/[\"'\\\\\\n\\r\\u2028\\u2029/*]/g, (character) => {\n switch (character) {\n case '\"':\n case \"'\":\n case '\\\\':\n case '/':\n case '*': {\n return '\\\\' + character;\n }\n // Four possible LineTerminator characters need to be escaped:\n case '\\n': {\n return String.raw`\\n`;\n }\n case '\\r': {\n return String.raw`\\r`;\n }\n case '\\u2028': {\n return String.raw`\\u2028`;\n }\n case '\\u2029': {\n return String.raw`\\u2029`;\n }\n default: {\n return '';\n }\n }\n });\n}\n\n/**\n * Deduplicates a TypeScript union type string.\n * Handles types like \"A | B | B\" → \"A | B\" and \"null | null\" → \"null\".\n * Only splits on top-level | (not inside {} () [] <> or string literals).\n */\nexport function dedupeUnionType(unionType: string): string {\n const parts: string[] = [];\n let current = '';\n let depth = 0;\n let quote = ''; // current open quote char, or '' if outside string\n let escaped = false; // true if previous char was unescaped \\ inside string\n\n for (const c of unionType) {\n if (!escaped && (c === \"'\" || c === '\"')) {\n if (!quote) quote = c;\n else if (quote === c) quote = '';\n }\n\n if (!quote) {\n if ('{([<'.includes(c)) depth++;\n if ('})]>'.includes(c)) depth--;\n if (c === '|' && depth === 0) {\n parts.push(current.trim());\n current = '';\n continue;\n }\n }\n current += c;\n escaped = !!quote && !escaped && c === '\\\\';\n }\n if (current.trim()) parts.push(current.trim());\n\n return [...new Set(parts)].join(' | ');\n}\n","import type { Tsconfig } from '../types';\n\nexport function isSyntheticDefaultImportsAllow(config?: Tsconfig) {\n if (!config) {\n return true;\n }\n\n return !!(\n config.compilerOptions?.allowSyntheticDefaultImports ??\n config.compilerOptions?.esModuleInterop\n );\n}\n\nconst NODE_NEXT_MODULES = new Set(['nodenext', 'node16']);\n\nconst NODE_NEXT_EXTENSION_MAP: readonly (readonly [string, string])[] = [\n ['.tsx', '.jsx'],\n ['.mts', '.mjs'],\n ['.cts', '.cjs'],\n ['.ts', '.js'],\n];\n\nexport function getImportExtension(\n fileExtension: string,\n tsconfig?: Tsconfig,\n): string {\n const compilerOptions = tsconfig?.compilerOptions;\n\n if (compilerOptions?.allowImportingTsExtensions) {\n return fileExtension;\n }\n\n const module = compilerOptions?.module?.toLowerCase();\n const moduleResolution = compilerOptions?.moduleResolution?.toLowerCase();\n if (\n (module && NODE_NEXT_MODULES.has(module)) ||\n (moduleResolution && NODE_NEXT_MODULES.has(moduleResolution))\n ) {\n for (const [from, to] of NODE_NEXT_EXTENSION_MAP) {\n if (fileExtension.endsWith(from)) {\n return `${fileExtension.slice(0, -from.length)}${to}`;\n }\n }\n return fileExtension;\n }\n\n return fileExtension.replace(/\\.ts$/, '') || '';\n}\n","import { keyword } from 'esutils';\n\nimport {\n EnumGeneration,\n NamingConvention,\n type OpenApiSchemaObject,\n} from '../types';\nimport {\n conventionName,\n escape,\n isNumeric,\n isString,\n jsStringEscape,\n sanitize,\n} from '../utils';\n\n/** Bridge type for enum values from AnyOtherAttribute-infected schema extensions */\ntype SchemaEnumValue = string | number | boolean | null;\n\n/**\n * Map of special characters to semantic word replacements.\n *\n * Applied before naming convention transforms (PascalCase, camelCase, …) so\n * that characters which would otherwise be stripped still contribute a unique\n * segment to the generated key. Without this, values like \"created_at\" and\n * \"-created_at\" both PascalCase to \"CreatedAt\", silently overwriting one\n * another in the generated const/enum object.\n *\n * Only characters that appear as leading/trailing modifiers in real-world\n * OpenAPI enums are mapped — the list is intentionally conservative to avoid\n * changing output for schemas that don't hit collisions.\n */\nconst ENUM_SPECIAL_CHARACTER_MAP: Record<string, string> = {\n '-': 'minus',\n '+': 'plus',\n};\n\n/**\n * Replace special characters with semantic words (plus an underscore separator)\n * so that naming convention transforms (PascalCase, etc.) produce unique keys.\n *\n * The trailing underscore acts as a word boundary so that PascalCase treats the\n * replacement as a separate word: \"-created_at\" → \"minus_created_at\" → \"MinusCreatedAt\".\n */\nfunction replaceSpecialCharacters(key: string): string {\n let result = '';\n for (const char of key) {\n const replacement = ENUM_SPECIAL_CHARACTER_MAP[char];\n result += replacement ? replacement + '_' : char;\n }\n return result;\n}\n\nexport function getEnumNames(schemaObject: OpenApiSchemaObject | undefined) {\n const names = (schemaObject?.['x-enumNames'] ??\n schemaObject?.['x-enumnames'] ??\n schemaObject?.['x-enum-varnames']) as\n | string[]\n | Record<string, string>\n | undefined;\n\n if (!names) return;\n\n if (Array.isArray(names)) {\n return names.map((name: string) => jsStringEscape(name));\n }\n\n // Object/Map format: keys correspond to enum values, values are the names.\n // Convert to an array ordered by the schema's enum values.\n if (typeof names === 'object') {\n const enumValues = (schemaObject?.enum ?? []) as SchemaEnumValue[];\n return enumValues.map((enumVal) => {\n const key = String(enumVal);\n return key in names ? jsStringEscape(names[key]) : undefined;\n });\n }\n\n return;\n}\n\nexport function getEnumDescriptions(\n schemaObject: OpenApiSchemaObject | undefined,\n) {\n const descriptions = (schemaObject?.['x-enumDescriptions'] ??\n schemaObject?.['x-enumdescriptions'] ??\n schemaObject?.['x-enum-descriptions']) as\n | string[]\n | Record<string, string>\n | undefined;\n\n if (!descriptions) return;\n\n if (Array.isArray(descriptions)) {\n return descriptions.map((description: string) =>\n jsStringEscape(description),\n );\n }\n\n // Object/Map format: keys correspond to enum values, values are the descriptions.\n // Convert to an array ordered by the schema's enum values.\n if (typeof descriptions === 'object') {\n const enumValues = (schemaObject?.enum ?? []) as SchemaEnumValue[];\n return enumValues.map((enumVal) => {\n const key = String(enumVal);\n return key in descriptions\n ? jsStringEscape(descriptions[key])\n : undefined;\n });\n }\n\n return;\n}\n\nexport function getEnum(\n value: string,\n enumName: string,\n names: (string | undefined)[] | undefined,\n enumGenerationType: EnumGeneration,\n descriptions?: (string | undefined)[],\n enumNamingConvention?: NamingConvention,\n) {\n if (enumGenerationType === EnumGeneration.CONST)\n return getTypeConstEnum(\n value,\n enumName,\n names,\n descriptions,\n enumNamingConvention,\n );\n if (enumGenerationType === EnumGeneration.ENUM)\n return getNativeEnum(value, enumName, names, enumNamingConvention);\n return getUnion(value, enumName);\n}\n\nconst getTypeConstEnum = (\n value: string,\n enumName: string,\n names?: (string | undefined)[],\n descriptions?: (string | undefined)[],\n enumNamingConvention?: NamingConvention,\n) => {\n let enumValue = `export type ${enumName} = typeof ${enumName}[keyof typeof ${enumName}]`;\n\n if (value.endsWith(' | null')) {\n value = value.replace(' | null', '');\n enumValue += ' | null';\n }\n\n enumValue += ';\\n';\n\n const implementation = getEnumImplementation(\n value,\n names,\n descriptions,\n enumNamingConvention,\n );\n\n enumValue += '\\n\\n';\n\n enumValue += `export const ${enumName} = {\\n${implementation}} as const;\\n`;\n\n return enumValue;\n};\n\n/**\n * Derive the object/enum key for a single enum value.\n *\n * Handles numeric prefixes, sanitization, and optional naming convention\n * transforms. When `disambiguate` is true, special characters (-/+) are\n * replaced with semantic words before the convention transform to prevent\n * key collisions.\n */\nfunction deriveEnumKey(\n val: string,\n enumNamingConvention?: NamingConvention,\n disambiguate = false,\n): string {\n let key = val.startsWith(\"'\") ? val.slice(1, -1) : val;\n\n if (isNumeric(key)) {\n key = toNumberKey(key);\n }\n\n if (key.length > 1) {\n key = sanitize(key, {\n whitespace: '_',\n underscore: true,\n dash: true,\n special: true,\n });\n }\n\n if (enumNamingConvention) {\n if (disambiguate) {\n key = replaceSpecialCharacters(key);\n }\n key = conventionName(key, enumNamingConvention);\n }\n\n return key;\n}\n\nexport function getEnumImplementation(\n value: string,\n names?: (string | undefined)[],\n descriptions?: (string | undefined)[],\n enumNamingConvention?: NamingConvention,\n) {\n // empty enum or null-only enum\n if (value === '') return '';\n\n const uniqueValues = [...new Set(value.split(' | '))];\n\n // Check whether the naming convention produces duplicate keys.\n // Only apply special-character disambiguation when it does,\n // so that existing output is preserved for non-colliding enums.\n const disambiguate =\n !!enumNamingConvention &&\n new Set(uniqueValues.map((v) => deriveEnumKey(v, enumNamingConvention)))\n .size < uniqueValues.length;\n\n let result = '';\n for (const [index, val] of uniqueValues.entries()) {\n const name = names?.[index];\n const description = descriptions?.[index];\n const comment = description ? ` /** ${description} */\\n` : '';\n\n if (name) {\n result +=\n comment +\n ` ${keyword.isIdentifierNameES5(name) ? name : `'${name}'`}: ${val},\\n`;\n continue;\n }\n\n const key = deriveEnumKey(val, enumNamingConvention, disambiguate);\n\n result +=\n comment +\n ` ${keyword.isIdentifierNameES5(key) ? key : `'${key}'`}: ${val},\\n`;\n }\n return result;\n}\n\nconst getNativeEnum = (\n value: string,\n enumName: string,\n names?: (string | undefined)[],\n enumNamingConvention?: NamingConvention,\n) => {\n const enumItems = getNativeEnumItems(value, names, enumNamingConvention);\n const enumValue = `export enum ${enumName} {\\n${enumItems}\\n}`;\n\n return enumValue;\n};\n\nconst getNativeEnumItems = (\n value: string,\n names?: (string | undefined)[],\n enumNamingConvention?: NamingConvention,\n) => {\n if (value === '') return '';\n\n const uniqueValues = [...new Set(value.split(' | '))];\n\n const disambiguate =\n !!enumNamingConvention &&\n new Set(uniqueValues.map((v) => deriveEnumKey(v, enumNamingConvention)))\n .size < uniqueValues.length;\n\n let result = '';\n for (const [index, val] of uniqueValues.entries()) {\n const name = names?.[index];\n if (name) {\n result += ` ${keyword.isIdentifierNameES5(name) ? name : `'${name}'`}= ${val},\\n`;\n continue;\n }\n\n const key = deriveEnumKey(val, enumNamingConvention, disambiguate);\n\n result += ` ${keyword.isIdentifierNameES5(key) ? key : `'${key}'`}= ${val},\\n`;\n }\n return result;\n};\n\nconst toNumberKey = (value: string) => {\n if (value.startsWith('-')) {\n return `NUMBER_MINUS_${value.slice(1)}`;\n }\n if (value.startsWith('+')) {\n return `NUMBER_PLUS_${value.slice(1)}`;\n }\n return `NUMBER_${value}`;\n};\n\nconst getUnion = (value: string, enumName: string) => {\n return `export type ${enumName} = ${value};`;\n};\n\ninterface CombinedEnumInput {\n value: string;\n isRef: boolean;\n schema: OpenApiSchemaObject | undefined;\n}\n\ninterface CombinedEnumValue {\n value: string;\n valueImports: string[];\n hasNull: boolean;\n}\n\nexport function getEnumUnionFromSchema(\n schema: OpenApiSchemaObject | undefined,\n) {\n if (!schema?.enum) return '';\n const schemaEnum = schema.enum as SchemaEnumValue[];\n return schemaEnum\n .filter((val): val is Exclude<SchemaEnumValue, null> => val !== null)\n .map((val) => (isString(val) ? `'${escape(val)}'` : String(val)))\n .join(' | ');\n}\n\nconst stripNullUnion = (value: string) =>\n value.replaceAll(/\\s*\\|\\s*null/g, '').trim();\n\nconst isSpreadableEnumRef = (\n schema: OpenApiSchemaObject | undefined,\n refName: string,\n) => {\n if (!schema?.enum || !refName) return false;\n if (!getEnumUnionFromSchema(schema)) return false;\n const type = schema.type as string | string[] | undefined;\n if (type === 'boolean' || (Array.isArray(type) && type.includes('boolean'))) {\n return false;\n }\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(refName);\n};\n\nconst buildInlineEnum = (\n schema: OpenApiSchemaObject | undefined,\n enumValue?: string,\n) => {\n const names = getEnumNames(schema);\n const descriptions = getEnumDescriptions(schema);\n const unionValue = enumValue ?? getEnumUnionFromSchema(schema);\n return getEnumImplementation(unionValue, names, descriptions);\n};\n\nexport function getCombinedEnumValue(\n inputs: CombinedEnumInput[],\n): CombinedEnumValue {\n const valueImports: string[] = [];\n const hasNull = inputs.some((input) => {\n if (input.value.includes('| null')) return true;\n const schema = input.schema;\n if (!schema) return false;\n if (schema.nullable === true) return true;\n if (Array.isArray(schema.type) && schema.type.includes('null')) return true;\n const schemaEnum = schema.enum as SchemaEnumValue[] | undefined;\n // eslint-disable-next-line unicorn/no-null -- OpenAPI enum values include literal null\n return schemaEnum?.includes(null) ?? false;\n });\n\n const addValueImport = (name: string) => {\n if (!valueImports.includes(name)) {\n valueImports.push(name);\n }\n };\n\n if (inputs.length === 1) {\n const input = inputs[0];\n if (input.isRef) {\n const refName = stripNullUnion(input.value);\n if (isSpreadableEnumRef(input.schema, refName)) {\n addValueImport(refName);\n return { value: refName, valueImports, hasNull };\n }\n return {\n value: `{${buildInlineEnum(input.schema)}} as const`,\n valueImports,\n hasNull,\n };\n }\n\n return {\n value: `{${buildInlineEnum(input.schema, stripNullUnion(input.value))}} as const`,\n valueImports,\n hasNull,\n };\n }\n\n const enums = inputs\n .map((input) => {\n if (input.isRef) {\n const refName = stripNullUnion(input.value);\n if (isSpreadableEnumRef(input.schema, refName)) {\n addValueImport(refName);\n return `...${refName},`;\n }\n return buildInlineEnum(input.schema);\n }\n\n return buildInlineEnum(input.schema, stripNullUnion(input.value));\n })\n .join('');\n\n return { value: `{${enums}} as const`, valueImports, hasNull };\n}\n","import type { ContextSpec, NormalizedOverrideOutput } from '../types';\nimport { pascal, sanitize, upath } from '../utils';\n\n/**\n * `$ref`s targeting these sections under `#/components/...` are emitted as\n * named TypeScript imports (e.g. `import type { Pet } from './model'`).\n * Refs to any other location — for example `#/paths/.../schema` produced by\n * JSON-Schema-Ref-Parser `bundle()` — have no corresponding `export type`\n * and must be inlined by the resolver. See issue #398.\n */\nexport const NAMED_COMPONENT_SECTIONS = [\n 'schemas',\n 'responses',\n 'parameters',\n 'requestBodies',\n] as const;\n\ntype RefComponent = (typeof NAMED_COMPONENT_SECTIONS)[number];\n\nexport const RefComponentSuffix: Record<RefComponent, string> = {\n schemas: '',\n responses: 'Response',\n parameters: 'Parameter',\n requestBodies: 'Body',\n};\n\nconst COMPONENT_REF_PATTERN = new RegExp(\n String.raw`^#\\/components\\/(${NAMED_COMPONENT_SECTIONS.join('|')})\\/[^/]+$`,\n);\n\n/**\n * True iff `ref` targets a named slot eligible for emission as a TypeScript\n * import. Used by `resolveValue` to decide between named import vs inlining\n * the resolved schema.\n */\nexport function isComponentRef(ref: string): boolean {\n return COMPONENT_REF_PATTERN.test(ref);\n}\n\nconst TILDE_1 = /~1/g;\nconst TILDE_0 = /~0/g;\n\nexport interface RefInfo {\n name: string;\n originalName: string;\n refPaths?: string[];\n}\n/**\n * Return the output type from the $ref\n *\n * @param $ref\n */\nexport function getRefInfo($ref: string, context: ContextSpec): RefInfo {\n const [pathname, ref] = $ref.split('#');\n\n const refPaths = ref\n .slice(1)\n .split('/')\n .map((part) =>\n decodeURIComponent(part)\n .replaceAll(TILDE_1, '/')\n .replaceAll(TILDE_0, '~'),\n );\n\n const getOverrideSuffix = (\n override: NormalizedOverrideOutput,\n paths: string[],\n ) => {\n const firstLevel = override[paths[0] as keyof NormalizedOverrideOutput];\n if (!firstLevel) return '';\n\n const secondLevel = (\n firstLevel as Record<string, { suffix?: string } | undefined>\n )[paths[1]];\n return secondLevel?.suffix ?? '';\n };\n\n const suffix = getOverrideSuffix(context.output.override, refPaths);\n\n const originalName = ref\n ? (refPaths.at(-1) ?? '')\n : upath.getSchemaFileName(pathname);\n\n if (!pathname) {\n return {\n name: sanitize(pascal(originalName) + suffix, {\n es5keyword: true,\n es5IdentifierName: true,\n underscore: true,\n dash: true,\n }),\n originalName,\n refPaths,\n };\n }\n\n return {\n name: sanitize(pascal(originalName) + suffix, {\n es5keyword: true,\n es5IdentifierName: true,\n underscore: true,\n dash: true,\n }),\n originalName,\n refPaths,\n };\n}\n\n/**\n * Extracts the anchor name from a fragment-only `$dynamicRef` (e.g. `#category` → `category`).\n *\n * Returns `undefined` for external-document `$dynamicRef` values (e.g. `other.json#anchor`)\n * which are not supported.\n */\nexport function getDynamicAnchorName(dynamicRef: string): string | undefined {\n if (!dynamicRef.startsWith('#') || dynamicRef.length <= 1) {\n return undefined;\n }\n return dynamicRef.slice(1);\n}\n","import type { ContextSpec, GeneratorImport, ResolverValue } from '../types';\n\ninterface GetAliasedImportsOptions {\n name?: string;\n resolvedValue: ResolverValue;\n context: ContextSpec;\n}\n\nexport function getAliasedImports({\n name,\n resolvedValue,\n context,\n}: GetAliasedImportsOptions): GeneratorImport[] {\n return context.output.schemas && resolvedValue.isRef\n ? resolvedValue.imports.map((imp) => {\n if (\n !needCreateImportAlias({\n name,\n imp,\n })\n ) {\n return imp;\n }\n\n return {\n ...imp,\n alias: `__${imp.name}`,\n };\n })\n : resolvedValue.imports;\n}\n\ninterface NeedCreateImportAliasOptions {\n name?: string;\n imp: GeneratorImport;\n}\n\nexport function needCreateImportAlias({\n imp,\n name,\n}: NeedCreateImportAliasOptions): boolean {\n return !imp.alias && imp.name === name;\n}\n\ninterface GetImportAliasForRefOrValueOptions {\n resolvedValue: ResolverValue;\n imports: GeneratorImport[];\n context: ContextSpec;\n}\n\nexport function getImportAliasForRefOrValue({\n context,\n imports,\n resolvedValue,\n}: GetImportAliasForRefOrValueOptions): string {\n if (!context.output.schemas || !resolvedValue.isRef) {\n return resolvedValue.value;\n }\n const importWithSameName = imports.find(\n (imp) => imp.name === resolvedValue.value,\n );\n return importWithSameName?.alias ?? resolvedValue.value;\n}\n","import { isNullish, unique } from 'remeda';\n\nimport { resolveExampleRefs, resolveObject } from '../resolvers';\nimport {\n type ContextSpec,\n EnumGeneration,\n type GeneratorImport,\n type GeneratorSchema,\n type OpenApiReferenceObject,\n type OpenApiSchemaObject,\n type ScalarValue,\n SchemaType,\n} from '../types';\nimport { dedupeUnionType, getNumberWord, isSchema, pascal } from '../utils';\nimport { getCombinedEnumValue } from './enum';\nimport { getAliasedImports, getImportAliasForRefOrValue } from './imports';\nimport type { FormDataContext } from './object';\nimport { getScalar } from './scalar';\n\ninterface CombinedData {\n imports: GeneratorImport[];\n schemas: GeneratorSchema[];\n originalSchema: (OpenApiSchemaObject | undefined)[];\n values: string[];\n isRef: boolean[];\n isEnum: boolean[];\n types: string[];\n hasReadonlyProps: boolean;\n dependencies: string[];\n /**\n * List of all properties in all subschemas\n * - used to add missing properties in subschemas to avoid TS error described in @see https://github.com/orval-labs/orval/issues/935\n */\n allProperties: string[];\n requiredProperties: string[];\n example?: unknown;\n examples?: Record<string, unknown> | unknown[];\n}\n\ntype Separator = 'allOf' | 'anyOf' | 'oneOf';\nconst mergeableAllOfKeys = new Set(['type', 'properties', 'required']);\n\nfunction isMergeableAllOfObject(schema: OpenApiSchemaObject): boolean {\n // Must have properties to be worth merging\n if (isNullish(schema.properties)) {\n return false;\n }\n\n // Cannot merge if it contains nested composition\n if (schema.allOf || schema.anyOf || schema.oneOf) {\n return false;\n }\n\n // Only object types can be merged\n if (!isNullish(schema.type) && schema.type !== 'object') {\n return false;\n }\n\n // Only merge schemas with safe keys (type, properties, required)\n return Object.keys(schema).every((key) => mergeableAllOfKeys.has(key));\n}\n\nfunction normalizeAllOfSchema(\n schema: OpenApiSchemaObject,\n): OpenApiSchemaObject {\n // Bridge assertions: AnyOtherAttribute infects all schema property access\n const schemaAllOf = schema.allOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n if (!schemaAllOf) {\n return schema;\n }\n\n let didMerge = false;\n const schemaProperties = schema.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\n const schemaRequired = schema.required as string[] | undefined;\n const mergedProperties: Record<\n string,\n OpenApiSchemaObject | OpenApiReferenceObject\n > = schemaProperties ? { ...schemaProperties } : {};\n const mergedRequired = new Set(schemaRequired);\n const remainingAllOf: (OpenApiSchemaObject | OpenApiReferenceObject)[] = [];\n\n for (const subSchema of schemaAllOf) {\n if (isSchema(subSchema) && isMergeableAllOfObject(subSchema)) {\n didMerge = true;\n if (subSchema.properties) {\n Object.assign(mergedProperties, subSchema.properties);\n }\n const subRequired = subSchema.required as string[] | undefined;\n if (subRequired) {\n for (const prop of subRequired) {\n mergedRequired.add(prop);\n }\n }\n continue;\n }\n\n remainingAllOf.push(subSchema);\n }\n\n if (!didMerge || remainingAllOf.length === 0) {\n return schema;\n }\n\n return {\n ...(schema as Record<string, unknown>),\n ...(Object.keys(mergedProperties).length > 0 && {\n properties: mergedProperties,\n }),\n ...(mergedRequired.size > 0 && { required: [...mergedRequired] }),\n ...(remainingAllOf.length > 0 && { allOf: remainingAllOf }),\n } as OpenApiSchemaObject;\n}\n\ninterface CombineValuesOptions {\n resolvedData: CombinedData;\n resolvedValue?: ScalarValue;\n separator: Separator;\n context: ContextSpec;\n parentSchema?: OpenApiSchemaObject;\n}\n\nfunction combineValues({\n resolvedData,\n resolvedValue,\n separator,\n context,\n parentSchema,\n}: CombineValuesOptions) {\n const isAllEnums = resolvedData.isEnum.every(Boolean);\n\n if (isAllEnums) {\n return `${resolvedData.values.join(` | `)}${\n resolvedValue ? ` | ${resolvedValue.value}` : ''\n }`;\n }\n\n if (separator === 'allOf') {\n // Wrap values containing unions in parens to preserve precedence\n // e.g. allOf: [A, oneOf: [B, C]] should be A & (B | C), not A & B | C\n let resolvedDataValue = resolvedData.values\n .map((v) => (v.includes(' | ') ? `(${v})` : v))\n .join(` & `);\n if (resolvedData.originalSchema.length > 0 && resolvedValue) {\n // Bridge: discriminator is typed but AnyOtherAttribute infects access\n interface Discriminator {\n propertyName?: string;\n mapping?: Record<string, string>;\n }\n const discriminatedPropertySchemas = resolvedData.originalSchema.filter(\n (s) => {\n const disc = s?.discriminator as Discriminator | undefined;\n return disc && resolvedValue.value.includes(` ${disc.propertyName}:`);\n },\n ) as OpenApiSchemaObject[];\n if (discriminatedPropertySchemas.length > 0) {\n resolvedDataValue = `Omit<${resolvedDataValue}, '${discriminatedPropertySchemas.map((s) => (s.discriminator as Discriminator | undefined)?.propertyName).join(\"' | '\")}'>`;\n }\n }\n // Also wrap resolvedValue if it contains union (sibling pattern: allOf + oneOf at same level)\n const resolvedValueStr = resolvedValue?.value.includes(' | ')\n ? `(${resolvedValue.value})`\n : resolvedValue?.value;\n const joined = `${resolvedDataValue}${\n resolvedValue ? ` & ${resolvedValueStr}` : ''\n }`;\n\n // Parent object may have set required properties that only exist in child\n // objects. Make sure the resulting object has these properties as required,\n // but there is no need to override properties that are already required\n const overrideRequiredProperties = resolvedData.requiredProperties.filter(\n (prop) =>\n !resolvedData.originalSchema.some((schema) => {\n const props = schema?.properties as\n | Record<string, unknown>\n | undefined;\n const req = schema?.required as string[] | undefined;\n return props?.[prop] && req?.includes(prop);\n }) &&\n !((): boolean => {\n const parentProps = parentSchema?.properties as\n | Record<string, unknown>\n | undefined;\n const parentReq = parentSchema?.required as string[] | undefined;\n return !!(parentProps?.[prop] && parentReq?.includes(prop));\n })(),\n );\n if (overrideRequiredProperties.length > 0) {\n return `${joined} & Required<Pick<${joined}, '${overrideRequiredProperties.join(\"' | '\")}'>>`;\n }\n return joined;\n }\n\n let values = resolvedData.values;\n const hasObjectSubschemas = resolvedData.allProperties.length;\n if (hasObjectSubschemas && context.output.unionAddMissingProperties) {\n values = []; // the list of values will be rebuilt to add missing properties (if exist) in subschemas\n for (let i = 0; i < resolvedData.values.length; i += 1) {\n const subSchema = resolvedData.originalSchema[i];\n if (subSchema?.type !== 'object' || !subSchema.properties) {\n values.push(resolvedData.values[i]);\n continue;\n }\n\n const subSchemaProps = subSchema.properties as Record<string, unknown>;\n const missingProperties = unique(\n resolvedData.allProperties.filter(\n (p) => !Object.keys(subSchemaProps).includes(p),\n ),\n );\n values.push(\n `${resolvedData.values[i]}${\n missingProperties.length > 0\n ? ` & {${missingProperties.map((p) => `${p}?: never`).join('; ')}}`\n : ''\n }`,\n );\n }\n }\n\n if (resolvedValue) {\n return `(${values.join(` & ${resolvedValue.value}) | (`)} & ${\n resolvedValue.value\n })`;\n }\n\n return values.join(' | ');\n}\n\nexport function combineSchemas({\n name,\n schema,\n separator,\n context,\n nullable,\n formDataContext,\n}: {\n name?: string;\n schema: OpenApiSchemaObject;\n separator: Separator;\n context: ContextSpec;\n nullable: string;\n formDataContext?: FormDataContext;\n}): ScalarValue {\n // Normalize allOf schemas by merging inline objects into parent (fixes #2458)\n // Only applies when: using allOf, not in v7 compat mode, no sibling oneOf/anyOf\n const canMergeInlineAllOf =\n separator === 'allOf' &&\n !context.output.override.aliasCombinedTypes &&\n !schema.oneOf &&\n !schema.anyOf;\n\n const normalizedSchema = canMergeInlineAllOf\n ? normalizeAllOfSchema(schema)\n : schema;\n\n // Bridge assertions: AnyOtherAttribute infects all schema property access\n const items = (normalizedSchema[separator] ?? []) as (\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n )[];\n\n const resolvedData: CombinedData = {\n values: [],\n imports: [],\n schemas: [],\n isEnum: [], // check if only enums\n isRef: [],\n types: [],\n dependencies: [],\n originalSchema: [],\n allProperties: [],\n hasReadonlyProps: false,\n example: schema.example as unknown,\n examples: resolveExampleRefs(\n schema.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n requiredProperties:\n separator === 'allOf'\n ? ((schema.required as string[] | undefined) ?? [])\n : [],\n };\n for (const subSchema of items) {\n // aliasCombinedTypes (v7 compat): create intermediate types like ResponseAnyOf\n // v8 default: propName stays undefined so combined types are inlined directly\n let propName: string | undefined;\n if (context.output.override.aliasCombinedTypes) {\n propName = name ? name + pascal(separator) : undefined;\n if (propName && resolvedData.schemas.length > 0) {\n propName =\n propName + pascal(getNumberWord(resolvedData.schemas.length + 1));\n }\n }\n\n if (separator === 'allOf' && isSchema(subSchema) && subSchema.required) {\n resolvedData.requiredProperties.push(...(subSchema.required as string[]));\n }\n\n const resolvedValue = resolveObject({\n schema: subSchema,\n propName,\n combined: true,\n context,\n formDataContext,\n });\n\n const aliasedImports = getAliasedImports({\n context,\n name,\n resolvedValue,\n });\n\n const value = getImportAliasForRefOrValue({\n context,\n resolvedValue,\n imports: aliasedImports,\n });\n\n resolvedData.values.push(value);\n resolvedData.imports.push(...aliasedImports);\n resolvedData.schemas.push(...resolvedValue.schemas);\n resolvedData.dependencies.push(...resolvedValue.dependencies);\n resolvedData.isEnum.push(resolvedValue.isEnum);\n resolvedData.types.push(resolvedValue.type);\n resolvedData.isRef.push(resolvedValue.isRef);\n resolvedData.originalSchema.push(resolvedValue.originalSchema);\n if (resolvedValue.hasReadonlyProps) {\n resolvedData.hasReadonlyProps = true;\n }\n\n // Bridge: originalSchema.properties is infected by AnyOtherAttribute\n const originalProps = resolvedValue.originalSchema.properties as\n | Record<string, unknown>\n | undefined;\n if (resolvedValue.type === 'object' && originalProps) {\n resolvedData.allProperties.push(...Object.keys(originalProps));\n }\n }\n\n const isAllEnums = resolvedData.isEnum.every(Boolean);\n // OAS 3.1 spells a nullable enum as `anyOf: [{enum: [...]}, {type: 'null'}]`.\n // Without this, the {type: 'null'} variant flips `isEnum` to false and the\n // enum gets inlined instead of extracted as a named type — the\n // {type: ['string','null'], enum: [...]} spelling already extracts. Treat\n // null-only variants as transparent so the caller's `isEnum && !isRef`\n // branch (query-params, schema-definition, resolvers/object) extracts via\n // getEnum, whose `stripNullUnion` handling already preserves the trailing\n // ` | null`. See issue #2710.\n //\n // Guards:\n // - `allOf` semantics are intersection, not union — `allOf: [{enum}, {null}]`\n // does not describe a nullable enum, so restrict to `anyOf`/`oneOf`.\n // - Non-null branches must be inline enums (`!isRef`). For `$ref + null`\n // the existing referenced enum should be reused; routing through\n // `getEnum` would emit a parallel const that nests the original ref\n // (e.g. `{Status: Status}`) instead of spreading or aliasing it.\n const isUnionLikeSeparator = separator === 'anyOf' || separator === 'oneOf';\n const isNullableEnumComposition =\n isUnionLikeSeparator &&\n !isAllEnums &&\n resolvedData.isEnum.some(Boolean) &&\n resolvedData.isEnum.every(\n (isEnum, index) =>\n (isEnum && !resolvedData.isRef[index]) ||\n resolvedData.types[index] === 'null',\n );\n const isAvailableToGenerateCombinedEnum =\n isAllEnums &&\n name &&\n items.length > 1 &&\n context.output.override.enumGenerationType !== EnumGeneration.UNION;\n\n // Only generate a combined const when enum values exist at runtime.\n if (isAvailableToGenerateCombinedEnum) {\n const {\n value: combinedEnumValue,\n valueImports,\n hasNull,\n } = getCombinedEnumValue(\n resolvedData.values.map((value, index) => ({\n value,\n isRef: resolvedData.isRef[index],\n schema: resolvedData.originalSchema[index],\n })),\n );\n const newEnum = `export const ${pascal(name)} = ${combinedEnumValue}`;\n const valueImportSet = new Set(valueImports);\n const enumNullSuffix =\n hasNull && !nullable.includes('null') ? ' | null' : '';\n const typeSuffix = `${nullable}${enumNullSuffix}`;\n\n return {\n value: `typeof ${pascal(name)}[keyof typeof ${pascal(name)}]${typeSuffix}`,\n imports: [\n {\n name: pascal(name),\n },\n ],\n schemas: [\n ...resolvedData.schemas,\n {\n imports: resolvedData.imports\n .filter((toImport) =>\n valueImportSet.has(toImport.alias ?? toImport.name),\n )\n .map<GeneratorImport>((toImport) => ({\n ...toImport,\n values: true,\n })),\n model: newEnum,\n name: name,\n },\n ],\n isEnum: false,\n type: 'object' as SchemaType,\n isRef: false,\n hasReadonlyProps: resolvedData.hasReadonlyProps,\n dependencies: resolvedData.dependencies,\n example: schema.example as unknown,\n examples: resolveExampleRefs(\n schema.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n };\n }\n\n let resolvedValue: ScalarValue | undefined;\n\n const normalizedProperties = normalizedSchema.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\n const schemaOneOf = schema.oneOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const schemaAnyOf = schema.anyOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n\n if (normalizedProperties) {\n resolvedValue = getScalar({\n item: Object.fromEntries(\n Object.entries(normalizedSchema).filter(([key]) => key !== separator),\n ),\n name,\n context,\n formDataContext,\n });\n } else if (separator === 'allOf' && (schemaOneOf || schemaAnyOf)) {\n // Handle sibling pattern: allOf + oneOf/anyOf at same level\n // e.g. { allOf: [A], oneOf: [B, C] } should produce A & (B | C)\n const siblingCombiner = schemaOneOf ? 'oneOf' : 'anyOf';\n const siblingSchemas = schemaOneOf ?? schemaAnyOf;\n resolvedValue = combineSchemas({\n schema: { [siblingCombiner]: siblingSchemas },\n name,\n separator: siblingCombiner,\n context,\n nullable: '',\n });\n }\n\n const value = combineValues({\n resolvedData,\n separator,\n resolvedValue,\n context,\n parentSchema: normalizedSchema,\n });\n\n return {\n value: dedupeUnionType(value + nullable),\n imports: resolvedValue\n ? [...resolvedData.imports, ...resolvedValue.imports]\n : resolvedData.imports,\n schemas: resolvedValue\n ? [...resolvedData.schemas, ...resolvedValue.schemas]\n : resolvedData.schemas,\n dependencies: resolvedValue\n ? [...resolvedData.dependencies, ...resolvedValue.dependencies]\n : resolvedData.dependencies,\n isEnum: isNullableEnumComposition,\n type: 'object' as SchemaType,\n isRef: false,\n hasReadonlyProps:\n resolvedData.hasReadonlyProps ||\n (resolvedValue?.hasReadonlyProps ?? false),\n example: schema.example as unknown,\n examples: resolveExampleRefs(\n schema.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n };\n}\n","import { keyword } from 'esutils';\n\nexport function getKey(key: string) {\n return keyword.isIdentifierNameES5(key) ? key : `'${key}'`;\n}\n","import { resolveExampleRefs, resolveValue } from '../resolvers';\nimport { resolveObject } from '../resolvers/object';\nimport {\n type ContextSpec,\n type GeneratorImport,\n type OpenApiReferenceObject,\n type OpenApiSchemaObject,\n PropertySortOrder,\n type ScalarValue,\n SchemaType,\n} from '../types';\nimport { escape, isReference, isString, jsDoc, pascal } from '../utils';\nimport { combineSchemas } from './combine';\nimport { getAliasedImports, getImportAliasForRefOrValue } from './imports';\nimport { getKey } from './keys';\nimport { getRefInfo } from './ref';\n\ninterface PropertyNamesKeyType {\n value: string;\n imports: GeneratorImport[];\n dependencies: string[];\n}\n\nfunction getPropertyNamesEnumKeyType(\n item: OpenApiSchemaObject,\n): PropertyNamesKeyType | undefined {\n if (!('propertyNames' in item) || !item.propertyNames) {\n return undefined;\n }\n\n const propertyNames = item.propertyNames as {\n enum?: unknown[];\n const?: unknown;\n };\n\n if (Array.isArray(propertyNames.enum)) {\n const enumValues = propertyNames.enum.filter((val): val is string =>\n isString(val),\n );\n\n if (enumValues.length > 0) {\n return {\n value: enumValues.map((val) => `'${escape(val)}'`).join(' | '),\n imports: [],\n dependencies: [],\n };\n }\n }\n\n if (isString(propertyNames.const)) {\n return {\n value: `'${escape(propertyNames.const)}'`,\n imports: [],\n dependencies: [],\n };\n }\n\n return undefined;\n}\n\n/**\n * Resolve a narrowed key type from OpenAPI 3.1 propertyNames.\n * Supports inline enum/const and $ref string enums.\n */\nfunction getPropertyNamesKeyType(\n item: OpenApiSchemaObject,\n context: ContextSpec,\n): PropertyNamesKeyType | undefined {\n const inlineKeyType = getPropertyNamesEnumKeyType(item);\n if (inlineKeyType) {\n return inlineKeyType;\n }\n\n const propertyNames = item.propertyNames as\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | undefined;\n if (!propertyNames || !isReference(propertyNames)) {\n return undefined;\n }\n\n const resolvedValue = resolveValue({\n schema: propertyNames,\n context,\n });\n\n const resolvedConst = resolvedValue.originalSchema.const as unknown;\n const isStringConst =\n resolvedValue.type === 'string' && isString(resolvedConst);\n\n if (!resolvedValue.isEnum && !isStringConst) {\n return undefined;\n }\n\n return {\n value: resolvedValue.value,\n imports: resolvedValue.imports,\n dependencies: resolvedValue.dependencies,\n };\n}\n\n/**\n * Generate index signature key type based on propertyNames enum or const\n * Returns union type string like \"'foo' | 'bar'\", \"'x'\", or 'string' if neither\n */\nfunction getIndexSignatureKey(item: OpenApiSchemaObject): string {\n return getPropertyNamesEnumKeyType(item)?.value ?? 'string';\n}\n\nfunction getPropertyNamesRecordType(\n item: OpenApiSchemaObject,\n valueType: string,\n context: ContextSpec,\n): (PropertyNamesKeyType & { value: string }) | undefined {\n const keyType = getPropertyNamesKeyType(item, context);\n if (!keyType) {\n return undefined;\n }\n\n return {\n ...keyType,\n value: `Partial<Record<${keyType.value}, ${valueType}>>`,\n };\n}\n\n/**\n * Context for form request body (multipart/form-data and\n * application/x-www-form-urlencoded) type generation.\n * Discriminated union with two states:\n *\n * 1. `{ atPart: false, encoding }` - At form root, before property iteration\n * - May traverse through allOf/anyOf/oneOf to reach properties\n * - Carries encoding map so getObject can look up `encoding[key]`\n *\n * 2. `{ atPart: true, partContentType }` - At a multipart part (top-level property)\n * - `partContentType` = Encoding Object's `contentType` for this part\n * - Used by getScalar for file type detection (precedence over contentMediaType)\n * - Arrays pass this through to items; combiners inside arrays also get context\n *\n * `urlEncoded` marks an application/x-www-form-urlencoded body. Such bodies are\n * built with URLSearchParams, whose values are always strings, so getScalar\n * keeps file/binary fields as `string` instead of `Blob` (#1624).\n *\n * `undefined` means not in form context (or nested inside plain object field = JSON)\n */\nexport type FormDataContext =\n | {\n atPart: false;\n encoding: Record<string, { contentType?: string }>;\n urlEncoded?: boolean;\n }\n | { atPart: true; partContentType?: string; urlEncoded?: boolean };\n\ninterface GetObjectOptions {\n item: OpenApiSchemaObject;\n name?: string;\n context: ContextSpec;\n nullable: string;\n /**\n * Multipart/form-data context for file type handling.\n * @see FormDataContext\n */\n formDataContext?: FormDataContext;\n}\n\n/**\n * Return the output type from an object\n *\n * @param item item with type === \"object\"\n */\nexport function getObject({\n item,\n name,\n context,\n nullable,\n formDataContext,\n}: GetObjectOptions): ScalarValue {\n if (isReference(item)) {\n const { name } = getRefInfo(item.$ref as string, context);\n return {\n value: name + nullable,\n imports: [{ name }],\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: true,\n hasReadonlyProps: (item.readOnly as boolean | undefined) ?? false,\n dependencies: [name],\n example: item.example as unknown,\n examples: resolveExampleRefs(\n item.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n };\n }\n\n const schemaItem = item as OpenApiSchemaObject & Record<string, unknown>;\n const itemAllOf = schemaItem.allOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const itemOneOf = schemaItem.oneOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const itemAnyOf = schemaItem.anyOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const itemType = schemaItem.type as string | string[] | undefined;\n\n if (itemAllOf || itemOneOf || itemAnyOf) {\n const separator = itemAllOf ? 'allOf' : itemOneOf ? 'oneOf' : 'anyOf';\n\n return combineSchemas({\n schema: schemaItem,\n name,\n separator,\n context,\n nullable,\n formDataContext,\n });\n }\n\n if (Array.isArray(itemType)) {\n const typeArray = itemType;\n // Bridge: item is OpenApiSchemaObject which includes AnyOtherAttribute index signature.\n // Spreading it directly would carry `any` into the result. Cast to break the chain.\n const baseItem = schemaItem as Record<string, unknown>;\n return combineSchemas({\n schema: {\n anyOf: typeArray.map(\n (type) => ({ ...baseItem, type }) as OpenApiSchemaObject,\n ),\n },\n name,\n separator: 'anyOf',\n context,\n nullable,\n });\n }\n\n // Bridge assertion: item.properties is typed as { [name: string]: ReferenceObject | SchemaObject }\n // but AnyOtherAttribute index signature infects all property access to return `any`\n const itemProperties = schemaItem.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\n\n if (itemProperties && Object.entries(itemProperties).length > 0) {\n const entries = Object.entries(itemProperties);\n if (context.output.propertySortOrder === PropertySortOrder.ALPHABETICAL) {\n entries.sort((a, b) => {\n return a[0].localeCompare(b[0], 'en', {\n numeric: true,\n });\n });\n }\n const acc: ScalarValue = {\n imports: [],\n schemas: [],\n value: '',\n isEnum: false,\n type: 'object' as SchemaType,\n isRef: false,\n hasReadonlyProps: false,\n useTypeAlias: false,\n dependencies: [],\n example: schemaItem.example as unknown,\n examples: resolveExampleRefs(\n schemaItem.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n };\n const itemRequired = schemaItem.required as string[] | undefined;\n for (const [index, [key, schema]] of entries.entries()) {\n const isRequired = (\n Array.isArray(itemRequired) ? itemRequired : []\n ).includes(key);\n\n let propName = '';\n\n if (name) {\n const isKeyStartWithUnderscore = key.startsWith('_');\n\n propName += pascal(\n `${isKeyStartWithUnderscore ? '_' : ''}${name}_${key}`,\n );\n }\n\n const allSpecSchemas = context.spec.components?.schemas ?? {};\n\n const isNameAlreadyTaken = Object.keys(allSpecSchemas).some(\n (schemaName) => pascal(schemaName) === propName,\n );\n\n if (isNameAlreadyTaken) {\n propName = propName + 'Property';\n }\n\n // Transition form context: atPart: false → atPart: true\n // Look up encoding[key].contentType and pass to property resolution.\n // The urlEncoded flag is carried through so nested scalars stay strings.\n const propertyFormDataContext: FormDataContext | undefined =\n formDataContext && !formDataContext.atPart\n ? {\n atPart: true,\n partContentType: formDataContext.encoding[key]?.contentType, // eslint-disable-line @typescript-eslint/no-unnecessary-condition -- Record index access can return undefined at runtime\n urlEncoded: formDataContext.urlEncoded,\n }\n : undefined;\n\n const resolvedValue = resolveObject({\n schema,\n propName,\n context,\n formDataContext: propertyFormDataContext,\n });\n\n const isReadOnly =\n Boolean(schemaItem.readOnly) ||\n Boolean((schema as OpenApiSchemaObject).readOnly);\n if (!index) {\n acc.value += '{';\n }\n\n const doc = jsDoc(schema, true, context);\n const propertyDoc = doc\n ? `${doc\n .trimEnd()\n .split('\\n')\n .map((line) => ` ${line}`)\n .join('\\n')}\\n`\n : '';\n\n // Propagate readonly state from nested schemas ($ref targets or inline\n // objects), not just this property's own readOnly flag. Otherwise an\n // object whose readonly props come solely from nested schemas is never\n // wrapped in `NonReadonly<>`, leaking the readonly modifier into request\n // body types. See issue #826.\n if (isReadOnly || resolvedValue.hasReadonlyProps) {\n acc.hasReadonlyProps = true;\n }\n\n const constValue =\n 'const' in schema ? (schema.const as unknown) : undefined;\n const hasConst = constValue !== undefined;\n let constLiteral: string | undefined;\n\n if (!hasConst) {\n constLiteral = undefined;\n } else if (isString(constValue)) {\n constLiteral = `'${escape(constValue)}'`;\n } else {\n constLiteral = JSON.stringify(constValue);\n }\n\n const needsValueImport =\n hasConst && (resolvedValue.isEnum || resolvedValue.type === 'enum');\n const usedResolvedValue = !hasConst || needsValueImport;\n\n const aliasedImports: GeneratorImport[] = needsValueImport\n ? resolvedValue.imports.map((imp) => ({ ...imp, isConstant: true }))\n : hasConst\n ? []\n : getAliasedImports({ name, context, resolvedValue });\n\n if (aliasedImports.length > 0) {\n acc.imports.push(...aliasedImports);\n }\n\n const alias = getImportAliasForRefOrValue({\n context,\n resolvedValue,\n imports: aliasedImports,\n });\n\n const propValue = needsValueImport ? alias : (constLiteral ?? alias);\n\n const finalPropValue = isRequired\n ? propValue\n : context.output.override.useNullForOptional === true\n ? `${propValue} | null`\n : propValue;\n\n acc.value += `\\n${propertyDoc}${\n isReadOnly && !context.output.override.suppressReadonlyModifier\n ? ' readonly '\n : ' '\n }${getKey(key)}${isRequired ? '' : '?'}: ${finalPropValue};`;\n if (usedResolvedValue) {\n acc.schemas.push(...resolvedValue.schemas);\n acc.dependencies.push(...resolvedValue.dependencies);\n }\n\n if (entries.length - 1 === index) {\n // Bridge assertion: additionalProperties is boolean | ReferenceObject | SchemaObject\n // but AnyOtherAttribute infects property access\n const additionalProps = schemaItem.additionalProperties as\n | boolean\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | undefined;\n if (additionalProps) {\n if (additionalProps === true) {\n const recordType = getPropertyNamesRecordType(\n schemaItem,\n 'unknown',\n context,\n );\n if (recordType) {\n acc.value += '\\n}';\n acc.value += ` & ${recordType.value}`;\n acc.useTypeAlias = true;\n acc.imports.push(...recordType.imports);\n acc.dependencies.push(...recordType.dependencies);\n } else {\n const keyType = getIndexSignatureKey(schemaItem);\n acc.value += `\\n [key: ${keyType}]: unknown;\\n }`;\n }\n } else {\n const resolvedValue = resolveValue({\n schema: additionalProps as\n | OpenApiSchemaObject\n | OpenApiReferenceObject,\n name,\n context,\n });\n const recordType = getPropertyNamesRecordType(\n schemaItem,\n resolvedValue.value,\n context,\n );\n if (recordType) {\n acc.value += '\\n}';\n acc.value += ` & ${recordType.value}`;\n acc.useTypeAlias = true;\n acc.imports.push(...recordType.imports);\n acc.dependencies.push(...recordType.dependencies);\n } else {\n const keyType = getIndexSignatureKey(schemaItem);\n acc.value += `\\n [key: ${keyType}]: ${resolvedValue.value};\\n}`;\n }\n acc.imports.push(...resolvedValue.imports);\n acc.schemas.push(...resolvedValue.schemas);\n acc.dependencies.push(...resolvedValue.dependencies);\n }\n } else {\n acc.value += '\\n}';\n }\n\n acc.value += nullable;\n }\n }\n return acc;\n }\n\n // Bridge assertion: additionalProperties is boolean | ReferenceObject | SchemaObject\n const outerAdditionalProps = schemaItem.additionalProperties as\n | boolean\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | undefined;\n const readOnlyFlag = schemaItem.readOnly as boolean | undefined;\n if (outerAdditionalProps) {\n if (outerAdditionalProps === true) {\n const recordType = getPropertyNamesRecordType(\n schemaItem,\n 'unknown',\n context,\n );\n if (recordType) {\n return {\n value: recordType.value + nullable,\n imports: recordType.imports,\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: true,\n dependencies: recordType.dependencies,\n };\n }\n const keyType = getIndexSignatureKey(schemaItem);\n return {\n value: `{ [key: ${keyType}]: unknown }` + nullable,\n imports: [],\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: false,\n dependencies: [],\n };\n }\n const resolvedValue = resolveValue({\n schema: outerAdditionalProps as\n | OpenApiSchemaObject\n | OpenApiReferenceObject,\n name,\n context,\n });\n const recordType = getPropertyNamesRecordType(\n schemaItem,\n resolvedValue.value,\n context,\n );\n if (recordType) {\n return {\n value: recordType.value + nullable,\n imports: [...recordType.imports, ...resolvedValue.imports],\n schemas: resolvedValue.schemas,\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: resolvedValue.hasReadonlyProps,\n useTypeAlias: true,\n dependencies: [\n ...recordType.dependencies,\n ...resolvedValue.dependencies,\n ],\n };\n }\n const keyType = getIndexSignatureKey(schemaItem);\n return {\n value: `{[key: ${keyType}]: ${resolvedValue.value}}` + nullable,\n imports: resolvedValue.imports,\n schemas: resolvedValue.schemas,\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: resolvedValue.hasReadonlyProps,\n useTypeAlias: false,\n dependencies: resolvedValue.dependencies,\n };\n }\n\n const constValue = schemaItem.const as unknown;\n if (constValue !== undefined) {\n let type: SchemaType;\n if (Array.isArray(constValue)) {\n type = 'array';\n } else if (constValue === null) {\n type = 'null';\n } else if (typeof constValue === 'string') {\n type = 'string';\n } else if (typeof constValue === 'number') {\n type = 'number';\n } else if (typeof constValue === 'boolean') {\n type = 'boolean';\n } else {\n type = 'object';\n }\n\n return {\n value:\n typeof constValue === 'string'\n ? `'${escape(constValue)}'`\n : JSON.stringify(constValue),\n imports: [],\n schemas: [],\n isEnum: false,\n type,\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n dependencies: [],\n };\n }\n\n const keyType =\n itemType === 'object' ? getIndexSignatureKey(schemaItem) : 'string';\n const recordType = getPropertyNamesRecordType(schemaItem, 'unknown', context);\n if (itemType === 'object' && recordType) {\n return {\n value: recordType.value + nullable,\n imports: recordType.imports,\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: true,\n dependencies: recordType.dependencies,\n };\n }\n return {\n value:\n (itemType === 'object' ? `{ [key: ${keyType}]: unknown }` : 'unknown') +\n nullable,\n imports: [],\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: false,\n dependencies: [],\n };\n}\n","import { isArray } from 'remeda';\n\nimport { resolveExampleRefs } from '../resolvers';\nimport type {\n ContextSpec,\n OpenApiSchemaObject,\n OpenApiSchemaObjectType,\n ScalarValue,\n} from '../types';\nimport { escape, isString } from '../utils';\nimport { getFormDataFieldFileType } from '../utils/content-type';\nimport { getArray } from './array';\nimport { combineSchemas } from './combine';\nimport type { FormDataContext } from './object';\nimport { getObject } from './object';\n\n/** Bridge type for enum values extracted from OpenAPI schemas infected by AnyOtherAttribute */\ntype SchemaEnumValue = string | number | boolean | null;\n\n/**\n * Returns true when a schema describes a raw binary string scalar — i.e. one\n * that getScalar's `case 'string':` branch would coerce to `Blob` outside a\n * url-encoded context (see the formDataContext.urlEncoded gate below). Shared\n * with resolveValue so the component-`$ref` urlEncoded short-circuit and the\n * inline scalar path stay in lockstep when new binary shapes are added\n * (#1624 / #3395 / #2410).\n *\n * Accepts OAS 3.1 nullable unions (`type: ['string', 'null']`) since getScalar\n * normalizes those into `case 'string':` before invoking this predicate.\n */\nexport function isBinaryScalarSchema(schema: OpenApiSchemaObject): boolean {\n const schemaType = schema.type as\n | OpenApiSchemaObjectType\n | OpenApiSchemaObjectType[]\n | undefined;\n const isStringLike =\n schemaType === 'string' ||\n (isArray(schemaType) &&\n schemaType.includes('string') &&\n schemaType.every((type) => type === 'string' || type === 'null'));\n if (!isStringLike) {\n return false;\n }\n if (schema.format === 'binary') {\n return true;\n }\n // The @scalar/openapi-parser upgrader rewrites format: binary to\n // contentMediaType: application/octet-stream during Swagger 2.0 / OAS 3.0 →\n // OAS 3.1 upgrades; treat the upgraded shape the same. A non-empty\n // contentEncoding signals an encoded string payload (e.g. base64), not raw\n // binary.\n const contentMediaType = schema.contentMediaType as string | undefined;\n const contentEncoding = schema.contentEncoding as string | undefined;\n return contentMediaType === 'application/octet-stream' && !contentEncoding;\n}\n\ninterface GetScalarOptions {\n item: OpenApiSchemaObject;\n name?: string;\n context: ContextSpec;\n formDataContext?: FormDataContext;\n}\n\n/**\n * Return the typescript equivalent of open-api data type\n *\n * @param item\n * @ref https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.1.1.md#data-types\n */\nexport function getScalar({\n item,\n name,\n context,\n formDataContext,\n}: GetScalarOptions): ScalarValue {\n // Bridge assertions: extract typed values from AnyOtherAttribute-infected schema\n const schemaEnum = item.enum as SchemaEnumValue[] | undefined;\n const schemaType = item.type as\n | OpenApiSchemaObjectType\n | OpenApiSchemaObjectType[]\n | undefined;\n const schemaReadOnly = item.readOnly as boolean | undefined;\n const schemaExample = item.example as unknown;\n const schemaExamples = item.examples as Parameters<\n typeof resolveExampleRefs\n >[0];\n const schemaConst = item.const as string | undefined;\n const schemaFormat = item.format as string | undefined;\n const schemaNullable = item.nullable as boolean | undefined;\n\n const nullable =\n (isArray(schemaType) && schemaType.includes('null')) ||\n schemaNullable === true\n ? ' | null'\n : '';\n\n const enumItems = schemaEnum?.filter(\n (enumItem): enumItem is Exclude<SchemaEnumValue, null> => enumItem !== null,\n );\n\n let itemType:\n | OpenApiSchemaObjectType\n | OpenApiSchemaObjectType[]\n | undefined = schemaType;\n if (!itemType && item.items) {\n item.type = 'array';\n itemType = 'array';\n }\n if (isArray(schemaType) && schemaType.includes('null')) {\n const typesWithoutNull = schemaType.filter(\n (x): x is OpenApiSchemaObjectType => x !== 'null',\n );\n itemType =\n typesWithoutNull.length === 1 ? typesWithoutNull[0] : typesWithoutNull;\n }\n\n switch (itemType) {\n case 'number':\n case 'integer': {\n let value =\n context.output.override.useBigInt &&\n (schemaFormat === 'int64' || schemaFormat === 'uint64')\n ? 'bigint'\n : 'number';\n let isEnum = false;\n\n if (enumItems) {\n value = enumItems.map((enumItem) => `${enumItem}`).join(' | ');\n isEnum = true;\n }\n\n value += nullable;\n\n if (schemaConst !== undefined) {\n value = schemaConst;\n }\n\n return {\n value,\n isEnum,\n type: 'number',\n schemas: [],\n imports: [],\n isRef: false,\n hasReadonlyProps: schemaReadOnly ?? false,\n dependencies: [],\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n }\n\n case 'boolean': {\n let value = 'boolean';\n\n if (\n enumItems &&\n !(enumItems.includes(true) && enumItems.includes(false))\n ) {\n value = enumItems.map((enumItem) => `${enumItem}`).join(' | ');\n }\n\n value += nullable;\n\n if (schemaConst !== undefined) {\n value = schemaConst;\n }\n\n return {\n value: value,\n type: 'boolean',\n isEnum: false,\n schemas: [],\n imports: [],\n isRef: false,\n hasReadonlyProps: schemaReadOnly ?? false,\n dependencies: [],\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n }\n\n case 'array': {\n const { value, ...rest } = getArray({\n schema: item,\n name,\n context,\n formDataContext,\n });\n return {\n value: value + nullable,\n ...rest,\n dependencies: rest.dependencies,\n };\n }\n\n case 'string': {\n let value = 'string';\n let isEnum = false;\n\n if (enumItems) {\n value = enumItems\n .map((enumItem) =>\n isString(enumItem) ? `'${escape(enumItem)}'` : `${enumItem}`,\n )\n .filter(Boolean)\n .join(` | `);\n\n isEnum = true;\n }\n\n // application/x-www-form-urlencoded bodies are built with URLSearchParams,\n // whose values are always strings. Skip Blob/file coercion so file/binary\n // fields stay `string`; enum unions computed above are left intact (#1624).\n if (!formDataContext?.urlEncoded) {\n if (schemaFormat === 'binary') {\n value = 'Blob';\n } else if (formDataContext?.atPart) {\n const fileType = getFormDataFieldFileType(\n item,\n formDataContext.partContentType,\n );\n if (fileType) {\n value = fileType === 'binary' ? 'Blob' : 'Blob | string';\n }\n } else if (isBinaryScalarSchema(item)) {\n // The previous arm caught format: binary directly; this matches the\n // OAS 3.1 contentMediaType: application/octet-stream variant via the\n // shared predicate so any future binary shapes added there flow\n // through here too (#2410).\n value = 'Blob';\n }\n }\n\n if (\n context.output.override.useDates &&\n (schemaFormat === 'date' || schemaFormat === 'date-time')\n ) {\n value = 'Date';\n }\n\n value += nullable;\n\n if (schemaConst) {\n value = `'${schemaConst}'`;\n }\n\n return {\n value: value,\n isEnum,\n type: 'string',\n imports: [],\n schemas: [],\n isRef: false,\n hasReadonlyProps: schemaReadOnly ?? false,\n dependencies: [],\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n }\n\n case 'null': {\n // Some OAS 3.1 generators emit a nullable composition in the\n // non-canonical form `{ type: 'null', allOf|oneOf|anyOf: [...] }`\n // (e.g. Swashbuckle with UseAllOfToExtendReferenceSchemas; passed\n // through by @scalar/openapi-upgrader) rather than the canonical\n // `{ anyOf: [...], type: 'null' }` member form. Treat the composition as\n // the value and `null` as a union member so this yields `T | null`\n // instead of collapsing to `null` and dropping the refs.\n const itemAllOf = item.allOf as unknown[] | undefined;\n const itemOneOf = item.oneOf as unknown[] | undefined;\n const itemAnyOf = item.anyOf as unknown[] | undefined;\n let separator: 'allOf' | 'oneOf' | 'anyOf' | undefined;\n if (itemAllOf?.length) {\n separator = 'allOf';\n } else if (itemOneOf?.length) {\n separator = 'oneOf';\n } else if (itemAnyOf?.length) {\n separator = 'anyOf';\n }\n if (separator) {\n // Drop the consumed `type: 'null'` before delegating: its nullability\n // is carried by `nullable` below, and leaving it on the schema makes\n // combineSchemas' merged-properties recursion re-enter this `case` and\n // collapse the object part back to `null`.\n const schemaWithoutNull = Object.fromEntries(\n Object.entries(item as Record<string, unknown>).filter(\n ([key]) => key !== 'type',\n ),\n ) as OpenApiSchemaObject;\n return combineSchemas({\n schema: schemaWithoutNull,\n name,\n separator,\n context,\n nullable: nullable || ' | null',\n formDataContext,\n });\n }\n\n return {\n value: 'null',\n isEnum: false,\n type: 'null',\n imports: [],\n schemas: [],\n isRef: false,\n hasReadonlyProps: schemaReadOnly ?? false,\n dependencies: [],\n };\n }\n\n default: {\n if (isArray(itemType)) {\n const anyOfVariants = itemType.map((type) =>\n Object.assign({}, item, { type }),\n ) as OpenApiSchemaObject[];\n return combineSchemas({\n schema: { anyOf: anyOfVariants } as OpenApiSchemaObject,\n name,\n separator: 'anyOf',\n context,\n nullable,\n });\n }\n\n if (enumItems) {\n const value = enumItems\n .map((enumItem) =>\n isString(enumItem) ? `'${escape(enumItem)}'` : String(enumItem),\n )\n .filter(Boolean)\n .join(` | `);\n\n return {\n value: value + nullable,\n isEnum: true,\n type: 'string',\n imports: [],\n schemas: [],\n isRef: false,\n hasReadonlyProps: schemaReadOnly ?? false,\n dependencies: [],\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n }\n\n // Determine if we should pass form-data context:\n // - atPart: false -> always pass (navigating to properties)\n // - atPart: true + combiner -> pass (combiner members are still the same part)\n // - atPart: true + plain object -> don't pass (nested properties are JSON)\n const hasCombiners = (item.allOf ?? item.anyOf ?? item.oneOf) as\n | unknown[]\n | undefined;\n const shouldPassContext =\n formDataContext?.atPart === false ||\n (formDataContext?.atPart && hasCombiners);\n\n const { value, ...rest } = getObject({\n item,\n name,\n context,\n nullable,\n formDataContext: shouldPassContext ? formDataContext : undefined,\n });\n return { value: value, ...rest };\n }\n }\n}\n","import { isDereferenced } from '@scalar/openapi-types/helpers';\nimport { prop } from 'remeda';\n\nimport { getRefInfo, isComponentRef, type RefInfo } from '../getters/ref';\nimport type {\n ContextSpec,\n DynamicScopeEntry,\n GeneratorImport,\n OpenApiComponentsObject,\n OpenApiExampleObject,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n} from '../types';\nimport { isObject, isReference, sanitize } from '../utils';\n\n/** Convert a `$dynamicAnchor` name to a valid TypeScript generic parameter identifier. */\nexport function dynamicAnchorToParamName(anchor: string): string {\n return sanitize(anchor, {\n underscore: '_',\n whitespace: '_',\n dash: '_',\n es5keyword: true,\n es5IdentifierName: true,\n });\n}\n\nexport function dynamicAnchorsToUniqueParamNames(\n anchors: string[],\n): Map<string, string> {\n const result = new Map<string, string>();\n const usedNames = new Map<string, number>();\n for (const anchor of anchors) {\n const base = dynamicAnchorToParamName(anchor);\n const count = usedNames.get(base) ?? 0;\n usedNames.set(base, count + 1);\n const paramName = count === 0 ? base : `${base}${count + 1}`;\n result.set(anchor, paramName);\n }\n return result;\n}\n\ntype Example = OpenApiExampleObject | OpenApiReferenceObject;\ntype ResolvedExample = unknown;\ntype Examples =\n | Example[]\n | Record<string, Example>\n | ResolvedExample[]\n | Record<string, ResolvedExample>\n | undefined;\n\ninterface WithOptionalExamples {\n examples?: Examples;\n}\n\nconst REF_NOT_FOUND_PREFIX = 'Oops... 🍻. Ref not found';\n\n/* eslint-disable @typescript-eslint/no-unnecessary-type-parameters -- TSchema constrains return type for callers (e.g. resolveRef<OpenApiExampleObject>) */\n\n/**\n * Recursively resolves a `$ref` in an OpenAPI document, following\n * nested schema refs and collecting imports along the way.\n *\n * Handles OpenAPI 3.0 `nullable` and 3.1 type-array hints on direct refs.\n *\n * @see https://spec.openapis.org/oas/v3.0.3#reference-object\n * @see https://spec.openapis.org/oas/v3.1.0#reference-object\n */\nexport function resolveRef<TSchema extends object = OpenApiComponentsObject>(\n schema: OpenApiComponentsObject | OpenApiReferenceObject,\n context: ContextSpec,\n imports: GeneratorImport[] = [],\n): {\n schema: TSchema;\n imports: GeneratorImport[];\n} {\n const refPath = '$ref' in schema ? schema.$ref : undefined;\n const nestedSchema =\n 'schema' in schema ? (schema as { schema?: unknown }).schema : undefined;\n\n // the schema is referring to another object\n if (\n isObject(nestedSchema) &&\n isReference(nestedSchema) &&\n typeof nestedSchema.$ref === 'string'\n ) {\n const resolvedRef = resolveRef<TSchema>(nestedSchema, context, imports);\n\n if ('examples' in schema) {\n const schemaWithExamples = schema as WithOptionalExamples;\n schemaWithExamples.examples = resolveExampleRefs(\n schemaWithExamples.examples,\n context,\n );\n }\n\n if ('examples' in resolvedRef.schema) {\n const resolvedWithExamples = resolvedRef.schema as WithOptionalExamples;\n resolvedWithExamples.examples = resolveExampleRefs(\n resolvedWithExamples.examples,\n context,\n );\n }\n\n return {\n schema: {\n ...schema,\n schema: resolvedRef.schema,\n } as TSchema,\n imports: resolvedRef.imports,\n };\n }\n\n if (isDereferenced(schema)) {\n if ('examples' in schema) {\n const schemaWithExamples = schema as WithOptionalExamples;\n schemaWithExamples.examples = resolveExampleRefs(\n schemaWithExamples.examples,\n context,\n );\n }\n return { schema: schema as TSchema, imports };\n }\n\n if (!refPath) {\n throw new Error(`${REF_NOT_FOUND_PREFIX}: missing $ref`);\n }\n\n const {\n currentSchema,\n refInfo: { name, originalName },\n } = getSchema(schema, context);\n\n if (!currentSchema) {\n throw new Error(`${REF_NOT_FOUND_PREFIX}: ${refPath}`);\n }\n\n return resolveRef<TSchema>(currentSchema, { ...context }, [\n ...imports,\n { name, schemaName: originalName },\n ]);\n}\n\n/**\n * Describes a resolved generic alias binding — the concrete type arguments\n * that fill the template's `$dynamicAnchor` slots for a given `$ref` with\n * `$defs` overrides.\n *\n * Produced by {@link extractBoundAliasInfo} and consumed by `resolveValue`\n * to emit instantiated generic type expressions (e.g. `Paginated<User>`).\n */\nexport interface BoundAliasInfo {\n genericName: string;\n genericParams: string[];\n typeArgs: string[];\n imports: { name: string; schemaName: string }[];\n extraSchemas?: (OpenApiSchemaObject | OpenApiReferenceObject)[];\n}\n\n/** Check whether a schema reference has at least one `$defs` entry with both `$dynamicAnchor` and `$ref`. */\nfunction isBoundAlias(schema: OpenApiReferenceObject): boolean {\n const defs = schema.$defs as Record<string, unknown> | undefined;\n if (!defs || typeof defs !== 'object') return false;\n for (const defSchema of Object.values(defs)) {\n if (!defSchema || typeof defSchema !== 'object') continue;\n const rec = defSchema as Record<string, unknown>;\n if (\n typeof rec.$dynamicAnchor === 'string' &&\n typeof rec.$ref === 'string'\n ) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Extract bound-alias information from a schema that references a generic template\n * and binds `$dynamicAnchor` entries to concrete types via `$defs`.\n */\nexport function extractBoundAliasInfo(\n schema: OpenApiSchemaObject | OpenApiReferenceObject,\n context: ContextSpec,\n): BoundAliasInfo | undefined {\n let bindingElement: OpenApiReferenceObject | undefined;\n let extraSchemas:\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n\n if (isReference(schema) && isBoundAlias(schema)) {\n bindingElement = schema;\n } else {\n const allOf = (schema as { allOf?: unknown[] }).allOf;\n if (Array.isArray(allOf)) {\n for (let i = 0; i < allOf.length; i++) {\n const element = allOf[i] as\n | OpenApiSchemaObject\n | OpenApiReferenceObject;\n if (isReference(element) && isBoundAlias(element)) {\n bindingElement = element;\n extraSchemas = allOf.filter((_: unknown, j: number) => j !== i) as (\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n )[];\n break;\n }\n }\n }\n }\n\n if (!bindingElement) return undefined;\n\n const bindingRecord = bindingElement as Record<string, unknown>;\n const defs = bindingRecord.$defs as Record<string, unknown> | undefined;\n if (!defs || typeof defs !== 'object') return undefined;\n\n const bindingByAnchor = new Map<\n string,\n { typeName: string; originalName: string }\n >();\n\n for (const defSchema of Object.values(defs)) {\n if (!defSchema || typeof defSchema !== 'object') continue;\n const rec = defSchema as Record<string, unknown>;\n if (rec.$dynamicAnchor === undefined) continue;\n\n const ref = rec.$ref as string | undefined;\n if (!ref || !isComponentRef(ref)) continue;\n\n const anchor = rec.$dynamicAnchor as string;\n const { name, originalName } = getRefInfo(ref, context);\n bindingByAnchor.set(anchor, { typeName: name, originalName });\n }\n\n if (bindingByAnchor.size === 0) return undefined;\n\n const refPath = bindingElement.$ref;\n if (typeof refPath !== 'string') return undefined;\n\n const { name: genericName, refPaths: templateRefPaths } = getRefInfo(\n refPath,\n context,\n );\n\n const templateSchema = templateRefPaths\n ? (prop(\n context.spec,\n // @ts-expect-error: [ts2556] refPaths are not guaranteed to be valid keys of the spec\n ...templateRefPaths,\n ) as Record<string, unknown> | undefined)\n : undefined;\n\n const templateDefs = templateSchema?.$defs as\n | Record<string, unknown>\n | undefined;\n\n const typeArgs: string[] = [];\n const genericParams: string[] = [];\n const imports: { name: string; schemaName: string }[] = [];\n\n if (templateDefs && typeof templateDefs === 'object') {\n const templateAnchors: string[] = [];\n for (const defSchema of Object.values(templateDefs)) {\n if (!defSchema || typeof defSchema !== 'object') continue;\n const rec = defSchema as Record<string, unknown>;\n if (rec.$dynamicAnchor === undefined || rec.$ref !== undefined) continue;\n templateAnchors.push(rec.$dynamicAnchor as string);\n }\n\n const uniqueNames = dynamicAnchorsToUniqueParamNames(templateAnchors);\n for (const anchor of templateAnchors) {\n const binding = bindingByAnchor.get(anchor);\n if (binding) {\n typeArgs.push(binding.typeName);\n imports.push({\n name: binding.typeName,\n schemaName: binding.originalName,\n });\n } else {\n const paramName =\n uniqueNames.get(anchor) ?? dynamicAnchorToParamName(anchor);\n typeArgs.push(paramName);\n genericParams.push(paramName);\n }\n }\n }\n\n if (typeArgs.length === 0) {\n for (const { typeName, originalName } of bindingByAnchor.values()) {\n typeArgs.push(typeName);\n imports.push({ name: typeName, schemaName: originalName });\n }\n }\n\n return { genericName, genericParams, typeArgs, imports, extraSchemas };\n}\n\nfunction getSchema<TSchema extends object = OpenApiComponentsObject>(\n schema: OpenApiReferenceObject,\n context: ContextSpec,\n): {\n refInfo: RefInfo;\n currentSchema: TSchema | undefined;\n} {\n if (!schema.$ref) {\n throw new Error(`${REF_NOT_FOUND_PREFIX}: missing $ref`);\n }\n\n const refInfo = getRefInfo(schema.$ref, context);\n\n const { refPaths } = refInfo;\n\n const schemaByRefPaths:\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | undefined = Array.isArray(refPaths)\n ? (prop(\n context.spec,\n // @ts-expect-error: [ts2556] refPaths are not guaranteed to be valid keys of the spec\n ...refPaths,\n ) as OpenApiSchemaObject | OpenApiReferenceObject | undefined)\n : undefined;\n\n if (isObject(schemaByRefPaths) && isReference(schemaByRefPaths)) {\n return getSchema(schemaByRefPaths, context);\n }\n\n let currentSchema: OpenApiSchemaObject | OpenApiReferenceObject | undefined =\n schemaByRefPaths;\n\n // Handle OpenAPI 3.0 nullable property\n // Bridge assertion: schema properties are `any` due to AnyOtherAttribute\n if (isObject(currentSchema) && 'nullable' in schema) {\n const nullable = schema.nullable as boolean | undefined;\n const currentSchemaObject = currentSchema as Record<string, unknown>;\n currentSchema = {\n ...currentSchemaObject,\n nullable,\n } as OpenApiSchemaObject | OpenApiReferenceObject;\n }\n\n // Handle OpenAPI 3.1 type array (e.g., type: [\"object\", \"null\"])\n // This preserves nullable information when using direct $ref with types array\n if (\n isObject(currentSchema) &&\n 'type' in schema &&\n Array.isArray(schema.type)\n ) {\n const type = schema.type as string[];\n const currentSchemaObject = currentSchema as Record<string, unknown>;\n currentSchema = {\n ...currentSchemaObject,\n type,\n } as OpenApiSchemaObject | OpenApiReferenceObject;\n }\n\n return {\n currentSchema: currentSchema as TSchema | undefined,\n refInfo,\n };\n}\n\n/* eslint-enable @typescript-eslint/no-unnecessary-type-parameters */\n\nfunction encodeJsonPointerSegment(segment: string): string {\n return segment.replaceAll('~', '~0').replaceAll('/', '~1');\n}\n\n/**\n * Build the dynamic scope for a schema: maps `$dynamicAnchor` names to concrete\n * type entries for self-referential resolution, `$defs` bindings, and sibling anchors.\n */\nexport function buildDynamicScope(\n schemaName: string,\n schema: OpenApiSchemaObject,\n context: ContextSpec,\n): Record<string, DynamicScopeEntry> {\n const scope: Record<string, DynamicScopeEntry> = {};\n\n const getSchemaScopeEntry = (name: string): DynamicScopeEntry => {\n const refInfo = getRefInfo(\n `#/components/schemas/${encodeJsonPointerSegment(name)}`,\n context,\n );\n\n return {\n name: refInfo.name,\n schemaName: refInfo.originalName,\n };\n };\n\n const schemaRecord = schema as Record<string, unknown>;\n\n if (typeof schemaRecord.$dynamicAnchor === 'string') {\n scope[schemaRecord.$dynamicAnchor] = getSchemaScopeEntry(schemaName);\n }\n\n const defs = schemaRecord.$defs as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\n if (defs && typeof defs === 'object') {\n const unboundAnchors: string[] = [];\n for (const [, defSchema] of Object.entries(defs)) {\n if (!defSchema || typeof defSchema !== 'object') continue;\n const defRecord = defSchema as Record<string, unknown>;\n if (typeof defRecord.$dynamicAnchor === 'string') {\n const anchorName = defRecord.$dynamicAnchor;\n const refInDef = (defSchema as OpenApiReferenceObject).$ref;\n if (refInDef?.startsWith('#/components/schemas/')) {\n const { name, originalName } = getRefInfo(refInDef, context);\n scope[anchorName] = { name, schemaName: originalName };\n } else if (!refInDef) {\n unboundAnchors.push(anchorName);\n }\n }\n }\n if (unboundAnchors.length > 0) {\n const uniqueNames = dynamicAnchorsToUniqueParamNames(unboundAnchors);\n for (const anchor of unboundAnchors) {\n const paramName = uniqueNames.get(anchor);\n if (paramName === undefined) continue;\n scope[anchor] = {\n name: paramName,\n schemaName: paramName,\n isParameter: true,\n };\n }\n }\n }\n\n return scope;\n}\n\n/**\n * Resolve a `$dynamicRef` anchor to its concrete type using the current dynamic scope.\n * Returns `{ schema: {}, resolvedTypeName: 'unknown' }` when no scope override exists.\n */\nexport function resolveDynamicRef(\n anchorName: string,\n context: ContextSpec,\n imports: GeneratorImport[] = [],\n): {\n schema: OpenApiSchemaObject;\n imports: GeneratorImport[];\n resolvedTypeName: string;\n} {\n const scope = context.dynamicScope ?? {};\n let scopeEntry = scope[anchorName];\n\n if (!scopeEntry) {\n const schemas = (\n (context.spec as Record<string, unknown>).components as\n | Record<string, unknown>\n | undefined\n )?.schemas as Record<string, unknown> | undefined;\n\n if (schemas && typeof schemas === 'object') {\n for (const [schemaName, schemaObj] of Object.entries(schemas)) {\n if (!schemaObj || typeof schemaObj !== 'object') continue;\n const rec = schemaObj as Record<string, unknown>;\n if (rec.$dynamicAnchor === anchorName) {\n const refInfo = getRefInfo(\n `#/components/schemas/${encodeJsonPointerSegment(schemaName)}`,\n context,\n );\n scopeEntry = {\n name: refInfo.name,\n schemaName: refInfo.originalName,\n };\n break;\n }\n }\n }\n }\n\n if (!scopeEntry) {\n return {\n schema: {},\n imports,\n resolvedTypeName: 'unknown',\n };\n }\n\n if (scopeEntry.isParameter) {\n return {\n schema: {},\n imports,\n resolvedTypeName: scopeEntry.name,\n };\n }\n\n const resolvedTypeName = scopeEntry.name;\n const schemaRef = `#/components/schemas/${encodeJsonPointerSegment(scopeEntry.schemaName)}`;\n\n try {\n const { schema: resolvedSchema, imports: resolvedImports } =\n resolveRef<OpenApiSchemaObject>({ $ref: schemaRef }, context, imports);\n return {\n schema: resolvedSchema,\n imports: resolvedImports,\n resolvedTypeName,\n };\n } catch {\n return {\n schema: {},\n imports,\n resolvedTypeName: 'unknown',\n };\n }\n}\n\n/** Recursively resolves `$ref` entries in an examples array or record. */\nexport function resolveExampleRefs(\n examples: Examples,\n context: ContextSpec,\n): ResolvedExample[] | Record<string, ResolvedExample> | undefined {\n if (!examples) {\n return undefined;\n }\n return Array.isArray(examples)\n ? examples.map((example) => {\n if (isObject(example) && isReference(example)) {\n const { schema }: { schema: OpenApiExampleObject } = resolveRef(\n example,\n context,\n );\n // Bridge assertion: ExampleObject.value is typed as `any`\n return schema.value as ResolvedExample;\n }\n return example;\n })\n : (() => {\n const result: Record<string, ResolvedExample> = {};\n for (const [key, example] of Object.entries(examples)) {\n // Bridge assertion: ExampleObject.value is typed as `any`\n result[key] =\n isObject(example) && isReference(example)\n ? ((\n resolveRef(example, context) as {\n schema: OpenApiExampleObject;\n }\n ).schema.value as ResolvedExample)\n : example;\n }\n return result;\n })();\n}\n","import { getScalar } from '../getters';\nimport type { FormDataContext } from '../getters/object';\nimport { getDynamicAnchorName, isComponentRef } from '../getters/ref';\nimport { isBinaryScalarSchema } from '../getters/scalar';\nimport type {\n ContextSpec,\n GeneratorImport,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n ResolverValue,\n SchemaType,\n} from '../types';\nimport { isDynamicReference, isReference } from '../utils';\nimport { extractBoundAliasInfo, resolveDynamicRef, resolveRef } from './ref';\n\ninterface ResolveValueOptions {\n schema: OpenApiSchemaObject | OpenApiReferenceObject;\n name?: string;\n context: ContextSpec;\n formDataContext?: FormDataContext;\n}\n\nconst schemaArrayKeys = ['allOf', 'anyOf', 'oneOf', 'prefixItems'] as const;\nconst schemaObjectKeys = [\n 'additionalProperties',\n 'contains',\n 'else',\n 'if',\n 'items',\n 'not',\n 'propertyNames',\n 'then',\n 'unevaluatedItems',\n 'unevaluatedProperties',\n] as const;\nconst schemaMapKeys = [\n '$defs',\n 'dependentSchemas',\n 'patternProperties',\n 'properties',\n] as const;\n\n/**\n * Recursively walks a schema value and returns `true` if any nested\n * `$dynamicRef` resolves — via the current `context.dynamicScope` — to a\n * schema *other* than `refName`.\n *\n * Used by `resolveValue` to decide whether a `$ref`'d schema must be\n * instantiated with its bound type arguments rather than referenced by name.\n *\n * @param value - The schema node (or sub-node) to inspect.\n * @param context - Current resolution context, including the dynamic scope.\n * @param refName - The resolved name of the enclosing `$ref` schema; dynamic\n * refs that resolve to this same name are considered\n * self-references and do not count as \"scope-affected\".\n * @param seen - Cycle-guard; tracks already-visited objects.\n */\nfunction hasScopeAffectedDynamicRef(\n value: unknown,\n context: ContextSpec,\n refName: string,\n seen = new WeakSet<object>(),\n): boolean {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n if (!context.dynamicScope || Object.keys(context.dynamicScope).length === 0) {\n return false;\n }\n\n if (seen.has(value)) {\n return false;\n }\n seen.add(value);\n\n if (isDynamicReference(value) && value.$dynamicRef.startsWith('#')) {\n const anchorName = getDynamicAnchorName(value.$dynamicRef);\n if (anchorName) {\n const scopeEntry = context.dynamicScope[anchorName];\n if (scopeEntry && scopeEntry.name !== refName) {\n return true;\n }\n }\n }\n\n const schema = value as Record<string, unknown>;\n\n for (const key of schemaArrayKeys) {\n const items = schema[key];\n if (\n Array.isArray(items) &&\n items.some((item) =>\n hasScopeAffectedDynamicRef(item, context, refName, seen),\n )\n ) {\n return true;\n }\n }\n\n for (const key of schemaObjectKeys) {\n if (hasScopeAffectedDynamicRef(schema[key], context, refName, seen)) {\n return true;\n }\n }\n\n for (const key of schemaMapKeys) {\n const schemaMap = schema[key];\n if (\n schemaMap &&\n typeof schemaMap === 'object' &&\n Object.values(schemaMap).some((item) =>\n hasScopeAffectedDynamicRef(item, context, refName, seen),\n )\n ) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction makeUnknownValue(\n originalSchema: OpenApiSchemaObject | OpenApiReferenceObject,\n): ResolverValue {\n return {\n value: 'unknown',\n imports: [],\n type: 'unknown',\n isEnum: false,\n schemas: [],\n isRef: false,\n hasReadonlyProps: false,\n originalSchema,\n dependencies: [],\n };\n}\n\n/**\n * Resolves an OpenAPI schema or reference object to a {@link ResolverValue}\n * that carries the TypeScript type string, required imports, and metadata.\n *\n * Handles all schema forms in priority order:\n * 1. **Bound generic alias** — a `$ref` with `$defs` overrides; emits an\n * instantiated generic expression such as `Paginated<User>`.\n * 2. **Component `$ref`** — a named `$ref` pointing to `#/components/…`;\n * emits the schema name as a reference import.\n * 3. **Non-component `$ref`** — an anonymous or path-level ref; inlines the\n * resolved schema via {@link getScalar} (cycle-safe).\n * 4. **`$dynamicRef`** — resolved via the active dynamic scope; falls back to\n * `unknown` when the anchor is absent or the ref is a bare `#`.\n * 5. **Plain schema** — delegates to {@link getScalar} for all other cases\n * (primitives, objects, arrays, enums, …).\n */\nexport function resolveValue({\n schema,\n name,\n context,\n formDataContext,\n}: ResolveValueOptions): ResolverValue {\n if (isReference(schema)) {\n const alias = extractBoundAliasInfo(schema, context);\n if (alias) {\n const value = `${alias.genericName}<${alias.typeArgs.join(', ')}>`;\n const allImports: { name: string; schemaName: string }[] = [\n { name: alias.genericName, schemaName: alias.genericName },\n ...alias.imports,\n ];\n return {\n value,\n imports: allImports,\n type: 'object',\n schemas: [],\n isEnum: false,\n originalSchema: schema as OpenApiSchemaObject,\n hasReadonlyProps: false,\n isRef: true,\n dependencies: allImports.map((i) => i.name),\n };\n }\n\n const refValue = schema.$ref;\n const {\n schema: schemaObject,\n imports,\n }: {\n schema: OpenApiSchemaObject;\n imports: GeneratorImport[];\n } = resolveRef(schema, context);\n\n // Refs that don't target a named component slot (e.g. bundler-emitted\n // `#/paths/.../schema`) have no corresponding `export type`, so emitting\n // a named import would dangle. Inline the resolved schema instead.\n // See issue #398.\n if (refValue && !isComponentRef(refValue)) {\n // Inlining walks nested $refs via getScalar -> resolveValue. A\n // self-referential path-ref would recurse forever because the named-ref\n // cycle guard below tracks `resolvedImport.name`, not the ref string.\n // Fall back to `unknown` to break the chain — anonymous recursive types\n // can't be expressed in TypeScript anyway.\n if (context.parents?.includes(refValue)) {\n return {\n value: 'unknown',\n imports: [],\n schemas: [],\n type: 'unknown',\n isEnum: false,\n originalSchema: schemaObject,\n hasReadonlyProps: false,\n isRef: false,\n dependencies: [],\n };\n }\n const scalar = getScalar({\n item: schemaObject,\n name,\n context: {\n ...context,\n parents: [...(context.parents ?? []), refValue],\n },\n formDataContext,\n });\n return { ...scalar, originalSchema: schemaObject, isRef: false };\n }\n\n // application/x-www-form-urlencoded bodies are serialized via\n // URLSearchParams.append(), which only accepts strings. Inline binary\n // properties already skip the Blob coercion via formDataContext.urlEncoded\n // inside scalar.ts (#1624 / #3395), but the component-$ref path below\n // returns the imported type name unconditionally — so e.g. C#'s\n // `IFormFile` (= Blob) leaks into the body type and fails to type-check.\n // When the resolved component schema is a binary scalar that scalar.ts\n // would coerce to Blob, fall back to the inlined scalar (which becomes\n // `string` under formDataContext.urlEncoded) instead of the import.\n // The standalone IFormFile model is intentionally left as Blob — it may\n // still be referenced by a multipart/form-data endpoint where Blob is\n // correct. Fixes #2410.\n if (formDataContext?.urlEncoded && isBinaryScalarSchema(schemaObject)) {\n // Pass the resolveValue input `name` (the property name) so this branch\n // truly behaves like an inline property schema. Using the component\n // import name here would leak component-based naming into downstream\n // scalar paths (validators/docs/naming) even though the resulting type\n // is plain `string`.\n const scalar = getScalar({\n item: schemaObject,\n name,\n context,\n formDataContext,\n });\n return { ...scalar, originalSchema: schemaObject, isRef: false };\n }\n\n const resolvedImport = imports[0];\n\n let hasReadonlyProps = false;\n\n // Avoid infinite loop - use resolvedImport.name for tracking since name may be undefined\n const refName = resolvedImport.name;\n\n // Keep the dynamic scope from the original wrapper schema: its $defs\n // provide the dynamic-anchor bindings, and scopedContext captured them\n // before materialization. Resolving the wrapper $ref here gives us the\n // concrete instantiation of the referenced template to generate.\n if (\n !context.parents?.includes(refName) &&\n hasScopeAffectedDynamicRef(schemaObject, context, refName)\n ) {\n const scalar = getScalar({\n item: schemaObject,\n name: name ?? refName,\n context: {\n ...context,\n parents: [...(context.parents ?? []), refName],\n },\n formDataContext,\n });\n\n return {\n ...scalar,\n originalSchema: schemaObject,\n isRef: false,\n };\n }\n\n if (!context.parents?.includes(refName)) {\n const scalar = getScalar({\n item: schemaObject,\n name: refName,\n context: {\n ...context,\n parents: [...(context.parents ?? []), refName],\n },\n });\n\n hasReadonlyProps = scalar.hasReadonlyProps;\n }\n\n // Bridge assertion: schemaObject.anyOf is `any` due to AnyOtherAttribute\n const anyOfItems = schemaObject.anyOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const isAnyOfNullable = anyOfItems?.some(\n (anyOfItem) =>\n !isReference(anyOfItem) &&\n (anyOfItem.type === 'null' ||\n (Array.isArray(anyOfItem.type) && anyOfItem.type.includes('null'))),\n );\n\n const schemaType = schemaObject.type as string | string[] | undefined;\n const nullable =\n (Array.isArray(schemaType) && schemaType.includes('null')) ||\n schemaObject.nullable === true ||\n isAnyOfNullable\n ? ' | null'\n : '';\n\n return {\n value: resolvedImport.name + nullable,\n imports: [\n {\n name: resolvedImport.name,\n schemaName: resolvedImport.schemaName,\n },\n ],\n type: (schemaObject.type as SchemaType | undefined) ?? 'object',\n schemas: [],\n isEnum: !!schemaObject.enum,\n originalSchema: schemaObject,\n hasReadonlyProps,\n isRef: true,\n dependencies: [resolvedImport.name],\n };\n }\n\n if (isDynamicReference(schema)) {\n const dynamicRef = schema.$dynamicRef;\n\n if (!dynamicRef.startsWith('#')) {\n return makeUnknownValue(schema);\n }\n\n const anchorName = getDynamicAnchorName(dynamicRef);\n if (!anchorName) {\n return makeUnknownValue(schema);\n }\n\n const { imports: resolvedImports, resolvedTypeName } = resolveDynamicRef(\n anchorName,\n context,\n );\n\n if (resolvedTypeName === 'unknown') {\n return makeUnknownValue(schema);\n }\n\n return {\n value: resolvedTypeName,\n imports: resolvedImports,\n type: 'object',\n isEnum: false,\n schemas: [],\n isRef: true,\n hasReadonlyProps: false,\n originalSchema: schema,\n dependencies: [resolvedTypeName],\n };\n }\n\n const scalar = getScalar({\n item: schema,\n name,\n context,\n formDataContext,\n });\n\n return {\n ...scalar,\n originalSchema: schema,\n isRef: false,\n };\n}\n","import { getEnum, getEnumDescriptions, getEnumNames } from '../getters/enum';\nimport type { FormDataContext } from '../getters/object';\nimport type {\n ContextSpec,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n ResolverValue,\n ScalarValue,\n} from '../types';\nimport { jsDoc } from '../utils';\nimport { resolveValue } from './value';\n\ninterface ResolveOptions {\n schema: OpenApiSchemaObject | OpenApiReferenceObject;\n propName?: string;\n combined?: boolean;\n context: ContextSpec;\n formDataContext?: FormDataContext;\n}\n\ninterface CreateTypeAliasOptions {\n resolvedValue: ResolverValue;\n propName: string | undefined;\n context: ContextSpec;\n}\n\n/**\n * Wraps inline object type in a type alias.\n * E.g. `{ foo: string }` → value becomes `FooBody`, schema gets `export type FooBody = { foo: string };`\n */\nexport function createTypeAliasIfNeeded({\n resolvedValue,\n propName,\n context,\n}: CreateTypeAliasOptions): ScalarValue | undefined {\n if (!propName) {\n return undefined;\n }\n\n if (resolvedValue.isEnum || resolvedValue.type !== 'object') {\n return undefined;\n }\n\n // aliasCombinedTypes (v7 compat): match '|' and '&' so 'string | number' creates named type\n // v8 default: only match '{' so combined primitives are inlined\n const aliasPattern = context.output.override.aliasCombinedTypes\n ? String.raw`{|&|\\|`\n : '{';\n if (!new RegExp(aliasPattern).test(resolvedValue.value)) {\n return undefined;\n }\n\n const { originalSchema } = resolvedValue;\n const doc = jsDoc(originalSchema);\n const isConstant = 'const' in originalSchema;\n const constantIsString =\n 'type' in originalSchema &&\n (originalSchema.type === 'string' ||\n (Array.isArray(originalSchema.type) &&\n originalSchema.type.includes('string')));\n\n const model = isConstant\n ? `${doc}export const ${propName} = ${constantIsString ? `'${originalSchema.const}'` : originalSchema.const} as const;\\n`\n : `${doc}export type ${propName} = ${resolvedValue.value};\\n`;\n\n return {\n value: propName,\n imports: [{ name: propName, isConstant }],\n schemas: [\n ...resolvedValue.schemas,\n {\n name: propName,\n model,\n imports: resolvedValue.imports,\n dependencies: resolvedValue.dependencies,\n },\n ],\n isEnum: false,\n type: 'object',\n isRef: resolvedValue.isRef,\n hasReadonlyProps: resolvedValue.hasReadonlyProps,\n dependencies: resolvedValue.dependencies,\n };\n}\n\nfunction resolveObjectOriginal({\n schema,\n propName,\n combined = false,\n context,\n formDataContext,\n}: ResolveOptions): ResolverValue {\n const resolvedValue = resolveValue({\n schema,\n name: propName,\n context,\n formDataContext,\n });\n\n // Try to create a type alias for object types\n const aliased = createTypeAliasIfNeeded({\n resolvedValue,\n propName,\n context,\n });\n if (aliased) {\n return {\n ...aliased,\n originalSchema: resolvedValue.originalSchema,\n };\n }\n\n if (propName && resolvedValue.isEnum && !combined && !resolvedValue.isRef) {\n const doc = jsDoc(resolvedValue.originalSchema);\n const enumValue = getEnum(\n resolvedValue.value,\n propName,\n getEnumNames(resolvedValue.originalSchema),\n context.output.override.enumGenerationType,\n getEnumDescriptions(resolvedValue.originalSchema),\n context.output.override.namingConvention.enum,\n );\n\n return {\n value: propName,\n imports: [{ name: propName }],\n schemas: [\n ...resolvedValue.schemas,\n {\n name: propName,\n model: doc + enumValue,\n imports: resolvedValue.imports,\n dependencies: resolvedValue.dependencies,\n },\n ],\n isEnum: false,\n type: 'enum',\n originalSchema: resolvedValue.originalSchema,\n isRef: resolvedValue.isRef,\n hasReadonlyProps: resolvedValue.hasReadonlyProps,\n dependencies: [...resolvedValue.dependencies, propName],\n };\n }\n\n return resolvedValue;\n}\n\nconst resolveObjectCacheMap = new Map<string, ResolverValue>();\n\nexport function resolveObject({\n schema,\n propName,\n combined = false,\n context,\n formDataContext,\n}: ResolveOptions): ResolverValue {\n const hashKey = JSON.stringify({\n schema,\n propName,\n combined,\n projectName: context.projectName ?? context.output.target,\n formDataContext,\n dynamicScope: context.dynamicScope,\n });\n\n if (resolveObjectCacheMap.has(hashKey)) {\n // .has(...) guarantees existence\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return resolveObjectCacheMap.get(hashKey)!;\n }\n\n const result = resolveObjectOriginal({\n schema,\n propName,\n combined,\n context,\n formDataContext,\n });\n\n resolveObjectCacheMap.set(hashKey, result);\n\n return result;\n}\n","import { resolveExampleRefs } from '../resolvers';\nimport { resolveObject } from '../resolvers/object';\nimport type {\n ContextSpec,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n ResolverValue,\n ScalarValue,\n} from '../types';\nimport { compareVersions } from '../utils';\nimport type { FormDataContext } from './object';\n\ninterface GetArrayOptions {\n schema: OpenApiSchemaObject;\n name?: string;\n context: ContextSpec;\n formDataContext?: FormDataContext;\n}\n\n/**\n * Return the output type from an array\n *\n * @param item item with type === \"array\"\n */\nexport function getArray({\n schema,\n name,\n context,\n formDataContext,\n}: GetArrayOptions): ScalarValue {\n // Bridge assertions: extract typed values from AnyOtherAttribute-infected schema\n const schemaPrefixItems = schema.prefixItems as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n const schemaItems = schema.items as\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | undefined;\n const schemaExample = schema.example as unknown;\n const schemaExamples = schema.examples as Parameters<\n typeof resolveExampleRefs\n >[0];\n\n const itemSuffix = context.output.override.components.schemas.itemSuffix;\n if (schemaPrefixItems) {\n const resolvedObjects: ResolverValue[] = schemaPrefixItems.map(\n (item, index) =>\n resolveObject({\n schema: item,\n propName: name ? name + itemSuffix + String(index) : undefined,\n context,\n }),\n );\n if (schemaItems) {\n const additional = resolveObject({\n schema: schemaItems,\n propName: name ? name + itemSuffix + 'Additional' : undefined,\n context,\n });\n resolvedObjects.push({\n ...additional,\n value: `...${additional.value}[]`,\n });\n }\n return {\n type: 'array',\n isEnum: false,\n isRef: false,\n value: `[${resolvedObjects.map((o) => o.value).join(', ')}]`,\n imports: resolvedObjects.flatMap((o) => o.imports),\n schemas: resolvedObjects.flatMap((o) => o.schemas),\n dependencies: resolvedObjects.flatMap((o) => o.dependencies),\n hasReadonlyProps: resolvedObjects.some((o) => o.hasReadonlyProps),\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n }\n if (schemaItems) {\n const resolvedObject = resolveObject({\n schema: schemaItems,\n propName: name ? name + itemSuffix : undefined,\n context,\n formDataContext,\n });\n return {\n value: `${\n schema.readOnly === true &&\n !context.output.override.suppressReadonlyModifier\n ? 'readonly '\n : ''\n }${\n resolvedObject.value.includes('|') || resolvedObject.value.includes('&')\n ? `(${resolvedObject.value})[]`\n : `${resolvedObject.value}[]`\n }`,\n imports: resolvedObject.imports,\n schemas: resolvedObject.schemas,\n dependencies: resolvedObject.dependencies,\n isEnum: false,\n type: 'array',\n isRef: false,\n hasReadonlyProps: resolvedObject.hasReadonlyProps,\n example: schemaExample,\n examples: resolveExampleRefs(schemaExamples, context),\n };\n } else if (compareVersions(context.spec.openapi ?? '3.0.0', '3.1', '>=')) {\n return {\n value: 'unknown[]',\n imports: [],\n schemas: [],\n dependencies: [],\n isEnum: false,\n type: 'array',\n isRef: false,\n hasReadonlyProps: false,\n };\n } else {\n throw new Error(\n `All arrays must have an \\`items\\` key defined (name=${name}, schema=${JSON.stringify(schema)})`,\n );\n }\n}\n","import { keyword } from 'esutils';\nimport { uniqueBy } from 'remeda';\n\nimport { resolveObject } from '../resolvers/object';\nimport { resolveExampleRefs, resolveRef } from '../resolvers/ref';\nimport {\n type ContextSpec,\n FormDataArrayHandling,\n type GeneratorImport,\n type GetterResponse,\n type OpenApiEncodingObject,\n type OpenApiMediaTypeObject,\n type OpenApiReferenceObject,\n type OpenApiRequestBodyObject,\n type OpenApiResponseObject,\n type OpenApiSchemaObject,\n type ResReqTypesValue,\n} from '../types';\nimport { camel } from '../utils';\nimport { isReference } from '../utils/assertion';\nimport { pascal } from '../utils/case';\nimport {\n getFormDataFieldFileType,\n isBinaryContentType,\n} from '../utils/content-type';\nimport { getNumberWord } from '../utils/string';\nimport type { FormDataContext } from './object';\n\n// Bridge assertion helpers for AnyOtherAttribute-infected schema properties.\n// OpenAPI SchemaObject includes `[key: string]: any` which infects all property access.\n// These helpers centralize the cast so it appears once rather than at each access site.\nconst getSchemaType = (s: OpenApiSchemaObject) =>\n s.type as string | string[] | undefined;\nconst getSchemaCombined = (s: OpenApiSchemaObject) =>\n (s.oneOf ?? s.anyOf ?? s.allOf) as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\nconst getSchemaOneOf = (s: OpenApiSchemaObject) =>\n s.oneOf as (OpenApiSchemaObject | OpenApiReferenceObject)[] | undefined;\nconst getSchemaAnyOf = (s: OpenApiSchemaObject) =>\n s.anyOf as (OpenApiSchemaObject | OpenApiReferenceObject)[] | undefined;\nconst getSchemaItems = (s: OpenApiSchemaObject) =>\n s.items as OpenApiSchemaObject | OpenApiReferenceObject | undefined;\nconst getSchemaRequired = (s: OpenApiSchemaObject) =>\n s.required as string[] | undefined;\nconst getSchemaProperties = (s: OpenApiSchemaObject) =>\n s.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\nconst resolveSchemaRef = (\n schema: OpenApiSchemaObject | OpenApiReferenceObject,\n context: ContextSpec,\n) =>\n resolveRef(schema, context) as {\n schema: OpenApiSchemaObject;\n imports: GeneratorImport[];\n };\nconst resolveResponseOrRequestRef = (\n schema: OpenApiReferenceObject,\n context: ContextSpec,\n) =>\n resolveRef(schema, context) as {\n schema: OpenApiResponseObject | OpenApiRequestBodyObject;\n imports: GeneratorImport[];\n };\n\nconst formDataContentTypes = new Set(['multipart/form-data']);\n\nconst formUrlEncodedContentTypes = new Set([\n 'application/x-www-form-urlencoded',\n]);\n\ninterface GetResReqContentTypesOptions {\n mediaType: OpenApiMediaTypeObject;\n propName?: string;\n context: ContextSpec;\n isFormData?: boolean;\n contentType: string;\n}\n\nfunction getResReqContentTypes({\n mediaType,\n propName,\n context,\n isFormData,\n contentType,\n}: GetResReqContentTypesOptions) {\n if (!mediaType.schema) {\n return;\n }\n\n // For form bodies, pass context that tracks encoding for file type\n // detection. url-encoded bodies additionally flag `urlEncoded` so file/binary\n // fields are typed as `string` rather than `Blob` (#1624).\n const isFormUrlEncoded = formUrlEncodedContentTypes.has(contentType);\n const formDataContext: FormDataContext | undefined = isFormData\n ? { atPart: false, encoding: mediaType.encoding ?? {} }\n : isFormUrlEncoded\n ? { atPart: false, encoding: mediaType.encoding ?? {}, urlEncoded: true }\n : undefined;\n\n const resolvedObject = resolveObject({\n schema: mediaType.schema,\n propName,\n context,\n formDataContext,\n });\n\n // Known binary content type → Blob (overrides schema)\n // This ensures correct responseType ('blob') even when schema lacks format: binary.\n if (!isFormData && isBinaryContentType(contentType)) {\n return {\n ...resolvedObject,\n value: 'Blob',\n };\n }\n\n return resolvedObject;\n}\n\nexport function getResReqTypes(\n responsesOrRequests: [\n string,\n OpenApiReferenceObject | OpenApiResponseObject | OpenApiRequestBodyObject,\n ][],\n name: string,\n context: ContextSpec,\n defaultType = 'unknown',\n uniqueKey: (\n item: ResReqTypesValue,\n index: number,\n data: ResReqTypesValue[],\n ) => unknown = (item) => item.value,\n): ResReqTypesValue[] {\n const typesArray = responsesOrRequests\n .filter(([, res]) => Boolean(res))\n .map(([key, res]) => {\n if (isReference(res)) {\n const {\n schema: bodySchema,\n imports: [{ name, schemaName }],\n } = resolveResponseOrRequestRef(res, context);\n\n const firstEntry = Object.entries(bodySchema.content ?? {}).at(0);\n\n if (!firstEntry) {\n return [\n {\n value: name,\n imports: [{ name, schemaName }],\n schemas: [],\n type: 'unknown',\n isEnum: false,\n isRef: true,\n hasReadonlyProps: false,\n dependencies: [name],\n originalSchema: undefined,\n example: undefined,\n examples: undefined,\n key,\n contentType: '',\n },\n ] as ResReqTypesValue[];\n }\n\n const [contentType, mediaType] = firstEntry;\n\n const isFormData = formDataContentTypes.has(contentType);\n const isFormUrlEncoded = formUrlEncodedContentTypes.has(contentType);\n\n if ((!isFormData && !isFormUrlEncoded) || !mediaType.schema) {\n return [\n {\n value: name,\n imports: [{ name, schemaName }],\n schemas: [],\n type: 'unknown',\n isEnum: false,\n isRef: true,\n hasReadonlyProps: false,\n dependencies: [name],\n originalSchema: mediaType.schema,\n example: mediaType.example as unknown,\n examples: resolveExampleRefs(\n mediaType.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n key,\n contentType,\n },\n ] as ResReqTypesValue[];\n }\n\n const formData = isFormData\n ? getSchemaFormDataAndUrlEncoded({\n name,\n schemaObject: mediaType.schema,\n context,\n isRequestBodyOptional: bodySchema.required !== true,\n isRef: true,\n encoding: mediaType.encoding,\n })\n : undefined;\n\n const formUrlEncoded = isFormUrlEncoded\n ? getSchemaFormDataAndUrlEncoded({\n name,\n schemaObject: mediaType.schema,\n context,\n isRequestBodyOptional: bodySchema.required !== true,\n isUrlEncoded: true,\n isRef: true,\n encoding: mediaType.encoding,\n })\n : undefined;\n\n const additionalImports = getFormDataAdditionalImports({\n schemaObject: mediaType.schema,\n context,\n });\n\n return [\n {\n value: name,\n imports: [{ name, schemaName }, ...additionalImports],\n schemas: [],\n type: 'unknown',\n isEnum: false,\n hasReadonlyProps: false,\n dependencies: [name],\n formData,\n formUrlEncoded,\n isRef: true,\n originalSchema: mediaType.schema,\n example: mediaType.example,\n examples: resolveExampleRefs(mediaType.examples, context),\n key,\n contentType,\n },\n ] as ResReqTypesValue[];\n }\n\n if (res.content) {\n const contents = Object.entries(res.content).map(\n ([contentType, mediaType], index, arr) => {\n let propName = key ? pascal(name) + pascal(key) : undefined;\n\n if (propName && arr.length > 1) {\n propName = propName + pascal(getNumberWord(index + 1));\n }\n\n const isFormData = formDataContentTypes.has(contentType);\n const isFormUrlEncoded =\n formUrlEncodedContentTypes.has(contentType);\n\n // When schema is a $ref, use schema name for consistent param naming\n let effectivePropName = propName;\n if (mediaType.schema && isReference(mediaType.schema)) {\n const { imports } = resolveSchemaRef(mediaType.schema, context);\n if (imports[0]?.name) {\n effectivePropName = imports[0].name;\n }\n } else if ((isFormData || isFormUrlEncoded) && mediaType.schema) {\n // For form-data and url-encoded, the param name is also the\n // runtime variable iterated by the FormData/URLSearchParams code.\n // Derive it from the inner DTO names so it matches the function\n // parameter (#3242). Scoped to these content types: forcing the\n // schema name elsewhere aliases the import to `Foo as __Foo` in\n // split mode and broke the MSW mock filter (#3269).\n const combinedRefs =\n getSchemaOneOf(mediaType.schema) ??\n getSchemaAnyOf(mediaType.schema);\n if (combinedRefs) {\n const names: string[] = [];\n for (const ref of combinedRefs) {\n if (!isReference(ref)) continue;\n const refName = resolveSchemaRef(ref, context).imports[0]\n ?.name;\n if (refName) {\n names.push(refName);\n }\n }\n if (names.length > 0) {\n effectivePropName = names.join('');\n }\n }\n }\n\n const resolvedValue = getResReqContentTypes({\n mediaType,\n propName: effectivePropName,\n context,\n isFormData,\n contentType,\n });\n\n if (!resolvedValue) {\n // openapi spec 3.1 allows describing binary responses with only a content type\n if (isBinaryContentType(contentType)) {\n return {\n value: 'Blob',\n imports: [],\n schemas: [],\n type: 'Blob',\n isEnum: false,\n key,\n isRef: false,\n hasReadonlyProps: false,\n contentType,\n };\n }\n\n return;\n }\n\n if (\n (!isFormData && !isFormUrlEncoded) ||\n !effectivePropName ||\n !mediaType.schema\n ) {\n return {\n ...resolvedValue,\n imports: resolvedValue.imports,\n dependencies: resolvedValue.dependencies,\n contentType,\n example: mediaType.example,\n examples: resolveExampleRefs(mediaType.examples, context),\n };\n }\n\n const formData = isFormData\n ? getSchemaFormDataAndUrlEncoded({\n name: effectivePropName,\n schemaObject: mediaType.schema,\n context,\n isRequestBodyOptional: res.required !== true,\n isRef: true,\n encoding: mediaType.encoding,\n })\n : undefined;\n\n const formUrlEncoded = isFormUrlEncoded\n ? getSchemaFormDataAndUrlEncoded({\n name: effectivePropName,\n schemaObject: mediaType.schema,\n context,\n isUrlEncoded: true,\n isRequestBodyOptional: res.required !== true,\n isRef: true,\n encoding: mediaType.encoding,\n })\n : undefined;\n\n const additionalImports = getFormDataAdditionalImports({\n schemaObject: mediaType.schema,\n context,\n });\n return {\n ...resolvedValue,\n imports: [...resolvedValue.imports, ...additionalImports],\n formData,\n formUrlEncoded,\n contentType,\n example: mediaType.example as unknown,\n examples: resolveExampleRefs(\n mediaType.examples as\n | Record<string, OpenApiReferenceObject | { value?: unknown }>\n | undefined,\n context,\n ),\n };\n },\n );\n\n return contents\n .filter(Boolean)\n .map((x) => ({ ...x, key })) as ResReqTypesValue[];\n }\n const swaggerSchema =\n 'schema' in res\n ? (\n res as {\n schema?: OpenApiSchemaObject | OpenApiReferenceObject;\n }\n ).schema\n : undefined;\n\n if (swaggerSchema) {\n const propName = key ? pascal(name) + pascal(key) : undefined;\n const resolvedValue = resolveObject({\n schema: swaggerSchema,\n propName,\n context,\n });\n\n return [\n {\n ...resolvedValue,\n contentType: 'application/json',\n key,\n },\n ] as ResReqTypesValue[];\n }\n\n return [\n {\n value: defaultType,\n imports: [],\n schemas: [],\n type: defaultType,\n isEnum: false,\n dependencies: [],\n key,\n isRef: false,\n hasReadonlyProps: false,\n contentType: 'application/json',\n },\n ] as ResReqTypesValue[];\n });\n\n return uniqueBy(typesArray.flat(), uniqueKey);\n}\n\n/**\n * Response type categories for HTTP client response parsing.\n * Maps to Angular HttpClient's responseType, Axios responseType, and Fetch response methods.\n */\nexport type ResponseTypeCategory = 'json' | 'text' | 'blob' | 'arraybuffer';\n\n/**\n * Determine the responseType option based on success content types only.\n * This avoids error-response content types influencing the responseType.\n */\nexport function getSuccessResponseType(\n response: GetterResponse,\n): 'blob' | 'text' | undefined {\n const successContentTypes = response.types.success\n .map((t) => t.contentType)\n .filter(Boolean);\n\n if (response.isBlob) {\n return 'blob' as const;\n }\n\n const hasJsonResponse = successContentTypes.some(\n (contentType) =>\n contentType.includes('json') || contentType.includes('+json'),\n );\n const hasTextResponse = successContentTypes.some(\n (contentType) =>\n contentType.startsWith('text/') || contentType.includes('xml'),\n );\n\n if (!hasJsonResponse && hasTextResponse) {\n return 'text' as const;\n }\n\n return undefined;\n}\n\n/**\n * Determine the response type category for a given content type.\n * Used to set the correct responseType option in HTTP clients.\n *\n * @param contentType - The MIME content type (e.g., 'application/json', 'text/plain')\n * @returns The response type category to use for parsing\n */\nexport function getResponseTypeCategory(\n contentType: string,\n): ResponseTypeCategory {\n // Binary types → blob\n if (isBinaryContentType(contentType)) {\n return 'blob';\n }\n\n // JSON types\n if (\n contentType === 'application/json' ||\n contentType.includes('+json') ||\n contentType.includes('-json')\n ) {\n return 'json';\n }\n\n // Everything else is text (text/*, application/xml, etc.)\n return 'text';\n}\n\n/**\n * Get the default content type from a list of content types.\n * Priority: application/json > any JSON-like type > first in list\n *\n * @param contentTypes - Array of content types from OpenAPI spec\n * @returns The default content type to use\n */\nexport function getDefaultContentType(contentTypes: string[]): string {\n if (contentTypes.length === 0) {\n return 'application/json';\n }\n\n // Prefer application/json\n if (contentTypes.includes('application/json')) {\n return 'application/json';\n }\n\n // Prefer any JSON-like type\n const jsonType = contentTypes.find(\n (ct) => ct.includes('+json') || ct.includes('-json'),\n );\n if (jsonType) {\n return jsonType;\n }\n\n // Default to first\n return contentTypes[0];\n}\n\ninterface GetFormDataAdditionalImportsOptions {\n schemaObject: OpenApiSchemaObject | OpenApiReferenceObject;\n context: ContextSpec;\n}\n\nfunction getFormDataAdditionalImports({\n schemaObject,\n context,\n}: GetFormDataAdditionalImportsOptions): GeneratorImport[] {\n const { schema } = resolveSchemaRef(schemaObject, context);\n\n if (schema.type !== 'object') {\n return [];\n }\n\n const combinedSchemas = getSchemaOneOf(schema) ?? getSchemaAnyOf(schema);\n\n if (!combinedSchemas) {\n return [];\n }\n\n return combinedSchemas\n .map((subSchema) => resolveSchemaRef(subSchema, context).imports[0])\n .filter(Boolean);\n}\n\ninterface GetSchemaFormDataAndUrlEncodedOptions {\n name: string;\n schemaObject: OpenApiSchemaObject | OpenApiReferenceObject;\n context: ContextSpec;\n isRequestBodyOptional: boolean;\n isUrlEncoded?: boolean;\n isRef?: boolean;\n encoding?: Record<string, OpenApiEncodingObject>;\n}\n\nfunction getSchemaFormDataAndUrlEncoded({\n name,\n schemaObject,\n context,\n isRequestBodyOptional,\n isUrlEncoded,\n isRef,\n encoding,\n}: GetSchemaFormDataAndUrlEncodedOptions): string {\n const { schema, imports } = resolveSchemaRef(schemaObject, context);\n const propName = camel(\n !isRef && isReference(schemaObject) ? imports[0].name : name,\n );\n\n const variableName = isUrlEncoded ? 'formUrlEncoded' : 'formData';\n let form = isUrlEncoded\n ? `const ${variableName} = new URLSearchParams();\\n`\n : `const ${variableName} = new FormData();\\n`;\n\n const combinedSchemas = getSchemaCombined(schema);\n if (\n schema.type === 'object' ||\n (schema.type === undefined && combinedSchemas)\n ) {\n if (combinedSchemas) {\n const shouldCast = !!getSchemaOneOf(schema) || !!getSchemaAnyOf(schema);\n\n if (shouldCast) {\n // If the outer schema also has direct properties, those are handled\n // below by the dedicated properties branch. Skip them here to avoid\n // appending the same key twice. Exclude readOnly direct properties\n // so they can still flow through the runtime loop if a variant\n // declares the same key as writable.\n const directProperties = getSchemaProperties(schema);\n const directKeys = directProperties\n ? Object.entries(directProperties)\n .filter(\n ([, value]) =>\n !resolveSchemaRef(value, context).schema.readOnly,\n )\n .map(([key]) => key)\n : [];\n const skipLine =\n directKeys.length > 0\n ? ` if ([${directKeys.map((k) => JSON.stringify(k)).join(', ')}].includes(key)) return;\\n`\n : '';\n\n form += `Object.entries(${propName} ?? {}).forEach(([key, value]) => {\\n`;\n form += skipLine;\n form += ` if (value !== undefined && value !== null) {\\n`;\n if (isUrlEncoded) {\n // url-encoded: URLSearchParams holds strings only, so File/Blob/\n // Buffer handling does not apply — coerce every value to string (#1624)\n form += ` if (Array.isArray(value)) {\\n`;\n form += ` value.forEach(v => {\\n`;\n form += ` ${variableName}.append(key, typeof v === 'object' ? JSON.stringify(v) : String(v));\\n`;\n form += ` });\\n`;\n form += ` } else if (typeof value === 'object') {\\n`;\n form += ` ${variableName}.append(key, JSON.stringify(value));\\n`;\n form += ` } else {\\n`;\n form += ` ${variableName}.append(key, String(value));\\n`;\n form += ` }\\n`;\n } else {\n form += ` if ((typeof File !== 'undefined' && value instanceof File) || value instanceof Blob) {\\n`;\n form += ` ${variableName}.append(key, value);\\n`;\n form += ` } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(value)) {\\n`;\n form += ` ${variableName}.append(key, new Blob([Uint8Array.from(value)]));\\n`;\n form += ` } else if (Array.isArray(value)) {\\n`;\n form += ` value.forEach(v => {\\n`;\n form += ` if ((typeof File !== 'undefined' && v instanceof File) || v instanceof Blob) {\\n`;\n form += ` ${variableName}.append(key, v);\\n`;\n form += ` } else if (typeof Buffer !== 'undefined' && Buffer.isBuffer(v)) {\\n`;\n form += ` ${variableName}.append(key, new Blob([Uint8Array.from(v)]));\\n`;\n form += ` } else {\\n`;\n form += ` ${variableName}.append(key, typeof v === 'object' ? JSON.stringify(v) : String(v));\\n`;\n form += ` }\\n`;\n form += ` });\\n`;\n form += ` } else if (typeof value === 'object') {\\n`;\n form += ` ${variableName}.append(key, JSON.stringify(value));\\n`;\n form += ` } else {\\n`;\n form += ` ${variableName}.append(key, String(value));\\n`;\n form += ` }\\n`;\n }\n form += ` }\\n`;\n form += `});\\n`;\n } else {\n const combinedSchemasFormData = combinedSchemas\n .map((subSchema) => {\n const { schema: combinedSchema } = resolveSchemaRef(\n subSchema,\n context,\n );\n return resolveSchemaPropertiesToFormData({\n schema: combinedSchema,\n variableName,\n propName,\n context,\n isRequestBodyOptional,\n encoding,\n });\n })\n .filter(Boolean)\n .join('\\n');\n\n form += combinedSchemasFormData;\n }\n }\n\n if (schema.properties) {\n const formDataValues = resolveSchemaPropertiesToFormData({\n schema,\n variableName,\n propName,\n context,\n isRequestBodyOptional,\n encoding,\n });\n\n form += formDataValues;\n }\n\n return form;\n }\n\n if (schema.type === 'array') {\n let valueStr = 'value';\n const schemaItems = getSchemaItems(schema);\n if (schemaItems) {\n const { schema: itemSchema } = resolveSchemaRef(schemaItems, context);\n if (itemSchema.type === 'object' || itemSchema.type === 'array') {\n valueStr = 'JSON.stringify(value)';\n } else if (\n itemSchema.type === 'number' ||\n itemSchema.type === 'integer' ||\n itemSchema.type === 'boolean'\n ) {\n valueStr = 'value.toString()';\n }\n }\n\n return `${form}${propName}.forEach(value => ${variableName}.append('data', ${valueStr}))\\n`;\n }\n\n if (\n schema.type === 'number' ||\n schema.type === 'integer' ||\n schema.type === 'boolean'\n ) {\n return `${form}${variableName}.append('data', ${propName}.toString())\\n`;\n }\n\n return `${form}${variableName}.append('data', ${propName})\\n`;\n}\n\ninterface ResolveSchemaPropertiesToFormDataOptions {\n schema: OpenApiSchemaObject;\n variableName: string;\n propName: string;\n context: ContextSpec;\n isRequestBodyOptional: boolean;\n keyPrefix?: string;\n depth?: number;\n encoding?: Record<string, OpenApiEncodingObject>;\n}\n\nfunction resolveSchemaPropertiesToFormData({\n schema,\n variableName,\n propName,\n context,\n isRequestBodyOptional,\n keyPrefix = '',\n depth = 0,\n encoding,\n}: ResolveSchemaPropertiesToFormDataOptions): string {\n let formDataValues = '';\n // url-encoded bodies use URLSearchParams (string values only), so file/binary\n // fields are appended as plain strings rather than wrapped in a Blob (#1624).\n const isUrlEncoded = variableName === 'formUrlEncoded';\n const schemaProps = getSchemaProperties(schema) ?? {};\n for (const [key, value] of Object.entries(schemaProps)) {\n const { schema: property } = resolveSchemaRef(value, context);\n\n // Skip readOnly properties for formData\n if (property.readOnly) {\n continue;\n }\n\n let formDataValue = '';\n\n // Get encoding.contentType for this field (only at top level, depth === 0)\n const fieldEncoding = depth === 0 ? encoding?.[key] : undefined;\n const partContentType = fieldEncoding?.contentType;\n\n const formattedKeyPrefix = isRequestBodyOptional\n ? keyword.isIdentifierNameES5(key)\n ? '?'\n : '?.'\n : '';\n const formattedKey = keyword.isIdentifierNameES5(key)\n ? `.${key}`\n : `['${key}']`;\n\n const valueKey = `${propName}${formattedKeyPrefix}${formattedKey}`;\n const nonOptionalValueKey = `${propName}${formattedKey}`;\n\n // Use shared file type detection (same logic as type generation)\n const fileType = getFormDataFieldFileType(property, partContentType);\n const effectiveContentType =\n partContentType ?? (property.contentMediaType as string | undefined);\n\n if (isUrlEncoded && (fileType || property.format === 'binary')) {\n // url-encoded: file/binary fields are plain strings (URLSearchParams)\n formDataValue = `${variableName}.append(\\`${keyPrefix}${key}\\`, ${nonOptionalValueKey});\\n`;\n } else if (fileType === 'binary' || property.format === 'binary') {\n // Binary: append directly (value is Blob)\n formDataValue = `${variableName}.append(\\`${keyPrefix}${key}\\`, ${nonOptionalValueKey});\\n`;\n } else if (fileType === 'text') {\n // Text file: value is Blob | string, check at runtime\n formDataValue = `${variableName}.append(\\`${keyPrefix}${key}\\`, ${nonOptionalValueKey} instanceof Blob ? ${nonOptionalValueKey} : new Blob([${nonOptionalValueKey}], { type: '${effectiveContentType}' }));\\n`;\n } else if (\n property.type === 'object' ||\n (Array.isArray(property.type) && property.type.includes('object'))\n ) {\n formDataValue =\n context.output.override.formData.arrayHandling ===\n FormDataArrayHandling.EXPLODE\n ? resolveSchemaPropertiesToFormData({\n schema: property,\n variableName,\n propName: nonOptionalValueKey,\n context,\n isRequestBodyOptional,\n keyPrefix: `${keyPrefix}${key}.`,\n depth: depth + 1,\n encoding,\n })\n : `${variableName}.append(\\`${keyPrefix}${key}\\`, JSON.stringify(${nonOptionalValueKey}));\\n`;\n } else if (\n property.type === 'array' ||\n (Array.isArray(property.type) && property.type.includes('array'))\n ) {\n let valueStr = 'value';\n let hasNonPrimitiveChild = false;\n const propertyItems = getSchemaItems(property);\n if (propertyItems) {\n const { schema: itemSchema } = resolveSchemaRef(propertyItems, context);\n if (itemSchema.type === 'object' || itemSchema.type === 'array') {\n if (\n context.output.override.formData.arrayHandling ===\n FormDataArrayHandling.EXPLODE\n ) {\n hasNonPrimitiveChild = true;\n const resolvedValue = resolveSchemaPropertiesToFormData({\n schema: itemSchema,\n variableName,\n propName: 'value',\n context,\n isRequestBodyOptional,\n keyPrefix: `${keyPrefix}${key}[\\${index${depth > 0 ? depth : ''}}].`,\n depth: depth + 1,\n });\n formDataValue = `${valueKey}.forEach((value, index${depth > 0 ? depth : ''}) => {\n ${resolvedValue}});\\n`;\n } else {\n valueStr = 'JSON.stringify(value)';\n }\n } else {\n const itemType = getSchemaType(itemSchema);\n if (\n itemType === 'number' ||\n (Array.isArray(itemType) && itemType.includes('number')) ||\n itemType === 'integer' ||\n (Array.isArray(itemType) && itemType.includes('integer')) ||\n itemType === 'boolean' ||\n (Array.isArray(itemType) && itemType.includes('boolean'))\n ) {\n valueStr = 'value.toString()';\n }\n }\n }\n if (\n context.output.override.formData.arrayHandling ===\n FormDataArrayHandling.EXPLODE\n ) {\n if (!hasNonPrimitiveChild) {\n formDataValue = `${valueKey}.forEach((value, index${depth > 0 ? depth : ''}) => ${variableName}.append(\\`${keyPrefix}${key}[\\${index${depth > 0 ? depth : ''}}]\\`, ${valueStr}));\\n`;\n }\n } else {\n formDataValue = `${valueKey}.forEach(value => ${variableName}.append(\\`${keyPrefix}${key}${context.output.override.formData.arrayHandling === FormDataArrayHandling.SERIALIZE_WITH_BRACKETS ? '[]' : ''}\\`, ${valueStr}));\\n`;\n }\n } else if (\n (() => {\n const propType = getSchemaType(property);\n return (\n propType === 'number' ||\n (Array.isArray(propType) && propType.includes('number')) ||\n propType === 'integer' ||\n (Array.isArray(propType) && propType.includes('integer')) ||\n propType === 'boolean' ||\n (Array.isArray(propType) && propType.includes('boolean'))\n );\n })()\n ) {\n formDataValue = `${variableName}.append(\\`${keyPrefix}${key}\\`, ${nonOptionalValueKey}.toString())\\n`;\n } else {\n formDataValue = `${variableName}.append(\\`${keyPrefix}${key}\\`, ${nonOptionalValueKey});\\n`;\n }\n\n let existSubSchemaNullable = false;\n const combine = getSchemaCombined(property);\n if (combine) {\n const subSchemas = combine.map((c) =>\n resolveObject({ schema: c, combined: true, context: context }),\n );\n if (\n subSchemas.some((subSchema) => {\n return ['number', 'integer', 'boolean'].includes(subSchema.type);\n })\n ) {\n formDataValue = `${variableName}.append(\\`${key}\\`, ${nonOptionalValueKey}.toString())\\n`;\n }\n\n if (\n subSchemas.some((subSchema) => {\n return subSchema.type === 'null';\n })\n ) {\n existSubSchemaNullable = true;\n }\n }\n\n const schemaRequired = getSchemaRequired(schema);\n const isRequired = schemaRequired?.includes(key) && !isRequestBodyOptional;\n\n const propType = getSchemaType(property);\n if (\n property.nullable ||\n (Array.isArray(propType) && propType.includes('null')) ||\n existSubSchemaNullable\n ) {\n if (isRequired) {\n formDataValues += `if(${valueKey} !== null) {\\n ${formDataValue} }\\n`;\n continue;\n }\n\n formDataValues += `if(${valueKey} !== undefined && ${nonOptionalValueKey} !== null) {\\n ${formDataValue} }\\n`;\n continue;\n }\n\n if (isRequired) {\n formDataValues += formDataValue;\n continue;\n }\n\n formDataValues += `if(${valueKey} !== undefined) {\\n ${formDataValue} }\\n`;\n }\n\n return formDataValues;\n}\n","import { generalJSTypesWithArray } from '../constants';\nimport { resolveRef } from '../resolvers';\nimport type {\n ContextSpec,\n GetterBody,\n OpenApiReferenceObject,\n OpenApiRequestBodyObject,\n OverrideOutputContentType,\n ResReqTypesValue,\n} from '../types';\nimport { camel, filterByContentType, isReference, sanitize } from '../utils';\nimport { getResReqTypes } from './res-req-types';\n\ninterface GetBodyOptions {\n requestBody: OpenApiReferenceObject | OpenApiRequestBodyObject;\n operationName: string;\n context: ContextSpec;\n contentType?: OverrideOutputContentType;\n}\n\nfunction buildBody(\n filteredBodyTypes: ResReqTypesValue[],\n requestBody: OpenApiReferenceObject | OpenApiRequestBodyObject,\n operationName: string,\n context: ContextSpec,\n): GetterBody {\n const imports = filteredBodyTypes.flatMap(({ imports }) => imports);\n const schemas = filteredBodyTypes.flatMap(({ schemas }) => schemas);\n\n const definition = filteredBodyTypes.map(({ value }) => value).join(' | ');\n const hasReadonlyProps = filteredBodyTypes.some((x) => x.hasReadonlyProps);\n const nonReadonlyDefinition =\n hasReadonlyProps &&\n definition &&\n context.output.override.preserveReadonlyRequestBodies !== 'preserve'\n ? `NonReadonly<${definition}>`\n : definition;\n\n let implementation =\n generalJSTypesWithArray.includes(definition.toLowerCase()) ||\n filteredBodyTypes.length > 1\n ? camel(operationName) +\n context.output.override.components.requestBodies.suffix\n : camel(definition);\n\n let isOptional = false;\n if (implementation) {\n implementation = sanitize(implementation, {\n underscore: '_',\n whitespace: '_',\n dash: true,\n es5keyword: true,\n es5IdentifierName: true,\n });\n if (isReference(requestBody)) {\n const { schema: bodySchema }: { schema: OpenApiRequestBodyObject } =\n resolveRef(requestBody, context);\n isOptional = bodySchema.required !== true;\n } else {\n isOptional = requestBody.required !== true;\n }\n }\n\n return {\n originalSchema: requestBody,\n definition: nonReadonlyDefinition,\n implementation,\n imports,\n schemas,\n isOptional,\n ...(filteredBodyTypes.length === 1\n ? {\n formData: filteredBodyTypes[0].formData,\n formUrlEncoded: filteredBodyTypes[0].formUrlEncoded,\n contentType: filteredBodyTypes[0].contentType,\n }\n : {\n formData: '',\n formUrlEncoded: '',\n contentType: '',\n }),\n };\n}\n\nexport function getBody({\n requestBody,\n operationName,\n context,\n contentType,\n}: GetBodyOptions): GetterBody {\n const allBodyTypes = getResReqTypes(\n [[context.output.override.components.requestBodies.suffix, requestBody]],\n operationName,\n context,\n );\n\n const filteredBodyTypes = filterByContentType(allBodyTypes, contentType);\n\n return buildBody(filteredBodyTypes, requestBody, operationName, context);\n}\n\n/**\n * Returns per-content-type bodies when `splitByContentType` is enabled.\n * Each entry includes a `contentTypeSuffix` for generating distinct function names.\n */\nexport function getBodiesByContentType({\n requestBody,\n operationName,\n context,\n contentType,\n}: GetBodyOptions): (GetterBody & { contentTypeSuffix: string })[] {\n const allBodyTypes = getResReqTypes(\n [[context.output.override.components.requestBodies.suffix, requestBody]],\n operationName,\n context,\n undefined,\n (item) => `${item.value}::${item.contentType}`,\n );\n\n const filteredBodyTypes = filterByContentType(allBodyTypes, contentType);\n\n // If there's only one content type, no need to split\n if (filteredBodyTypes.length <= 1) {\n return [\n {\n ...buildBody(filteredBodyTypes, requestBody, operationName, context),\n contentTypeSuffix: '',\n },\n ];\n }\n\n return filteredBodyTypes.map((bodyType) => {\n const suffix = getContentTypeSuffix(bodyType.contentType);\n const body = buildBody([bodyType], requestBody, operationName, context);\n return {\n ...body,\n contentTypeSuffix: suffix,\n };\n });\n}\n\nconst CONTENT_TYPE_SUFFIX_MAP: Record<string, string> = {\n 'application/json': 'Json',\n 'multipart/form-data': 'FormData',\n 'application/x-www-form-urlencoded': 'UrlEncoded',\n 'text/plain': 'Text',\n 'application/xml': 'Xml',\n 'text/xml': 'Xml',\n 'application/octet-stream': 'Blob',\n};\n\nfunction getContentTypeSuffix(contentType: string): string {\n if (CONTENT_TYPE_SUFFIX_MAP[contentType]) {\n return CONTENT_TYPE_SUFFIX_MAP[contentType];\n }\n // For unknown content types, derive a PascalCase suffix from the subtype\n const subtype = contentType.split('/')[1] ?? contentType;\n return subtype\n .split(/[-+.]/)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join('');\n}\n","import { isArray, isBoolean } from 'remeda';\n\nimport type {\n ContextSpec,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n OpenApiSchemasObject,\n} from '../types';\nimport { getPropertySafe, isReference, pascal } from '../utils';\nimport { getRefInfo } from './ref';\n\nexport function resolveDiscriminators(\n schemas: OpenApiSchemasObject,\n context: ContextSpec,\n): OpenApiSchemasObject {\n const transformedSchemas = schemas;\n for (const schema of Object.values(transformedSchemas)) {\n if (isBoolean(schema)) {\n continue; // skip boolean schemas as we can't do anything meaningful with them\n }\n\n // Some specs incorrectly nest `oneOf` under `discriminator`.\n // hoist it to the schema level so union generation still works.\n const discriminator = schema.discriminator as\n | { oneOf?: OpenApiSchemasObject[string][] }\n | undefined;\n\n if (!schema.oneOf && isArray(discriminator?.oneOf)) {\n schema.oneOf = discriminator.oneOf;\n }\n\n if (schema.discriminator?.mapping) {\n const { mapping, propertyName } = schema.discriminator;\n\n for (const [mappingKey, mappingValue] of Object.entries(mapping)) {\n let subTypeSchema;\n\n try {\n const { originalName } = getRefInfo(mappingValue, context);\n // name from getRefInfo may contain a suffix, which we don't want\n const name = pascal(originalName);\n subTypeSchema =\n transformedSchemas[name] ?? transformedSchemas[originalName];\n } catch {\n subTypeSchema = transformedSchemas[mappingValue];\n }\n\n if (isBoolean(subTypeSchema) || propertyName === undefined) {\n continue;\n }\n\n const property = subTypeSchema.properties?.[propertyName];\n if (isBoolean(property)) {\n continue;\n }\n\n const schemaProperty =\n property && !isReference(property) ? property : undefined;\n\n const enumProperty = schemaProperty\n ? getPropertySafe(schemaProperty, 'enum')\n : { hasProperty: false as const, value: undefined };\n\n const enumValues: unknown[] | undefined =\n enumProperty.hasProperty && Array.isArray(enumProperty.value)\n ? enumProperty.value\n : undefined;\n\n const propertyType =\n (schemaProperty?.type as string | undefined) ?? 'string';\n\n let typedMappingKey: string | number | boolean = mappingKey;\n if (propertyType === 'boolean') {\n typedMappingKey = mappingKey === 'true';\n } else if (propertyType === 'number' || propertyType === 'integer') {\n const parsed = Number(mappingKey);\n if (!Number.isNaN(parsed)) {\n typedMappingKey = parsed;\n }\n }\n\n const mergedEnumValues = [\n ...(enumValues ?? []).filter((value) => value !== typedMappingKey),\n typedMappingKey,\n ];\n\n // @see https://github.com/orval-labs/orval/issues/3139\n const mergedProperty = {\n ...schemaProperty,\n type: propertyType,\n enum: mergedEnumValues,\n };\n delete (mergedProperty as Record<string, unknown>).const;\n\n subTypeSchema.properties = {\n ...subTypeSchema.properties,\n [propertyName]: mergedProperty,\n };\n subTypeSchema.required = [\n ...new Set([...(subTypeSchema.required ?? []), propertyName]),\n ];\n }\n }\n }\n\n // Break the circular type-alias that forms when a discriminator parent has\n // top-level `oneOf` listing variants that inherit via `allOf: [$ref: parent, ...]`.\n // The parent emits as `type Parent = (Variant1 & {...}) | ...` and each variant\n // would emit as `type VariantN = Omit<Parent, key> & {...}`, producing TS2456.\n // Rewrite each variant's `$ref` back to the parent by inlining the parent's\n // non-discriminator properties (or dropping the entry entirely when the parent\n // contributes nothing beyond the discriminator key). See issue #3432.\n for (const [parentName, parentSchema] of Object.entries(transformedSchemas)) {\n if (isBoolean(parentSchema)) {\n continue;\n }\n if (!parentSchema.oneOf || !parentSchema.discriminator?.mapping) {\n continue;\n }\n const { mapping, propertyName } = parentSchema.discriminator;\n if (!propertyName) {\n continue;\n }\n\n const parentProperties = parentSchema.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\n const parentRequired = parentSchema.required;\n const inheritableProps: Record<\n string,\n OpenApiSchemaObject | OpenApiReferenceObject\n > = {};\n if (parentProperties) {\n for (const [key, value] of Object.entries(parentProperties)) {\n if (key !== propertyName) {\n inheritableProps[key] = value;\n }\n }\n }\n const inheritableRequired = parentRequired?.filter(\n (key) => key !== propertyName,\n );\n const hasInheritableProps = Object.keys(inheritableProps).length > 0;\n\n for (const mappingValue of Object.values(mapping)) {\n let variantSchema;\n try {\n const { originalName } = getRefInfo(mappingValue, context);\n const name = pascal(originalName);\n variantSchema =\n transformedSchemas[name] ?? transformedSchemas[originalName];\n } catch {\n variantSchema = transformedSchemas[mappingValue];\n }\n if (!variantSchema || isBoolean(variantSchema)) {\n continue;\n }\n const variantAllOf = variantSchema.allOf as\n | (OpenApiSchemaObject | OpenApiReferenceObject)[]\n | undefined;\n if (!variantAllOf) {\n continue;\n }\n\n const rewritten: (OpenApiSchemaObject | OpenApiReferenceObject)[] = [];\n for (const item of variantAllOf) {\n if (!isReference(item) || !item.$ref) {\n rewritten.push(item);\n continue;\n }\n let refOriginalName: string | undefined;\n try {\n refOriginalName = getRefInfo(item.$ref, context).originalName;\n } catch {\n refOriginalName = undefined;\n }\n const refMatchesParent =\n refOriginalName === parentName ||\n (refOriginalName !== undefined &&\n pascal(refOriginalName) === pascal(parentName));\n if (!refMatchesParent) {\n rewritten.push(item);\n continue;\n }\n // Preserve the parent's other object-level constraints\n // (additionalProperties, minProperties, description, etc.) by shallow-\n // cloning the parent and only stripping the parts that would re-create\n // the cycle or are now meaningless on the variant.\n const inlinedParent = {\n ...(parentSchema as Record<string, unknown>),\n } as OpenApiSchemaObject;\n delete (inlinedParent as Record<string, unknown>).oneOf;\n delete (inlinedParent as Record<string, unknown>).discriminator;\n delete (inlinedParent as Record<string, unknown>).allOf;\n delete (inlinedParent as Record<string, unknown>).anyOf;\n\n if (hasInheritableProps) {\n // Fresh per-variant clone so downstream in-place mutations on one\n // variant don't leak across siblings.\n inlinedParent.properties = { ...inheritableProps };\n } else {\n delete (inlinedParent as Record<string, unknown>).properties;\n }\n if (inheritableRequired && inheritableRequired.length > 0) {\n inlinedParent.required = [...inheritableRequired];\n } else {\n delete (inlinedParent as Record<string, unknown>).required;\n }\n\n // Drop the entry entirely when the parent contributed nothing beyond\n // a bare `type: 'object'` — the second allOf member (the variant's\n // own inline object) already asserts object-ness.\n const meaningfulKeys = Object.keys(\n inlinedParent as Record<string, unknown>,\n ).filter((key) => key !== 'type');\n if (meaningfulKeys.length > 0) {\n rewritten.push(inlinedParent);\n }\n }\n\n if (rewritten.length === 0) {\n delete (variantSchema as Record<string, unknown>).allOf;\n } else {\n variantSchema.allOf = rewritten;\n }\n }\n }\n\n return transformedSchemas;\n}\n","import { type OpenApiOperationObject, Verbs } from '../types';\nimport { isString, pascal, sanitize } from '../utils';\n\nexport function getOperationId(\n operation: OpenApiOperationObject,\n route: string,\n verb: Verbs,\n): string {\n if (isString(operation.operationId)) {\n return operation.operationId;\n }\n\n return pascal(\n [\n verb,\n ...route.split('/').map((p) =>\n sanitize(p, {\n dash: true,\n underscore: '-',\n dot: '-',\n whitespace: '-',\n }),\n ),\n ].join('-'),\n );\n}\n","import { resolveRef } from '../resolvers/ref';\nimport type {\n ContextSpec,\n GetterParameters,\n OpenApiParameterObject,\n OpenApiReferenceObject,\n} from '../types';\nimport { isReference } from '../utils';\nimport { isComponentRef } from './ref';\n\ninterface GetParametersOptions {\n parameters: (OpenApiReferenceObject | OpenApiParameterObject)[];\n context: ContextSpec;\n}\n\nexport function getParameters({\n parameters,\n context,\n}: GetParametersOptions): GetterParameters {\n const result: GetterParameters = { path: [], query: [], header: [] };\n for (const p of parameters) {\n if (isReference(p)) {\n const { schema, imports } = resolveRef(p, context);\n const parameter = schema as OpenApiParameterObject;\n\n const location = parameter.in;\n if (\n location === 'path' ||\n location === 'query' ||\n location === 'header'\n ) {\n // Refs that don't target a named component slot (e.g. bundler-emitted\n // `#/paths/.../parameters/0`) have no corresponding `export type` from\n // `generateParameterDefinition`, so emitting a named import would\n // dangle. Inline the resolved parameter's schema instead. Mirrors the\n // #398 fix in `resolvers/value.ts`. See issue #1879.\n const safeImports = p.$ref && isComponentRef(p.$ref) ? imports : [];\n result[location].push({ parameter, imports: safeImports });\n }\n } else {\n if (p.in === 'query' || p.in === 'path' || p.in === 'header') {\n result[p.in].push({ parameter: p, imports: [] });\n }\n }\n }\n return result;\n}\n","import { resolveValue } from '../resolvers';\nimport type {\n ContextSpec,\n GetterParameters,\n GetterParams,\n NormalizedOutputOptions,\n} from '../types';\nimport { camel, sanitize, stringify } from '../utils';\n\n/**\n * Return every params in a path\n *\n * @example\n * ```\n * getParamsInPath(\"/pet/{category}/{name}/\");\n * // => [\"category\", \"name\"]\n * ```\n * @param path\n */\nexport function getParamsInPath(path: string) {\n let n;\n const output = [];\n const templatePathRegex = /\\{(.*?)\\}/g;\n while ((n = templatePathRegex.exec(path)) !== null) {\n output.push(n[1]);\n }\n\n return output;\n}\n\ninterface GetParamsOptions {\n route: string;\n pathParams?: GetterParameters['query'];\n operationId: string;\n context: ContextSpec;\n output: NormalizedOutputOptions;\n}\n\nexport function getParams({\n route,\n pathParams = [],\n operationId,\n context,\n output,\n}: GetParamsOptions): GetterParams {\n const params = getParamsInPath(route);\n return params.map((p) => {\n const pathParam = pathParams.find(\n ({ parameter }) =>\n sanitize(camel(parameter.name), {\n es5keyword: true,\n underscore: true,\n dash: true,\n }) === p,\n );\n\n if (!pathParam) {\n throw new Error(\n `The path params ${p} can't be found in parameters (${operationId})`,\n );\n }\n\n const {\n name: nameWithoutSanitize,\n required = false,\n schema,\n } = pathParam.parameter;\n\n const name = sanitize(camel(nameWithoutSanitize), { es5keyword: true });\n\n if (!schema) {\n return {\n name,\n definition: `${name}${required ? '' : '?'}: unknown`,\n implementation: `${name}${required ? '' : '?'}: unknown`,\n default: false,\n required,\n imports: [],\n };\n }\n\n const resolvedValue = resolveValue({\n schema,\n context,\n });\n\n const originalSchema = resolvedValue.originalSchema;\n\n // Bridge assertion: .default returns any due to AnyOtherAttribute on OpenApiSchemaObject\n const schemaDefault = originalSchema.default as\n | string\n | Record<string, unknown>\n | unknown[]\n | undefined;\n\n let paramType = resolvedValue.value;\n if (output.allParamsOptional) {\n paramType = `${paramType} | undefined | null`; // TODO: maybe check that `paramType` isn't already undefined or null\n }\n\n const definition = `${name}${\n !required || schemaDefault ? '?' : ''\n }: ${paramType}`;\n\n const implementation = `${name}${!required && !schemaDefault ? '?' : ''}${\n schemaDefault\n ? `: ${paramType} = ${stringify(schemaDefault)}`\n : `: ${paramType}` // FIXME: in Vue if we have `version: MaybeRef<number | undefined | null> = 1` and we don't pass version, the unref(version) will be `undefined` and not `1`, so we need to handle default value somewhere in implementation and not in the definition\n }`;\n\n return {\n name,\n definition,\n implementation,\n default: schemaDefault,\n required,\n imports: resolvedValue.imports,\n originalSchema,\n };\n });\n}\n","import {\n type ContextSpec,\n type GetterBody,\n type GetterParams,\n type GetterProps,\n GetterPropType,\n type GetterQueryParam,\n} from '../types';\nimport { isNullish, pascal, sortByPriority, stringify } from '../utils';\n\ninterface GetPropsOptions {\n body: GetterBody;\n queryParams?: GetterQueryParam;\n params: GetterParams;\n operationName: string;\n headers?: GetterQueryParam;\n context: ContextSpec;\n}\n\nexport function getProps({\n body,\n queryParams,\n params,\n operationName,\n headers,\n context,\n}: GetPropsOptions): GetterProps {\n const bodyProp = {\n name: body.implementation,\n definition: `${body.implementation}${body.isOptional && !context.output.optionsParamRequired ? '?' : ''}: ${body.definition}`,\n implementation: `${body.implementation}${body.isOptional && !context.output.optionsParamRequired ? '?' : ''}: ${body.definition}`,\n default: false,\n required: !body.isOptional || context.output.optionsParamRequired,\n type: GetterPropType.BODY,\n };\n\n const queryParamsProp = {\n name: 'params',\n definition: getQueryParamDefinition(queryParams, context),\n implementation: getQueryParamDefinition(queryParams, context),\n default: false,\n required: isNullish(queryParams?.isOptional)\n ? !context.output.allParamsOptional || context.output.optionsParamRequired\n : (!queryParams.isOptional && !context.output.allParamsOptional) ||\n context.output.optionsParamRequired,\n type: GetterPropType.QUERY_PARAM,\n };\n\n const headersProp = {\n name: 'headers',\n definition: `headers${headers?.isOptional && !context.output.optionsParamRequired ? '?' : ''}: ${\n headers?.schema.name\n }`,\n implementation: `headers${headers?.isOptional && !context.output.optionsParamRequired ? '?' : ''}: ${\n headers?.schema.name\n }`,\n default: false,\n required: isNullish(headers?.isOptional)\n ? false\n : !headers.isOptional || context.output.optionsParamRequired,\n type: GetterPropType.HEADER,\n };\n\n let paramGetterProps: GetterProps;\n if (context.output.override.useNamedParameters && params.length > 0) {\n const parameterTypeName = `${pascal(operationName)}PathParameters`;\n\n const name = 'pathParams';\n\n // needs a special model\n const namedParametersTypeDefinition = `export type ${parameterTypeName} = {\\n ${params\n .map((property) => property.definition)\n .join(',\\n ')},\\n }`;\n\n const isOptional =\n context.output.optionsParamRequired ||\n params.every((param) => param.default !== undefined);\n\n const implementation = `{ ${params\n .map(\n (property) =>\n property.default === undefined\n ? property.name\n : `${property.name} = ${stringify(property.default)}`, // if we use property.implementation, we will get `{ version: number = 1 }: ListPetsPathParameters = {}` which isn't valid\n )\n .join(', ')} }: ${parameterTypeName}${isOptional ? ' = {}' : ''}`;\n\n const destructured = `{ ${params\n .map((property) => property.name)\n .join(', ')} }`;\n\n paramGetterProps = [\n {\n type: GetterPropType.NAMED_PATH_PARAMS,\n name,\n definition: `${name}: ${parameterTypeName}`,\n implementation,\n default: false,\n destructured,\n required: true,\n schema: {\n name: parameterTypeName,\n model: namedParametersTypeDefinition,\n imports: params.flatMap((property) => property.imports),\n },\n },\n ];\n } else {\n paramGetterProps = params.map((param) => ({\n ...param,\n type: GetterPropType.PARAM,\n }));\n }\n\n const props = [\n ...paramGetterProps,\n ...(body.definition ? [bodyProp] : []),\n ...(queryParams ? [queryParamsProp] : []),\n ...(headers ? [headersProp] : []),\n ];\n\n const sortedProps = sortByPriority(props);\n\n return sortedProps;\n}\n\nfunction getQueryParamDefinition(\n queryParams: GetterQueryParam | undefined,\n context: ContextSpec,\n): string {\n const paramType = queryParams?.schema.name;\n return `params${(queryParams?.isOptional || context.output.allParamsOptional) && !context.output.optionsParamRequired ? '?' : ''}: ${paramType}`;\n}\n","import { resolveValue } from '../resolvers';\nimport type {\n ContextSpec,\n GeneratorImport,\n GeneratorSchema,\n GetterParameters,\n GetterQueryParam,\n OpenApiParameterObject,\n OpenApiSchemaObject,\n} from '../types';\nimport { jsDoc, pascal, sanitize } from '../utils';\nimport { getEnum, getEnumDescriptions, getEnumNames } from './enum';\nimport { getKey } from './keys';\n\ninterface QueryParamsType {\n name: string;\n required: boolean;\n definition: string;\n imports: GeneratorImport[];\n schemas: GeneratorSchema[];\n originalSchema: OpenApiSchemaObject;\n}\n\nconst isOpenApiSchemaObject = (\n value: unknown,\n): value is OpenApiSchemaObject => {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n return !('$ref' in value);\n};\n\n/**\n * A `$ref` schema object (e.g. array `items` or a oneOf/anyOf/allOf variant\n * pointing at a component). We don't resolve the reference here, but a query\n * parameter behind a `$ref` is virtually always a complex (object-like) type,\n * so it must be treated as non-primitive. Over-flagging is harmless: the only\n * consumer (the Angular `nonPrimitiveKeys` passthrough) is gated on a\n * configured `paramsSerializer`, which is precisely what handles raw values.\n */\nconst isRefObject = (value: unknown): boolean =>\n !!value && typeof value === 'object' && '$ref' in value;\n\nconst getSchemaType = (\n schema: OpenApiSchemaObject,\n): string | string[] | undefined => {\n const type = (schema as { type?: unknown }).type;\n\n if (typeof type === 'string') {\n return type;\n }\n\n if (\n Array.isArray(type) &&\n type.every((variant): variant is string => typeof variant === 'string')\n ) {\n return type;\n }\n\n return undefined;\n};\n/**\n * Detects whether a query parameter's resolved schema is non-primitive — i.e.\n * an object, an array of objects, or a composition (oneOf/anyOf/allOf) that\n * resolves to a non-primitive shape.\n *\n * Used by Angular generators so the default `filterParams` helper preserves\n * such values instead of silently dropping them. Angular's `HttpParams` only\n * accepts primitives, but a user-provided `paramsSerializer`, `mutator`, or\n * `paramsFilter` may need the raw object to flatten or stringify it.\n */\nconst isSchemaNonPrimitive = (schema: OpenApiSchemaObject): boolean => {\n const schemaType = getSchemaType(schema);\n const type = Array.isArray(schemaType)\n ? schemaType.filter((variant) => variant !== 'null')\n : schemaType;\n const additionalProperties = (schema as { additionalProperties?: unknown })\n .additionalProperties;\n\n if (type === 'object') {\n return true;\n }\n if (Array.isArray(type) && type.includes('object')) {\n return true;\n }\n if (type === 'array' || (Array.isArray(type) && type.includes('array'))) {\n const items = (schema as { items?: unknown }).items;\n if (isOpenApiSchemaObject(items)) {\n return isSchemaNonPrimitive(items);\n }\n // Arrays with missing/unknown `items` are still non-primitive for our\n // Angular passthrough purposes: without a serializer/filter, HttpParams\n // cannot safely represent them. `$ref` items also land here because\n // isOpenApiSchemaObject rejects references.\n return true;\n }\n\n const compositions = [\n ...(Array.isArray(schema.oneOf) ? (schema.oneOf as unknown[]) : []),\n ...(Array.isArray(schema.anyOf) ? (schema.anyOf as unknown[]) : []),\n ...(Array.isArray(schema.allOf) ? (schema.allOf as unknown[]) : []),\n ];\n if (compositions.length > 0) {\n return compositions.some((variant) =>\n isOpenApiSchemaObject(variant)\n ? isSchemaNonPrimitive(variant)\n : isRefObject(variant),\n );\n }\n\n if (\n !type &&\n ((schema as { properties?: unknown }).properties !== undefined ||\n (additionalProperties !== undefined && additionalProperties !== false))\n ) {\n return true;\n }\n return false;\n};\n\nconst isSchemaNullable = (schema: OpenApiSchemaObject): boolean => {\n if (schema.nullable === true) {\n return true;\n }\n\n if (schema.type === 'null') {\n return true;\n }\n\n if (Array.isArray(schema.type) && schema.type.includes('null')) {\n return true;\n }\n\n const oneOfVariants = Array.isArray(schema.oneOf)\n ? (schema.oneOf as unknown[])\n : [];\n const anyOfVariants = Array.isArray(schema.anyOf)\n ? (schema.anyOf as unknown[])\n : [];\n const variants = [...oneOfVariants, ...anyOfVariants];\n\n return variants.some((variant) => {\n if (!isOpenApiSchemaObject(variant)) {\n return false;\n }\n\n return isSchemaNullable(variant);\n });\n};\n\nfunction getQueryParamsTypes(\n queryParams: GetterParameters['query'],\n operationName: string,\n context: ContextSpec,\n): QueryParamsType[] {\n return queryParams.map(({ parameter, imports: parameterImports }) => {\n const {\n name,\n required,\n schema: schemaParam,\n content,\n } = parameter as {\n name: string;\n required: boolean;\n schema: OpenApiSchemaObject | undefined;\n content: OpenApiParameterObject['content'];\n };\n\n const queryName = sanitize(`${pascal(operationName)}${pascal(name)}`, {\n underscore: '_',\n whitespace: '_',\n dash: true,\n es5keyword: true,\n es5IdentifierName: true,\n });\n\n const schema = schemaParam ?? content?.['application/json']?.schema;\n if (!schema) {\n throw new Error(\n `Query parameter \"${name}\" has no schema or content definition`,\n );\n }\n\n const resolvedValue = resolveValue({\n schema,\n context,\n name: queryName,\n });\n\n const key = getKey(name);\n // Bridge assertion: cast schema to jsDoc's expected parameter shape\n // to avoid AnyOtherAttribute spreading error type\n const schemaForDoc = schema as {\n description?: string | string[];\n deprecated?: boolean;\n summary?: string;\n minLength?: number;\n maxLength?: number;\n minimum?: number;\n maximum?: number;\n exclusiveMinimum?: number;\n exclusiveMaximum?: number;\n minItems?: number;\n maxItems?: number;\n type?: string | string[];\n pattern?: string;\n };\n const doc = jsDoc(\n {\n description: parameter.description,\n ...schemaForDoc,\n },\n void 0,\n context,\n );\n\n if (parameterImports.length > 0) {\n return {\n name,\n required,\n definition: `${doc}${key}${!required || schema.default ? '?' : ''}: ${\n parameterImports[0].name\n };`,\n imports: parameterImports,\n schemas: [],\n originalSchema: resolvedValue.originalSchema,\n };\n }\n\n if (resolvedValue.isEnum && !resolvedValue.isRef) {\n const enumName = queryName;\n // Vendor extensions like `x-enum-varnames` may live on the parameter\n // itself rather than inside `schema` — notably after a Swagger 2 → OAS 3\n // upgrade, which moves standard schema fields into `schema` but leaves\n // vendor extensions at the parameter level.\n const parameterAsSchema = parameter as OpenApiSchemaObject;\n const enumValue = getEnum(\n resolvedValue.value,\n enumName,\n getEnumNames(resolvedValue.originalSchema) ??\n getEnumNames(parameterAsSchema),\n context.output.override.enumGenerationType,\n getEnumDescriptions(resolvedValue.originalSchema) ??\n getEnumDescriptions(parameterAsSchema),\n context.output.override.namingConvention.enum,\n );\n\n return {\n name,\n required,\n definition: `${doc}${key}${\n !required || schema.default ? '?' : ''\n }: ${enumName};`,\n imports: [{ name: enumName }],\n schemas: [\n ...resolvedValue.schemas,\n { name: enumName, model: enumValue, imports: resolvedValue.imports },\n ],\n originalSchema: resolvedValue.originalSchema,\n };\n }\n\n const definition = `${doc}${key}${\n !required || schema.default ? '?' : ''\n }: ${resolvedValue.value};`;\n\n return {\n name,\n required,\n definition,\n imports: resolvedValue.imports,\n schemas: resolvedValue.schemas,\n originalSchema: resolvedValue.originalSchema,\n };\n });\n}\n\ninterface GetQueryParamsOptions {\n queryParams: GetterParameters['query'];\n operationName: string;\n context: ContextSpec;\n suffix?: string;\n}\n\nexport function getQueryParams({\n queryParams,\n operationName,\n context,\n suffix = 'params',\n}: GetQueryParamsOptions): GetterQueryParam | undefined {\n if (queryParams.length === 0) {\n return;\n }\n const types = getQueryParamsTypes(queryParams, operationName, context);\n const imports = types.flatMap(({ imports }) => imports);\n const schemas = types.flatMap(({ schemas }) => schemas);\n const name = `${pascal(operationName)}${pascal(suffix)}`;\n\n const type = types.map(({ definition }) => definition).join('\\n');\n const allOptional = queryParams.every(({ parameter }) => !parameter.required);\n const requiredNullableKeys = types\n .filter(\n ({ required, originalSchema }) =>\n required && isSchemaNullable(originalSchema),\n )\n .map(({ name }) => name);\n const nonPrimitiveKeys = types\n .filter(({ originalSchema }) => isSchemaNonPrimitive(originalSchema))\n .map(({ name }) => name);\n\n const schema = {\n name,\n model: `export type ${name} = {\\n${type}\\n};\\n`,\n imports,\n };\n\n return {\n schema,\n deps: schemas,\n isOptional: allOptional,\n paramNames: types.map(({ name }) => name),\n requiredNullableKeys,\n ...(nonPrimitiveKeys.length > 0 ? { nonPrimitiveKeys } : {}),\n };\n}\n","import type {\n ContextSpec,\n GetterResponse,\n OpenApiResponsesObject,\n OverrideOutputContentType,\n ResReqTypesValue,\n} from '../types';\nimport {\n dedupeUnionType,\n filterByContentType,\n isBinaryContentType,\n} from '../utils';\nimport { getResReqTypes } from './res-req-types';\n\ninterface GetResponseOptions {\n responses: OpenApiResponsesObject;\n operationName: string;\n context: ContextSpec;\n contentType?: OverrideOutputContentType;\n}\n\nexport function getResponse({\n responses,\n operationName,\n context,\n contentType,\n}: GetResponseOptions): GetterResponse {\n const types = getResReqTypes(\n Object.entries(responses),\n operationName,\n context,\n 'void',\n (type) => `${type.key}-${type.value}-${type.contentType}`,\n );\n\n const filteredTypes = filterByContentType(types, contentType);\n\n const imports = filteredTypes.flatMap(({ imports }) => imports);\n const schemas = filteredTypes.flatMap(({ schemas }) => schemas);\n\n const contentTypes = [\n ...new Set(filteredTypes.map(({ contentType }) => contentType)),\n ];\n\n const groupedByStatus: {\n success: ResReqTypesValue[];\n errors: ResReqTypesValue[];\n } = { success: [], errors: [] };\n for (const type of filteredTypes) {\n if (type.key.startsWith('2')) {\n groupedByStatus.success.push(type);\n } else {\n groupedByStatus.errors.push(type);\n }\n }\n\n const success = dedupeUnionType(\n groupedByStatus.success\n .map(({ value, formData }) => (formData ? 'Blob' : value))\n .join(' | '),\n );\n const errors = dedupeUnionType(\n groupedByStatus.errors.map(({ value }) => value).join(' | '),\n );\n\n const defaultType = filteredTypes.find(({ key }) => key === 'default')?.value;\n\n return {\n imports,\n definition: {\n success: success || (defaultType ?? 'unknown'),\n errors: errors || (defaultType ?? 'unknown'),\n },\n isBlob: groupedByStatus.success.some(\n (t) =>\n (!!t.contentType && isBinaryContentType(t.contentType)) ||\n t.originalSchema?.format === 'binary' ||\n (t.originalSchema?.contentMediaType === 'application/octet-stream' &&\n !t.originalSchema.contentEncoding),\n ),\n types: groupedByStatus,\n contentTypes,\n schemas,\n originalSchema: responses,\n };\n}\n","import { TEMPLATE_TAG_REGEX } from '../constants';\nimport type {\n BaseUrlFromConstant,\n BaseUrlFromSpec,\n BaseUrlRuntime,\n GeneratorImport,\n NormalizedOutputOptions,\n OpenApiServerObject,\n} from '../types';\nimport { camel, isObject, isString, sanitize } from '../utils';\n\nfunction isBaseUrlRuntime(\n baseUrl: string | BaseUrlFromConstant | BaseUrlFromSpec | BaseUrlRuntime,\n): baseUrl is BaseUrlRuntime {\n return (\n isObject(baseUrl) &&\n 'runtime' in baseUrl &&\n typeof baseUrl.runtime === 'string'\n );\n}\n\n/**\n * Wraps a runtime expression for generated URL template literals.\n * Pass the expression only (e.g. `process.env.API_BASE_URL`), not a `${...}` fragment.\n */\nfunction runtimeExpressionToUrlPrefix(expression: string): string {\n const t = expression.trim();\n if (!t) return '';\n return '${' + t + '}';\n}\n\nconst hasParam = (path: string): boolean => /[^{]*{[\\w*_-]*}.*/.test(path);\n\nconst getRoutePath = (path: string): string => {\n const matches = /([^{]*){?([\\w*_-]*)}?(.*)/.exec(path);\n if (!matches?.length) return path; // impossible due to regexp grouping here, but for TS\n\n const prev = matches[1];\n const rawParam = matches[2];\n const rest = matches[3];\n const param = sanitize(camel(rawParam), {\n es5keyword: true,\n underscore: true,\n dash: true,\n dot: true,\n });\n const next = hasParam(rest) ? getRoutePath(rest) : rest;\n\n return hasParam(path)\n ? `${prev}\\${${param}}${next}`\n : `${prev}${param}${next}`;\n};\n\nexport function getRoute(route: string) {\n const splittedRoute = route.split('/');\n\n let result = '';\n for (const [i, path] of splittedRoute.entries()) {\n if (!path && !i) {\n continue;\n }\n\n result += path.includes('{') ? `/${getRoutePath(path)}` : `/${path}`;\n }\n return result;\n}\n\nexport function getFullRoute(\n route: string,\n servers: OpenApiServerObject[] | undefined,\n baseUrl:\n | string\n | BaseUrlFromConstant\n | BaseUrlFromSpec\n | BaseUrlRuntime\n | undefined,\n): string {\n const getBaseUrl = (): string => {\n if (!baseUrl) return '';\n if (isString(baseUrl)) return baseUrl;\n if (isBaseUrlRuntime(baseUrl)) {\n return runtimeExpressionToUrlPrefix(baseUrl.runtime);\n }\n if (baseUrl.getBaseUrlFromSpecification) {\n if (!servers) {\n throw new Error(\n \"Orval is configured to use baseUrl from the specifications 'servers' field, but there exist no servers in the specification.\",\n );\n }\n const server = servers.at(\n Math.min(baseUrl.index ?? 0, servers.length - 1),\n );\n if (!server) return '';\n const serverUrl = server.url ?? '';\n if (!server.variables) return serverUrl;\n\n let url = serverUrl;\n const variables = baseUrl.variables;\n for (const variableKey of Object.keys(server.variables)) {\n const variable = server.variables[variableKey];\n if (variables?.[variableKey]) {\n if (\n variable.enum &&\n !variable.enum.some((e) => e == variables[variableKey])\n ) {\n throw new Error(\n `Invalid variable value '${variables[variableKey]}' for variable '${variableKey}' when resolving ${serverUrl}. Valid values are: ${variable.enum.join(', ')}.`,\n );\n }\n url = url.replaceAll(`{${variableKey}}`, variables[variableKey]);\n } else {\n url = url.replaceAll(`{${variableKey}}`, String(variable.default));\n }\n }\n return url;\n }\n return baseUrl.baseUrl;\n };\n\n let fullRoute = route;\n const base = getBaseUrl();\n if (base) {\n if (base.endsWith('/') && route.startsWith('/')) {\n fullRoute = route.slice(1);\n }\n fullRoute = `${base}${fullRoute}`;\n }\n return fullRoute;\n}\n\n/**\n * Returns `GeneratorImport` entries for {@link BaseUrlRuntime.imports} when `baseUrl` is a runtime config.\n *\n * Defaults `values` to true so symbols in `runtime` emit as value imports in the\n * generated client. Set `values: false` explicitly only for unusual cases (e.g.\n * type-only symbols referenced from the expression).\n */\nexport function getBaseUrlRuntimeImports(\n baseUrl?: NormalizedOutputOptions['baseUrl'],\n): GeneratorImport[] {\n if (!baseUrl) return [];\n if (!isBaseUrlRuntime(baseUrl)) return [];\n return (baseUrl.imports ?? []).map((imp) => ({\n ...imp,\n values: imp.values ?? true,\n }));\n}\n\n// Emits a codegen string: wraps each `${param}` segment of a template-literal\n// route so the generated client encodes path parameters at request time.\nexport const wrapRouteParameters = (\n route: string,\n prepend: string,\n append: string,\n): string => route.replaceAll(TEMPLATE_TAG_REGEX, `\\${${prepend}$1${append}}`);\n\nexport const makeRouteSafe = (route: string): string =>\n wrapRouteParameters(route, 'encodeURIComponent(String(', '))');\n\n// Creates a mixed use array with path variables and string from template string route\nexport function getRouteAsArray(route: string): string {\n return route\n .split('/')\n .filter((i) => i !== '')\n .flatMap((segment) => {\n if (!segment.includes('${')) {\n return [`'${segment}'`];\n }\n // Split by template tags, keeping the delimiters\n return segment\n .split(/(\\$\\{.+?\\})/g)\n .filter(Boolean)\n .map((part) => {\n const match = /^\\$\\{(.+?)\\}$/.exec(part);\n return match ? match[1] : `'${part}'`;\n });\n })\n .join(',');\n}\n","import { entries, isEmptyish } from 'remeda';\n\nimport { getResReqTypes } from '../getters';\nimport type {\n ContextSpec,\n GeneratorSchema,\n OpenApiComponentsObject,\n} from '../types';\nimport { jsDoc, pascal, sanitize } from '../utils';\n\nexport function generateComponentDefinition(\n responses:\n | OpenApiComponentsObject['responses']\n | OpenApiComponentsObject['requestBodies'] = {},\n context: ContextSpec,\n suffix: string,\n): GeneratorSchema[] {\n if (isEmptyish(responses)) {\n return [];\n }\n\n const generatorSchemas: GeneratorSchema[] = [];\n for (const [name, response] of entries(responses)) {\n const allResponseTypes = getResReqTypes(\n [[suffix, response]],\n name,\n context,\n 'void',\n );\n\n const imports = allResponseTypes.flatMap(({ imports }) => imports);\n const schemas = allResponseTypes.flatMap(({ schemas }) => schemas);\n\n const type = allResponseTypes.map(({ value }) => value).join(' | ');\n\n const modelName = sanitize(`${pascal(name)}${suffix}`, {\n underscore: '_',\n whitespace: '_',\n dash: true,\n es5keyword: true,\n es5IdentifierName: true,\n });\n const doc = jsDoc(response);\n const model = `${doc}export type ${modelName} = ${type || 'unknown'};\\n`;\n\n generatorSchemas.push(...schemas);\n\n if (modelName !== type) {\n generatorSchemas.push({\n name: modelName,\n model,\n imports,\n });\n }\n }\n\n return generatorSchemas;\n}\n","import { resolveRef } from '../resolvers/ref';\nimport type {\n ContextSpec,\n GeneratorImport,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n} from '../types';\nimport { PropertySortOrder } from '../types';\nimport {\n conventionName,\n getFileInfo,\n isString,\n logWarning,\n pascal,\n upath,\n} from '../utils';\n\nconst circularRefCache = new WeakMap<ContextSpec, Map<string, boolean>>();\n\nfunction getSchemasPath(context: ContextSpec): string {\n const { schemas, target } = context.output;\n if (schemas) {\n const schemasPath = isString(schemas) ? schemas : schemas.path;\n return upath.normalizeSafe(schemasPath);\n }\n const { dirname, filename } = getFileInfo(target);\n return upath.joinSafe(dirname, filename + '.schemas');\n}\n\nfunction getSchemaImportPath(\n refName: string,\n context: ContextSpec,\n): string | undefined {\n if (context.output.factoryMethods?.mode === 'single') {\n return undefined;\n }\n let outputDir = context.output.factoryMethods?.outputDirectory;\n let schemasPath = getSchemasPath(context);\n\n if (context.output.workspace) {\n if (outputDir && !upath.isAbsolute(outputDir)) {\n outputDir = upath.resolve(context.output.workspace, outputDir);\n }\n if (schemasPath && !upath.isAbsolute(schemasPath)) {\n schemasPath = upath.resolve(context.output.workspace, schemasPath);\n }\n }\n\n const relativePath = outputDir\n ? upath.relativeSafe(outputDir, schemasPath)\n : './';\n const baseName = conventionName(refName, context.output.namingConvention);\n return upath.joinSafe(relativePath, baseName);\n}\n\ntype SchemaArray = (OpenApiSchemaObject | OpenApiReferenceObject)[];\n\ninterface ResolvedRef {\n imports: GeneratorImport[];\n schema: OpenApiSchemaObject;\n}\n\nfunction isReference(\n schema: OpenApiSchemaObject | OpenApiReferenceObject,\n): schema is OpenApiReferenceObject {\n return '$ref' in schema;\n}\n\nfunction getResolvedRef(\n schema: OpenApiReferenceObject,\n context: ContextSpec,\n): ResolvedRef {\n return resolveRef(schema, context) as ResolvedRef;\n}\n\nfunction getProperties(\n schema: OpenApiSchemaObject,\n): Record<string, OpenApiSchemaObject | OpenApiReferenceObject> {\n return (\n (schema.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined) ?? {}\n );\n}\n\nfunction getItems(\n schema: OpenApiSchemaObject,\n): OpenApiSchemaObject | OpenApiReferenceObject | undefined {\n return schema.items as\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | undefined;\n}\n\nfunction getAdditionalProperties(\n schema: OpenApiSchemaObject,\n): OpenApiSchemaObject | OpenApiReferenceObject | boolean | undefined {\n return schema.additionalProperties as\n | OpenApiSchemaObject\n | OpenApiReferenceObject\n | boolean\n | undefined;\n}\n\nfunction getSchemas(schemas: unknown): SchemaArray | undefined {\n return schemas as SchemaArray | undefined;\n}\n\nfunction getExtendedProps(schema: OpenApiSchemaObject): {\n constValue: unknown;\n prefixItems: SchemaArray | undefined;\n minItems: number | undefined;\n} {\n const extended = schema as OpenApiSchemaObject & {\n const?: unknown;\n prefixItems?: SchemaArray;\n minItems?: number;\n };\n return {\n constValue: extended.const,\n prefixItems: extended.prefixItems,\n minItems: extended.minItems,\n };\n}\n\nexport function generateFactory(\n schema: OpenApiSchemaObject,\n name: string,\n context: ContextSpec,\n): { model: string; imports: GeneratorImport[] } | undefined {\n if (!canGenerateSchema(schema) || !context.output.factoryMethods)\n return undefined;\n\n const { functionNamePrefix, mode } = context.output.factoryMethods;\n const factoryName = `${functionNamePrefix}${pascal(name)}`;\n const imports: GeneratorImport[] = [];\n const payload = buildPayload(schema, context, [name], imports);\n\n if (mode !== 'single') {\n const schemaImportPath = getSchemaImportPath(name, context);\n imports.push({ name, importPath: schemaImportPath });\n }\n\n return {\n model: `export function ${factoryName}(): ${name} {\\n return ${payload};\\n}\\n`,\n imports,\n };\n}\n\nfunction canGenerateSchema(schema: OpenApiSchemaObject): boolean {\n return (\n schema.type === 'object' ||\n schema.type === 'array' ||\n !!schema.properties ||\n !!schema.allOf ||\n !!schema.oneOf ||\n !!schema.anyOf ||\n !!schema.items ||\n !!schema.enum\n );\n}\n\nfunction hasCircularReference(\n target: OpenApiSchemaObject | OpenApiReferenceObject,\n sourceName: string,\n context: ContextSpec,\n visited = new Set<string>(),\n): boolean {\n if (isReference(target)) {\n const { imports, schema } = getResolvedRef(target, context);\n const refName = imports[0]?.name;\n if (refName === sourceName) return true;\n if (refName && visited.has(refName)) return false;\n if (refName) visited.add(refName);\n\n let cache = circularRefCache.get(context);\n if (!cache) {\n cache = new Map<string, boolean>();\n circularRefCache.set(context, cache);\n }\n const cacheKey = refName ? `${sourceName}::${refName}` : undefined;\n if (cacheKey) {\n const cached = cache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n }\n\n const result = hasCircularReference(schema, sourceName, context, visited);\n\n if (cacheKey) {\n cache.set(cacheKey, result);\n }\n return result;\n }\n\n const check = (schemas?: SchemaArray): boolean =>\n schemas?.some((s) =>\n hasCircularReference(s, sourceName, context, visited),\n ) ?? false;\n\n const items = getItems(target);\n const additionalProperties = getAdditionalProperties(target);\n\n return (\n check(getSchemas(target.allOf)) ||\n check(getSchemas(target.oneOf)) ||\n check(getSchemas(target.anyOf)) ||\n Object.values(getProperties(target)).some((s) =>\n hasCircularReference(s, sourceName, context, visited),\n ) ||\n (!!items && hasCircularReference(items, sourceName, context, visited)) ||\n (typeof additionalProperties === 'object' &&\n hasCircularReference(additionalProperties, sourceName, context, visited))\n );\n}\n\nfunction buildPayload(\n target: OpenApiSchemaObject | OpenApiReferenceObject,\n context: ContextSpec,\n parents: string[],\n imports: GeneratorImport[],\n): string {\n if (isReference(target)) {\n return buildRefPayload(target, context, parents, imports);\n }\n\n const schema = target;\n\n if (schema.allOf)\n return buildAllOfPayload(\n getSchemas(schema.allOf) ?? [],\n context,\n parents,\n imports,\n );\n if (schema.oneOf)\n return buildFirstOfPayload(\n getSchemas(schema.oneOf) ?? [],\n context,\n parents,\n imports,\n );\n if (schema.anyOf)\n return buildFirstOfPayload(\n getSchemas(schema.anyOf) ?? [],\n context,\n parents,\n imports,\n );\n\n const { constValue } = getExtendedProps(schema);\n if (constValue !== undefined) return formatValue(constValue);\n if (schema.default !== undefined) return buildDefaultPayload(schema, context);\n\n const schemaType = inferSchemaType(schema);\n\n if (schemaType === 'object' || schema.properties)\n return buildObjectPayload(schema, context, parents, imports);\n if (schemaType === 'array')\n return buildArrayPayload(schema, context, parents, imports);\n\n return buildPrimitivePayload(schema, schemaType, context);\n}\n\nfunction buildRefPayload(\n schema: OpenApiReferenceObject,\n context: ContextSpec,\n parents: string[],\n imports: GeneratorImport[],\n): string {\n const { schema: resolved, imports: refImports } = getResolvedRef(\n schema,\n context,\n );\n const refName = refImports[0]?.name;\n\n if (!refName) return '{}';\n\n if (\n parents.includes(refName) ||\n hasCircularReference(resolved, parents[0], context)\n ) {\n imports.push({\n name: refName,\n importPath: getSchemaImportPath(refName, context),\n });\n return `{} as ${refName}`;\n }\n\n const { functionNamePrefix = 'create', mode = 'single' } =\n context.output.factoryMethods ?? {};\n const refFactoryName = `${functionNamePrefix}${pascal(refName)}`;\n\n if (mode !== 'single-split') {\n const importPath = resolveImportPath(mode, refName, context);\n imports.push({ name: refFactoryName, importPath, isConstant: true });\n }\n\n imports.push({\n name: refName,\n importPath: getSchemaImportPath(refName, context),\n });\n\n return `${refFactoryName}()`;\n}\n\nfunction resolveImportPath(\n mode: string,\n refName: string,\n context: ContextSpec,\n): string | undefined {\n const baseName = conventionName(refName, context.output.namingConvention);\n switch (mode) {\n case 'split': {\n return `./${baseName}.factory`;\n }\n case 'single-split': {\n return `./${conventionName('factoryMethods', context.output.namingConvention)}`;\n }\n case 'single': {\n return `./${baseName}`;\n }\n }\n}\n\nfunction buildAllOfPayload(\n allOf: SchemaArray,\n context: ContextSpec,\n parents: string[],\n imports: GeneratorImport[],\n): string {\n const payloads = allOf.map((s) => buildPayload(s, context, parents, imports));\n return payloads.length > 0\n ? `Object.assign({}, ${payloads.join(', ')})`\n : '{}';\n}\n\nfunction buildFirstOfPayload(\n schemas: SchemaArray,\n context: ContextSpec,\n parents: string[],\n imports: GeneratorImport[],\n): string {\n const first = schemas[0];\n return first ? buildPayload(first, context, parents, imports) : '{}';\n}\n\nfunction buildObjectPayload(\n schema: OpenApiSchemaObject,\n context: ContextSpec,\n parents: string[],\n imports: GeneratorImport[],\n): string {\n const { includeOptionalProperty = false } =\n context.output.factoryMethods ?? {};\n const props = getProperties(schema);\n const requiredProps: string[] =\n (schema.required as string[] | undefined) ?? [];\n const entries = Object.entries(props);\n\n if (context.output.propertySortOrder === PropertySortOrder.ALPHABETICAL) {\n entries.sort(([a], [b]) => a.localeCompare(b));\n }\n\n const includeOptional = includeOptionalProperty;\n const lines: string[] = [];\n\n for (const [key, prop] of entries) {\n const isRequired = requiredProps.includes(key);\n const resolved = isReference(prop)\n ? getResolvedRef(prop, context).schema\n : prop;\n\n const isReadOnly =\n !!(prop as OpenApiSchemaObject).readOnly || !!resolved.readOnly;\n const isWriteOnly =\n !!(prop as OpenApiSchemaObject).writeOnly || !!resolved.writeOnly;\n\n if (!isRequired) {\n if (isReadOnly) continue;\n if (!isWriteOnly && !includeOptional) continue;\n }\n\n const payload = buildPayload(prop, context, parents, imports);\n const safeKey = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(key)\n ? key\n : JSON.stringify(key);\n lines.push(`${safeKey}: ${payload}`);\n }\n\n return `{\\n ${lines.join(',\\n ')}\\n }`;\n}\n\nfunction buildArrayPayload(\n schema: OpenApiSchemaObject,\n context: ContextSpec,\n parents: string[],\n imports: GeneratorImport[],\n): string {\n const { prefixItems, minItems } = getExtendedProps(schema);\n const items = getItems(schema);\n\n if (prefixItems && prefixItems.length > 0) {\n const payloads = prefixItems.map((item) =>\n buildPayload(item, context, parents, imports),\n );\n return `[${payloads.join(', ')}]`;\n }\n\n if (minItems && items) {\n const MAX_MIN_ITEMS = 50;\n if (minItems > MAX_MIN_ITEMS) {\n logWarning(\n `Warning: minItems is ${minItems}, capping at ${MAX_MIN_ITEMS} to prevent massive payload.`,\n );\n }\n const count = Math.min(minItems, MAX_MIN_ITEMS);\n const itemPayload = buildPayload(items, context, parents, imports);\n return `[${Array.from<string>({ length: count })\n .fill(itemPayload)\n .join(', ')}]`;\n }\n\n return '[]';\n}\n\nfunction inferSchemaType(schema: OpenApiSchemaObject): string | undefined {\n let type = schema.type as string | string[] | undefined;\n\n if (Array.isArray(type)) {\n const nonNull = type.filter((t) => t !== 'null');\n type = nonNull.length > 0 ? nonNull[0] : 'null';\n }\n\n if (!type && schema.items) return 'array';\n\n if (!type && schema.enum) {\n const first = (schema.enum as unknown[])[0];\n if (typeof first === 'number') return 'number';\n if (typeof first === 'boolean') return 'boolean';\n return 'string';\n }\n\n return type;\n}\n\nfunction buildDefaultPayload(\n schema: OpenApiSchemaObject,\n context: ContextSpec,\n): string {\n if (\n context.output.override.useDates &&\n typeof schema.default === 'string' &&\n (schema.format === 'date' || schema.format === 'date-time')\n ) {\n return `new Date('${schema.default}')`;\n }\n return formatValue(schema.default);\n}\n\nfunction buildPrimitivePayload(\n schema: OpenApiSchemaObject,\n schemaType: string | undefined,\n context: ContextSpec,\n): string {\n if (schemaType === 'null') return 'null';\n\n const enumValues = schema.enum as unknown[] | undefined;\n\n if (schemaType === 'boolean') {\n return enumValues && enumValues.length > 0\n ? String(enumValues[0])\n : 'false';\n }\n\n if (schemaType === 'number' || schemaType === 'integer') {\n return enumValues && enumValues.length > 0 ? String(enumValues[0]) : '0';\n }\n\n if (schemaType === 'string') {\n if (enumValues && enumValues.length > 0) {\n const first = enumValues[0];\n return typeof first === 'string' ? JSON.stringify(first) : String(first);\n }\n if (schema.format === 'date' || schema.format === 'date-time') {\n return context.output.override.useDates\n ? 'new Date(0)'\n : `'${new Date(0).toISOString()}'`;\n }\n return \"''\";\n }\n\n return 'undefined as unknown';\n}\n\nfunction formatValue(val: unknown): string {\n if (val === null) return 'null';\n if (typeof val === 'string') return JSON.stringify(val);\n if (typeof val === 'object') return JSON.stringify(val);\n return String(val as number | boolean);\n}\n","import { groupBy, unique, uniqueWith } from 'remeda';\n\nimport {\n type GeneratorImport,\n type GeneratorMutator,\n type GeneratorVerbOptions,\n GetterPropType,\n NamingConvention,\n} from '../types';\nimport { conventionName } from '../utils';\nimport { escapeRegExp } from '../utils/string';\n\ninterface GenerateImportsOptions {\n imports: readonly GeneratorImport[];\n namingConvention?: NamingConvention;\n importExtension?: string;\n}\n\nexport function generateImports({\n imports,\n namingConvention = NamingConvention.CAMEL_CASE,\n importExtension = '',\n}: GenerateImportsOptions) {\n if (imports.length === 0) {\n return '';\n }\n\n const normalized = uniqueWith(\n imports,\n (a, b) =>\n a.name === b.name &&\n a.default === b.default &&\n a.alias === b.alias &&\n a.values === b.values &&\n a.isConstant === b.isConstant &&\n a.namespaceImport === b.namespaceImport &&\n a.syntheticDefaultImport === b.syntheticDefaultImport &&\n a.importPath === b.importPath,\n ).map((imp) => ({\n ...imp,\n importPath:\n imp.importPath ??\n `./${conventionName(imp.name, namingConvention)}${importExtension}`,\n }));\n\n const grouped = groupBy(normalized, (imp) =>\n !imp.default &&\n !imp.namespaceImport &&\n !imp.syntheticDefaultImport &&\n !imp.values &&\n !imp.isConstant\n ? `aggregate|${imp.importPath}`\n : `single|${imp.importPath}|${imp.name}|${imp.alias ?? ''}|${String(\n imp.default,\n )}|${String(imp.namespaceImport)}|${String(imp.syntheticDefaultImport)}|${String(\n imp.values,\n )}|${String(imp.isConstant)}`,\n );\n\n return Object.entries(grouped)\n .toSorted(([a], [b]) => a.localeCompare(b, 'en', { numeric: true }))\n .map(([, group]) => {\n const sample = group[0];\n const canAggregate =\n !sample.default &&\n !sample.namespaceImport &&\n !sample.syntheticDefaultImport &&\n !sample.values &&\n !sample.isConstant;\n\n if (canAggregate) {\n const names = [\n ...new Set(\n group.map(\n ({ name, alias }) => `${name}${alias ? ` as ${alias}` : ''}`,\n ),\n ),\n ]\n .toSorted()\n .join(', ');\n\n return `import type { ${names} } from '${sample.importPath}';`;\n }\n\n const { name, values, alias, isConstant, importPath } = sample;\n return `import ${!values && !isConstant ? 'type ' : ''}{ ${name}${\n alias ? ` as ${alias}` : ''\n } } from '${importPath}';`;\n })\n .join('\\n');\n}\n\ninterface GenerateMutatorImportsOptions {\n mutators: GeneratorMutator[];\n implementation?: string;\n oneMore?: boolean;\n}\n\nexport function generateMutatorImports({\n mutators,\n implementation,\n oneMore,\n}: GenerateMutatorImportsOptions) {\n let imports = '';\n for (const mutator of uniqueWith(\n mutators,\n (a, b) => a.name === b.name && a.default === b.default,\n )) {\n // Relative mutator paths are written relative to the output root, so in\n // tags-split mode (`oneMore`) they need an extra `../` to reach the file\n // from the deeper per-tag directory. Bare specifiers (e.g. `@scope/axios`)\n // and absolute paths do not depend on the importer's location and must be\n // left untouched.\n const isRelativeImport = mutator.path.startsWith('.');\n const path = `${oneMore && isRelativeImport ? '../' : ''}${mutator.path}`;\n const importDefault = mutator.default\n ? mutator.name\n : `{ ${mutator.name} }`;\n\n imports += `import ${importDefault} from '${path}';`;\n imports += '\\n';\n\n if (implementation && (mutator.hasErrorType || mutator.bodyTypeName)) {\n let errorImportName = '';\n const targetErrorImportName = mutator.default\n ? `ErrorType as ${mutator.errorTypeName}`\n : mutator.errorTypeName;\n if (\n mutator.hasErrorType &&\n implementation.includes(mutator.errorTypeName) &&\n !imports.includes(`{ ${targetErrorImportName} `)\n ) {\n errorImportName = targetErrorImportName;\n }\n\n let bodyImportName = '';\n const targetBodyImportName = mutator.default\n ? `BodyType as ${mutator.bodyTypeName}`\n : mutator.bodyTypeName;\n if (\n mutator.bodyTypeName &&\n implementation.includes(mutator.bodyTypeName) &&\n !imports.includes(` ${targetBodyImportName} }`)\n ) {\n bodyImportName = targetBodyImportName ?? '';\n }\n\n if (bodyImportName || errorImportName) {\n imports += `import type { ${errorImportName}${\n errorImportName && bodyImportName ? ' , ' : ''\n }${bodyImportName} } from '${path}';`;\n imports += '\\n';\n }\n }\n }\n\n return imports;\n}\n\ninterface GenerateDependencyOptions {\n key: string;\n deps: readonly GeneratorImport[];\n dependency: string;\n projectName?: string;\n isAllowSyntheticDefaultImports: boolean;\n onlyTypes: boolean;\n}\n\nfunction generateDependency({\n deps,\n isAllowSyntheticDefaultImports,\n dependency,\n projectName,\n key,\n onlyTypes,\n}: GenerateDependencyOptions) {\n // find default import if dependency either is not a synthetic import or synthetic imports are allowed\n const defaultDep = deps.find(\n (e) =>\n e.default &&\n (isAllowSyntheticDefaultImports || !e.syntheticDefaultImport),\n );\n\n // if default dependency could not be created, check for namespace import or a synthetic import that is not allowed\n const namespaceImportDep = defaultDep\n ? undefined\n : deps.find(\n (e) =>\n !!e.namespaceImport ||\n (!isAllowSyntheticDefaultImports && e.syntheticDefaultImport),\n );\n\n // find all named imports\n const depsString = unique(\n deps\n .filter(\n (e) => !e.default && !e.syntheticDefaultImport && !e.namespaceImport,\n )\n .map(({ name, alias }) => (alias ? `${name} as ${alias}` : name)),\n )\n .toSorted()\n .join(',\\n ');\n\n let importString = '';\n\n // generate namespace import string\n const namespaceImportString = namespaceImportDep\n ? `import * as ${namespaceImportDep.name} from '${dependency}';`\n : '';\n\n if (namespaceImportString) {\n if (deps.length === 1) {\n // only namespace import, return it directly\n return namespaceImportString;\n }\n importString += `${namespaceImportString}\\n`;\n }\n\n importString += `import ${onlyTypes ? 'type ' : ''}${\n defaultDep ? `${defaultDep.name}${depsString ? ',' : ''}` : ''\n }${depsString ? `{\\n ${depsString}\\n}` : ''} from '${dependency}${\n key !== 'default' && projectName ? `/${projectName}` : ''\n }';`;\n\n return importString;\n}\n\ninterface AddDependencyOptions {\n implementation: string;\n exports: readonly GeneratorImport[];\n dependency: string;\n projectName?: string;\n hasSchemaDir: boolean;\n isAllowSyntheticDefaultImports: boolean;\n}\n\nexport function addDependency({\n implementation,\n exports,\n dependency,\n projectName,\n isAllowSyntheticDefaultImports,\n}: AddDependencyOptions) {\n const toAdds = exports.filter((e) => {\n const searchWords = [e.alias, e.name]\n .filter((p): p is string => Boolean(p?.length))\n .map((part) => escapeRegExp(part))\n .join('|');\n\n if (!searchWords) {\n return false;\n }\n\n const pattern = new RegExp(String.raw`\\b(${searchWords})\\b`, 'g');\n\n return implementation.match(pattern);\n });\n\n if (toAdds.length === 0) {\n return;\n }\n\n const groupedBySpecKey: Record<\n string,\n { types: GeneratorImport[]; values: GeneratorImport[] }\n > = { default: { types: [], values: [] } };\n for (const dep of toAdds) {\n const key = 'default';\n\n if (\n dep.values &&\n (isAllowSyntheticDefaultImports || !dep.syntheticDefaultImport)\n ) {\n groupedBySpecKey[key].values.push(dep);\n } else {\n groupedBySpecKey[key].types.push(dep);\n }\n }\n\n return (\n Object.entries(groupedBySpecKey)\n .map(([key, { values, types }]) => {\n let dep = '';\n\n if (values.length > 0) {\n dep += generateDependency({\n deps: values,\n isAllowSyntheticDefaultImports,\n dependency,\n projectName,\n key,\n onlyTypes: false,\n });\n }\n\n if (types.length > 0) {\n let uniqueTypes = types;\n if (values.length > 0) {\n uniqueTypes = types.filter(\n (t) =>\n !values.some(\n (v) =>\n v.name === t.name && (v.alias ?? '') === (t.alias ?? ''),\n ),\n );\n }\n if (uniqueTypes.length > 0) {\n if (values.length > 0) {\n dep += '\\n';\n }\n dep += generateDependency({\n deps: uniqueTypes,\n isAllowSyntheticDefaultImports,\n dependency,\n projectName,\n key,\n onlyTypes: true,\n });\n }\n }\n\n return dep;\n })\n .join('\\n') + '\\n'\n );\n}\n\nfunction getLibName(code: string) {\n const splitString = code.split(' from ');\n return (splitString.at(-1) ?? '').split(';')[0].trim();\n}\n\nexport function generateDependencyImports(\n implementation: string,\n imports: {\n exports: readonly GeneratorImport[];\n dependency: string;\n }[],\n projectName: string | undefined,\n hasSchemaDir: boolean,\n isAllowSyntheticDefaultImports: boolean,\n): string {\n const dependencies = imports\n .map((dep) =>\n addDependency({\n ...dep,\n implementation,\n projectName,\n hasSchemaDir,\n isAllowSyntheticDefaultImports,\n }),\n )\n // eslint-disable-next-line unicorn/prefer-native-coercion-functions -- type predicate (x is string) required for narrowing\n .filter((x): x is string => Boolean(x))\n .toSorted((a, b) => {\n const aLib = getLibName(a);\n const bLib = getLibName(b);\n\n if (aLib === bLib) {\n return 0;\n }\n\n if (aLib.startsWith(\"'.\") && !bLib.startsWith(\"'.\")) {\n return 1;\n }\n return aLib < bLib ? -1 : 1;\n })\n .join('\\n');\n\n return dependencies ? dependencies + '\\n' : '';\n}\n\nexport function generateVerbImports({\n response,\n body,\n queryParams,\n props,\n headers,\n params,\n}: GeneratorVerbOptions): GeneratorImport[] {\n const imports: GeneratorImport[] = [\n ...response.imports,\n ...body.imports,\n ...props.flatMap((prop) =>\n prop.type === GetterPropType.NAMED_PATH_PARAMS\n ? [{ name: prop.schema.name }]\n : [],\n ),\n ...(queryParams ? [{ name: queryParams.schema.name }] : []),\n ...(headers ? [{ name: headers.schema.name }] : []),\n ...params.flatMap<GeneratorImport>(({ imports }) => imports),\n ];\n\n // Zod schema named `Error` is a common collision with the global `Error` value.\n // If we need it as a runtime value (e.g. `.parse()`), alias the value import to\n // `ErrorSchema` while keeping the `Error` type available.\n return imports.flatMap((imp) => {\n if (imp.name !== 'Error' || !imp.values || imp.alias) {\n return [imp];\n }\n\n return [\n // Type-only import keeps `Error` usable as a type.\n { ...imp, values: undefined },\n // Value import is aliased to avoid shadowing `globalThis.Error`.\n { ...imp, alias: 'ErrorSchema', values: true },\n ];\n });\n}\n","import type {\n InputFiltersOptions,\n NormalizedInputOptions,\n OpenApiDocument,\n OpenApiOperationObject,\n OpenApiPathItemObject,\n} from '../types';\n\nconst COMPONENT_TYPES = [\n 'schemas',\n 'responses',\n 'parameters',\n 'requestBodies',\n] as const;\n\ntype ComponentType = (typeof COMPONENT_TYPES)[number];\n\nexport function filteredVerbs(\n verbs: OpenApiPathItemObject,\n filters: NormalizedInputOptions['filters'],\n) {\n if (filters?.tags === undefined) {\n return Object.entries(verbs);\n }\n\n const filterTags = filters.tags;\n const filterMode = filters.mode ?? 'include';\n\n return Object.entries(verbs).filter(\n ([, operation]: [string, OpenApiOperationObject]) => {\n // Bridge assertion: operation.tags is `any` due to AnyOtherAttribute\n const operationTags = (operation.tags ?? []) as string[];\n\n const isMatch = operationTags.some((tag) =>\n filterTags.some((filterTag) =>\n filterTag instanceof RegExp ? filterTag.test(tag) : filterTag === tag,\n ),\n );\n\n return filterMode === 'exclude' ? !isMatch : isMatch;\n },\n );\n}\n\nfunction findRefs(value: unknown): string[] {\n if (!value || typeof value !== 'object') return [];\n if (Array.isArray(value)) return value.flatMap((item) => findRefs(item));\n\n const obj = value as Record<string, unknown>;\n\n if (typeof obj.$ref === 'string') return [obj.$ref];\n\n return Object.values(obj).flatMap((val) => findRefs(val));\n}\n\nfunction parseComponentRef(\n ref: string,\n): { type: ComponentType; name: string } | undefined {\n const parts = ref.split('/');\n\n if (parts[0] !== '#' || parts[1] !== 'components' || parts.length < 4) {\n return undefined;\n }\n\n const type = parts[2];\n const name = parts[3];\n\n if (!COMPONENT_TYPES.includes(type as ComponentType)) {\n return undefined;\n }\n\n return { type: type as ComponentType, name };\n}\n\nfunction getComponentNames(\n refs: string[],\n spec: OpenApiDocument,\n): { type: ComponentType; name: string }[] {\n return refs\n .map((ref) => parseComponentRef(ref))\n .filter(\n (parsed): parsed is { type: ComponentType; name: string } =>\n !!parsed && !!spec.components?.[parsed.type]?.[parsed.name],\n );\n}\n\nfunction resolveReferencedComponents(\n refs: string[],\n spec: OpenApiDocument,\n resolved: Record<ComponentType, string[]>,\n): Record<ComponentType, string[]> {\n const newComponents = getComponentNames(refs, spec).filter(\n ({ type, name }) => !resolved[type].includes(name),\n );\n\n if (newComponents.length === 0) return resolved;\n\n const nextResolved: Record<ComponentType, string[]> = {\n schemas: [...resolved.schemas],\n responses: [...resolved.responses],\n parameters: [...resolved.parameters],\n requestBodies: [...resolved.requestBodies],\n };\n\n for (const { type, name } of newComponents) {\n nextResolved[type].push(name);\n }\n\n const nextRefs = newComponents.flatMap(({ type, name }) =>\n findRefs(spec.components?.[type]?.[name]),\n );\n\n return resolveReferencedComponents(nextRefs, spec, nextResolved);\n}\n\nexport const collectReferencedComponents = (\n spec: OpenApiDocument,\n tags: (string | RegExp)[],\n mode: InputFiltersOptions['mode'],\n): Record<ComponentType, string[]> => {\n const filters = { tags, mode };\n const refs = Object.values(spec.paths ?? {})\n .filter((pathItem): pathItem is OpenApiPathItemObject => !!pathItem)\n .flatMap((pathItem) => {\n const verbs = filteredVerbs(pathItem, filters);\n return [\n ...verbs.flatMap(([, operation]) => findRefs(operation)),\n ...findRefs(pathItem.parameters),\n ];\n });\n\n return resolveReferencedComponents(refs, spec, {\n schemas: [],\n responses: [],\n parameters: [],\n requestBodies: [],\n });\n};\n","import type { GeneratorSchema } from '../types';\n\nexport function generateModelInline(acc: string, model: string): string {\n return acc + `${model}\\n`;\n}\n\nexport function generateModelsInline(\n obj: Record<string, GeneratorSchema[]> | GeneratorSchema[],\n): string {\n const schemas = Array.isArray(obj) ? obj : Object.values(obj).flat();\n\n let result = '';\n for (const { model } of schemas) {\n result = generateModelInline(result, model);\n }\n return result;\n}\n","import { Parser, type Program } from 'acorn';\nimport { build, type BuildOptions } from 'esbuild';\nimport { isArray } from 'remeda';\n\nimport type { GeneratorMutatorParsingInfo, Tsconfig } from '../types';\n\nexport async function getMutatorInfo(\n filePath: string,\n options?: {\n root?: string;\n namedExport?: string;\n alias?: Record<string, string>;\n external?: string[];\n tsconfig?: Tsconfig;\n },\n): Promise<GeneratorMutatorParsingInfo | undefined> {\n const {\n root = process.cwd(),\n namedExport = 'default',\n alias,\n external,\n tsconfig,\n } = options ?? {};\n\n const code = await bundleFile(\n root,\n filePath,\n alias,\n external,\n tsconfig?.compilerOptions,\n );\n\n return parseFile(code, namedExport);\n}\n\nasync function bundleFile(\n root: string,\n fileName: string,\n alias?: Record<string, string>,\n external?: string[],\n compilerOptions?: Tsconfig['compilerOptions'],\n): Promise<string> {\n const result = await build({\n absWorkingDir: root,\n entryPoints: [fileName],\n write: false,\n platform: 'node',\n bundle: true,\n format: 'esm',\n metafile: false,\n target: compilerOptions?.target ?? 'es6',\n minify: false,\n minifyIdentifiers: false,\n minifySyntax: false,\n minifyWhitespace: false,\n treeShaking: false,\n keepNames: false,\n alias,\n external: external ?? ['*'],\n } satisfies BuildOptions);\n const { text } = result.outputFiles[0];\n\n return text;\n}\n\nfunction parseFile(\n file: string,\n name: string,\n): GeneratorMutatorParsingInfo | undefined {\n try {\n // `file` is esbuild's bundled output, not the user's source. esbuild may\n // emit any modern syntax (notably dynamic `import()`, which it preserves\n // even when targeting es6 in ESM mode), so we parse with the latest\n // ecmaVersion to avoid spurious SyntaxErrors that would mask the export\n // we are looking for. See https://github.com/orval-labs/orval/issues/1634.\n const ast = Parser.parse(file, {\n ecmaVersion: 'latest',\n sourceType: 'module',\n });\n\n const foundSpecifier = ast.body\n .filter((x) => x.type === 'ExportNamedDeclaration')\n .flatMap((x) => x.specifiers)\n .find(\n (x) =>\n x.exported.type === 'Identifier' &&\n x.exported.name === name &&\n x.local.type === 'Identifier',\n );\n\n if (foundSpecifier && 'name' in foundSpecifier.local) {\n const exportedFuncName = foundSpecifier.local.name;\n\n return parseFunction(ast, exportedFuncName);\n }\n } catch {\n return;\n }\n}\n\nfunction parseFunction(\n ast: Program,\n funcName: string,\n): GeneratorMutatorParsingInfo | undefined {\n const node = ast.body.find((childNode) => {\n if (childNode.type === 'VariableDeclaration') {\n return childNode.declarations.find(\n (d) => d.id.type === 'Identifier' && d.id.name === funcName,\n );\n }\n if (\n childNode.type === 'FunctionDeclaration' &&\n childNode.id.name === funcName\n ) {\n return childNode;\n }\n });\n\n if (!node) {\n return;\n }\n\n if (node.type === 'FunctionDeclaration') {\n const returnStatement = node.body.body.find(\n (b) => b.type === 'ReturnStatement',\n );\n\n // If the function directly returns an arrow function\n if (returnStatement?.argument && 'params' in returnStatement.argument) {\n return {\n numberOfParams: node.params.length,\n returnNumberOfParams: returnStatement.argument.params.length,\n };\n // If the function returns a CallExpression (e.g., return useCallback(...))\n } else if (returnStatement?.argument?.type === 'CallExpression') {\n const arrowFn = returnStatement.argument.arguments.at(0);\n if (arrowFn?.type === 'ArrowFunctionExpression') {\n return {\n numberOfParams: node.params.length,\n returnNumberOfParams: arrowFn.params.length,\n };\n }\n }\n return {\n numberOfParams: node.params.length,\n };\n }\n\n const declaration =\n 'declarations' in node\n ? node.declarations.find(\n (d) => d.id.type === 'Identifier' && d.id.name === funcName,\n )\n : undefined;\n\n if (declaration?.init) {\n if ('name' in declaration.init) {\n return parseFunction(ast, declaration.init.name);\n }\n\n if (\n 'body' in declaration.init &&\n 'params' in declaration.init &&\n declaration.init.body.type === 'ArrowFunctionExpression'\n ) {\n return {\n numberOfParams: declaration.init.params.length,\n returnNumberOfParams: declaration.init.body.params.length,\n };\n }\n\n const returnStatement =\n 'body' in declaration.init &&\n 'body' in declaration.init.body &&\n isArray(declaration.init.body.body)\n ? declaration.init.body.body.find((b) => b.type === 'ReturnStatement')\n : undefined;\n\n if ('params' in declaration.init) {\n if (returnStatement?.argument && 'params' in returnStatement.argument) {\n return {\n numberOfParams: declaration.init.params.length,\n returnNumberOfParams: returnStatement.argument.params.length,\n };\n } else if (\n returnStatement?.argument?.type === 'CallExpression' &&\n returnStatement.argument.arguments[0]?.type ===\n 'ArrowFunctionExpression'\n ) {\n const arrowFn = returnStatement.argument.arguments[0];\n return {\n numberOfParams: declaration.init.params.length,\n returnNumberOfParams: arrowFn.params.length,\n };\n }\n\n return {\n numberOfParams: declaration.init.params.length,\n };\n }\n }\n}\n","import { styleText } from 'node:util';\n\nimport fs from 'fs-extra';\n\nimport type { GeneratorMutator, NormalizedMutator, Tsconfig } from '../types';\nimport { getFileInfo, pascal, upath } from '../utils';\nimport { getMutatorInfo } from './mutator-info';\n\nexport const BODY_TYPE_NAME = 'BodyType';\n\nconst getImport = (output: string, mutator: NormalizedMutator) => {\n const outputFile = getFileInfo(output).path;\n return `${upath.getRelativeImportPath(outputFile, mutator.path)}${mutator.extension ?? ''}`;\n};\n\ninterface GenerateMutatorOptions {\n output?: string;\n mutator?: NormalizedMutator;\n name: string;\n workspace: string;\n tsconfig?: Tsconfig;\n}\n\nexport async function generateMutator({\n output,\n mutator,\n name,\n workspace,\n tsconfig,\n}: GenerateMutatorOptions): Promise<GeneratorMutator | undefined> {\n if (!mutator || !output) {\n return;\n }\n const isDefault = mutator.default;\n const importName = mutator.name ?? `${name}Mutator`;\n const importPath = mutator.path;\n const mutatorInfoName = isDefault ? 'default' : mutator.name;\n\n if (mutatorInfoName === undefined) {\n throw new Error(\n styleText(\n 'red',\n `Mutator ${importPath} must have a named or default export.`,\n ),\n );\n }\n\n let rawFile = await fs.readFile(importPath, 'utf8');\n rawFile = removeComments(rawFile);\n\n const hasErrorType =\n rawFile.includes('export type ErrorType') ||\n rawFile.includes('export interface ErrorType');\n\n const hasBodyType =\n rawFile.includes(`export type ${BODY_TYPE_NAME}`) ||\n rawFile.includes(`export interface ${BODY_TYPE_NAME}`);\n\n const errorTypeName = mutator.default\n ? `${pascal(name)}ErrorType`\n : 'ErrorType';\n\n const bodyTypeName = mutator.default\n ? `${pascal(name)}${BODY_TYPE_NAME}`\n : BODY_TYPE_NAME;\n\n const mutatorInfo = await getMutatorInfo(importPath, {\n root: workspace,\n namedExport: mutatorInfoName,\n alias: mutator.alias,\n external: mutator.external,\n tsconfig,\n });\n\n if (!mutatorInfo) {\n throw new Error(\n styleText(\n 'red',\n `Your mutator file doesn't have the ${mutatorInfoName} exported function`,\n ),\n );\n }\n\n const importStatementPath = getImport(output, mutator);\n\n const isHook = mutator.name\n ? mutator.name.startsWith('use') && !mutatorInfo.numberOfParams\n : !mutatorInfo.numberOfParams;\n\n return {\n name: mutator.name || !isHook ? importName : `use${pascal(importName)}`,\n path: importStatementPath,\n default: isDefault,\n hasErrorType,\n errorTypeName,\n hasSecondArg: isHook\n ? (mutatorInfo.returnNumberOfParams ?? 0) > 1\n : mutatorInfo.numberOfParams > 1,\n hasThirdArg: mutatorInfo.numberOfParams > 2,\n isHook,\n ...(hasBodyType ? { bodyTypeName } : {}),\n };\n}\n\nfunction removeComments(file: string) {\n // Regular expression to match single-line and multi-line comments\n const commentRegex = /\\/\\/.*|\\/\\*[\\s\\S]*?\\*\\//g;\n\n // Remove comments from the rawFile string\n const cleanedFile = file.replaceAll(commentRegex, '');\n\n return cleanedFile;\n}\n","import { getSuccessResponseType } from '../getters/res-req-types';\nimport {\n type GeneratorMutator,\n type GeneratorSchema,\n type GetterBody,\n type GetterQueryParam,\n type GetterResponse,\n type ParamsSerializerOptions,\n Verbs,\n} from '../types';\nimport { getIsBodyVerb, isObject, stringify } from '../utils';\n\n/**\n * Filters query params for Angular's HttpClient.\n *\n * Why: Angular's HttpParams / HttpClient `params` type does not accept `null` or\n * `undefined` values, and arrays must only contain string/number/boolean.\n * Orval models often include nullable query params, so we remove nullish values\n * (including nulls inside arrays) before passing params to HttpClient or a\n * paramsSerializer to avoid runtime and type issues.\n *\n * Returns an inline IIFE expression. For paths that benefit from a shared helper\n * (e.g. observe-mode branches), prefer getAngularFilteredParamsCallExpression +\n * getAngularFilteredParamsHelperBody instead.\n */\nexport const getAngularFilteredParamsExpression = (\n paramsExpression: string,\n requiredNullableParamKeys: string[] = [],\n preserveRequiredNullables = false,\n nonPrimitiveKeys: string[] = [],\n): string => {\n const hasPassthrough = nonPrimitiveKeys.length > 0;\n const filteredParamValueType = hasPassthrough\n ? 'unknown'\n : `string | number | boolean${preserveRequiredNullables ? ' | null' : ''} | Array<string | number | boolean>`;\n const passthroughBranch = hasPassthrough\n ? ` if (passthroughKeys.has(key)) {\n if (value !== undefined) {\n filteredParams[key] = value;\n }\n continue;\n }\n`\n : '';\n const preserveNullableBranch = preserveRequiredNullables\n ? ` } else if (value === null && requiredNullableParamKeys.has(key)) {\n filteredParams[key] = null;\n`\n : '';\n const scalarBranch = ` } else if (\n value != null &&\n (typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean')\n ) {\n filteredParams[key] = value;\n }\n`;\n const passthroughDecl = hasPassthrough\n ? ` const passthroughKeys = new Set<string>(${JSON.stringify(nonPrimitiveKeys)});\\n`\n : '';\n\n return `(() => {\n${passthroughDecl} const requiredNullableParamKeys = new Set<string>(${JSON.stringify(requiredNullableParamKeys)});\n const filteredParams: Record<string, ${filteredParamValueType}> = {};\n for (const [key, value] of Object.entries(${paramsExpression})) {\n${passthroughBranch} if (Array.isArray(value)) {\n const filtered = value.filter(\n (item) =>\n item != null &&\n (typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean'),\n ) as Array<string | number | boolean>;\n if (filtered.length) {\n filteredParams[key] = filtered;\n }\n${preserveNullableBranch}${scalarBranch} }\n return filteredParams;\n})()`;\n};\n\n/**\n * Returns the body of a standalone `filterParams` helper function\n * to be emitted once in the generated file header, replacing the\n * inline IIFE that was previously duplicated in every method.\n */\nexport const getAngularFilteredParamsHelperBody = (): string =>\n `type AngularHttpParamValue = string | number | boolean | Array<string | number | boolean>;\ntype AngularHttpParamValueWithNullable = AngularHttpParamValue | null;\n\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys?: ReadonlySet<string>,\n preserveRequiredNullables?: false,\n passthroughKeys?: undefined,\n): Record<string, AngularHttpParamValue>;\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys: ReadonlySet<string> | undefined,\n preserveRequiredNullables: true,\n passthroughKeys?: undefined,\n): Record<string, AngularHttpParamValueWithNullable>;\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys: ReadonlySet<string> | undefined,\n preserveRequiredNullables: boolean | undefined,\n passthroughKeys: ReadonlySet<string>,\n): Record<string, unknown>;\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys: ReadonlySet<string> = new Set(),\n preserveRequiredNullables = false,\n passthroughKeys: ReadonlySet<string> = new Set(),\n): Record<string, unknown> {\n const filteredParams: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(params)) {\n if (passthroughKeys.has(key)) {\n if (value !== undefined) {\n filteredParams[key] = value;\n }\n continue;\n }\n if (Array.isArray(value)) {\n const filtered = value.filter(\n (item) =>\n item != null &&\n (typeof item === 'string' ||\n typeof item === 'number' ||\n typeof item === 'boolean'),\n ) as Array<string | number | boolean>;\n if (filtered.length) {\n filteredParams[key] = filtered;\n }\n } else if (\n preserveRequiredNullables &&\n value === null &&\n requiredNullableKeys.has(key)\n ) {\n filteredParams[key] = null;\n } else if (\n value != null &&\n (typeof value === 'string' ||\n typeof value === 'number' ||\n typeof value === 'boolean')\n ) {\n filteredParams[key] = value;\n }\n }\n return filteredParams;\n}`;\n\n/**\n * Returns a call expression to the `filterParams` helper function.\n */\nexport const getAngularFilteredParamsCallExpression = (\n paramsExpression: string,\n requiredNullableParamKeys: string[] = [],\n preserveRequiredNullables = false,\n nonPrimitiveKeys: string[] = [],\n): string => {\n const baseArgs = `${paramsExpression}, new Set<string>(${JSON.stringify(requiredNullableParamKeys)})`;\n if (nonPrimitiveKeys.length > 0) {\n return `filterParams(${baseArgs}, ${preserveRequiredNullables}, new Set<string>(${JSON.stringify(nonPrimitiveKeys)}))`;\n }\n return `filterParams(${baseArgs}${preserveRequiredNullables ? ', true' : ''})`;\n};\n\n/**\n * Returns the filter call/IIFE used to massage query params before passing\n * them to Angular's HttpParams. When the user supplied a `paramsFilter`\n * mutator, the built-in `filterParams` is bypassed entirely and the user's\n * function is called with the raw params — they own nullish-stripping and\n * any object/array handling. Otherwise the built-in filter is used (either\n * the shared helper or an inline IIFE), and callers should only pass\n * `nonPrimitiveKeys` when a downstream serializer or custom consumer can\n * legally handle raw object/array values.\n */\nexport const buildAngularParamsFilterExpression = ({\n paramsExpression,\n requiredNullableParamKeys = [],\n preserveRequiredNullables = false,\n nonPrimitiveKeys = [],\n paramsFilter,\n useSharedHelper,\n}: {\n paramsExpression: string;\n requiredNullableParamKeys?: string[];\n preserveRequiredNullables?: boolean;\n nonPrimitiveKeys?: string[];\n paramsFilter?: GeneratorMutator;\n useSharedHelper: boolean;\n}): string => {\n if (paramsFilter) {\n return `${paramsFilter.name}(${paramsExpression})`;\n }\n if (useSharedHelper) {\n return getAngularFilteredParamsCallExpression(\n paramsExpression,\n requiredNullableParamKeys,\n preserveRequiredNullables,\n nonPrimitiveKeys,\n );\n }\n return getAngularFilteredParamsExpression(\n paramsExpression,\n requiredNullableParamKeys,\n preserveRequiredNullables,\n nonPrimitiveKeys,\n );\n};\n\ninterface GenerateFormDataAndUrlEncodedFunctionOptions {\n body: GetterBody;\n formData?: GeneratorMutator;\n formUrlEncoded?: GeneratorMutator;\n isFormData: boolean;\n isFormUrlEncoded: boolean;\n}\n\nexport function generateBodyOptions(\n body: GetterBody,\n isFormData: boolean,\n isFormUrlEncoded: boolean,\n): string | undefined {\n if (isFormData && body.formData) {\n return 'formData';\n }\n\n if (isFormUrlEncoded && body.formUrlEncoded) {\n return 'formUrlEncoded';\n }\n\n if (body.implementation) {\n return body.implementation;\n }\n\n return undefined;\n}\n\ninterface GenerateAxiosOptions {\n response: GetterResponse;\n isExactOptionalPropertyTypes: boolean;\n angularObserve?: 'body' | 'events' | 'response';\n angularParamsRef?: string;\n requiredNullableQueryParamKeys?: string[];\n nonPrimitiveQueryParamKeys?: string[];\n queryParams?: GeneratorSchema;\n headers?: GeneratorSchema;\n requestOptions?: object | boolean;\n hasSignal: boolean;\n hasSignalParam?: boolean;\n isVue: boolean;\n isAngular: boolean;\n paramsSerializer?: GeneratorMutator;\n paramsSerializerOptions?: ParamsSerializerOptions;\n paramsFilter?: GeneratorMutator;\n}\n\nexport function generateAxiosOptions({\n response,\n isExactOptionalPropertyTypes,\n angularObserve,\n angularParamsRef,\n requiredNullableQueryParamKeys,\n nonPrimitiveQueryParamKeys,\n queryParams,\n headers,\n requestOptions,\n hasSignal,\n hasSignalParam = false,\n isVue,\n isAngular,\n paramsSerializer,\n paramsSerializerOptions,\n paramsFilter,\n}: GenerateAxiosOptions) {\n const isRequestOptions = requestOptions !== false;\n const angularPassthroughQueryParamKeys = paramsSerializer\n ? nonPrimitiveQueryParamKeys\n : [];\n // Use querySignal if API has a param named \"signal\" to avoid conflict\n const signalVar = hasSignalParam ? 'querySignal' : 'signal';\n const signalProp = hasSignalParam ? `signal: ${signalVar}` : 'signal';\n\n if (\n !queryParams &&\n !headers &&\n !response.isBlob &&\n response.definition.success !== 'string'\n ) {\n if (isRequestOptions) {\n return isAngular\n ? angularObserve\n ? `{\n ...(options as Omit<NonNullable<typeof options>, 'observe'>),\n observe: '${angularObserve}',\n }`\n : \"(options as Omit<NonNullable<typeof options>, 'observe'>)\"\n : 'options';\n }\n if (hasSignal) {\n return isExactOptionalPropertyTypes\n ? `...(${signalVar} ? { ${signalProp} } : {})`\n : signalProp;\n }\n return '';\n }\n\n let value = '';\n\n if (!isRequestOptions) {\n if (queryParams) {\n if (isAngular) {\n const iifeExpr = buildAngularParamsFilterExpression({\n paramsExpression: 'params ?? {}',\n requiredNullableParamKeys: requiredNullableQueryParamKeys,\n preserveRequiredNullables: !!paramsSerializer,\n nonPrimitiveKeys: angularPassthroughQueryParamKeys,\n paramsFilter,\n useSharedHelper: false,\n });\n value += paramsSerializer\n ? `\\n params: ${paramsSerializer.name}(${iifeExpr}),`\n : `\\n params: ${iifeExpr},`;\n } else {\n value += '\\n params,';\n }\n }\n\n if (headers) {\n value += '\\n headers,';\n }\n\n if (hasSignal) {\n value += isExactOptionalPropertyTypes\n ? `\\n ...(${signalVar} ? { ${signalProp} } : {}),`\n : `\\n ${signalProp},`;\n }\n }\n\n if (\n !isObject(requestOptions) ||\n !Object.hasOwn(requestOptions, 'responseType')\n ) {\n const successResponseType = getSuccessResponseType(response);\n if (successResponseType) {\n value += `\\n responseType: '${successResponseType}',`;\n }\n }\n\n if (isObject(requestOptions)) {\n value += `\\n ${stringify(requestOptions)?.slice(1, -1)}`;\n }\n\n if (isRequestOptions) {\n value += isAngular\n ? \"\\n ...(options as Omit<NonNullable<typeof options>, 'observe'>),\"\n : '\\n ...options,';\n\n if (isAngular && angularObserve) {\n value += `\\n observe: '${angularObserve}',`;\n }\n\n if (queryParams) {\n if (isVue) {\n value += '\\n params: {...unref(params), ...options?.params},';\n } else if (isAngular && angularParamsRef) {\n value += `\\n params: ${angularParamsRef},`;\n } else if (isAngular && paramsSerializer) {\n const callExpr = buildAngularParamsFilterExpression({\n paramsExpression: '{...params, ...options?.params}',\n requiredNullableParamKeys: requiredNullableQueryParamKeys,\n preserveRequiredNullables: true,\n nonPrimitiveKeys: angularPassthroughQueryParamKeys,\n paramsFilter,\n useSharedHelper: true,\n });\n value += `\\n params: ${paramsSerializer.name}(${callExpr}),`;\n } else if (isAngular) {\n const callExpr = buildAngularParamsFilterExpression({\n paramsExpression: '{...params, ...options?.params}',\n requiredNullableParamKeys: requiredNullableQueryParamKeys,\n nonPrimitiveKeys: angularPassthroughQueryParamKeys,\n paramsFilter,\n useSharedHelper: true,\n });\n value += `\\n params: ${callExpr},`;\n } else {\n value += '\\n params: {...params, ...options?.params},';\n }\n }\n\n if (headers) {\n value += '\\n headers: {...headers, ...options?.headers},';\n }\n }\n\n if (\n !isAngular &&\n queryParams &&\n (paramsSerializer || paramsSerializerOptions?.qs)\n ) {\n const qsOptions = paramsSerializerOptions?.qs;\n value += paramsSerializer\n ? `\\n paramsSerializer: ${paramsSerializer.name},`\n : `\\n paramsSerializer: (params) => qs.stringify(params, ${JSON.stringify(\n qsOptions,\n )}),`;\n }\n\n return value;\n}\n\ninterface GenerateOptionsOptions {\n route: string;\n body: GetterBody;\n angularObserve?: 'body' | 'events' | 'response';\n angularParamsRef?: string;\n headers?: GetterQueryParam;\n queryParams?: GetterQueryParam;\n response: GetterResponse;\n verb: Verbs;\n requestOptions?: object | boolean;\n isFormData: boolean;\n isFormUrlEncoded: boolean;\n isAngular?: boolean;\n isExactOptionalPropertyTypes: boolean;\n hasSignal: boolean;\n hasSignalParam?: boolean;\n isVue?: boolean;\n paramsSerializer?: GeneratorMutator;\n paramsSerializerOptions?: ParamsSerializerOptions;\n paramsFilter?: GeneratorMutator;\n}\n\nexport function generateOptions({\n route,\n body,\n angularObserve,\n angularParamsRef,\n headers,\n queryParams,\n response,\n verb,\n requestOptions,\n isFormData,\n isFormUrlEncoded,\n isAngular,\n isExactOptionalPropertyTypes,\n hasSignal,\n hasSignalParam,\n isVue,\n paramsSerializer,\n paramsSerializerOptions,\n paramsFilter,\n}: GenerateOptionsOptions) {\n const bodyIdentifier = getIsBodyVerb(verb)\n ? generateBodyOptions(body, isFormData, isFormUrlEncoded)\n : undefined;\n\n const axiosOptions = generateAxiosOptions({\n response,\n angularObserve,\n angularParamsRef,\n requiredNullableQueryParamKeys: queryParams?.requiredNullableKeys,\n nonPrimitiveQueryParamKeys: queryParams?.nonPrimitiveKeys,\n queryParams: queryParams?.schema,\n headers: headers?.schema,\n requestOptions,\n isExactOptionalPropertyTypes,\n hasSignal,\n hasSignalParam,\n isVue: isVue ?? false,\n isAngular: isAngular ?? false,\n paramsSerializer,\n paramsSerializerOptions,\n paramsFilter,\n });\n\n const trimmedAxiosOptions = axiosOptions.trim();\n const isRawOptionsArgument =\n trimmedAxiosOptions === 'options' ||\n (trimmedAxiosOptions.startsWith('(') &&\n trimmedAxiosOptions.endsWith(')')) ||\n (trimmedAxiosOptions.startsWith('{') && trimmedAxiosOptions.endsWith('}'));\n\n const optionsArgument = axiosOptions\n ? isRawOptionsArgument\n ? axiosOptions\n : `{${axiosOptions}}`\n : '';\n\n if (verb === Verbs.DELETE) {\n if (!bodyIdentifier) {\n return `\\n \\`${route}\\`${optionsArgument ? `,${optionsArgument}` : ''}\\n `;\n }\n\n const deleteBodyOptions = isRawOptionsArgument\n ? `...${optionsArgument}`\n : axiosOptions;\n const deleteBodyField = `${isAngular ? 'body' : 'data'}: ${bodyIdentifier}`;\n\n return `\\n \\`${route}\\`,{${deleteBodyField}${axiosOptions ? `,${deleteBodyOptions}` : ''}}\\n `;\n }\n\n const bodyOrOptions = getIsBodyVerb(verb)\n ? `\\n ${bodyIdentifier ?? 'undefined'},`\n : '';\n const separator = bodyOrOptions || optionsArgument ? ',' : '';\n\n return `\\n \\`${route}\\`${separator}${bodyOrOptions}${optionsArgument}\\n `;\n}\n\nexport function generateBodyMutatorConfig(\n body: GetterBody,\n isFormData: boolean,\n isFormUrlEncoded: boolean,\n) {\n if (isFormData && body.formData) {\n return ',\\n data: formData';\n }\n\n if (isFormUrlEncoded && body.formUrlEncoded) {\n return ',\\n data: formUrlEncoded';\n }\n\n if (body.implementation) {\n return `,\\n data: ${body.implementation}`;\n }\n\n return '';\n}\n\nexport function generateQueryParamsAxiosConfig(\n response: GetterResponse,\n isVue: boolean,\n isAngular: boolean,\n requiredNullableQueryParamKeys?: string[],\n queryParams?: GetterQueryParam,\n paramsFilter?: GeneratorMutator,\n) {\n if (!queryParams && !response.isBlob) {\n return '';\n }\n\n let value = '';\n\n if (queryParams) {\n if (isVue) {\n value += ',\\n params: unref(params)';\n } else if (isAngular) {\n const paramsExpr = buildAngularParamsFilterExpression({\n paramsExpression: 'params ?? {}',\n requiredNullableParamKeys: requiredNullableQueryParamKeys,\n nonPrimitiveKeys: queryParams.nonPrimitiveKeys,\n paramsFilter,\n useSharedHelper: false,\n });\n value += `,\\n params: ${paramsExpr}`;\n } else {\n value += ',\\n params';\n }\n }\n\n if (response.isBlob) {\n value += `,\\n responseType: 'blob'`;\n }\n\n return value;\n}\n\ninterface GenerateMutatorConfigOptions {\n route: string;\n body: GetterBody;\n headers?: GetterQueryParam;\n queryParams?: GetterQueryParam;\n response: GetterResponse;\n verb: Verbs;\n isFormData: boolean;\n isFormUrlEncoded: boolean;\n hasSignal: boolean;\n hasSignalParam?: boolean;\n isExactOptionalPropertyTypes: boolean;\n isVue?: boolean;\n isAngular?: boolean;\n paramsFilter?: GeneratorMutator;\n}\n\nexport function generateMutatorConfig({\n route,\n body,\n headers,\n queryParams,\n response,\n verb,\n isFormData,\n isFormUrlEncoded,\n hasSignal,\n hasSignalParam = false,\n isExactOptionalPropertyTypes,\n isVue,\n isAngular,\n paramsFilter,\n}: GenerateMutatorConfigOptions) {\n const bodyOptions = getIsBodyVerb(verb)\n ? generateBodyMutatorConfig(body, isFormData, isFormUrlEncoded)\n : '';\n\n const queryParamsOptions = generateQueryParamsAxiosConfig(\n response,\n isVue ?? false,\n isAngular ?? false,\n queryParams?.requiredNullableKeys,\n queryParams,\n paramsFilter,\n );\n\n const ignoreContentTypes = isAngular ? ['multipart/form-data'] : [];\n const shouldSetContentType =\n body.contentType && !ignoreContentTypes.includes(body.contentType);\n\n const headerOptions = shouldSetContentType\n ? `,\\n headers: {'Content-Type': '${body.contentType}', ${\n headers ? '...headers' : ''\n }}`\n : headers\n ? ',\\n headers'\n : '';\n\n // Use querySignal if API has a param named \"signal\" to avoid conflict\n const signalVar = hasSignalParam ? 'querySignal' : 'signal';\n const signalProp = hasSignalParam ? `signal: ${signalVar}` : 'signal';\n\n return `{url: \\`${route}\\`, method: '${verb.toUpperCase()}'${headerOptions}${bodyOptions}${queryParamsOptions}${\n hasSignal\n ? `, ${\n isExactOptionalPropertyTypes\n ? `...(${signalVar} ? { ${signalProp} }: {})`\n : signalProp\n }`\n : ''\n }\\n }`;\n}\n\nexport function generateMutatorRequestOptions(\n requestOptions: boolean | object | undefined,\n hasSecondArgument: boolean,\n) {\n if (!hasSecondArgument) {\n return isObject(requestOptions)\n ? `{${stringify(requestOptions)?.slice(1, -1)}}`\n : '';\n }\n\n if (isObject(requestOptions)) {\n return `{${stringify(requestOptions)?.slice(1, -1)} ...options}`;\n }\n\n return 'options';\n}\n\nexport function generateFormDataAndUrlEncodedFunction({\n body,\n formData,\n formUrlEncoded,\n isFormData,\n isFormUrlEncoded,\n}: GenerateFormDataAndUrlEncodedFunctionOptions) {\n if (isFormData && body.formData) {\n if (formData) {\n return `const formData = ${formData.name}(${body.implementation})`;\n }\n\n return body.formData;\n }\n\n if (isFormUrlEncoded && body.formUrlEncoded) {\n if (formUrlEncoded) {\n return `const formUrlEncoded = ${formUrlEncoded.name}(${body.implementation})`;\n }\n\n return body.formUrlEncoded;\n }\n\n return '';\n}\n","import { entries, isEmptyish } from 'remeda';\n\nimport { resolveObject, resolveRef } from '../resolvers';\nimport type {\n ContextSpec,\n GeneratorImport,\n GeneratorSchema,\n OpenApiComponentsObject,\n OpenApiParameterObject,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n} from '../types';\nimport { jsDoc, pascal, sanitize } from '../utils';\n\nexport function generateParameterDefinition(\n parameters: OpenApiComponentsObject['parameters'] = {},\n context: ContextSpec,\n suffix: string,\n): GeneratorSchema[] {\n if (isEmptyish(parameters)) {\n return [];\n }\n\n const generatorSchemas: GeneratorSchema[] = [];\n for (const [parameterName, parameter] of entries(parameters)) {\n const modelName = sanitize(`${pascal(parameterName)}${suffix}`, {\n underscore: '_',\n whitespace: '_',\n dash: true,\n es5keyword: true,\n es5IdentifierName: true,\n });\n const {\n schema,\n imports,\n }: {\n schema: OpenApiParameterObject;\n imports: GeneratorImport[];\n } = resolveRef(parameter, context);\n\n if (schema.in !== 'query' && schema.in !== 'header') {\n continue;\n }\n\n if (!schema.schema || imports.length > 0) {\n generatorSchemas.push({\n name: modelName,\n imports:\n imports.length > 0\n ? [\n {\n name: imports[0].name,\n schemaName: imports[0].schemaName,\n },\n ]\n : [],\n model: `export type ${modelName} = ${\n imports.length > 0 ? imports[0].name : 'unknown'\n };\\n`,\n dependencies: imports.length > 0 ? [imports[0].name] : [],\n });\n\n continue;\n }\n\n const resolvedObject = resolveObject({\n schema: schema.schema as OpenApiSchemaObject | OpenApiReferenceObject,\n propName: modelName,\n context,\n });\n\n const doc = jsDoc(schema);\n\n const model = `${doc}export type ${modelName} = ${\n resolvedObject.value || 'unknown'\n };\\n`;\n\n generatorSchemas.push(...resolvedObject.schemas);\n\n if (modelName !== resolvedObject.value) {\n generatorSchemas.push({\n name: modelName,\n model,\n imports: resolvedObject.imports,\n dependencies: resolvedObject.dependencies,\n });\n }\n }\n\n return generatorSchemas;\n}\n","import { getScalar } from '../getters';\nimport type {\n ContextSpec,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n} from '../types';\nimport { jsDoc } from '../utils';\n\ninterface GenerateInterfaceOptions {\n name: string;\n schema: OpenApiSchemaObject;\n context: ContextSpec;\n genericParams?: string[];\n}\n\n/**\n * Generate the interface string\n * An eslint comment is insert if the resulted object is empty\n *\n * @param name interface name\n * @param schema\n */\nexport function generateInterface({\n name,\n schema,\n context,\n genericParams,\n}: GenerateInterfaceOptions) {\n const scalar = getScalar({\n item: schema,\n name,\n context,\n });\n const isEmptyObject = scalar.value === '{}';\n const shouldUseTypeAlias =\n context.output.override.useTypeOverInterfaces ?? scalar.useTypeAlias;\n const genericSuffix =\n genericParams && genericParams.length > 0\n ? `<${genericParams.join(', ')}>`\n : '';\n\n let model = '';\n\n model += jsDoc(schema);\n\n if (isEmptyObject) {\n model +=\n '// eslint-disable-next-line @typescript-eslint/no-empty-interface\\n';\n }\n\n if (scalar.type === 'object' && !shouldUseTypeAlias) {\n // Bridge assertion: schema.properties is `any` due to AnyOtherAttribute\n const properties = schema.properties as\n | Record<string, OpenApiSchemaObject | OpenApiReferenceObject>\n | undefined;\n if (\n properties &&\n Object.values(properties).length > 0 &&\n Object.values(properties).every((item) => 'const' in item)\n ) {\n const mappedScalarValue = scalar.value\n .replaceAll(';', ',')\n .replaceAll('?:', ':');\n\n model += `export const ${name}Value = ${mappedScalarValue} as const;\\nexport type ${name}${genericSuffix} = typeof ${name}Value;\\n`;\n } else {\n const blankInterfaceValue =\n scalar.value === 'unknown' ? '{}' : scalar.value;\n\n model += `export interface ${name}${genericSuffix} ${blankInterfaceValue}\\n`;\n }\n } else {\n model += `export type ${name}${genericSuffix} = ${scalar.value};\\n`;\n }\n\n // Filter out imports that refer to the type defined in current file (OpenAPI recursive schema definitions)\n const externalModulesImportsOnly = scalar.imports.filter((importName) =>\n importName.alias ? importName.alias !== name : importName.name !== name,\n );\n\n return [\n ...scalar.schemas,\n {\n name,\n model,\n imports: externalModulesImportsOnly,\n dependencies: scalar.dependencies,\n schema,\n },\n ];\n}\n","import { isDereferenced } from '@scalar/openapi-types/helpers';\nimport { isArray, isEmptyish } from 'remeda';\n\nimport {\n getEnum,\n getEnumDescriptions,\n getEnumNames,\n resolveDiscriminators,\n} from '../getters';\nimport {\n buildDynamicScope,\n dynamicAnchorsToUniqueParamNames,\n dynamicAnchorToParamName,\n extractBoundAliasInfo,\n resolveRef,\n resolveValue,\n} from '../resolvers';\nimport type {\n ContextSpec,\n GeneratorSchema,\n InputFiltersOptions,\n OpenApiReferenceObject,\n OpenApiSchemaObject,\n OpenApiSchemasObject,\n} from '../types';\nimport {\n conventionName,\n isBoolean,\n isString,\n jsDoc,\n pascal,\n sanitize,\n} from '../utils';\nimport { generateFactory } from './factory';\nimport { generateInterface } from './interface';\n\n/**\n * Extract all types from #/components/schemas\n */\nexport function generateSchemasDefinition(\n schemas: OpenApiSchemasObject = {},\n context: ContextSpec,\n suffix: string,\n filters?: InputFiltersOptions,\n): GeneratorSchema[] {\n if (isEmptyish(schemas)) {\n return [];\n }\n\n const transformedSchemas = resolveDiscriminators(schemas, context);\n\n let generateSchemas = Object.entries(transformedSchemas);\n if (filters?.schemas) {\n const schemasFilters = filters.schemas;\n const mode = filters.mode ?? 'include';\n\n generateSchemas = generateSchemas.filter(([schemaName]) => {\n const isMatch = schemasFilters.some((filter) =>\n isString(filter) ? filter === schemaName : filter.test(schemaName),\n );\n\n return mode === 'include' ? isMatch : !isMatch;\n });\n }\n\n const models = generateSchemas.flatMap(([schemaName, schema]) =>\n generateSchemaDefinitions(schemaName, schema, context, suffix),\n );\n\n // Deduplicate schemas by normalized name to prevent duplicate exports\n // This handles cases where different source schemas produce the same normalized name\n const seenNames = new Set<string>();\n const deduplicatedModels: GeneratorSchema[] = [];\n for (const schema of models) {\n const normalizedName = conventionName(\n schema.name,\n context.output.namingConvention,\n );\n if (!seenNames.has(normalizedName)) {\n seenNames.add(normalizedName);\n\n if (context.output.factoryMethods && schema.schema) {\n const factoryData = generateFactory(\n schema.schema,\n schema.name,\n context,\n );\n if (factoryData) {\n if (context.output.factoryMethods.mode === 'single') {\n schema.model += `\\n${factoryData.model}`;\n for (const imp of factoryData.imports) {\n if (\n !schema.imports.some((existing) => existing.name === imp.name)\n ) {\n schema.imports.push(imp);\n }\n }\n } else {\n schema.factory = factoryData.model;\n schema.factoryImports = factoryData.imports;\n schema.factoryMode = context.output.factoryMethods.mode;\n }\n }\n }\n\n deduplicatedModels.push(schema);\n }\n }\n\n return sortSchemasByDependencies(deduplicatedModels);\n}\n\nfunction sortSchemasByDependencies(\n schemas: GeneratorSchema[],\n): GeneratorSchema[] {\n if (schemas.length === 0) {\n return schemas;\n }\n\n const schemaNames = new Set(schemas.map((schema) => schema.name));\n const dependencyMap = new Map<string, Set<string>>();\n\n for (const schema of schemas) {\n const dependencies = new Set<string>();\n\n if (schema.dependencies)\n for (const dependencyName of schema.dependencies) {\n if (dependencyName && schemaNames.has(dependencyName)) {\n dependencies.add(dependencyName);\n }\n }\n\n for (const imp of schema.imports) {\n const dependencyName = imp.alias ?? imp.name;\n if (dependencyName && schemaNames.has(dependencyName)) {\n dependencies.add(dependencyName);\n }\n }\n\n dependencyMap.set(schema.name, dependencies);\n }\n\n const sorted: GeneratorSchema[] = [];\n const temporary = new Set<string>();\n const permanent = new Set<string>();\n const schemaMap = new Map(schemas.map((schema) => [schema.name, schema]));\n\n const visit = (name: string) => {\n if (permanent.has(name)) {\n return;\n }\n\n if (temporary.has(name)) {\n // Circular dependency detected; retain current DFS order for this cycle\n return;\n }\n\n temporary.add(name);\n\n const dependencies = dependencyMap.get(name);\n if (dependencies)\n for (const dep of dependencies) {\n if (dep !== name) {\n visit(dep);\n }\n }\n\n temporary.delete(name);\n permanent.add(name);\n\n const schema = schemaMap.get(name);\n if (schema) {\n sorted.push(schema);\n }\n };\n\n for (const schema of schemas) visit(schema.name);\n\n return sorted;\n}\n\nfunction shouldCreateInterface(schema: OpenApiSchemaObject) {\n const isNullable = isArray(schema.type) && schema.type.includes('null');\n\n return (\n (!schema.type || schema.type === 'object') &&\n !schema.allOf &&\n !schema.oneOf &&\n !schema.anyOf &&\n isDereferenced(schema) &&\n !schema.enum &&\n !isNullable\n );\n}\n\nfunction collectGenericParams(\n schema: OpenApiSchemaObject | OpenApiReferenceObject,\n): { anchorName: string; paramName: string }[] {\n const defs = (schema as Record<string, unknown>).$defs as\n | Record<string, OpenApiSchemaObject>\n | undefined;\n if (!defs || typeof defs !== 'object') return [];\n const anchors: string[] = [];\n for (const defSchema of Object.values(defs)) {\n if (!defSchema || typeof defSchema !== 'object') {\n continue;\n }\n const rec = defSchema as Record<string, unknown>;\n if (rec.$dynamicAnchor !== undefined && rec.$ref === undefined) {\n anchors.push(rec.$dynamicAnchor as string);\n }\n }\n const uniqueNames = dynamicAnchorsToUniqueParamNames(anchors);\n return anchors.map((anchor) => ({\n anchorName: anchor,\n paramName: uniqueNames.get(anchor) ?? dynamicAnchorToParamName(anchor),\n }));\n}\n\nfunction generateSchemaDefinitions(\n schemaName: string,\n schema: OpenApiSchemaObject,\n context: ContextSpec,\n suffix: string,\n): GeneratorSchema[] {\n const sanitizedSchemaName = sanitize(`${pascal(schemaName)}${suffix}`, {\n underscore: '_',\n whitespace: '_',\n dash: true,\n es5keyword: true,\n es5IdentifierName: true,\n });\n\n if (isBoolean(schema)) {\n return [\n {\n name: sanitizedSchemaName,\n model: `export type ${sanitizedSchemaName} = ${schema ? 'any' : 'never'};\\n`,\n imports: [],\n schema: schema as OpenApiSchemaObject,\n },\n ];\n }\n\n const alias = extractBoundAliasInfo(schema, context);\n if (alias) {\n const genericParams = alias.genericParams.map((paramName) => ({\n anchorName: paramName,\n paramName,\n }));\n const genericSuffix =\n genericParams.length > 0\n ? `<${genericParams.map((p) => p.paramName).join(', ')}>`\n : '';\n\n const typeArgsStr = alias.typeArgs.join(', ');\n const genericPart = `${alias.genericName}<${typeArgsStr}>`;\n\n const schemaType = schema.type as string | string[] | undefined;\n const nullable =\n (Array.isArray(schemaType) && schemaType.includes('null')) ||\n schema.nullable === true\n ? ' | null'\n : '';\n\n let model: string;\n const allImports: { name: string; schemaName: string }[] = [\n { name: alias.genericName, schemaName: alias.genericName },\n ...alias.imports,\n ];\n\n if (alias.extraSchemas && alias.extraSchemas.length > 0) {\n const aliasScopedContext = {\n ...context,\n dynamicScope: buildDynamicScope(schemaName, schema, context),\n };\n const subSchemas: GeneratorSchema[] = [];\n const extraParts = alias.extraSchemas.map((extraSchema) => {\n const resolved = resolveValue({\n schema: extraSchema,\n name: sanitizedSchemaName,\n context: aliasScopedContext,\n });\n for (const imp of resolved.imports) {\n const impSchemaName = imp.schemaName ?? imp.name;\n if (\n !allImports.some(\n (a) => a.name === imp.name && a.schemaName === impSchemaName,\n )\n ) {\n allImports.push({ name: imp.name, schemaName: impSchemaName });\n }\n }\n for (const sub of resolved.schemas) {\n if (sub.name !== sanitizedSchemaName) {\n subSchemas.push(sub);\n }\n }\n return resolved.value;\n });\n model = `export type ${sanitizedSchemaName}${genericSuffix} = (${[genericPart, ...extraParts].join(' & ')})${nullable};\\n`;\n return [\n ...subSchemas,\n {\n name: sanitizedSchemaName,\n model,\n imports: allImports,\n dependencies: allImports.map((i) => i.name),\n schema,\n },\n ];\n } else {\n model = `export type ${sanitizedSchemaName}${genericSuffix} = ${genericPart}${nullable};\\n`;\n }\n\n return [\n {\n name: sanitizedSchemaName,\n model,\n imports: allImports,\n dependencies: allImports.map((i) => i.name),\n schema,\n },\n ];\n }\n\n const scopedContext = isBoolean(schema)\n ? context\n : {\n ...context,\n dynamicScope: buildDynamicScope(schemaName, schema, context),\n };\n\n const genericParams = collectGenericParams(schema);\n\n if (shouldCreateInterface(schema)) {\n return generateInterface({\n name: sanitizedSchemaName,\n schema,\n context: scopedContext,\n genericParams:\n genericParams.length > 0\n ? genericParams.map((p) => p.paramName)\n : undefined,\n });\n }\n\n const resolvedValue = resolveValue({\n schema,\n name: sanitizedSchemaName,\n context: scopedContext,\n });\n\n let output = '';\n\n let imports = resolvedValue.imports;\n\n output += jsDoc(schema);\n\n if (resolvedValue.isEnum && !resolvedValue.isRef) {\n output += getEnum(\n resolvedValue.value,\n sanitizedSchemaName,\n getEnumNames(resolvedValue.originalSchema),\n context.output.override.enumGenerationType,\n getEnumDescriptions(resolvedValue.originalSchema),\n context.output.override.namingConvention.enum,\n );\n } else if (\n sanitizedSchemaName === resolvedValue.value &&\n resolvedValue.isRef\n ) {\n // Don't add type if schema has same name and the referred schema will be an interface\n const { schema: referredSchema } = resolveRef(schema, scopedContext);\n if (!shouldCreateInterface(referredSchema as OpenApiSchemaObject)) {\n const imp = resolvedValue.imports.find(\n (imp) => imp.name === sanitizedSchemaName,\n );\n\n if (imp) {\n const alias = `${resolvedValue.value}Bis`;\n\n output += `export type ${sanitizedSchemaName} = ${alias};\\n`;\n\n imports = imports.map((imp) =>\n imp.name === sanitizedSchemaName ? { ...imp, alias } : imp,\n );\n resolvedValue.dependencies = [imp.name];\n } else {\n output += `export type ${sanitizedSchemaName} = ${resolvedValue.value};\\n`;\n }\n }\n } else {\n resolvedValue.schemas = resolvedValue.schemas.filter((schema) => {\n if (schema.name !== sanitizedSchemaName) {\n return true;\n }\n\n output += `${schema.model}\\n`;\n imports = [...imports, ...schema.imports];\n resolvedValue.dependencies.push(...(schema.dependencies ?? []));\n\n return false;\n });\n const genericSuffix =\n genericParams.length > 0\n ? `<${genericParams.map((p) => p.paramName).join(', ')}>`\n : '';\n output += `export type ${sanitizedSchemaName}${genericSuffix} = ${resolvedValue.value};\\n`;\n }\n\n return [\n ...resolvedValue.schemas,\n {\n name: sanitizedSchemaName,\n model: output,\n imports,\n dependencies: resolvedValue.dependencies,\n schema,\n },\n ];\n}\n","import {\n getBodiesByContentType,\n getBody,\n getOperationId,\n getParameters,\n getParams,\n getProps,\n getQueryParams,\n getResponse,\n} from '../getters';\nimport type {\n ContextSpec,\n GeneratorVerbOptions,\n GeneratorVerbsOptions,\n GetterBody,\n NormalizedInputOptions,\n NormalizedMutator,\n NormalizedOperationOptions,\n NormalizedOutputOptions,\n NormalizedOverrideOutput,\n OpenApiComponentsObject,\n OpenApiOperationObject,\n OpenApiPathItemObject,\n OpenApiRequestBodyObject,\n Verbs,\n} from '../types';\nimport {\n asyncReduce,\n camel,\n dynamicImport,\n isObject,\n isString,\n isVerb,\n jsDoc,\n mergeDeep,\n sanitize,\n} from '../utils';\nimport { filteredVerbs } from './input-filters';\nimport { generateMutator } from './mutator';\n\nexport interface GenerateVerbOptionsParams {\n verb: Verbs;\n output: NormalizedOutputOptions;\n operation: OpenApiOperationObject;\n route: string;\n pathRoute: string;\n verbParameters?: OpenApiPathItemObject['parameters'];\n components?: OpenApiComponentsObject;\n context: ContextSpec;\n}\n\nasync function buildVerbOption({\n verb,\n output,\n operation,\n route,\n pathRoute,\n verbParameters = [],\n context,\n body,\n operationName,\n operationId,\n override,\n tags,\n deprecated,\n description,\n summary,\n}: {\n verb: Verbs;\n output: NormalizedOutputOptions;\n operation: OpenApiOperationObject;\n route: string;\n pathRoute: string;\n verbParameters: OpenApiPathItemObject['parameters'];\n context: ContextSpec;\n body: GetterBody;\n operationName: string;\n operationId: string;\n override: NormalizedOverrideOutput;\n tags: string[];\n deprecated: boolean | undefined;\n description: string | undefined;\n summary: string | undefined;\n}): Promise<GeneratorVerbOptions> {\n const response = getResponse({\n responses: operation.responses ?? {},\n operationName,\n context,\n contentType: override.contentType,\n });\n\n const parameters = getParameters({\n parameters: [...verbParameters, ...(operation.parameters ?? [])],\n context,\n });\n\n const queryParams = getQueryParams({\n queryParams: parameters.query,\n operationName,\n context,\n });\n\n const headers = output.headers\n ? getQueryParams({\n queryParams: parameters.header,\n operationName,\n context,\n suffix: 'headers',\n })\n : undefined;\n\n const params = getParams({\n route,\n pathParams: parameters.path,\n operationId,\n context,\n output,\n });\n\n const props = getProps({\n body,\n queryParams,\n params,\n headers,\n operationName,\n context,\n });\n\n const mutator = await generateMutator({\n output: output.target,\n name: operationName,\n mutator: override.mutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n });\n\n const formData =\n !override.formData.disabled && body.formData\n ? await generateMutator({\n output: output.target,\n name: operationName,\n mutator: override.formData.mutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const formUrlEncoded =\n isString(override.formUrlEncoded) || isObject(override.formUrlEncoded)\n ? await generateMutator({\n output: output.target,\n name: operationName,\n mutator: override.formUrlEncoded as NormalizedMutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const paramsSerializer =\n isString(override.paramsSerializer) || isObject(override.paramsSerializer)\n ? await generateMutator({\n output: output.target,\n name: 'paramsSerializer',\n mutator: override.paramsSerializer as NormalizedMutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const paramsFilter =\n isString(override.paramsFilter) || isObject(override.paramsFilter)\n ? await generateMutator({\n output: output.target,\n name: 'paramsFilter',\n mutator: override.paramsFilter as NormalizedMutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n\n const fetchReviver =\n isString(override.fetch.jsonReviver) || isObject(override.fetch.jsonReviver)\n ? await generateMutator({\n output: output.target,\n name: 'fetchReviver',\n mutator: override.fetch.jsonReviver as NormalizedMutator,\n workspace: context.workspace,\n tsconfig: context.output.tsconfig,\n })\n : undefined;\n const doc = jsDoc({ description, deprecated, summary });\n\n const verbOption: GeneratorVerbOptions = {\n verb,\n tags,\n route,\n pathRoute,\n summary,\n operationId,\n operationName,\n response,\n body,\n headers,\n queryParams,\n params,\n props,\n mutator,\n formData,\n formUrlEncoded,\n paramsSerializer,\n paramsFilter,\n fetchReviver,\n override,\n doc,\n deprecated,\n originalOperation: operation,\n };\n\n const transformer = await dynamicImport(\n override.transformer,\n context.workspace,\n );\n\n return transformer ? transformer(verbOption) : verbOption;\n}\n\nexport async function generateVerbOptions({\n verb,\n output,\n operation,\n route,\n pathRoute,\n verbParameters = [],\n context,\n}: GenerateVerbOptionsParams): Promise<GeneratorVerbOptions[]> {\n const {\n requestBody,\n tags: rawTags,\n deprecated: rawDeprecated,\n description: rawDescription,\n summary: rawSummary,\n } = operation;\n\n // Bridge assertions: OpenApiOperationObject has AnyOtherAttribute index signature\n // which makes all destructured properties `any`. Assert to their declared types.\n const tags = (rawTags ?? []) as string[];\n const deprecated = rawDeprecated as boolean | undefined;\n const description = rawDescription as string | undefined;\n const summary = rawSummary as string | undefined;\n const operationId = getOperationId(operation, route, verb);\n const overrideOperation = output.override.operations[operationId];\n let overrideTag: NormalizedOperationOptions = {};\n for (const [tag, options] of Object.entries(output.override.tags)) {\n if (tags.includes(tag) && options) {\n overrideTag = mergeDeep(overrideTag, options);\n }\n }\n\n const override = mergeDeep(\n mergeDeep(output.override, overrideTag),\n overrideOperation ?? {},\n ) as NormalizedOverrideOutput;\n\n const overrideOperationName =\n overrideOperation?.operationName ?? output.override.operationName;\n const operationName = overrideOperationName\n ? overrideOperationName(operation, route, verb)\n : sanitize(camel(operationId), { es5keyword: true });\n\n const splitByContentType = override.splitByContentType;\n\n if (splitByContentType && requestBody) {\n const bodies = getBodiesByContentType({\n requestBody,\n operationName,\n context,\n contentType: override.contentType,\n });\n\n const results: GeneratorVerbOptions[] = [];\n for (const bodyEntry of bodies) {\n const { contentTypeSuffix, ...body } = bodyEntry;\n const suffixedName = contentTypeSuffix\n ? `${operationName}With${contentTypeSuffix}`\n : operationName;\n\n const verbOption = await buildVerbOption({\n verb,\n output,\n operation,\n route,\n pathRoute,\n verbParameters,\n context,\n body,\n operationName: suffixedName,\n operationId,\n override,\n tags,\n deprecated,\n description,\n summary,\n });\n results.push(verbOption);\n }\n return results;\n }\n\n const body = requestBody\n ? getBody({\n requestBody,\n operationName,\n context,\n contentType: override.contentType,\n })\n : {\n originalSchema: {} as OpenApiRequestBodyObject,\n definition: '',\n implementation: '',\n imports: [],\n schemas: [],\n formData: '',\n formUrlEncoded: '',\n contentType: '',\n isOptional: false,\n };\n\n const verbOption = await buildVerbOption({\n verb,\n output,\n operation,\n route,\n pathRoute,\n verbParameters,\n context,\n body,\n operationName,\n operationId,\n override,\n tags,\n deprecated,\n description,\n summary,\n });\n\n return [verbOption];\n}\n\nexport interface GenerateVerbsOptionsParams {\n verbs: OpenApiPathItemObject;\n input: NormalizedInputOptions;\n output: NormalizedOutputOptions;\n route: string;\n pathRoute: string;\n context: ContextSpec;\n}\n\nexport function generateVerbsOptions({\n verbs,\n input,\n output,\n route,\n pathRoute,\n context,\n}: GenerateVerbsOptionsParams): Promise<GeneratorVerbsOptions> {\n return asyncReduce(\n filteredVerbs(verbs, input.filters),\n async (acc, [verb, operation]: [string, OpenApiOperationObject]) => {\n if (isVerb(verb)) {\n const verbOptions = await generateVerbOptions({\n verb,\n output,\n verbParameters: verbs.parameters,\n route,\n pathRoute,\n operation,\n context,\n });\n\n acc.push(...verbOptions);\n }\n\n return acc;\n },\n [] as GeneratorVerbsOptions,\n );\n}\n","import fs from 'fs-extra';\n\nconst TRAILING_WHITESPACE_RE = /[^\\S\\r\\n]+$/gm;\n\n/**\n * Write generated code to a file, stripping trailing whitespace from each line.\n *\n * Template literals in code generators can produce lines with only whitespace\n * when conditional expressions evaluate to empty strings. This function\n * ensures the output is always clean regardless of generator implementation.\n */\nexport async function writeGeneratedFile(\n filePath: string,\n content: string,\n): Promise<void> {\n await fs.outputFile(filePath, content.replaceAll(TRAILING_WHITESPACE_RE, ''));\n}\n","import nodePath from 'node:path';\n\nimport fs from 'fs-extra';\nimport { groupBy } from 'remeda';\n\nimport { generateImports } from '../generators';\nimport {\n type GeneratorImport,\n type GeneratorSchema,\n NamingConvention,\n type Tsconfig,\n} from '../types';\nimport { conventionName, getImportExtension, upath } from '../utils';\nimport { writeGeneratedFile } from './file';\n\ntype CanonicalInfo = Pick<GeneratorImport, 'importPath' | 'name'>;\n\n/**\n * Patterns to detect operation-derived types (params, bodies, responses).\n * These types are auto-generated from OpenAPI operations, not from component schemas.\n */\nconst OPERATION_TYPE_PATTERNS = [\n /Params$/i, // GetUserParams, ListUsersParams\n /Body$/, // CreateUserBody, UpdatePostBody (case-sensitive to avoid \"Antibody\")\n /Body(One|Two|Three|Four|Five|Item)$/, // BodyOne, BodyTwo (union body types)\n /Parameter$/i, // PageParameter, LimitParameter\n /Query$/i, // GetUserQuery\n /Header$/i, // AuthHeader\n /Response\\d*$/i, // GetUser200Response, NotFoundResponse\n /^[1-5]\\d{2}$/, // 200, 201, 404 (valid HTTP status codes: 1xx-5xx)\n /\\d{3}(One|Two|Three|Four|Five|Item)$/i, // 200One, 200Two (union response types)\n /^(get|post|put|patch|delete|head|options)[A-Z].*\\d{3}$/, // operation types with status codes (get...200, post...404)\n];\n\n/**\n * Check if a schema name matches operation type patterns.\n */\nfunction isOperationType(schemaName: string): boolean {\n return OPERATION_TYPE_PATTERNS.some((pattern) => pattern.test(schemaName));\n}\n\n/**\n * Split schemas into regular and operation types.\n */\nexport function splitSchemasByType(schemas: GeneratorSchema[]): {\n regularSchemas: GeneratorSchema[];\n operationSchemas: GeneratorSchema[];\n} {\n const regularSchemas: GeneratorSchema[] = [];\n const operationSchemas: GeneratorSchema[] = [];\n\n for (const schema of schemas) {\n if (isOperationType(schema.name)) {\n operationSchemas.push(schema);\n } else {\n regularSchemas.push(schema);\n }\n }\n\n return { regularSchemas, operationSchemas };\n}\n\n/**\n * Fix cross-directory imports when schemas reference other schemas in a different directory.\n * Updates import paths to use correct relative paths between directories.\n */\nfunction fixSchemaImports(\n schemas: GeneratorSchema[],\n targetSchemaNames: Set<string>,\n fromPath: string,\n toPath: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n tsconfig?: Tsconfig,\n): void {\n const relativePath = upath.relativeSafe(fromPath, toPath);\n const importExtension = getImportExtension(fileExtension, tsconfig);\n\n for (const schema of schemas) {\n schema.imports = schema.imports.map((imp) => {\n if (targetSchemaNames.has(imp.name)) {\n const fileName = conventionName(imp.name, namingConvention);\n return {\n ...imp,\n importPath: upath.joinSafe(relativePath, fileName) + importExtension,\n };\n }\n return imp;\n });\n }\n}\n\n/**\n * Fix imports in operation schemas that reference regular schemas.\n */\nexport function fixCrossDirectoryImports(\n operationSchemas: GeneratorSchema[],\n regularSchemaNames: Set<string>,\n schemaPath: string,\n operationSchemaPath: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n tsconfig?: Tsconfig,\n): void {\n fixSchemaImports(\n operationSchemas,\n regularSchemaNames,\n operationSchemaPath,\n schemaPath,\n namingConvention,\n fileExtension,\n tsconfig,\n );\n}\n\n/**\n * Fix imports in regular schemas that reference operation schemas.\n */\nexport function fixRegularSchemaImports(\n regularSchemas: GeneratorSchema[],\n operationSchemaNames: Set<string>,\n schemaPath: string,\n operationSchemaPath: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n tsconfig?: Tsconfig,\n): void {\n fixSchemaImports(\n regularSchemas,\n operationSchemaNames,\n schemaPath,\n operationSchemaPath,\n namingConvention,\n fileExtension,\n tsconfig,\n );\n}\n\nfunction getSchemaKey(\n schemaPath: string,\n schemaName: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n) {\n return getPath(\n schemaPath,\n conventionName(schemaName, namingConvention),\n fileExtension,\n )\n .toLowerCase()\n .replaceAll('\\\\', '/');\n}\n\nfunction getSchemaGroups(\n schemaPath: string,\n schemas: GeneratorSchema[],\n namingConvention: NamingConvention,\n fileExtension: string,\n) {\n return groupBy(schemas, (schema) =>\n getSchemaKey(schemaPath, schema.name, namingConvention, fileExtension),\n );\n}\n\nfunction getCanonicalMap(\n schemaGroups: Record<string, GeneratorSchema[]>,\n schemaPath: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n) {\n const canonicalPathMap = new Map<string, CanonicalInfo>();\n const canonicalNameMap = new Map<string, CanonicalInfo>();\n\n for (const [key, groupSchemas] of Object.entries(schemaGroups)) {\n const canonicalPath = getPath(\n schemaPath,\n conventionName(groupSchemas[0].name, namingConvention),\n fileExtension,\n );\n\n const canonicalInfo = {\n importPath: canonicalPath,\n name: groupSchemas[0].name,\n };\n\n canonicalPathMap.set(key, canonicalInfo);\n for (const schema of groupSchemas) {\n canonicalNameMap.set(schema.name, canonicalInfo);\n }\n }\n\n return {\n canonicalPathMap,\n canonicalNameMap,\n };\n}\n\nfunction normalizeCanonicalImportPaths(\n schemas: GeneratorSchema[],\n canonicalPathMap: Map<string, CanonicalInfo>,\n canonicalNameMap: Map<string, CanonicalInfo>,\n schemaPath: string,\n namingConvention: NamingConvention,\n fileExtension: string,\n tsconfig?: Tsconfig,\n factoryOutputDirectory?: string,\n) {\n const importExtension = getImportExtension(fileExtension, tsconfig);\n const factoryDir = factoryOutputDirectory ?? schemaPath;\n\n for (const schema of schemas) {\n schema.imports = schema.imports.map((imp) => {\n const canonicalByName = canonicalNameMap.get(imp.name);\n\n const resolvedImportKey = resolveImportKey(\n schemaPath,\n imp.importPath ?? `./${conventionName(imp.name, namingConvention)}`,\n fileExtension,\n );\n const canonicalByPath = canonicalPathMap.get(resolvedImportKey);\n const canonical = canonicalByName ?? canonicalByPath;\n if (!canonical?.importPath) return imp;\n\n const relative = upath.relativeSafe(\n schemaPath,\n canonical.importPath.replaceAll('\\\\', '/'),\n );\n // `relative` derives from canonical.importPath (built via getPath) so it\n // normally ends with `fileExtension`; the `.ts$` branch is a defensive\n // fallback for legacy/hardcoded `.ts` paths that don't match the\n // configured fileExtension (e.g. `.gen.ts`).\n const withoutFileExtension = relative.endsWith(fileExtension)\n ? relative.slice(0, -fileExtension.length)\n : relative.replace(/\\.ts$/, '');\n const importPath = `${withoutFileExtension}${importExtension}`;\n\n return { ...imp, importPath };\n });\n\n if (schema.factoryImports) {\n schema.factoryImports = schema.factoryImports.map((imp) => {\n const canonicalByName = canonicalNameMap.get(imp.name);\n\n const resolvedImportKey = resolveImportKey(\n factoryDir,\n imp.importPath ?? `./${conventionName(imp.name, namingConvention)}`,\n fileExtension,\n );\n const canonicalByPath = canonicalPathMap.get(resolvedImportKey);\n const canonical = canonicalByName ?? canonicalByPath;\n if (!canonical?.importPath) return imp;\n\n const relative = upath.relativeSafe(\n factoryDir,\n canonical.importPath.replaceAll('\\\\', '/'),\n );\n const withoutFileExtension = relative.endsWith(fileExtension)\n ? relative.slice(0, -fileExtension.length)\n : relative.replace(/\\.ts$/, '');\n const importPath = `${withoutFileExtension}${importExtension}`;\n\n return { ...imp, importPath };\n });\n }\n }\n}\n\nfunction mergeSchemaGroup(schemas: GeneratorSchema[]): GeneratorSchema {\n const baseSchemaName = schemas[0].name;\n const baseSchema = schemas[0].schema;\n const mergedImports = [\n ...new Map(\n schemas\n .flatMap((schema) => schema.imports)\n .map((imp) => [JSON.stringify(imp), imp]),\n ).values(),\n ];\n const mergedDependencies = [\n ...new Set(schemas.flatMap((schema) => schema.dependencies ?? [])),\n ];\n\n const mergedFactory = schemas\n .map((s) => s.factory)\n .filter(Boolean)\n .join('\\n');\n const mergedFactoryImports = [\n ...new Map(\n schemas\n .flatMap((schema) => schema.factoryImports ?? [])\n .map((imp) => [JSON.stringify(imp), imp] as [string, GeneratorImport]),\n ).values(),\n ];\n\n return {\n name: baseSchemaName,\n schema: baseSchema,\n model: schemas.map((schema) => schema.model).join('\\n'),\n imports: mergedImports,\n dependencies: mergedDependencies,\n factory: mergedFactory || undefined,\n factoryImports: mergedFactoryImports,\n factoryMode: schemas[0].factoryMode,\n };\n}\n\nfunction resolveImportKey(\n schemaPath: string,\n importPath: string,\n fileExtension: string,\n) {\n return upath\n .join(schemaPath, `${importPath}${fileExtension}`)\n .toLowerCase()\n .replaceAll('\\\\', '/');\n}\n\ninterface GetSchemaOptions {\n schema: GeneratorSchema;\n target: string;\n header: string;\n namingConvention?: NamingConvention;\n importExtension?: string;\n}\n\nfunction getSchema({\n schema: { imports, model },\n header,\n namingConvention = NamingConvention.CAMEL_CASE,\n importExtension,\n}: GetSchemaOptions): string {\n let file = header;\n file += generateImports({\n imports: imports.filter(\n (imp) =>\n !model.includes(`type ${imp.alias ?? imp.name} =`) &&\n !model.includes(`interface ${imp.alias ?? imp.name} {`),\n ),\n namingConvention,\n importExtension,\n });\n file += imports.length > 0 ? '\\n\\n' : '\\n';\n file += model;\n return file;\n}\n\nfunction getPath(path: string, name: string, fileExtension: string): string {\n return nodePath.join(path, `${name}${fileExtension}`);\n}\n\nexport function writeModelInline(acc: string, model: string): string {\n return acc + `${model}\\n`;\n}\n\nexport function writeModelsInline(array: GeneratorSchema[]): string {\n let acc = '';\n for (const { model } of array) {\n acc = writeModelInline(acc, model);\n }\n return acc;\n}\n\ninterface WriteSchemaOptions {\n path: string;\n schema: GeneratorSchema;\n target: string;\n namingConvention: NamingConvention;\n fileExtension: string;\n header: string;\n tsconfig?: Tsconfig;\n}\n\nexport async function writeSchema({\n path,\n schema,\n target,\n namingConvention,\n fileExtension,\n header,\n tsconfig,\n}: WriteSchemaOptions) {\n const name = conventionName(schema.name, namingConvention);\n\n try {\n await writeGeneratedFile(\n getPath(path, name, fileExtension),\n getSchema({\n schema,\n target,\n header,\n namingConvention,\n importExtension: getImportExtension(fileExtension, tsconfig),\n }),\n );\n } catch (error) {\n throw new Error(\n `Oups... 🍻. An Error occurred while writing schema ${name} => ${String(error)}`,\n { cause: error },\n );\n }\n}\n\ninterface WriteSchemasOptions {\n schemaPath: string;\n schemas: GeneratorSchema[];\n target: string;\n namingConvention: NamingConvention;\n fileExtension: string;\n header: string;\n indexFiles: boolean;\n tsconfig?: Tsconfig;\n factoryOutputDirectory?: string;\n}\n\nasync function emitFactoryForSchema(\n schema: GeneratorSchema,\n namingConvention: NamingConvention,\n header: string,\n factoryDir: string,\n fileExtension: string,\n helpers: {\n separateFactoryNames: string[];\n combinedFactoryContent: { value: string };\n combinedFactoryImports: GeneratorImport[];\n isCombined: { value: boolean };\n },\n) {\n if (schema.factory && schema.factoryMode) {\n const mode = schema.factoryMode;\n if (mode === 'split') {\n const baseName = conventionName(schema.name, namingConvention);\n const factoryName = `${baseName}.factory`;\n helpers.separateFactoryNames.push(factoryName);\n const factoryImportsStr = generateImports({\n imports: schema.factoryImports ?? [],\n namingConvention,\n });\n const factoryFile = `${header}\\n${factoryImportsStr}\\n\\n${schema.factory}`;\n await writeGeneratedFile(\n getPath(factoryDir, factoryName, fileExtension),\n factoryFile,\n );\n } else if (mode === 'single-split') {\n helpers.isCombined.value = true;\n helpers.combinedFactoryContent.value += `${schema.factory}\\n`;\n helpers.combinedFactoryImports.push(...(schema.factoryImports ?? []));\n }\n }\n}\n\nexport async function writeSchemas({\n schemaPath,\n schemas,\n target,\n namingConvention,\n fileExtension,\n header,\n indexFiles,\n tsconfig,\n factoryOutputDirectory,\n}: WriteSchemasOptions) {\n const schemaGroups = getSchemaGroups(\n schemaPath,\n schemas,\n namingConvention,\n fileExtension,\n );\n\n const { canonicalPathMap, canonicalNameMap } = getCanonicalMap(\n schemaGroups,\n schemaPath,\n namingConvention,\n fileExtension,\n );\n\n normalizeCanonicalImportPaths(\n schemas,\n canonicalPathMap,\n canonicalNameMap,\n schemaPath,\n namingConvention,\n fileExtension,\n tsconfig,\n factoryOutputDirectory,\n );\n\n const factoryDir = factoryOutputDirectory ?? schemaPath;\n\n const combinedFactoryContent = { value: '' };\n const combinedFactoryImports: GeneratorImport[] = [];\n const isCombined = { value: false };\n const separateFactoryNames: string[] = [];\n\n const factoryHelpers = {\n separateFactoryNames,\n combinedFactoryContent,\n combinedFactoryImports,\n isCombined,\n };\n\n for (const groupSchemas of Object.values(schemaGroups)) {\n if (groupSchemas.length === 1) {\n await writeSchema({\n path: schemaPath,\n schema: groupSchemas[0],\n target,\n namingConvention,\n fileExtension,\n header,\n tsconfig,\n });\n\n const singleSchema = groupSchemas[0];\n await emitFactoryForSchema(\n singleSchema,\n namingConvention,\n header,\n factoryDir,\n fileExtension,\n factoryHelpers,\n );\n continue;\n }\n\n const mergedSchema = mergeSchemaGroup(groupSchemas);\n\n await writeSchema({\n path: schemaPath,\n schema: mergedSchema,\n target,\n namingConvention,\n fileExtension,\n header,\n tsconfig,\n });\n\n await emitFactoryForSchema(\n mergedSchema,\n namingConvention,\n header,\n factoryDir,\n fileExtension,\n factoryHelpers,\n );\n }\n\n if (isCombined.value) {\n const factoryFileName = conventionName('factoryMethods', namingConvention);\n const factoryFileImports = generateImports({\n imports: combinedFactoryImports,\n namingConvention,\n });\n const factoryFile = `${header}\\n${factoryFileImports}\\n\\n${combinedFactoryContent.value}`;\n await writeGeneratedFile(\n getPath(factoryDir, factoryFileName, fileExtension),\n factoryFile,\n );\n }\n\n if (indexFiles) {\n const schemaFilePath = nodePath.join(schemaPath, `index.ts`);\n await fs.ensureFile(schemaFilePath);\n\n // Ensure separate files are used for parallel schema writing.\n // Throw an exception if duplicates are detected (using convention names)\n const ext = getImportExtension(fileExtension, tsconfig);\n const conventionNamesSet = new Set(\n Object.values(schemaGroups).map((group) =>\n conventionName(group[0].name, namingConvention),\n ),\n );\n\n try {\n // Create unique export statements from schemas (deduplicate by schema name)\n const uniqueSchemaNames = [...conventionNamesSet];\n\n // Create export statements\n const currentExports = uniqueSchemaNames.map(\n (schemaName) => `export * from './${schemaName}${ext}';`,\n );\n\n if (\n factoryOutputDirectory &&\n upath.normalizeSafe(factoryOutputDirectory) !==\n upath.normalizeSafe(schemaPath) &&\n (isCombined.value || separateFactoryNames.length > 0)\n ) {\n const factoryIndexFilePath = nodePath.join(\n factoryOutputDirectory,\n `index.ts`,\n );\n await fs.ensureFile(factoryIndexFilePath);\n const factoryExports: string[] = [];\n if (isCombined.value) {\n const factoryFileName = conventionName(\n 'factoryMethods',\n namingConvention,\n );\n factoryExports.push(`export * from './${factoryFileName}${ext}';`);\n }\n for (const fName of separateFactoryNames) {\n factoryExports.push(`export * from './${fName}${ext}';`);\n }\n const content = `${header}\\n${factoryExports.join('\\n')}\\n`;\n await writeGeneratedFile(factoryIndexFilePath, content);\n } else {\n if (isCombined.value) {\n const factoryFileName = conventionName(\n 'factoryMethods',\n namingConvention,\n );\n currentExports.push(`export * from './${factoryFileName}${ext}';`);\n }\n for (const fName of separateFactoryNames) {\n currentExports.push(`export * from './${fName}${ext}';`);\n }\n }\n\n const exports = [...new Set(currentExports)]\n .toSorted((a, b) => a.localeCompare(b, 'en', { numeric: true }))\n .join('\\n');\n\n const fileContent = `${header}\\n${exports}\\n`;\n\n await writeGeneratedFile(schemaFilePath, fileContent);\n } catch (error) {\n throw new Error(\n `Oups... 🍻. An Error occurred while writing schema index file ${schemaFilePath} => ${String(error)}`,\n { cause: error },\n );\n }\n }\n}\n","import { uniqueBy } from 'remeda';\n\nimport type {\n GeneratorDependency,\n GeneratorImport,\n NormalizedOutputOptions,\n} from '../types';\nimport { conventionName, getImportExtension, isObject, upath } from '../utils';\n\nexport function generateImportsForBuilder(\n output: NormalizedOutputOptions,\n imports: readonly GeneratorImport[],\n relativeSchemasPath: string,\n): GeneratorDependency[] {\n const isZodSchemaOutput =\n isObject(output.schemas) && output.schemas.type === 'zod';\n\n // Schema-factory imports (`getPetMock` and friends) always resolve to the\n // consolidated `<schemas-dir>/index.faker` file emitted by the faker\n // schemas option. They bypass the per-schema convention naming below.\n // Append `getImportExtension` so NodeNext / Node16 module resolution\n // gets the required local-file extension (e.g. `.js`).\n const schemaFactoryImports = imports.filter((i) => i.schemaFactory);\n const schemaFactoryImportExtension = getImportExtension(\n output.fileExtension,\n output.tsconfig,\n );\n const schemaFactoryDeps: GeneratorDependency[] =\n schemaFactoryImports.length > 0\n ? [\n {\n exports: uniqueBy(\n schemaFactoryImports,\n (entry) => `${entry.name}|${entry.alias ?? ''}`,\n ),\n dependency: upath.joinSafe(\n relativeSchemasPath,\n `index.faker${schemaFactoryImportExtension}`,\n ),\n },\n ]\n : [];\n\n // The rest of the schema-import bucket is for types emitted alongside\n // each schema (`Pet`, `PetWithTag`, ...). They're routed below.\n imports = imports.filter((i) => !i.schemaFactory);\n\n let schemaImports: GeneratorDependency[];\n if (output.indexFiles) {\n schemaImports = isZodSchemaOutput\n ? [\n {\n exports: imports.filter((i) => !i.importPath),\n dependency: relativeSchemasPath,\n },\n ]\n : [\n {\n exports: imports.filter((i) => !i.importPath),\n dependency: relativeSchemasPath,\n },\n ];\n } else {\n const importsByDependency = new Map<string, GeneratorImport[]>();\n\n for (const schemaImport of imports.filter((i) => !i.importPath)) {\n const baseName = isZodSchemaOutput\n ? schemaImport.name\n : (schemaImport.schemaName ?? schemaImport.name);\n const normalizedName = conventionName(baseName, output.namingConvention);\n const suffix = isZodSchemaOutput ? '.zod' : '';\n const importExtension = getImportExtension(\n output.fileExtension,\n output.tsconfig,\n );\n const dependency = upath.joinSafe(\n relativeSchemasPath,\n `${normalizedName}${suffix}${importExtension}`,\n );\n\n if (!importsByDependency.has(dependency)) {\n importsByDependency.set(dependency, []);\n }\n importsByDependency.get(dependency)?.push(schemaImport);\n }\n\n schemaImports = [...importsByDependency.entries()].map(\n ([dependency, dependencyImports]) => ({\n dependency,\n exports: uniqueBy(\n dependencyImports,\n (entry) =>\n `${entry.name}|${entry.alias ?? ''}|${String(entry.values)}|${String(\n entry.default,\n )}`,\n ),\n }),\n );\n }\n\n const otherImports = uniqueBy(\n imports.filter(\n (i): i is GeneratorImport & { importPath: string } => !!i.importPath,\n ),\n (x) => x.name + x.importPath,\n ).map<GeneratorDependency>((i) => {\n return {\n exports: [i],\n dependency: i.importPath,\n };\n });\n\n return [...schemaImports, ...schemaFactoryDeps, ...otherImports];\n}\n","import {\n type GeneratorMockOutput,\n type GeneratorMockOutputFull,\n OutputMockType,\n} from '../types';\n\n/**\n * Collapses the per-generator mock outputs for \"inline\" writer modes\n * (`single`, `tags`) where every mock generator's content is concatenated\n * into the implementation file. The MSW generator already emits the\n * response-factory functions (`get<Op>ResponseMock`) that Faker would emit,\n * so when both generators are configured we keep MSW and drop Faker to\n * avoid duplicate function declarations and re-imported faker bindings.\n */\nexport function collapseInlineMockOutputs<\n T extends GeneratorMockOutput | GeneratorMockOutputFull,\n>(mockOutputs: T[]): T[] {\n const hasMsw = mockOutputs.some((m) => m.type === OutputMockType.MSW);\n if (!hasMsw) return mockOutputs;\n return mockOutputs.filter((m) => m.type !== OutputMockType.FAKER);\n}\n","import {\n type GeneratorMockOutput,\n type GeneratorMockOutputFull,\n type GeneratorTarget,\n type GeneratorTargetFull,\n type NormalizedOutputOptions,\n OutputClient,\n type WriteSpecBuilder,\n} from '../types';\nimport { compareVersions, pascal } from '../utils';\n\nfunction emptyMockOutputFull(\n type: GeneratorMockOutputFull['type'],\n): GeneratorMockOutputFull {\n return {\n type,\n implementation: { function: '', handler: '', handlerName: '' },\n imports: [],\n };\n}\n\nfunction flattenMockOutput(full: GeneratorMockOutputFull): GeneratorMockOutput {\n return {\n type: full.type,\n implementation: full.implementation.function + full.implementation.handler,\n imports: full.imports,\n };\n}\n\nexport function generateTarget(\n builder: WriteSpecBuilder,\n options: NormalizedOutputOptions,\n): GeneratorTarget {\n const operationNames = Object.values(builder.operations).map(\n ({ operationName }) => operationName,\n );\n const isAngularClient = options.client === OutputClient.ANGULAR;\n\n const titles = builder.title({\n outputClient: options.client,\n title: pascal(builder.info.title),\n customTitleFunc: options.override.title,\n output: options,\n });\n\n const target: Required<Omit<GeneratorTargetFull, 'mockOutputs'>> & {\n mockOutputs: GeneratorMockOutputFull[];\n } = {\n imports: [],\n implementation: '',\n mockOutputs: [],\n mutators: [],\n clientMutators: [],\n formData: [],\n formUrlEncoded: [],\n paramsSerializer: [],\n paramsFilter: [],\n fetchReviver: [],\n };\n const operations = Object.values(builder.operations);\n for (const [index, operation] of operations.entries()) {\n target.imports.push(...operation.imports);\n target.implementation += operation.implementation + '\\n';\n\n // Merge per-mock-type outputs from this operation into the accumulator.\n for (const opMock of operation.mockOutputs) {\n let acc = target.mockOutputs.find((m) => m.type === opMock.type);\n if (!acc) {\n acc = emptyMockOutputFull(opMock.type);\n target.mockOutputs.push(acc);\n }\n acc.imports.push(...opMock.imports);\n acc.implementation.function += opMock.implementation.function;\n acc.implementation.handler += opMock.implementation.handler;\n if (opMock.implementation.handlerName) {\n const separator =\n acc.implementation.handlerName.length > 0 ? ',\\n ' : ' ';\n acc.implementation.handlerName +=\n separator + opMock.implementation.handlerName + '()';\n }\n }\n\n if (operation.mutator) {\n target.mutators.push(operation.mutator);\n }\n\n if (operation.formData) {\n target.formData.push(operation.formData);\n }\n if (operation.formUrlEncoded) {\n target.formUrlEncoded.push(operation.formUrlEncoded);\n }\n if (operation.paramsSerializer) {\n target.paramsSerializer.push(operation.paramsSerializer);\n }\n if (operation.paramsFilter) {\n target.paramsFilter.push(operation.paramsFilter);\n }\n\n if (operation.clientMutators) {\n target.clientMutators.push(...operation.clientMutators);\n }\n\n if (operation.fetchReviver) {\n target.fetchReviver.push(operation.fetchReviver);\n }\n\n if (index === operations.length - 1) {\n const isMutator = target.mutators.some((mutator) =>\n isAngularClient ? mutator.hasThirdArg : mutator.hasSecondArg,\n );\n\n const typescriptVersion =\n options.packageJson?.dependencies?.typescript ??\n options.packageJson?.devDependencies?.typescript ??\n '4.4.0';\n\n const hasAwaitedType = compareVersions(typescriptVersion, '4.5.0');\n\n const header = builder.header({\n outputClient: options.client,\n isRequestOptions: options.override.requestOptions !== false,\n isMutator,\n isGlobalMutator: !!options.override.mutator,\n provideIn: options.override.angular.provideIn,\n hasAwaitedType,\n titles,\n output: options,\n verbOptions: builder.verbOptions,\n clientImplementation: target.implementation,\n });\n\n target.implementation = header.implementation + target.implementation;\n\n const footer = builder.footer({\n outputClient: options.client,\n operationNames,\n hasMutator: target.mutators.length > 0,\n hasAwaitedType,\n titles,\n output: options,\n });\n target.implementation += footer.implementation;\n\n // Append the aggregated handler array (header + footer wrap) to every\n // mock output that has at least one handler. Faker-only outputs (no\n // handlerName) do not get the wrapper.\n for (const acc of target.mockOutputs) {\n if (acc.implementation.handlerName) {\n acc.implementation.handler =\n acc.implementation.handler +\n header.implementationMock +\n acc.implementation.handlerName +\n footer.implementationMock;\n }\n }\n }\n }\n\n return {\n imports: target.imports,\n implementation: target.implementation,\n mockOutputs: target.mockOutputs.map((m) => flattenMockOutput(m)),\n mutators: target.mutators,\n clientMutators: target.clientMutators,\n formData: target.formData,\n formUrlEncoded: target.formUrlEncoded,\n paramsSerializer: target.paramsSerializer,\n paramsFilter: target.paramsFilter,\n fetchReviver: target.fetchReviver,\n };\n}\n","export function getOrvalGeneratedTypes() {\n return `\n// https://stackoverflow.com/questions/49579094/typescript-conditional-types-filter-out-readonly-properties-pick-only-requir/49579497#49579497\ntype IfEquals<X, Y, A = X, B = never> = (<T>() => T extends X ? 1 : 2) extends <\nT,\n>() => T extends Y ? 1 : 2\n? A\n: B;\n\ntype WritableKeys<T> = {\n[P in keyof T]-?: IfEquals<\n { [Q in P]: T[P] },\n { -readonly [Q in P]: T[P] },\n P\n>;\n}[keyof T];\n\ntype UnionToIntersection<U> =\n (U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never;\ntype DistributeReadOnlyOverUnions<T> = T extends any ? NonReadonly<T> : never;\n\ntype Writable<T> = Pick<T, WritableKeys<T>>;\ntype NonReadonly<T> = [T] extends [UnionToIntersection<T>] ? {\n [P in keyof Writable<T>]: T[P] extends object\n ? NonReadonly<NonNullable<T[P]>>\n : T[P];\n} : DistributeReadOnlyOverUnions<T>;\n`;\n}\n\nexport function getTypedResponse() {\n return `\ninterface TypedResponse<T> extends Response {\n json(): Promise<T>;\n}\n`;\n}\n","import { generateModelsInline, generateMutatorImports } from '../generators';\nimport type { WriteModeProps } from '../types';\nimport {\n conventionName,\n getFileInfo,\n isFunction,\n isString,\n isSyntheticDefaultImportsAllow,\n upath,\n} from '../utils';\nimport { escapeRegExp } from '../utils/string';\nimport { writeGeneratedFile } from './file';\nimport { generateImportsForBuilder } from './generate-imports-for-builder';\nimport { collapseInlineMockOutputs } from './mock-outputs';\nimport { generateTarget } from './target';\nimport { getOrvalGeneratedTypes, getTypedResponse } from './types';\n\nexport async function writeSingleMode({\n builder,\n output,\n projectName,\n header,\n needSchema,\n generateSchemasInline,\n}: WriteModeProps): Promise<string[]> {\n try {\n const { path } = getFileInfo(output.target, {\n backupFilename: conventionName(\n builder.info.title ?? 'filename',\n output.namingConvention,\n ),\n extension: output.fileExtension,\n });\n\n const {\n imports,\n mockOutputs: rawMockOutputs,\n implementation,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n paramsSerializer,\n paramsFilter,\n fetchReviver,\n } = generateTarget(builder, output);\n\n // Single-mode appends every mock generator's output into the same\n // `<filename>.ts` file. MSW already emits the response factories that\n // Faker would emit, so when both generators are configured we drop the\n // Faker entry to avoid duplicate function declarations.\n const mockOutputs = collapseInlineMockOutputs(rawMockOutputs);\n\n // Combined mock content emitted at the bottom of the single-mode output\n // file (one block per generator entry).\n const implementationMock = mockOutputs\n .map((m) => m.implementation)\n .join('\\n\\n');\n // Aggregate imports across all mock entries for the value-import promotion\n // pass below.\n const importsMock = mockOutputs.flatMap((m) => m.imports);\n\n let data = header;\n\n const schemasPath = output.schemas\n ? upath.getRelativeImportPath(\n path,\n getFileInfo(\n isString(output.schemas) ? output.schemas : output.schemas.path,\n { extension: output.fileExtension },\n ).dirname,\n )\n : undefined;\n\n const isAllowSyntheticDefaultImports = isSyntheticDefaultImportsAllow(\n output.tsconfig,\n );\n\n const implementationImports = imports.filter((imp) => {\n const searchWords = [imp.alias, imp.name]\n .filter((part): part is string => Boolean(part?.length))\n .map((part) => escapeRegExp(part))\n .join('|');\n if (!searchWords) {\n return false;\n }\n\n return new RegExp(String.raw`\\b(${searchWords})\\b`, 'g').test(\n implementation,\n );\n });\n\n const normalizedImports = implementationImports.map((imp) => ({ ...imp }));\n for (const mockImport of importsMock) {\n const matchingImport = normalizedImports.find(\n (imp) =>\n imp.name === mockImport.name &&\n (imp.alias ?? '') === (mockImport.alias ?? ''),\n );\n if (!matchingImport) continue;\n\n const mockNeedsRuntimeValue =\n !!mockImport.values ||\n !!mockImport.isConstant ||\n !!mockImport.default ||\n !!mockImport.namespaceImport ||\n !!mockImport.syntheticDefaultImport;\n if (mockNeedsRuntimeValue) {\n matchingImport.values = true;\n }\n }\n\n // When `schemas` is unset there is no schemasPath. We must still emit imports\n // that carry `importPath` (e.g. baseUrl.runtime imports), but we must not\n // pass `'.'` for schema-relative imports: that becomes `from '.'` and breaks\n // TS (see samples with a real `schemas` path). So only `importPath` entries\n // use the `.` placeholder when `schemasPath` is missing.\n const importsForBuilder = schemasPath\n ? generateImportsForBuilder(output, normalizedImports, schemasPath)\n : generateImportsForBuilder(\n output,\n normalizedImports.filter((imp) => !!imp.importPath),\n '.',\n );\n\n data += builder.imports({\n client: output.client,\n implementation,\n imports: importsForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n hasGlobalMutator: !!output.override.mutator,\n hasTagsMutator: Object.values(output.override.tags).some(\n (tag) => !!tag?.mutator,\n ),\n hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,\n packageJson: output.packageJson,\n output,\n });\n\n // Emit per-generator-entry mock imports. Each entry produces its own\n // import header (e.g. `from 'msw'` for msw, `from '@faker-js/faker'` for\n // faker) by passing its `options` (with discriminating `type`). Match\n // each mockOutput back to its source generator entry by type so the\n // collapse step above (which drops faker when msw is present) does not\n // misalign indices.\n for (const mockOutput of mockOutputs) {\n const entry = output.mock.generators.find(\n (g) => !isFunction(g) && g.type === mockOutput.type,\n );\n const filteredMockImports = mockOutput.imports.filter(\n (impMock) =>\n !normalizedImports.some(\n (imp) =>\n imp.name === impMock.name &&\n (imp.alias ?? '') === (impMock.alias ?? ''),\n ),\n );\n const importsMockForBuilder = schemasPath\n ? generateImportsForBuilder(output, filteredMockImports, schemasPath)\n : generateImportsForBuilder(\n output,\n filteredMockImports.filter((imp) => !!imp.importPath),\n '.',\n );\n data += builder.importsMock({\n implementation: mockOutput.implementation,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: entry && !isFunction(entry) ? entry : undefined,\n });\n }\n\n if (mutators) {\n data += generateMutatorImports({ mutators, implementation });\n }\n\n if (clientMutators) {\n data += generateMutatorImports({ mutators: clientMutators });\n }\n\n if (formData) {\n data += generateMutatorImports({ mutators: formData });\n }\n\n if (formUrlEncoded) {\n data += generateMutatorImports({ mutators: formUrlEncoded });\n }\n\n if (paramsSerializer) {\n data += generateMutatorImports({ mutators: paramsSerializer });\n }\n\n if (paramsFilter) {\n data += generateMutatorImports({ mutators: paramsFilter });\n }\n\n if (fetchReviver) {\n data += generateMutatorImports({ mutators: fetchReviver });\n }\n\n if (implementation.includes('NonReadonly<')) {\n data += getOrvalGeneratedTypes();\n data += '\\n';\n }\n\n if (implementation.includes('TypedResponse<')) {\n data += getTypedResponse();\n data += '\\n';\n }\n\n if (!output.schemas && needSchema) {\n data += generateSchemasInline\n ? generateSchemasInline()\n : generateModelsInline(builder.schemas);\n }\n\n data += `${implementation.trim()}\\n`;\n\n if (mockOutputs.length > 0) {\n data += '\\n\\n';\n data += implementationMock;\n }\n\n await writeGeneratedFile(path, data);\n\n return [path];\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : 'unknown error';\n throw new Error(\n `Oups... 🍻. An Error occurred while writing file => ${errorMsg}`,\n { cause: error },\n );\n }\n}\n","import path from 'node:path';\n\nimport { generateModelsInline, generateMutatorImports } from '../generators';\nimport {\n type GlobalMockOptions,\n OutputClient,\n type WriteModeProps,\n} from '../types';\nimport {\n conventionName,\n getFileInfo,\n isFunction,\n isString,\n isSyntheticDefaultImportsAllow,\n upath,\n} from '../utils';\nimport { getMockFileExtensionByTypeName } from '../utils/file-extensions';\nimport { writeGeneratedFile } from './file';\nimport { generateImportsForBuilder } from './generate-imports-for-builder';\nimport { generateTarget } from './target';\nimport { getOrvalGeneratedTypes, getTypedResponse } from './types';\n\nexport async function writeSplitMode({\n builder,\n output,\n projectName,\n header,\n needSchema,\n generateSchemasInline,\n}: WriteModeProps): Promise<string[]> {\n try {\n const {\n path: targetPath,\n filename,\n dirname,\n extension,\n } = getFileInfo(output.target, {\n backupFilename: conventionName(\n builder.info.title ?? 'filename',\n output.namingConvention,\n ),\n extension: output.fileExtension,\n });\n\n const {\n imports,\n implementation,\n mockOutputs,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n paramsSerializer,\n paramsFilter,\n fetchReviver,\n } = generateTarget(builder, output);\n\n let implementationData = header;\n\n const relativeSchemasPath = output.schemas\n ? upath.getRelativeImportPath(\n targetPath,\n getFileInfo(\n isString(output.schemas) ? output.schemas : output.schemas.path,\n { extension: output.fileExtension },\n ).dirname,\n )\n : './' + filename + '.schemas' + extension.replace(/\\.ts$/, '');\n\n const isAllowSyntheticDefaultImports = isSyntheticDefaultImportsAllow(\n output.tsconfig,\n );\n\n const importsForBuilder = generateImportsForBuilder(\n output,\n imports,\n relativeSchemasPath,\n );\n\n implementationData += builder.imports({\n client: output.client,\n implementation,\n imports: importsForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n hasGlobalMutator: !!output.override.mutator,\n hasTagsMutator: Object.values(output.override.tags).some(\n (tag) => !!tag?.mutator,\n ),\n hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,\n packageJson: output.packageJson,\n output,\n });\n\n const schemasPath =\n !output.schemas && needSchema\n ? path.join(dirname, filename + '.schemas' + extension)\n : undefined;\n\n if (schemasPath) {\n const schemasData = generateSchemasInline\n ? header + generateSchemasInline()\n : header + generateModelsInline(builder.schemas);\n\n await writeGeneratedFile(schemasPath, schemasData);\n }\n\n if (mutators) {\n implementationData += generateMutatorImports({\n mutators,\n implementation,\n });\n }\n\n if (clientMutators) {\n implementationData += generateMutatorImports({\n mutators: clientMutators,\n });\n }\n\n if (formData) {\n implementationData += generateMutatorImports({ mutators: formData });\n }\n\n if (formUrlEncoded) {\n implementationData += generateMutatorImports({\n mutators: formUrlEncoded,\n });\n }\n\n if (paramsSerializer) {\n implementationData += generateMutatorImports({\n mutators: paramsSerializer,\n });\n }\n\n if (paramsFilter) {\n implementationData += generateMutatorImports({\n mutators: paramsFilter,\n });\n }\n\n if (fetchReviver) {\n implementationData += generateMutatorImports({\n mutators: fetchReviver,\n });\n }\n\n if (implementation.includes('NonReadonly<')) {\n implementationData += getOrvalGeneratedTypes();\n implementationData += '\\n';\n }\n\n if (implementation.includes('TypedResponse<')) {\n implementationData += getTypedResponse();\n implementationData += '\\n';\n }\n\n implementationData += `\\n${implementation}`;\n\n const implementationFilename =\n filename +\n (OutputClient.ANGULAR === output.client ? '.service' : '') +\n extension;\n\n const implementationPath = path.join(dirname, implementationFilename);\n await writeGeneratedFile(implementationPath, implementationData);\n\n // Emit one mock file per configured generator entry. The output filename\n // suffix comes from `getMockFileExtensionByTypeName(entry)` (e.g. `.msw.ts`\n // or `.faker.ts`).\n const mockPaths: string[] = [];\n for (const mockOutput of mockOutputs) {\n const entry = output.mock.generators.find(\n (g): g is GlobalMockOptions =>\n !isFunction(g) && g.type === mockOutput.type,\n );\n if (!entry) continue;\n\n const importsMockForBuilder = generateImportsForBuilder(\n output,\n mockOutput.imports,\n relativeSchemasPath,\n );\n let mockData = header;\n mockData += builder.importsMock({\n implementation: mockOutput.implementation,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: entry,\n });\n mockData += `\\n${mockOutput.implementation}`;\n\n const mockPath = path.join(\n dirname,\n filename + '.' + getMockFileExtensionByTypeName(entry) + extension,\n );\n await writeGeneratedFile(mockPath, mockData);\n mockPaths.push(mockPath);\n }\n\n return [\n implementationPath,\n ...(schemasPath ? [schemasPath] : []),\n ...mockPaths,\n ];\n } catch (error) {\n throw new Error(\n `Oups... 🍻. An Error occurred while splitting => ${String(error)}`,\n { cause: error },\n );\n }\n}\n","import {\n DefaultTag,\n type GeneratorMockOutput,\n type GeneratorMockOutputFull,\n type GeneratorOperation,\n type GeneratorTarget,\n type GeneratorTargetFull,\n type NormalizedOutputOptions,\n OutputClient,\n type WriteSpecBuilder,\n} from '../types';\nimport { compareVersions, kebab, pascal } from '../utils';\n\n/**\n * Ensures every operation has at least one tag by falling back to the\n * {@link DefaultTag} constant for untagged operations, so the tag-routing\n * logic in {@link generateTargetTags} always has a bucket to assign the\n * operation to.\n */\nfunction addDefaultTagIfEmpty(operation: GeneratorOperation) {\n return {\n ...operation,\n tags: operation.tags.length > 0 ? operation.tags : [DefaultTag],\n };\n}\n\nfunction emptyMockOutputFull(\n type: GeneratorMockOutputFull['type'],\n): GeneratorMockOutputFull {\n return {\n type,\n implementation: { function: '', handler: '', handlerName: '' },\n imports: [],\n };\n}\n\nfunction flattenMockOutput(full: GeneratorMockOutputFull): GeneratorMockOutput {\n return {\n type: full.type,\n implementation: full.implementation.function + full.implementation.handler,\n imports: full.imports,\n };\n}\n\nfunction mergeOperationMockOutputs(\n accMockOutputs: GeneratorMockOutputFull[],\n opMockOutputs: GeneratorMockOutputFull[],\n): GeneratorMockOutputFull[] {\n const result: GeneratorMockOutputFull[] = accMockOutputs.map((m) => ({\n type: m.type,\n implementation: { ...m.implementation },\n imports: [...m.imports],\n }));\n for (const op of opMockOutputs) {\n let acc = result.find((m) => m.type === op.type);\n if (!acc) {\n acc = emptyMockOutputFull(op.type);\n result.push(acc);\n }\n acc.imports.push(...op.imports);\n acc.implementation.function += op.implementation.function;\n acc.implementation.handler += op.implementation.handler;\n if (op.implementation.handlerName) {\n const separator =\n acc.implementation.handlerName.length > 0 ? ',\\n ' : ' ';\n acc.implementation.handlerName +=\n separator + op.implementation.handlerName + '()';\n }\n }\n return result;\n}\n\nfunction initialMockOutputsForOperation(\n op: GeneratorOperation,\n): GeneratorMockOutputFull[] {\n return op.mockOutputs.map((m) => ({\n type: m.type,\n implementation: {\n function: m.implementation.function,\n handler: m.implementation.handler,\n handlerName: m.implementation.handlerName\n ? ' ' + m.implementation.handlerName + '()'\n : '',\n },\n imports: [...m.imports],\n }));\n}\n\nfunction generateTargetTags(\n currentAcc: Record<string, GeneratorTargetFull>,\n operation: GeneratorOperation,\n): Record<string, GeneratorTargetFull> {\n const tag = kebab(operation.tags[0]);\n\n if (!(tag in currentAcc)) {\n currentAcc[tag] = {\n imports: operation.imports,\n mockOutputs: initialMockOutputsForOperation(operation),\n mutators: operation.mutator ? [operation.mutator] : [],\n clientMutators: operation.clientMutators ?? [],\n formData: operation.formData ? [operation.formData] : [],\n formUrlEncoded: operation.formUrlEncoded\n ? [operation.formUrlEncoded]\n : [],\n paramsSerializer: operation.paramsSerializer\n ? [operation.paramsSerializer]\n : [],\n paramsFilter: operation.paramsFilter ? [operation.paramsFilter] : [],\n fetchReviver: operation.fetchReviver ? [operation.fetchReviver] : [],\n implementation: operation.implementation,\n };\n\n return currentAcc;\n }\n\n const currentOperation = currentAcc[tag];\n currentAcc[tag] = {\n implementation: currentOperation.implementation + operation.implementation,\n imports: [...currentOperation.imports, ...operation.imports],\n mockOutputs: mergeOperationMockOutputs(\n currentOperation.mockOutputs,\n operation.mockOutputs,\n ),\n mutators: operation.mutator\n ? [...(currentOperation.mutators ?? []), operation.mutator]\n : currentOperation.mutators,\n clientMutators: operation.clientMutators\n ? [\n ...(currentOperation.clientMutators ?? []),\n ...operation.clientMutators,\n ]\n : currentOperation.clientMutators,\n formData: operation.formData\n ? [...(currentOperation.formData ?? []), operation.formData]\n : currentOperation.formData,\n formUrlEncoded: operation.formUrlEncoded\n ? [...(currentOperation.formUrlEncoded ?? []), operation.formUrlEncoded]\n : currentOperation.formUrlEncoded,\n paramsSerializer: operation.paramsSerializer\n ? [\n ...(currentOperation.paramsSerializer ?? []),\n operation.paramsSerializer,\n ]\n : currentOperation.paramsSerializer,\n paramsFilter: operation.paramsFilter\n ? [...(currentOperation.paramsFilter ?? []), operation.paramsFilter]\n : currentOperation.paramsFilter,\n fetchReviver: operation.fetchReviver\n ? [...(currentOperation.fetchReviver ?? []), operation.fetchReviver]\n : currentOperation.fetchReviver,\n };\n return currentAcc;\n}\n\nexport function generateTargetForTags(\n builder: WriteSpecBuilder,\n options: NormalizedOutputOptions,\n) {\n const isAngularClient = options.client === OutputClient.ANGULAR;\n\n const operations = Object.values(builder.operations).map((operation) =>\n addDefaultTagIfEmpty(operation),\n );\n let allTargetTags: Record<string, GeneratorTargetFull> = {};\n for (const [index, operation] of operations.entries()) {\n allTargetTags = generateTargetTags(allTargetTags, operation);\n\n if (index === operations.length - 1) {\n const transformed: Record<string, GeneratorTargetFull> = {};\n for (const [tag, target] of Object.entries(allTargetTags)) {\n const isMutator = !!target.mutators?.some((mutator) =>\n isAngularClient ? mutator.hasThirdArg : mutator.hasSecondArg,\n );\n const operationNames = Object.values(builder.operations)\n // Operations can have multiple tags, but they are grouped by the first\n // tag, therefore we only want to handle the case where the tag\n // is the first in the list of tags.\n .filter(\n ({ tags }) =>\n tags.map((tag) => kebab(tag)).indexOf(kebab(tag)) === 0,\n )\n .map(({ operationName }) => operationName);\n\n const typescriptVersion =\n options.packageJson?.dependencies?.typescript ??\n options.packageJson?.devDependencies?.typescript ??\n '4.4.0';\n\n const hasAwaitedType = compareVersions(typescriptVersion, '4.5.0');\n\n const titles = builder.title({\n outputClient: options.client,\n title: pascal(tag),\n customTitleFunc: options.override.title,\n output: options,\n });\n\n const footer = builder.footer({\n outputClient: options.client,\n operationNames,\n hasMutator: !!target.mutators?.length,\n hasAwaitedType,\n titles,\n output: options,\n });\n\n const header = builder.header({\n outputClient: options.client,\n isRequestOptions: options.override.requestOptions !== false,\n isMutator,\n isGlobalMutator: !!options.override.mutator,\n provideIn: options.override.angular.provideIn,\n hasAwaitedType,\n titles,\n output: options,\n verbOptions: builder.verbOptions,\n tag,\n isDefaultTagBucket:\n tag === 'default' &&\n Object.values(builder.operations).some(\n (operation) => operation.tags.length === 0,\n ),\n clientImplementation: target.implementation,\n });\n\n // Apply the per-tag header/footer wrap to each mock output that has\n // accumulated handler entries. Mock outputs without a handler (faker\n // only) skip the wrap.\n const wrappedMockOutputs: GeneratorMockOutputFull[] =\n target.mockOutputs.map((m) => ({\n type: m.type,\n implementation: {\n function: m.implementation.function,\n handler: m.implementation.handlerName\n ? m.implementation.handler +\n header.implementationMock +\n m.implementation.handlerName +\n footer.implementationMock\n : m.implementation.handler,\n handlerName: m.implementation.handlerName,\n },\n imports: m.imports,\n }));\n\n transformed[tag] = {\n implementation:\n header.implementation +\n target.implementation +\n footer.implementation,\n mockOutputs: wrappedMockOutputs,\n imports: target.imports,\n mutators: target.mutators,\n clientMutators: target.clientMutators,\n formData: target.formData,\n formUrlEncoded: target.formUrlEncoded,\n paramsSerializer: target.paramsSerializer,\n paramsFilter: target.paramsFilter,\n fetchReviver: target.fetchReviver,\n };\n }\n allTargetTags = transformed;\n }\n }\n\n const result: Record<string, GeneratorTarget> = {};\n for (const [tag, target] of Object.entries(allTargetTags)) {\n result[tag] = {\n ...target,\n mockOutputs: target.mockOutputs.map((m) => flattenMockOutput(m)),\n };\n }\n return result;\n}\n","import path from 'node:path';\n\nimport fs from 'fs-extra';\n\nimport { generateModelsInline, generateMutatorImports } from '../generators';\nimport {\n type GlobalMockOptions,\n OutputClient,\n OutputMockType,\n type WriteModeProps,\n} from '../types';\nimport {\n conventionName,\n getFileInfo,\n isFunction,\n isString,\n isSyntheticDefaultImportsAllow,\n pascal,\n upath,\n} from '../utils';\nimport { getMockFileExtensionByTypeName } from '../utils/file-extensions';\nimport { writeGeneratedFile } from './file';\nimport { generateImportsForBuilder } from './generate-imports-for-builder';\nimport { generateTargetForTags } from './target-tags';\nimport { getOrvalGeneratedTypes, getTypedResponse } from './types';\n\nexport async function writeSplitTagsMode({\n builder,\n output,\n projectName,\n header,\n needSchema,\n generateSchemasInline,\n}: WriteModeProps): Promise<string[]> {\n const { filename, dirname, extension } = getFileInfo(output.target, {\n backupFilename: conventionName(\n builder.info.title ?? 'filename',\n output.namingConvention,\n ),\n extension: output.fileExtension,\n });\n\n const target = generateTargetForTags(builder, output);\n\n const isAllowSyntheticDefaultImports = isSyntheticDefaultImportsAllow(\n output.tsconfig,\n );\n\n const hasFunctionGenerators = output.mock.generators.some((g) =>\n isFunction(g),\n );\n if (hasFunctionGenerators) {\n throw new Error(\n 'Function mock generators (ClientMockBuilder) are not supported in tags-split mode. Use typed generators ({ type: \"msw\" } or { type: \"faker\" }).',\n );\n }\n\n const generatorEntries = output.mock.generators.filter(\n (g): g is GlobalMockOptions => !isFunction(g),\n );\n\n // Pre-create per-generator-entry index files (one per entry, e.g.\n // `index.msw.ts` and `index.faker.ts`) so they can be appended to during\n // the per-tag write loop.\n const indexFilePathsByType = new Map<string, string>();\n if (output.mock.indexMockFiles) {\n for (const entry of generatorEntries) {\n const ext = getMockFileExtensionByTypeName(entry);\n const indexPath = path.join(dirname, `index.${ext}${extension}`);\n indexFilePathsByType.set(ext, indexPath);\n await fs.outputFile(indexPath, '');\n }\n }\n\n const tagEntries = Object.entries(target);\n\n const generatedFilePathsArray = await Promise.all(\n tagEntries.map(async ([tag, target]) => {\n try {\n const {\n imports,\n implementation,\n mockOutputs,\n mutators,\n clientMutators,\n formData,\n fetchReviver,\n formUrlEncoded,\n paramsSerializer,\n paramsFilter,\n } = target;\n\n let implementationData = header;\n\n const importerPath = path.join(dirname, tag, tag + extension);\n const relativeSchemasPath = output.schemas\n ? upath.getRelativeImportPath(\n importerPath,\n getFileInfo(\n isString(output.schemas) ? output.schemas : output.schemas.path,\n { extension: output.fileExtension },\n ).dirname,\n )\n : '../' + filename + '.schemas' + extension.replace(/\\.ts$/, '');\n\n // In tags-split mode, each tag lives in its own subdirectory\n // (dirname/tag/tag.ext). Imports with a custom `importPath` (from the\n // `file` option in mutationInvalidates) are specified relative to the\n // output root (dirname) but the consuming file is one level deeper.\n // Resolve these paths so that the generated import is correct.\n const tagNames = new Set(tagEntries.map(([t]) => t));\n const serviceSuffix =\n OutputClient.ANGULAR === output.client ? '.service' : '';\n\n const adjustedImports = imports.map((imp) => {\n if (!imp.importPath) return imp;\n\n // Only adjust relative paths (./foo, ../bar). Package imports\n // like 'rxjs' or '@tanstack/react-query' must be left as-is.\n if (!imp.importPath.startsWith('.')) return imp;\n\n const resolvedPath = path.resolve(dirname, imp.importPath);\n const targetBasename = path.basename(resolvedPath);\n\n let targetFile: string;\n if (tagNames.has(targetBasename)) {\n // Target is a known tag directory. Use the real generated\n // filename which includes the Angular `.service` suffix when\n // applicable (e.g. dirname/health/health.service.ts).\n const tagFilename = targetBasename + serviceSuffix + extension;\n targetFile = path.join(resolvedPath, tagFilename);\n } else {\n targetFile = resolvedPath + extension;\n }\n\n const adjustedPath = upath.getRelativeImportPath(\n importerPath,\n targetFile,\n );\n\n return { ...imp, importPath: adjustedPath };\n });\n\n const importsForBuilder = generateImportsForBuilder(\n output,\n adjustedImports,\n relativeSchemasPath,\n );\n\n implementationData += builder.imports({\n client: output.client,\n implementation,\n imports: importsForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n hasGlobalMutator: !!output.override.mutator,\n hasTagsMutator: Object.values(output.override.tags).some(\n (tag) => !!tag?.mutator,\n ),\n hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,\n packageJson: output.packageJson,\n output,\n });\n\n const schemasPath =\n !output.schemas && needSchema\n ? path.join(dirname, filename + '.schemas' + extension)\n : undefined;\n\n if (schemasPath) {\n const schemasData = generateSchemasInline\n ? header + generateSchemasInline()\n : header + generateModelsInline(builder.schemas);\n\n await writeGeneratedFile(schemasPath, schemasData);\n }\n\n if (mutators) {\n implementationData += generateMutatorImports({\n mutators,\n implementation,\n oneMore: true,\n });\n }\n\n if (clientMutators) {\n implementationData += generateMutatorImports({\n mutators: clientMutators,\n oneMore: true,\n });\n }\n\n if (formData) {\n implementationData += generateMutatorImports({\n mutators: formData,\n oneMore: true,\n });\n }\n if (formUrlEncoded) {\n implementationData += generateMutatorImports({\n mutators: formUrlEncoded,\n oneMore: true,\n });\n }\n if (paramsSerializer) {\n implementationData += generateMutatorImports({\n mutators: paramsSerializer,\n oneMore: true,\n });\n }\n if (paramsFilter) {\n implementationData += generateMutatorImports({\n mutators: paramsFilter,\n oneMore: true,\n });\n }\n\n if (fetchReviver) {\n implementationData += generateMutatorImports({\n mutators: fetchReviver,\n oneMore: true,\n });\n }\n\n if (implementation.includes('NonReadonly<')) {\n implementationData += getOrvalGeneratedTypes();\n implementationData += '\\n';\n }\n\n if (implementation.includes('TypedResponse<')) {\n implementationData += getTypedResponse();\n implementationData += '\\n';\n }\n\n implementationData += `\\n${implementation}`;\n\n const implementationFilename =\n tag +\n (OutputClient.ANGULAR === output.client ? '.service' : '') +\n extension;\n\n const implementationPath = path.join(\n dirname,\n tag,\n implementationFilename,\n );\n await writeGeneratedFile(implementationPath, implementationData);\n\n // Emit one mock file per configured generator entry. Per the\n // current design only non-function generator entries get their own\n // file; ClientMockBuilder functions are not yet supported here.\n const mockPaths: string[] = [];\n for (const mockOutput of mockOutputs) {\n const entry = output.mock.generators.find(\n (g): g is GlobalMockOptions =>\n !isFunction(g) && g.type === mockOutput.type,\n );\n if (!entry) continue;\n\n const importsMockForBuilder = generateImportsForBuilder(\n output,\n mockOutput.imports,\n relativeSchemasPath,\n );\n\n let mockData = header;\n mockData += builder.importsMock({\n implementation: mockOutput.implementation,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: entry,\n });\n mockData += `\\n${mockOutput.implementation}`;\n\n const mockPath = path.join(\n dirname,\n tag,\n tag + '.' + getMockFileExtensionByTypeName(entry) + extension,\n );\n await writeGeneratedFile(mockPath, mockData);\n mockPaths.push(mockPath);\n }\n\n return [\n implementationPath,\n ...(schemasPath ? [schemasPath] : []),\n ...mockPaths,\n ];\n } catch (error) {\n throw new Error(\n `Oups... 🍻. An Error occurred while splitting tag ${tag} => ${String(error)}`,\n { cause: error },\n );\n }\n }),\n );\n\n // Write per-generator-entry index files after Promise.all to ensure\n // deterministic export order. MSW entries re-export the aggregated\n // `get<Tag>Mock` handler function; Faker entries use `export *` since\n // faker has no aggregate handler.\n if (output.mock.indexMockFiles) {\n for (const entry of generatorEntries) {\n const ext = getMockFileExtensionByTypeName(entry);\n const indexFilePath = indexFilePathsByType.get(ext);\n if (!indexFilePath) continue;\n\n const indexContent = tagEntries\n .map(([tag]) => {\n const localMockPath = upath.joinSafe('./', tag, tag + '.' + ext);\n // MSW entries use the named re-export shape so existing\n // `import { get<Tag>Mock } from './api/index.msw'` consumers keep\n // working unchanged.\n return ext === OutputMockType.MSW\n ? `export { get${pascal(tag)}Mock } from '${localMockPath}'\\n`\n : `export * from '${localMockPath}'\\n`;\n })\n .join('');\n await fs.appendFile(indexFilePath, indexContent);\n }\n }\n\n return [\n ...new Set([\n ...indexFilePathsByType.values(),\n ...generatedFilePathsArray.flat(),\n ]),\n ];\n}\n","import path from 'node:path';\n\nimport { generateModelsInline, generateMutatorImports } from '../generators';\nimport type { WriteModeProps } from '../types';\nimport {\n conventionName,\n getFileInfo,\n isFunction,\n isString,\n isSyntheticDefaultImportsAllow,\n kebab,\n upath,\n} from '../utils';\nimport { escapeRegExp } from '../utils/string';\nimport { writeGeneratedFile } from './file';\nimport { generateImportsForBuilder } from './generate-imports-for-builder';\nimport { collapseInlineMockOutputs } from './mock-outputs';\nimport { generateTargetForTags } from './target-tags';\nimport { getOrvalGeneratedTypes, getTypedResponse } from './types';\n\nexport async function writeTagsMode({\n builder,\n output,\n projectName,\n header,\n needSchema,\n generateSchemasInline,\n}: WriteModeProps): Promise<string[]> {\n const {\n path: targetPath,\n filename,\n dirname,\n extension,\n } = getFileInfo(output.target, {\n backupFilename: conventionName(\n builder.info.title ?? 'filename',\n output.namingConvention,\n ),\n extension: output.fileExtension,\n });\n\n const target = generateTargetForTags(builder, output);\n\n const isAllowSyntheticDefaultImports = isSyntheticDefaultImportsAllow(\n output.tsconfig,\n );\n\n const generatedFilePathsArray = await Promise.all(\n Object.entries(target).map(async ([tag, target]) => {\n try {\n const {\n imports,\n implementation,\n mockOutputs: rawMockOutputs,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n fetchReviver,\n paramsSerializer,\n paramsFilter,\n } = target;\n\n // Tags-mode inlines mock content into the per-tag implementation\n // file, so collapse duplicate factories (drop faker when msw is\n // present) before emitting.\n const mockOutputs = collapseInlineMockOutputs(rawMockOutputs);\n\n const importsMock = mockOutputs.flatMap((m) => m.imports);\n const implementationMock = mockOutputs\n .map((m) => m.implementation)\n .join('\\n\\n');\n\n let data = header;\n\n const schemasPathRelative = output.schemas\n ? upath.getRelativeImportPath(\n targetPath,\n getFileInfo(\n isString(output.schemas) ? output.schemas : output.schemas.path,\n { extension: output.fileExtension },\n ).dirname,\n )\n : './' + filename + '.schemas' + extension.replace(/\\.ts$/, '');\n\n const implementationImports = imports.filter((imp) => {\n const searchWords = [imp.alias, imp.name]\n .filter((part): part is string => Boolean(part?.length))\n .map((part) => escapeRegExp(part))\n .join('|');\n if (!searchWords) {\n return false;\n }\n\n return new RegExp(String.raw`\\b(${searchWords})\\b`, 'g').test(\n implementation,\n );\n });\n\n const normalizedImports = implementationImports.map((imp) => ({\n ...imp,\n }));\n for (const mockImport of importsMock) {\n const matchingImport = normalizedImports.find(\n (imp) =>\n imp.name === mockImport.name &&\n (imp.alias ?? '') === (mockImport.alias ?? ''),\n );\n if (!matchingImport) continue;\n\n const mockNeedsRuntimeValue =\n !!mockImport.values ||\n !!mockImport.isConstant ||\n !!mockImport.default ||\n !!mockImport.namespaceImport ||\n !!mockImport.syntheticDefaultImport;\n if (mockNeedsRuntimeValue) {\n matchingImport.values = true;\n }\n }\n\n const importsForBuilder = generateImportsForBuilder(\n output,\n normalizedImports,\n schemasPathRelative,\n );\n\n data += builder.imports({\n client: output.client,\n implementation,\n imports: importsForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n hasGlobalMutator: !!output.override.mutator,\n hasTagsMutator: Object.values(output.override.tags).some(\n (tag) => !!tag?.mutator,\n ),\n hasParamsSerializerOptions: !!output.override.paramsSerializerOptions,\n packageJson: output.packageJson,\n output,\n });\n\n // Emit per-generator-entry mock imports so each entry's specific\n // import header is included (msw vs faker, etc.). Match by type so\n // collapsing the mockOutputs array does not misalign indices.\n for (const mockOutput of mockOutputs) {\n const entry = output.mock.generators.find(\n (g) => !isFunction(g) && g.type === mockOutput.type,\n );\n const importsMockForBuilder = generateImportsForBuilder(\n output,\n mockOutput.imports.filter(\n (impMock) =>\n !normalizedImports.some(\n (imp) =>\n imp.name === impMock.name &&\n (imp.alias ?? '') === (impMock.alias ?? ''),\n ),\n ),\n schemasPathRelative,\n );\n\n data += builder.importsMock({\n implementation: mockOutput.implementation,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: entry && !isFunction(entry) ? entry : undefined,\n });\n }\n\n const schemasPath =\n !output.schemas && needSchema\n ? path.join(dirname, filename + '.schemas' + extension)\n : undefined;\n\n if (schemasPath) {\n const schemasData = generateSchemasInline\n ? header + generateSchemasInline()\n : header + generateModelsInline(builder.schemas);\n\n await writeGeneratedFile(schemasPath, schemasData);\n }\n\n if (mutators) {\n data += generateMutatorImports({ mutators, implementation });\n }\n\n if (clientMutators) {\n data += generateMutatorImports({\n mutators: clientMutators,\n });\n }\n\n if (formData) {\n data += generateMutatorImports({ mutators: formData });\n }\n\n if (formUrlEncoded) {\n data += generateMutatorImports({ mutators: formUrlEncoded });\n }\n\n if (paramsSerializer) {\n data += generateMutatorImports({ mutators: paramsSerializer });\n }\n\n if (paramsFilter) {\n data += generateMutatorImports({ mutators: paramsFilter });\n }\n\n if (fetchReviver) {\n data += generateMutatorImports({ mutators: fetchReviver });\n }\n\n data += '\\n\\n';\n\n if (implementation.includes('NonReadonly<')) {\n data += getOrvalGeneratedTypes();\n data += '\\n';\n }\n\n if (implementation.includes('TypedResponse<')) {\n data += getTypedResponse();\n data += '\\n';\n }\n\n data += implementation;\n\n if (mockOutputs.length > 0) {\n data += '\\n\\n';\n\n data += implementationMock;\n }\n\n const implementationPath = path.join(\n dirname,\n `${kebab(tag)}${extension}`,\n );\n await writeGeneratedFile(implementationPath, data);\n\n return [implementationPath, ...(schemasPath ? [schemasPath] : [])];\n } catch (error) {\n throw new Error(\n `Oups... 🍻. An Error occurred while writing tag ${tag} => ${String(error)}`,\n { cause: error },\n );\n }\n }),\n );\n\n return generatedFilePathsArray.flat();\n}\n"],"mappings":"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"}