@orval/angular 8.8.1 → 8.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -72,6 +72,10 @@ declare const PRIMITIVE_TYPES: Set<"string" | "number" | "boolean" | "void" | "u
72
72
  declare const isPrimitiveType: (t: string | undefined) => t is PrimitiveType;
73
73
  declare const isZodSchemaOutput: (output: NormalizedOutputOptions) => boolean;
74
74
  declare const isDefined: <T>(v: T | null | undefined) => v is T;
75
+ /**
76
+ * Maps a schema type name to its Zod output-type reference (`${typeName}Output`).
77
+ */
78
+ declare const getSchemaOutputTypeRef: (typeName: string) => string;
75
79
  declare const generateAngularTitle: (title: string) => string;
76
80
  /**
77
81
  * Builds the opening of an @Injectable Angular service class.
@@ -343,14 +347,15 @@ declare const generateHttpResourceFooter: ClientFooterBuilder;
343
347
  */
344
348
  declare const generateHttpResourceClient: ClientBuilder;
345
349
  /**
346
- * Generates the extra sibling resource file used by Angular `both` mode.
350
+ * Generates the extra sibling resource files used by Angular `both` mode.
347
351
  *
348
352
  * @remarks
349
353
  * The main generated file keeps the `HttpClient` service class while retrieval
350
354
  * resources are emitted into `*.resource.ts` so consumers can opt into both
351
- * access patterns without mixing the generated surfaces.
355
+ * access patterns without mixing the generated surfaces. In tag-based output
356
+ * modes this emits one sibling resource file per generated tag file.
352
357
  *
353
- * @returns A single extra file descriptor representing the generated resource file.
358
+ * @returns One or more extra file descriptors representing generated resource files.
354
359
  */
355
360
  declare const generateHttpResourceExtraFiles: ClientExtraFilesBuilder;
356
361
  //#endregion
@@ -378,5 +383,5 @@ declare const THIRD_PARAMETER_TEMPLATE = "// eslint-disable-next-line\n type
378
383
  //#region src/index.d.ts
379
384
  declare const builder: () => (options?: AngularOptions) => ClientGeneratorsBuilder;
380
385
  //#endregion
381
- export { ANGULAR_HTTP_CLIENT_DEPENDENCIES, ANGULAR_HTTP_RESOURCE_DEPENDENCIES, ClientOverride, HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE, HTTP_CLIENT_OPTIONS_TEMPLATE, HttpClientGeneratorContext, PRIMITIVE_TYPES, PrimitiveType, THIRD_PARAMETER_TEMPLATE, buildAcceptHelpers, buildServiceClassOpen, builder, builder as default, createReturnTypesRegistry, createRouteRegistry, generateAngular, generateAngularFooter, generateAngularHeader, generateAngularTitle, generateHttpClientImplementation, generateHttpResourceClient, generateHttpResourceExtraFiles, generateHttpResourceFooter, generateHttpResourceHeader, getAcceptHelperName, getAngularDependencies, getAngularHttpResourceDependencies, getAngularHttpResourceOnlyDependencies, getDefaultSuccessType, getHttpClientReturnTypes, getUniqueContentTypes, isDefined, isMutationVerb, isPrimitiveType, isRetrievalVerb, isZodSchemaOutput, resetHttpClientReturnTypes, routeRegistry };
386
+ export { ANGULAR_HTTP_CLIENT_DEPENDENCIES, ANGULAR_HTTP_RESOURCE_DEPENDENCIES, ClientOverride, HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE, HTTP_CLIENT_OPTIONS_TEMPLATE, HttpClientGeneratorContext, PRIMITIVE_TYPES, PrimitiveType, THIRD_PARAMETER_TEMPLATE, buildAcceptHelpers, buildServiceClassOpen, builder, builder as default, createReturnTypesRegistry, createRouteRegistry, generateAngular, generateAngularFooter, generateAngularHeader, generateAngularTitle, generateHttpClientImplementation, generateHttpResourceClient, generateHttpResourceExtraFiles, generateHttpResourceFooter, generateHttpResourceHeader, getAcceptHelperName, getAngularDependencies, getAngularHttpResourceDependencies, getAngularHttpResourceOnlyDependencies, getDefaultSuccessType, getHttpClientReturnTypes, getSchemaOutputTypeRef, getUniqueContentTypes, isDefined, isMutationVerb, isPrimitiveType, isRetrievalVerb, isZodSchemaOutput, resetHttpClientReturnTypes, routeRegistry };
382
387
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { GetterPropType, camel, conventionName, escapeRegExp, generateDependencyImports, generateFormDataAndUrlEncodedFunction, generateMutatorConfig, generateMutatorImports, generateMutatorRequestOptions, generateOptions, generateVerbImports, getAngularFilteredParamsCallExpression, getAngularFilteredParamsExpression, getAngularFilteredParamsHelperBody, getDefaultContentType, getEnumImplementation, getFileInfo, getFullRoute, isBoolean, isObject, isSyntheticDefaultImportsAllow, jsDoc, pascal, sanitize, toObjectString, upath } from "@orval/core";
1
+ import { GetterPropType, OutputMode, camel, conventionName, escapeRegExp, generateDependencyImports, generateFormDataAndUrlEncodedFunction, generateMutatorConfig, generateMutatorImports, generateMutatorRequestOptions, generateOptions, generateVerbImports, getAngularFilteredParamsCallExpression, getAngularFilteredParamsExpression, getAngularFilteredParamsHelperBody, getDefaultContentType, getEnumImplementation, getFileInfo, getFullRoute, isBoolean, isObject, isSyntheticDefaultImportsAllow, jsDoc, kebab, pascal, sanitize, toObjectString, upath } from "@orval/core";
2
2
  //#region src/constants.ts
