@orval/core 8.6.1 → 8.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +35 -35
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["isNullish","path","isString","regex","path","path","basepath","path","upath.getSchemaFileName","getSchema","isNullish","isBoolean","upath.getRelativeImportPath","fs","fs","upath.relativeSafe","upath.joinSafe","upath\n .join","fs","upath.joinSafe","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/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/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 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 mock?: GlobalMockOptions | ClientMockBuilder;\n override: NormalizedOverrideOutput;\n client: OutputClient | OutputClientFunc;\n httpClient: OutputHttpClient;\n clean: boolean | string[];\n docs: boolean | OutputDocsOptions;\n prettier: boolean;\n biome: boolean;\n tsconfig?: Tsconfig;\n packageJson?: PackageJson;\n headers: boolean;\n indexFiles: boolean;\n baseUrl?: string | BaseUrlFromSpec | BaseUrlFromConstant;\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 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 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 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 requestOptions?: object | boolean;\n}\n\nexport interface NormalizedInputOptions {\n target: string | OpenApiDocument;\n override: OverrideInput;\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\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;\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 // If mock is a boolean, it will use the default mock options (type: msw)\n mock?: boolean | GlobalMockOptions | ClientMockBuilder;\n override?: OverrideOutput;\n client?: OutputClient | OutputClientFunc;\n httpClient?: OutputHttpClient;\n clean?: boolean | string[];\n docs?: boolean | OutputDocsOptions;\n prettier?: boolean;\n biome?: boolean;\n tsconfig?: string | Tsconfig;\n packageJson?: string;\n headers?: boolean;\n indexFiles?: boolean;\n baseUrl?: string | BaseUrlFromSpec | BaseUrlFromConstant;\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 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} 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\nexport interface GlobalMockOptions {\n // This is the type of the mock that will be generated\n type: OutputMockType;\n // This is the option to use the examples from the openapi specification where possible to generate mock data\n useExamples?: boolean;\n // This is used to generate mocks for all http responses defined in the OpenAPI specification\n generateEachHttpStatus?: boolean;\n // This is used to set the delay to your own custom value, or pass false to disable delay\n delay?: false | number | (() => number);\n // This is used to execute functions that are passed to the 'delay' argument\n // at runtime rather than build time.\n delayFunctionLazyExecute?: boolean;\n // This is used to set the base url to your own custom value\n baseUrl?: string;\n // This is used to set the locale of the faker library\n locale?: keyof typeof allLocales;\n // Preferred response content type when multiple success content types exist\n preferredContentType?: string;\n indexMockFiles?: boolean;\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 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 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 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}\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 dateTimeOptions: ZodDateTimeOptions;\n timeOptions: ZodTimeOptions;\n}\n\nexport type InvalidateTarget =\n | string\n | {\n query: string;\n params?: string[] | Record<string, string>;\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 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\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\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}\n\nexport interface FetchOptions {\n includeHttpResponseReturnType?: boolean;\n forceSuccessResponse?: boolean;\n jsonReviver?: Mutator;\n runtimeValidation?: boolean;\n}\n\nexport type InputTransformerFn = (spec: OpenApiDocument) => 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 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\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 prettier?: boolean;\n biome?: boolean;\n mock?: boolean | GlobalMockOptions;\n client?: OutputClient;\n httpClient?: OutputHttpClient;\n mode?: OutputMode;\n tsconfig?: string | Tsconfig;\n packageJson?: string;\n input?: string | string[];\n output?: string;\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 };\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 | 'esnext'; // https://www.typescriptlang.org/tsconfig#target\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\nexport interface GeneratorTarget {\n imports: GeneratorImport[];\n implementation: string;\n implementationMock: string;\n importsMock: GeneratorImport[];\n mutators?: GeneratorMutator[];\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator[];\n formUrlEncoded?: GeneratorMutator[];\n paramsSerializer?: GeneratorMutator[];\n fetchReviver?: GeneratorMutator[];\n}\n\nexport interface GeneratorTargetFull {\n imports: GeneratorImport[];\n implementation: string;\n implementationMock: {\n function: string;\n handler: string;\n handlerName: string;\n };\n importsMock: GeneratorImport[];\n mutators?: GeneratorMutator[];\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator[];\n formUrlEncoded?: GeneratorMutator[];\n paramsSerializer?: GeneratorMutator[];\n fetchReviver?: GeneratorMutator[];\n}\n\nexport interface GeneratorOperation {\n imports: GeneratorImport[];\n implementation: string;\n implementationMock: {\n function: string;\n handler: string;\n handlerName: string;\n };\n importsMock: GeneratorImport[];\n tags: string[];\n mutator?: GeneratorMutator;\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator;\n formUrlEncoded?: GeneratorMutator;\n paramsSerializer?: 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 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}\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 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\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}\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 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 { isNullish, isString } from 'remeda';\n\nimport {\n type OpenApiReferenceObject,\n type OpenApiSchemaObject,\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\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/**\n * Determine if a content type is binary (vs text-based).\n */\nexport function isBinaryContentType(contentType: string): boolean {\n if (contentType === 'application/octet-stream') return true;\n\n if (contentType.startsWith('image/')) return true;\n if (contentType.startsWith('audio/')) return true;\n if (contentType.startsWith('video/')) return true;\n if (contentType.startsWith('font/')) return true;\n\n // text/* types are not binary\n if (contentType.startsWith('text/')) return false;\n\n // text-based suffixes (RFC 6838)\n const textSuffixes = [\n '+json',\n '-json',\n '+xml',\n '-xml',\n '+yaml',\n '-yaml',\n '+rss',\n '-rss',\n '+csv',\n '-csv',\n ];\n if (textSuffixes.some((suffix) => contentType.includes(suffix))) {\n return false;\n }\n\n // text-based whitelist - these are NOT binary\n const textApplicationTypes = new Set([\n 'application/json',\n 'application/xml',\n 'application/yaml',\n 'application/x-www-form-urlencoded',\n 'application/javascript',\n 'application/ecmascript',\n 'application/graphql',\n ]);\n\n return !textApplicationTypes.has(contentType);\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}\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 // 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 ).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 ].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 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 { globby } from 'globby';\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 globby(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 globby(['**/*'], {\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 type { ClientMockBuilder, GlobalMockOptions } from '../types';\nimport { isFunction } from './assertion';\n\nexport function getMockFileExtensionByTypeName(\n mock: GlobalMockOptions | ClientMockBuilder,\n) {\n if (isFunction(mock)) {\n return 'msw';\n }\n switch (mock.type) {\n default: {\n // case 'msw':\n return 'msw';\n }\n }\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 _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 log(\n styleText(\n 'yellow',\n `${mismatchArgs.join(', ')} ${\n mismatchArgs.length === 1 ? 'is' : 'are'\n } not defined in your configuration!`,\n ),\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","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 string[] | undefined;\n\n if (!names) return;\n\n return names.map((name: string) => jsStringEscape(name));\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 string[] | undefined;\n\n if (!descriptions) return;\n\n return descriptions.map((description: string) => jsStringEscape(description));\n}\n\nexport function getEnum(\n value: string,\n enumName: string,\n names: string[] | undefined,\n enumGenerationType: EnumGeneration,\n descriptions?: string[],\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[],\n descriptions?: string[],\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[],\n descriptions?: string[],\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[],\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[],\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\ntype RefComponent = 'schemas' | 'responses' | 'parameters' | 'requestBodies';\n\nconst RefComponent = {\n schemas: 'schemas' as RefComponent,\n responses: 'responses' as RefComponent,\n parameters: 'parameters' as RefComponent,\n requestBodies: 'requestBodies' as RefComponent,\n};\n\nexport const RefComponentSuffix: Record<RefComponent, string> = {\n schemas: '',\n responses: 'Response',\n parameters: 'Parameter',\n requestBodies: 'Body',\n};\n\nconst regex = new RegExp('~1', '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) => decodeURIComponent(part.replaceAll(regex, '/')));\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 } = resolveRef<OpenApiExampleObject>(example, context);\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 ? (resolveRef<OpenApiExampleObject>(example, context).schema\n .value as ResolvedExample)\n : example;\n }\n return result;\n })();\n}\n","import { getScalar } from '../getters';\nimport type { FormDataContext } from '../getters/object';\nimport type {\n ContextSpec,\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 { schema: schemaObject, imports } = resolveRef<OpenApiSchemaObject>(\n schema,\n context,\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 nullable =\n (Array.isArray(schemaObject.type) &&\n schemaObject.type.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('|')\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;\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-data, pass context that tracks encoding for file type detection\n const formDataContext: FormDataContext | undefined = isFormData\n ? { atPart: false, encoding: mediaType.encoding ?? {} }\n : undefined;\n\n const resolvedObject = resolveObject({\n schema: mediaType.schema,\n propName,\n context,\n formDataContext,\n });\n\n // Media key has highest precedence: binary media key → Blob (overrides schema)\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 } = resolveRef<OpenApiRequestBodyObject | OpenApiResponseObject>(\n res,\n context,\n );\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:\n // Even though required is false by default, we only consider required to be false if specified. (See pull 1277)\n 'required' in bodySchema && bodySchema.required === false,\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:\n 'required' in bodySchema && bodySchema.required === false,\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 // 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 } = resolveRef<OpenApiSchemaObject>(\n mediaType.schema,\n context,\n );\n if (imports[0]?.name) {\n effectivePropName = imports[0].name;\n }\n }\n\n const isFormData = formDataContentTypes.has(contentType);\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 const isFormUrlEncoded =\n formUrlEncodedContentTypes.has(contentType);\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:\n 'required' in res && res.required === false,\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:\n 'required' in res && res.required === false,\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 } = resolveRef<OpenApiSchemaObject>(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(\n (subSchema) =>\n resolveRef<OpenApiSchemaObject>(subSchema, context).imports[0],\n )\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 } = resolveRef<OpenApiSchemaObject>(\n schemaObject,\n context,\n );\n const propName = camel(\n !isRef && isReference(schemaObject) ? imports[0].name : name,\n );\n const additionalImports: GeneratorImport[] = [];\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 const combinedSchemasFormData = combinedSchemas\n .map((subSchema) => {\n const { schema: combinedSchema, imports } =\n resolveRef<OpenApiSchemaObject>(subSchema, context);\n\n let newPropName = propName;\n let newPropDefinition = '';\n\n // If the schema is a union type (oneOf, anyOf) and includes a reference (has imports),\n // we need to cast the property to the specific type to avoid TypeScript errors.\n if (shouldCast && imports[0]) {\n additionalImports.push(imports[0]);\n newPropName = `${propName}${pascal(imports[0].name)}`;\n newPropDefinition = `const ${newPropName} = (${propName} as ${imports[0].name}${isRequestBodyOptional ? ' | undefined' : ''});\\n`;\n }\n\n return (\n newPropDefinition +\n resolveSchemaPropertiesToFormData({\n schema: combinedSchema,\n variableName,\n propName: newPropName,\n context,\n isRequestBodyOptional,\n encoding,\n })\n );\n })\n .filter(Boolean)\n .join('\\n');\n\n form += combinedSchemasFormData;\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 } = resolveRef<OpenApiSchemaObject>(\n schemaItems,\n context,\n );\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 const schemaProps = getSchemaProperties(schema) ?? {};\n for (const [key, value] of Object.entries(schemaProps)) {\n const { schema: property } = resolveRef<OpenApiSchemaObject>(\n value,\n context,\n );\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 (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 (property.type === 'object') {\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 : partContentType\n ? `${variableName}.append(\\`${keyPrefix}${key}\\`, new Blob([JSON.stringify(${nonOptionalValueKey})], { type: '${partContentType}' }));\\n`\n : `${variableName}.append(\\`${keyPrefix}${key}\\`, JSON.stringify(${nonOptionalValueKey}));\\n`;\n } else if (property.type === 'array') {\n let valueStr = 'value';\n let hasNonPrimitiveChild = false;\n const propertyItems = getSchemaItems(property);\n if (propertyItems) {\n const { schema: itemSchema } = resolveRef<OpenApiSchemaObject>(\n propertyItems,\n context,\n );\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} 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\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 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 // OpenAPI `readOnly` properties are typically response-only, so request body\n // types are relaxed by default for backwards compatibility. The override lets\n // callers opt back into preserving readonly request payloads when desired.\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 } = resolveRef<OpenApiRequestBodyObject>(\n requestBody,\n context,\n );\n if (bodySchema.required !== undefined) {\n isOptional = !bodySchema.required;\n }\n } else if (requestBody.required !== undefined) {\n isOptional = !requestBody.required;\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","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\n/**\n * Extract enum values from propertyNames schema (OpenAPI 3.1)\n * Returns undefined if propertyNames doesn't have an enum\n */\nfunction getPropertyNamesEnum(item: OpenApiSchemaObject): string[] | undefined {\n if (\n 'propertyNames' in item &&\n item.propertyNames &&\n 'enum' in item.propertyNames\n ) {\n const propertyNames = item.propertyNames as { enum?: unknown[] };\n if (Array.isArray(propertyNames.enum)) {\n return propertyNames.enum.filter((val): val is string => isString(val));\n }\n }\n return undefined;\n}\n\n/**\n * Generate index signature key type based on propertyNames enum\n * Returns union type string like \"'foo' | 'bar'\" or 'string' if no enum\n */\nfunction getIndexSignatureKey(item: OpenApiSchemaObject): string {\n const enumValues = getPropertyNamesEnum(item);\n if (enumValues && enumValues.length > 0) {\n return enumValues.map((val) => `'${val}'`).join(' | ');\n }\n return 'string';\n}\n\nfunction getPropertyNamesRecordType(\n item: OpenApiSchemaObject,\n valueType: string,\n): string | undefined {\n const enumValues = getPropertyNamesEnum(item);\n if (!enumValues || enumValues.length === 0) {\n return undefined;\n }\n\n const keyType = enumValues.map((val) => `'${val}'`).join(' | ');\n return `Partial<Record<${keyType}, ${valueType}>>`;\n}\n\n/**\n * Context for multipart/form-data type generation.\n * Discriminated union with two states:\n *\n * 1. `{ atPart: false, encoding }` - At form-data 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 * `undefined` means not in form-data context (or nested inside plain object field = JSON)\n */\nexport type FormDataContext =\n | { atPart: false; encoding: Record<string, { contentType?: string }> }\n | { atPart: true; partContentType?: string };\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]);\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 multipart context: atPart: false → atPart: true\n // Look up encoding[key].contentType and pass to property resolution\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 }\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 if (isReadOnly) {\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 );\n if (recordType) {\n acc.value += '\\n}';\n acc.value += ` & ${recordType}`;\n acc.useTypeAlias = true;\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 );\n if (recordType) {\n acc.value += '\\n}';\n acc.value += ` & ${recordType}`;\n acc.useTypeAlias = true;\n } else {\n const keyType = getIndexSignatureKey(schemaItem);\n acc.value += `\\n [key: ${keyType}]: ${resolvedValue.value};\\n}`;\n }\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(schemaItem, 'unknown');\n if (recordType) {\n return {\n value: recordType + nullable,\n imports: [],\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: true,\n 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 );\n if (recordType) {\n return {\n value: recordType + nullable,\n 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: resolvedValue.dependencies,\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');\n if (itemType === 'object' && recordType) {\n return {\n value: recordType + nullable,\n imports: [],\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: true,\n 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' + 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 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 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 mergedEnumValues = [\n ...(enumValues ?? []).filter((value) => value !== mappingKey),\n mappingKey,\n ];\n\n const mergedProperty = {\n ...schemaProperty,\n type: 'string',\n enum: mergedEnumValues,\n };\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';\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: parameter, imports } = resolveRef<OpenApiParameterObject>(\n p,\n context,\n );\n\n if (\n parameter.in === 'path' ||\n parameter.in === 'query' ||\n parameter.in === 'header'\n ) {\n result[parameter.in].push({ parameter, imports });\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\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\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 };\n}\n","import type {\n ContextSpec,\n GetterResponse,\n OpenApiResponsesObject,\n OverrideOutputContentType,\n ResReqTypesValue,\n} from '../types';\nimport { dedupeUnionType, filterByContentType } 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: success === 'Blob',\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 OpenApiServerObject,\n} from '../types';\nimport { camel, isString, sanitize } from '../utils';\n\nconst TEMPLATE_TAG_IN_PATH_REGEX = /\\/([\\w]+)(?:\\$\\{)/g; // all dynamic parts of path\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: string | BaseUrlFromConstant | BaseUrlFromSpec | undefined,\n): string {\n const getBaseUrl = (): string => {\n if (!baseUrl) return '';\n if (isString(baseUrl)) return baseUrl;\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// Creates a mixed use array with path variables and string from template string route\nexport function getRouteAsArray(route: string): string {\n return route\n .replaceAll(TEMPLATE_TAG_IN_PATH_REGEX, '/$1/${')\n .split('/')\n .filter((i) => i !== '')\n .map((i) =>\n // @note - array is mixed with string and var\n i.includes('${') ? i.replace(TEMPLATE_TAG_REGEX, '$1') : `'${i}'`,\n )\n .join(',')\n .replace(',,', '');\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}\n\nexport function generateImports({\n imports,\n namingConvention = NamingConvention.CAMEL_CASE,\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 ?? `./${conventionName(imp.name, namingConvention)}`,\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))\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 const path = `${oneMore ? '../' : ''}${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 dep += '\\n';\n }\n dep += generateDependency({\n deps: uniqueTypes,\n isAllowSyntheticDefaultImports,\n dependency,\n projectName,\n key,\n onlyTypes: true,\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 { 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 { type ecmaVersion, Parser, type Program } from 'acorn';\nimport { build, type BuildOptions } from 'esbuild';\nimport { isArray } from 'remeda';\n\nimport type {\n GeneratorMutatorParsingInfo,\n Tsconfig,\n TsConfigTarget,\n} 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(\n code,\n namedExport,\n getEcmaVersion(tsconfig?.compilerOptions?.target),\n );\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 ecmaVersion: ecmaVersion = 6,\n): GeneratorMutatorParsingInfo | undefined {\n try {\n const ast = Parser.parse(file, { ecmaVersion, sourceType: 'module' });\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\nfunction getEcmaVersion(target?: TsConfigTarget): ecmaVersion | undefined {\n if (!target) {\n return;\n }\n\n if (target.toLowerCase() === 'esnext') {\n return 'latest';\n }\n\n try {\n return Number(target.toLowerCase().replace('es', '')) as ecmaVersion;\n } catch {\n return;\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): string => {\n const filteredParamValueType = `string | number | boolean${preserveRequiredNullables ? ' | null' : ''} | Array<string | number | boolean>`;\n const preserveNullableBranch = preserveRequiredNullables\n ? ` } else if (value === null && requiredNullableParamKeys.has(key)) {\n filteredParams[key] = value;\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\n return `(() => {\n const requiredNullableParamKeys = new Set<string>(${JSON.stringify(requiredNullableParamKeys)});\n const filteredParams: Record<string, ${filteredParamValueType}> = {};\n for (const [key, value] of Object.entries(${paramsExpression})) {\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${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): Record<string, AngularHttpParamValue>;\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys: ReadonlySet<string> | undefined,\n preserveRequiredNullables: true,\n): Record<string, AngularHttpParamValueWithNullable>;\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys: ReadonlySet<string> = new Set(),\n preserveRequiredNullables = false,\n): Record<string, AngularHttpParamValueWithNullable> {\n const filteredParams: Record<string, AngularHttpParamValueWithNullable> = {};\n for (const [key, value] of Object.entries(params)) {\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] = value;\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): string =>\n `filterParams(${paramsExpression}, new Set<string>(${JSON.stringify(requiredNullableParamKeys)})${preserveRequiredNullables ? ', true' : ''})`;\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) {\n if (isFormData && body.formData) {\n return '\\n formData,';\n }\n\n if (isFormUrlEncoded && body.formUrlEncoded) {\n return '\\n formUrlEncoded,';\n }\n\n if (body.implementation) {\n return `\\n ${body.implementation},`;\n }\n\n return '';\n}\n\ninterface GenerateAxiosOptions {\n response: GetterResponse;\n isExactOptionalPropertyTypes: boolean;\n angularObserve?: 'body' | 'events' | 'response';\n angularParamsRef?: string;\n requiredNullableQueryParamKeys?: 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}\n\nexport function generateAxiosOptions({\n response,\n isExactOptionalPropertyTypes,\n angularObserve,\n angularParamsRef,\n requiredNullableQueryParamKeys,\n queryParams,\n headers,\n requestOptions,\n hasSignal,\n hasSignalParam = false,\n isVue,\n isAngular,\n paramsSerializer,\n paramsSerializerOptions,\n}: GenerateAxiosOptions) {\n const isRequestOptions = requestOptions !== false;\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 = getAngularFilteredParamsExpression(\n 'params ?? {}',\n requiredNullableQueryParamKeys,\n !!paramsSerializer,\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 = getAngularFilteredParamsCallExpression(\n '{...params, ...options?.params}',\n requiredNullableQueryParamKeys,\n true,\n );\n value += `\\n params: ${paramsSerializer.name}(${callExpr}),`;\n } else if (isAngular) {\n value += `\\n params: ${getAngularFilteredParamsCallExpression('{...params, ...options?.params}', requiredNullableQueryParamKeys)},`;\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}\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}: GenerateOptionsOptions) {\n const bodyOptions = getIsBodyVerb(verb)\n ? generateBodyOptions(body, isFormData, isFormUrlEncoded)\n : '';\n\n const axiosOptions = generateAxiosOptions({\n response,\n angularObserve,\n angularParamsRef,\n requiredNullableQueryParamKeys: queryParams?.requiredNullableKeys,\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 });\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 (!bodyOptions) {\n return `\\n \\`${route}\\`${optionsArgument ? `,${optionsArgument}` : ''}\\n `;\n }\n\n const deleteBodyOptions = isRawOptionsArgument\n ? `...${optionsArgument}`\n : axiosOptions;\n\n return `\\n \\`${route}\\`,{${\n isAngular ? 'body' : 'data'\n }:${bodyOptions} ${axiosOptions ? deleteBodyOptions : ''}}\\n `;\n }\n\n const bodyOrOptions = getIsBodyVerb(verb) ? bodyOptions || 'undefined,' : '';\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) {\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 value += `,\\n params: ${getAngularFilteredParamsExpression('params ?? {}', requiredNullableQueryParamKeys)}`;\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}\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}: 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 );\n\n const ignoreContentTypes = ['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 GeneratorSchema,\n OpenApiComponentsObject,\n OpenApiParameterObject,\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 { schema, imports } = resolveRef<OpenApiParameterObject>(\n parameter,\n context,\n );\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,\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 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 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 { 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\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 responses,\n requestBody,\n parameters: operationParameters,\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 response = getResponse({\n responses: responses ?? {},\n operationName,\n context,\n contentType: override.contentType,\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 parameters = getParameters({\n parameters: [...verbParameters, ...(operationParameters ?? [])],\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: 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 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: 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 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 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\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","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} from '../types';\nimport { conventionName, 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 * Get the import extension from a file extension.\n * Removes `.ts` suffix since TypeScript doesn't need it in imports.\n */\nfunction getImportExtension(fileExtension: string): string {\n return fileExtension.replace(/\\.ts$/, '') || '';\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): void {\n const relativePath = upath.relativeSafe(fromPath, toPath);\n const importExtension = getImportExtension(fileExtension);\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): void {\n fixSchemaImports(\n operationSchemas,\n regularSchemaNames,\n operationSchemaPath,\n schemaPath,\n namingConvention,\n fileExtension,\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): void {\n fixSchemaImports(\n regularSchemas,\n operationSchemaNames,\n schemaPath,\n operationSchemaPath,\n namingConvention,\n fileExtension,\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) {\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 importPath = removeFileExtension(\n upath.relativeSafe(\n schemaPath,\n canonical.importPath.replaceAll('\\\\', '/'),\n ),\n fileExtension,\n );\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\nfunction removeFileExtension(path: string, fileExtension: string) {\n return path.endsWith(fileExtension)\n ? path.slice(0, path.length - fileExtension.length)\n : path;\n}\n\ninterface GetSchemaOptions {\n schema: GeneratorSchema;\n target: string;\n header: string;\n namingConvention?: NamingConvention;\n}\n\nfunction getSchema({\n schema: { imports, model },\n header,\n namingConvention = NamingConvention.CAMEL_CASE,\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 });\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}\n\nexport async function writeSchema({\n path,\n schema,\n target,\n namingConvention,\n fileExtension,\n header,\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 }),\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}\n\nexport async function writeSchemas({\n schemaPath,\n schemas,\n target,\n namingConvention,\n fileExtension,\n header,\n indexFiles,\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 );\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 });\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 });\n }\n\n if (indexFiles) {\n const schemaFilePath = nodePath.join(schemaPath, `index${fileExtension}`);\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 = fileExtension.endsWith('.ts')\n ? fileExtension.slice(0, -3)\n : fileExtension;\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));\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, 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: upath.joinSafe(relativeSchemasPath, 'index.zod'),\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 = output.fileExtension.replace(/\\.ts$/, '') || '';\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 GeneratorTarget,\n type GeneratorTargetFull,\n type NormalizedOutputOptions,\n OutputClient,\n type WriteSpecBuilder,\n} from '../types';\nimport { compareVersions, pascal } from '../utils';\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<GeneratorTargetFull> = {\n imports: [],\n implementation: '',\n implementationMock: {\n function: '',\n handler: '',\n handlerName: '',\n },\n importsMock: [],\n mutators: [],\n clientMutators: [],\n formData: [],\n formUrlEncoded: [],\n paramsSerializer: [],\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.importsMock.push(...operation.importsMock);\n target.implementation += operation.implementation + '\\n';\n target.implementationMock.function += operation.implementationMock.function;\n target.implementationMock.handler += operation.implementationMock.handler;\n\n const handlerNameSeparator =\n target.implementationMock.handlerName.length > 0 ? ',\\n ' : ' ';\n target.implementationMock.handlerName +=\n handlerNameSeparator + operation.implementationMock.handlerName + '()';\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\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 target.implementationMock.handler =\n target.implementationMock.handler +\n header.implementationMock +\n target.implementationMock.handlerName;\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 target.implementationMock.handler += footer.implementationMock;\n }\n }\n\n return {\n ...target,\n implementationMock:\n target.implementationMock.function + target.implementationMock.handler,\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 { generateTarget } from './target';\nimport { getOrvalGeneratedTypes, getTypedResponse } from './types';\n\nexport async function writeSingleMode({\n builder,\n output,\n projectName,\n header,\n needSchema,\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 importsMock,\n implementation,\n implementationMock,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n paramsSerializer,\n fetchReviver,\n } = generateTarget(builder, output);\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 const importsForBuilder = schemasPath\n ? generateImportsForBuilder(output, normalizedImports, schemasPath)\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 if (output.mock) {\n const importsMockForBuilder = schemasPath\n ? generateImportsForBuilder(\n output,\n importsMock.filter(\n (impMock) =>\n !normalizedImports.some(\n (imp) =>\n imp.name === impMock.name &&\n (imp.alias ?? '') === (impMock.alias ?? ''),\n ),\n ),\n schemasPath,\n )\n : [];\n data += builder.importsMock({\n implementation: implementationMock,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: isFunction(output.mock) ? undefined : output.mock,\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 (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 += generateModelsInline(builder.schemas);\n }\n\n data += `${implementation.trim()}\\n`;\n\n if (output.mock) {\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 { OutputClient, type WriteModeProps } 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}: 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 implementationMock,\n importsMock,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n paramsSerializer,\n fetchReviver,\n } = generateTarget(builder, output);\n\n let implementationData = header;\n let mockData = 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';\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 importsMockForBuilder = generateImportsForBuilder(\n output,\n importsMock,\n relativeSchemasPath,\n );\n\n mockData += builder.importsMock({\n implementation: implementationMock,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: isFunction(output.mock) ? undefined : output.mock,\n });\n\n const schemasPath = output.schemas\n ? undefined\n : path.join(dirname, filename + '.schemas' + extension);\n\n if (schemasPath && needSchema) {\n const schemasData = 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 (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 mockData += `\\n${implementationMock}`;\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 const mockPath = output.mock\n ? path.join(\n dirname,\n filename +\n '.' +\n getMockFileExtensionByTypeName(output.mock) +\n extension,\n )\n : undefined;\n\n if (mockPath) {\n await writeGeneratedFile(mockPath, mockData);\n }\n\n return [\n implementationPath,\n ...(schemasPath ? [schemasPath] : []),\n ...(mockPath ? [mockPath] : []),\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 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\nfunction addDefaultTagIfEmpty(operation: GeneratorOperation) {\n return {\n ...operation,\n tags: operation.tags.length > 0 ? operation.tags : ['default'],\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 importsMock: operation.importsMock,\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 fetchReviver: operation.fetchReviver ? [operation.fetchReviver] : [],\n implementation: operation.implementation,\n implementationMock: {\n function: operation.implementationMock.function,\n handler: operation.implementationMock.handler,\n handlerName: ' ' + operation.implementationMock.handlerName + '()',\n },\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 importsMock: [...currentOperation.importsMock, ...operation.importsMock],\n implementationMock: {\n function:\n currentOperation.implementationMock.function +\n operation.implementationMock.function,\n handler:\n currentOperation.implementationMock.handler +\n operation.implementationMock.handler,\n handlerName:\n currentOperation.implementationMock.handlerName +\n ',\\n ' +\n operation.implementationMock.handlerName +\n '()',\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 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 clientImplementation: target.implementation,\n });\n\n transformed[tag] = {\n implementation:\n header.implementation +\n target.implementation +\n footer.implementation,\n implementationMock: {\n function: target.implementationMock.function,\n handler:\n target.implementationMock.handler +\n header.implementationMock +\n target.implementationMock.handlerName +\n footer.implementationMock,\n handlerName: target.implementationMock.handlerName,\n },\n imports: target.imports,\n importsMock: target.importsMock,\n mutators: target.mutators,\n clientMutators: target.clientMutators,\n formData: target.formData,\n formUrlEncoded: target.formUrlEncoded,\n paramsSerializer: target.paramsSerializer,\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 implementationMock:\n target.implementationMock.function + target.implementationMock.handler,\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 { OutputClient, type WriteModeProps } 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}: 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 mockOption =\n output.mock && !isFunction(output.mock) ? output.mock : undefined;\n const indexFilePath = mockOption?.indexMockFiles\n ? path.join(\n dirname,\n 'index.' + getMockFileExtensionByTypeName(mockOption) + extension,\n )\n : undefined;\n if (indexFilePath) {\n await fs.outputFile(indexFilePath, '');\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 implementationMock,\n importsMock,\n mutators,\n clientMutators,\n formData,\n fetchReviver,\n formUrlEncoded,\n paramsSerializer,\n } = target;\n\n let implementationData = header;\n let mockData = 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';\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 importsMockForBuilder = generateImportsForBuilder(\n output,\n importsMock,\n relativeSchemasPath,\n );\n\n mockData += builder.importsMock({\n implementation: implementationMock,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: isFunction(output.mock) ? undefined : output.mock,\n });\n\n const schemasPath = output.schemas\n ? undefined\n : path.join(dirname, filename + '.schemas' + extension);\n\n if (schemasPath && needSchema) {\n const schemasData = 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\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 mockData += `\\n${implementationMock}`;\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 const mockPath = output.mock\n ? path.join(\n dirname,\n tag,\n tag +\n '.' +\n getMockFileExtensionByTypeName(output.mock) +\n extension,\n )\n : undefined;\n\n if (mockPath) {\n await writeGeneratedFile(mockPath, mockData);\n }\n\n return [\n implementationPath,\n ...(schemasPath ? [schemasPath] : []),\n ...(mockPath ? [mockPath] : []),\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 mock index file after Promise.all to ensure deterministic export order.\n if (indexFilePath && mockOption) {\n const indexContent = tagEntries\n .map(([tag]) => {\n const localMockPath = upath.joinSafe(\n './',\n tag,\n tag + '.' + getMockFileExtensionByTypeName(mockOption),\n );\n return `export { get${pascal(tag)}Mock } from '${localMockPath}'\\n`;\n })\n .join('');\n await fs.appendFile(indexFilePath, indexContent);\n }\n\n return [\n ...new Set([\n ...(indexFilePath ? [indexFilePath] : []),\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 { 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}: 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 implementationMock,\n importsMock,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n fetchReviver,\n paramsSerializer,\n } = target;\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';\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 if (output.mock) {\n const importsMockForBuilder = generateImportsForBuilder(\n output,\n importsMock.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: implementationMock,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: isFunction(output.mock) ? undefined : output.mock,\n });\n }\n\n const schemasPath = output.schemas\n ? undefined\n : path.join(dirname, filename + '.schemas' + extension);\n\n if (schemasPath && needSchema) {\n const schemasData = 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 (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 (output.mock) {\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","isString","regex","basepath","upath.getSchemaFileName","getSchema","isNullish","isBoolean","upath.getRelativeImportPath","fs","fs","upath.relativeSafe","upath.joinSafe","upath\n .join","nodePath","path","fs","upath.joinSafe","upath.getRelativeImportPath","upath.getRelativeImportPath","fs","upath.getRelativeImportPath","upath.joinSafe","upath.getRelativeImportPath"],"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/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/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 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 mock?: GlobalMockOptions | ClientMockBuilder;\n override: NormalizedOverrideOutput;\n client: OutputClient | OutputClientFunc;\n httpClient: OutputHttpClient;\n clean: boolean | string[];\n docs: boolean | OutputDocsOptions;\n prettier: boolean;\n biome: boolean;\n tsconfig?: Tsconfig;\n packageJson?: PackageJson;\n headers: boolean;\n indexFiles: boolean;\n baseUrl?: string | BaseUrlFromSpec | BaseUrlFromConstant;\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 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 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 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 requestOptions?: object | boolean;\n}\n\nexport interface NormalizedInputOptions {\n target: string | OpenApiDocument;\n override: OverrideInput;\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\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;\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 // If mock is a boolean, it will use the default mock options (type: msw)\n mock?: boolean | GlobalMockOptions | ClientMockBuilder;\n override?: OverrideOutput;\n client?: OutputClient | OutputClientFunc;\n httpClient?: OutputHttpClient;\n clean?: boolean | string[];\n docs?: boolean | OutputDocsOptions;\n prettier?: boolean;\n biome?: boolean;\n tsconfig?: string | Tsconfig;\n packageJson?: string;\n headers?: boolean;\n indexFiles?: boolean;\n baseUrl?: string | BaseUrlFromSpec | BaseUrlFromConstant;\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 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} 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\nexport interface GlobalMockOptions {\n // This is the type of the mock that will be generated\n type: OutputMockType;\n // This is the option to use the examples from the openapi specification where possible to generate mock data\n useExamples?: boolean;\n // This is used to generate mocks for all http responses defined in the OpenAPI specification\n generateEachHttpStatus?: boolean;\n // This is used to set the delay to your own custom value, or pass false to disable delay\n delay?: false | number | (() => number);\n // This is used to execute functions that are passed to the 'delay' argument\n // at runtime rather than build time.\n delayFunctionLazyExecute?: boolean;\n // This is used to set the base url to your own custom value\n baseUrl?: string;\n // This is used to set the locale of the faker library\n locale?: keyof typeof allLocales;\n // Preferred response content type when multiple success content types exist\n preferredContentType?: string;\n indexMockFiles?: boolean;\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 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 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 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}\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 dateTimeOptions: ZodDateTimeOptions;\n timeOptions: ZodTimeOptions;\n}\n\nexport type InvalidateTarget =\n | string\n | {\n query: string;\n params?: string[] | Record<string, string>;\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 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\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\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}\n\nexport interface FetchOptions {\n includeHttpResponseReturnType?: boolean;\n forceSuccessResponse?: boolean;\n jsonReviver?: Mutator;\n runtimeValidation?: boolean;\n}\n\nexport type InputTransformerFn = (spec: OpenApiDocument) => 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 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\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 prettier?: boolean;\n biome?: boolean;\n mock?: boolean | GlobalMockOptions;\n client?: OutputClient;\n httpClient?: OutputHttpClient;\n mode?: OutputMode;\n tsconfig?: string | Tsconfig;\n packageJson?: string;\n input?: string | string[];\n output?: string;\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 };\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 | 'esnext'; // https://www.typescriptlang.org/tsconfig#target\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\nexport interface GeneratorTarget {\n imports: GeneratorImport[];\n implementation: string;\n implementationMock: string;\n importsMock: GeneratorImport[];\n mutators?: GeneratorMutator[];\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator[];\n formUrlEncoded?: GeneratorMutator[];\n paramsSerializer?: GeneratorMutator[];\n fetchReviver?: GeneratorMutator[];\n}\n\nexport interface GeneratorTargetFull {\n imports: GeneratorImport[];\n implementation: string;\n implementationMock: {\n function: string;\n handler: string;\n handlerName: string;\n };\n importsMock: GeneratorImport[];\n mutators?: GeneratorMutator[];\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator[];\n formUrlEncoded?: GeneratorMutator[];\n paramsSerializer?: GeneratorMutator[];\n fetchReviver?: GeneratorMutator[];\n}\n\nexport interface GeneratorOperation {\n imports: GeneratorImport[];\n implementation: string;\n implementationMock: {\n function: string;\n handler: string;\n handlerName: string;\n };\n importsMock: GeneratorImport[];\n tags: string[];\n mutator?: GeneratorMutator;\n clientMutators?: GeneratorMutator[];\n formData?: GeneratorMutator;\n formUrlEncoded?: GeneratorMutator;\n paramsSerializer?: 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 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}\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 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\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}\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 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 { isNullish, isString } from 'remeda';\n\nimport {\n type OpenApiReferenceObject,\n type OpenApiSchemaObject,\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\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/**\n * Determine if a content type is binary (vs text-based).\n */\nexport function isBinaryContentType(contentType: string): boolean {\n if (contentType === 'application/octet-stream') return true;\n\n if (contentType.startsWith('image/')) return true;\n if (contentType.startsWith('audio/')) return true;\n if (contentType.startsWith('video/')) return true;\n if (contentType.startsWith('font/')) return true;\n\n // text/* types are not binary\n if (contentType.startsWith('text/')) return false;\n\n // text-based suffixes (RFC 6838)\n const textSuffixes = [\n '+json',\n '-json',\n '+xml',\n '-xml',\n '+yaml',\n '-yaml',\n '+rss',\n '-rss',\n '+csv',\n '-csv',\n ];\n if (textSuffixes.some((suffix) => contentType.includes(suffix))) {\n return false;\n }\n\n // text-based whitelist - these are NOT binary\n const textApplicationTypes = new Set([\n 'application/json',\n 'application/xml',\n 'application/yaml',\n 'application/x-www-form-urlencoded',\n 'application/javascript',\n 'application/ecmascript',\n 'application/graphql',\n ]);\n\n return !textApplicationTypes.has(contentType);\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}\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 // 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 ).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 ].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 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 { globby } from 'globby';\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 globby(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 globby(['**/*'], {\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 type { ClientMockBuilder, GlobalMockOptions } from '../types';\nimport { isFunction } from './assertion';\n\nexport function getMockFileExtensionByTypeName(\n mock: GlobalMockOptions | ClientMockBuilder,\n) {\n if (isFunction(mock)) {\n return 'msw';\n }\n switch (mock.type) {\n default: {\n // case 'msw':\n return 'msw';\n }\n }\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 _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 log(\n styleText(\n 'yellow',\n `${mismatchArgs.join(', ')} ${\n mismatchArgs.length === 1 ? 'is' : 'are'\n } not defined in your configuration!`,\n ),\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","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 string[] | undefined;\n\n if (!names) return;\n\n return names.map((name: string) => jsStringEscape(name));\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 string[] | undefined;\n\n if (!descriptions) return;\n\n return descriptions.map((description: string) => jsStringEscape(description));\n}\n\nexport function getEnum(\n value: string,\n enumName: string,\n names: string[] | undefined,\n enumGenerationType: EnumGeneration,\n descriptions?: string[],\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[],\n descriptions?: string[],\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[],\n descriptions?: string[],\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[],\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[],\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\ntype RefComponent = 'schemas' | 'responses' | 'parameters' | 'requestBodies';\n\nconst RefComponent = {\n schemas: 'schemas' as RefComponent,\n responses: 'responses' as RefComponent,\n parameters: 'parameters' as RefComponent,\n requestBodies: 'requestBodies' as RefComponent,\n};\n\nexport const RefComponentSuffix: Record<RefComponent, string> = {\n schemas: '',\n responses: 'Response',\n parameters: 'Parameter',\n requestBodies: 'Body',\n};\n\nconst regex = new RegExp('~1', '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) => decodeURIComponent(part.replaceAll(regex, '/')));\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 } = resolveRef<OpenApiExampleObject>(example, context);\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 ? (resolveRef<OpenApiExampleObject>(example, context).schema\n .value as ResolvedExample)\n : example;\n }\n return result;\n })();\n}\n","import { getScalar } from '../getters';\nimport type { FormDataContext } from '../getters/object';\nimport type {\n ContextSpec,\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 { schema: schemaObject, imports } = resolveRef<OpenApiSchemaObject>(\n schema,\n context,\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 nullable =\n (Array.isArray(schemaObject.type) &&\n schemaObject.type.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('|')\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;\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-data, pass context that tracks encoding for file type detection\n const formDataContext: FormDataContext | undefined = isFormData\n ? { atPart: false, encoding: mediaType.encoding ?? {} }\n : undefined;\n\n const resolvedObject = resolveObject({\n schema: mediaType.schema,\n propName,\n context,\n formDataContext,\n });\n\n // Media key has highest precedence: binary media key → Blob (overrides schema)\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 } = resolveRef<OpenApiRequestBodyObject | OpenApiResponseObject>(\n res,\n context,\n );\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:\n // Even though required is false by default, we only consider required to be false if specified. (See pull 1277)\n 'required' in bodySchema && bodySchema.required === false,\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:\n 'required' in bodySchema && bodySchema.required === false,\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 // 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 } = resolveRef<OpenApiSchemaObject>(\n mediaType.schema,\n context,\n );\n if (imports[0]?.name) {\n effectivePropName = imports[0].name;\n }\n }\n\n const isFormData = formDataContentTypes.has(contentType);\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 const isFormUrlEncoded =\n formUrlEncodedContentTypes.has(contentType);\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:\n 'required' in res && res.required === false,\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:\n 'required' in res && res.required === false,\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 } = resolveRef<OpenApiSchemaObject>(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(\n (subSchema) =>\n resolveRef<OpenApiSchemaObject>(subSchema, context).imports[0],\n )\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 } = resolveRef<OpenApiSchemaObject>(\n schemaObject,\n context,\n );\n const propName = camel(\n !isRef && isReference(schemaObject) ? imports[0].name : name,\n );\n const additionalImports: GeneratorImport[] = [];\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 const combinedSchemasFormData = combinedSchemas\n .map((subSchema) => {\n const { schema: combinedSchema, imports } =\n resolveRef<OpenApiSchemaObject>(subSchema, context);\n\n let newPropName = propName;\n let newPropDefinition = '';\n\n // If the schema is a union type (oneOf, anyOf) and includes a reference (has imports),\n // we need to cast the property to the specific type to avoid TypeScript errors.\n if (shouldCast && imports[0]) {\n additionalImports.push(imports[0]);\n newPropName = `${propName}${pascal(imports[0].name)}`;\n newPropDefinition = `const ${newPropName} = (${propName} as ${imports[0].name}${isRequestBodyOptional ? ' | undefined' : ''});\\n`;\n }\n\n return (\n newPropDefinition +\n resolveSchemaPropertiesToFormData({\n schema: combinedSchema,\n variableName,\n propName: newPropName,\n context,\n isRequestBodyOptional,\n encoding,\n })\n );\n })\n .filter(Boolean)\n .join('\\n');\n\n form += combinedSchemasFormData;\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 } = resolveRef<OpenApiSchemaObject>(\n schemaItems,\n context,\n );\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 const schemaProps = getSchemaProperties(schema) ?? {};\n for (const [key, value] of Object.entries(schemaProps)) {\n const { schema: property } = resolveRef<OpenApiSchemaObject>(\n value,\n context,\n );\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 (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 (property.type === 'object') {\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 : partContentType\n ? `${variableName}.append(\\`${keyPrefix}${key}\\`, new Blob([JSON.stringify(${nonOptionalValueKey})], { type: '${partContentType}' }));\\n`\n : `${variableName}.append(\\`${keyPrefix}${key}\\`, JSON.stringify(${nonOptionalValueKey}));\\n`;\n } else if (property.type === 'array') {\n let valueStr = 'value';\n let hasNonPrimitiveChild = false;\n const propertyItems = getSchemaItems(property);\n if (propertyItems) {\n const { schema: itemSchema } = resolveRef<OpenApiSchemaObject>(\n propertyItems,\n context,\n );\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} 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\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 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 // OpenAPI `readOnly` properties are typically response-only, so request body\n // types are relaxed by default for backwards compatibility. The override lets\n // callers opt back into preserving readonly request payloads when desired.\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 } = resolveRef<OpenApiRequestBodyObject>(\n requestBody,\n context,\n );\n if (bodySchema.required !== undefined) {\n isOptional = !bodySchema.required;\n }\n } else if (requestBody.required !== undefined) {\n isOptional = !requestBody.required;\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","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\n/**\n * Extract enum values from propertyNames schema (OpenAPI 3.1)\n * Returns undefined if propertyNames doesn't have an enum\n */\nfunction getPropertyNamesEnum(item: OpenApiSchemaObject): string[] | undefined {\n if (\n 'propertyNames' in item &&\n item.propertyNames &&\n 'enum' in item.propertyNames\n ) {\n const propertyNames = item.propertyNames as { enum?: unknown[] };\n if (Array.isArray(propertyNames.enum)) {\n return propertyNames.enum.filter((val): val is string => isString(val));\n }\n }\n return undefined;\n}\n\n/**\n * Generate index signature key type based on propertyNames enum\n * Returns union type string like \"'foo' | 'bar'\" or 'string' if no enum\n */\nfunction getIndexSignatureKey(item: OpenApiSchemaObject): string {\n const enumValues = getPropertyNamesEnum(item);\n if (enumValues && enumValues.length > 0) {\n return enumValues.map((val) => `'${val}'`).join(' | ');\n }\n return 'string';\n}\n\nfunction getPropertyNamesRecordType(\n item: OpenApiSchemaObject,\n valueType: string,\n): string | undefined {\n const enumValues = getPropertyNamesEnum(item);\n if (!enumValues || enumValues.length === 0) {\n return undefined;\n }\n\n const keyType = enumValues.map((val) => `'${val}'`).join(' | ');\n return `Partial<Record<${keyType}, ${valueType}>>`;\n}\n\n/**\n * Context for multipart/form-data type generation.\n * Discriminated union with two states:\n *\n * 1. `{ atPart: false, encoding }` - At form-data 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 * `undefined` means not in form-data context (or nested inside plain object field = JSON)\n */\nexport type FormDataContext =\n | { atPart: false; encoding: Record<string, { contentType?: string }> }\n | { atPart: true; partContentType?: string };\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]);\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 multipart context: atPart: false → atPart: true\n // Look up encoding[key].contentType and pass to property resolution\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 }\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 if (isReadOnly) {\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 );\n if (recordType) {\n acc.value += '\\n}';\n acc.value += ` & ${recordType}`;\n acc.useTypeAlias = true;\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 );\n if (recordType) {\n acc.value += '\\n}';\n acc.value += ` & ${recordType}`;\n acc.useTypeAlias = true;\n } else {\n const keyType = getIndexSignatureKey(schemaItem);\n acc.value += `\\n [key: ${keyType}]: ${resolvedValue.value};\\n}`;\n }\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(schemaItem, 'unknown');\n if (recordType) {\n return {\n value: recordType + nullable,\n imports: [],\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: true,\n 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 );\n if (recordType) {\n return {\n value: recordType + nullable,\n 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: resolvedValue.dependencies,\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');\n if (itemType === 'object' && recordType) {\n return {\n value: recordType + nullable,\n imports: [],\n schemas: [],\n isEnum: false,\n type: 'object',\n isRef: false,\n hasReadonlyProps: readOnlyFlag ?? false,\n useTypeAlias: true,\n 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' + 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 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 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 mergedEnumValues = [\n ...(enumValues ?? []).filter((value) => value !== mappingKey),\n mappingKey,\n ];\n\n const mergedProperty = {\n ...schemaProperty,\n type: 'string',\n enum: mergedEnumValues,\n };\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';\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: parameter, imports } = resolveRef<OpenApiParameterObject>(\n p,\n context,\n );\n\n if (\n parameter.in === 'path' ||\n parameter.in === 'query' ||\n parameter.in === 'header'\n ) {\n result[parameter.in].push({ parameter, imports });\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\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\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 };\n}\n","import type {\n ContextSpec,\n GetterResponse,\n OpenApiResponsesObject,\n OverrideOutputContentType,\n ResReqTypesValue,\n} from '../types';\nimport { dedupeUnionType, filterByContentType } 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: success === 'Blob',\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 OpenApiServerObject,\n} from '../types';\nimport { camel, isString, sanitize } from '../utils';\n\nconst TEMPLATE_TAG_IN_PATH_REGEX = /\\/([\\w]+)(?:\\$\\{)/g; // all dynamic parts of path\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: string | BaseUrlFromConstant | BaseUrlFromSpec | undefined,\n): string {\n const getBaseUrl = (): string => {\n if (!baseUrl) return '';\n if (isString(baseUrl)) return baseUrl;\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// Creates a mixed use array with path variables and string from template string route\nexport function getRouteAsArray(route: string): string {\n return route\n .replaceAll(TEMPLATE_TAG_IN_PATH_REGEX, '/$1/${')\n .split('/')\n .filter((i) => i !== '')\n .map((i) =>\n // @note - array is mixed with string and var\n i.includes('${') ? i.replace(TEMPLATE_TAG_REGEX, '$1') : `'${i}'`,\n )\n .join(',')\n .replace(',,', '');\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}\n\nexport function generateImports({\n imports,\n namingConvention = NamingConvention.CAMEL_CASE,\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 ?? `./${conventionName(imp.name, namingConvention)}`,\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))\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 const path = `${oneMore ? '../' : ''}${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 dep += '\\n';\n }\n dep += generateDependency({\n deps: uniqueTypes,\n isAllowSyntheticDefaultImports,\n dependency,\n projectName,\n key,\n onlyTypes: true,\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 { 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 { type ecmaVersion, Parser, type Program } from 'acorn';\nimport { build, type BuildOptions } from 'esbuild';\nimport { isArray } from 'remeda';\n\nimport type {\n GeneratorMutatorParsingInfo,\n Tsconfig,\n TsConfigTarget,\n} 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(\n code,\n namedExport,\n getEcmaVersion(tsconfig?.compilerOptions?.target),\n );\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 ecmaVersion: ecmaVersion = 6,\n): GeneratorMutatorParsingInfo | undefined {\n try {\n const ast = Parser.parse(file, { ecmaVersion, sourceType: 'module' });\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\nfunction getEcmaVersion(target?: TsConfigTarget): ecmaVersion | undefined {\n if (!target) {\n return;\n }\n\n if (target.toLowerCase() === 'esnext') {\n return 'latest';\n }\n\n try {\n return Number(target.toLowerCase().replace('es', '')) as ecmaVersion;\n } catch {\n return;\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): string => {\n const filteredParamValueType = `string | number | boolean${preserveRequiredNullables ? ' | null' : ''} | Array<string | number | boolean>`;\n const preserveNullableBranch = preserveRequiredNullables\n ? ` } else if (value === null && requiredNullableParamKeys.has(key)) {\n filteredParams[key] = value;\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\n return `(() => {\n const requiredNullableParamKeys = new Set<string>(${JSON.stringify(requiredNullableParamKeys)});\n const filteredParams: Record<string, ${filteredParamValueType}> = {};\n for (const [key, value] of Object.entries(${paramsExpression})) {\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${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): Record<string, AngularHttpParamValue>;\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys: ReadonlySet<string> | undefined,\n preserveRequiredNullables: true,\n): Record<string, AngularHttpParamValueWithNullable>;\nfunction filterParams(\n params: Record<string, unknown>,\n requiredNullableKeys: ReadonlySet<string> = new Set(),\n preserveRequiredNullables = false,\n): Record<string, AngularHttpParamValueWithNullable> {\n const filteredParams: Record<string, AngularHttpParamValueWithNullable> = {};\n for (const [key, value] of Object.entries(params)) {\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] = value;\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): string =>\n `filterParams(${paramsExpression}, new Set<string>(${JSON.stringify(requiredNullableParamKeys)})${preserveRequiredNullables ? ', true' : ''})`;\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) {\n if (isFormData && body.formData) {\n return '\\n formData,';\n }\n\n if (isFormUrlEncoded && body.formUrlEncoded) {\n return '\\n formUrlEncoded,';\n }\n\n if (body.implementation) {\n return `\\n ${body.implementation},`;\n }\n\n return '';\n}\n\ninterface GenerateAxiosOptions {\n response: GetterResponse;\n isExactOptionalPropertyTypes: boolean;\n angularObserve?: 'body' | 'events' | 'response';\n angularParamsRef?: string;\n requiredNullableQueryParamKeys?: 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}\n\nexport function generateAxiosOptions({\n response,\n isExactOptionalPropertyTypes,\n angularObserve,\n angularParamsRef,\n requiredNullableQueryParamKeys,\n queryParams,\n headers,\n requestOptions,\n hasSignal,\n hasSignalParam = false,\n isVue,\n isAngular,\n paramsSerializer,\n paramsSerializerOptions,\n}: GenerateAxiosOptions) {\n const isRequestOptions = requestOptions !== false;\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 = getAngularFilteredParamsExpression(\n 'params ?? {}',\n requiredNullableQueryParamKeys,\n !!paramsSerializer,\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 = getAngularFilteredParamsCallExpression(\n '{...params, ...options?.params}',\n requiredNullableQueryParamKeys,\n true,\n );\n value += `\\n params: ${paramsSerializer.name}(${callExpr}),`;\n } else if (isAngular) {\n value += `\\n params: ${getAngularFilteredParamsCallExpression('{...params, ...options?.params}', requiredNullableQueryParamKeys)},`;\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}\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}: GenerateOptionsOptions) {\n const bodyOptions = getIsBodyVerb(verb)\n ? generateBodyOptions(body, isFormData, isFormUrlEncoded)\n : '';\n\n const axiosOptions = generateAxiosOptions({\n response,\n angularObserve,\n angularParamsRef,\n requiredNullableQueryParamKeys: queryParams?.requiredNullableKeys,\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 });\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 (!bodyOptions) {\n return `\\n \\`${route}\\`${optionsArgument ? `,${optionsArgument}` : ''}\\n `;\n }\n\n const deleteBodyOptions = isRawOptionsArgument\n ? `...${optionsArgument}`\n : axiosOptions;\n\n return `\\n \\`${route}\\`,{${\n isAngular ? 'body' : 'data'\n }:${bodyOptions} ${axiosOptions ? deleteBodyOptions : ''}}\\n `;\n }\n\n const bodyOrOptions = getIsBodyVerb(verb) ? bodyOptions || 'undefined,' : '';\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) {\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 value += `,\\n params: ${getAngularFilteredParamsExpression('params ?? {}', requiredNullableQueryParamKeys)}`;\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}\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}: 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 );\n\n const ignoreContentTypes = ['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 GeneratorSchema,\n OpenApiComponentsObject,\n OpenApiParameterObject,\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 { schema, imports } = resolveRef<OpenApiParameterObject>(\n parameter,\n context,\n );\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,\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 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 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 { 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\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 responses,\n requestBody,\n parameters: operationParameters,\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 response = getResponse({\n responses: responses ?? {},\n operationName,\n context,\n contentType: override.contentType,\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 parameters = getParameters({\n parameters: [...verbParameters, ...(operationParameters ?? [])],\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: 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 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: 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 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 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\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","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} from '../types';\nimport { conventionName, 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 * Get the import extension from a file extension.\n * Removes `.ts` suffix since TypeScript doesn't need it in imports.\n */\nfunction getImportExtension(fileExtension: string): string {\n return fileExtension.replace(/\\.ts$/, '') || '';\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): void {\n const relativePath = upath.relativeSafe(fromPath, toPath);\n const importExtension = getImportExtension(fileExtension);\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): void {\n fixSchemaImports(\n operationSchemas,\n regularSchemaNames,\n operationSchemaPath,\n schemaPath,\n namingConvention,\n fileExtension,\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): void {\n fixSchemaImports(\n regularSchemas,\n operationSchemaNames,\n schemaPath,\n operationSchemaPath,\n namingConvention,\n fileExtension,\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) {\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 importPath = removeFileExtension(\n upath.relativeSafe(\n schemaPath,\n canonical.importPath.replaceAll('\\\\', '/'),\n ),\n fileExtension,\n );\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\nfunction removeFileExtension(path: string, fileExtension: string) {\n return path.endsWith(fileExtension)\n ? path.slice(0, path.length - fileExtension.length)\n : path;\n}\n\ninterface GetSchemaOptions {\n schema: GeneratorSchema;\n target: string;\n header: string;\n namingConvention?: NamingConvention;\n}\n\nfunction getSchema({\n schema: { imports, model },\n header,\n namingConvention = NamingConvention.CAMEL_CASE,\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 });\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}\n\nexport async function writeSchema({\n path,\n schema,\n target,\n namingConvention,\n fileExtension,\n header,\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 }),\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}\n\nexport async function writeSchemas({\n schemaPath,\n schemas,\n target,\n namingConvention,\n fileExtension,\n header,\n indexFiles,\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 );\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 });\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 });\n }\n\n if (indexFiles) {\n const schemaFilePath = nodePath.join(schemaPath, `index${fileExtension}`);\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 = fileExtension.endsWith('.ts')\n ? fileExtension.slice(0, -3)\n : fileExtension;\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));\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, 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: upath.joinSafe(relativeSchemasPath, 'index.zod'),\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 = output.fileExtension.replace(/\\.ts$/, '') || '';\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 GeneratorTarget,\n type GeneratorTargetFull,\n type NormalizedOutputOptions,\n OutputClient,\n type WriteSpecBuilder,\n} from '../types';\nimport { compareVersions, pascal } from '../utils';\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<GeneratorTargetFull> = {\n imports: [],\n implementation: '',\n implementationMock: {\n function: '',\n handler: '',\n handlerName: '',\n },\n importsMock: [],\n mutators: [],\n clientMutators: [],\n formData: [],\n formUrlEncoded: [],\n paramsSerializer: [],\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.importsMock.push(...operation.importsMock);\n target.implementation += operation.implementation + '\\n';\n target.implementationMock.function += operation.implementationMock.function;\n target.implementationMock.handler += operation.implementationMock.handler;\n\n const handlerNameSeparator =\n target.implementationMock.handlerName.length > 0 ? ',\\n ' : ' ';\n target.implementationMock.handlerName +=\n handlerNameSeparator + operation.implementationMock.handlerName + '()';\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\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 target.implementationMock.handler =\n target.implementationMock.handler +\n header.implementationMock +\n target.implementationMock.handlerName;\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 target.implementationMock.handler += footer.implementationMock;\n }\n }\n\n return {\n ...target,\n implementationMock:\n target.implementationMock.function + target.implementationMock.handler,\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 { generateTarget } from './target';\nimport { getOrvalGeneratedTypes, getTypedResponse } from './types';\n\nexport async function writeSingleMode({\n builder,\n output,\n projectName,\n header,\n needSchema,\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 importsMock,\n implementation,\n implementationMock,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n paramsSerializer,\n fetchReviver,\n } = generateTarget(builder, output);\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 const importsForBuilder = schemasPath\n ? generateImportsForBuilder(output, normalizedImports, schemasPath)\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 if (output.mock) {\n const importsMockForBuilder = schemasPath\n ? generateImportsForBuilder(\n output,\n importsMock.filter(\n (impMock) =>\n !normalizedImports.some(\n (imp) =>\n imp.name === impMock.name &&\n (imp.alias ?? '') === (impMock.alias ?? ''),\n ),\n ),\n schemasPath,\n )\n : [];\n data += builder.importsMock({\n implementation: implementationMock,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: isFunction(output.mock) ? undefined : output.mock,\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 (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 += generateModelsInline(builder.schemas);\n }\n\n data += `${implementation.trim()}\\n`;\n\n if (output.mock) {\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 { OutputClient, type WriteModeProps } 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}: 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 implementationMock,\n importsMock,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n paramsSerializer,\n fetchReviver,\n } = generateTarget(builder, output);\n\n let implementationData = header;\n let mockData = 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';\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 importsMockForBuilder = generateImportsForBuilder(\n output,\n importsMock,\n relativeSchemasPath,\n );\n\n mockData += builder.importsMock({\n implementation: implementationMock,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: isFunction(output.mock) ? undefined : output.mock,\n });\n\n const schemasPath = output.schemas\n ? undefined\n : path.join(dirname, filename + '.schemas' + extension);\n\n if (schemasPath && needSchema) {\n const schemasData = 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 (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 mockData += `\\n${implementationMock}`;\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 const mockPath = output.mock\n ? path.join(\n dirname,\n filename +\n '.' +\n getMockFileExtensionByTypeName(output.mock) +\n extension,\n )\n : undefined;\n\n if (mockPath) {\n await writeGeneratedFile(mockPath, mockData);\n }\n\n return [\n implementationPath,\n ...(schemasPath ? [schemasPath] : []),\n ...(mockPath ? [mockPath] : []),\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 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\nfunction addDefaultTagIfEmpty(operation: GeneratorOperation) {\n return {\n ...operation,\n tags: operation.tags.length > 0 ? operation.tags : ['default'],\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 importsMock: operation.importsMock,\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 fetchReviver: operation.fetchReviver ? [operation.fetchReviver] : [],\n implementation: operation.implementation,\n implementationMock: {\n function: operation.implementationMock.function,\n handler: operation.implementationMock.handler,\n handlerName: ' ' + operation.implementationMock.handlerName + '()',\n },\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 importsMock: [...currentOperation.importsMock, ...operation.importsMock],\n implementationMock: {\n function:\n currentOperation.implementationMock.function +\n operation.implementationMock.function,\n handler:\n currentOperation.implementationMock.handler +\n operation.implementationMock.handler,\n handlerName:\n currentOperation.implementationMock.handlerName +\n ',\\n ' +\n operation.implementationMock.handlerName +\n '()',\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 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 clientImplementation: target.implementation,\n });\n\n transformed[tag] = {\n implementation:\n header.implementation +\n target.implementation +\n footer.implementation,\n implementationMock: {\n function: target.implementationMock.function,\n handler:\n target.implementationMock.handler +\n header.implementationMock +\n target.implementationMock.handlerName +\n footer.implementationMock,\n handlerName: target.implementationMock.handlerName,\n },\n imports: target.imports,\n importsMock: target.importsMock,\n mutators: target.mutators,\n clientMutators: target.clientMutators,\n formData: target.formData,\n formUrlEncoded: target.formUrlEncoded,\n paramsSerializer: target.paramsSerializer,\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 implementationMock:\n target.implementationMock.function + target.implementationMock.handler,\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 { OutputClient, type WriteModeProps } 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}: 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 mockOption =\n output.mock && !isFunction(output.mock) ? output.mock : undefined;\n const indexFilePath = mockOption?.indexMockFiles\n ? path.join(\n dirname,\n 'index.' + getMockFileExtensionByTypeName(mockOption) + extension,\n )\n : undefined;\n if (indexFilePath) {\n await fs.outputFile(indexFilePath, '');\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 implementationMock,\n importsMock,\n mutators,\n clientMutators,\n formData,\n fetchReviver,\n formUrlEncoded,\n paramsSerializer,\n } = target;\n\n let implementationData = header;\n let mockData = 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';\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 importsMockForBuilder = generateImportsForBuilder(\n output,\n importsMock,\n relativeSchemasPath,\n );\n\n mockData += builder.importsMock({\n implementation: implementationMock,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: isFunction(output.mock) ? undefined : output.mock,\n });\n\n const schemasPath = output.schemas\n ? undefined\n : path.join(dirname, filename + '.schemas' + extension);\n\n if (schemasPath && needSchema) {\n const schemasData = 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\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 mockData += `\\n${implementationMock}`;\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 const mockPath = output.mock\n ? path.join(\n dirname,\n tag,\n tag +\n '.' +\n getMockFileExtensionByTypeName(output.mock) +\n extension,\n )\n : undefined;\n\n if (mockPath) {\n await writeGeneratedFile(mockPath, mockData);\n }\n\n return [\n implementationPath,\n ...(schemasPath ? [schemasPath] : []),\n ...(mockPath ? [mockPath] : []),\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 mock index file after Promise.all to ensure deterministic export order.\n if (indexFilePath && mockOption) {\n const indexContent = tagEntries\n .map(([tag]) => {\n const localMockPath = upath.joinSafe(\n './',\n tag,\n tag + '.' + getMockFileExtensionByTypeName(mockOption),\n );\n return `export { get${pascal(tag)}Mock } from '${localMockPath}'\\n`;\n })\n .join('');\n await fs.appendFile(indexFilePath, indexContent);\n }\n\n return [\n ...new Set([\n ...(indexFilePath ? [indexFilePath] : []),\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 { 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}: 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 implementationMock,\n importsMock,\n mutators,\n clientMutators,\n formData,\n formUrlEncoded,\n fetchReviver,\n paramsSerializer,\n } = target;\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';\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 if (output.mock) {\n const importsMockForBuilder = generateImportsForBuilder(\n output,\n importsMock.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: implementationMock,\n imports: importsMockForBuilder,\n projectName,\n hasSchemaDir: !!output.schemas,\n isAllowSyntheticDefaultImports,\n options: isFunction(output.mock) ? undefined : output.mock,\n });\n }\n\n const schemasPath = output.schemas\n ? undefined\n : path.join(dirname, filename + '.schemas' + extension);\n\n if (schemasPath && needSchema) {\n const schemasData = 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 (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 (output.mock) {\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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"}
|