3
3
  const ANGULAR_HTTP_CLIENT_DEPENDENCIES = [
4
4
  {
@@ -139,6 +139,10 @@ const PRIMITIVE_TYPE_LOOKUP = {
139
139
  const isPrimitiveType = (t) => t != void 0 && Object.prototype.hasOwnProperty.call(PRIMITIVE_TYPE_LOOKUP, t);
140
140
  const isZodSchemaOutput = (output) => isObject(output.schemas) && output.schemas.type === "zod";
141
141
  const isDefined = (v) => v != void 0;
142
+ /**
143
+ * Maps a schema type name to its Zod output-type reference (`${typeName}Output`).
144
+ */
145
+ const getSchemaOutputTypeRef = (typeName) => `${typeName}Output`;
142
146
  const generateAngularTitle = (title) => {
143
147
  return `${pascal(sanitize(title))}Service`;
144
148
  };
@@ -255,7 +259,6 @@ function getDefaultSuccessType(successTypes, fallback) {
255
259
  const returnTypesRegistry = createReturnTypesRegistry();
256
260
  const hasSchemaImport = (imports, typeName) => typeName != void 0 && imports.some((imp) => imp.name === typeName);
257
261
  const getSchemaValueRef = (typeName) => typeName === "Error" ? "ErrorSchema" : typeName;
258
- const getSchemaOutputTypeRef$1 = (typeName) => typeName === "Error" ? "ErrorOutput" : `${typeName}Output`;
259
262
  const getContentTypeReturnType$1 = (contentType, value) => {
260
263
  if (!contentType) return value;
261
264
  if (contentType.includes("json") || contentType.includes("+json")) return value;
@@ -397,16 +400,16 @@ const generateHttpClientImplementation = ({ headers, queryParams, operationName,
397
400
  const hasSchema = hasSchemaImport(response.imports, dataType);
398
401
  const isZodOutput = isZodSchemaOutput(context.output);
399
402
  const shouldValidateResponse = override.angular.runtimeValidation && isZodOutput && !isPrimitive && hasSchema;
400
- const parsedDataType = shouldValidateResponse ? getSchemaOutputTypeRef$1(dataType) : dataType;
403
+ const parsedDataType = shouldValidateResponse ? getSchemaOutputTypeRef(dataType) : dataType;
401
404
  const getGeneratedResponseType = (value, contentType) => {
402
- if (override.angular.runtimeValidation && isZodOutput && !!contentType && (contentType.includes("json") || contentType.includes("+json")) && !isPrimitiveType(value) && hasSchemaImport(response.imports, value)) return getSchemaOutputTypeRef$1(value);
405
+ if (override.angular.runtimeValidation && isZodOutput && !!contentType && (contentType.includes("json") || contentType.includes("+json")) && !isPrimitiveType(value) && hasSchemaImport(response.imports, value)) return getSchemaOutputTypeRef(value);
403
406
  return getContentTypeReturnType$1(contentType, value);
404
407
  };
405
408
  const resultAliasType = mutator ? dataType : response.types.success.length <= 1 ? parsedDataType : [...new Set(response.types.success.map(({ value, contentType }) => getGeneratedResponseType(value, contentType)))].join(" | ") || parsedDataType;
406
409
  const schemaValueRef = shouldValidateResponse ? getSchemaValueRef(dataType) : dataType;
407
- const validationPipe = shouldValidateResponse ? `.pipe(map(data => ${schemaValueRef}.parse(data) as TData))` : "";
408
- const responseValidationPipe = shouldValidateResponse ? `.pipe(map(response => response.clone({ body: ${schemaValueRef}.parse(response.body) as TData })))` : "";
409
- const eventValidationPipe = shouldValidateResponse ? `.pipe(map(event => event instanceof AngularHttpResponse ? event.clone({ body: ${schemaValueRef}.parse(event.body) as TData }) : event))` : "";
410
+ const validationPipe = shouldValidateResponse ? `.pipe(map(data => ${schemaValueRef}.parse(data)))` : "";
411
+ const responseValidationPipe = shouldValidateResponse ? `.pipe(map(response => response.clone({ body: ${schemaValueRef}.parse(response.body) })))` : "";
412
+ const eventValidationPipe = shouldValidateResponse ? `.pipe(map(event => event instanceof AngularHttpResponse ? event.clone({ body: ${schemaValueRef}.parse(event.body) }) : event))` : "";
410
413
  returnTypesRegistry.set(operationName, `export type ${pascal(operationName)}ClientResult = NonNullable<${resultAliasType}>`);
411
414
  if (mutator) {
412
415
  const mutatorConfig = generateMutatorConfig({
@@ -470,7 +473,7 @@ const generateHttpClientImplementation = ({ headers, queryParams, operationName,
470
473
  const defaultContentType = hasMultipleContentTypes ? successTypes.find(({ contentType }) => !!contentType && (contentType.includes("json") || contentType.includes("+json")))?.contentType ?? getDefaultContentType(uniqueContentTypes) : uniqueContentTypes[0] ?? "application/json";
471
474
  const jsonSuccessValues = [...new Set(successTypes.filter(({ contentType }) => !!contentType && (contentType.includes("json") || contentType.includes("+json"))).map(({ value }) => value))];
472
475
  const jsonReturnType = jsonSuccessValues.length > 0 ? jsonSuccessValues.join(" | ") : "unknown";
473
- const parsedJsonReturnType = jsonSuccessValues.length === 1 && override.angular.runtimeValidation && isZodOutput && !isPrimitiveType(jsonSuccessValues[0]) && hasSchemaImport(response.imports, jsonSuccessValues[0]) ? getSchemaOutputTypeRef$1(jsonSuccessValues[0]) : jsonReturnType;
476
+ const parsedJsonReturnType = jsonSuccessValues.length === 1 && override.angular.runtimeValidation && isZodOutput && !isPrimitiveType(jsonSuccessValues[0]) && hasSchemaImport(response.imports, jsonSuccessValues[0]) ? getSchemaOutputTypeRef(jsonSuccessValues[0]) : jsonReturnType;
474
477
  let jsonValidationPipe = shouldValidateResponse ? `.pipe(map(data => ${schemaValueRef}.parse(data)))` : "";
475
478
  if (hasMultipleContentTypes && !shouldValidateResponse && override.angular.runtimeValidation && isZodOutput && jsonSuccessValues.length === 1) {
476
479
  const jsonType = jsonSuccessValues[0];
@@ -501,8 +504,9 @@ const generateHttpClientImplementation = ({ headers, queryParams, operationName,
501
504
  })
502
505
  } : void 0;
503
506
  const isModelType = dataType !== "Blob" && dataType !== "string" && dataType !== "ArrayBuffer";
507
+ const hasTDataGeneric = isModelType && !hasMultipleContentTypes && !shouldValidateResponse;
504
508
  let functionName = operationName;
505
- if (isModelType && !hasMultipleContentTypes) functionName += `<TData = ${parsedDataType}>`;
509
+ if (hasTDataGeneric) functionName += `<TData = ${parsedDataType}>`;
506
510
  let contentTypeOverloads = "";
507
511
  if (hasMultipleContentTypes && isRequestOptions) {
508
512
  const requiredPart = props.filter((p) => p.required && !p.default).map((p) => p.definition).join(",\n ");
@@ -520,9 +524,9 @@ const generateHttpClientImplementation = ({ headers, queryParams, operationName,
520
524
  optionalPart
521
525
  ].filter(Boolean).join(",\n ")}, options?: HttpClientOptions): ${refinedMultiImplementationReturnType};`;
522
526
  }
523
- const observeOverloads = isRequestOptions && !hasMultipleContentTypes ? `${functionName}(${propsDefinition} options?: HttpClientBodyOptions): Observable<${isModelType ? "TData" : parsedDataType}>;\n ${functionName}(${propsDefinition} options?: HttpClientEventOptions): Observable<HttpEvent<${isModelType ? "TData" : parsedDataType}>>;\n ${functionName}(${propsDefinition} options?: HttpClientResponseOptions): Observable<AngularHttpResponse<${isModelType ? "TData" : parsedDataType}>>;` : "";
527
+ const observeOverloads = isRequestOptions && !hasMultipleContentTypes ? `${functionName}(${propsDefinition} options?: HttpClientBodyOptions): Observable<${hasTDataGeneric ? "TData" : parsedDataType}>;\n ${functionName}(${propsDefinition} options?: HttpClientEventOptions): Observable<HttpEvent<${hasTDataGeneric ? "TData" : parsedDataType}>>;\n ${functionName}(${propsDefinition} options?: HttpClientResponseOptions): Observable<AngularHttpResponse<${hasTDataGeneric ? "TData" : parsedDataType}>>;` : "";
524
528
  const overloads = contentTypeOverloads || observeOverloads;
525
- const observableDataType = isModelType ? "TData" : parsedDataType;
529
+ const observableDataType = hasTDataGeneric ? "TData" : parsedDataType;
526
530
  const singleImplementationReturnType = isRequestOptions ? `Observable<${observableDataType} | HttpEvent<${observableDataType}> | AngularHttpResponse<${observableDataType}>>` : `Observable<${observableDataType}>`;
527
531
  if (hasMultipleContentTypes) {
528
532
  const requiredPart = props.filter((p) => p.required && !p.default).map((p) => p.implementation).join(",\n ");
@@ -572,15 +576,16 @@ const generateHttpClientImplementation = ({ headers, queryParams, operationName,
572
576
  }
573
577
  `;
574
578
  }
579
+ const httpTypeArg = hasTDataGeneric ? "<TData>" : shouldValidateResponse && isModelType ? `<${parsedDataType}>` : "";
575
580
  const observeImplementation = isRequestOptions ? `${paramsDeclaration}if (options?.observe === 'events') {
576
- return this.http.${verb}${isModelType ? "<TData>" : ""}(${observeOptions?.events ?? options})${eventValidationPipe};
581
+ return this.http.${verb}${httpTypeArg}(${observeOptions?.events ?? options})${eventValidationPipe};
577
582
  }
578
583
 
579
584
  if (options?.observe === 'response') {
580
- return this.http.${verb}${isModelType ? "<TData>" : ""}(${observeOptions?.response ?? options})${responseValidationPipe};
585
+ return this.http.${verb}${httpTypeArg}(${observeOptions?.response ?? options})${responseValidationPipe};
581
586
  }
582
587
 
583
- return this.http.${verb}${isModelType ? "<TData>" : ""}(${observeOptions?.body ?? options})${validationPipe};` : `return this.http.${verb}${isModelType ? "<TData>" : ""}(${options})${validationPipe};`;
588
+ return this.http.${verb}${httpTypeArg}(${observeOptions?.body ?? options})${validationPipe};` : `return this.http.${verb}${httpTypeArg}(${options})${validationPipe};`;
584
589
  return ` ${overloads}
585
590
  ${functionName}(
586
591
  ${toObjectString(props, "implementation")} ${isRequestOptions ? `options?: HttpClientObserveOptions` : ""}): ${singleImplementationReturnType} {${bodyForm}
@@ -621,7 +626,7 @@ const generateAngular = (verbOptions, options) => {
621
626
  imports: [...result.response.imports.map((imp) => imp.name === responseType ? {
622
627
  ...imp,
623
628
  values: true
624
- } : imp), { name: getSchemaOutputTypeRef$1(responseType) }]
629
+ } : imp), { name: getSchemaOutputTypeRef(responseType) }]
625
630
  }
626
631
  };
627
632
  const successTypes = result.response.types.success;
@@ -636,7 +641,7 @@ const generateAngular = (verbOptions, options) => {
636
641
  imports: [...result.response.imports.map((imp) => imp.name === jsonType ? {
637
642
  ...imp,
638
643
  values: true
639
- } : imp), { name: getSchemaOutputTypeRef$1(jsonType) }]
644
+ } : imp), { name: getSchemaOutputTypeRef(jsonType) }]
640
645
  }
641
646
  };
642
647
  }
@@ -706,6 +711,10 @@ const getHttpResourceOverride = (verbOption, output) => {
706
711
  const resourceReturnTypesRegistry = createReturnTypesRegistry();
707
712
  /** @internal Exported for testing only */
708
713
  const routeRegistry = createRouteRegistry();
714
+ const getRelevantVerbOptions = (verbOptions, tag) => tag ? Object.values(verbOptions).filter((verbOption) => verbOption.tags.some((currentTag) => camel(currentTag) === camel(tag))) : Object.values(verbOptions);
715
+ const getVerbOptionsRecord = (verbOptions) => Object.fromEntries(verbOptions.map((verbOption) => [verbOption.operationId, verbOption]));
716
+ const getPrimaryTag = (verbOption) => kebab(verbOption.tags[0] ?? "default");
717
+ const hasRetrievalOperations = (verbOptions) => Object.values(verbOptions).some((verbOption) => isRetrievalVerb(verbOption.verb, verbOption.operationName, getClientOverride(verbOption)));
709
718
  const getHeader = (option, info) => {
710
719
  if (!option || !info) return "";
711
720
  const header = option(info);
@@ -872,7 +881,6 @@ const buildResourceRequest = ({ verb, body, headers, queryParams, paramsSerializ
872
881
  isUrlOnly
873
882
  };
874
883
  };
875
- const getSchemaOutputTypeRef = (typeName) => typeName === "Error" ? "ErrorOutput" : `${typeName}Output`;
876
884
  const getHttpResourceResponseImports = (response) => {
877
885
  const successDefinition = response.definition.success;
878
886
  if (!successDefinition) return [];
@@ -1001,26 +1009,22 @@ const buildHttpResourceFunction = (verbOption, route, output) => {
1001
1009
  const optionalPart = optionalProps.map((prop) => prop.implementation).join(",\n ");
1002
1010
  const getBranchReturnType = (type) => getHttpResourceGeneratedResponseType(type.value, type.contentType, responseSchemaImports, output);
1003
1011
  const unionReturnType = [...new Set(successTypes.filter((type) => type.contentType).map((type) => getBranchReturnType(type)))].join(" | ");
1012
+ const getBranchRawType = (type) => getHttpResourceRawType(getHttpResourceFactory(response, type.contentType, type.value));
1013
+ const implementationOptionsType = [...new Set(successTypes.filter((type) => type.contentType).map((type) => buildBranchOptionsType(getBranchReturnType(type), getBranchRawType(type), omitParse)))].join(" | ");
1004
1014
  const branchOverloads = successTypes.filter((type) => type.contentType).map((type) => {
1005
1015
  const returnType = getBranchReturnType(type);
1006
1016
  return `export function ${resourceName}(${[
1007
1017
  requiredPart,
1008
1018
  `accept: '${type.contentType}'`,
1009
1019
  optionalPart,
1010
- `options?: ${buildBranchOptionsType(unionReturnType, "unknown", omitParse)}`
1020
+ `options?: ${buildBranchOptionsType(returnType, getBranchRawType(type), omitParse)}`
1011
1021
  ].filter(Boolean).join(",\n ")}): HttpResourceRef<${returnType} | undefined>;`;
1012
1022
  }).join("\n");
1013
- const implementationArgs = [
1014
- requiredPart,
1015
- `accept?: ${acceptTypeName}`,
1016
- optionalPart,
1017
- `options?: ${buildBranchOptionsType(unionReturnType, "unknown", omitParse)}`
1018
- ].filter(Boolean).join(",\n ");
1019
1023
  const implementationArgsWithDefault = [
1020
1024
  requiredPart,
1021
1025
  `accept: ${acceptTypeName} = '${defaultContentType}'`,
1022
1026
  optionalPart,
1023
- `options?: ${buildBranchOptionsType(unionReturnType, "unknown", omitParse)}`
1027
+ `options?: ${implementationOptionsType}`
1024
1028
  ].filter(Boolean).join(",\n ");
1025
1029
  const getBranchOptions = (type) => {
1026
1030
  if (!type) return `options as ${buildBranchOptionsType(unionReturnType, "unknown", omitParse)}`;
@@ -1031,24 +1035,33 @@ const buildHttpResourceFunction = (verbOption, route, output) => {
1031
1035
  const textType = successTypes.find((type) => isResponseText(type.contentType, type.value));
1032
1036
  const arrayBufferType = successTypes.find((type) => isResponseArrayBuffer(type.contentType));
1033
1037
  const blobType = successTypes.find((type) => isResponseBlob(type.contentType, response.isBlob));
1034
- const fallbackReturn = blobType ? `return httpResource.blob<Blob>(() => ({
1035
- ...normalizedRequest,
1036
- headers,
1037
- }), ${getBranchOptions(blobType)});` : textType ? `return httpResource.text<string>(() => ({
1038
+ const fallbackType = successTypes.find((type) => type.contentType === defaultContentType) ?? jsonType ?? textType ?? arrayBufferType ?? blobType;
1039
+ const buildFallbackReturn = (type) => {
1040
+ const factory = getHttpResourceFactory(response, type.contentType, type.value);
1041
+ return `return ${factory}<${factory === "httpResource" ? getBranchReturnType(type) : getHttpResourceRawType(factory)}>(() => ({
1038
1042
  ...normalizedRequest,
1039
1043
  headers,
1040
- }), ${getBranchOptions(textType)});` : `return httpResource<${jsonType ? getBranchReturnType(jsonType) : parsedDataType}>(() => ({
1044
+ }), ${getBranchOptions(type)});`;
1045
+ };
1046
+ const fallbackReturn = fallbackType ? buildFallbackReturn(fallbackType) : `return httpResource<${parsedDataType}>(() => ({
1041
1047
  ...normalizedRequest,
1042
1048
  headers,
1043
- }), ${getBranchOptions(jsonType)});`;
1049
+ }), ${getBranchOptions()});`;
1050
+ const defaultOverloadOptionsType = fallbackType ? buildBranchOptionsType(getBranchReturnType(fallbackType), getBranchRawType(fallbackType), omitParse) : implementationOptionsType;
1051
+ const defaultOverloadReturnType = fallbackType ? getBranchReturnType(fallbackType) : unionReturnType;
1052
+ const defaultOverloadArgs = [
1053
+ requiredPart,
1054
+ optionalPart,
1055
+ `options?: ${defaultOverloadOptionsType}`
1056
+ ].filter(Boolean).join(",\n ");
1044
1057
  const normalizeRequest = isUrlOnly ? `const normalizedRequest: HttpResourceRequest = { url: request };` : `const normalizedRequest: HttpResourceRequest = request;`;
1045
1058
  return `/**
1046
1059
  * @experimental httpResource is experimental (Angular v19.2+)
1047
1060
  */
1048
1061
  ${branchOverloads}
1049
1062
  export function ${resourceName}(
1050
- ${implementationArgs}
1051
- ): HttpResourceRef<${unionReturnType} | undefined>;
1063
+ ${defaultOverloadArgs}
1064
+ ): HttpResourceRef<${defaultOverloadReturnType} | undefined>;
1052
1065
  export function ${resourceName}(
1053
1066
  ${implementationArgsWithDefault}
1054
1067
  ): HttpResourceRef<${unionReturnType} | undefined> {
@@ -1175,8 +1188,8 @@ export function toResourceState<T>(ref: HttpResourceRef<T>): ResourceState<T> {
1175
1188
  const generateHttpResourceHeader = ({ title, isRequestOptions, isMutator, isGlobalMutator, provideIn, output, verbOptions, tag }) => {
1176
1189
  resetHttpClientReturnTypes();
1177
1190
  resourceReturnTypesRegistry.reset();
1178
- const relevantVerbs = tag ? Object.values(verbOptions).filter((verbOption) => verbOption.tags.some((t) => camel(t) === camel(tag))) : Object.values(verbOptions);
1179
- const retrievals = relevantVerbs.filter((verbOption) => isRetrievalVerb(verbOption.verb, verbOption.operationName, getClientOverride(verbOption)));
1191
+ const relevantVerbOptions = getRelevantVerbOptions(verbOptions, tag);
1192
+ const retrievals = relevantVerbOptions.filter((verbOption) => isRetrievalVerb(verbOption.verb, verbOption.operationName, getClientOverride(verbOption)));
1180
1193
  const hasResourceQueryParams = retrievals.some((verbOption) => !!verbOption.queryParams);
1181
1194
  const filterParamsHelper = hasResourceQueryParams ? `\n${getAngularFilteredParamsHelperBody()}\n` : "";
1182
1195
  const acceptHelpers = buildAcceptHelpers(retrievals, output);
@@ -1184,7 +1197,7 @@ const generateHttpResourceHeader = ({ title, isRequestOptions, isMutator, isGlob
1184
1197
  return buildHttpResourceFunction(verbOption, routeRegistry.get(verbOption.operationName, verbOption.route), output);
1185
1198
  }).join("\n");
1186
1199
  const resourceTypes = resourceReturnTypesRegistry.getFooter(retrievals.map((verbOption) => verbOption.operationName));
1187
- const mutations = relevantVerbs.filter((verbOption) => isMutationVerb(verbOption.verb, verbOption.operationName, getClientOverride(verbOption)));
1200
+ const mutations = relevantVerbOptions.filter((verbOption) => isMutationVerb(verbOption.verb, verbOption.operationName, getClientOverride(verbOption)));
1188
1201
  const hasMutationQueryParams = mutations.some((verbOption) => !!verbOption.queryParams);
1189
1202
  const mutationImplementation = mutations.map((verbOption) => {
1190
1203
  return generateHttpClientImplementation(verbOption, {
@@ -1251,6 +1264,13 @@ const buildHttpResourceFile = (verbOptions, output, context) => {
1251
1264
  const buildSchemaImportDependencies = (output, imports, relativeSchemasPath) => {
1252
1265
  const isZod = isZodSchemaOutput(output);
1253
1266
  const uniqueImports = [...new Map(imports.map((imp) => [imp.name, imp])).values()];
1267
+ if (!output.schemas) return [{
1268
+ exports: isZod ? uniqueImports.map((imp) => ({
1269
+ ...imp,
1270
+ values: true
1271
+ })) : uniqueImports,
1272
+ dependency: relativeSchemasPath
1273
+ }];
1254
1274
  if (!output.indexFiles) return [...uniqueImports].map((imp) => {
1255
1275
  const name = conventionName(imp.schemaName ?? imp.name, output.namingConvention);
1256
1276
  const suffix = isZod ? ".zod" : "";
@@ -1275,25 +1295,29 @@ const buildSchemaImportDependencies = (output, imports, relativeSchemasPath) =>
1275
1295
  dependency: relativeSchemasPath
1276
1296
  }];
1277
1297
  };
1278
- /**
1279
- * Generates the extra sibling resource file used by Angular `both` mode.
1280
- *
1281
- * @remarks
1282
- * The main generated file keeps the `HttpClient` service class while retrieval
1283
- * resources are emitted into `*.resource.ts` so consumers can opt into both
1284
- * access patterns without mixing the generated surfaces.
1285
- *
1286
- * @returns A single extra file descriptor representing the generated resource file.
1287
- */
1288
- const generateHttpResourceExtraFiles = (verbOptions, output, context) => {
1289
- const { extension, dirname, filename } = getFileInfo(output.target);
1290
- const outputPath = upath.join(dirname, `${filename}.resource${extension}`);
1291
- const header = getHeader(output.override.header, context.spec.info);
1292
- const implementation = buildHttpResourceFile(verbOptions, output, context);
1298
+ const getHttpResourceExtraFilePath = (output, tag) => {
1299
+ const { extension, dirname, filename } = getFileInfo(output.target, { extension: output.fileExtension });
1300
+ switch (output.mode) {
1301
+ case OutputMode.TAGS: {
1302
+ const normalizedTag = kebab(tag ?? "default");
1303
+ return upath.joinSafe(dirname, `${normalizedTag}.resource${extension}`);
1304
+ }
1305
+ case OutputMode.TAGS_SPLIT: {
1306
+ const normalizedTag = kebab(tag ?? "default");
1307
+ return upath.joinSafe(dirname, normalizedTag, `${normalizedTag}.resource${extension}`);
1308
+ }
1309
+ default: return upath.joinSafe(dirname, `${filename}.resource${extension}`);
1310
+ }
1311
+ };
1312
+ const getHttpResourceRelativeSchemasPath = (output, outputPath) => {
1293
1313
  const schemasPath = typeof output.schemas === "string" ? output.schemas : output.schemas?.path;
1294
- const basePath = schemasPath ? getFileInfo(schemasPath).dirname : void 0;
1295
- const relativeSchemasPath = basePath ? output.indexFiles ? upath.relativeSafe(dirname, basePath) : upath.relativeSafe(dirname, basePath) : `./${filename}.schemas`;
1296
- const schemaImports = buildSchemaImportDependencies(output, Object.values(verbOptions).filter((verbOption) => isRetrievalVerb(verbOption.verb, verbOption.operationName, getClientOverride(verbOption))).flatMap((verbOption) => getHttpResourceVerbImports(verbOption, output)), relativeSchemasPath);
1314
+ if (schemasPath) return upath.getRelativeImportPath(outputPath, getFileInfo(schemasPath).dirname);
1315
+ const { dirname, filename, extension } = getFileInfo(output.target, { extension: output.fileExtension });
1316
+ return upath.getRelativeImportPath(outputPath, upath.joinSafe(dirname, `${filename}.schemas${extension}`), output.fileExtension !== ".ts");
1317
+ };
1318
+ const buildHttpResourceExtraFile = (verbOptions, outputPath, output, context, header) => {
1319
+ const implementation = buildHttpResourceFile(verbOptions, output, context);
1320
+ const schemaImports = buildSchemaImportDependencies(output, Object.values(verbOptions).filter((verbOption) => isRetrievalVerb(verbOption.verb, verbOption.operationName, getClientOverride(verbOption))).flatMap((verbOption) => getHttpResourceVerbImports(verbOption, output)), getHttpResourceRelativeSchemasPath(output, outputPath));
1297
1321
  const dependencies = getAngularHttpResourceOnlyDependencies(false, false);
1298
1322
  const importImplementation = generateDependencyImports(implementation, [...schemaImports, ...dependencies], context.projectName, !!output.schemas, isSyntheticDefaultImportsAllow(output.tsconfig));
1299
1323
  const mutators = Object.values(verbOptions).filter((verbOption) => isRetrievalVerb(verbOption.verb, verbOption.operationName, getClientOverride(verbOption))).flatMap((verbOption) => {
@@ -1304,11 +1328,39 @@ const generateHttpResourceExtraFiles = (verbOptions, output, context) => {
1304
1328
  verbOption.paramsSerializer
1305
1329
  ].filter((value) => value !== void 0);
1306
1330
  });
1307
- const content = `${header}${importImplementation}${mutators.length > 0 ? generateMutatorImports({ mutators }) : ""}${implementation}`;
1308
- return Promise.resolve([{
1309
- content,
1331
+ return {
1332
+ content: `${header}${importImplementation}${mutators.length > 0 ? generateMutatorImports({
1333
+ mutators,
1334
+ oneMore: output.mode === OutputMode.TAGS_SPLIT
1335
+ }) : ""}${implementation}`,
1310
1336
  path: outputPath
1311
- }]);
1337
+ };
1338
+ };
1339
+ /**
1340
+ * Generates the extra sibling resource files used by Angular `both` mode.
1341
+ *
1342
+ * @remarks
1343
+ * The main generated file keeps the `HttpClient` service class while retrieval
1344
+ * resources are emitted into `*.resource.ts` so consumers can opt into both
1345
+ * access patterns without mixing the generated surfaces. In tag-based output
1346
+ * modes this emits one sibling resource file per generated tag file.
1347
+ *
1348
+ * @returns One or more extra file descriptors representing generated resource files.
1349
+ */
1350
+ const generateHttpResourceExtraFiles = (verbOptions, output, context) => {
1351
+ const header = getHeader(output.override.header, context.spec.info);
1352
+ if (!hasRetrievalOperations(verbOptions)) return Promise.resolve([]);
1353
+ if (output.mode === OutputMode.TAGS || output.mode === OutputMode.TAGS_SPLIT) {
1354
+ const groupedVerbOptions = /* @__PURE__ */ new Map();
1355
+ for (const verbOption of Object.values(verbOptions)) {
1356
+ const tag = getPrimaryTag(verbOption);
1357
+ const currentGroup = groupedVerbOptions.get(tag) ?? {};
1358
+ currentGroup[verbOption.operationId] = verbOption;
1359
+ groupedVerbOptions.set(tag, currentGroup);
1360
+ }
1361
+ return Promise.resolve([...groupedVerbOptions.entries()].filter(([, tagVerbOptions]) => hasRetrievalOperations(tagVerbOptions)).map(([tag, tagVerbOptions]) => buildHttpResourceExtraFile(tagVerbOptions, getHttpResourceExtraFilePath(output, tag), output, context, header)));
1362
+ }
1363
+ return Promise.resolve([buildHttpResourceExtraFile(getVerbOptionsRecord(getRelevantVerbOptions(verbOptions)), getHttpResourceExtraFilePath(output), output, context, header)]);
1312
1364
  };
1313
1365
  //#endregion
1314
1366
  //#region src/index.ts
@@ -1338,6 +1390,6 @@ const builder = () => (options) => {
1338
1390
  }
1339
1391
  };
1340
1392
  //#endregion
1341
- export { ANGULAR_HTTP_CLIENT_DEPENDENCIES, ANGULAR_HTTP_RESOURCE_DEPENDENCIES, HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE, HTTP_CLIENT_OPTIONS_TEMPLATE, PRIMITIVE_TYPES, THIRD_PARAMETER_TEMPLATE, buildAcceptHelpers, buildServiceClassOpen, builder, builder as default, createReturnTypesRegistry, createRouteRegistry, generateAngular, generateAngularFooter, generateAngularHeader, generateAngularTitle, generateHttpClientImplementation, generateHttpResourceClient, generateHttpResourceExtraFiles, generateHttpResourceFooter, generateHttpResourceHeader, getAcceptHelperName, getAngularDependencies, getAngularHttpResourceDependencies, getAngularHttpResourceOnlyDependencies, getDefaultSuccessType, getHttpClientReturnTypes, getUniqueContentTypes, isDefined, isMutationVerb, isPrimitiveType, isRetrievalVerb, isZodSchemaOutput, resetHttpClientReturnTypes, routeRegistry };
1393
+ export { ANGULAR_HTTP_CLIENT_DEPENDENCIES, ANGULAR_HTTP_RESOURCE_DEPENDENCIES, HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE, HTTP_CLIENT_OPTIONS_TEMPLATE, PRIMITIVE_TYPES, THIRD_PARAMETER_TEMPLATE, buildAcceptHelpers, buildServiceClassOpen, builder, builder as default, createReturnTypesRegistry, createRouteRegistry, generateAngular, generateAngularFooter, generateAngularHeader, generateAngularTitle, generateHttpClientImplementation, generateHttpResourceClient, generateHttpResourceExtraFiles, generateHttpResourceFooter, generateHttpResourceHeader, getAcceptHelperName, getAngularDependencies, getAngularHttpResourceDependencies, getAngularHttpResourceOnlyDependencies, getDefaultSuccessType, getHttpClientReturnTypes, getSchemaOutputTypeRef, getUniqueContentTypes, isDefined, isMutationVerb, isPrimitiveType, isRetrievalVerb, isZodSchemaOutput, resetHttpClientReturnTypes, routeRegistry };
1342
1394
 
1343
1395
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["getSchemaOutputTypeRef","getContentTypeReturnType"],"sources":["../src/constants.ts","../src/types.ts","../src/utils.ts","../src/http-client.ts","../src/http-resource.ts","../src/index.ts"],"sourcesContent":["import type { GeneratorDependency } from '@orval/core';\n\nexport const ANGULAR_HTTP_CLIENT_DEPENDENCIES = [\n {\n exports: [\n { name: 'HttpClient', values: true },\n { name: 'HttpHeaders', values: true },\n { name: 'HttpParams' },\n { name: 'HttpContext' },\n { name: 'HttpResponse', alias: 'AngularHttpResponse', values: true }, // alias to prevent naming conflict with msw\n { name: 'HttpEvent' },\n ],\n dependency: '@angular/common/http',\n },\n {\n exports: [\n { name: 'Injectable', values: true },\n { name: 'inject', values: true },\n ],\n dependency: '@angular/core',\n },\n {\n exports: [{ name: 'Observable', values: true }],\n dependency: 'rxjs',\n },\n] as const satisfies readonly GeneratorDependency[];\n\nexport const ANGULAR_HTTP_RESOURCE_DEPENDENCIES = [\n {\n exports: [\n { name: 'httpResource', values: true },\n { name: 'HttpResourceOptions' },\n { name: 'HttpResourceRef' },\n { name: 'HttpResourceRequest' },\n { name: 'HttpHeaders', values: true },\n { name: 'HttpParams' },\n { name: 'HttpContext' },\n ],\n dependency: '@angular/common/http',\n },\n {\n exports: [{ name: 'Signal' }, { name: 'ResourceStatus' }],\n dependency: '@angular/core',\n },\n] as const satisfies readonly GeneratorDependency[];\n","/**\n * Code template for the `HttpClientOptions` interface emitted into generated files.\n *\n * This is NOT an import of Angular's type — Angular's HttpClient methods accept\n * inline option objects, not a single unified interface. Orval generates this\n * convenience wrapper so users have a single referenceable type.\n *\n * Properties sourced from Angular HttpClient public API (angular/angular\n * packages/common/http/src/client.ts).\n */\nexport const HTTP_CLIENT_OPTIONS_TEMPLATE = `interface HttpClientOptions {\n readonly headers?: HttpHeaders | Record<string, string | string[]>;\n readonly context?: HttpContext;\n readonly params?:\n | HttpParams\n | Record<string, string | number | boolean | Array<string | number | boolean>>;\n readonly reportProgress?: boolean;\n readonly withCredentials?: boolean;\n readonly credentials?: RequestCredentials;\n readonly keepalive?: boolean;\n readonly priority?: RequestPriority;\n readonly cache?: RequestCache;\n readonly mode?: RequestMode;\n readonly redirect?: RequestRedirect;\n readonly referrer?: string;\n readonly integrity?: string;\n readonly referrerPolicy?: ReferrerPolicy;\n readonly transferCache?: {includeHeaders?: string[]} | boolean;\n readonly timeout?: number;\n}`;\n\n/**\n * Code templates for reusable observe option helpers emitted into generated files.\n */\nexport const HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE = `type HttpClientBodyOptions = HttpClientOptions & {\n readonly observe?: 'body';\n};\n\ntype HttpClientEventOptions = HttpClientOptions & {\n readonly observe: 'events';\n};\n\ntype HttpClientResponseOptions = HttpClientOptions & {\n readonly observe: 'response';\n};\n\ntype HttpClientObserveOptions = HttpClientOptions & {\n readonly observe?: 'body' | 'events' | 'response';\n};`;\n\n/**\n * Code template for the `ThirdParameter` utility type used with custom mutators.\n */\nexport const THIRD_PARAMETER_TEMPLATE = `// eslint-disable-next-line\n type ThirdParameter<T extends (...args: never[]) => unknown> = T extends (\n config: unknown,\n httpClient: unknown,\n args: infer P,\n) => unknown\n ? P\n : never;`;\n","import {\n getAngularFilteredParamsHelperBody,\n getDefaultContentType,\n isBoolean,\n isObject,\n type NormalizedOutputOptions,\n pascal,\n type ResReqTypesValue,\n sanitize,\n type Verbs,\n} from '@orval/core';\n\nimport {\n HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE,\n HTTP_CLIENT_OPTIONS_TEMPLATE,\n THIRD_PARAMETER_TEMPLATE,\n} from './types';\n\nexport type ClientOverride = 'httpClient' | 'httpResource' | 'both';\n\nconst PRIMITIVE_TYPE_VALUES = [\n 'string',\n 'number',\n 'boolean',\n 'void',\n 'unknown',\n] as const;\n\nexport type PrimitiveType = (typeof PRIMITIVE_TYPE_VALUES)[number];\n\nexport const PRIMITIVE_TYPES = new Set(PRIMITIVE_TYPE_VALUES);\n\nconst PRIMITIVE_TYPE_LOOKUP = {\n string: true,\n number: true,\n boolean: true,\n void: true,\n unknown: true,\n} as const satisfies Record<PrimitiveType, true>;\n\nexport const isPrimitiveType = (t: string | undefined): t is PrimitiveType =>\n t != undefined &&\n Object.prototype.hasOwnProperty.call(PRIMITIVE_TYPE_LOOKUP, t);\n\nexport const isZodSchemaOutput = (output: NormalizedOutputOptions): boolean =>\n isObject(output.schemas) && output.schemas.type === 'zod';\n\nexport const isDefined = <T>(v: T | null | undefined): v is T => v != undefined;\n\nexport const generateAngularTitle = (title: string) => {\n const sanTitle = sanitize(title);\n return `${pascal(sanTitle)}Service`;\n};\n\n/**\n * Builds the opening of an @Injectable Angular service class.\n * Shared between httpClient-only mode and the mutation section of httpResource mode.\n */\nexport const buildServiceClassOpen = ({\n title,\n isRequestOptions,\n isMutator,\n isGlobalMutator,\n provideIn,\n hasQueryParams,\n}: {\n title: string;\n isRequestOptions: boolean;\n isMutator: boolean;\n isGlobalMutator: boolean;\n provideIn: string | boolean | undefined;\n hasQueryParams: boolean;\n}): string => {\n const provideInValue = provideIn\n ? `{ providedIn: '${isBoolean(provideIn) ? 'root' : provideIn}' }`\n : '';\n\n return `\n${\n isRequestOptions && !isGlobalMutator\n ? `${HTTP_CLIENT_OPTIONS_TEMPLATE}\n\n${HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE}\n\n${hasQueryParams ? getAngularFilteredParamsHelperBody() : ''}`\n : ''\n}\n\n${isRequestOptions && isMutator ? THIRD_PARAMETER_TEMPLATE : ''}\n\n@Injectable(${provideInValue})\nexport class ${title} {\n private readonly http = inject(HttpClient);\n`;\n};\n\n/**\n * Registry that maps operationName → full route (with baseUrl).\n *\n * Populated during client builder calls (which receive the full route via\n * GeneratorOptions.route) and read during header/footer builder calls\n * (which only receive verbOptions without routes).\n *\n * This avoids monkey-patching verbOptions with a non-standard `fullRoute` property.\n */\nexport const createRouteRegistry = () => {\n const routes = new Map<string, string>();\n\n return {\n reset() {\n routes.clear();\n },\n set(operationName: string, route: string) {\n routes.set(operationName, route);\n },\n get(operationName: string, fallback: string): string {\n return routes.get(operationName) ?? fallback;\n },\n };\n};\n\nexport const createReturnTypesRegistry = () => {\n const returnTypesToWrite = new Map<string, string>();\n\n return {\n reset() {\n returnTypesToWrite.clear();\n },\n set(operationName: string, typeDefinition: string) {\n returnTypesToWrite.set(operationName, typeDefinition);\n },\n getFooter(operationNames: string[]) {\n const collected: string[] = [];\n for (const operationName of operationNames) {\n const value = returnTypesToWrite.get(operationName);\n if (value) {\n collected.push(value);\n }\n }\n return collected.join('\\n');\n },\n };\n};\n\n/**\n * Determines whether an operation should be generated as an `httpResource()`\n * (retrieval) or as an `HttpClient` method in a service class (mutation).\n *\n * Resolution order:\n * 1. **Per-operation override** — `override.operations.<operationId>.angular.client`\n * in the orval config. `httpResource` forces retrieval, `httpClient` forces mutation.\n * 2. **HTTP verb** — absent a per-operation override, `GET` is treated as a retrieval.\n * 3. **Name heuristic** — For `POST`, if the operationName starts with a\n * retrieval-like prefix (search, list, find, query, get, fetch, lookup)\n * it is treated as a retrieval. This handles common patterns like\n * `POST /search` or `POST /graphql` with query-style operation names.\n *\n * If the heuristic misclassifies an operation, users can override it\n * per-operation in their orval config:\n *\n * ```ts\n * override: {\n * operations: {\n * myPostSearch: { angular: { retrievalClient: 'httpResource' } },\n * getOrCreateUser: { angular: { retrievalClient: 'httpClient' } },\n * }\n * }\n * ```\n */\nexport function isRetrievalVerb(\n verb: Verbs,\n operationName?: string,\n clientOverride?: ClientOverride,\n): boolean {\n // Per-operation override takes precedence\n if (clientOverride === 'httpResource') return true;\n if (clientOverride === 'httpClient') return false;\n\n // Absent a per-operation override, GET is treated as a retrieval\n if (verb === 'get') return true;\n\n // POST with a retrieval-like operation name\n if (verb === 'post' && operationName) {\n const lower = operationName.toLowerCase();\n return /^(search|list|find|query|get|fetch|lookup|filter)/.test(lower);\n }\n return false;\n}\n\nexport function isMutationVerb(\n verb: Verbs,\n operationName?: string,\n clientOverride?: ClientOverride,\n): boolean {\n return !isRetrievalVerb(verb, operationName, clientOverride);\n}\n\nexport function getDefaultSuccessType(\n successTypes: ResReqTypesValue[],\n fallback: string,\n) {\n const uniqueContentTypes = [\n ...new Set(successTypes.map((t) => t.contentType).filter(Boolean)),\n ];\n const jsonContentType = uniqueContentTypes.find((contentType) =>\n contentType.includes('json'),\n );\n const defaultContentType =\n jsonContentType ??\n (uniqueContentTypes.length > 1\n ? getDefaultContentType(uniqueContentTypes)\n : (uniqueContentTypes[0] ?? 'application/json'));\n const defaultType = successTypes.find(\n (t) => t.contentType === defaultContentType,\n );\n\n return {\n contentType: defaultContentType,\n value: defaultType?.value ?? fallback,\n };\n}\n","import {\n camel,\n type ClientBuilder,\n type ClientDependenciesBuilder,\n type ClientFooterBuilder,\n type ClientHeaderBuilder,\n type ContextSpec,\n generateFormDataAndUrlEncodedFunction,\n generateMutatorConfig,\n generateMutatorRequestOptions,\n generateOptions,\n generateVerbImports,\n type GeneratorVerbOptions,\n getAngularFilteredParamsCallExpression,\n getAngularFilteredParamsExpression,\n getAngularFilteredParamsHelperBody,\n getDefaultContentType,\n getEnumImplementation,\n isBoolean,\n pascal,\n toObjectString,\n} from '@orval/core';\n\nimport { ANGULAR_HTTP_CLIENT_DEPENDENCIES } from './constants';\nimport {\n HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE,\n HTTP_CLIENT_OPTIONS_TEMPLATE,\n THIRD_PARAMETER_TEMPLATE,\n} from './types';\nimport {\n createReturnTypesRegistry,\n isPrimitiveType,\n isZodSchemaOutput,\n} from './utils';\n\n/**\n * Narrowed context for `generateHttpClientImplementation`.\n *\n * The implementation only reads `context.output`, so callers don't need\n * to supply a full `ContextSpec` (which also requires `target`, `workspace`,\n * `spec`, etc.).\n *\n * @remarks\n * This keeps the call sites lightweight when `http-resource.ts` delegates\n * mutation generation back to the shared `HttpClient` implementation builder.\n */\nexport interface HttpClientGeneratorContext {\n route: string;\n context: Pick<ContextSpec, 'output'>;\n}\n\n// NOTE: Module-level singleton — reset() is called at the start of each\n// header builder invocation (generateAngularHeader). Must stay in sync with\n// the generation lifecycle.\nconst returnTypesRegistry = createReturnTypesRegistry();\n\nconst hasSchemaImport = (\n imports: readonly { name: string }[],\n typeName: string | undefined,\n): boolean =>\n typeName != undefined && imports.some((imp) => imp.name === typeName);\n\nconst getSchemaValueRef = (typeName: string): string =>\n typeName === 'Error' ? 'ErrorSchema' : typeName;\n\nconst getSchemaOutputTypeRef = (typeName: string): string =>\n typeName === 'Error' ? 'ErrorOutput' : `${typeName}Output`;\n\nconst getContentTypeReturnType = (\n contentType: string | undefined,\n value: string,\n): string => {\n if (!contentType) return value;\n if (contentType.includes('json') || contentType.includes('+json')) {\n return value;\n }\n if (contentType.startsWith('text/') || contentType.includes('xml')) {\n return 'string';\n }\n return 'Blob';\n};\n\n/**\n * Returns the dependency list required by the Angular `HttpClient` generator.\n *\n * These imports are consumed by Orval's generic dependency-import emitter when\n * composing the generated Angular client file.\n *\n * @returns The Angular `HttpClient` dependency descriptors used during import generation.\n */\nexport const getAngularDependencies: ClientDependenciesBuilder = () => [\n ...ANGULAR_HTTP_CLIENT_DEPENDENCIES,\n];\n\n/**\n * Builds the generated TypeScript helper name used for multi-content-type\n * `Accept` header unions.\n *\n * Example: `listPets` -> `ListPetsAccept`.\n *\n * @returns A PascalCase helper type/const name for the operation's `Accept` values.\n */\nexport const getAcceptHelperName = (operationName: string) =>\n `${pascal(operationName)}Accept`;\n\n/**\n * Collects the distinct successful response content types for a single\n * operation.\n *\n * The Angular generators use this to decide whether they need `Accept`\n * overloads or content-type-specific branching logic.\n *\n * @returns A de-duplicated list of response content types, excluding empty entries.\n */\nexport const getUniqueContentTypes = (\n successTypes: GeneratorVerbOptions['response']['types']['success'],\n) => [...new Set(successTypes.map((t) => t.contentType).filter(Boolean))];\n\nconst toAcceptHelperKey = (contentType: string): string =>\n contentType\n .replaceAll(/[^A-Za-z0-9]+/g, '_')\n .replaceAll(/^_+|_+$/g, '')\n .toLowerCase();\n\nconst buildAcceptHelper = (\n operationName: string,\n contentTypes: string[],\n output: ContextSpec['output'],\n): string => {\n const acceptHelperName = getAcceptHelperName(operationName);\n const unionValue = contentTypes\n .map((contentType) => `'${contentType}'`)\n .join(' | ');\n const names = contentTypes.map((contentType) =>\n toAcceptHelperKey(contentType),\n );\n const implementation = getEnumImplementation(\n unionValue,\n names,\n undefined,\n output.override.namingConvention.enum,\n );\n\n return `export type ${acceptHelperName} = typeof ${acceptHelperName}[keyof typeof ${acceptHelperName}];\n\nexport const ${acceptHelperName} = {\n${implementation}} as const;`;\n};\n\n/**\n * Builds the shared `Accept` helper declarations for all operations in the\n * current Angular generation scope.\n *\n * @remarks\n * Helpers are emitted only for operations with more than one successful\n * response content type.\n *\n * @returns Concatenated type/const declarations or an empty string when no helpers are needed.\n */\nexport const buildAcceptHelpers = (\n verbOptions: readonly GeneratorVerbOptions[],\n output: ContextSpec['output'],\n): string =>\n verbOptions\n .flatMap((verbOption) => {\n const contentTypes = getUniqueContentTypes(\n verbOption.response.types.success,\n );\n if (contentTypes.length <= 1) return [];\n\n return [\n buildAcceptHelper(verbOption.operationName, contentTypes, output),\n ];\n })\n .join('\\n\\n');\n\n/**\n * Generates the static header section for Angular `HttpClient` output.\n *\n * Depending on the current generation options this may include:\n * - reusable request option helper types\n * - filtered query-param helper utilities\n * - mutator support types\n * - `Accept` helper unions/constants for multi-content-type operations\n * - the `@Injectable()` service class shell\n *\n * @returns A string containing the prelude and service class opening for the generated file.\n */\nexport const generateAngularHeader: ClientHeaderBuilder = ({\n title,\n isRequestOptions,\n isMutator,\n isGlobalMutator,\n provideIn,\n verbOptions,\n tag,\n output,\n}) => {\n returnTypesRegistry.reset();\n\n const relevantVerbs = tag\n ? Object.values(verbOptions).filter((v) =>\n v.tags.some((t) => camel(t) === camel(tag)),\n )\n : Object.values(verbOptions);\n const hasQueryParams = relevantVerbs.some((v) => v.queryParams);\n const acceptHelpers = buildAcceptHelpers(relevantVerbs, output);\n\n return `\n${\n isRequestOptions && !isGlobalMutator\n ? `${HTTP_CLIENT_OPTIONS_TEMPLATE}\n\n${HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE}\n\n${hasQueryParams ? getAngularFilteredParamsHelperBody() : ''}`\n : ''\n}\n\n${isRequestOptions && isMutator ? THIRD_PARAMETER_TEMPLATE : ''}\n\n${acceptHelpers}\n\n@Injectable(${provideIn ? `{ providedIn: '${isBoolean(provideIn) ? 'root' : provideIn}' }` : ''})\nexport class ${title} {\n private readonly http = inject(HttpClient);\n`;\n};\n\n/**\n * Generates the closing section for Angular `HttpClient` output.\n *\n * @remarks\n * Besides closing the generated service class, this appends any collected\n * `ClientResult` aliases registered while individual operations were emitted.\n *\n * @returns The footer text for the generated Angular client file.\n */\nexport const generateAngularFooter: ClientFooterBuilder = ({\n operationNames,\n}) => {\n let footer = '};\\n\\n';\n\n const returnTypes = returnTypesRegistry.getFooter(operationNames);\n if (returnTypes) {\n footer += `${returnTypes}\\n`;\n }\n\n return footer;\n};\n\n/**\n * Generates the Angular `HttpClient` method implementation for a single\n * OpenAPI operation.\n *\n * This function is responsible for:\n * - method signatures and overloads\n * - observe-mode branching\n * - multi-content-type `Accept` handling\n * - mutator integration\n * - runtime Zod validation hooks for Angular output\n * - registering the operation's `ClientResult` alias for footer emission\n *\n * @remarks\n * This is the central implementation builder shared by the dedicated\n * `httpClient` mode and the mutation side of Angular `both` / `httpResource`\n * generation.\n *\n * @returns The complete TypeScript method declaration and implementation for the operation.\n */\nexport const generateHttpClientImplementation = (\n {\n headers,\n queryParams,\n operationName,\n response,\n mutator,\n body,\n props,\n verb,\n override,\n formData,\n formUrlEncoded,\n paramsSerializer,\n }: GeneratorVerbOptions,\n { route, context }: HttpClientGeneratorContext,\n) => {\n const isRequestOptions = override.requestOptions !== false;\n const isFormData = !override.formData.disabled;\n const isFormUrlEncoded = override.formUrlEncoded !== false;\n const isExactOptionalPropertyTypes =\n !!context.output.tsconfig?.compilerOptions?.exactOptionalPropertyTypes;\n const bodyForm = generateFormDataAndUrlEncodedFunction({\n formData,\n formUrlEncoded,\n body,\n isFormData,\n isFormUrlEncoded,\n });\n\n const dataType = response.definition.success || 'unknown';\n const isPrimitive = isPrimitiveType(dataType);\n const hasSchema = hasSchemaImport(response.imports, dataType);\n const isZodOutput = isZodSchemaOutput(context.output);\n const shouldValidateResponse =\n override.angular.runtimeValidation &&\n isZodOutput &&\n !isPrimitive &&\n hasSchema;\n const parsedDataType = shouldValidateResponse\n ? getSchemaOutputTypeRef(dataType)\n : dataType;\n const getGeneratedResponseType = (\n value: string,\n contentType: string | undefined,\n ): string => {\n if (\n override.angular.runtimeValidation &&\n isZodOutput &&\n !!contentType &&\n (contentType.includes('json') || contentType.includes('+json')) &&\n !isPrimitiveType(value) &&\n hasSchemaImport(response.imports, value)\n ) {\n return getSchemaOutputTypeRef(value);\n }\n\n return getContentTypeReturnType(contentType, value);\n };\n const resultAliasType = mutator\n ? dataType\n : response.types.success.length <= 1\n ? parsedDataType\n : [\n ...new Set(\n response.types.success.map(({ value, contentType }) =>\n getGeneratedResponseType(value, contentType),\n ),\n ),\n ].join(' | ') || parsedDataType;\n const schemaValueRef = shouldValidateResponse\n ? getSchemaValueRef(dataType)\n : dataType;\n const validationPipe = shouldValidateResponse\n ? `.pipe(map(data => ${schemaValueRef}.parse(data) as TData))`\n : '';\n const responseValidationPipe = shouldValidateResponse\n ? `.pipe(map(response => response.clone({ body: ${schemaValueRef}.parse(response.body) as TData })))`\n : '';\n const eventValidationPipe = shouldValidateResponse\n ? `.pipe(map(event => event instanceof AngularHttpResponse ? event.clone({ body: ${schemaValueRef}.parse(event.body) as TData }) : event))`\n : '';\n\n returnTypesRegistry.set(\n operationName,\n `export type ${pascal(\n operationName,\n )}ClientResult = NonNullable<${resultAliasType}>`,\n );\n\n if (mutator) {\n const mutatorConfig = generateMutatorConfig({\n route,\n body,\n headers,\n queryParams,\n response,\n verb,\n isFormData,\n isFormUrlEncoded,\n hasSignal: false,\n isExactOptionalPropertyTypes,\n isAngular: true,\n });\n\n const requestOptions = isRequestOptions\n ? generateMutatorRequestOptions(\n override.requestOptions,\n mutator.hasThirdArg,\n )\n : '';\n\n const propsImplementation =\n mutator.bodyTypeName && body.definition\n ? toObjectString(props, 'implementation').replace(\n new RegExp(String.raw`(\\\\w*):\\\\s?${body.definition}`),\n `$1: ${mutator.bodyTypeName}<${body.definition}>`,\n )\n : toObjectString(props, 'implementation');\n\n return ` ${operationName}<TData = ${dataType}>(\\n ${propsImplementation}\\n ${\n isRequestOptions && mutator.hasThirdArg\n ? `options?: ThirdParameter<typeof ${mutator.name}>`\n : ''\n }) {${bodyForm}\n return ${mutator.name}<TData>(\n ${mutatorConfig},\n this.http,\n ${requestOptions});\n }\n `;\n }\n\n const optionsBase = {\n route,\n body,\n headers,\n queryParams,\n response,\n verb,\n requestOptions: override.requestOptions,\n isFormData,\n isFormUrlEncoded,\n paramsSerializer,\n paramsSerializerOptions: override.paramsSerializerOptions,\n isAngular: true,\n isExactOptionalPropertyTypes,\n hasSignal: false,\n } as const;\n\n const propsDefinition = toObjectString(props, 'definition');\n\n const successTypes = response.types.success;\n const uniqueContentTypes = getUniqueContentTypes(successTypes);\n const hasMultipleContentTypes = uniqueContentTypes.length > 1;\n const acceptTypeName = hasMultipleContentTypes\n ? getAcceptHelperName(operationName)\n : undefined;\n\n const needsObserveBranching = isRequestOptions && !hasMultipleContentTypes;\n const angularParamsRef = queryParams ? 'filteredParams' : undefined;\n\n let paramsDeclaration = '';\n if (angularParamsRef && queryParams) {\n if (isRequestOptions) {\n // Uses the shared filterParams helper emitted in the file header\n const callExpr = getAngularFilteredParamsCallExpression(\n '{...params, ...options?.params}',\n queryParams.requiredNullableKeys ?? [],\n );\n paramsDeclaration = paramsSerializer\n ? `const ${angularParamsRef} = ${paramsSerializer.name}(${callExpr});\\n\\n `\n : `const ${angularParamsRef} = ${callExpr};\\n\\n `;\n } else {\n // No shared helper available; use inline IIFE filtering\n const iifeExpr = getAngularFilteredParamsExpression(\n 'params ?? {}',\n queryParams.requiredNullableKeys ?? [],\n !!paramsSerializer,\n );\n paramsDeclaration = paramsSerializer\n ? `const ${angularParamsRef} = ${paramsSerializer.name}(${iifeExpr});\\n\\n `\n : `const ${angularParamsRef} = ${iifeExpr};\\n\\n `;\n }\n }\n\n const optionsInput = {\n ...optionsBase,\n ...(angularParamsRef ? { angularParamsRef } : {}),\n } as const;\n\n const options = generateOptions(optionsInput);\n\n const defaultContentType = hasMultipleContentTypes\n ? (successTypes.find(\n ({ contentType }) =>\n !!contentType &&\n (contentType.includes('json') || contentType.includes('+json')),\n )?.contentType ?? getDefaultContentType(uniqueContentTypes))\n : (uniqueContentTypes[0] ?? 'application/json');\n\n const jsonSuccessValues = [\n ...new Set(\n successTypes\n .filter(\n ({ contentType }) =>\n !!contentType &&\n (contentType.includes('json') || contentType.includes('+json')),\n )\n .map(({ value }) => value),\n ),\n ];\n\n const jsonReturnType =\n jsonSuccessValues.length > 0 ? jsonSuccessValues.join(' | ') : 'unknown';\n const parsedJsonReturnType =\n jsonSuccessValues.length === 1 &&\n override.angular.runtimeValidation &&\n isZodOutput &&\n !isPrimitiveType(jsonSuccessValues[0]) &&\n hasSchemaImport(response.imports, jsonSuccessValues[0])\n ? getSchemaOutputTypeRef(jsonSuccessValues[0])\n : jsonReturnType;\n\n let jsonValidationPipe = shouldValidateResponse\n ? `.pipe(map(data => ${schemaValueRef}.parse(data)))`\n : '';\n if (\n hasMultipleContentTypes &&\n !shouldValidateResponse &&\n override.angular.runtimeValidation &&\n isZodOutput &&\n jsonSuccessValues.length === 1\n ) {\n const jsonType = jsonSuccessValues[0];\n const jsonIsPrimitive = isPrimitiveType(jsonType);\n const jsonHasSchema = hasSchemaImport(response.imports, jsonType);\n if (!jsonIsPrimitive && jsonHasSchema) {\n const jsonSchemaRef = getSchemaValueRef(jsonType);\n jsonValidationPipe = `.pipe(map(data => ${jsonSchemaRef}.parse(data)))`;\n }\n }\n\n const textSuccessTypes = successTypes.filter(\n ({ contentType, value }) =>\n !!contentType &&\n (contentType.startsWith('text/') ||\n contentType.includes('xml') ||\n value === 'string'),\n );\n const blobSuccessTypes = successTypes.filter(\n ({ contentType }) =>\n !!contentType &&\n !contentType.includes('json') &&\n !contentType.includes('+json') &&\n !contentType.startsWith('text/') &&\n !contentType.includes('xml'),\n );\n const multiReturnMembers = [\n parsedJsonReturnType,\n ...(textSuccessTypes.length > 0 ? ['string'] : []),\n ...(blobSuccessTypes.length > 0 ? ['Blob'] : []),\n ];\n const uniqueMultiReturnMembers = [...new Set(multiReturnMembers)];\n const refinedMultiImplementationReturnType = `Observable<${uniqueMultiReturnMembers.join(' | ')}>`;\n\n const observeOptions = needsObserveBranching\n ? {\n body: generateOptions({ ...optionsInput, angularObserve: 'body' }),\n events: generateOptions({ ...optionsInput, angularObserve: 'events' }),\n response: generateOptions({\n ...optionsInput,\n angularObserve: 'response',\n }),\n }\n : undefined;\n\n const isModelType =\n dataType !== 'Blob' && dataType !== 'string' && dataType !== 'ArrayBuffer';\n let functionName = operationName;\n if (isModelType && !hasMultipleContentTypes) {\n functionName += `<TData = ${parsedDataType}>`;\n }\n\n let contentTypeOverloads = '';\n if (hasMultipleContentTypes && isRequestOptions) {\n const requiredPart = props\n .filter((p) => p.required && !p.default)\n .map((p) => p.definition)\n .join(',\\n ');\n const optionalPart = props\n .filter((p) => !p.required || p.default)\n .map((p) => p.definition)\n .join(',\\n ');\n const branchOverloads = successTypes\n .filter(({ contentType }) => !!contentType)\n .map(({ contentType, value }) => {\n const returnType = getGeneratedResponseType(value, contentType);\n const overloadParams = [\n requiredPart,\n `accept: '${contentType}'`,\n optionalPart,\n ]\n .filter(Boolean)\n .join(',\\n ');\n\n return `${operationName}(${overloadParams}, options?: HttpClientOptions): Observable<${returnType}>;`;\n })\n .join('\\n ');\n const allParams = [\n requiredPart,\n `accept?: ${acceptTypeName ?? 'string'}`,\n optionalPart,\n ]\n .filter(Boolean)\n .join(',\\n ');\n contentTypeOverloads = `${branchOverloads}\\n ${operationName}(${allParams}, options?: HttpClientOptions): ${refinedMultiImplementationReturnType};`;\n }\n\n const observeOverloads =\n isRequestOptions && !hasMultipleContentTypes\n ? `${functionName}(${propsDefinition} options?: HttpClientBodyOptions): Observable<${isModelType ? 'TData' : parsedDataType}>;\\n ${functionName}(${propsDefinition} options?: HttpClientEventOptions): Observable<HttpEvent<${isModelType ? 'TData' : parsedDataType}>>;\\n ${functionName}(${propsDefinition} options?: HttpClientResponseOptions): Observable<AngularHttpResponse<${isModelType ? 'TData' : parsedDataType}>>;`\n : '';\n\n const overloads = contentTypeOverloads || observeOverloads;\n\n const observableDataType = isModelType ? 'TData' : parsedDataType;\n const singleImplementationReturnType = isRequestOptions\n ? `Observable<${observableDataType} | HttpEvent<${observableDataType}> | AngularHttpResponse<${observableDataType}>>`\n : `Observable<${observableDataType}>`;\n\n if (hasMultipleContentTypes) {\n const requiredPart = props\n .filter((p) => p.required && !p.default)\n .map((p) => p.implementation)\n .join(',\\n ');\n const optionalPart = props\n .filter((p) => !p.required || p.default)\n .map((p) => p.implementation)\n .join(',\\n ');\n const allParams = [\n requiredPart,\n `accept: ${acceptTypeName ?? 'string'} = '${defaultContentType}'`,\n optionalPart,\n ]\n .filter(Boolean)\n .join(',\\n ');\n\n return ` ${overloads}\n ${operationName}(\n ${allParams},\n ${isRequestOptions ? 'options?: HttpClientOptions' : ''}\n ): ${refinedMultiImplementationReturnType} {${bodyForm}\n ${paramsDeclaration}const headers = options?.headers instanceof HttpHeaders\n ? options.headers.set('Accept', accept)\n : { ...(options?.headers ?? {}), Accept: accept };\n\n if (accept.includes('json') || accept.includes('+json')) {\n return this.http.${verb}<${parsedJsonReturnType}>(\\`${route}\\`, {\n ...options,\n responseType: 'json',\n headers,\n ${angularParamsRef ? `params: ${angularParamsRef},` : ''}\n })${jsonValidationPipe};\n } else if (accept.startsWith('text/') || accept.includes('xml')) {\n return this.http.${verb}(\\`${route}\\`, {\n ...options,\n responseType: 'text',\n headers,\n ${angularParamsRef ? `params: ${angularParamsRef},` : ''}\n }) as Observable<string>;\n }${\n blobSuccessTypes.length > 0\n ? ` else {\n return this.http.${verb}(\\`${route}\\`, {\n ...options,\n responseType: 'blob',\n headers,\n ${angularParamsRef ? `params: ${angularParamsRef},` : ''}\n }) as Observable<Blob>;\n }`\n : `\n\n return this.http.${verb}<${parsedJsonReturnType}>(\\`${route}\\`, {\n ...options,\n responseType: 'json',\n headers,\n ${angularParamsRef ? `params: ${angularParamsRef},` : ''}\n })${jsonValidationPipe};`\n }\n }\n`;\n }\n\n const observeImplementation = isRequestOptions\n ? `${paramsDeclaration}if (options?.observe === 'events') {\n return this.http.${verb}${isModelType ? '<TData>' : ''}(${observeOptions?.events ?? options})${eventValidationPipe};\n }\n\n if (options?.observe === 'response') {\n return this.http.${verb}${isModelType ? '<TData>' : ''}(${observeOptions?.response ?? options})${responseValidationPipe};\n }\n\n return this.http.${verb}${isModelType ? '<TData>' : ''}(${observeOptions?.body ?? options})${validationPipe};`\n : `return this.http.${verb}${isModelType ? '<TData>' : ''}(${options})${validationPipe};`;\n\n return ` ${overloads}\n ${functionName}(\n ${toObjectString(props, 'implementation')} ${\n isRequestOptions ? `options?: HttpClientObserveOptions` : ''\n }): ${singleImplementationReturnType} {${bodyForm}\n ${observeImplementation}\n }\n`;\n};\n\n/**\n * Orval client builder entry point for Angular `HttpClient` output.\n *\n * It normalizes imports needed for runtime validation, delegates the actual\n * method implementation to `generateHttpClientImplementation`, and returns the\n * generated code plus imports for the current operation.\n *\n * @returns The generated implementation fragment and imports for one operation.\n */\nexport const generateAngular: ClientBuilder = (verbOptions, options) => {\n const isZodOutput = isZodSchemaOutput(options.context.output);\n const responseType = verbOptions.response.definition.success;\n const isPrimitiveResponse = isPrimitiveType(responseType);\n const shouldUseRuntimeValidation =\n verbOptions.override.angular.runtimeValidation && isZodOutput;\n\n const normalizedVerbOptions = (() => {\n if (!shouldUseRuntimeValidation) return verbOptions;\n\n let result: GeneratorVerbOptions = {\n ...verbOptions,\n response: {\n ...verbOptions.response,\n imports: verbOptions.response.imports.map((imp) => ({\n ...imp,\n values: true,\n })),\n },\n };\n\n if (\n !isPrimitiveResponse &&\n hasSchemaImport(result.response.imports, responseType)\n ) {\n result = {\n ...result,\n response: {\n ...result.response,\n imports: [\n ...result.response.imports.map((imp) =>\n imp.name === responseType ? { ...imp, values: true } : imp,\n ),\n { name: getSchemaOutputTypeRef(responseType) },\n ],\n },\n };\n }\n\n const successTypes = result.response.types.success;\n const uniqueContentTypes = [\n ...new Set(successTypes.map((t) => t.contentType).filter(Boolean)),\n ];\n if (uniqueContentTypes.length > 1) {\n const jsonSchemaNames = [\n ...new Set(\n successTypes\n .filter(\n ({ contentType }) =>\n !!contentType &&\n (contentType.includes('json') || contentType.includes('+json')),\n )\n .map(({ value }) => value),\n ),\n ];\n if (jsonSchemaNames.length === 1) {\n const jsonType = jsonSchemaNames[0];\n const jsonIsPrimitive = isPrimitiveType(jsonType);\n if (\n !jsonIsPrimitive &&\n hasSchemaImport(result.response.imports, jsonType)\n ) {\n result = {\n ...result,\n response: {\n ...result.response,\n imports: [\n ...result.response.imports.map((imp) =>\n imp.name === jsonType ? { ...imp, values: true } : imp,\n ),\n { name: getSchemaOutputTypeRef(jsonType) },\n ],\n },\n };\n }\n }\n }\n\n return result;\n })();\n\n const implementation = generateHttpClientImplementation(\n normalizedVerbOptions,\n options,\n );\n\n const imports = [\n ...generateVerbImports(normalizedVerbOptions),\n ...(implementation.includes('.pipe(map(')\n ? [{ name: 'map', values: true, importPath: 'rxjs' }]\n : []),\n ];\n\n return { implementation, imports };\n};\n\n/**\n * Returns the footer aliases collected for the provided operation names.\n *\n * The Angular generators use these aliases to expose stable `ClientResult`\n * helper types such as `ListPetsClientResult`.\n *\n * @returns Concatenated `ClientResult` aliases for the requested operation names.\n */\nexport const getHttpClientReturnTypes = (operationNames: string[]) =>\n returnTypesRegistry.getFooter(operationNames);\n\n/**\n * Clears the module-level return type registry used during Angular client\n * generation.\n *\n * This must be called at the start of each generation pass to avoid leaking\n * aliases across files or tags.\n *\n * @returns Nothing.\n */\nexport const resetHttpClientReturnTypes = () => {\n returnTypesRegistry.reset();\n};\n\nexport { generateAngularTitle } from './utils';\n","import {\n camel,\n type ClientBuilder,\n type ClientDependenciesBuilder,\n type ClientExtraFilesBuilder,\n type ClientFooterBuilder,\n type ClientHeaderBuilder,\n type ContextSpec,\n conventionName,\n escapeRegExp,\n generateDependencyImports,\n generateFormDataAndUrlEncodedFunction,\n generateMutatorImports,\n type GeneratorDependency,\n type GeneratorImport,\n type GeneratorVerbOptions,\n getAngularFilteredParamsCallExpression,\n getAngularFilteredParamsHelperBody,\n getFileInfo,\n getFullRoute,\n GetterPropType,\n isObject,\n isSyntheticDefaultImportsAllow,\n jsDoc,\n type NormalizedOutputOptions,\n type OpenApiInfoObject,\n pascal,\n type ResReqTypesValue,\n toObjectString,\n upath,\n} from '@orval/core';\n\nimport {\n ANGULAR_HTTP_CLIENT_DEPENDENCIES,\n ANGULAR_HTTP_RESOURCE_DEPENDENCIES,\n} from './constants';\nimport {\n buildAcceptHelpers,\n generateHttpClientImplementation,\n getAcceptHelperName,\n getHttpClientReturnTypes,\n getUniqueContentTypes,\n type HttpClientGeneratorContext,\n resetHttpClientReturnTypes,\n} from './http-client';\nimport {\n buildServiceClassOpen,\n type ClientOverride,\n createReturnTypesRegistry,\n createRouteRegistry,\n getDefaultSuccessType,\n isMutationVerb,\n isPrimitiveType,\n isRetrievalVerb,\n isZodSchemaOutput,\n} from './utils';\n\n/**\n * Reads the per-operation angular client override from the orval config.\n *\n * Mirrors the pattern used by `@orval/query` for `operationQueryOptions`:\n * ```ts\n * override: {\n * operations: {\n * myPostSearch: { angular: { retrievalClient: 'httpResource' } },\n * }\n * }\n * ```\n */\ninterface AngularOperationOverride {\n readonly client?: ClientOverride;\n readonly httpResource?: AngularHttpResourceOptionsConfig;\n}\n\ninterface AngularHttpResourceOptionsConfig {\n defaultValue?: unknown;\n debugName?: string;\n injector?: string;\n equal?: string;\n}\n\nconst isAngularHttpResourceOptions = (\n value: unknown,\n): value is AngularHttpResourceOptionsConfig =>\n value === undefined ||\n (isObject(value) &&\n (value.defaultValue === undefined ||\n typeof value.defaultValue === 'string' ||\n typeof value.defaultValue === 'number' ||\n typeof value.defaultValue === 'boolean' ||\n value.defaultValue === null ||\n Array.isArray(value.defaultValue) ||\n isObject(value.defaultValue)) &&\n (value.debugName === undefined || typeof value.debugName === 'string') &&\n (value.injector === undefined || typeof value.injector === 'string') &&\n (value.equal === undefined || typeof value.equal === 'string'));\n\nconst isAngularOperationOverride = (\n value: unknown,\n): value is AngularOperationOverride =>\n value !== undefined &&\n typeof value === 'object' &&\n value !== null &&\n (!('client' in value) ||\n value.client === 'httpClient' ||\n value.client === 'httpResource' ||\n value.client === 'both') &&\n (!('httpResource' in value) ||\n isAngularHttpResourceOptions(value.httpResource));\n\nconst getClientOverride = (\n verbOption: GeneratorVerbOptions,\n): ClientOverride | undefined => {\n const angular =\n verbOption.override.operations[verbOption.operationId]?.angular;\n\n return isAngularOperationOverride(angular) ? angular.client : undefined;\n};\n\n/**\n * Resolves the effective `httpResource` option override for an operation.\n *\n * Operation-level configuration takes precedence over the global\n * `override.angular.httpResource` block while still inheriting unspecified\n * values from the global configuration.\n *\n * @returns The merged resource options for the operation, or `undefined` when no override exists.\n */\nconst getHttpResourceOverride = (\n verbOption: GeneratorVerbOptions,\n output: NormalizedOutputOptions,\n): AngularHttpResourceOptionsConfig | undefined => {\n const operationAngular =\n verbOption.override.operations[verbOption.operationId]?.angular;\n const operationOverride = isAngularOperationOverride(operationAngular)\n ? operationAngular.httpResource\n : undefined;\n const angularOverride = output.override.angular as unknown;\n const globalOverride =\n isObject(angularOverride) &&\n 'httpResource' in angularOverride &&\n isAngularHttpResourceOptions(angularOverride.httpResource)\n ? angularOverride.httpResource\n : undefined;\n\n if (globalOverride === undefined) return operationOverride;\n if (operationOverride === undefined) return globalOverride;\n\n return {\n ...globalOverride,\n ...operationOverride,\n };\n};\n\n// NOTE: Module-level singletons — reset() is called by the header builder\n// (generateAngularHttpResourceHeader) at the start of each generation pass.\nconst resourceReturnTypesRegistry = createReturnTypesRegistry();\n\n/** @internal Exported for testing only */\nexport const routeRegistry = createRouteRegistry();\n\nconst getHeader = (\n option: false | ((info: OpenApiInfoObject) => string | string[]),\n info: OpenApiInfoObject | undefined,\n): string => {\n if (!option || !info) {\n return '';\n }\n\n const header = option(info);\n\n return Array.isArray(header) ? jsDoc({ description: header }) : header;\n};\n\nconst mergeDependencies = (\n deps: GeneratorDependency[],\n): GeneratorDependency[] => {\n const merged = new Map<\n string,\n { exports: GeneratorImport[]; dependency: string }\n >();\n\n for (const dep of deps) {\n const existing = merged.get(dep.dependency);\n if (!existing) {\n merged.set(dep.dependency, {\n exports: [...dep.exports],\n dependency: dep.dependency,\n });\n continue;\n }\n\n for (const exp of dep.exports) {\n if (\n !existing.exports.some(\n (current) => current.name === exp.name && current.alias === exp.alias,\n )\n ) {\n existing.exports.push(exp);\n }\n }\n }\n\n return [...merged.values()];\n};\n\nconst cloneDependencies = (\n deps: readonly GeneratorDependency[],\n): GeneratorDependency[] =>\n deps.map((dep) => ({\n ...dep,\n exports: [...dep.exports],\n }));\n\n/**\n * Returns the merged dependency list required when Angular `httpResource`\n * output coexists with Angular `HttpClient` service generation.\n *\n * This is used for pure `httpResource` mode as well as mixed generation paths\n * that still need Angular common HTTP symbols and service helpers.\n *\n * @returns The de-duplicated dependency descriptors for Angular resource generation.\n */\nexport const getAngularHttpResourceDependencies: ClientDependenciesBuilder =\n () =>\n mergeDependencies([\n ...ANGULAR_HTTP_CLIENT_DEPENDENCIES,\n ...ANGULAR_HTTP_RESOURCE_DEPENDENCIES,\n ]);\n\n/**\n * Returns only the dependencies required by standalone generated resource\n * files, such as the sibling `*.resource.ts` output used in `both` mode.\n *\n * @returns The dependency descriptors required by resource-only files.\n */\nexport const getAngularHttpResourceOnlyDependencies: ClientDependenciesBuilder =\n () => cloneDependencies(ANGULAR_HTTP_RESOURCE_DEPENDENCIES);\n\nconst isResponseText = (\n contentType: string | undefined,\n dataType: string,\n): boolean => {\n if (dataType === 'string') return true;\n if (!contentType) return false;\n return contentType.startsWith('text/') || contentType.includes('xml');\n};\n\nconst isResponseArrayBuffer = (contentType: string | undefined): boolean => {\n if (!contentType) return false;\n return (\n contentType.includes('application/octet-stream') ||\n contentType.includes('application/pdf')\n );\n};\n\nconst isResponseBlob = (\n contentType: string | undefined,\n isBlob: boolean,\n): boolean => {\n if (isBlob) return true;\n if (!contentType) return false;\n return contentType.startsWith('image/') || contentType.includes('blob');\n};\n\ntype HttpResourceFactoryName =\n | 'httpResource'\n | 'httpResource.text'\n | 'httpResource.arrayBuffer'\n | 'httpResource.blob';\n\nconst HTTP_RESOURCE_OPTIONS_TYPE_NAME = 'OrvalHttpResourceOptions';\n\nconst getHttpResourceFactory = (\n response: { readonly isBlob: boolean },\n contentType: string | undefined,\n dataType: string,\n): HttpResourceFactoryName => {\n if (isResponseText(contentType, dataType)) return 'httpResource.text';\n if (isResponseBlob(contentType, response.isBlob)) return 'httpResource.blob';\n if (isResponseArrayBuffer(contentType)) return 'httpResource.arrayBuffer';\n return 'httpResource';\n};\n\nconst getHttpResourceRawType = (factory: HttpResourceFactoryName): string => {\n switch (factory) {\n case 'httpResource.text': {\n return 'string';\n }\n case 'httpResource.arrayBuffer': {\n return 'ArrayBuffer';\n }\n case 'httpResource.blob': {\n return 'Blob';\n }\n default: {\n return 'unknown';\n }\n }\n};\n\nconst getTypeWithoutDefault = (definition: string): string => {\n const match = /^([^:]+):\\s*(.+)$/.exec(definition);\n if (!match) return definition;\n return match[2].replace(/\\s*=\\s*.*$/, '').trim();\n};\n\nconst getDefaultValueFromImplementation = (\n implementation: string,\n): string | undefined => {\n const match = /=\\s*(.+)$/.exec(implementation);\n return match ? match[1].trim() : undefined;\n};\n\ninterface SignalProp {\n readonly definition: string;\n readonly implementation: string;\n}\n\nconst withSignal = (\n prop: GeneratorVerbOptions['props'][number],\n options: { readonly hasDefault?: boolean } = {},\n): SignalProp => {\n const type = getTypeWithoutDefault(prop.definition);\n const derivedDefault =\n getDefaultValueFromImplementation(prop.implementation) !== undefined ||\n prop.default !== undefined;\n const hasDefault = options.hasDefault ?? derivedDefault;\n const nameMatch = /^([^:]+):/.exec(prop.definition);\n const namePart = nameMatch ? nameMatch[1] : prop.name;\n const hasOptionalMark = namePart.includes('?');\n const optional = prop.required && !hasDefault && !hasOptionalMark ? '' : '?';\n const definition = `${prop.name}${optional}: Signal<${type}>`;\n\n return {\n definition,\n implementation: definition,\n };\n};\n\nconst buildSignalProps = (\n props: GeneratorVerbOptions['props'],\n params: GeneratorVerbOptions['params'],\n): GeneratorVerbOptions['props'] => {\n const paramDefaults = new Map<string, boolean>();\n for (const param of params) {\n const hasDefault =\n getDefaultValueFromImplementation(param.implementation) !== undefined ||\n param.default !== undefined;\n paramDefaults.set(param.name, hasDefault);\n }\n\n return props.map((prop) => {\n switch (prop.type) {\n case GetterPropType.NAMED_PATH_PARAMS: {\n return {\n ...prop,\n name: 'pathParams',\n definition: `pathParams: Signal<${prop.schema.name}>`,\n implementation: `pathParams: Signal<${prop.schema.name}>`,\n };\n }\n case GetterPropType.PARAM:\n case GetterPropType.QUERY_PARAM:\n case GetterPropType.BODY:\n case GetterPropType.HEADER: {\n const hasDefault =\n prop.type === GetterPropType.PARAM\n ? (paramDefaults.get(prop.name) ?? false)\n : undefined;\n const signalProp = withSignal(prop, { hasDefault });\n return {\n ...prop,\n definition: signalProp.definition,\n implementation: signalProp.implementation,\n };\n }\n default: {\n return prop;\n }\n }\n });\n};\n\nconst applySignalRoute = (\n route: string,\n params: GeneratorVerbOptions['params'],\n useNamedParams: boolean,\n): string => {\n let updatedRoute = route;\n for (const param of params) {\n const template = '${' + param.name + '}';\n const defaultValue = getDefaultValueFromImplementation(\n param.implementation,\n );\n let replacement: string;\n if (useNamedParams) {\n replacement =\n defaultValue === undefined\n ? '${pathParams().' + param.name + '}'\n : '${pathParams()?.' + param.name + ' ?? ' + defaultValue + '}';\n } else {\n replacement =\n defaultValue === undefined\n ? '${' + param.name + '()}'\n : '${' + param.name + '?.() ?? ' + defaultValue + '}';\n }\n updatedRoute = updatedRoute.replaceAll(template, replacement);\n }\n return updatedRoute;\n};\n\ninterface ResourceRequest {\n readonly bodyForm: string;\n readonly request: string;\n readonly isUrlOnly: boolean;\n}\n\nconst buildResourceRequest = (\n {\n verb,\n body,\n headers,\n queryParams,\n paramsSerializer,\n override,\n formData,\n formUrlEncoded,\n }: GeneratorVerbOptions,\n route: string,\n): ResourceRequest => {\n const isFormData = !override.formData.disabled;\n const isFormUrlEncoded = override.formUrlEncoded !== false;\n\n const bodyForm = generateFormDataAndUrlEncodedFunction({\n formData,\n formUrlEncoded,\n body,\n isFormData,\n isFormUrlEncoded,\n });\n\n const hasFormData = isFormData && body.formData;\n const hasFormUrlEncoded = isFormUrlEncoded && body.formUrlEncoded;\n\n const bodyAccess = body.definition\n ? body.isOptional\n ? `${body.implementation}?.()`\n : `${body.implementation}()`\n : undefined;\n const bodyValue = hasFormData\n ? 'formData'\n : hasFormUrlEncoded\n ? 'formUrlEncoded'\n : bodyAccess;\n\n const paramsAccess = queryParams ? 'params?.()' : undefined;\n const headersAccess = headers ? 'headers?.()' : undefined;\n const filteredParamsValue = paramsAccess\n ? getAngularFilteredParamsCallExpression(\n `${paramsAccess} ?? {}`,\n queryParams?.requiredNullableKeys ?? [],\n !!paramsSerializer,\n )\n : undefined;\n const paramsValue = paramsAccess\n ? paramsSerializer\n ? `params?.() ? ${paramsSerializer.name}(${filteredParamsValue}) : undefined`\n : filteredParamsValue\n : undefined;\n\n const isGet = verb === 'get';\n const hasExtras = !isGet || !!bodyValue || !!paramsValue || !!headersAccess;\n const isUrlOnly = !hasExtras && !bodyForm;\n\n const requestLines = [\n `url: \\`${route}\\``,\n isGet ? undefined : `method: '${verb.toUpperCase()}'`,\n bodyValue ? `body: ${bodyValue}` : undefined,\n paramsValue ? `params: ${paramsValue}` : undefined,\n headersAccess ? `headers: ${headersAccess}` : undefined,\n ].filter(Boolean);\n\n const request = isUrlOnly\n ? `\\`${route}\\``\n : `({\\n ${requestLines.join(',\\n ')}\\n })`;\n\n return {\n bodyForm,\n request,\n isUrlOnly,\n };\n};\n\nconst getSchemaOutputTypeRef = (typeName: string): string =>\n typeName === 'Error' ? 'ErrorOutput' : `${typeName}Output`;\n\nconst getHttpResourceResponseImports = (\n response: GeneratorVerbOptions['response'],\n): GeneratorImport[] => {\n const successDefinition = response.definition.success;\n if (!successDefinition) return [];\n\n return response.imports.filter((imp) => {\n const name = imp.alias ?? imp.name;\n const pattern = new RegExp(String.raw`\\b${escapeRegExp(name)}\\b`, 'g');\n return pattern.test(successDefinition);\n });\n};\n\nconst getHttpResourceVerbImports = (\n verbOptions: GeneratorVerbOptions,\n output: NormalizedOutputOptions,\n): GeneratorImport[] => {\n const { response, body, queryParams, props, headers, params } = verbOptions;\n const responseImports = isZodSchemaOutput(output)\n ? [\n ...getHttpResourceResponseImports(response).map((imp) => ({\n ...imp,\n values: true,\n })),\n ...getHttpResourceResponseImports(response)\n .filter((imp) => !isPrimitiveType(imp.name))\n .map((imp) => ({ name: getSchemaOutputTypeRef(imp.name) })),\n ]\n : getHttpResourceResponseImports(response);\n\n return [\n ...responseImports,\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 { name: 'map', values: true, importPath: 'rxjs' },\n ];\n};\n\nconst getParseExpression = (\n response: {\n readonly imports: readonly { name: string; isZodSchema?: boolean }[];\n readonly definition: { readonly success?: string };\n },\n factory: HttpResourceFactoryName,\n output: NormalizedOutputOptions,\n responseTypeOverride?: string,\n): string | undefined => {\n if (factory !== 'httpResource') return undefined;\n\n // Explicit isZodSchema flag on imports (forward-compatible)\n const zodSchema = response.imports.find((imp) => imp.isZodSchema);\n if (zodSchema) return `${zodSchema.name}.parse`;\n\n // Check if runtime validation is disabled\n if (!output.override.angular.runtimeValidation) return undefined;\n\n // Auto-detect: when schemas.type === 'zod', use the response type as the schema name\n if (!isZodSchemaOutput(output)) return undefined;\n\n const responseType = responseTypeOverride ?? response.definition.success;\n if (!responseType) return undefined;\n if (isPrimitiveType(responseType)) return undefined;\n\n // Verify a matching import exists (the response type name resolves to a zod schema)\n const hasMatchingImport = response.imports.some(\n (imp) => imp.name === responseType,\n );\n if (!hasMatchingImport) return undefined;\n\n return `${responseType}.parse`;\n};\n\n/**\n * Builds the literal option entries that Orval injects into generated\n * `httpResource()` calls.\n *\n * This merges user-supplied generator configuration such as `defaultValue` or\n * `debugName` with automatically derived runtime-validation hooks like\n * `parse: Schema.parse`.\n *\n * @returns The option entries plus metadata about whether a configured default value exists.\n */\nconst buildHttpResourceOptionsLiteral = (\n verbOption: GeneratorVerbOptions,\n factory: HttpResourceFactoryName,\n output: NormalizedOutputOptions,\n responseTypeOverride?: string,\n): { entries: string[]; hasDefaultValue: boolean } => {\n const override = getHttpResourceOverride(verbOption, output);\n const parseExpression = getParseExpression(\n verbOption.response,\n factory,\n output,\n responseTypeOverride,\n );\n\n const defaultValueLiteral =\n override?.defaultValue === undefined\n ? undefined\n : JSON.stringify(override.defaultValue);\n\n const optionEntries = [\n parseExpression ? `parse: ${parseExpression}` : undefined,\n defaultValueLiteral ? `defaultValue: ${defaultValueLiteral}` : undefined,\n override?.debugName === undefined\n ? undefined\n : `debugName: ${JSON.stringify(override.debugName)}`,\n override?.injector ? `injector: ${override.injector}` : undefined,\n override?.equal ? `equal: ${override.equal}` : undefined,\n ].filter((value): value is string => value !== undefined);\n\n return {\n entries: optionEntries,\n hasDefaultValue: defaultValueLiteral !== undefined,\n };\n};\n\nconst appendArgument = (args: string, argument: string): string => {\n const normalizedArgs = args.trim().replace(/,\\s*$/, '');\n\n return normalizedArgs.length > 0\n ? `${normalizedArgs},\n ${argument}`\n : argument;\n};\n\nconst normalizeOptionalParametersForRequiredTrailingArg = (\n args: string,\n): string =>\n args.replaceAll(/(\\w+)\\?:\\s*([^,\\n]+)(,?)/g, '$1: $2 | undefined$3');\n\nconst buildHttpResourceOptionsArgument = (\n valueType: string,\n rawType: string,\n options: { readonly requiresDefaultValue: boolean },\n omitParse = false,\n): string => {\n const baseType = `${HTTP_RESOURCE_OPTIONS_TYPE_NAME}<${valueType}, ${rawType}${omitParse ? ', true' : ''}>`;\n return options.requiresDefaultValue\n ? `options: ${baseType} & { defaultValue: NoInfer<${valueType}> }`\n : `options?: ${baseType}`;\n};\n\nconst buildHttpResourceOptionsExpression = (\n configuredEntries: readonly string[],\n): string | undefined => {\n if (configuredEntries.length === 0) {\n return 'options';\n }\n\n return `{\n ...(options ?? {}),\n ${configuredEntries.join(',\\n ')}\n }`;\n};\n\nconst buildHttpResourceFunctionSignatures = (\n resourceName: string,\n args: string,\n valueType: string,\n rawType: string,\n hasConfiguredDefaultValue: boolean,\n omitParse = false,\n): string => {\n if (hasConfiguredDefaultValue) {\n return `export function ${resourceName}(${appendArgument(\n args,\n buildHttpResourceOptionsArgument(\n valueType,\n rawType,\n {\n requiresDefaultValue: false,\n },\n omitParse,\n ),\n )}): HttpResourceRef<${valueType}>`;\n }\n\n const overloadArgs = appendArgument(\n normalizeOptionalParametersForRequiredTrailingArg(args),\n buildHttpResourceOptionsArgument(\n valueType,\n rawType,\n {\n requiresDefaultValue: true,\n },\n omitParse,\n ),\n );\n const implementationArgs = appendArgument(\n args,\n buildHttpResourceOptionsArgument(\n valueType,\n rawType,\n {\n requiresDefaultValue: false,\n },\n omitParse,\n ),\n );\n\n return `export function ${resourceName}(${overloadArgs}): HttpResourceRef<${valueType}>;\nexport function ${resourceName}(${implementationArgs}): HttpResourceRef<${valueType} | undefined>`;\n};\n\n/**\n * Generates a single Angular `httpResource` helper function for an operation.\n *\n * The generated output handles signal-wrapped parameters, route interpolation,\n * request-body construction, content-type branching, runtime validation, and\n * optional mutator integration when the mutator is compatible with standalone\n * resource functions.\n *\n * @remarks\n * This function emits overloads when content negotiation or caller-supplied\n * `defaultValue` support requires multiple signatures.\n *\n * @returns A string containing the complete generated resource helper.\n */\nconst buildHttpResourceFunction = (\n verbOption: GeneratorVerbOptions,\n route: string,\n output: NormalizedOutputOptions,\n): string => {\n const { operationName, response, props, params, mutator } = verbOption;\n\n const dataType = response.definition.success || 'unknown';\n const omitParse = isZodSchemaOutput(output);\n const responseSchemaImports = getHttpResourceResponseImports(response);\n const hasResponseSchemaImport = responseSchemaImports.some(\n (imp) => imp.name === dataType,\n );\n const resourceName = `${operationName}Resource`;\n const parsedDataType =\n omitParse &&\n output.override.angular.runtimeValidation &&\n !isPrimitiveType(dataType) &&\n hasResponseSchemaImport\n ? getSchemaOutputTypeRef(dataType)\n : dataType;\n const successTypes = response.types.success;\n const overallReturnType =\n successTypes.length <= 1\n ? parsedDataType\n : [\n ...new Set(\n successTypes.map((type) =>\n getHttpResourceGeneratedResponseType(\n type.value,\n type.contentType,\n responseSchemaImports,\n output,\n ),\n ),\n ),\n ].join(' | ') || parsedDataType;\n resourceReturnTypesRegistry.set(\n operationName,\n `export type ${pascal(\n operationName,\n )}ResourceResult = NonNullable<${overallReturnType}>`,\n );\n const uniqueContentTypes = getUniqueContentTypes(successTypes);\n const defaultSuccess = getDefaultSuccessType(successTypes, dataType);\n const jsonContentType = successTypes.find((type) =>\n type.contentType.includes('json'),\n )?.contentType;\n const preferredContentType = jsonContentType ?? defaultSuccess.contentType;\n const resourceFactory = getHttpResourceFactory(\n response,\n preferredContentType,\n dataType,\n );\n\n const hasNamedParams = props.some(\n (prop) => prop.type === GetterPropType.NAMED_PATH_PARAMS,\n );\n const signalRoute = applySignalRoute(route, params, hasNamedParams);\n\n const signalProps = buildSignalProps(props, params);\n const args = toObjectString(signalProps, 'implementation');\n\n const { bodyForm, request, isUrlOnly } = buildResourceRequest(\n verbOption,\n signalRoute,\n );\n\n if (uniqueContentTypes.length > 1) {\n const defaultContentType = jsonContentType ?? defaultSuccess.contentType;\n const acceptTypeName = getAcceptHelperName(operationName);\n const requiredProps = signalProps.filter(\n (_, index) => props[index]?.required && !props[index]?.default,\n );\n const optionalProps = signalProps.filter(\n (_, index) => !props[index]?.required || props[index]?.default,\n );\n const requiredPart = requiredProps\n .map((prop) => prop.implementation)\n .join(',\\n ');\n const optionalPart = optionalProps\n .map((prop) => prop.implementation)\n .join(',\\n ');\n const getBranchReturnType = (type: ResReqTypesValue) =>\n getHttpResourceGeneratedResponseType(\n type.value,\n type.contentType,\n responseSchemaImports,\n output,\n );\n const unionReturnType = [\n ...new Set(\n successTypes\n .filter((type) => type.contentType)\n .map((type) => getBranchReturnType(type)),\n ),\n ].join(' | ');\n const branchOverloads = successTypes\n .filter((type) => type.contentType)\n .map((type) => {\n const returnType = getBranchReturnType(type);\n const overloadArgs = [\n requiredPart,\n `accept: '${type.contentType}'`,\n optionalPart,\n `options?: ${buildBranchOptionsType(unionReturnType, 'unknown', omitParse)}`,\n ]\n .filter(Boolean)\n .join(',\\n ');\n\n return `export function ${resourceName}(${overloadArgs}): HttpResourceRef<${returnType} | undefined>;`;\n })\n .join('\\n');\n const implementationArgs = [\n requiredPart,\n `accept?: ${acceptTypeName}`,\n optionalPart,\n `options?: ${buildBranchOptionsType(unionReturnType, 'unknown', omitParse)}`,\n ]\n .filter(Boolean)\n .join(',\\n ');\n const implementationArgsWithDefault = [\n requiredPart,\n `accept: ${acceptTypeName} = '${defaultContentType}'`,\n optionalPart,\n `options?: ${buildBranchOptionsType(unionReturnType, 'unknown', omitParse)}`,\n ]\n .filter(Boolean)\n .join(',\\n ');\n\n const getBranchOptions = (type: ResReqTypesValue | undefined) => {\n if (!type) {\n return `options as ${buildBranchOptionsType(unionReturnType, 'unknown', omitParse)}`;\n }\n\n const factory = getHttpResourceFactory(\n response,\n type.contentType,\n type.value,\n );\n const branchOptions = buildHttpResourceOptionsLiteral(\n verbOption,\n factory,\n output,\n type.value,\n );\n const branchOptionsExpression = buildHttpResourceOptionsExpression(\n branchOptions.entries,\n );\n\n return `${branchOptionsExpression ?? 'options'} as unknown as ${buildBranchOptionsType(\n getBranchReturnType(type),\n getHttpResourceRawType(factory),\n omitParse,\n )}`;\n };\n\n const jsonType = successTypes.find(\n (type) =>\n type.contentType.includes('json') || type.contentType.includes('+json'),\n );\n const textType = successTypes.find((type) =>\n isResponseText(type.contentType, type.value),\n );\n const arrayBufferType = successTypes.find((type) =>\n isResponseArrayBuffer(type.contentType),\n );\n const blobType = successTypes.find((type) =>\n isResponseBlob(type.contentType, response.isBlob),\n );\n\n const fallbackReturn = blobType\n ? `return httpResource.blob<Blob>(() => ({\n ...normalizedRequest,\n headers,\n }), ${getBranchOptions(blobType)});`\n : textType\n ? `return httpResource.text<string>(() => ({\n ...normalizedRequest,\n headers,\n }), ${getBranchOptions(textType)});`\n : `return httpResource<${jsonType ? getBranchReturnType(jsonType) : parsedDataType}>(() => ({\n ...normalizedRequest,\n headers,\n }), ${getBranchOptions(jsonType)});`;\n\n const normalizeRequest = isUrlOnly\n ? `const normalizedRequest: HttpResourceRequest = { url: request };`\n : `const normalizedRequest: HttpResourceRequest = request;`;\n\n return `/**\n * @experimental httpResource is experimental (Angular v19.2+)\n */\n${branchOverloads}\nexport function ${resourceName}(\n ${implementationArgs}\n ): HttpResourceRef<${unionReturnType} | undefined>;\nexport function ${resourceName}(\n ${implementationArgsWithDefault}\n): HttpResourceRef<${unionReturnType} | undefined> {\n ${bodyForm ? `${bodyForm};` : ''}\n const request = ${request};\n ${normalizeRequest}\n const headers = normalizedRequest.headers instanceof HttpHeaders\n ? normalizedRequest.headers.set('Accept', accept)\n : { ...(normalizedRequest.headers ?? {}), Accept: accept };\n\n if (accept.includes('json') || accept.includes('+json')) {\n return httpResource<${jsonType ? getBranchReturnType(jsonType) : parsedDataType}>(() => ({\n ...normalizedRequest,\n headers,\n }), ${getBranchOptions(jsonType)});\n }\n\n if (accept.startsWith('text/') || accept.includes('xml')) {\n return httpResource.text<string>(() => ({\n ...normalizedRequest,\n headers,\n }), ${getBranchOptions(textType)});\n }\n\n ${\n arrayBufferType\n ? `if (accept.includes('octet-stream') || accept.includes('pdf')) {\n return httpResource.arrayBuffer<ArrayBuffer>(() => ({\n ...normalizedRequest,\n headers,\n }), ${getBranchOptions(arrayBufferType)});\n }\n\n `\n : ''\n }${fallbackReturn}\n}\n`;\n }\n\n const resourceOptions = buildHttpResourceOptionsLiteral(\n verbOption,\n resourceFactory,\n output,\n );\n const rawType = getHttpResourceRawType(resourceFactory);\n const resourceValueType = resourceOptions.hasDefaultValue\n ? parsedDataType\n : `${parsedDataType} | undefined`;\n const functionSignatures = buildHttpResourceFunctionSignatures(\n resourceName,\n args,\n parsedDataType,\n rawType,\n resourceOptions.hasDefaultValue,\n omitParse,\n );\n const implementationArgs = appendArgument(\n args,\n buildHttpResourceOptionsArgument(\n parsedDataType,\n rawType,\n {\n requiresDefaultValue: false,\n },\n omitParse,\n ),\n );\n const optionsExpression = buildHttpResourceOptionsExpression(\n resourceOptions.entries,\n );\n const resourceCallOptions = optionsExpression ? `, ${optionsExpression}` : '';\n\n // HttpClient-style mutators expect (config, httpClient) — incompatible with\n // standalone httpResource functions which have no HttpClient instance.\n // Only apply mutators that accept a single argument (request config only).\n const isResourceCompatibleMutator =\n mutator !== undefined && !mutator.hasSecondArg;\n const returnExpression = isResourceCompatibleMutator\n ? `${mutator.name}(request)`\n : 'request';\n\n if (isUrlOnly && !isResourceCompatibleMutator) {\n return `/**\n * @experimental httpResource is experimental (Angular v19.2+)\n */\n${functionSignatures};\nexport function ${resourceName}(${implementationArgs}): HttpResourceRef<${resourceValueType}> {\n return ${resourceFactory}<${parsedDataType}>(() => ${request}${resourceCallOptions});\n}\n`;\n }\n\n return `/**\n * @experimental httpResource is experimental (Angular v19.2+)\n */\n${functionSignatures};\nexport function ${resourceName}(${implementationArgs}): HttpResourceRef<${resourceValueType}> {\n return ${resourceFactory}<${parsedDataType}>(() => {\n ${bodyForm ? `${bodyForm};` : ''}\n const request = ${request};\n return ${returnExpression};\n }${resourceCallOptions});\n}\n`;\n};\n\nconst buildHttpResourceOptionsUtilities = (omitParse: boolean): string => `\nexport type ${HTTP_RESOURCE_OPTIONS_TYPE_NAME}<TValue, TRaw = unknown, TOmitParse extends boolean = ${omitParse}> = TOmitParse extends true\n ? Omit<HttpResourceOptions<TValue, TRaw>, 'parse'>\n : HttpResourceOptions<TValue, TRaw>;\n`;\n\nconst getContentTypeReturnType = (\n contentType: string | undefined,\n value: string,\n): string => {\n if (!contentType) return value;\n if (contentType.includes('json') || contentType.includes('+json')) {\n return value;\n }\n if (contentType.startsWith('text/') || contentType.includes('xml')) {\n return 'string';\n }\n if (isResponseArrayBuffer(contentType)) {\n return 'ArrayBuffer';\n }\n return 'Blob';\n};\n\nconst getHttpResourceGeneratedResponseType = (\n value: string,\n contentType: string | undefined,\n responseImports: readonly { name: string }[],\n output: NormalizedOutputOptions,\n): string => {\n if (\n isZodSchemaOutput(output) &&\n output.override.angular.runtimeValidation &&\n !!contentType &&\n (contentType.includes('json') || contentType.includes('+json')) &&\n !isPrimitiveType(value) &&\n responseImports.some((imp) => imp.name === value)\n ) {\n return getSchemaOutputTypeRef(value);\n }\n\n return getContentTypeReturnType(contentType, value);\n};\n\nconst buildBranchOptionsType = (\n valueType: string,\n rawType: string,\n omitParse: boolean,\n) =>\n `${HTTP_RESOURCE_OPTIONS_TYPE_NAME}<${valueType}, ${rawType}${omitParse ? ', true' : ''}>`;\n\nconst buildResourceStateUtilities = (): string => `\n/**\n * Utility type for httpResource results with status tracking.\n * Inspired by @angular-architects/ngrx-toolkit withResource pattern.\n *\n * Uses \\`globalThis.Error\\` to avoid collision with API model types named \\`Error\\`.\n */\nexport interface ResourceState<T> {\n readonly value: Signal<T | undefined>;\n readonly status: Signal<ResourceStatus>;\n readonly error: Signal<globalThis.Error | undefined>;\n readonly isLoading: Signal<boolean>;\n readonly hasValue: () => boolean;\n readonly reload: () => boolean;\n}\n\n/**\n * Wraps an HttpResourceRef to expose a consistent ResourceState interface.\n * Useful when integrating with NgRx SignalStore via withResource().\n */\nexport function toResourceState<T>(ref: HttpResourceRef<T>): ResourceState<T> {\n return {\n value: ref.value,\n status: ref.status,\n error: ref.error,\n isLoading: ref.isLoading,\n hasValue: () => ref.hasValue(),\n reload: () => ref.reload(),\n };\n}\n`;\n\n/**\n * Generates the header section for Angular `httpResource` output.\n *\n * @remarks\n * Resource functions are emitted in the header phase because their final shape\n * depends on the full set of operations in scope, including generated `Accept`\n * helpers and any shared mutation service methods.\n *\n * @returns The generated header, resource helpers, optional mutation service class, and resource result aliases.\n */\nexport const generateHttpResourceHeader: ClientHeaderBuilder = ({\n title,\n isRequestOptions,\n isMutator,\n isGlobalMutator,\n provideIn,\n output,\n verbOptions,\n tag,\n}) => {\n resetHttpClientReturnTypes();\n resourceReturnTypesRegistry.reset();\n\n // When the output is emitted per-tag (modes: `tags`, `tags-split`) each file\n // must only reference operations that belong to the current tag — otherwise\n // the shared header duplicates helpers across every tag file and pulls in\n // type names the file-local `imports` filter never sees, producing missing\n // schema imports in the generated output.\n const relevantVerbs = tag\n ? Object.values(verbOptions).filter((verbOption) =>\n verbOption.tags.some((t) => camel(t) === camel(tag)),\n )\n : Object.values(verbOptions);\n\n const retrievals = relevantVerbs.filter((verbOption) =>\n isRetrievalVerb(\n verbOption.verb,\n verbOption.operationName,\n getClientOverride(verbOption),\n ),\n );\n const hasResourceQueryParams = retrievals.some(\n (verbOption) => !!verbOption.queryParams,\n );\n const filterParamsHelper = hasResourceQueryParams\n ? `\\n${getAngularFilteredParamsHelperBody()}\\n`\n : '';\n const acceptHelpers = buildAcceptHelpers(retrievals, output);\n\n const resources = retrievals\n .map((verbOption) => {\n const fullRoute = routeRegistry.get(\n verbOption.operationName,\n verbOption.route,\n );\n return buildHttpResourceFunction(verbOption, fullRoute, output);\n })\n .join('\\n');\n const resourceTypes = resourceReturnTypesRegistry.getFooter(\n retrievals.map((verbOption) => verbOption.operationName),\n );\n\n const mutations = relevantVerbs.filter((verbOption) =>\n isMutationVerb(\n verbOption.verb,\n verbOption.operationName,\n getClientOverride(verbOption),\n ),\n );\n const hasMutationQueryParams = mutations.some(\n (verbOption) => !!verbOption.queryParams,\n );\n\n const mutationImplementation = mutations\n .map((verbOption) => {\n const fullRoute = routeRegistry.get(\n verbOption.operationName,\n verbOption.route,\n );\n const generatorOptions: HttpClientGeneratorContext = {\n route: fullRoute,\n context: { output },\n };\n\n return generateHttpClientImplementation(verbOption, generatorOptions);\n })\n .join('\\n');\n\n const classImplementation = mutationImplementation\n ? `\n${buildServiceClassOpen({\n title,\n isRequestOptions,\n isMutator,\n isGlobalMutator,\n provideIn,\n hasQueryParams: hasMutationQueryParams && !hasResourceQueryParams,\n})}\n${mutationImplementation}\n};\n`\n : '';\n\n return `${buildHttpResourceOptionsUtilities(isZodSchemaOutput(output))}${filterParamsHelper}${acceptHelpers ? `${acceptHelpers}\\n\\n` : ''}${resources}${classImplementation}${resourceTypes ? `\\n${resourceTypes}\\n` : ''}`;\n};\n\n/**\n * Generates the footer for Angular `httpResource` output.\n *\n * The footer appends any registered `ClientResult` aliases coming from shared\n * `HttpClient` mutation methods and the resource-state helper utilities emitted\n * for generated Angular resources.\n *\n * @returns The footer text for the generated Angular resource file.\n */\nexport const generateHttpResourceFooter: ClientFooterBuilder = ({\n operationNames,\n}) => {\n const clientTypes = getHttpClientReturnTypes(operationNames);\n const utilities = buildResourceStateUtilities();\n\n return `${clientTypes ? `${clientTypes}\\n` : ''}${utilities}`;\n};\n\n/**\n * Per-operation builder used during Angular `httpResource` generation.\n *\n * Unlike the `HttpClient` builder, the actual implementation body is emitted in\n * the header phase after all operations are known. This function mainly records\n * the resolved route and returns the imports required by the current operation.\n *\n * @returns An empty implementation plus the imports required by the operation.\n */\nexport const generateHttpResourceClient: ClientBuilder = (\n verbOptions,\n options,\n) => {\n routeRegistry.set(verbOptions.operationName, options.route);\n const imports = getHttpResourceVerbImports(\n verbOptions,\n options.context.output,\n );\n\n return { implementation: '\\n', imports };\n};\n\nconst buildHttpResourceFile = (\n verbOptions: Record<string, GeneratorVerbOptions>,\n output: NormalizedOutputOptions,\n context: ContextSpec,\n) => {\n resourceReturnTypesRegistry.reset();\n\n const retrievals = Object.values(verbOptions).filter((verbOption) =>\n isRetrievalVerb(\n verbOption.verb,\n verbOption.operationName,\n getClientOverride(verbOption),\n ),\n );\n\n const hasResourceQueryParams = retrievals.some(\n (verbOption) => !!verbOption.queryParams,\n );\n const filterParamsHelper = hasResourceQueryParams\n ? `\\n${getAngularFilteredParamsHelperBody()}\\n`\n : '';\n\n const resources = retrievals\n .map((verbOption) => {\n const fullRoute = getFullRoute(\n verbOption.route,\n context.spec.servers,\n output.baseUrl,\n );\n return buildHttpResourceFunction(verbOption, fullRoute, output);\n })\n .join('\\n');\n\n const resourceTypes = resourceReturnTypesRegistry.getFooter(\n Object.values(verbOptions).map((verbOption) => verbOption.operationName),\n );\n const utilities = buildResourceStateUtilities();\n const acceptHelpers = buildAcceptHelpers(retrievals, output);\n\n return `${buildHttpResourceOptionsUtilities(isZodSchemaOutput(output))}${filterParamsHelper}${acceptHelpers ? `${acceptHelpers}\\n\\n` : ''}${resources}\\n${resourceTypes ? `${resourceTypes}\\n` : ''}${utilities}`;\n};\n\nconst buildSchemaImportDependencies = (\n output: NormalizedOutputOptions,\n imports: GeneratorImport[],\n relativeSchemasPath: string,\n) => {\n const isZod = isZodSchemaOutput(output);\n const uniqueImports = [\n ...new Map(imports.map((imp) => [imp.name, imp])).values(),\n ];\n\n if (!output.indexFiles) {\n return [...uniqueImports].map((imp) => {\n const baseName = imp.schemaName ?? imp.name;\n const name = conventionName(baseName, output.namingConvention);\n const suffix = isZod ? '.zod' : '';\n const importExtension = output.fileExtension.replace(/\\.ts$/, '');\n return {\n exports: isZod ? [{ ...imp, values: true }] : [imp],\n dependency: upath.joinSafe(\n relativeSchemasPath,\n `${name}${suffix}${importExtension}`,\n ),\n };\n });\n }\n\n if (isZod) {\n return [\n {\n exports: uniqueImports.map((imp) => ({ ...imp, values: true })),\n dependency: relativeSchemasPath,\n },\n ];\n }\n\n return [\n {\n exports: uniqueImports,\n dependency: relativeSchemasPath,\n },\n ];\n};\n\n/**\n * Generates the extra sibling resource file used by Angular `both` mode.\n *\n * @remarks\n * The main generated file keeps the `HttpClient` service class while retrieval\n * resources are emitted into `*.resource.ts` so consumers can opt into both\n * access patterns without mixing the generated surfaces.\n *\n * @returns A single extra file descriptor representing the generated resource file.\n */\nexport const generateHttpResourceExtraFiles: ClientExtraFilesBuilder = (\n verbOptions,\n output,\n context,\n) => {\n const { extension, dirname, filename } = getFileInfo(output.target);\n const outputPath = upath.join(dirname, `${filename}.resource${extension}`);\n const header = getHeader(output.override.header, context.spec.info);\n\n const implementation = buildHttpResourceFile(verbOptions, output, context);\n\n const schemasPath =\n typeof output.schemas === 'string' ? output.schemas : output.schemas?.path;\n const basePath = schemasPath ? getFileInfo(schemasPath).dirname : undefined;\n const relativeSchemasPath = basePath\n ? output.indexFiles\n ? upath.relativeSafe(dirname, basePath)\n : upath.relativeSafe(dirname, basePath)\n : `./${filename}.schemas`;\n\n const schemaImports = buildSchemaImportDependencies(\n output,\n Object.values(verbOptions)\n .filter((verbOption) =>\n isRetrievalVerb(\n verbOption.verb,\n verbOption.operationName,\n getClientOverride(verbOption),\n ),\n )\n .flatMap((verbOption) => getHttpResourceVerbImports(verbOption, output)),\n relativeSchemasPath,\n );\n\n const dependencies = getAngularHttpResourceOnlyDependencies(false, false);\n const importImplementation = generateDependencyImports(\n implementation,\n [...schemaImports, ...dependencies],\n context.projectName,\n !!output.schemas,\n isSyntheticDefaultImportsAllow(output.tsconfig),\n );\n\n const mutators = Object.values(verbOptions)\n .filter((verbOption) =>\n isRetrievalVerb(\n verbOption.verb,\n verbOption.operationName,\n getClientOverride(verbOption),\n ),\n )\n .flatMap((verbOption) => {\n // Only include mutators that are compatible with httpResource (single-arg).\n // HttpClient mutators that require (config, httpClient) are skipped.\n const resourceMutator =\n verbOption.mutator && !verbOption.mutator.hasSecondArg\n ? verbOption.mutator\n : undefined;\n\n return [\n resourceMutator,\n verbOption.formData,\n verbOption.formUrlEncoded,\n verbOption.paramsSerializer,\n ].filter(\n (value): value is NonNullable<typeof value> => value !== undefined,\n );\n });\n\n const mutatorImports =\n mutators.length > 0\n ? generateMutatorImports({\n mutators,\n })\n : '';\n\n const content = `${header}${importImplementation}${mutatorImports}${implementation}`;\n\n return Promise.resolve([\n {\n content,\n path: outputPath,\n },\n ]);\n};\n\nexport { generateAngularTitle } from './utils';\n","import type { AngularOptions, ClientGeneratorsBuilder } from '@orval/core';\n\nimport {\n generateAngular,\n generateAngularFooter,\n generateAngularHeader,\n generateAngularTitle,\n getAngularDependencies,\n} from './http-client';\nimport {\n generateHttpResourceClient,\n generateHttpResourceExtraFiles,\n generateHttpResourceFooter,\n generateHttpResourceHeader,\n getAngularHttpResourceDependencies,\n} from './http-resource';\n\nexport * from './constants';\nexport * from './http-client';\nexport * from './http-resource';\nexport * from './types';\nexport * from './utils';\n\nconst httpClientBuilder: ClientGeneratorsBuilder = {\n client: generateAngular,\n header: generateAngularHeader,\n dependencies: getAngularDependencies,\n footer: generateAngularFooter,\n title: generateAngularTitle,\n};\n\nconst httpResourceBuilder: ClientGeneratorsBuilder = {\n client: generateHttpResourceClient,\n header: generateHttpResourceHeader,\n dependencies: getAngularHttpResourceDependencies,\n footer: generateHttpResourceFooter,\n title: generateAngularTitle,\n};\n\nconst bothClientBuilder: ClientGeneratorsBuilder = {\n ...httpClientBuilder,\n extraFiles: generateHttpResourceExtraFiles,\n};\n\nexport const builder = () => (options?: AngularOptions) => {\n switch (options?.client) {\n case 'httpResource': {\n return httpResourceBuilder;\n }\n case 'both': {\n return bothClientBuilder;\n }\n default: {\n return httpClientBuilder;\n }\n }\n};\n\nexport default builder;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["getContentTypeReturnType"],"sources":["../src/constants.ts","../src/types.ts","../src/utils.ts","../src/http-client.ts","../src/http-resource.ts","../src/index.ts"],"sourcesContent":["import type { GeneratorDependency } from '@orval/core';\n\nexport const ANGULAR_HTTP_CLIENT_DEPENDENCIES = [\n {\n exports: [\n { name: 'HttpClient', values: true },\n { name: 'HttpHeaders', values: true },\n { name: 'HttpParams' },\n { name: 'HttpContext' },\n { name: 'HttpResponse', alias: 'AngularHttpResponse', values: true }, // alias to prevent naming conflict with msw\n { name: 'HttpEvent' },\n ],\n dependency: '@angular/common/http',\n },\n {\n exports: [\n { name: 'Injectable', values: true },\n { name: 'inject', values: true },\n ],\n dependency: '@angular/core',\n },\n {\n exports: [{ name: 'Observable', values: true }],\n dependency: 'rxjs',\n },\n] as const satisfies readonly GeneratorDependency[];\n\nexport const ANGULAR_HTTP_RESOURCE_DEPENDENCIES = [\n {\n exports: [\n { name: 'httpResource', values: true },\n { name: 'HttpResourceOptions' },\n { name: 'HttpResourceRef' },\n { name: 'HttpResourceRequest' },\n { name: 'HttpHeaders', values: true },\n { name: 'HttpParams' },\n { name: 'HttpContext' },\n ],\n dependency: '@angular/common/http',\n },\n {\n exports: [{ name: 'Signal' }, { name: 'ResourceStatus' }],\n dependency: '@angular/core',\n },\n] as const satisfies readonly GeneratorDependency[];\n","/**\n * Code template for the `HttpClientOptions` interface emitted into generated files.\n *\n * This is NOT an import of Angular's type — Angular's HttpClient methods accept\n * inline option objects, not a single unified interface. Orval generates this\n * convenience wrapper so users have a single referenceable type.\n *\n * Properties sourced from Angular HttpClient public API (angular/angular\n * packages/common/http/src/client.ts).\n */\nexport const HTTP_CLIENT_OPTIONS_TEMPLATE = `interface HttpClientOptions {\n readonly headers?: HttpHeaders | Record<string, string | string[]>;\n readonly context?: HttpContext;\n readonly params?:\n | HttpParams\n | Record<string, string | number | boolean | Array<string | number | boolean>>;\n readonly reportProgress?: boolean;\n readonly withCredentials?: boolean;\n readonly credentials?: RequestCredentials;\n readonly keepalive?: boolean;\n readonly priority?: RequestPriority;\n readonly cache?: RequestCache;\n readonly mode?: RequestMode;\n readonly redirect?: RequestRedirect;\n readonly referrer?: string;\n readonly integrity?: string;\n readonly referrerPolicy?: ReferrerPolicy;\n readonly transferCache?: {includeHeaders?: string[]} | boolean;\n readonly timeout?: number;\n}`;\n\n/**\n * Code templates for reusable observe option helpers emitted into generated files.\n */\nexport const HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE = `type HttpClientBodyOptions = HttpClientOptions & {\n readonly observe?: 'body';\n};\n\ntype HttpClientEventOptions = HttpClientOptions & {\n readonly observe: 'events';\n};\n\ntype HttpClientResponseOptions = HttpClientOptions & {\n readonly observe: 'response';\n};\n\ntype HttpClientObserveOptions = HttpClientOptions & {\n readonly observe?: 'body' | 'events' | 'response';\n};`;\n\n/**\n * Code template for the `ThirdParameter` utility type used with custom mutators.\n */\nexport const THIRD_PARAMETER_TEMPLATE = `// eslint-disable-next-line\n type ThirdParameter<T extends (...args: never[]) => unknown> = T extends (\n config: unknown,\n httpClient: unknown,\n args: infer P,\n) => unknown\n ? P\n : never;`;\n","import {\n getAngularFilteredParamsHelperBody,\n getDefaultContentType,\n isBoolean,\n isObject,\n type NormalizedOutputOptions,\n pascal,\n type ResReqTypesValue,\n sanitize,\n type Verbs,\n} from '@orval/core';\n\nimport {\n HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE,\n HTTP_CLIENT_OPTIONS_TEMPLATE,\n THIRD_PARAMETER_TEMPLATE,\n} from './types';\n\nexport type ClientOverride = 'httpClient' | 'httpResource' | 'both';\n\nconst PRIMITIVE_TYPE_VALUES = [\n 'string',\n 'number',\n 'boolean',\n 'void',\n 'unknown',\n] as const;\n\nexport type PrimitiveType = (typeof PRIMITIVE_TYPE_VALUES)[number];\n\nexport const PRIMITIVE_TYPES = new Set(PRIMITIVE_TYPE_VALUES);\n\nconst PRIMITIVE_TYPE_LOOKUP = {\n string: true,\n number: true,\n boolean: true,\n void: true,\n unknown: true,\n} as const satisfies Record<PrimitiveType, true>;\n\nexport const isPrimitiveType = (t: string | undefined): t is PrimitiveType =>\n t != undefined &&\n Object.prototype.hasOwnProperty.call(PRIMITIVE_TYPE_LOOKUP, t);\n\nexport const isZodSchemaOutput = (output: NormalizedOutputOptions): boolean =>\n isObject(output.schemas) && output.schemas.type === 'zod';\n\nexport const isDefined = <T>(v: T | null | undefined): v is T => v != undefined;\n\n/**\n * Maps a schema type name to its Zod output-type reference (`${typeName}Output`).\n */\nexport const getSchemaOutputTypeRef = (typeName: string): string =>\n `${typeName}Output`;\n\nexport const generateAngularTitle = (title: string) => {\n const sanTitle = sanitize(title);\n return `${pascal(sanTitle)}Service`;\n};\n\n/**\n * Builds the opening of an @Injectable Angular service class.\n * Shared between httpClient-only mode and the mutation section of httpResource mode.\n */\nexport const buildServiceClassOpen = ({\n title,\n isRequestOptions,\n isMutator,\n isGlobalMutator,\n provideIn,\n hasQueryParams,\n}: {\n title: string;\n isRequestOptions: boolean;\n isMutator: boolean;\n isGlobalMutator: boolean;\n provideIn: string | boolean | undefined;\n hasQueryParams: boolean;\n}): string => {\n const provideInValue = provideIn\n ? `{ providedIn: '${isBoolean(provideIn) ? 'root' : provideIn}' }`\n : '';\n\n return `\n${\n isRequestOptions && !isGlobalMutator\n ? `${HTTP_CLIENT_OPTIONS_TEMPLATE}\n\n${HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE}\n\n${hasQueryParams ? getAngularFilteredParamsHelperBody() : ''}`\n : ''\n}\n\n${isRequestOptions && isMutator ? THIRD_PARAMETER_TEMPLATE : ''}\n\n@Injectable(${provideInValue})\nexport class ${title} {\n private readonly http = inject(HttpClient);\n`;\n};\n\n/**\n * Registry that maps operationName → full route (with baseUrl).\n *\n * Populated during client builder calls (which receive the full route via\n * GeneratorOptions.route) and read during header/footer builder calls\n * (which only receive verbOptions without routes).\n *\n * This avoids monkey-patching verbOptions with a non-standard `fullRoute` property.\n */\nexport const createRouteRegistry = () => {\n const routes = new Map<string, string>();\n\n return {\n reset() {\n routes.clear();\n },\n set(operationName: string, route: string) {\n routes.set(operationName, route);\n },\n get(operationName: string, fallback: string): string {\n return routes.get(operationName) ?? fallback;\n },\n };\n};\n\nexport const createReturnTypesRegistry = () => {\n const returnTypesToWrite = new Map<string, string>();\n\n return {\n reset() {\n returnTypesToWrite.clear();\n },\n set(operationName: string, typeDefinition: string) {\n returnTypesToWrite.set(operationName, typeDefinition);\n },\n getFooter(operationNames: string[]) {\n const collected: string[] = [];\n for (const operationName of operationNames) {\n const value = returnTypesToWrite.get(operationName);\n if (value) {\n collected.push(value);\n }\n }\n return collected.join('\\n');\n },\n };\n};\n\n/**\n * Determines whether an operation should be generated as an `httpResource()`\n * (retrieval) or as an `HttpClient` method in a service class (mutation).\n *\n * Resolution order:\n * 1. **Per-operation override** — `override.operations.<operationId>.angular.client`\n * in the orval config. `httpResource` forces retrieval, `httpClient` forces mutation.\n * 2. **HTTP verb** — absent a per-operation override, `GET` is treated as a retrieval.\n * 3. **Name heuristic** — For `POST`, if the operationName starts with a\n * retrieval-like prefix (search, list, find, query, get, fetch, lookup)\n * it is treated as a retrieval. This handles common patterns like\n * `POST /search` or `POST /graphql` with query-style operation names.\n *\n * If the heuristic misclassifies an operation, users can override it\n * per-operation in their orval config:\n *\n * ```ts\n * override: {\n * operations: {\n * myPostSearch: { angular: { retrievalClient: 'httpResource' } },\n * getOrCreateUser: { angular: { retrievalClient: 'httpClient' } },\n * }\n * }\n * ```\n */\nexport function isRetrievalVerb(\n verb: Verbs,\n operationName?: string,\n clientOverride?: ClientOverride,\n): boolean {\n // Per-operation override takes precedence\n if (clientOverride === 'httpResource') return true;\n if (clientOverride === 'httpClient') return false;\n\n // Absent a per-operation override, GET is treated as a retrieval\n if (verb === 'get') return true;\n\n // POST with a retrieval-like operation name\n if (verb === 'post' && operationName) {\n const lower = operationName.toLowerCase();\n return /^(search|list|find|query|get|fetch|lookup|filter)/.test(lower);\n }\n return false;\n}\n\nexport function isMutationVerb(\n verb: Verbs,\n operationName?: string,\n clientOverride?: ClientOverride,\n): boolean {\n return !isRetrievalVerb(verb, operationName, clientOverride);\n}\n\nexport function getDefaultSuccessType(\n successTypes: ResReqTypesValue[],\n fallback: string,\n) {\n const uniqueContentTypes = [\n ...new Set(successTypes.map((t) => t.contentType).filter(Boolean)),\n ];\n const jsonContentType = uniqueContentTypes.find((contentType) =>\n contentType.includes('json'),\n );\n const defaultContentType =\n jsonContentType ??\n (uniqueContentTypes.length > 1\n ? getDefaultContentType(uniqueContentTypes)\n : (uniqueContentTypes[0] ?? 'application/json'));\n const defaultType = successTypes.find(\n (t) => t.contentType === defaultContentType,\n );\n\n return {\n contentType: defaultContentType,\n value: defaultType?.value ?? fallback,\n };\n}\n","import {\n camel,\n type ClientBuilder,\n type ClientDependenciesBuilder,\n type ClientFooterBuilder,\n type ClientHeaderBuilder,\n type ContextSpec,\n generateFormDataAndUrlEncodedFunction,\n generateMutatorConfig,\n generateMutatorRequestOptions,\n generateOptions,\n generateVerbImports,\n type GeneratorVerbOptions,\n getAngularFilteredParamsCallExpression,\n getAngularFilteredParamsExpression,\n getAngularFilteredParamsHelperBody,\n getDefaultContentType,\n getEnumImplementation,\n isBoolean,\n pascal,\n toObjectString,\n} from '@orval/core';\n\nimport { ANGULAR_HTTP_CLIENT_DEPENDENCIES } from './constants';\nimport {\n HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE,\n HTTP_CLIENT_OPTIONS_TEMPLATE,\n THIRD_PARAMETER_TEMPLATE,\n} from './types';\nimport {\n createReturnTypesRegistry,\n getSchemaOutputTypeRef,\n isPrimitiveType,\n isZodSchemaOutput,\n} from './utils';\n\n/**\n * Narrowed context for `generateHttpClientImplementation`.\n *\n * The implementation only reads `context.output`, so callers don't need\n * to supply a full `ContextSpec` (which also requires `target`, `workspace`,\n * `spec`, etc.).\n *\n * @remarks\n * This keeps the call sites lightweight when `http-resource.ts` delegates\n * mutation generation back to the shared `HttpClient` implementation builder.\n */\nexport interface HttpClientGeneratorContext {\n route: string;\n context: Pick<ContextSpec, 'output'>;\n}\n\n// NOTE: Module-level singleton — reset() is called at the start of each\n// header builder invocation (generateAngularHeader). Must stay in sync with\n// the generation lifecycle.\nconst returnTypesRegistry = createReturnTypesRegistry();\n\nconst hasSchemaImport = (\n imports: readonly { name: string }[],\n typeName: string | undefined,\n): boolean =>\n typeName != undefined && imports.some((imp) => imp.name === typeName);\n\nconst getSchemaValueRef = (typeName: string): string =>\n typeName === 'Error' ? 'ErrorSchema' : typeName;\n\nconst getContentTypeReturnType = (\n contentType: string | undefined,\n value: string,\n): string => {\n if (!contentType) return value;\n if (contentType.includes('json') || contentType.includes('+json')) {\n return value;\n }\n if (contentType.startsWith('text/') || contentType.includes('xml')) {\n return 'string';\n }\n return 'Blob';\n};\n\n/**\n * Returns the dependency list required by the Angular `HttpClient` generator.\n *\n * These imports are consumed by Orval's generic dependency-import emitter when\n * composing the generated Angular client file.\n *\n * @returns The Angular `HttpClient` dependency descriptors used during import generation.\n */\nexport const getAngularDependencies: ClientDependenciesBuilder = () => [\n ...ANGULAR_HTTP_CLIENT_DEPENDENCIES,\n];\n\n/**\n * Builds the generated TypeScript helper name used for multi-content-type\n * `Accept` header unions.\n *\n * Example: `listPets` -> `ListPetsAccept`.\n *\n * @returns A PascalCase helper type/const name for the operation's `Accept` values.\n */\nexport const getAcceptHelperName = (operationName: string) =>\n `${pascal(operationName)}Accept`;\n\n/**\n * Collects the distinct successful response content types for a single\n * operation.\n *\n * The Angular generators use this to decide whether they need `Accept`\n * overloads or content-type-specific branching logic.\n *\n * @returns A de-duplicated list of response content types, excluding empty entries.\n */\nexport const getUniqueContentTypes = (\n successTypes: GeneratorVerbOptions['response']['types']['success'],\n) => [...new Set(successTypes.map((t) => t.contentType).filter(Boolean))];\n\nconst toAcceptHelperKey = (contentType: string): string =>\n contentType\n .replaceAll(/[^A-Za-z0-9]+/g, '_')\n .replaceAll(/^_+|_+$/g, '')\n .toLowerCase();\n\nconst buildAcceptHelper = (\n operationName: string,\n contentTypes: string[],\n output: ContextSpec['output'],\n): string => {\n const acceptHelperName = getAcceptHelperName(operationName);\n const unionValue = contentTypes\n .map((contentType) => `'${contentType}'`)\n .join(' | ');\n const names = contentTypes.map((contentType) =>\n toAcceptHelperKey(contentType),\n );\n const implementation = getEnumImplementation(\n unionValue,\n names,\n undefined,\n output.override.namingConvention.enum,\n );\n\n return `export type ${acceptHelperName} = typeof ${acceptHelperName}[keyof typeof ${acceptHelperName}];\n\nexport const ${acceptHelperName} = {\n${implementation}} as const;`;\n};\n\n/**\n * Builds the shared `Accept` helper declarations for all operations in the\n * current Angular generation scope.\n *\n * @remarks\n * Helpers are emitted only for operations with more than one successful\n * response content type.\n *\n * @returns Concatenated type/const declarations or an empty string when no helpers are needed.\n */\nexport const buildAcceptHelpers = (\n verbOptions: readonly GeneratorVerbOptions[],\n output: ContextSpec['output'],\n): string =>\n verbOptions\n .flatMap((verbOption) => {\n const contentTypes = getUniqueContentTypes(\n verbOption.response.types.success,\n );\n if (contentTypes.length <= 1) return [];\n\n return [\n buildAcceptHelper(verbOption.operationName, contentTypes, output),\n ];\n })\n .join('\\n\\n');\n\n/**\n * Generates the static header section for Angular `HttpClient` output.\n *\n * Depending on the current generation options this may include:\n * - reusable request option helper types\n * - filtered query-param helper utilities\n * - mutator support types\n * - `Accept` helper unions/constants for multi-content-type operations\n * - the `@Injectable()` service class shell\n *\n * @returns A string containing the prelude and service class opening for the generated file.\n */\nexport const generateAngularHeader: ClientHeaderBuilder = ({\n title,\n isRequestOptions,\n isMutator,\n isGlobalMutator,\n provideIn,\n verbOptions,\n tag,\n output,\n}) => {\n returnTypesRegistry.reset();\n\n const relevantVerbs = tag\n ? Object.values(verbOptions).filter((v) =>\n v.tags.some((t) => camel(t) === camel(tag)),\n )\n : Object.values(verbOptions);\n const hasQueryParams = relevantVerbs.some((v) => v.queryParams);\n const acceptHelpers = buildAcceptHelpers(relevantVerbs, output);\n\n return `\n${\n isRequestOptions && !isGlobalMutator\n ? `${HTTP_CLIENT_OPTIONS_TEMPLATE}\n\n${HTTP_CLIENT_OBSERVE_OPTIONS_TEMPLATE}\n\n${hasQueryParams ? getAngularFilteredParamsHelperBody() : ''}`\n : ''\n}\n\n${isRequestOptions && isMutator ? THIRD_PARAMETER_TEMPLATE : ''}\n\n${acceptHelpers}\n\n@Injectable(${provideIn ? `{ providedIn: '${isBoolean(provideIn) ? 'root' : provideIn}' }` : ''})\nexport class ${title} {\n private readonly http = inject(HttpClient);\n`;\n};\n\n/**\n * Generates the closing section for Angular `HttpClient` output.\n *\n * @remarks\n * Besides closing the generated service class, this appends any collected\n * `ClientResult` aliases registered while individual operations were emitted.\n *\n * @returns The footer text for the generated Angular client file.\n */\nexport const generateAngularFooter: ClientFooterBuilder = ({\n operationNames,\n}) => {\n let footer = '};\\n\\n';\n\n const returnTypes = returnTypesRegistry.getFooter(operationNames);\n if (returnTypes) {\n footer += `${returnTypes}\\n`;\n }\n\n return footer;\n};\n\n/**\n * Generates the Angular `HttpClient` method implementation for a single\n * OpenAPI operation.\n *\n * This function is responsible for:\n * - method signatures and overloads\n * - observe-mode branching\n * - multi-content-type `Accept` handling\n * - mutator integration\n * - runtime Zod validation hooks for Angular output\n * - registering the operation's `ClientResult` alias for footer emission\n *\n * @remarks\n * This is the central implementation builder shared by the dedicated\n * `httpClient` mode and the mutation side of Angular `both` / `httpResource`\n * generation.\n *\n * @returns The complete TypeScript method declaration and implementation for the operation.\n */\nexport const generateHttpClientImplementation = (\n {\n headers,\n queryParams,\n operationName,\n response,\n mutator,\n body,\n props,\n verb,\n override,\n formData,\n formUrlEncoded,\n paramsSerializer,\n }: GeneratorVerbOptions,\n { route, context }: HttpClientGeneratorContext,\n) => {\n const isRequestOptions = override.requestOptions !== false;\n const isFormData = !override.formData.disabled;\n const isFormUrlEncoded = override.formUrlEncoded !== false;\n const isExactOptionalPropertyTypes =\n !!context.output.tsconfig?.compilerOptions?.exactOptionalPropertyTypes;\n const bodyForm = generateFormDataAndUrlEncodedFunction({\n formData,\n formUrlEncoded,\n body,\n isFormData,\n isFormUrlEncoded,\n });\n\n const dataType = response.definition.success || 'unknown';\n const isPrimitive = isPrimitiveType(dataType);\n const hasSchema = hasSchemaImport(response.imports, dataType);\n const isZodOutput = isZodSchemaOutput(context.output);\n const shouldValidateResponse =\n override.angular.runtimeValidation &&\n isZodOutput &&\n !isPrimitive &&\n hasSchema;\n const parsedDataType = shouldValidateResponse\n ? getSchemaOutputTypeRef(dataType)\n : dataType;\n const getGeneratedResponseType = (\n value: string,\n contentType: string | undefined,\n ): string => {\n if (\n override.angular.runtimeValidation &&\n isZodOutput &&\n !!contentType &&\n (contentType.includes('json') || contentType.includes('+json')) &&\n !isPrimitiveType(value) &&\n hasSchemaImport(response.imports, value)\n ) {\n return getSchemaOutputTypeRef(value);\n }\n\n return getContentTypeReturnType(contentType, value);\n };\n const resultAliasType = mutator\n ? dataType\n : response.types.success.length <= 1\n ? parsedDataType\n : [\n ...new Set(\n response.types.success.map(({ value, contentType }) =>\n getGeneratedResponseType(value, contentType),\n ),\n ),\n ].join(' | ') || parsedDataType;\n const schemaValueRef = shouldValidateResponse\n ? getSchemaValueRef(dataType)\n : dataType;\n // When Zod runtime validation is enabled the emitted method signature exposes\n // `parsedDataType` (e.g. `PetsOutput`) directly instead of a caller-overridable\n // `TData` generic. Casting `Schema.parse(data)` to `TData` is unsound because\n // `TData` can be widened/narrowed by callers while the runtime value is always\n // `PetsOutput`. We therefore drop the cast on the validation path and let the\n // inferred return type flow naturally.\n const validationPipe = shouldValidateResponse\n ? `.pipe(map(data => ${schemaValueRef}.parse(data)))`\n : '';\n const responseValidationPipe = shouldValidateResponse\n ? `.pipe(map(response => response.clone({ body: ${schemaValueRef}.parse(response.body) })))`\n : '';\n const eventValidationPipe = shouldValidateResponse\n ? `.pipe(map(event => event instanceof AngularHttpResponse ? event.clone({ body: ${schemaValueRef}.parse(event.body) }) : event))`\n : '';\n\n returnTypesRegistry.set(\n operationName,\n `export type ${pascal(\n operationName,\n )}ClientResult = NonNullable<${resultAliasType}>`,\n );\n\n if (mutator) {\n const mutatorConfig = generateMutatorConfig({\n route,\n body,\n headers,\n queryParams,\n response,\n verb,\n isFormData,\n isFormUrlEncoded,\n hasSignal: false,\n isExactOptionalPropertyTypes,\n isAngular: true,\n });\n\n const requestOptions = isRequestOptions\n ? generateMutatorRequestOptions(\n override.requestOptions,\n mutator.hasThirdArg,\n )\n : '';\n\n const propsImplementation =\n mutator.bodyTypeName && body.definition\n ? toObjectString(props, 'implementation').replace(\n new RegExp(String.raw`(\\\\w*):\\\\s?${body.definition}`),\n `$1: ${mutator.bodyTypeName}<${body.definition}>`,\n )\n : toObjectString(props, 'implementation');\n\n return ` ${operationName}<TData = ${dataType}>(\\n ${propsImplementation}\\n ${\n isRequestOptions && mutator.hasThirdArg\n ? `options?: ThirdParameter<typeof ${mutator.name}>`\n : ''\n }) {${bodyForm}\n return ${mutator.name}<TData>(\n ${mutatorConfig},\n this.http,\n ${requestOptions});\n }\n `;\n }\n\n const optionsBase = {\n route,\n body,\n headers,\n queryParams,\n response,\n verb,\n requestOptions: override.requestOptions,\n isFormData,\n isFormUrlEncoded,\n paramsSerializer,\n paramsSerializerOptions: override.paramsSerializerOptions,\n isAngular: true,\n isExactOptionalPropertyTypes,\n hasSignal: false,\n } as const;\n\n const propsDefinition = toObjectString(props, 'definition');\n\n const successTypes = response.types.success;\n const uniqueContentTypes = getUniqueContentTypes(successTypes);\n const hasMultipleContentTypes = uniqueContentTypes.length > 1;\n const acceptTypeName = hasMultipleContentTypes\n ? getAcceptHelperName(operationName)\n : undefined;\n\n const needsObserveBranching = isRequestOptions && !hasMultipleContentTypes;\n const angularParamsRef = queryParams ? 'filteredParams' : undefined;\n\n let paramsDeclaration = '';\n if (angularParamsRef && queryParams) {\n if (isRequestOptions) {\n // Uses the shared filterParams helper emitted in the file header\n const callExpr = getAngularFilteredParamsCallExpression(\n '{...params, ...options?.params}',\n queryParams.requiredNullableKeys ?? [],\n );\n paramsDeclaration = paramsSerializer\n ? `const ${angularParamsRef} = ${paramsSerializer.name}(${callExpr});\\n\\n `\n : `const ${angularParamsRef} = ${callExpr};\\n\\n `;\n } else {\n // No shared helper available; use inline IIFE filtering\n const iifeExpr = getAngularFilteredParamsExpression(\n 'params ?? {}',\n queryParams.requiredNullableKeys ?? [],\n !!paramsSerializer,\n );\n paramsDeclaration = paramsSerializer\n ? `const ${angularParamsRef} = ${paramsSerializer.name}(${iifeExpr});\\n\\n `\n : `const ${angularParamsRef} = ${iifeExpr};\\n\\n `;\n }\n }\n\n const optionsInput = {\n ...optionsBase,\n ...(angularParamsRef ? { angularParamsRef } : {}),\n } as const;\n\n const options = generateOptions(optionsInput);\n\n const defaultContentType = hasMultipleContentTypes\n ? (successTypes.find(\n ({ contentType }) =>\n !!contentType &&\n (contentType.includes('json') || contentType.includes('+json')),\n )?.contentType ?? getDefaultContentType(uniqueContentTypes))\n : (uniqueContentTypes[0] ?? 'application/json');\n\n const jsonSuccessValues = [\n ...new Set(\n successTypes\n .filter(\n ({ contentType }) =>\n !!contentType &&\n (contentType.includes('json') || contentType.includes('+json')),\n )\n .map(({ value }) => value),\n ),\n ];\n\n const jsonReturnType =\n jsonSuccessValues.length > 0 ? jsonSuccessValues.join(' | ') : 'unknown';\n const parsedJsonReturnType =\n jsonSuccessValues.length === 1 &&\n override.angular.runtimeValidation &&\n isZodOutput &&\n !isPrimitiveType(jsonSuccessValues[0]) &&\n hasSchemaImport(response.imports, jsonSuccessValues[0])\n ? getSchemaOutputTypeRef(jsonSuccessValues[0])\n : jsonReturnType;\n\n let jsonValidationPipe = shouldValidateResponse\n ? `.pipe(map(data => ${schemaValueRef}.parse(data)))`\n : '';\n if (\n hasMultipleContentTypes &&\n !shouldValidateResponse &&\n override.angular.runtimeValidation &&\n isZodOutput &&\n jsonSuccessValues.length === 1\n ) {\n const jsonType = jsonSuccessValues[0];\n const jsonIsPrimitive = isPrimitiveType(jsonType);\n const jsonHasSchema = hasSchemaImport(response.imports, jsonType);\n if (!jsonIsPrimitive && jsonHasSchema) {\n const jsonSchemaRef = getSchemaValueRef(jsonType);\n jsonValidationPipe = `.pipe(map(data => ${jsonSchemaRef}.parse(data)))`;\n }\n }\n\n const textSuccessTypes = successTypes.filter(\n ({ contentType, value }) =>\n !!contentType &&\n (contentType.startsWith('text/') ||\n contentType.includes('xml') ||\n value === 'string'),\n );\n const blobSuccessTypes = successTypes.filter(\n ({ contentType }) =>\n !!contentType &&\n !contentType.includes('json') &&\n !contentType.includes('+json') &&\n !contentType.startsWith('text/') &&\n !contentType.includes('xml'),\n );\n const multiReturnMembers = [\n parsedJsonReturnType,\n ...(textSuccessTypes.length > 0 ? ['string'] : []),\n ...(blobSuccessTypes.length > 0 ? ['Blob'] : []),\n ];\n const uniqueMultiReturnMembers = [...new Set(multiReturnMembers)];\n const refinedMultiImplementationReturnType = `Observable<${uniqueMultiReturnMembers.join(' | ')}>`;\n\n const observeOptions = needsObserveBranching\n ? {\n body: generateOptions({ ...optionsInput, angularObserve: 'body' }),\n events: generateOptions({ ...optionsInput, angularObserve: 'events' }),\n response: generateOptions({\n ...optionsInput,\n angularObserve: 'response',\n }),\n }\n : undefined;\n\n const isModelType =\n dataType !== 'Blob' && dataType !== 'string' && dataType !== 'ArrayBuffer';\n // When the response goes through a Zod runtime validation pipe the runtime\n // value is fixed to `parsedDataType` (e.g. `PetsOutput`), so we avoid\n // exposing a caller-overridable `<TData>` generic on that path.\n const hasTDataGeneric =\n isModelType && !hasMultipleContentTypes && !shouldValidateResponse;\n let functionName = operationName;\n if (hasTDataGeneric) {\n functionName += `<TData = ${parsedDataType}>`;\n }\n\n let contentTypeOverloads = '';\n if (hasMultipleContentTypes && isRequestOptions) {\n const requiredPart = props\n .filter((p) => p.required && !p.default)\n .map((p) => p.definition)\n .join(',\\n ');\n const optionalPart = props\n .filter((p) => !p.required || p.default)\n .map((p) => p.definition)\n .join(',\\n ');\n const branchOverloads = successTypes\n .filter(({ contentType }) => !!contentType)\n .map(({ contentType, value }) => {\n const returnType = getGeneratedResponseType(value, contentType);\n const overloadParams = [\n requiredPart,\n `accept: '${contentType}'`,\n optionalPart,\n ]\n .filter(Boolean)\n .join(',\\n ');\n\n return `${operationName}(${overloadParams}, options?: HttpClientOptions): Observable<${returnType}>;`;\n })\n .join('\\n ');\n const allParams = [\n requiredPart,\n `accept?: ${acceptTypeName ?? 'string'}`,\n optionalPart,\n ]\n .filter(Boolean)\n .join(',\\n ');\n contentTypeOverloads = `${branchOverloads}\\n ${operationName}(${allParams}, options?: HttpClientOptions): ${refinedMultiImplementationReturnType};`;\n }\n\n const observeOverloads =\n isRequestOptions && !hasMultipleContentTypes\n ? `${functionName}(${propsDefinition} options?: HttpClientBodyOptions): Observable<${hasTDataGeneric ? 'TData' : parsedDataType}>;\\n ${functionName}(${propsDefinition} options?: HttpClientEventOptions): Observable<HttpEvent<${hasTDataGeneric ? 'TData' : parsedDataType}>>;\\n ${functionName}(${propsDefinition} options?: HttpClientResponseOptions): Observable<AngularHttpResponse<${hasTDataGeneric ? 'TData' : parsedDataType}>>;`\n : '';\n\n const overloads = contentTypeOverloads || observeOverloads;\n\n const observableDataType = hasTDataGeneric ? 'TData' : parsedDataType;\n const singleImplementationReturnType = isRequestOptions\n ? `Observable<${observableDataType} | HttpEvent<${observableDataType}> | AngularHttpResponse<${observableDataType}>>`\n : `Observable<${observableDataType}>`;\n\n if (hasMultipleContentTypes) {\n const requiredPart = props\n .filter((p) => p.required && !p.default)\n .map((p) => p.implementation)\n .join(',\\n ');\n const optionalPart = props\n .filter((p) => !p.required || p.default)\n .map((p) => p.implementation)\n .join(',\\n ');\n const allParams = [\n requiredPart,\n `accept: ${acceptTypeName ?? 'string'} = '${defaultContentType}'`,\n optionalPart,\n ]\n .filter(Boolean)\n .join(',\\n ');\n\n return ` ${overloads}\n ${operationName}(\n ${allParams},\n ${isRequestOptions ? 'options?: HttpClientOptions' : ''}\n ): ${refinedMultiImplementationReturnType} {${bodyForm}\n ${paramsDeclaration}const headers = options?.headers instanceof HttpHeaders\n ? options.headers.set('Accept', accept)\n : { ...(options?.headers ?? {}), Accept: accept };\n\n if (accept.includes('json') || accept.includes('+json')) {\n return this.http.${verb}<${parsedJsonReturnType}>(\\`${route}\\`, {\n ...options,\n responseType: 'json',\n headers,\n ${angularParamsRef ? `params: ${angularParamsRef},` : ''}\n })${jsonValidationPipe};\n } else if (accept.startsWith('text/') || accept.includes('xml')) {\n return this.http.${verb}(\\`${route}\\`, {\n ...options,\n responseType: 'text',\n headers,\n ${angularParamsRef ? `params: ${angularParamsRef},` : ''}\n }) as Observable<string>;\n }${\n blobSuccessTypes.length > 0\n ? ` else {\n return this.http.${verb}(\\`${route}\\`, {\n ...options,\n responseType: 'blob',\n headers,\n ${angularParamsRef ? `params: ${angularParamsRef},` : ''}\n }) as Observable<Blob>;\n }`\n : `\n\n return this.http.${verb}<${parsedJsonReturnType}>(\\`${route}\\`, {\n ...options,\n responseType: 'json',\n headers,\n ${angularParamsRef ? `params: ${angularParamsRef},` : ''}\n })${jsonValidationPipe};`\n }\n }\n`;\n }\n\n // When the validation pipe is active the runtime payload is always the\n // parsed output type, so we emit `HttpClient.<verb><PetsOutput>(...)`\n // rather than threading a caller-overridable `TData` through the call.\n const httpTypeArg = hasTDataGeneric\n ? '<TData>'\n : shouldValidateResponse && isModelType\n ? `<${parsedDataType}>`\n : '';\n const observeImplementation = isRequestOptions\n ? `${paramsDeclaration}if (options?.observe === 'events') {\n return this.http.${verb}${httpTypeArg}(${observeOptions?.events ?? options})${eventValidationPipe};\n }\n\n if (options?.observe === 'response') {\n return this.http.${verb}${httpTypeArg}(${observeOptions?.response ?? options})${responseValidationPipe};\n }\n\n return this.http.${verb}${httpTypeArg}(${observeOptions?.body ?? options})${validationPipe};`\n : `return this.http.${verb}${httpTypeArg}(${options})${validationPipe};`;\n\n return ` ${overloads}\n ${functionName}(\n ${toObjectString(props, 'implementation')} ${\n isRequestOptions ? `options?: HttpClientObserveOptions` : ''\n }): ${singleImplementationReturnType} {${bodyForm}\n ${observeImplementation}\n }\n`;\n};\n\n/**\n * Orval client builder entry point for Angular `HttpClient` output.\n *\n * It normalizes imports needed for runtime validation, delegates the actual\n * method implementation to `generateHttpClientImplementation`, and returns the\n * generated code plus imports for the current operation.\n *\n * @returns The generated implementation fragment and imports for one operation.\n */\nexport const generateAngular: ClientBuilder = (verbOptions, options) => {\n const isZodOutput = isZodSchemaOutput(options.context.output);\n const responseType = verbOptions.response.definition.success;\n const isPrimitiveResponse = isPrimitiveType(responseType);\n const shouldUseRuntimeValidation =\n verbOptions.override.angular.runtimeValidation && isZodOutput;\n\n const normalizedVerbOptions = (() => {\n if (!shouldUseRuntimeValidation) return verbOptions;\n\n let result: GeneratorVerbOptions = {\n ...verbOptions,\n response: {\n ...verbOptions.response,\n imports: verbOptions.response.imports.map((imp) => ({\n ...imp,\n values: true,\n })),\n },\n };\n\n if (\n !isPrimitiveResponse &&\n hasSchemaImport(result.response.imports, responseType)\n ) {\n result = {\n ...result,\n response: {\n ...result.response,\n imports: [\n ...result.response.imports.map((imp) =>\n imp.name === responseType ? { ...imp, values: true } : imp,\n ),\n { name: getSchemaOutputTypeRef(responseType) },\n ],\n },\n };\n }\n\n const successTypes = result.response.types.success;\n const uniqueContentTypes = [\n ...new Set(successTypes.map((t) => t.contentType).filter(Boolean)),\n ];\n if (uniqueContentTypes.length > 1) {\n const jsonSchemaNames = [\n ...new Set(\n successTypes\n .filter(\n ({ contentType }) =>\n !!contentType &&\n (contentType.includes('json') || contentType.includes('+json')),\n )\n .map(({ value }) => value),\n ),\n ];\n if (jsonSchemaNames.length === 1) {\n const jsonType = jsonSchemaNames[0];\n const jsonIsPrimitive = isPrimitiveType(jsonType);\n if (\n !jsonIsPrimitive &&\n hasSchemaImport(result.response.imports, jsonType)\n ) {\n result = {\n ...result,\n response: {\n ...result.response,\n imports: [\n ...result.response.imports.map((imp) =>\n imp.name === jsonType ? { ...imp, values: true } : imp,\n ),\n { name: getSchemaOutputTypeRef(jsonType) },\n ],\n },\n };\n }\n }\n }\n\n return result;\n })();\n\n const implementation = generateHttpClientImplementation(\n normalizedVerbOptions,\n options,\n );\n\n const imports = [\n ...generateVerbImports(normalizedVerbOptions),\n ...(implementation.includes('.pipe(map(')\n ? [{ name: 'map', values: true, importPath: 'rxjs' }]\n : []),\n ];\n\n return { implementation, imports };\n};\n\n/**\n * Returns the footer aliases collected for the provided operation names.\n *\n * The Angular generators use these aliases to expose stable `ClientResult`\n * helper types such as `ListPetsClientResult`.\n *\n * @returns Concatenated `ClientResult` aliases for the requested operation names.\n */\nexport const getHttpClientReturnTypes = (operationNames: string[]) =>\n returnTypesRegistry.getFooter(operationNames);\n\n/**\n * Clears the module-level return type registry used during Angular client\n * generation.\n *\n * This must be called at the start of each generation pass to avoid leaking\n * aliases across files or tags.\n *\n * @returns Nothing.\n */\nexport const resetHttpClientReturnTypes = () => {\n returnTypesRegistry.reset();\n};\n\nexport { generateAngularTitle } from './utils';\n","import {\n camel,\n type ClientBuilder,\n type ClientDependenciesBuilder,\n type ClientExtraFilesBuilder,\n type ClientFooterBuilder,\n type ClientHeaderBuilder,\n type ContextSpec,\n conventionName,\n escapeRegExp,\n generateDependencyImports,\n generateFormDataAndUrlEncodedFunction,\n generateMutatorImports,\n type GeneratorDependency,\n type GeneratorImport,\n type GeneratorVerbOptions,\n getAngularFilteredParamsCallExpression,\n getAngularFilteredParamsHelperBody,\n getFileInfo,\n getFullRoute,\n GetterPropType,\n isObject,\n isSyntheticDefaultImportsAllow,\n jsDoc,\n kebab,\n type NormalizedOutputOptions,\n type OpenApiInfoObject,\n OutputMode,\n pascal,\n type ResReqTypesValue,\n toObjectString,\n upath,\n} from '@orval/core';\n\nimport {\n ANGULAR_HTTP_CLIENT_DEPENDENCIES,\n ANGULAR_HTTP_RESOURCE_DEPENDENCIES,\n} from './constants';\nimport {\n buildAcceptHelpers,\n generateHttpClientImplementation,\n getAcceptHelperName,\n getHttpClientReturnTypes,\n getUniqueContentTypes,\n type HttpClientGeneratorContext,\n resetHttpClientReturnTypes,\n} from './http-client';\nimport {\n buildServiceClassOpen,\n type ClientOverride,\n createReturnTypesRegistry,\n createRouteRegistry,\n getDefaultSuccessType,\n getSchemaOutputTypeRef,\n isMutationVerb,\n isPrimitiveType,\n isRetrievalVerb,\n isZodSchemaOutput,\n} from './utils';\n\n/**\n * Reads the per-operation angular client override from the orval config.\n *\n * Mirrors the pattern used by `@orval/query` for `operationQueryOptions`:\n * ```ts\n * override: {\n * operations: {\n * myPostSearch: { angular: { retrievalClient: 'httpResource' } },\n * }\n * }\n * ```\n */\ninterface AngularOperationOverride {\n readonly client?: ClientOverride;\n readonly httpResource?: AngularHttpResourceOptionsConfig;\n}\n\ninterface AngularHttpResourceOptionsConfig {\n defaultValue?: unknown;\n debugName?: string;\n injector?: string;\n equal?: string;\n}\n\nconst isAngularHttpResourceOptions = (\n value: unknown,\n): value is AngularHttpResourceOptionsConfig =>\n value === undefined ||\n (isObject(value) &&\n (value.defaultValue === undefined ||\n typeof value.defaultValue === 'string' ||\n typeof value.defaultValue === 'number' ||\n typeof value.defaultValue === 'boolean' ||\n value.defaultValue === null ||\n Array.isArray(value.defaultValue) ||\n isObject(value.defaultValue)) &&\n (value.debugName === undefined || typeof value.debugName === 'string') &&\n (value.injector === undefined || typeof value.injector === 'string') &&\n (value.equal === undefined || typeof value.equal === 'string'));\n\nconst isAngularOperationOverride = (\n value: unknown,\n): value is AngularOperationOverride =>\n value !== undefined &&\n typeof value === 'object' &&\n value !== null &&\n (!('client' in value) ||\n value.client === 'httpClient' ||\n value.client === 'httpResource' ||\n value.client === 'both') &&\n (!('httpResource' in value) ||\n isAngularHttpResourceOptions(value.httpResource));\n\nconst getClientOverride = (\n verbOption: GeneratorVerbOptions,\n): ClientOverride | undefined => {\n const angular =\n verbOption.override.operations[verbOption.operationId]?.angular;\n\n return isAngularOperationOverride(angular) ? angular.client : undefined;\n};\n\n/**\n * Resolves the effective `httpResource` option override for an operation.\n *\n * Operation-level configuration takes precedence over the global\n * `override.angular.httpResource` block while still inheriting unspecified\n * values from the global configuration.\n *\n * @returns The merged resource options for the operation, or `undefined` when no override exists.\n */\nconst getHttpResourceOverride = (\n verbOption: GeneratorVerbOptions,\n output: NormalizedOutputOptions,\n): AngularHttpResourceOptionsConfig | undefined => {\n const operationAngular =\n verbOption.override.operations[verbOption.operationId]?.angular;\n const operationOverride = isAngularOperationOverride(operationAngular)\n ? operationAngular.httpResource\n : undefined;\n const angularOverride = output.override.angular as unknown;\n const globalOverride =\n isObject(angularOverride) &&\n 'httpResource' in angularOverride &&\n isAngularHttpResourceOptions(angularOverride.httpResource)\n ? angularOverride.httpResource\n : undefined;\n\n if (globalOverride === undefined) return operationOverride;\n if (operationOverride === undefined) return globalOverride;\n\n return {\n ...globalOverride,\n ...operationOverride,\n };\n};\n\n// NOTE: Module-level singletons — reset() is called by the header builder\n// (generateAngularHttpResourceHeader) at the start of each generation pass.\nconst resourceReturnTypesRegistry = createReturnTypesRegistry();\n\n/** @internal Exported for testing only */\nexport const routeRegistry = createRouteRegistry();\n\nconst getRelevantVerbOptions = (\n verbOptions: Record<string, GeneratorVerbOptions>,\n tag?: string,\n): GeneratorVerbOptions[] =>\n tag\n ? Object.values(verbOptions).filter((verbOption) =>\n verbOption.tags.some((currentTag) => camel(currentTag) === camel(tag)),\n )\n : Object.values(verbOptions);\n\nconst getVerbOptionsRecord = (\n verbOptions: readonly GeneratorVerbOptions[],\n): Record<string, GeneratorVerbOptions> =>\n Object.fromEntries(\n verbOptions.map((verbOption) => [verbOption.operationId, verbOption]),\n );\n\nconst getPrimaryTag = (verbOption: GeneratorVerbOptions): string =>\n kebab(verbOption.tags[0] ?? 'default');\n\nconst hasRetrievalOperations = (\n verbOptions: Record<string, GeneratorVerbOptions>,\n): boolean =>\n Object.values(verbOptions).some((verbOption) =>\n isRetrievalVerb(\n verbOption.verb,\n verbOption.operationName,\n getClientOverride(verbOption),\n ),\n );\n\nconst getHeader = (\n option: false | ((info: OpenApiInfoObject) => string | string[]),\n info: OpenApiInfoObject | undefined,\n): string => {\n if (!option || !info) {\n return '';\n }\n\n const header = option(info);\n\n return Array.isArray(header) ? jsDoc({ description: header }) : header;\n};\n\nconst mergeDependencies = (\n deps: GeneratorDependency[],\n): GeneratorDependency[] => {\n const merged = new Map<\n string,\n { exports: GeneratorImport[]; dependency: string }\n >();\n\n for (const dep of deps) {\n const existing = merged.get(dep.dependency);\n if (!existing) {\n merged.set(dep.dependency, {\n exports: [...dep.exports],\n dependency: dep.dependency,\n });\n continue;\n }\n\n for (const exp of dep.exports) {\n if (\n !existing.exports.some(\n (current) => current.name === exp.name && current.alias === exp.alias,\n )\n ) {\n existing.exports.push(exp);\n }\n }\n }\n\n return [...merged.values()];\n};\n\nconst cloneDependencies = (\n deps: readonly GeneratorDependency[],\n): GeneratorDependency[] =>\n deps.map((dep) => ({\n ...dep,\n exports: [...dep.exports],\n }));\n\n/**\n * Returns the merged dependency list required when Angular `httpResource`\n * output coexists with Angular `HttpClient` service generation.\n *\n * This is used for pure `httpResource` mode as well as mixed generation paths\n * that still need Angular common HTTP symbols and service helpers.\n *\n * @returns The de-duplicated dependency descriptors for Angular resource generation.\n */\nexport const getAngularHttpResourceDependencies: ClientDependenciesBuilder =\n () =>\n mergeDependencies([\n ...ANGULAR_HTTP_CLIENT_DEPENDENCIES,\n ...ANGULAR_HTTP_RESOURCE_DEPENDENCIES,\n ]);\n\n/**\n * Returns only the dependencies required by standalone generated resource\n * files, such as the sibling `*.resource.ts` output used in `both` mode.\n *\n * @returns The dependency descriptors required by resource-only files.\n */\nexport const getAngularHttpResourceOnlyDependencies: ClientDependenciesBuilder =\n () => cloneDependencies(ANGULAR_HTTP_RESOURCE_DEPENDENCIES);\n\nconst isResponseText = (\n contentType: string | undefined,\n dataType: string,\n): boolean => {\n if (dataType === 'string') return true;\n if (!contentType) return false;\n return contentType.startsWith('text/') || contentType.includes('xml');\n};\n\nconst isResponseArrayBuffer = (contentType: string | undefined): boolean => {\n if (!contentType) return false;\n return (\n contentType.includes('application/octet-stream') ||\n contentType.includes('application/pdf')\n );\n};\n\nconst isResponseBlob = (\n contentType: string | undefined,\n isBlob: boolean,\n): boolean => {\n if (isBlob) return true;\n if (!contentType) return false;\n return contentType.startsWith('image/') || contentType.includes('blob');\n};\n\ntype HttpResourceFactoryName =\n | 'httpResource'\n | 'httpResource.text'\n | 'httpResource.arrayBuffer'\n | 'httpResource.blob';\n\nconst HTTP_RESOURCE_OPTIONS_TYPE_NAME = 'OrvalHttpResourceOptions';\n\nconst getHttpResourceFactory = (\n response: { readonly isBlob: boolean },\n contentType: string | undefined,\n dataType: string,\n): HttpResourceFactoryName => {\n if (isResponseText(contentType, dataType)) return 'httpResource.text';\n if (isResponseBlob(contentType, response.isBlob)) return 'httpResource.blob';\n if (isResponseArrayBuffer(contentType)) return 'httpResource.arrayBuffer';\n return 'httpResource';\n};\n\nconst getHttpResourceRawType = (factory: HttpResourceFactoryName): string => {\n switch (factory) {\n case 'httpResource.text': {\n return 'string';\n }\n case 'httpResource.arrayBuffer': {\n return 'ArrayBuffer';\n }\n case 'httpResource.blob': {\n return 'Blob';\n }\n default: {\n return 'unknown';\n }\n }\n};\n\nconst getTypeWithoutDefault = (definition: string): string => {\n const match = /^([^:]+):\\s*(.+)$/.exec(definition);\n if (!match) return definition;\n return match[2].replace(/\\s*=\\s*.*$/, '').trim();\n};\n\nconst getDefaultValueFromImplementation = (\n implementation: string,\n): string | undefined => {\n const match = /=\\s*(.+)$/.exec(implementation);\n return match ? match[1].trim() : undefined;\n};\n\ninterface SignalProp {\n readonly definition: string;\n readonly implementation: string;\n}\n\nconst withSignal = (\n prop: GeneratorVerbOptions['props'][number],\n options: { readonly hasDefault?: boolean } = {},\n): SignalProp => {\n const type = getTypeWithoutDefault(prop.definition);\n const derivedDefault =\n getDefaultValueFromImplementation(prop.implementation) !== undefined ||\n prop.default !== undefined;\n const hasDefault = options.hasDefault ?? derivedDefault;\n const nameMatch = /^([^:]+):/.exec(prop.definition);\n const namePart = nameMatch ? nameMatch[1] : prop.name;\n const hasOptionalMark = namePart.includes('?');\n const optional = prop.required && !hasDefault && !hasOptionalMark ? '' : '?';\n const definition = `${prop.name}${optional}: Signal<${type}>`;\n\n return {\n definition,\n implementation: definition,\n };\n};\n\nconst buildSignalProps = (\n props: GeneratorVerbOptions['props'],\n params: GeneratorVerbOptions['params'],\n): GeneratorVerbOptions['props'] => {\n const paramDefaults = new Map<string, boolean>();\n for (const param of params) {\n const hasDefault =\n getDefaultValueFromImplementation(param.implementation) !== undefined ||\n param.default !== undefined;\n paramDefaults.set(param.name, hasDefault);\n }\n\n return props.map((prop) => {\n switch (prop.type) {\n case GetterPropType.NAMED_PATH_PARAMS: {\n return {\n ...prop,\n name: 'pathParams',\n definition: `pathParams: Signal<${prop.schema.name}>`,\n implementation: `pathParams: Signal<${prop.schema.name}>`,\n };\n }\n case GetterPropType.PARAM:\n case GetterPropType.QUERY_PARAM:\n case GetterPropType.BODY:\n case GetterPropType.HEADER: {\n const hasDefault =\n prop.type === GetterPropType.PARAM\n ? (paramDefaults.get(prop.name) ?? false)\n : undefined;\n const signalProp = withSignal(prop, { hasDefault });\n return {\n ...prop,\n definition: signalProp.definition,\n implementation: signalProp.implementation,\n };\n }\n default: {\n return prop;\n }\n }\n });\n};\n\nconst applySignalRoute = (\n route: string,\n params: GeneratorVerbOptions['params'],\n useNamedParams: boolean,\n): string => {\n let updatedRoute = route;\n for (const param of params) {\n const template = '${' + param.name + '}';\n const defaultValue = getDefaultValueFromImplementation(\n param.implementation,\n );\n let replacement: string;\n if (useNamedParams) {\n replacement =\n defaultValue === undefined\n ? '${pathParams().' + param.name + '}'\n : '${pathParams()?.' + param.name + ' ?? ' + defaultValue + '}';\n } else {\n replacement =\n defaultValue === undefined\n ? '${' + param.name + '()}'\n : '${' + param.name + '?.() ?? ' + defaultValue + '}';\n }\n updatedRoute = updatedRoute.replaceAll(template, replacement);\n }\n return updatedRoute;\n};\n\ninterface ResourceRequest {\n readonly bodyForm: string;\n readonly request: string;\n readonly isUrlOnly: boolean;\n}\n\nconst buildResourceRequest = (\n {\n verb,\n body,\n headers,\n queryParams,\n paramsSerializer,\n override,\n formData,\n formUrlEncoded,\n }: GeneratorVerbOptions,\n route: string,\n): ResourceRequest => {\n const isFormData = !override.formData.disabled;\n const isFormUrlEncoded = override.formUrlEncoded !== false;\n\n const bodyForm = generateFormDataAndUrlEncodedFunction({\n formData,\n formUrlEncoded,\n body,\n isFormData,\n isFormUrlEncoded,\n });\n\n const hasFormData = isFormData && body.formData;\n const hasFormUrlEncoded = isFormUrlEncoded && body.formUrlEncoded;\n\n const bodyAccess = body.definition\n ? body.isOptional\n ? `${body.implementation}?.()`\n : `${body.implementation}()`\n : undefined;\n const bodyValue = hasFormData\n ? 'formData'\n : hasFormUrlEncoded\n ? 'formUrlEncoded'\n : bodyAccess;\n\n const paramsAccess = queryParams ? 'params?.()' : undefined;\n const headersAccess = headers ? 'headers?.()' : undefined;\n const filteredParamsValue = paramsAccess\n ? getAngularFilteredParamsCallExpression(\n `${paramsAccess} ?? {}`,\n queryParams?.requiredNullableKeys ?? [],\n !!paramsSerializer,\n )\n : undefined;\n const paramsValue = paramsAccess\n ? paramsSerializer\n ? `params?.() ? ${paramsSerializer.name}(${filteredParamsValue}) : undefined`\n : filteredParamsValue\n : undefined;\n\n const isGet = verb === 'get';\n const hasExtras = !isGet || !!bodyValue || !!paramsValue || !!headersAccess;\n const isUrlOnly = !hasExtras && !bodyForm;\n\n const requestLines = [\n `url: \\`${route}\\``,\n isGet ? undefined : `method: '${verb.toUpperCase()}'`,\n bodyValue ? `body: ${bodyValue}` : undefined,\n paramsValue ? `params: ${paramsValue}` : undefined,\n headersAccess ? `headers: ${headersAccess}` : undefined,\n ].filter(Boolean);\n\n const request = isUrlOnly\n ? `\\`${route}\\``\n : `({\\n ${requestLines.join(',\\n ')}\\n })`;\n\n return {\n bodyForm,\n request,\n isUrlOnly,\n };\n};\n\nconst getHttpResourceResponseImports = (\n response: GeneratorVerbOptions['response'],\n): GeneratorImport[] => {\n const successDefinition = response.definition.success;\n if (!successDefinition) return [];\n\n return response.imports.filter((imp) => {\n const name = imp.alias ?? imp.name;\n const pattern = new RegExp(String.raw`\\b${escapeRegExp(name)}\\b`, 'g');\n return pattern.test(successDefinition);\n });\n};\n\nconst getHttpResourceVerbImports = (\n verbOptions: GeneratorVerbOptions,\n output: NormalizedOutputOptions,\n): GeneratorImport[] => {\n const { response, body, queryParams, props, headers, params } = verbOptions;\n const responseImports = isZodSchemaOutput(output)\n ? [\n ...getHttpResourceResponseImports(response).map((imp) => ({\n ...imp,\n values: true,\n })),\n ...getHttpResourceResponseImports(response)\n .filter((imp) => !isPrimitiveType(imp.name))\n .map((imp) => ({ name: getSchemaOutputTypeRef(imp.name) })),\n ]\n : getHttpResourceResponseImports(response);\n\n return [\n ...responseImports,\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 { name: 'map', values: true, importPath: 'rxjs' },\n ];\n};\n\nconst getParseExpression = (\n response: {\n readonly imports: readonly { name: string; isZodSchema?: boolean }[];\n readonly definition: { readonly success?: string };\n },\n factory: HttpResourceFactoryName,\n output: NormalizedOutputOptions,\n responseTypeOverride?: string,\n): string | undefined => {\n if (factory !== 'httpResource') return undefined;\n\n // Explicit isZodSchema flag on imports (forward-compatible)\n const zodSchema = response.imports.find((imp) => imp.isZodSchema);\n if (zodSchema) return `${zodSchema.name}.parse`;\n\n // Check if runtime validation is disabled\n if (!output.override.angular.runtimeValidation) return undefined;\n\n // Auto-detect: when schemas.type === 'zod', use the response type as the schema name\n if (!isZodSchemaOutput(output)) return undefined;\n\n const responseType = responseTypeOverride ?? response.definition.success;\n if (!responseType) return undefined;\n if (isPrimitiveType(responseType)) return undefined;\n\n // Verify a matching import exists (the response type name resolves to a zod schema)\n const hasMatchingImport = response.imports.some(\n (imp) => imp.name === responseType,\n );\n if (!hasMatchingImport) return undefined;\n\n return `${responseType}.parse`;\n};\n\n/**\n * Builds the literal option entries that Orval injects into generated\n * `httpResource()` calls.\n *\n * This merges user-supplied generator configuration such as `defaultValue` or\n * `debugName` with automatically derived runtime-validation hooks like\n * `parse: Schema.parse`.\n *\n * @returns The option entries plus metadata about whether a configured default value exists.\n */\nconst buildHttpResourceOptionsLiteral = (\n verbOption: GeneratorVerbOptions,\n factory: HttpResourceFactoryName,\n output: NormalizedOutputOptions,\n responseTypeOverride?: string,\n): { entries: string[]; hasDefaultValue: boolean } => {\n const override = getHttpResourceOverride(verbOption, output);\n const parseExpression = getParseExpression(\n verbOption.response,\n factory,\n output,\n responseTypeOverride,\n );\n\n const defaultValueLiteral =\n override?.defaultValue === undefined\n ? undefined\n : JSON.stringify(override.defaultValue);\n\n const optionEntries = [\n parseExpression ? `parse: ${parseExpression}` : undefined,\n defaultValueLiteral ? `defaultValue: ${defaultValueLiteral}` : undefined,\n override?.debugName === undefined\n ? undefined\n : `debugName: ${JSON.stringify(override.debugName)}`,\n override?.injector ? `injector: ${override.injector}` : undefined,\n override?.equal ? `equal: ${override.equal}` : undefined,\n ].filter((value): value is string => value !== undefined);\n\n return {\n entries: optionEntries,\n hasDefaultValue: defaultValueLiteral !== undefined,\n };\n};\n\nconst appendArgument = (args: string, argument: string): string => {\n const normalizedArgs = args.trim().replace(/,\\s*$/, '');\n\n return normalizedArgs.length > 0\n ? `${normalizedArgs},\n ${argument}`\n : argument;\n};\n\nconst normalizeOptionalParametersForRequiredTrailingArg = (\n args: string,\n): string =>\n args.replaceAll(/(\\w+)\\?:\\s*([^,\\n]+)(,?)/g, '$1: $2 | undefined$3');\n\nconst buildHttpResourceOptionsArgument = (\n valueType: string,\n rawType: string,\n options: { readonly requiresDefaultValue: boolean },\n omitParse = false,\n): string => {\n const baseType = `${HTTP_RESOURCE_OPTIONS_TYPE_NAME}<${valueType}, ${rawType}${omitParse ? ', true' : ''}>`;\n return options.requiresDefaultValue\n ? `options: ${baseType} & { defaultValue: NoInfer<${valueType}> }`\n : `options?: ${baseType}`;\n};\n\nconst buildHttpResourceOptionsExpression = (\n configuredEntries: readonly string[],\n): string | undefined => {\n if (configuredEntries.length === 0) {\n return 'options';\n }\n\n return `{\n ...(options ?? {}),\n ${configuredEntries.join(',\\n ')}\n }`;\n};\n\nconst buildHttpResourceFunctionSignatures = (\n resourceName: string,\n args: string,\n valueType: string,\n rawType: string,\n hasConfiguredDefaultValue: boolean,\n omitParse = false,\n): string => {\n if (hasConfiguredDefaultValue) {\n return `export function ${resourceName}(${appendArgument(\n args,\n buildHttpResourceOptionsArgument(\n valueType,\n rawType,\n {\n requiresDefaultValue: false,\n },\n omitParse,\n ),\n )}): HttpResourceRef<${valueType}>`;\n }\n\n const overloadArgs = appendArgument(\n normalizeOptionalParametersForRequiredTrailingArg(args),\n buildHttpResourceOptionsArgument(\n valueType,\n rawType,\n {\n requiresDefaultValue: true,\n },\n omitParse,\n ),\n );\n const implementationArgs = appendArgument(\n args,\n buildHttpResourceOptionsArgument(\n valueType,\n rawType,\n {\n requiresDefaultValue: false,\n },\n omitParse,\n ),\n );\n\n return `export function ${resourceName}(${overloadArgs}): HttpResourceRef<${valueType}>;\nexport function ${resourceName}(${implementationArgs}): HttpResourceRef<${valueType} | undefined>`;\n};\n\n/**\n * Generates a single Angular `httpResource` helper function for an operation.\n *\n * The generated output handles signal-wrapped parameters, route interpolation,\n * request-body construction, content-type branching, runtime validation, and\n * optional mutator integration when the mutator is compatible with standalone\n * resource functions.\n *\n * @remarks\n * This function emits overloads when content negotiation or caller-supplied\n * `defaultValue` support requires multiple signatures.\n *\n * @returns A string containing the complete generated resource helper.\n */\nconst buildHttpResourceFunction = (\n verbOption: GeneratorVerbOptions,\n route: string,\n output: NormalizedOutputOptions,\n): string => {\n const { operationName, response, props, params, mutator } = verbOption;\n\n const dataType = response.definition.success || 'unknown';\n const omitParse = isZodSchemaOutput(output);\n const responseSchemaImports = getHttpResourceResponseImports(response);\n const hasResponseSchemaImport = responseSchemaImports.some(\n (imp) => imp.name === dataType,\n );\n const resourceName = `${operationName}Resource`;\n const parsedDataType =\n omitParse &&\n output.override.angular.runtimeValidation &&\n !isPrimitiveType(dataType) &&\n hasResponseSchemaImport\n ? getSchemaOutputTypeRef(dataType)\n : dataType;\n const successTypes = response.types.success;\n const overallReturnType =\n successTypes.length <= 1\n ? parsedDataType\n : [\n ...new Set(\n successTypes.map((type) =>\n getHttpResourceGeneratedResponseType(\n type.value,\n type.contentType,\n responseSchemaImports,\n output,\n ),\n ),\n ),\n ].join(' | ') || parsedDataType;\n resourceReturnTypesRegistry.set(\n operationName,\n `export type ${pascal(\n operationName,\n )}ResourceResult = NonNullable<${overallReturnType}>`,\n );\n const uniqueContentTypes = getUniqueContentTypes(successTypes);\n const defaultSuccess = getDefaultSuccessType(successTypes, dataType);\n const jsonContentType = successTypes.find((type) =>\n type.contentType.includes('json'),\n )?.contentType;\n const preferredContentType = jsonContentType ?? defaultSuccess.contentType;\n const resourceFactory = getHttpResourceFactory(\n response,\n preferredContentType,\n dataType,\n );\n\n const hasNamedParams = props.some(\n (prop) => prop.type === GetterPropType.NAMED_PATH_PARAMS,\n );\n const signalRoute = applySignalRoute(route, params, hasNamedParams);\n\n const signalProps = buildSignalProps(props, params);\n const args = toObjectString(signalProps, 'implementation');\n\n const { bodyForm, request, isUrlOnly } = buildResourceRequest(\n verbOption,\n signalRoute,\n );\n\n if (uniqueContentTypes.length > 1) {\n const defaultContentType = jsonContentType ?? defaultSuccess.contentType;\n const acceptTypeName = getAcceptHelperName(operationName);\n const requiredProps = signalProps.filter(\n (_, index) => props[index]?.required && !props[index]?.default,\n );\n const optionalProps = signalProps.filter(\n (_, index) => !props[index]?.required || props[index]?.default,\n );\n const requiredPart = requiredProps\n .map((prop) => prop.implementation)\n .join(',\\n ');\n const optionalPart = optionalProps\n .map((prop) => prop.implementation)\n .join(',\\n ');\n const getBranchReturnType = (type: ResReqTypesValue) =>\n getHttpResourceGeneratedResponseType(\n type.value,\n type.contentType,\n responseSchemaImports,\n output,\n );\n const unionReturnType = [\n ...new Set(\n successTypes\n .filter((type) => type.contentType)\n .map((type) => getBranchReturnType(type)),\n ),\n ].join(' | ');\n const getBranchRawType = (type: ResReqTypesValue): string =>\n getHttpResourceRawType(\n getHttpResourceFactory(response, type.contentType, type.value),\n );\n // Per-branch options types (one per distinct content-type branch).\n // Deduped so text-like content types (text/plain, application/xml) that\n // share the same factory don't produce duplicate union members.\n const branchOptionsTypes = [\n ...new Set(\n successTypes\n .filter((type) => type.contentType)\n .map((type) =>\n buildBranchOptionsType(\n getBranchReturnType(type),\n getBranchRawType(type),\n omitParse,\n ),\n ),\n ),\n ];\n // The implementation signature accepts the union of branch option types.\n // This keeps each overload's narrow `options` assignable to the\n // implementation signature (required for TS overload compatibility) while\n // preventing mismatched `defaultValue`/`parse` across content types.\n const implementationOptionsType = branchOptionsTypes.join(' | ');\n // Per-accept overloads pin `options` to the branch-specific value/raw\n // types so `defaultValue` / `parse` type-check against the actual content\n // type — e.g. passing a `string` default to the `application/json`\n // overload is now a type error.\n const branchOverloads = successTypes\n .filter((type) => type.contentType)\n .map((type) => {\n const returnType = getBranchReturnType(type);\n const overloadArgs = [\n requiredPart,\n `accept: '${type.contentType}'`,\n optionalPart,\n `options?: ${buildBranchOptionsType(returnType, getBranchRawType(type), omitParse)}`,\n ]\n .filter(Boolean)\n .join(',\\n ');\n\n return `export function ${resourceName}(${overloadArgs}): HttpResourceRef<${returnType} | undefined>;`;\n })\n .join('\\n');\n const implementationArgsWithDefault = [\n requiredPart,\n `accept: ${acceptTypeName} = '${defaultContentType}'`,\n optionalPart,\n `options?: ${implementationOptionsType}`,\n ]\n .filter(Boolean)\n .join(',\\n ');\n\n const getBranchOptions = (type?: ResReqTypesValue) => {\n if (!type) {\n return `options as ${buildBranchOptionsType(unionReturnType, 'unknown', omitParse)}`;\n }\n\n const factory = getHttpResourceFactory(\n response,\n type.contentType,\n type.value,\n );\n const branchOptions = buildHttpResourceOptionsLiteral(\n verbOption,\n factory,\n output,\n type.value,\n );\n const branchOptionsExpression = buildHttpResourceOptionsExpression(\n branchOptions.entries,\n );\n\n return `${branchOptionsExpression ?? 'options'} as unknown as ${buildBranchOptionsType(\n getBranchReturnType(type),\n getHttpResourceRawType(factory),\n omitParse,\n )}`;\n };\n\n const jsonType = successTypes.find(\n (type) =>\n type.contentType.includes('json') || type.contentType.includes('+json'),\n );\n const textType = successTypes.find((type) =>\n isResponseText(type.contentType, type.value),\n );\n const arrayBufferType = successTypes.find((type) =>\n isResponseArrayBuffer(type.contentType),\n );\n const blobType = successTypes.find((type) =>\n isResponseBlob(type.contentType, response.isBlob),\n );\n\n // Fallback path for unknown accept values must match the branch the\n // default `accept` argument targets — pick the success type whose content\n // type is `defaultContentType`, then fall back to the remaining branches\n // in the same priority order as the runtime dispatch above.\n const fallbackType =\n successTypes.find((type) => type.contentType === defaultContentType) ??\n jsonType ??\n textType ??\n arrayBufferType ??\n blobType;\n\n const buildFallbackReturn = (type: ResReqTypesValue): string => {\n const factory = getHttpResourceFactory(\n response,\n type.contentType,\n type.value,\n );\n const returnType =\n factory === 'httpResource'\n ? getBranchReturnType(type)\n : getHttpResourceRawType(factory);\n return `return ${factory}<${returnType}>(() => ({\n ...normalizedRequest,\n headers,\n }), ${getBranchOptions(type)});`;\n };\n\n const fallbackReturn = fallbackType\n ? buildFallbackReturn(fallbackType)\n : `return httpResource<${parsedDataType}>(() => ({\n ...normalizedRequest,\n headers,\n }), ${getBranchOptions()});`;\n\n // Default-accept overload (when `accept` is omitted): narrow `options` to\n // the branch the runtime falls back to, so callers that skip `accept`\n // still get branch-specific typing instead of the broad options union.\n const defaultOverloadOptionsType = fallbackType\n ? buildBranchOptionsType(\n getBranchReturnType(fallbackType),\n getBranchRawType(fallbackType),\n omitParse,\n )\n : implementationOptionsType;\n const defaultOverloadReturnType = fallbackType\n ? getBranchReturnType(fallbackType)\n : unionReturnType;\n const defaultOverloadArgs = [\n requiredPart,\n optionalPart,\n `options?: ${defaultOverloadOptionsType}`,\n ]\n .filter(Boolean)\n .join(',\\n ');\n\n const normalizeRequest = isUrlOnly\n ? `const normalizedRequest: HttpResourceRequest = { url: request };`\n : `const normalizedRequest: HttpResourceRequest = request;`;\n\n return `/**\n * @experimental httpResource is experimental (Angular v19.2+)\n */\n${branchOverloads}\nexport function ${resourceName}(\n ${defaultOverloadArgs}\n ): HttpResourceRef<${defaultOverloadReturnType} | undefined>;\nexport function ${resourceName}(\n ${implementationArgsWithDefault}\n): HttpResourceRef<${unionReturnType} | undefined> {\n ${bodyForm ? `${bodyForm};` : ''}\n const request = ${request};\n ${normalizeRequest}\n const headers = normalizedRequest.headers instanceof HttpHeaders\n ? normalizedRequest.headers.set('Accept', accept)\n : { ...(normalizedRequest.headers ?? {}), Accept: accept };\n\n if (accept.includes('json') || accept.includes('+json')) {\n return httpResource<${jsonType ? getBranchReturnType(jsonType) : parsedDataType}>(() => ({\n ...normalizedRequest,\n headers,\n }), ${getBranchOptions(jsonType)});\n }\n\n if (accept.startsWith('text/') || accept.includes('xml')) {\n return httpResource.text<string>(() => ({\n ...normalizedRequest,\n headers,\n }), ${getBranchOptions(textType)});\n }\n\n ${\n arrayBufferType\n ? `if (accept.includes('octet-stream') || accept.includes('pdf')) {\n return httpResource.arrayBuffer<ArrayBuffer>(() => ({\n ...normalizedRequest,\n headers,\n }), ${getBranchOptions(arrayBufferType)});\n }\n\n `\n : ''\n }${fallbackReturn}\n}\n`;\n }\n\n const resourceOptions = buildHttpResourceOptionsLiteral(\n verbOption,\n resourceFactory,\n output,\n );\n const rawType = getHttpResourceRawType(resourceFactory);\n const resourceValueType = resourceOptions.hasDefaultValue\n ? parsedDataType\n : `${parsedDataType} | undefined`;\n const functionSignatures = buildHttpResourceFunctionSignatures(\n resourceName,\n args,\n parsedDataType,\n rawType,\n resourceOptions.hasDefaultValue,\n omitParse,\n );\n const implementationArgs = appendArgument(\n args,\n buildHttpResourceOptionsArgument(\n parsedDataType,\n rawType,\n {\n requiresDefaultValue: false,\n },\n omitParse,\n ),\n );\n const optionsExpression = buildHttpResourceOptionsExpression(\n resourceOptions.entries,\n );\n const resourceCallOptions = optionsExpression ? `, ${optionsExpression}` : '';\n\n // HttpClient-style mutators expect (config, httpClient) — incompatible with\n // standalone httpResource functions which have no HttpClient instance.\n // Only apply mutators that accept a single argument (request config only).\n const isResourceCompatibleMutator =\n mutator !== undefined && !mutator.hasSecondArg;\n const returnExpression = isResourceCompatibleMutator\n ? `${mutator.name}(request)`\n : 'request';\n\n if (isUrlOnly && !isResourceCompatibleMutator) {\n return `/**\n * @experimental httpResource is experimental (Angular v19.2+)\n */\n${functionSignatures};\nexport function ${resourceName}(${implementationArgs}): HttpResourceRef<${resourceValueType}> {\n return ${resourceFactory}<${parsedDataType}>(() => ${request}${resourceCallOptions});\n}\n`;\n }\n\n return `/**\n * @experimental httpResource is experimental (Angular v19.2+)\n */\n${functionSignatures};\nexport function ${resourceName}(${implementationArgs}): HttpResourceRef<${resourceValueType}> {\n return ${resourceFactory}<${parsedDataType}>(() => {\n ${bodyForm ? `${bodyForm};` : ''}\n const request = ${request};\n return ${returnExpression};\n }${resourceCallOptions});\n}\n`;\n};\n\nconst buildHttpResourceOptionsUtilities = (omitParse: boolean): string => `\nexport type ${HTTP_RESOURCE_OPTIONS_TYPE_NAME}<TValue, TRaw = unknown, TOmitParse extends boolean = ${omitParse}> = TOmitParse extends true\n ? Omit<HttpResourceOptions<TValue, TRaw>, 'parse'>\n : HttpResourceOptions<TValue, TRaw>;\n`;\n\nconst getContentTypeReturnType = (\n contentType: string | undefined,\n value: string,\n): string => {\n if (!contentType) return value;\n if (contentType.includes('json') || contentType.includes('+json')) {\n return value;\n }\n if (contentType.startsWith('text/') || contentType.includes('xml')) {\n return 'string';\n }\n if (isResponseArrayBuffer(contentType)) {\n return 'ArrayBuffer';\n }\n return 'Blob';\n};\n\nconst getHttpResourceGeneratedResponseType = (\n value: string,\n contentType: string | undefined,\n responseImports: readonly { name: string }[],\n output: NormalizedOutputOptions,\n): string => {\n if (\n isZodSchemaOutput(output) &&\n output.override.angular.runtimeValidation &&\n !!contentType &&\n (contentType.includes('json') || contentType.includes('+json')) &&\n !isPrimitiveType(value) &&\n responseImports.some((imp) => imp.name === value)\n ) {\n return getSchemaOutputTypeRef(value);\n }\n\n return getContentTypeReturnType(contentType, value);\n};\n\nconst buildBranchOptionsType = (\n valueType: string,\n rawType: string,\n omitParse: boolean,\n) =>\n `${HTTP_RESOURCE_OPTIONS_TYPE_NAME}<${valueType}, ${rawType}${omitParse ? ', true' : ''}>`;\n\nconst buildResourceStateUtilities = (): string => `\n/**\n * Utility type for httpResource results with status tracking.\n * Inspired by @angular-architects/ngrx-toolkit withResource pattern.\n *\n * Uses \\`globalThis.Error\\` to avoid collision with API model types named \\`Error\\`.\n */\nexport interface ResourceState<T> {\n readonly value: Signal<T | undefined>;\n readonly status: Signal<ResourceStatus>;\n readonly error: Signal<globalThis.Error | undefined>;\n readonly isLoading: Signal<boolean>;\n readonly hasValue: () => boolean;\n readonly reload: () => boolean;\n}\n\n/**\n * Wraps an HttpResourceRef to expose a consistent ResourceState interface.\n * Useful when integrating with NgRx SignalStore via withResource().\n */\nexport function toResourceState<T>(ref: HttpResourceRef<T>): ResourceState<T> {\n return {\n value: ref.value,\n status: ref.status,\n error: ref.error,\n isLoading: ref.isLoading,\n hasValue: () => ref.hasValue(),\n reload: () => ref.reload(),\n };\n}\n`;\n\n/**\n * Generates the header section for Angular `httpResource` output.\n *\n * @remarks\n * Resource functions are emitted in the header phase because their final shape\n * depends on the full set of operations in scope, including generated `Accept`\n * helpers and any shared mutation service methods.\n *\n * @returns The generated header, resource helpers, optional mutation service class, and resource result aliases.\n */\nexport const generateHttpResourceHeader: ClientHeaderBuilder = ({\n title,\n isRequestOptions,\n isMutator,\n isGlobalMutator,\n provideIn,\n output,\n verbOptions,\n tag,\n}) => {\n resetHttpClientReturnTypes();\n resourceReturnTypesRegistry.reset();\n\n // When the output is emitted per-tag (modes: `tags`, `tags-split`) each file\n // must only reference operations that belong to the current tag — otherwise\n // the shared header duplicates helpers across every tag file and pulls in\n // type names the file-local `imports` filter never sees, producing missing\n // schema imports in the generated output.\n const relevantVerbOptions = getRelevantVerbOptions(verbOptions, tag);\n\n const retrievals = relevantVerbOptions.filter((verbOption) =>\n isRetrievalVerb(\n verbOption.verb,\n verbOption.operationName,\n getClientOverride(verbOption),\n ),\n );\n const hasResourceQueryParams = retrievals.some(\n (verbOption) => !!verbOption.queryParams,\n );\n const filterParamsHelper = hasResourceQueryParams\n ? `\\n${getAngularFilteredParamsHelperBody()}\\n`\n : '';\n const acceptHelpers = buildAcceptHelpers(retrievals, output);\n\n const resources = retrievals\n .map((verbOption) => {\n const fullRoute = routeRegistry.get(\n verbOption.operationName,\n verbOption.route,\n );\n return buildHttpResourceFunction(verbOption, fullRoute, output);\n })\n .join('\\n');\n const resourceTypes = resourceReturnTypesRegistry.getFooter(\n retrievals.map((verbOption) => verbOption.operationName),\n );\n\n const mutations = relevantVerbOptions.filter((verbOption) =>\n isMutationVerb(\n verbOption.verb,\n verbOption.operationName,\n getClientOverride(verbOption),\n ),\n );\n const hasMutationQueryParams = mutations.some(\n (verbOption) => !!verbOption.queryParams,\n );\n\n const mutationImplementation = mutations\n .map((verbOption) => {\n const fullRoute = routeRegistry.get(\n verbOption.operationName,\n verbOption.route,\n );\n const generatorOptions: HttpClientGeneratorContext = {\n route: fullRoute,\n context: { output },\n };\n\n return generateHttpClientImplementation(verbOption, generatorOptions);\n })\n .join('\\n');\n\n const classImplementation = mutationImplementation\n ? `\n${buildServiceClassOpen({\n title,\n isRequestOptions,\n isMutator,\n isGlobalMutator,\n provideIn,\n hasQueryParams: hasMutationQueryParams && !hasResourceQueryParams,\n})}\n${mutationImplementation}\n};\n`\n : '';\n\n return `${buildHttpResourceOptionsUtilities(isZodSchemaOutput(output))}${filterParamsHelper}${acceptHelpers ? `${acceptHelpers}\\n\\n` : ''}${resources}${classImplementation}${resourceTypes ? `\\n${resourceTypes}\\n` : ''}`;\n};\n\n/**\n * Generates the footer for Angular `httpResource` output.\n *\n * The footer appends any registered `ClientResult` aliases coming from shared\n * `HttpClient` mutation methods and the resource-state helper utilities emitted\n * for generated Angular resources.\n *\n * @returns The footer text for the generated Angular resource file.\n */\nexport const generateHttpResourceFooter: ClientFooterBuilder = ({\n operationNames,\n}) => {\n const clientTypes = getHttpClientReturnTypes(operationNames);\n const utilities = buildResourceStateUtilities();\n\n return `${clientTypes ? `${clientTypes}\\n` : ''}${utilities}`;\n};\n\n/**\n * Per-operation builder used during Angular `httpResource` generation.\n *\n * Unlike the `HttpClient` builder, the actual implementation body is emitted in\n * the header phase after all operations are known. This function mainly records\n * the resolved route and returns the imports required by the current operation.\n *\n * @returns An empty implementation plus the imports required by the operation.\n */\nexport const generateHttpResourceClient: ClientBuilder = (\n verbOptions,\n options,\n) => {\n routeRegistry.set(verbOptions.operationName, options.route);\n const imports = getHttpResourceVerbImports(\n verbOptions,\n options.context.output,\n );\n\n return { implementation: '\\n', imports };\n};\n\nconst buildHttpResourceFile = (\n verbOptions: Record<string, GeneratorVerbOptions>,\n output: NormalizedOutputOptions,\n context: ContextSpec,\n) => {\n resourceReturnTypesRegistry.reset();\n\n const retrievals = Object.values(verbOptions).filter((verbOption) =>\n isRetrievalVerb(\n verbOption.verb,\n verbOption.operationName,\n getClientOverride(verbOption),\n ),\n );\n\n const hasResourceQueryParams = retrievals.some(\n (verbOption) => !!verbOption.queryParams,\n );\n const filterParamsHelper = hasResourceQueryParams\n ? `\\n${getAngularFilteredParamsHelperBody()}\\n`\n : '';\n\n const resources = retrievals\n .map((verbOption) => {\n const fullRoute = getFullRoute(\n verbOption.route,\n context.spec.servers,\n output.baseUrl,\n );\n return buildHttpResourceFunction(verbOption, fullRoute, output);\n })\n .join('\\n');\n\n const resourceTypes = resourceReturnTypesRegistry.getFooter(\n Object.values(verbOptions).map((verbOption) => verbOption.operationName),\n );\n const utilities = buildResourceStateUtilities();\n const acceptHelpers = buildAcceptHelpers(retrievals, output);\n\n return `${buildHttpResourceOptionsUtilities(isZodSchemaOutput(output))}${filterParamsHelper}${acceptHelpers ? `${acceptHelpers}\\n\\n` : ''}${resources}\\n${resourceTypes ? `${resourceTypes}\\n` : ''}${utilities}`;\n};\n\nconst buildSchemaImportDependencies = (\n output: NormalizedOutputOptions,\n imports: GeneratorImport[],\n relativeSchemasPath: string,\n) => {\n const isZod = isZodSchemaOutput(output);\n const uniqueImports = [\n ...new Map(imports.map((imp) => [imp.name, imp])).values(),\n ];\n\n if (!output.schemas) {\n return [\n {\n exports: isZod\n ? uniqueImports.map((imp) => ({ ...imp, values: true }))\n : uniqueImports,\n dependency: relativeSchemasPath,\n },\n ];\n }\n\n if (!output.indexFiles) {\n return [...uniqueImports].map((imp) => {\n const baseName = imp.schemaName ?? imp.name;\n const name = conventionName(baseName, output.namingConvention);\n const suffix = isZod ? '.zod' : '';\n const importExtension = output.fileExtension.replace(/\\.ts$/, '');\n return {\n exports: isZod ? [{ ...imp, values: true }] : [imp],\n dependency: upath.joinSafe(\n relativeSchemasPath,\n `${name}${suffix}${importExtension}`,\n ),\n };\n });\n }\n\n if (isZod) {\n return [\n {\n exports: uniqueImports.map((imp) => ({ ...imp, values: true })),\n dependency: relativeSchemasPath,\n },\n ];\n }\n\n return [\n {\n exports: uniqueImports,\n dependency: relativeSchemasPath,\n },\n ];\n};\n\nconst getHttpResourceExtraFilePath = (\n output: NormalizedOutputOptions,\n tag?: string,\n): string => {\n const { extension, dirname, filename } = getFileInfo(output.target, {\n extension: output.fileExtension,\n });\n\n switch (output.mode) {\n case OutputMode.TAGS: {\n const normalizedTag = kebab(tag ?? 'default');\n return upath.joinSafe(dirname, `${normalizedTag}.resource${extension}`);\n }\n case OutputMode.TAGS_SPLIT: {\n const normalizedTag = kebab(tag ?? 'default');\n return upath.joinSafe(\n dirname,\n normalizedTag,\n `${normalizedTag}.resource${extension}`,\n );\n }\n default: {\n return upath.joinSafe(dirname, `${filename}.resource${extension}`);\n }\n }\n};\n\nconst getHttpResourceRelativeSchemasPath = (\n output: NormalizedOutputOptions,\n outputPath: string,\n): string => {\n const schemasPath =\n typeof output.schemas === 'string' ? output.schemas : output.schemas?.path;\n\n if (schemasPath) {\n return upath.getRelativeImportPath(\n outputPath,\n getFileInfo(schemasPath).dirname,\n );\n }\n\n const { dirname, filename, extension } = getFileInfo(output.target, {\n extension: output.fileExtension,\n });\n return upath.getRelativeImportPath(\n outputPath,\n upath.joinSafe(dirname, `${filename}.schemas${extension}`),\n output.fileExtension !== '.ts',\n );\n};\n\nconst buildHttpResourceExtraFile = (\n verbOptions: Record<string, GeneratorVerbOptions>,\n outputPath: string,\n output: NormalizedOutputOptions,\n context: ContextSpec,\n header: string,\n) => {\n const implementation = buildHttpResourceFile(verbOptions, output, context);\n const schemaImports = buildSchemaImportDependencies(\n output,\n Object.values(verbOptions)\n .filter((verbOption) =>\n isRetrievalVerb(\n verbOption.verb,\n verbOption.operationName,\n getClientOverride(verbOption),\n ),\n )\n .flatMap((verbOption) => getHttpResourceVerbImports(verbOption, output)),\n getHttpResourceRelativeSchemasPath(output, outputPath),\n );\n\n const dependencies = getAngularHttpResourceOnlyDependencies(false, false);\n const importImplementation = generateDependencyImports(\n implementation,\n [...schemaImports, ...dependencies],\n context.projectName,\n !!output.schemas,\n isSyntheticDefaultImportsAllow(output.tsconfig),\n );\n\n const mutators = Object.values(verbOptions)\n .filter((verbOption) =>\n isRetrievalVerb(\n verbOption.verb,\n verbOption.operationName,\n getClientOverride(verbOption),\n ),\n )\n .flatMap((verbOption) => {\n // Only include mutators that are compatible with httpResource (single-arg).\n // HttpClient mutators that require (config, httpClient) are skipped.\n const resourceMutator =\n verbOption.mutator && !verbOption.mutator.hasSecondArg\n ? verbOption.mutator\n : undefined;\n\n return [\n resourceMutator,\n verbOption.formData,\n verbOption.formUrlEncoded,\n verbOption.paramsSerializer,\n ].filter(\n (value): value is NonNullable<typeof value> => value !== undefined,\n );\n });\n\n const mutatorImports =\n mutators.length > 0\n ? generateMutatorImports({\n mutators,\n oneMore: output.mode === OutputMode.TAGS_SPLIT,\n })\n : '';\n\n return {\n content: `${header}${importImplementation}${mutatorImports}${implementation}`,\n path: outputPath,\n };\n};\n\n/**\n * Generates the extra sibling resource files used by Angular `both` mode.\n *\n * @remarks\n * The main generated file keeps the `HttpClient` service class while retrieval\n * resources are emitted into `*.resource.ts` so consumers can opt into both\n * access patterns without mixing the generated surfaces. In tag-based output\n * modes this emits one sibling resource file per generated tag file.\n *\n * @returns One or more extra file descriptors representing generated resource files.\n */\nexport const generateHttpResourceExtraFiles: ClientExtraFilesBuilder = (\n verbOptions,\n output,\n context,\n) => {\n const header = getHeader(output.override.header, context.spec.info);\n\n if (!hasRetrievalOperations(verbOptions)) {\n return Promise.resolve([]);\n }\n\n if (\n output.mode === OutputMode.TAGS ||\n output.mode === OutputMode.TAGS_SPLIT\n ) {\n const groupedVerbOptions = new Map<\n string,\n Record<string, GeneratorVerbOptions>\n >();\n\n for (const verbOption of Object.values(verbOptions)) {\n const tag = getPrimaryTag(verbOption);\n const currentGroup = groupedVerbOptions.get(tag) ?? {};\n currentGroup[verbOption.operationId] = verbOption;\n groupedVerbOptions.set(tag, currentGroup);\n }\n\n return Promise.resolve(\n [...groupedVerbOptions.entries()]\n .filter(([, tagVerbOptions]) => hasRetrievalOperations(tagVerbOptions))\n .map(([tag, tagVerbOptions]) =>\n buildHttpResourceExtraFile(\n tagVerbOptions,\n getHttpResourceExtraFilePath(output, tag),\n output,\n context,\n header,\n ),\n ),\n );\n }\n\n return Promise.resolve([\n buildHttpResourceExtraFile(\n getVerbOptionsRecord(getRelevantVerbOptions(verbOptions)),\n getHttpResourceExtraFilePath(output),\n output,\n context,\n header,\n ),\n ]);\n};\n\nexport { generateAngularTitle } from './utils';\n","import type { AngularOptions, ClientGeneratorsBuilder } from '@orval/core';\n\nimport {\n generateAngular,\n generateAngularFooter,\n generateAngularHeader,\n generateAngularTitle,\n getAngularDependencies,\n} from './http-client';\nimport {\n generateHttpResourceClient,\n generateHttpResourceExtraFiles,\n generateHttpResourceFooter,\n generateHttpResourceHeader,\n getAngularHttpResourceDependencies,\n} from './http-resource';\n\nexport * from './constants';\nexport * from './http-client';\nexport * from './http-resource';\nexport * from './types';\nexport * from './utils';\n\nconst httpClientBuilder: ClientGeneratorsBuilder = {\n client: generateAngular,\n header: generateAngularHeader,\n dependencies: getAngularDependencies,\n footer: generateAngularFooter,\n title: generateAngularTitle,\n};\n\nconst httpResourceBuilder: ClientGeneratorsBuilder = {\n client: generateHttpResourceClient,\n header: generateHttpResourceHeader,\n dependencies: getAngularHttpResourceDependencies,\n footer: generateHttpResourceFooter,\n title: generateAngularTitle,\n};\n\nconst bothClientBuilder: ClientGeneratorsBuilder = {\n ...httpClientBuilder,\n extraFiles: generateHttpResourceExtraFiles,\n};\n\nexport const builder = () => (options?: AngularOptions) => {\n switch (options?.client) {\n case 'httpResource': {\n return httpResourceBuilder;\n }\n case 'both': {\n return bothClientBuilder;\n }\n default: {\n return httpClientBuilder;\n }\n }\n};\n\nexport default builder;\n"],"mappings":";;AAEA,MAAa,mCAAmC;CAC9C;EACE,SAAS;GACP;IAAE,MAAM;IAAc,QAAQ;IAAM;GACpC;IAAE,MAAM;IAAe,QAAQ;IAAM;GACrC,EAAE,MAAM,cAAc;GACtB,EAAE,MAAM,eAAe;GACvB;IAAE,MAAM;IAAgB,OAAO;IAAuB,QAAQ;IAAM;GACpE,EAAE,MAAM,aAAa;GACtB;EACD,YAAY;EACb;CACD;EACE,SAAS,CACP;GAAE,MAAM;GAAc,QAAQ;GAAM,EACpC;GAAE,MAAM;GAAU,QAAQ;GAAM,CACjC;EACD,YAAY;EACb;CACD;EACE,SAAS,CAAC;GAAE,MAAM;GAAc,QAAQ;GAAM,CAAC;EAC/C,YAAY;EACb;CACF;AAED,MAAa,qCAAqC,CAChD;CACE,SAAS;EACP;GAAE,MAAM;GAAgB,QAAQ;GAAM;EACtC,EAAE,MAAM,uBAAuB;EAC/B,EAAE,MAAM,mBAAmB;EAC3B,EAAE,MAAM,uBAAuB;EAC/B;GAAE,MAAM;GAAe,QAAQ;GAAM;EACrC,EAAE,MAAM,cAAc;EACtB,EAAE,MAAM,eAAe;EACxB;CACD,YAAY;CACb,EACD;CACE,SAAS,CAAC,EAAE,MAAM,UAAU,EAAE,EAAE,MAAM,kBAAkB,CAAC;CACzD,YAAY;CACb,CACF;;;;;;;;;;;;;AClCD,MAAa,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;AAwB5C,MAAa,uCAAuC;;;;;;;;;;;;;;;;;;AAmBpD,MAAa,2BAA2B;;;;;;;;ACvBxC,MAAa,kBAAkB,IAAI,IAVL;CAC5B;CACA;CACA;CACA;CACA;CACD,CAI4D;AAE7D,MAAM,wBAAwB;CAC5B,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,MAAM;CACN,SAAS;CACV;AAED,MAAa,mBAAmB,MAC9B,KAAK,KAAA,KACL,OAAO,UAAU,eAAe,KAAK,uBAAuB,EAAE;AAEhE,MAAa,qBAAqB,WAChC,SAAS,OAAO,QAAQ,IAAI,OAAO,QAAQ,SAAS;AAEtD,MAAa,aAAgB,MAAoC,KAAK,KAAA;;;;AAKtE,MAAa,0BAA0B,aACrC,GAAG,SAAS;AAEd,MAAa,wBAAwB,UAAkB;AAErD,QAAO,GAAG,OADO,SAAS,MAAM,CACN,CAAC;;;;;;AAO7B,MAAa,yBAAyB,EACpC,OACA,kBACA,WACA,iBACA,WACA,qBAQY;CACZ,MAAM,iBAAiB,YACnB,kBAAkB,UAAU,UAAU,GAAG,SAAS,UAAU,OAC5D;AAEJ,QAAO;EAEP,oBAAoB,CAAC,kBACjB,GAAG,6BAA6B;;EAEpC,qCAAqC;;EAErC,iBAAiB,oCAAoC,GAAG,OACpD,GACL;;EAEC,oBAAoB,YAAY,2BAA2B,GAAG;;cAElD,eAAe;eACd,MAAM;;;;;;;;;;;;;AAcrB,MAAa,4BAA4B;CACvC,MAAM,yBAAS,IAAI,KAAqB;AAExC,QAAO;EACL,QAAQ;AACN,UAAO,OAAO;;EAEhB,IAAI,eAAuB,OAAe;AACxC,UAAO,IAAI,eAAe,MAAM;;EAElC,IAAI,eAAuB,UAA0B;AACnD,UAAO,OAAO,IAAI,cAAc,IAAI;;EAEvC;;AAGH,MAAa,kCAAkC;CAC7C,MAAM,qCAAqB,IAAI,KAAqB;AAEpD,QAAO;EACL,QAAQ;AACN,sBAAmB,OAAO;;EAE5B,IAAI,eAAuB,gBAAwB;AACjD,sBAAmB,IAAI,eAAe,eAAe;;EAEvD,UAAU,gBAA0B;GAClC,MAAM,YAAsB,EAAE;AAC9B,QAAK,MAAM,iBAAiB,gBAAgB;IAC1C,MAAM,QAAQ,mBAAmB,IAAI,cAAc;AACnD,QAAI,MACF,WAAU,KAAK,MAAM;;AAGzB,UAAO,UAAU,KAAK,KAAK;;EAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BH,SAAgB,gBACd,MACA,eACA,gBACS;AAET,KAAI,mBAAmB,eAAgB,QAAO;AAC9C,KAAI,mBAAmB,aAAc,QAAO;AAG5C,KAAI,SAAS,MAAO,QAAO;AAG3B,KAAI,SAAS,UAAU,eAAe;EACpC,MAAM,QAAQ,cAAc,aAAa;AACzC,SAAO,oDAAoD,KAAK,MAAM;;AAExE,QAAO;;AAGT,SAAgB,eACd,MACA,eACA,gBACS;AACT,QAAO,CAAC,gBAAgB,MAAM,eAAe,eAAe;;AAG9D,SAAgB,sBACd,cACA,UACA;CACA,MAAM,qBAAqB,CACzB,GAAG,IAAI,IAAI,aAAa,KAAK,MAAM,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,CACnE;CAID,MAAM,qBAHkB,mBAAmB,MAAM,gBAC/C,YAAY,SAAS,OAAO,CAC7B,KAGE,mBAAmB,SAAS,IACzB,sBAAsB,mBAAmB,GACxC,mBAAmB,MAAM;AAKhC,QAAO;EACL,aAAa;EACb,OANkB,aAAa,MAC9B,MAAM,EAAE,gBAAgB,mBAC1B,EAIqB,SAAS;EAC9B;;;;AC1KH,MAAM,sBAAsB,2BAA2B;AAEvD,MAAM,mBACJ,SACA,aAEA,YAAY,KAAA,KAAa,QAAQ,MAAM,QAAQ,IAAI,SAAS,SAAS;AAEvE,MAAM,qBAAqB,aACzB,aAAa,UAAU,gBAAgB;AAEzC,MAAMA,8BACJ,aACA,UACW;AACX,KAAI,CAAC,YAAa,QAAO;AACzB,KAAI,YAAY,SAAS,OAAO,IAAI,YAAY,SAAS,QAAQ,CAC/D,QAAO;AAET,KAAI,YAAY,WAAW,QAAQ,IAAI,YAAY,SAAS,MAAM,CAChE,QAAO;AAET,QAAO;;;;;;;;;;AAWT,MAAa,+BAA0D,CACrE,GAAG,iCACJ;;;;;;;;;AAUD,MAAa,uBAAuB,kBAClC,GAAG,OAAO,cAAc,CAAC;;;;;;;;;;AAW3B,MAAa,yBACX,iBACG,CAAC,GAAG,IAAI,IAAI,aAAa,KAAK,MAAM,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEzE,MAAM,qBAAqB,gBACzB,YACG,WAAW,kBAAkB,IAAI,CACjC,WAAW,YAAY,GAAG,CAC1B,aAAa;AAElB,MAAM,qBACJ,eACA,cACA,WACW;CACX,MAAM,mBAAmB,oBAAoB,cAAc;AAc3D,QAAO,eAAe,iBAAiB,YAAY,iBAAiB,gBAAgB,iBAAiB;;eAExF,iBAAiB;EATP,sBANJ,aAChB,KAAK,gBAAgB,IAAI,YAAY,GAAG,CACxC,KAAK,MAAM,EACA,aAAa,KAAK,gBAC9B,kBAAkB,YAAY,CAC/B,EAIC,KAAA,GACA,OAAO,SAAS,iBAAiB,KAClC,CAKc;;;;;;;;;;;;AAajB,MAAa,sBACX,aACA,WAEA,YACG,SAAS,eAAe;CACvB,MAAM,eAAe,sBACnB,WAAW,SAAS,MAAM,QAC3B;AACD,KAAI,aAAa,UAAU,EAAG,QAAO,EAAE;AAEvC,QAAO,CACL,kBAAkB,WAAW,eAAe,cAAc,OAAO,CAClE;EACD,CACD,KAAK,OAAO;;;;;;;;;;;;;AAcjB,MAAa,yBAA8C,EACzD,OACA,kBACA,WACA,iBACA,WACA,aACA,KACA,aACI;AACJ,qBAAoB,OAAO;CAE3B,MAAM,gBAAgB,MAClB,OAAO,OAAO,YAAY,CAAC,QAAQ,MACjC,EAAE,KAAK,MAAM,MAAM,MAAM,EAAE,KAAK,MAAM,IAAI,CAAC,CAC5C,GACD,OAAO,OAAO,YAAY;CAC9B,MAAM,iBAAiB,cAAc,MAAM,MAAM,EAAE,YAAY;CAC/D,MAAM,gBAAgB,mBAAmB,eAAe,OAAO;AAE/D,QAAO;EAEP,oBAAoB,CAAC,kBACjB,GAAG,6BAA6B;;EAEpC,qCAAqC;;EAErC,iBAAiB,oCAAoC,GAAG,OACpD,GACL;;EAEC,oBAAoB,YAAY,2BAA2B,GAAG;;EAE9D,cAAc;;cAEF,YAAY,kBAAkB,UAAU,UAAU,GAAG,SAAS,UAAU,OAAO,GAAG;eACjF,MAAM;;;;;;;;;;;;;AAcrB,MAAa,yBAA8C,EACzD,qBACI;CACJ,IAAI,SAAS;CAEb,MAAM,cAAc,oBAAoB,UAAU,eAAe;AACjE,KAAI,YACF,WAAU,GAAG,YAAY;AAG3B,QAAO;;;;;;;;;;;;;;;;;;;;;AAsBT,MAAa,oCACX,EACE,SACA,aACA,eACA,UACA,SACA,MACA,OACA,MACA,UACA,UACA,gBACA,oBAEF,EAAE,OAAO,cACN;CACH,MAAM,mBAAmB,SAAS,mBAAmB;CACrD,MAAM,aAAa,CAAC,SAAS,SAAS;CACtC,MAAM,mBAAmB,SAAS,mBAAmB;CACrD,MAAM,+BACJ,CAAC,CAAC,QAAQ,OAAO,UAAU,iBAAiB;CAC9C,MAAM,WAAW,sCAAsC;EACrD;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,WAAW,SAAS,WAAW,WAAW;CAChD,MAAM,cAAc,gBAAgB,SAAS;CAC7C,MAAM,YAAY,gBAAgB,SAAS,SAAS,SAAS;CAC7D,MAAM,cAAc,kBAAkB,QAAQ,OAAO;CACrD,MAAM,yBACJ,SAAS,QAAQ,qBACjB,eACA,CAAC,eACD;CACF,MAAM,iBAAiB,yBACnB,uBAAuB,SAAS,GAChC;CACJ,MAAM,4BACJ,OACA,gBACW;AACX,MACE,SAAS,QAAQ,qBACjB,eACA,CAAC,CAAC,gBACD,YAAY,SAAS,OAAO,IAAI,YAAY,SAAS,QAAQ,KAC9D,CAAC,gBAAgB,MAAM,IACvB,gBAAgB,SAAS,SAAS,MAAM,CAExC,QAAO,uBAAuB,MAAM;AAGtC,SAAOA,2BAAyB,aAAa,MAAM;;CAErD,MAAM,kBAAkB,UACpB,WACA,SAAS,MAAM,QAAQ,UAAU,IAC/B,iBACA,CACE,GAAG,IAAI,IACL,SAAS,MAAM,QAAQ,KAAK,EAAE,OAAO,kBACnC,yBAAyB,OAAO,YAAY,CAC7C,CACF,CACF,CAAC,KAAK,MAAM,IAAI;CACvB,MAAM,iBAAiB,yBACnB,kBAAkB,SAAS,GAC3B;CAOJ,MAAM,iBAAiB,yBACnB,qBAAqB,eAAe,kBACpC;CACJ,MAAM,yBAAyB,yBAC3B,gDAAgD,eAAe,8BAC/D;CACJ,MAAM,sBAAsB,yBACxB,iFAAiF,eAAe,mCAChG;AAEJ,qBAAoB,IAClB,eACA,eAAe,OACb,cACD,CAAC,6BAA6B,gBAAgB,GAChD;AAED,KAAI,SAAS;EACX,MAAM,gBAAgB,sBAAsB;GAC1C;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,WAAW;GACX;GACA,WAAW;GACZ,CAAC;EAEF,MAAM,iBAAiB,mBACnB,8BACE,SAAS,gBACT,QAAQ,YACT,GACD;AAUJ,SAAO,IAAI,cAAc,WAAW,SAAS,UAP3C,QAAQ,gBAAgB,KAAK,aACzB,eAAe,OAAO,iBAAiB,CAAC,QACtC,IAAI,OAAO,OAAO,GAAG,cAAc,KAAK,aAAa,EACrD,OAAO,QAAQ,aAAa,GAAG,KAAK,WAAW,GAChD,GACD,eAAe,OAAO,iBAAiB,CAE8B,KACzE,oBAAoB,QAAQ,cACxB,mCAAmC,QAAQ,KAAK,KAChD,GACL,KAAK,SAAS;eACJ,QAAQ,KAAK;QACpB,cAAc;;QAEd,eAAe;;;;CAKrB,MAAM,cAAc;EAClB;EACA;EACA;EACA;EACA;EACA;EACA,gBAAgB,SAAS;EACzB;EACA;EACA;EACA,yBAAyB,SAAS;EAClC,WAAW;EACX;EACA,WAAW;EACZ;CAED,MAAM,kBAAkB,eAAe,OAAO,aAAa;CAE3D,MAAM,eAAe,SAAS,MAAM;CACpC,MAAM,qBAAqB,sBAAsB,aAAa;CAC9D,MAAM,0BAA0B,mBAAmB,SAAS;CAC5D,MAAM,iBAAiB,0BACnB,oBAAoB,cAAc,GAClC,KAAA;CAEJ,MAAM,wBAAwB,oBAAoB,CAAC;CACnD,MAAM,mBAAmB,cAAc,mBAAmB,KAAA;CAE1D,IAAI,oBAAoB;AACxB,KAAI,oBAAoB,YACtB,KAAI,kBAAkB;EAEpB,MAAM,WAAW,uCACf,mCACA,YAAY,wBAAwB,EAAE,CACvC;AACD,sBAAoB,mBAChB,SAAS,iBAAiB,KAAK,iBAAiB,KAAK,GAAG,SAAS,cACjE,SAAS,iBAAiB,KAAK,SAAS;QACvC;EAEL,MAAM,WAAW,mCACf,gBACA,YAAY,wBAAwB,EAAE,EACtC,CAAC,CAAC,iBACH;AACD,sBAAoB,mBAChB,SAAS,iBAAiB,KAAK,iBAAiB,KAAK,GAAG,SAAS,cACjE,SAAS,iBAAiB,KAAK,SAAS;;CAIhD,MAAM,eAAe;EACnB,GAAG;EACH,GAAI,mBAAmB,EAAE,kBAAkB,GAAG,EAAE;EACjD;CAED,MAAM,UAAU,gBAAgB,aAAa;CAE7C,MAAM,qBAAqB,0BACtB,aAAa,MACX,EAAE,kBACD,CAAC,CAAC,gBACD,YAAY,SAAS,OAAO,IAAI,YAAY,SAAS,QAAQ,EACjE,EAAE,eAAe,sBAAsB,mBAAmB,GAC1D,mBAAmB,MAAM;CAE9B,MAAM,oBAAoB,CACxB,GAAG,IAAI,IACL,aACG,QACE,EAAE,kBACD,CAAC,CAAC,gBACD,YAAY,SAAS,OAAO,IAAI,YAAY,SAAS,QAAQ,EACjE,CACA,KAAK,EAAE,YAAY,MAAM,CAC7B,CACF;CAED,MAAM,iBACJ,kBAAkB,SAAS,IAAI,kBAAkB,KAAK,MAAM,GAAG;CACjE,MAAM,uBACJ,kBAAkB,WAAW,KAC7B,SAAS,QAAQ,qBACjB,eACA,CAAC,gBAAgB,kBAAkB,GAAG,IACtC,gBAAgB,SAAS,SAAS,kBAAkB,GAAG,GACnD,uBAAuB,kBAAkB,GAAG,GAC5C;CAEN,IAAI,qBAAqB,yBACrB,qBAAqB,eAAe,kBACpC;AACJ,KACE,2BACA,CAAC,0BACD,SAAS,QAAQ,qBACjB,eACA,kBAAkB,WAAW,GAC7B;EACA,MAAM,WAAW,kBAAkB;EACnC,MAAM,kBAAkB,gBAAgB,SAAS;EACjD,MAAM,gBAAgB,gBAAgB,SAAS,SAAS,SAAS;AACjE,MAAI,CAAC,mBAAmB,cAEtB,sBAAqB,qBADC,kBAAkB,SAAS,CACO;;CAI5D,MAAM,mBAAmB,aAAa,QACnC,EAAE,aAAa,YACd,CAAC,CAAC,gBACD,YAAY,WAAW,QAAQ,IAC9B,YAAY,SAAS,MAAM,IAC3B,UAAU,UACf;CACD,MAAM,mBAAmB,aAAa,QACnC,EAAE,kBACD,CAAC,CAAC,eACF,CAAC,YAAY,SAAS,OAAO,IAC7B,CAAC,YAAY,SAAS,QAAQ,IAC9B,CAAC,YAAY,WAAW,QAAQ,IAChC,CAAC,YAAY,SAAS,MAAM,CAC/B;CACD,MAAM,qBAAqB;EACzB;EACA,GAAI,iBAAiB,SAAS,IAAI,CAAC,SAAS,GAAG,EAAE;EACjD,GAAI,iBAAiB,SAAS,IAAI,CAAC,OAAO,GAAG,EAAE;EAChD;CAED,MAAM,uCAAuC,cADZ,CAAC,GAAG,IAAI,IAAI,mBAAmB,CAAC,CACmB,KAAK,MAAM,CAAC;CAEhG,MAAM,iBAAiB,wBACnB;EACE,MAAM,gBAAgB;GAAE,GAAG;GAAc,gBAAgB;GAAQ,CAAC;EAClE,QAAQ,gBAAgB;GAAE,GAAG;GAAc,gBAAgB;GAAU,CAAC;EACtE,UAAU,gBAAgB;GACxB,GAAG;GACH,gBAAgB;GACjB,CAAC;EACH,GACD,KAAA;CAEJ,MAAM,cACJ,aAAa,UAAU,aAAa,YAAY,aAAa;CAI/D,MAAM,kBACJ,eAAe,CAAC,2BAA2B,CAAC;CAC9C,IAAI,eAAe;AACnB,KAAI,gBACF,iBAAgB,YAAY,eAAe;CAG7C,IAAI,uBAAuB;AAC3B,KAAI,2BAA2B,kBAAkB;EAC/C,MAAM,eAAe,MAClB,QAAQ,MAAM,EAAE,YAAY,CAAC,EAAE,QAAQ,CACvC,KAAK,MAAM,EAAE,WAAW,CACxB,KAAK,UAAU;EAClB,MAAM,eAAe,MAClB,QAAQ,MAAM,CAAC,EAAE,YAAY,EAAE,QAAQ,CACvC,KAAK,MAAM,EAAE,WAAW,CACxB,KAAK,UAAU;AAuBlB,yBAAuB,GAtBC,aACrB,QAAQ,EAAE,kBAAkB,CAAC,CAAC,YAAY,CAC1C,KAAK,EAAE,aAAa,YAAY;GAC/B,MAAM,aAAa,yBAAyB,OAAO,YAAY;AAS/D,UAAO,GAAG,cAAc,GARD;IACrB;IACA,YAAY,YAAY;IACxB;IACD,CACE,OAAO,QAAQ,CACf,KAAK,UAAU,CAEwB,6CAA6C,WAAW;IAClG,CACD,KAAK,OAAO,CAQ2B,MAAM,cAAc,GAP5C;GAChB;GACA,YAAY,kBAAkB;GAC9B;GACD,CACE,OAAO,QAAQ,CACf,KAAK,UAAU,CACyD,kCAAkC,qCAAqC;;CAGpJ,MAAM,mBACJ,oBAAoB,CAAC,0BACjB,GAAG,aAAa,GAAG,gBAAgB,gDAAgD,kBAAkB,UAAU,eAAe,OAAO,aAAa,GAAG,gBAAgB,2DAA2D,kBAAkB,UAAU,eAAe,QAAQ,aAAa,GAAG,gBAAgB,wEAAwE,kBAAkB,UAAU,eAAe,OACta;CAEN,MAAM,YAAY,wBAAwB;CAE1C,MAAM,qBAAqB,kBAAkB,UAAU;CACvD,MAAM,iCAAiC,mBACnC,cAAc,mBAAmB,eAAe,mBAAmB,0BAA0B,mBAAmB,MAChH,cAAc,mBAAmB;AAErC,KAAI,yBAAyB;EAC3B,MAAM,eAAe,MAClB,QAAQ,MAAM,EAAE,YAAY,CAAC,EAAE,QAAQ,CACvC,KAAK,MAAM,EAAE,eAAe,CAC5B,KAAK,UAAU;EAClB,MAAM,eAAe,MAClB,QAAQ,MAAM,CAAC,EAAE,YAAY,EAAE,QAAQ,CACvC,KAAK,MAAM,EAAE,eAAe,CAC5B,KAAK,UAAU;AASlB,SAAO,IAAI,UAAU;IACrB,cAAc;MATI;GAChB;GACA,WAAW,kBAAkB,SAAS,MAAM,mBAAmB;GAC/D;GACD,CACE,OAAO,QAAQ,CACf,KAAK,UAAU,CAIN;MACV,mBAAmB,gCAAgC,GAAG;OACrD,qCAAqC,IAAI,SAAS;MACnD,kBAAkB;;;;;yBAKC,KAAK,GAAG,qBAAqB,MAAM,MAAM;;;;UAIxD,mBAAmB,WAAW,iBAAiB,KAAK,GAAG;UACvD,mBAAmB;;yBAEJ,KAAK,KAAK,MAAM;;;;UAI/B,mBAAmB,WAAW,iBAAiB,KAAK,GAAG;;OAG3D,iBAAiB,SAAS,IACtB;yBACe,KAAK,KAAK,MAAM;;;;UAI/B,mBAAmB,WAAW,iBAAiB,KAAK,GAAG;;SAGvD;;uBAEa,KAAK,GAAG,qBAAqB,MAAM,MAAM;;;;QAIxD,mBAAmB,WAAW,iBAAiB,KAAK,GAAG;QACvD,mBAAmB,GACtB;;;;CAQH,MAAM,cAAc,kBAChB,YACA,0BAA0B,cACxB,IAAI,eAAe,KACnB;CACN,MAAM,wBAAwB,mBAC1B,GAAG,kBAAkB;yBACF,OAAO,YAAY,GAAG,gBAAgB,UAAU,QAAQ,GAAG,oBAAoB;;;;yBAI/E,OAAO,YAAY,GAAG,gBAAgB,YAAY,QAAQ,GAAG,uBAAuB;;;uBAGtF,OAAO,YAAY,GAAG,gBAAgB,QAAQ,QAAQ,GAAG,eAAe,KACzF,oBAAoB,OAAO,YAAY,GAAG,QAAQ,GAAG,eAAe;AAExE,QAAO,IAAI,UAAU;IACnB,aAAa;MACX,eAAe,OAAO,iBAAiB,CAAC,GACxC,mBAAmB,uCAAuC,GAC3D,KAAK,+BAA+B,IAAI,SAAS;MAChD,sBAAsB;;;;;;;;;;;;;AAc5B,MAAa,mBAAkC,aAAa,YAAY;CACtE,MAAM,cAAc,kBAAkB,QAAQ,QAAQ,OAAO;CAC7D,MAAM,eAAe,YAAY,SAAS,WAAW;CACrD,MAAM,sBAAsB,gBAAgB,aAAa;CACzD,MAAM,6BACJ,YAAY,SAAS,QAAQ,qBAAqB;CAEpD,MAAM,+BAA+B;AACnC,MAAI,CAAC,2BAA4B,QAAO;EAExC,IAAI,SAA+B;GACjC,GAAG;GACH,UAAU;IACR,GAAG,YAAY;IACf,SAAS,YAAY,SAAS,QAAQ,KAAK,SAAS;KAClD,GAAG;KACH,QAAQ;KACT,EAAE;IACJ;GACF;AAED,MACE,CAAC,uBACD,gBAAgB,OAAO,SAAS,SAAS,aAAa,CAEtD,UAAS;GACP,GAAG;GACH,UAAU;IACR,GAAG,OAAO;IACV,SAAS,CACP,GAAG,OAAO,SAAS,QAAQ,KAAK,QAC9B,IAAI,SAAS,eAAe;KAAE,GAAG;KAAK,QAAQ;KAAM,GAAG,IACxD,EACD,EAAE,MAAM,uBAAuB,aAAa,EAAE,CAC/C;IACF;GACF;EAGH,MAAM,eAAe,OAAO,SAAS,MAAM;AAI3C,MAH2B,CACzB,GAAG,IAAI,IAAI,aAAa,KAAK,MAAM,EAAE,YAAY,CAAC,OAAO,QAAQ,CAAC,CACnE,CACsB,SAAS,GAAG;GACjC,MAAM,kBAAkB,CACtB,GAAG,IAAI,IACL,aACG,QACE,EAAE,kBACD,CAAC,CAAC,gBACD,YAAY,SAAS,OAAO,IAAI,YAAY,SAAS,QAAQ,EACjE,CACA,KAAK,EAAE,YAAY,MAAM,CAC7B,CACF;AACD,OAAI,gBAAgB,WAAW,GAAG;IAChC,MAAM,WAAW,gBAAgB;AAEjC,QACE,CAFsB,gBAAgB,SAAS,IAG/C,gBAAgB,OAAO,SAAS,SAAS,SAAS,CAElD,UAAS;KACP,GAAG;KACH,UAAU;MACR,GAAG,OAAO;MACV,SAAS,CACP,GAAG,OAAO,SAAS,QAAQ,KAAK,QAC9B,IAAI,SAAS,WAAW;OAAE,GAAG;OAAK,QAAQ;OAAM,GAAG,IACpD,EACD,EAAE,MAAM,uBAAuB,SAAS,EAAE,CAC3C;MACF;KACF;;;AAKP,SAAO;KACL;CAEJ,MAAM,iBAAiB,iCACrB,uBACA,QACD;AASD,QAAO;EAAE;EAAgB,SAPT,CACd,GAAG,oBAAoB,sBAAsB,EAC7C,GAAI,eAAe,SAAS,aAAa,GACrC,CAAC;GAAE,MAAM;GAAO,QAAQ;GAAM,YAAY;GAAQ,CAAC,GACnD,EAAE,CACP;EAEiC;;;;;;;;;;AAWpC,MAAa,4BAA4B,mBACvC,oBAAoB,UAAU,eAAe;;;;;;;;;;AAW/C,MAAa,mCAAmC;AAC9C,qBAAoB,OAAO;;;;ACzuB7B,MAAM,gCACJ,UAEA,UAAU,KAAA,KACT,SAAS,MAAM,KACb,MAAM,iBAAiB,KAAA,KACtB,OAAO,MAAM,iBAAiB,YAC9B,OAAO,MAAM,iBAAiB,YAC9B,OAAO,MAAM,iBAAiB,aAC9B,MAAM,iBAAiB,QACvB,MAAM,QAAQ,MAAM,aAAa,IACjC,SAAS,MAAM,aAAa,MAC7B,MAAM,cAAc,KAAA,KAAa,OAAO,MAAM,cAAc,cAC5D,MAAM,aAAa,KAAA,KAAa,OAAO,MAAM,aAAa,cAC1D,MAAM,UAAU,KAAA,KAAa,OAAO,MAAM,UAAU;AAEzD,MAAM,8BACJ,UAEA,UAAU,KAAA,KACV,OAAO,UAAU,YACjB,UAAU,SACT,EAAE,YAAY,UACb,MAAM,WAAW,gBACjB,MAAM,WAAW,kBACjB,MAAM,WAAW,YAClB,EAAE,kBAAkB,UACnB,6BAA6B,MAAM,aAAa;AAEpD,MAAM,qBACJ,eAC+B;CAC/B,MAAM,UACJ,WAAW,SAAS,WAAW,WAAW,cAAc;AAE1D,QAAO,2BAA2B,QAAQ,GAAG,QAAQ,SAAS,KAAA;;;;;;;;;;;AAYhE,MAAM,2BACJ,YACA,WACiD;CACjD,MAAM,mBACJ,WAAW,SAAS,WAAW,WAAW,cAAc;CAC1D,MAAM,oBAAoB,2BAA2B,iBAAiB,GAClE,iBAAiB,eACjB,KAAA;CACJ,MAAM,kBAAkB,OAAO,SAAS;CACxC,MAAM,iBACJ,SAAS,gBAAgB,IACzB,kBAAkB,mBAClB,6BAA6B,gBAAgB,aAAa,GACtD,gBAAgB,eAChB,KAAA;AAEN,KAAI,mBAAmB,KAAA,EAAW,QAAO;AACzC,KAAI,sBAAsB,KAAA,EAAW,QAAO;AAE5C,QAAO;EACL,GAAG;EACH,GAAG;EACJ;;AAKH,MAAM,8BAA8B,2BAA2B;;AAG/D,MAAa,gBAAgB,qBAAqB;AAElD,MAAM,0BACJ,aACA,QAEA,MACI,OAAO,OAAO,YAAY,CAAC,QAAQ,eACjC,WAAW,KAAK,MAAM,eAAe,MAAM,WAAW,KAAK,MAAM,IAAI,CAAC,CACvE,GACD,OAAO,OAAO,YAAY;AAEhC,MAAM,wBACJ,gBAEA,OAAO,YACL,YAAY,KAAK,eAAe,CAAC,WAAW,aAAa,WAAW,CAAC,CACtE;AAEH,MAAM,iBAAiB,eACrB,MAAM,WAAW,KAAK,MAAM,UAAU;AAExC,MAAM,0BACJ,gBAEA,OAAO,OAAO,YAAY,CAAC,MAAM,eAC/B,gBACE,WAAW,MACX,WAAW,eACX,kBAAkB,WAAW,CAC9B,CACF;AAEH,MAAM,aACJ,QACA,SACW;AACX,KAAI,CAAC,UAAU,CAAC,KACd,QAAO;CAGT,MAAM,SAAS,OAAO,KAAK;AAE3B,QAAO,MAAM,QAAQ,OAAO,GAAG,MAAM,EAAE,aAAa,QAAQ,CAAC,GAAG;;AAGlE,MAAM,qBACJ,SAC0B;CAC1B,MAAM,yBAAS,IAAI,KAGhB;AAEH,MAAK,MAAM,OAAO,MAAM;EACtB,MAAM,WAAW,OAAO,IAAI,IAAI,WAAW;AAC3C,MAAI,CAAC,UAAU;AACb,UAAO,IAAI,IAAI,YAAY;IACzB,SAAS,CAAC,GAAG,IAAI,QAAQ;IACzB,YAAY,IAAI;IACjB,CAAC;AACF;;AAGF,OAAK,MAAM,OAAO,IAAI,QACpB,KACE,CAAC,SAAS,QAAQ,MACf,YAAY,QAAQ,SAAS,IAAI,QAAQ,QAAQ,UAAU,IAAI,MACjE,CAED,UAAS,QAAQ,KAAK,IAAI;;AAKhC,QAAO,CAAC,GAAG,OAAO,QAAQ,CAAC;;AAG7B,MAAM,qBACJ,SAEA,KAAK,KAAK,SAAS;CACjB,GAAG;CACH,SAAS,CAAC,GAAG,IAAI,QAAQ;CAC1B,EAAE;;;;;;;;;;AAWL,MAAa,2CAET,kBAAkB,CAChB,GAAG,kCACH,GAAG,mCACJ,CAAC;;;;;;;AAQN,MAAa,+CACL,kBAAkB,mCAAmC;AAE7D,MAAM,kBACJ,aACA,aACY;AACZ,KAAI,aAAa,SAAU,QAAO;AAClC,KAAI,CAAC,YAAa,QAAO;AACzB,QAAO,YAAY,WAAW,QAAQ,IAAI,YAAY,SAAS,MAAM;;AAGvE,MAAM,yBAAyB,gBAA6C;AAC1E,KAAI,CAAC,YAAa,QAAO;AACzB,QACE,YAAY,SAAS,2BAA2B,IAChD,YAAY,SAAS,kBAAkB;;AAI3C,MAAM,kBACJ,aACA,WACY;AACZ,KAAI,OAAQ,QAAO;AACnB,KAAI,CAAC,YAAa,QAAO;AACzB,QAAO,YAAY,WAAW,SAAS,IAAI,YAAY,SAAS,OAAO;;AASzE,MAAM,kCAAkC;AAExC,MAAM,0BACJ,UACA,aACA,aAC4B;AAC5B,KAAI,eAAe,aAAa,SAAS,CAAE,QAAO;AAClD,KAAI,eAAe,aAAa,SAAS,OAAO,CAAE,QAAO;AACzD,KAAI,sBAAsB,YAAY,CAAE,QAAO;AAC/C,QAAO;;AAGT,MAAM,0BAA0B,YAA6C;AAC3E,SAAQ,SAAR;EACE,KAAK,oBACH,QAAO;EAET,KAAK,2BACH,QAAO;EAET,KAAK,oBACH,QAAO;EAET,QACE,QAAO;;;AAKb,MAAM,yBAAyB,eAA+B;CAC5D,MAAM,QAAQ,oBAAoB,KAAK,WAAW;AAClD,KAAI,CAAC,MAAO,QAAO;AACnB,QAAO,MAAM,GAAG,QAAQ,cAAc,GAAG,CAAC,MAAM;;AAGlD,MAAM,qCACJ,mBACuB;CACvB,MAAM,QAAQ,YAAY,KAAK,eAAe;AAC9C,QAAO,QAAQ,MAAM,GAAG,MAAM,GAAG,KAAA;;AAQnC,MAAM,cACJ,MACA,UAA6C,EAAE,KAChC;CACf,MAAM,OAAO,sBAAsB,KAAK,WAAW;CACnD,MAAM,iBACJ,kCAAkC,KAAK,eAAe,KAAK,KAAA,KAC3D,KAAK,YAAY,KAAA;CACnB,MAAM,aAAa,QAAQ,cAAc;CACzC,MAAM,YAAY,YAAY,KAAK,KAAK,WAAW;CAEnD,MAAM,mBADW,YAAY,UAAU,KAAK,KAAK,MAChB,SAAS,IAAI;CAC9C,MAAM,WAAW,KAAK,YAAY,CAAC,cAAc,CAAC,kBAAkB,KAAK;CACzE,MAAM,aAAa,GAAG,KAAK,OAAO,SAAS,WAAW,KAAK;AAE3D,QAAO;EACL;EACA,gBAAgB;EACjB;;AAGH,MAAM,oBACJ,OACA,WACkC;CAClC,MAAM,gCAAgB,IAAI,KAAsB;AAChD,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,aACJ,kCAAkC,MAAM,eAAe,KAAK,KAAA,KAC5D,MAAM,YAAY,KAAA;AACpB,gBAAc,IAAI,MAAM,MAAM,WAAW;;AAG3C,QAAO,MAAM,KAAK,SAAS;AACzB,UAAQ,KAAK,MAAb;GACE,KAAK,eAAe,kBAClB,QAAO;IACL,GAAG;IACH,MAAM;IACN,YAAY,sBAAsB,KAAK,OAAO,KAAK;IACnD,gBAAgB,sBAAsB,KAAK,OAAO,KAAK;IACxD;GAEH,KAAK,eAAe;GACpB,KAAK,eAAe;GACpB,KAAK,eAAe;GACpB,KAAK,eAAe,QAAQ;IAK1B,MAAM,aAAa,WAAW,MAAM,EAAE,YAHpC,KAAK,SAAS,eAAe,QACxB,cAAc,IAAI,KAAK,KAAK,IAAI,QACjC,KAAA,GAC4C,CAAC;AACnD,WAAO;KACL,GAAG;KACH,YAAY,WAAW;KACvB,gBAAgB,WAAW;KAC5B;;GAEH,QACE,QAAO;;GAGX;;AAGJ,MAAM,oBACJ,OACA,QACA,mBACW;CACX,IAAI,eAAe;AACnB,MAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,WAAW,OAAO,MAAM,OAAO;EACrC,MAAM,eAAe,kCACnB,MAAM,eACP;EACD,IAAI;AACJ,MAAI,eACF,eACE,iBAAiB,KAAA,IACb,oBAAoB,MAAM,OAAO,MACjC,qBAAqB,MAAM,OAAO,SAAS,eAAe;MAEhE,eACE,iBAAiB,KAAA,IACb,OAAO,MAAM,OAAO,QACpB,OAAO,MAAM,OAAO,aAAa,eAAe;AAExD,iBAAe,aAAa,WAAW,UAAU,YAAY;;AAE/D,QAAO;;AAST,MAAM,wBACJ,EACE,MACA,MACA,SACA,aACA,kBACA,UACA,UACA,kBAEF,UACoB;CACpB,MAAM,aAAa,CAAC,SAAS,SAAS;CACtC,MAAM,mBAAmB,SAAS,mBAAmB;CAErD,MAAM,WAAW,sCAAsC;EACrD;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,cAAc,cAAc,KAAK;CACvC,MAAM,oBAAoB,oBAAoB,KAAK;CAEnD,MAAM,aAAa,KAAK,aACpB,KAAK,aACH,GAAG,KAAK,eAAe,QACvB,GAAG,KAAK,eAAe,MACzB,KAAA;CACJ,MAAM,YAAY,cACd,aACA,oBACE,mBACA;CAEN,MAAM,eAAe,cAAc,eAAe,KAAA;CAClD,MAAM,gBAAgB,UAAU,gBAAgB,KAAA;CAChD,MAAM,sBAAsB,eACxB,uCACE,GAAG,aAAa,SAChB,aAAa,wBAAwB,EAAE,EACvC,CAAC,CAAC,iBACH,GACD,KAAA;CACJ,MAAM,cAAc,eAChB,mBACE,gBAAgB,iBAAiB,KAAK,GAAG,oBAAoB,iBAC7D,sBACF,KAAA;CAEJ,MAAM,QAAQ,SAAS;CAEvB,MAAM,YAAY,EADA,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC,CAAC,eAAe,CAAC,CAAC,kBAC9B,CAAC;CAEjC,MAAM,eAAe;EACnB,UAAU,MAAM;EAChB,QAAQ,KAAA,IAAY,YAAY,KAAK,aAAa,CAAC;EACnD,YAAY,SAAS,cAAc,KAAA;EACnC,cAAc,WAAW,gBAAgB,KAAA;EACzC,gBAAgB,YAAY,kBAAkB,KAAA;EAC/C,CAAC,OAAO,QAAQ;AAMjB,QAAO;EACL;EACA,SANc,YACZ,KAAK,MAAM,MACX,aAAa,aAAa,KAAK,YAAY,CAAC;EAK9C;EACD;;AAGH,MAAM,kCACJ,aACsB;CACtB,MAAM,oBAAoB,SAAS,WAAW;AAC9C,KAAI,CAAC,kBAAmB,QAAO,EAAE;AAEjC,QAAO,SAAS,QAAQ,QAAQ,QAAQ;EACtC,MAAM,OAAO,IAAI,SAAS,IAAI;AAE9B,SADgB,IAAI,OAAO,OAAO,GAAG,KAAK,aAAa,KAAK,CAAC,KAAK,IAAI,CACvD,KAAK,kBAAkB;GACtC;;AAGJ,MAAM,8BACJ,aACA,WACsB;CACtB,MAAM,EAAE,UAAU,MAAM,aAAa,OAAO,SAAS,WAAW;AAahE,QAAO;EACL,GAbsB,kBAAkB,OAAO,GAC7C,CACE,GAAG,+BAA+B,SAAS,CAAC,KAAK,SAAS;GACxD,GAAG;GACH,QAAQ;GACT,EAAE,EACH,GAAG,+BAA+B,SAAS,CACxC,QAAQ,QAAQ,CAAC,gBAAgB,IAAI,KAAK,CAAC,CAC3C,KAAK,SAAS,EAAE,MAAM,uBAAuB,IAAI,KAAK,EAAE,EAAE,CAC9D,GACD,+BAA+B,SAAS;EAI1C,GAAG,KAAK;EACR,GAAG,MAAM,SAAS,SAChB,KAAK,SAAS,eAAe,oBACzB,CAAC,EAAE,MAAM,KAAK,OAAO,MAAM,CAAC,GAC5B,EAAE,CACP;EACD,GAAI,cAAc,CAAC,EAAE,MAAM,YAAY,OAAO,MAAM,CAAC,GAAG,EAAE;EAC1D,GAAI,UAAU,CAAC,EAAE,MAAM,QAAQ,OAAO,MAAM,CAAC,GAAG,EAAE;EAClD,GAAG,OAAO,SAA0B,EAAE,cAAc,QAAQ;EAC5D;GAAE,MAAM;GAAO,QAAQ;GAAM,YAAY;GAAQ;EAClD;;AAGH,MAAM,sBACJ,UAIA,SACA,QACA,yBACuB;AACvB,KAAI,YAAY,eAAgB,QAAO,KAAA;CAGvC,MAAM,YAAY,SAAS,QAAQ,MAAM,QAAQ,IAAI,YAAY;AACjE,KAAI,UAAW,QAAO,GAAG,UAAU,KAAK;AAGxC,KAAI,CAAC,OAAO,SAAS,QAAQ,kBAAmB,QAAO,KAAA;AAGvD,KAAI,CAAC,kBAAkB,OAAO,CAAE,QAAO,KAAA;CAEvC,MAAM,eAAe,wBAAwB,SAAS,WAAW;AACjE,KAAI,CAAC,aAAc,QAAO,KAAA;AAC1B,KAAI,gBAAgB,aAAa,CAAE,QAAO,KAAA;AAM1C,KAAI,CAHsB,SAAS,QAAQ,MACxC,QAAQ,IAAI,SAAS,aACvB,CACuB,QAAO,KAAA;AAE/B,QAAO,GAAG,aAAa;;;;;;;;;;;;AAazB,MAAM,mCACJ,YACA,SACA,QACA,yBACoD;CACpD,MAAM,WAAW,wBAAwB,YAAY,OAAO;CAC5D,MAAM,kBAAkB,mBACtB,WAAW,UACX,SACA,QACA,qBACD;CAED,MAAM,sBACJ,UAAU,iBAAiB,KAAA,IACvB,KAAA,IACA,KAAK,UAAU,SAAS,aAAa;AAY3C,QAAO;EACL,SAXoB;GACpB,kBAAkB,UAAU,oBAAoB,KAAA;GAChD,sBAAsB,iBAAiB,wBAAwB,KAAA;GAC/D,UAAU,cAAc,KAAA,IACpB,KAAA,IACA,cAAc,KAAK,UAAU,SAAS,UAAU;GACpD,UAAU,WAAW,aAAa,SAAS,aAAa,KAAA;GACxD,UAAU,QAAQ,UAAU,SAAS,UAAU,KAAA;GAChD,CAAC,QAAQ,UAA2B,UAAU,KAAA,EAAU;EAIvD,iBAAiB,wBAAwB,KAAA;EAC1C;;AAGH,MAAM,kBAAkB,MAAc,aAA6B;CACjE,MAAM,iBAAiB,KAAK,MAAM,CAAC,QAAQ,SAAS,GAAG;AAEvD,QAAO,eAAe,SAAS,IAC3B,GAAG,eAAe;IACpB,aACE;;AAGN,MAAM,qDACJ,SAEA,KAAK,WAAW,6BAA6B,uBAAuB;AAEtE,MAAM,oCACJ,WACA,SACA,SACA,YAAY,UACD;CACX,MAAM,WAAW,GAAG,gCAAgC,GAAG,UAAU,IAAI,UAAU,YAAY,WAAW,GAAG;AACzG,QAAO,QAAQ,uBACX,YAAY,SAAS,6BAA6B,UAAU,OAC5D,aAAa;;AAGnB,MAAM,sCACJ,sBACuB;AACvB,KAAI,kBAAkB,WAAW,EAC/B,QAAO;AAGT,QAAO;;MAEH,kBAAkB,KAAK,UAAU,CAAC;;;AAIxC,MAAM,uCACJ,cACA,MACA,WACA,SACA,2BACA,YAAY,UACD;AACX,KAAI,0BACF,QAAO,mBAAmB,aAAa,GAAG,eACxC,MACA,iCACE,WACA,SACA,EACE,sBAAsB,OACvB,EACD,UACD,CACF,CAAC,qBAAqB,UAAU;AA0BnC,QAAO,mBAAmB,aAAa,GAvBlB,eACnB,kDAAkD,KAAK,EACvD,iCACE,WACA,SACA,EACE,sBAAsB,MACvB,EACD,UACD,CACF,CAasD,qBAAqB,UAAU;kBACtE,aAAa,GAbF,eACzB,MACA,iCACE,WACA,SACA,EACE,sBAAsB,OACvB,EACD,UACD,CACF,CAGkD,qBAAqB,UAAU;;;;;;;;;;;;;;;;AAiBpF,MAAM,6BACJ,YACA,OACA,WACW;CACX,MAAM,EAAE,eAAe,UAAU,OAAO,QAAQ,YAAY;CAE5D,MAAM,WAAW,SAAS,WAAW,WAAW;CAChD,MAAM,YAAY,kBAAkB,OAAO;CAC3C,MAAM,wBAAwB,+BAA+B,SAAS;CACtE,MAAM,0BAA0B,sBAAsB,MACnD,QAAQ,IAAI,SAAS,SACvB;CACD,MAAM,eAAe,GAAG,cAAc;CACtC,MAAM,iBACJ,aACA,OAAO,SAAS,QAAQ,qBACxB,CAAC,gBAAgB,SAAS,IAC1B,0BACI,uBAAuB,SAAS,GAChC;CACN,MAAM,eAAe,SAAS,MAAM;CACpC,MAAM,oBACJ,aAAa,UAAU,IACnB,iBACA,CACE,GAAG,IAAI,IACL,aAAa,KAAK,SAChB,qCACE,KAAK,OACL,KAAK,aACL,uBACA,OACD,CACF,CACF,CACF,CAAC,KAAK,MAAM,IAAI;AACvB,6BAA4B,IAC1B,eACA,eAAe,OACb,cACD,CAAC,+BAA+B,kBAAkB,GACpD;CACD,MAAM,qBAAqB,sBAAsB,aAAa;CAC9D,MAAM,iBAAiB,sBAAsB,cAAc,SAAS;CACpE,MAAM,kBAAkB,aAAa,MAAM,SACzC,KAAK,YAAY,SAAS,OAAO,CAClC,EAAE;CAEH,MAAM,kBAAkB,uBACtB,UAF2B,mBAAmB,eAAe,aAI7D,SACD;CAKD,MAAM,cAAc,iBAAiB,OAAO,QAHrB,MAAM,MAC1B,SAAS,KAAK,SAAS,eAAe,kBACxC,CACkE;CAEnE,MAAM,cAAc,iBAAiB,OAAO,OAAO;CACnD,MAAM,OAAO,eAAe,aAAa,iBAAiB;CAE1D,MAAM,EAAE,UAAU,SAAS,cAAc,qBACvC,YACA,YACD;AAED,KAAI,mBAAmB,SAAS,GAAG;EACjC,MAAM,qBAAqB,mBAAmB,eAAe;EAC7D,MAAM,iBAAiB,oBAAoB,cAAc;EACzD,MAAM,gBAAgB,YAAY,QAC/B,GAAG,UAAU,MAAM,QAAQ,YAAY,CAAC,MAAM,QAAQ,QACxD;EACD,MAAM,gBAAgB,YAAY,QAC/B,GAAG,UAAU,CAAC,MAAM,QAAQ,YAAY,MAAM,QAAQ,QACxD;EACD,MAAM,eAAe,cAClB,KAAK,SAAS,KAAK,eAAe,CAClC,KAAK,UAAU;EAClB,MAAM,eAAe,cAClB,KAAK,SAAS,KAAK,eAAe,CAClC,KAAK,UAAU;EAClB,MAAM,uBAAuB,SAC3B,qCACE,KAAK,OACL,KAAK,aACL,uBACA,OACD;EACH,MAAM,kBAAkB,CACtB,GAAG,IAAI,IACL,aACG,QAAQ,SAAS,KAAK,YAAY,CAClC,KAAK,SAAS,oBAAoB,KAAK,CAAC,CAC5C,CACF,CAAC,KAAK,MAAM;EACb,MAAM,oBAAoB,SACxB,uBACE,uBAAuB,UAAU,KAAK,aAAa,KAAK,MAAM,CAC/D;EAqBH,MAAM,4BAjBqB,CACzB,GAAG,IAAI,IACL,aACG,QAAQ,SAAS,KAAK,YAAY,CAClC,KAAK,SACJ,uBACE,oBAAoB,KAAK,EACzB,iBAAiB,KAAK,EACtB,UACD,CACF,CACJ,CACF,CAKoD,KAAK,MAAM;EAKhE,MAAM,kBAAkB,aACrB,QAAQ,SAAS,KAAK,YAAY,CAClC,KAAK,SAAS;GACb,MAAM,aAAa,oBAAoB,KAAK;AAU5C,UAAO,mBAAmB,aAAa,GATlB;IACnB;IACA,YAAY,KAAK,YAAY;IAC7B;IACA,aAAa,uBAAuB,YAAY,iBAAiB,KAAK,EAAE,UAAU;IACnF,CACE,OAAO,QAAQ,CACf,KAAK,UAAU,CAEqC,qBAAqB,WAAW;IACvF,CACD,KAAK,KAAK;EACb,MAAM,gCAAgC;GACpC;GACA,WAAW,eAAe,MAAM,mBAAmB;GACnD;GACA,aAAa;GACd,CACE,OAAO,QAAQ,CACf,KAAK,UAAU;EAElB,MAAM,oBAAoB,SAA4B;AACpD,OAAI,CAAC,KACH,QAAO,cAAc,uBAAuB,iBAAiB,WAAW,UAAU;GAGpF,MAAM,UAAU,uBACd,UACA,KAAK,aACL,KAAK,MACN;AAWD,UAAO,GAJyB,mCANV,gCACpB,YACA,SACA,QACA,KAAK,MACN,CAEe,QACf,IAEoC,UAAU,iBAAiB,uBAC9D,oBAAoB,KAAK,EACzB,uBAAuB,QAAQ,EAC/B,UACD;;EAGH,MAAM,WAAW,aAAa,MAC3B,SACC,KAAK,YAAY,SAAS,OAAO,IAAI,KAAK,YAAY,SAAS,QAAQ,CAC1E;EACD,MAAM,WAAW,aAAa,MAAM,SAClC,eAAe,KAAK,aAAa,KAAK,MAAM,CAC7C;EACD,MAAM,kBAAkB,aAAa,MAAM,SACzC,sBAAsB,KAAK,YAAY,CACxC;EACD,MAAM,WAAW,aAAa,MAAM,SAClC,eAAe,KAAK,aAAa,SAAS,OAAO,CAClD;EAMD,MAAM,eACJ,aAAa,MAAM,SAAS,KAAK,gBAAgB,mBAAmB,IACpE,YACA,YACA,mBACA;EAEF,MAAM,uBAAuB,SAAmC;GAC9D,MAAM,UAAU,uBACd,UACA,KAAK,aACL,KAAK,MACN;AAKD,UAAO,UAAU,QAAQ,GAHvB,YAAY,iBACR,oBAAoB,KAAK,GACzB,uBAAuB,QAAQ,CACE;;;UAGnC,iBAAiB,KAAK,CAAC;;EAG7B,MAAM,iBAAiB,eACnB,oBAAoB,aAAa,GACjC,uBAAuB,eAAe;;;UAGpC,kBAAkB,CAAC;EAKzB,MAAM,6BAA6B,eAC/B,uBACE,oBAAoB,aAAa,EACjC,iBAAiB,aAAa,EAC9B,UACD,GACD;EACJ,MAAM,4BAA4B,eAC9B,oBAAoB,aAAa,GACjC;EACJ,MAAM,sBAAsB;GAC1B;GACA;GACA,aAAa;GACd,CACE,OAAO,QAAQ,CACf,KAAK,UAAU;EAElB,MAAM,mBAAmB,YACrB,qEACA;AAEJ,SAAO;;;EAGT,gBAAgB;kBACA,aAAa;MACzB,oBAAoB;uBACH,0BAA0B;kBAC/B,aAAa;MACzB,8BAA8B;qBACf,gBAAgB;IACjC,WAAW,GAAG,SAAS,KAAK,GAAG;oBACf,QAAQ;IACxB,iBAAiB;;;;;;0BAMK,WAAW,oBAAoB,SAAS,GAAG,eAAe;;;UAG1E,iBAAiB,SAAS,CAAC;;;;;;;UAO3B,iBAAiB,SAAS,CAAC;;;IAIjC,kBACI;;;;UAIE,iBAAiB,gBAAgB,CAAC;;;MAIpC,KACH,eAAe;;;;CAKlB,MAAM,kBAAkB,gCACtB,YACA,iBACA,OACD;CACD,MAAM,UAAU,uBAAuB,gBAAgB;CACvD,MAAM,oBAAoB,gBAAgB,kBACtC,iBACA,GAAG,eAAe;CACtB,MAAM,qBAAqB,oCACzB,cACA,MACA,gBACA,SACA,gBAAgB,iBAChB,UACD;CACD,MAAM,qBAAqB,eACzB,MACA,iCACE,gBACA,SACA,EACE,sBAAsB,OACvB,EACD,UACD,CACF;CACD,MAAM,oBAAoB,mCACxB,gBAAgB,QACjB;CACD,MAAM,sBAAsB,oBAAoB,KAAK,sBAAsB;CAK3E,MAAM,8BACJ,YAAY,KAAA,KAAa,CAAC,QAAQ;CACpC,MAAM,mBAAmB,8BACrB,GAAG,QAAQ,KAAK,aAChB;AAEJ,KAAI,aAAa,CAAC,4BAChB,QAAO;;;EAGT,mBAAmB;kBACH,aAAa,GAAG,mBAAmB,qBAAqB,kBAAkB;WACjF,gBAAgB,GAAG,eAAe,UAAU,UAAU,oBAAoB;;;AAKnF,QAAO;;;EAGP,mBAAmB;kBACH,aAAa,GAAG,mBAAmB,qBAAqB,kBAAkB;WACjF,gBAAgB,GAAG,eAAe;MACvC,WAAW,GAAG,SAAS,KAAK,GAAG;sBACf,QAAQ;aACjB,iBAAiB;KACzB,oBAAoB;;;;AAKzB,MAAM,qCAAqC,cAA+B;cAC5D,gCAAgC,wDAAwD,UAAU;;;;AAKhH,MAAM,4BACJ,aACA,UACW;AACX,KAAI,CAAC,YAAa,QAAO;AACzB,KAAI,YAAY,SAAS,OAAO,IAAI,YAAY,SAAS,QAAQ,CAC/D,QAAO;AAET,KAAI,YAAY,WAAW,QAAQ,IAAI,YAAY,SAAS,MAAM,CAChE,QAAO;AAET,KAAI,sBAAsB,YAAY,CACpC,QAAO;AAET,QAAO;;AAGT,MAAM,wCACJ,OACA,aACA,iBACA,WACW;AACX,KACE,kBAAkB,OAAO,IACzB,OAAO,SAAS,QAAQ,qBACxB,CAAC,CAAC,gBACD,YAAY,SAAS,OAAO,IAAI,YAAY,SAAS,QAAQ,KAC9D,CAAC,gBAAgB,MAAM,IACvB,gBAAgB,MAAM,QAAQ,IAAI,SAAS,MAAM,CAEjD,QAAO,uBAAuB,MAAM;AAGtC,QAAO,yBAAyB,aAAa,MAAM;;AAGrD,MAAM,0BACJ,WACA,SACA,cAEA,GAAG,gCAAgC,GAAG,UAAU,IAAI,UAAU,YAAY,WAAW,GAAG;AAE1F,MAAM,oCAA4C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0ClD,MAAa,8BAAmD,EAC9D,OACA,kBACA,WACA,iBACA,WACA,QACA,aACA,UACI;AACJ,6BAA4B;AAC5B,6BAA4B,OAAO;CAOnC,MAAM,sBAAsB,uBAAuB,aAAa,IAAI;CAEpE,MAAM,aAAa,oBAAoB,QAAQ,eAC7C,gBACE,WAAW,MACX,WAAW,eACX,kBAAkB,WAAW,CAC9B,CACF;CACD,MAAM,yBAAyB,WAAW,MACvC,eAAe,CAAC,CAAC,WAAW,YAC9B;CACD,MAAM,qBAAqB,yBACvB,KAAK,oCAAoC,CAAC,MAC1C;CACJ,MAAM,gBAAgB,mBAAmB,YAAY,OAAO;CAE5D,MAAM,YAAY,WACf,KAAK,eAAe;AAKnB,SAAO,0BAA0B,YAJf,cAAc,IAC9B,WAAW,eACX,WAAW,MACZ,EACuD,OAAO;GAC/D,CACD,KAAK,KAAK;CACb,MAAM,gBAAgB,4BAA4B,UAChD,WAAW,KAAK,eAAe,WAAW,cAAc,CACzD;CAED,MAAM,YAAY,oBAAoB,QAAQ,eAC5C,eACE,WAAW,MACX,WAAW,eACX,kBAAkB,WAAW,CAC9B,CACF;CACD,MAAM,yBAAyB,UAAU,MACtC,eAAe,CAAC,CAAC,WAAW,YAC9B;CAED,MAAM,yBAAyB,UAC5B,KAAK,eAAe;AAUnB,SAAO,iCAAiC,YALa;GACnD,OALgB,cAAc,IAC9B,WAAW,eACX,WAAW,MACZ;GAGC,SAAS,EAAE,QAAQ;GACpB,CAEoE;GACrE,CACD,KAAK,KAAK;CAEb,MAAM,sBAAsB,yBACxB;EACJ,sBAAsB;EACtB;EACA;EACA;EACA;EACA;EACA,gBAAgB,0BAA0B,CAAC;EAC5C,CAAC,CAAC;EACD,uBAAuB;;IAGnB;AAEJ,QAAO,GAAG,kCAAkC,kBAAkB,OAAO,CAAC,GAAG,qBAAqB,gBAAgB,GAAG,cAAc,QAAQ,KAAK,YAAY,sBAAsB,gBAAgB,KAAK,cAAc,MAAM;;;;;;;;;;;AAYzN,MAAa,8BAAmD,EAC9D,qBACI;CACJ,MAAM,cAAc,yBAAyB,eAAe;CAC5D,MAAM,YAAY,6BAA6B;AAE/C,QAAO,GAAG,cAAc,GAAG,YAAY,MAAM,KAAK;;;;;;;;;;;AAYpD,MAAa,8BACX,aACA,YACG;AACH,eAAc,IAAI,YAAY,eAAe,QAAQ,MAAM;AAM3D,QAAO;EAAE,gBAAgB;EAAM,SALf,2BACd,aACA,QAAQ,QAAQ,OACjB;EAEuC;;AAG1C,MAAM,yBACJ,aACA,QACA,YACG;AACH,6BAA4B,OAAO;CAEnC,MAAM,aAAa,OAAO,OAAO,YAAY,CAAC,QAAQ,eACpD,gBACE,WAAW,MACX,WAAW,eACX,kBAAkB,WAAW,CAC9B,CACF;CAKD,MAAM,qBAHyB,WAAW,MACvC,eAAe,CAAC,CAAC,WAAW,YAC9B,GAEG,KAAK,oCAAoC,CAAC,MAC1C;CAEJ,MAAM,YAAY,WACf,KAAK,eAAe;AAMnB,SAAO,0BAA0B,YALf,aAChB,WAAW,OACX,QAAQ,KAAK,SACb,OAAO,QACR,EACuD,OAAO;GAC/D,CACD,KAAK,KAAK;CAEb,MAAM,gBAAgB,4BAA4B,UAChD,OAAO,OAAO,YAAY,CAAC,KAAK,eAAe,WAAW,cAAc,CACzE;CACD,MAAM,YAAY,6BAA6B;CAC/C,MAAM,gBAAgB,mBAAmB,YAAY,OAAO;AAE5D,QAAO,GAAG,kCAAkC,kBAAkB,OAAO,CAAC,GAAG,qBAAqB,gBAAgB,GAAG,cAAc,QAAQ,KAAK,UAAU,IAAI,gBAAgB,GAAG,cAAc,MAAM,KAAK;;AAGxM,MAAM,iCACJ,QACA,SACA,wBACG;CACH,MAAM,QAAQ,kBAAkB,OAAO;CACvC,MAAM,gBAAgB,CACpB,GAAG,IAAI,IAAI,QAAQ,KAAK,QAAQ,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,QAAQ,CAC3D;AAED,KAAI,CAAC,OAAO,QACV,QAAO,CACL;EACE,SAAS,QACL,cAAc,KAAK,SAAS;GAAE,GAAG;GAAK,QAAQ;GAAM,EAAE,GACtD;EACJ,YAAY;EACb,CACF;AAGH,KAAI,CAAC,OAAO,WACV,QAAO,CAAC,GAAG,cAAc,CAAC,KAAK,QAAQ;EAErC,MAAM,OAAO,eADI,IAAI,cAAc,IAAI,MACD,OAAO,iBAAiB;EAC9D,MAAM,SAAS,QAAQ,SAAS;EAChC,MAAM,kBAAkB,OAAO,cAAc,QAAQ,SAAS,GAAG;AACjE,SAAO;GACL,SAAS,QAAQ,CAAC;IAAE,GAAG;IAAK,QAAQ;IAAM,CAAC,GAAG,CAAC,IAAI;GACnD,YAAY,MAAM,SAChB,qBACA,GAAG,OAAO,SAAS,kBACpB;GACF;GACD;AAGJ,KAAI,MACF,QAAO,CACL;EACE,SAAS,cAAc,KAAK,SAAS;GAAE,GAAG;GAAK,QAAQ;GAAM,EAAE;EAC/D,YAAY;EACb,CACF;AAGH,QAAO,CACL;EACE,SAAS;EACT,YAAY;EACb,CACF;;AAGH,MAAM,gCACJ,QACA,QACW;CACX,MAAM,EAAE,WAAW,SAAS,aAAa,YAAY,OAAO,QAAQ,EAClE,WAAW,OAAO,eACnB,CAAC;AAEF,SAAQ,OAAO,MAAf;EACE,KAAK,WAAW,MAAM;GACpB,MAAM,gBAAgB,MAAM,OAAO,UAAU;AAC7C,UAAO,MAAM,SAAS,SAAS,GAAG,cAAc,WAAW,YAAY;;EAEzE,KAAK,WAAW,YAAY;GAC1B,MAAM,gBAAgB,MAAM,OAAO,UAAU;AAC7C,UAAO,MAAM,SACX,SACA,eACA,GAAG,cAAc,WAAW,YAC7B;;EAEH,QACE,QAAO,MAAM,SAAS,SAAS,GAAG,SAAS,WAAW,YAAY;;;AAKxE,MAAM,sCACJ,QACA,eACW;CACX,MAAM,cACJ,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,OAAO,SAAS;AAExE,KAAI,YACF,QAAO,MAAM,sBACX,YACA,YAAY,YAAY,CAAC,QAC1B;CAGH,MAAM,EAAE,SAAS,UAAU,cAAc,YAAY,OAAO,QAAQ,EAClE,WAAW,OAAO,eACnB,CAAC;AACF,QAAO,MAAM,sBACX,YACA,MAAM,SAAS,SAAS,GAAG,SAAS,UAAU,YAAY,EAC1D,OAAO,kBAAkB,MAC1B;;AAGH,MAAM,8BACJ,aACA,YACA,QACA,SACA,WACG;CACH,MAAM,iBAAiB,sBAAsB,aAAa,QAAQ,QAAQ;CAC1E,MAAM,gBAAgB,8BACpB,QACA,OAAO,OAAO,YAAY,CACvB,QAAQ,eACP,gBACE,WAAW,MACX,WAAW,eACX,kBAAkB,WAAW,CAC9B,CACF,CACA,SAAS,eAAe,2BAA2B,YAAY,OAAO,CAAC,EAC1E,mCAAmC,QAAQ,WAAW,CACvD;CAED,MAAM,eAAe,uCAAuC,OAAO,MAAM;CACzE,MAAM,uBAAuB,0BAC3B,gBACA,CAAC,GAAG,eAAe,GAAG,aAAa,EACnC,QAAQ,aACR,CAAC,CAAC,OAAO,SACT,+BAA+B,OAAO,SAAS,CAChD;CAED,MAAM,WAAW,OAAO,OAAO,YAAY,CACxC,QAAQ,eACP,gBACE,WAAW,MACX,WAAW,eACX,kBAAkB,WAAW,CAC9B,CACF,CACA,SAAS,eAAe;AAQvB,SAAO;GAJL,WAAW,WAAW,CAAC,WAAW,QAAQ,eACtC,WAAW,UACX,KAAA;GAIJ,WAAW;GACX,WAAW;GACX,WAAW;GACZ,CAAC,QACC,UAA8C,UAAU,KAAA,EAC1D;GACD;AAUJ,QAAO;EACL,SAAS,GAAG,SAAS,uBARrB,SAAS,SAAS,IACd,uBAAuB;GACrB;GACA,SAAS,OAAO,SAAS,WAAW;GACrC,CAAC,GACF,KAGyD;EAC7D,MAAM;EACP;;;;;;;;;;;;;AAcH,MAAa,kCACX,aACA,QACA,YACG;CACH,MAAM,SAAS,UAAU,OAAO,SAAS,QAAQ,QAAQ,KAAK,KAAK;AAEnE,KAAI,CAAC,uBAAuB,YAAY,CACtC,QAAO,QAAQ,QAAQ,EAAE,CAAC;AAG5B,KACE,OAAO,SAAS,WAAW,QAC3B,OAAO,SAAS,WAAW,YAC3B;EACA,MAAM,qCAAqB,IAAI,KAG5B;AAEH,OAAK,MAAM,cAAc,OAAO,OAAO,YAAY,EAAE;GACnD,MAAM,MAAM,cAAc,WAAW;GACrC,MAAM,eAAe,mBAAmB,IAAI,IAAI,IAAI,EAAE;AACtD,gBAAa,WAAW,eAAe;AACvC,sBAAmB,IAAI,KAAK,aAAa;;AAG3C,SAAO,QAAQ,QACb,CAAC,GAAG,mBAAmB,SAAS,CAAC,CAC9B,QAAQ,GAAG,oBAAoB,uBAAuB,eAAe,CAAC,CACtE,KAAK,CAAC,KAAK,oBACV,2BACE,gBACA,6BAA6B,QAAQ,IAAI,EACzC,QACA,SACA,OACD,CACF,CACJ;;AAGH,QAAO,QAAQ,QAAQ,CACrB,2BACE,qBAAqB,uBAAuB,YAAY,CAAC,EACzD,6BAA6B,OAAO,EACpC,QACA,SACA,OACD,CACF,CAAC;;;;AC/jDJ,MAAM,oBAA6C;CACjD,QAAQ;CACR,QAAQ;CACR,cAAc;CACd,QAAQ;CACR,OAAO;CACR;AAED,MAAM,sBAA+C;CACnD,QAAQ;CACR,QAAQ;CACR,cAAc;CACd,QAAQ;CACR,OAAO;CACR;AAED,MAAM,oBAA6C;CACjD,GAAG;CACH,YAAY;CACb;AAED,MAAa,iBAAiB,YAA6B;AACzD,SAAQ,SAAS,QAAjB;EACE,KAAK,eACH,QAAO;EAET,KAAK,OACH,QAAO;EAET,QACE,QAAO"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orval/angular",
3
- "version": "8.8.1",
3
+ "version": "8.9.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -35,7 +35,7 @@
35
35
  "nuke": "rimraf .turbo dist node_modules"
36
36
  },
37
37
  "dependencies": {
38
- "@orval/core": "8.8.1"
38
+ "@orval/core": "8.9.0"
39
39
  },
40
40
  "devDependencies": {
41
41
  "eslint": "10.1.0",