@acrool/rtk-query-codegen-openapi 0.0.2-test.9 → 0.0.6

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/lib/index.js CHANGED
@@ -1113,6 +1113,65 @@ function getGroupNameFromPath(path4, pattern) {
1113
1113
  return "common";
1114
1114
  }
1115
1115
  async function generateEndpoints(options) {
1116
+ const schemaLocation = options.schemaFile;
1117
+ const schemaAbsPath = isValidUrl(options.schemaFile) ? options.schemaFile : import_node_path3.default.resolve(process.cwd(), schemaLocation);
1118
+ if (isValidUrl(options.schemaFile) && "outputFiles" in options) {
1119
+ const { outputFiles, ...commonConfig } = options;
1120
+ const openApiDoc = await getV3Doc(options.schemaFile, options.httpResolverOptions);
1121
+ const paths = Object.keys(openApiDoc.paths);
1122
+ const outputFilesEntries = Object.entries(outputFiles);
1123
+ const [outputPath, config] = outputFilesEntries[0];
1124
+ const patterns = config.groupMatch;
1125
+ const filterEndpoint = config.filterEndpoint;
1126
+ const pattern = patterns;
1127
+ const groupedPaths = paths.reduce((acc, path4) => {
1128
+ const groupName = getGroupNameFromPath(path4, pattern);
1129
+ if (!acc[groupName]) {
1130
+ acc[groupName] = [];
1131
+ }
1132
+ acc[groupName].push(path4);
1133
+ return acc;
1134
+ }, {});
1135
+ for (const [groupName, paths2] of Object.entries(groupedPaths)) {
1136
+ const finalOutputPath = outputPath.replace("$1", groupName);
1137
+ if (filterEndpoint) {
1138
+ const pathBasedFilter = (operationName, operationDefinition) => {
1139
+ const path4 = operationDefinition.path;
1140
+ const pathGroupName = getGroupNameFromPath(path4, pattern);
1141
+ if (pathGroupName !== groupName) {
1142
+ return false;
1143
+ }
1144
+ const endpointFilter = filterEndpoint(groupName);
1145
+ if (endpointFilter instanceof RegExp) {
1146
+ return endpointFilter.test(operationName);
1147
+ }
1148
+ return true;
1149
+ };
1150
+ const groupOptions = {
1151
+ ...commonConfig,
1152
+ outputFile: finalOutputPath,
1153
+ filterEndpoints: pathBasedFilter
1154
+ };
1155
+ await generateSingleEndpoint(groupOptions);
1156
+ } else {
1157
+ const pathBasedFilter = (operationName, operationDefinition) => {
1158
+ const path4 = operationDefinition.path;
1159
+ const pathGroupName = getGroupNameFromPath(path4, pattern);
1160
+ return pathGroupName === groupName;
1161
+ };
1162
+ const groupOptions = {
1163
+ ...commonConfig,
1164
+ outputFile: finalOutputPath,
1165
+ filterEndpoints: pathBasedFilter
1166
+ };
1167
+ await generateSingleEndpoint(groupOptions);
1168
+ }
1169
+ }
1170
+ return;
1171
+ }
1172
+ await generateSingleEndpoint(options);
1173
+ }
1174
+ async function generateSingleEndpoint(options) {
1116
1175
  const schemaLocation = options.schemaFile;
1117
1176
  const schemaAbsPath = isValidUrl(options.schemaFile) ? options.schemaFile : import_node_path3.default.resolve(process.cwd(), schemaLocation);
1118
1177
  const sourceCode = await enforceOazapftsTsVersion(async () => {
@@ -1136,9 +1195,16 @@ function parseConfig(fullConfig) {
1136
1195
  const outFiles = [];
1137
1196
  if ("outputFiles" in fullConfig) {
1138
1197
  const { outputFiles, ...commonConfig } = fullConfig;
1139
- const openApiDoc = JSON.parse(import_node_fs.default.readFileSync(fullConfig.schemaFile, "utf-8"));
1198
+ let openApiDoc;
1199
+ if (isValidUrl(fullConfig.schemaFile)) {
1200
+ outFiles.push(fullConfig);
1201
+ return outFiles;
1202
+ } else {
1203
+ openApiDoc = JSON.parse(import_node_fs.default.readFileSync(fullConfig.schemaFile, "utf-8"));
1204
+ }
1140
1205
  const paths = Object.keys(openApiDoc.paths);
1141
- const [outputPath, config] = Object.entries(outputFiles)[0];
1206
+ const outputFilesEntries = Object.entries(outputFiles);
1207
+ const [outputPath, config] = outputFilesEntries[0];
1142
1208
  const patterns = config.groupMatch;
1143
1209
  const filterEndpoint = config.filterEndpoint;
1144
1210
  const pattern = patterns;
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/generate.ts","../src/utils/factory.ts","../src/codegen.ts","../src/generators/react-hooks.ts","../src/utils/capitalize.ts","../src/types.ts","../src/utils/getOperationDefinitions.ts","../src/utils/getV3Doc.ts","../src/utils/isQuery.ts","../src/utils/isValidUrl.ts","../src/utils/prettier.ts","../src/utils/removeUndefined.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { generateApi } from './generate';\nimport type { CommonOptions, ConfigFile, GenerationOptions, OutputFileOptions } from './types';\nimport { isValidUrl, prettify } from './utils';\nimport camelCase from 'lodash.camelcase';\nexport type { OutputFilesConfig, ConfigFile } from './types';\n\nconst require = createRequire(__filename);\n\n\n\n// 確保目錄存在的函數\nasync function ensureDirectoryExists(filePath: string) {\n const dirname = path.dirname(filePath);\n if (!fs.existsSync(dirname)) {\n await fs.promises.mkdir(dirname, { recursive: true });\n }\n}\n\n\n// 檢查檔案是否存在的函數\nfunction fileExists(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\n// 獲取資料夾名稱並轉換為 API 名稱\nfunction getApiNameFromDir(dirPath: string): string {\n const dirName = path.basename(dirPath);\n return `${dirName}Api`;\n}\n\n// 確保基礎文件存在的函數\nasync function ensureBaseFilesExist(outputDir: string) {\n const enhanceEndpointsPath = path.join(outputDir, 'enhanceEndpoints.ts');\n const indexPath = path.join(outputDir, 'index.ts');\n const apiName = getApiNameFromDir(outputDir);\n\n // 如果 enhanceEndpoints.ts 不存在,創建它\n if (!fileExists(enhanceEndpointsPath)) {\n const enhanceEndpointsContent = `import api from './query.generated';\n\nconst enhancedApi = api.enhanceEndpoints({\n endpoints: {\n },\n});\n\nexport default enhancedApi;\n`;\n await fs.promises.writeFile(enhanceEndpointsPath, enhanceEndpointsContent, 'utf-8');\n }\n\n // 如果 index.ts 不存在,創建它\n if (!fileExists(indexPath)) {\n const indexContent = `export * from './query.generated';\nexport {default as ${apiName}} from './enhanceEndpoints';\n`;\n await fs.promises.writeFile(indexPath, indexContent, 'utf-8');\n }\n}\n\n\n// 從路徑中提取分類名稱\nfunction getGroupNameFromPath(path: string, pattern: RegExp): string {\n // console.log('pattern', pattern);\n\n const match = path.match(pattern);\n // console.log('match', path, match);\n\n if (match && match[1]) {\n return camelCase(match[1]);\n }\n return 'common';\n}\n\n\n\n\n\nexport async function generateEndpoints(options: GenerationOptions): Promise<string | void> {\n const schemaLocation = options.schemaFile;\n\n const schemaAbsPath = isValidUrl(options.schemaFile)\n ? options.schemaFile\n : path.resolve(process.cwd(), schemaLocation);\n\n const sourceCode = await enforceOazapftsTsVersion(async () => {\n return generateApi(schemaAbsPath, options);\n });\n const { outputFile, prettierConfigFile } = options;\n if (outputFile) {\n const outputPath = path.resolve(process.cwd(), outputFile);\n await ensureDirectoryExists(outputPath);\n\n // 確保基礎文件存在\n const outputDir = path.dirname(outputPath);\n await ensureBaseFilesExist(outputDir);\n\n fs.writeFileSync(\n outputPath,\n await prettify(outputFile, sourceCode, prettierConfigFile)\n );\n } else {\n return await prettify(null, sourceCode, prettierConfigFile);\n }\n}\n\n\nexport function parseConfig(fullConfig: ConfigFile) {\n const outFiles: (CommonOptions & OutputFileOptions)[] = [];\n\n if ('outputFiles' in fullConfig) {\n const { outputFiles, ...commonConfig } = fullConfig;\n\n // 讀取 OpenAPI 文檔\n const openApiDoc = JSON.parse(fs.readFileSync(fullConfig.schemaFile, 'utf-8'));\n const paths = Object.keys(openApiDoc.paths);\n\n // 從配置中獲取分類規則\n const [outputPath, config] = Object.entries(outputFiles)[0];\n const patterns = config.groupMatch;\n const filterEndpoint = config.filterEndpoint;\n\n const pattern = patterns;\n // 根據路徑自動分類\n const groupedPaths = paths.reduce((acc, path) => {\n const groupName = getGroupNameFromPath(path, pattern);\n if (!acc[groupName]) {\n acc[groupName] = [];\n }\n acc[groupName].push(path);\n return acc;\n }, {} as Record<string, string[]>);\n\n // 為每個分類生成配置\n Object.entries(groupedPaths).forEach(([groupName, paths]) => {\n const finalOutputPath = outputPath.replace('$1', groupName);\n\n if (filterEndpoint) {\n // 如果有 filterEndpoint,使用基於路徑的篩選函數\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n if (pathGroupName !== groupName) {\n return false;\n }\n\n // 使用 filterEndpoint 進行額外篩選\n const endpointFilter = filterEndpoint(groupName);\n if (endpointFilter instanceof RegExp) {\n return endpointFilter.test(operationName);\n }\n\n return true;\n };\n\n outFiles.push({\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n });\n } else {\n // 如果沒有 filterEndpoint,只使用路徑分組\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n return pathGroupName === groupName;\n };\n\n outFiles.push({\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n });\n }\n });\n\n } else {\n outFiles.push(fullConfig);\n }\n return outFiles;\n}\n\n/**\n * Enforces `oazapfts` to use the same TypeScript version as this module itself uses.\n * That should prevent enums from running out of sync if both libraries use different TS versions.\n */\nfunction enforceOazapftsTsVersion<T>(cb: () => T): T {\n const ozTsPath = require.resolve('typescript', { paths: [require.resolve('oazapfts')] });\n const tsPath = require.resolve('typescript');\n const originalEntry = require.cache[ozTsPath];\n try {\n require.cache[ozTsPath] = require.cache[tsPath];\n return cb();\n } finally {\n if (originalEntry) {\n require.cache[ozTsPath] = originalEntry;\n } else {\n delete require.cache[ozTsPath];\n }\n }\n}\n","import camelCase from 'lodash.camelcase';\nimport path from 'node:path';\nimport ApiGenerator, {\n getOperationName as _getOperationName,\n getReferenceName,\n isReference,\n supportDeepObjects,\n createPropertyAssignment,\n createQuestionToken,\n isValidIdentifier,\n keywordType,\n} from 'oazapfts/generate';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport ts from 'typescript';\nimport type { ObjectPropertyDefinitions } from './codegen';\nimport { generateCreateApiCall, generateEndpointDefinition, generateImportNode, generateTagTypes } from './codegen';\nimport { generateReactHooks } from './generators/react-hooks';\nimport type {\n EndpointMatcher,\n EndpointOverrides,\n GenerationOptions,\n OperationDefinition,\n ParameterDefinition,\n ParameterMatcher,\n TextMatcher,\n} from './types';\nimport { capitalize, getOperationDefinitions, getV3Doc, removeUndefined, isQuery as testIsQuery } from './utils';\nimport { factory } from './utils/factory';\n\nconst generatedApiName = 'injectedRtkApi';\nconst v3DocCache: Record<string, OpenAPIV3.Document> = {};\n\nfunction defaultIsDataResponse(code: string, includeDefault: boolean) {\n if (includeDefault && code === 'default') {\n return true;\n }\n const parsedCode = Number(code);\n return !Number.isNaN(parsedCode) && parsedCode >= 200 && parsedCode < 300;\n}\n\nfunction getOperationName({ verb, path }: Pick<OperationDefinition, 'verb' | 'path' >) {\n return _getOperationName(verb, path, undefined);\n}\n\nfunction getTags({ verb, pathItem }: Pick<OperationDefinition, 'verb' | 'pathItem'>): string[] {\n return verb ? pathItem[verb]?.tags || [] : [];\n}\n\nfunction patternMatches(pattern?: TextMatcher) {\n const filters = Array.isArray(pattern) ? pattern : [pattern];\n return function matcher(operationName: string) {\n if (!pattern) return true;\n return filters.some((filter) =>\n typeof filter === 'string' ? filter === operationName : filter?.test(operationName)\n );\n };\n}\n\nfunction operationMatches(pattern?: EndpointMatcher) {\n const checkMatch = typeof pattern === 'function' ? pattern : patternMatches(pattern);\n return function matcher(operationDefinition: OperationDefinition) {\n if (!pattern) return true;\n const operationName = getOperationName(operationDefinition);\n return checkMatch(operationName, operationDefinition);\n };\n}\n\nfunction argumentMatches(pattern?: ParameterMatcher) {\n const checkMatch = typeof pattern === 'function' ? pattern : patternMatches(pattern);\n return function matcher(argumentDefinition: ParameterDefinition) {\n if (!pattern || argumentDefinition.in === 'path') return true;\n const argumentName = argumentDefinition.name;\n return checkMatch(argumentName, argumentDefinition);\n };\n}\n\nfunction withQueryComment<T extends ts.Node>(node: T, def: QueryArgDefinition, hasTrailingNewLine: boolean): T {\n const comment = def.origin === 'param' ? def.param.description : def.body.description;\n if (comment) {\n return ts.addSyntheticLeadingComment(\n node,\n ts.SyntaxKind.MultiLineCommentTrivia,\n `* ${comment} `,\n hasTrailingNewLine\n );\n }\n return node;\n}\n\nexport function getOverrides(\n operation: OperationDefinition,\n endpointOverrides?: EndpointOverrides[]\n): EndpointOverrides | undefined {\n return endpointOverrides?.find((override) => operationMatches(override.pattern)(operation));\n}\n\nexport async function generateApi(\n spec: string,\n {\n apiFile,\n apiImport = 'api',\n exportName = 'enhancedApi',\n argSuffix = 'ApiArg',\n responseSuffix = 'ApiResponse',\n operationNameSuffix = '',\n hooks = false,\n tag = false,\n outputFile,\n isDataResponse = defaultIsDataResponse,\n filterEndpoints,\n endpointOverrides,\n unionUndefined,\n encodePathParams = false,\n encodeQueryParams = false,\n flattenArg = false,\n includeDefault = false,\n useEnumType = false,\n mergeReadWriteOnly = false,\n httpResolverOptions,\n sharedTypesFile,\n }: GenerationOptions\n) {\n const v3Doc = (v3DocCache[spec] ??= await getV3Doc(spec, httpResolverOptions));\n\n const apiGen = new ApiGenerator(v3Doc, {\n unionUndefined,\n useEnumType,\n mergeReadWriteOnly,\n });\n\n const schemeTypeNames = new Set<string>();\n\n function addSchemeTypeName(name: string) {\n schemeTypeNames.add(name);\n schemeTypeNames.add(camelCase(name));\n schemeTypeNames.add(capitalize(camelCase(name)));\n }\n\n if (sharedTypesFile) {\n const resultFile = ts.createSourceFile(\n 'sharedTypes.ts',\n '',\n ts.ScriptTarget.Latest,\n /*setParentNodes*/ false,\n ts.ScriptKind.TS\n );\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n\n const allTypeDefinitions: ts.Statement[] = [];\n const definedTypeNames = new Set<string>();\n\n const components = v3Doc.components;\n if (components) {\n const componentDefinitions = Object.entries(components).map(([componentType, componentDefs]) => {\n const typeEntries = Object.entries(componentDefs as Record<string, unknown>)\n .map(([name, def]) => {\n addSchemeTypeName(name);\n const typeName = capitalize(camelCase(name));\n definedTypeNames.add(typeName);\n const typeNode = wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(def as OpenAPIV3.SchemaObject));\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n typeNode\n );\n });\n return factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(typeEntries),\n ts.NodeFlags.Namespace\n );\n });\n allTypeDefinitions.push(...componentDefinitions);\n }\n\n const enumEntries = [\n ...apiGen.enumAliases.filter(e => ts.isEnumDeclaration(e)),\n ...apiGen.enumAliases.filter(e => ts.isTypeAliasDeclaration(e)),\n ].map(enumDecl => {\n if (ts.isEnumDeclaration(enumDecl)) {\n return factory.createEnumDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n enumDecl.name,\n enumDecl.members\n );\n } else if (ts.isTypeAliasDeclaration(enumDecl)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n enumDecl.name,\n enumDecl.typeParameters,\n enumDecl.type\n );\n }\n return enumDecl;\n });\n \n const unionTypeEnums = apiGen.aliases\n .filter(alias => {\n if (ts.isTypeAliasDeclaration(alias) && alias.type) {\n return ts.isUnionTypeNode(alias.type);\n }\n return false;\n })\n .map(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n alias.name,\n alias.typeParameters,\n alias.type\n );\n }\n return alias;\n });\n \n const allEnumEntries = [...enumEntries, ...unionTypeEnums];\n \n if (allEnumEntries.length > 0) {\n allTypeDefinitions.push(\n factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Enum'),\n factory.createModuleBlock(allEnumEntries),\n ts.NodeFlags.Namespace\n )\n );\n }\n\n if (apiGen.aliases.length > 0) {\n const aliasEntries = apiGen.aliases\n .filter(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n const isDefinedInComponents = definedTypeNames.has(alias.name.text);\n const isUnionTypeEnum = ts.isUnionTypeNode(alias.type);\n return !isDefinedInComponents && !isUnionTypeEnum;\n }\n return false;\n })\n .map(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n alias.name,\n alias.typeParameters,\n alias.type\n );\n }\n return alias;\n });\n\n if (aliasEntries.length > 0) {\n const existingSchemeIndex = allTypeDefinitions.findIndex(def => \n ts.isModuleDeclaration(def) && \n ts.isIdentifier(def.name) && \n def.name.text === 'Scheme'\n );\n\n if (existingSchemeIndex >= 0) {\n const existingScheme = allTypeDefinitions[existingSchemeIndex] as ts.ModuleDeclaration;\n const mergedMembers = [...(existingScheme.body as ts.ModuleBlock).statements, ...aliasEntries];\n allTypeDefinitions[existingSchemeIndex] = factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(mergedMembers),\n ts.NodeFlags.Namespace\n );\n } else {\n allTypeDefinitions.push(\n factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(aliasEntries),\n ts.NodeFlags.Namespace\n )\n );\n }\n }\n }\n\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n \n const sharedTypesDir = path.dirname(sharedTypesFile);\n await fs.mkdir(sharedTypesDir, { recursive: true });\n \n const output = printer.printNode(\n ts.EmitHint.Unspecified,\n factory.createSourceFile(\n allTypeDefinitions,\n factory.createToken(ts.SyntaxKind.EndOfFileToken),\n ts.NodeFlags.None\n ),\n resultFile\n );\n\n await fs.writeFile(sharedTypesFile, output, 'utf-8');\n }\n\n if (apiGen.spec.components?.schemas) {\n apiGen.preprocessComponents(apiGen.spec.components.schemas);\n }\n\n const operationDefinitions = getOperationDefinitions(v3Doc).filter(operationMatches(filterEndpoints));\n\n const resultFile = ts.createSourceFile(\n 'someFileName.ts',\n '',\n ts.ScriptTarget.Latest,\n /*setParentNodes*/ false,\n ts.ScriptKind.TS\n );\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n\n const interfaces: Record<string, ts.InterfaceDeclaration | ts.TypeAliasDeclaration> = {};\n function registerInterface(declaration: ts.InterfaceDeclaration | ts.TypeAliasDeclaration) {\n const name = declaration.name.escapedText.toString();\n if (name in interfaces) {\n throw new Error(`interface/type alias ${name} already registered`);\n }\n interfaces[name] = declaration;\n return declaration;\n }\n\n if (outputFile) {\n outputFile = path.resolve(process.cwd(), outputFile);\n if (apiFile.startsWith('.')) {\n apiFile = path.relative(path.dirname(outputFile), apiFile);\n apiFile = apiFile.replace(/\\\\/g, '/');\n if (!apiFile.startsWith('.')) apiFile = `./${apiFile}`;\n }\n }\n apiFile = apiFile.replace(/\\.[jt]sx?$/, '');\n\n const sharedTypesImportPath = sharedTypesFile && outputFile\n ? (() => {\n let rel = path.relative(path.dirname(outputFile), sharedTypesFile)\n .replace(/\\\\/g, '/')\n .replace(/\\.[jt]sx?$/, '');\n if (!rel.startsWith('.')) rel = './' + rel;\n return rel;\n })()\n : './shared-types';\n\n return printer.printNode(\n ts.EmitHint.Unspecified,\n factory.createSourceFile(\n [\n generateImportNode(apiFile, { [apiImport]: 'api' }),\n generateImportNode('@acrool/react-fetcher', { IRestFulEndpointsQueryReturn: 'IRestFulEndpointsQueryReturn' }),\n ...(sharedTypesFile ? [\n generateImportNode(sharedTypesImportPath, { \n Scheme: 'Scheme',\n ...(useEnumType ? { Enum: 'Enum' } : {})\n })\n ] : []),\n ...(tag ? [generateTagTypes({ addTagTypes: extractAllTagTypes({ operationDefinitions }) })] : []),\n generateCreateApiCall({\n tag,\n endpointDefinitions: factory.createObjectLiteralExpression(\n operationDefinitions.map((operationDefinition) =>\n generateEndpoint({\n operationDefinition,\n overrides: getOverrides(operationDefinition, endpointOverrides),\n sharedTypesFile: !!sharedTypesFile,\n })\n ),\n true\n ),\n }),\n factory.createExportAssignment(\n undefined,\n undefined,\n factory.createIdentifier(generatedApiName)\n ),\n ...Object.values(interfaces),\n ...(sharedTypesFile ? [] : [...apiGen.aliases, ...apiGen.enumAliases]),\n ...(hooks\n ? [\n generateReactHooks({\n exportName: generatedApiName,\n operationDefinitions,\n endpointOverrides,\n config: hooks,\n }),\n ]\n : []),\n ],\n factory.createToken(ts.SyntaxKind.EndOfFileToken),\n ts.NodeFlags.None\n ),\n resultFile\n );\n\n function extractAllTagTypes({ operationDefinitions }: { operationDefinitions: OperationDefinition[] }) {\n const allTagTypes = new Set<string>();\n\n for (const operationDefinition of operationDefinitions) {\n const { verb, pathItem } = operationDefinition;\n for (const tag of getTags({ verb, pathItem })) {\n allTagTypes.add(tag);\n }\n }\n return [...allTagTypes];\n }\n\n function generateEndpoint({\n operationDefinition,\n overrides,\n sharedTypesFile,\n }: {\n operationDefinition: OperationDefinition;\n overrides?: EndpointOverrides;\n sharedTypesFile: boolean;\n }) {\n const {\n verb,\n path,\n pathItem,\n operation,\n operation: { responses, requestBody },\n } = operationDefinition;\n const operationName = getOperationName({ verb, path });\n const tags = tag ? getTags({ verb, pathItem }) : [];\n const isQuery = testIsQuery(verb, overrides);\n\n const returnsJson = apiGen.getResponseType(responses) === 'json';\n let ResponseType: ts.TypeNode = factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword);\n if (returnsJson) {\n const returnTypes = Object.entries(responses || {})\n .map(\n ([code, response]) =>\n [\n code,\n apiGen.resolve(response),\n wrapWithSchemeIfComponent(\n apiGen.getTypeFromResponse(response, 'readOnly') ||\n factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)\n ),\n ] as const\n )\n .filter(([status, response]) =>\n isDataResponse(status, includeDefault, apiGen.resolve(response), responses || {})\n )\n .filter(([_1, _2, type]) => type !== keywordType.void)\n .map(([code, response, type]) => {\n return ts.addSyntheticLeadingComment(\n type,\n ts.SyntaxKind.MultiLineCommentTrivia,\n `* status ${code} ${response.description} `,\n false\n );\n });\n if (returnTypes.length > 0) {\n ResponseType = factory.createUnionTypeNode(returnTypes);\n }\n }\n\n const ResponseTypeName = factory.createTypeReferenceNode(\n registerInterface(\n factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n capitalize(operationName + operationNameSuffix + responseSuffix),\n undefined,\n ResponseType\n )\n ).name\n );\n\n const operationParameters = apiGen.resolveArray(operation.parameters);\n const pathItemParameters = apiGen\n .resolveArray(pathItem.parameters)\n .filter((pp) => !operationParameters.some((op) => op.name === pp.name && op.in === pp.in));\n\n const parameters = supportDeepObjects([...pathItemParameters, ...operationParameters])\n .filter(argumentMatches(overrides?.parameterFilter))\n .filter(param => param.in !== 'header');\n\n const allNames = parameters.map((p) => p.name);\n const queryArg: QueryArgDefinitions = {};\n function generateName(name: string, potentialPrefix: string) {\n const isPureSnakeCase = /^[a-zA-Z][a-zA-Z0-9_]*$/.test(name);\n const hasNamingConflict = allNames.filter((n) => n === name).length > 1;\n if (hasNamingConflict) {\n name = `${potentialPrefix}_${name}`;\n }\n const camelCaseName = camelCase(name);\n if (isPureSnakeCase && !allNames.includes(camelCaseName)) {\n name = camelCaseName;\n }\n while (name in queryArg) {\n name = `_${name}`;\n }\n return name;\n }\n\n for (const param of parameters) {\n const name = generateName(param.name, param.in);\n queryArg[name] = {\n origin: 'param',\n name,\n originalName: param.name,\n type: wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(isReference(param) ? param : param.schema, undefined, 'writeOnly')),\n required: param.required,\n param,\n };\n }\n\n if (requestBody) {\n const body = apiGen.resolve(requestBody);\n const schema = apiGen.getSchemaFromContent(body.content);\n const type = wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(schema));\n const schemaName = camelCase(\n (type as any).name ||\n getReferenceName(schema) ||\n (typeof schema === 'object' && 'title' in schema && schema.title) ||\n 'body'\n );\n const name = generateName(schemaName in queryArg ? 'body' : schemaName, 'body');\n\n queryArg[name] = {\n origin: 'body',\n name,\n originalName: schemaName,\n type: wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(schema, undefined, 'writeOnly')),\n required: true,\n body,\n };\n }\n\n const propertyName = (name: string | ts.PropertyName): ts.PropertyName => {\n if (typeof name === 'string') {\n return isValidIdentifier(name) ? factory.createIdentifier(name) : factory.createStringLiteral(name);\n }\n return name;\n };\n\n const queryArgValues = Object.values(queryArg);\n\n const isFlatArg = flattenArg && queryArgValues.length === 1;\n const QueryArg = factory.createTypeReferenceNode(\n registerInterface(\n factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n capitalize(operationName + operationNameSuffix + argSuffix),\n undefined,\n queryArgValues.length > 0\n ? isFlatArg\n ? withQueryComment(\n factory.createUnionTypeNode([\n queryArgValues[0].type,\n ...(!queryArgValues[0].required\n ? [factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)]\n : []),\n ]),\n queryArgValues[0],\n false\n )\n : factory.createTypeLiteralNode(\n queryArgValues.map((def) =>\n withQueryComment(\n factory.createPropertySignature(\n undefined,\n propertyName(def.name),\n createQuestionToken(!def.required),\n def.type\n ),\n def,\n true\n )\n )\n )\n : factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword)\n )\n ).name\n );\n\n return generateEndpointDefinition({\n operationName: operationNameSuffix ? capitalize(operationName + operationNameSuffix) : operationName,\n type: isQuery ? 'query' : 'mutation',\n Response: ResponseTypeName,\n QueryArg: factory.createTypeReferenceNode(\n factory.createIdentifier('IRestFulEndpointsQueryReturn'),\n [QueryArg]\n ),\n queryFn: generateQueryFn({\n operationDefinition,\n queryArg,\n isQuery,\n isFlatArg,\n encodePathParams,\n encodeQueryParams,\n }),\n extraEndpointsProps: isQuery\n ? generateQueryEndpointProps({ operationDefinition })\n : generateMutationEndpointProps({ operationDefinition }),\n tags,\n });\n }\n\n function generateQueryFn({\n operationDefinition,\n queryArg,\n isFlatArg,\n isQuery,\n encodePathParams,\n encodeQueryParams,\n }: {\n operationDefinition: OperationDefinition;\n queryArg: QueryArgDefinitions;\n isFlatArg: boolean;\n isQuery: boolean;\n encodePathParams: boolean;\n encodeQueryParams: boolean;\n }) {\n const { path, verb } = operationDefinition;\n\n const bodyParameter = Object.values(queryArg).find((def) => def.origin === 'body');\n\n const rootObject = factory.createIdentifier('queryArg');\n const variablesObject = factory.createPropertyAccessExpression(rootObject, factory.createIdentifier('variables'));\n\n function pickParams(paramIn: string) {\n return Object.values(queryArg).filter((def) => def.origin === 'param' && def.param.in === paramIn);\n }\n\n function createObjectLiteralProperty(parameters: QueryArgDefinition[], propertyName: string) {\n if (parameters.length === 0) return undefined;\n\n const properties = parameters.map((param) => {\n const value = isFlatArg \n ? variablesObject \n : factory.createPropertyAccessExpression(variablesObject, factory.createIdentifier(param.name));\n\n const encodedValue =\n encodeQueryParams && param.param?.in === 'query'\n ? factory.createConditionalExpression(\n value,\n undefined,\n factory.createCallExpression(factory.createIdentifier('encodeURIComponent'), undefined, [\n factory.createCallExpression(factory.createIdentifier('String'), undefined, [value]),\n ]),\n undefined,\n factory.createIdentifier('undefined')\n )\n : value;\n\n return createPropertyAssignment(param.originalName, encodedValue);\n });\n\n return factory.createPropertyAssignment(\n factory.createIdentifier(propertyName),\n factory.createObjectLiteralExpression(properties, true)\n );\n }\n\n return factory.createArrowFunction(\n undefined,\n undefined,\n [factory.createParameterDeclaration(undefined, undefined, rootObject, undefined, undefined, undefined)],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createParenthesizedExpression(\n factory.createObjectLiteralExpression(\n [\n factory.createPropertyAssignment(\n factory.createIdentifier('url'),\n generatePathExpression(path, pickParams('path'), variablesObject, isFlatArg, encodePathParams)\n ),\n isQuery && verb.toUpperCase() === 'GET'\n ? undefined\n : factory.createPropertyAssignment(\n factory.createIdentifier('method'),\n factory.createStringLiteral(verb.toUpperCase())\n ),\n bodyParameter === undefined\n ? undefined\n : factory.createPropertyAssignment(\n factory.createIdentifier('body'),\n isFlatArg\n ? variablesObject\n : factory.createPropertyAccessExpression(variablesObject, factory.createIdentifier(bodyParameter.name))\n ),\n createObjectLiteralProperty(pickParams('cookie'), 'cookies'),\n createObjectLiteralProperty(pickParams('query'), 'params'),\n factory.createPropertyAssignment(\n factory.createIdentifier('fetchOptions'),\n factory.createPropertyAccessChain(\n rootObject,\n factory.createToken(ts.SyntaxKind.QuestionDotToken),\n factory.createIdentifier('fetchOptions')\n )\n ),\n ].filter(removeUndefined),\n false\n )\n )\n );\n }\n\n function generateQueryEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {\n return {};\n }\n\n function generateMutationEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {\n return {};\n }\n\n function wrapWithSchemeIfComponent(typeNode: ts.TypeNode): ts.TypeNode {\n if (ts.isTypeReferenceNode(typeNode) && ts.isIdentifier(typeNode.typeName)) {\n const typeName = typeNode.typeName.text;\n \n // 檢查是否為 enum 類型(包括在 enumAliases 和 aliases 中的)\n const isEnumType = useEnumType && (\n apiGen.enumAliases.some(enumDecl => {\n if (ts.isEnumDeclaration(enumDecl) || ts.isTypeAliasDeclaration(enumDecl)) {\n return enumDecl.name.text === typeName;\n }\n return false;\n }) ||\n apiGen.aliases.some(alias => {\n if (ts.isTypeAliasDeclaration(alias) && alias.type) {\n // 檢查是否為 union type 的 enum\n if (ts.isUnionTypeNode(alias.type)) {\n return alias.name.text === typeName;\n }\n }\n return false;\n })\n );\n \n if (isEnumType) {\n return factory.createTypeReferenceNode(\n factory.createQualifiedName(\n factory.createIdentifier('Enum'),\n typeNode.typeName\n ),\n typeNode.typeArguments?.map(wrapWithSchemeIfComponent)\n );\n }\n \n if (schemeTypeNames.has(typeName)) {\n return factory.createTypeReferenceNode(\n factory.createQualifiedName(\n factory.createIdentifier('Scheme'),\n typeNode.typeName\n ),\n typeNode.typeArguments?.map(wrapWithSchemeIfComponent)\n );\n }\n if (typeNode.typeArguments) {\n return factory.createTypeReferenceNode(\n typeNode.typeName,\n typeNode.typeArguments.map(wrapWithSchemeIfComponent)\n );\n }\n }\n if (ts.isArrayTypeNode(typeNode)) {\n return factory.createArrayTypeNode(wrapWithSchemeIfComponent(typeNode.elementType));\n }\n if (ts.isUnionTypeNode(typeNode)) {\n // 檢查是否為 enum 的 union type\n const unionTypes = typeNode.types;\n if (unionTypes.length > 0 && unionTypes.every(type => \n ts.isLiteralTypeNode(type) && \n (ts.isStringLiteral(type.literal) || ts.isNumericLiteral(type.literal))\n )) {\n // 這是一個 enum 的 union type,我們需要找到對應的 enum 類型\n const enumValues = unionTypes.map(type => {\n if (ts.isLiteralTypeNode(type)) {\n if (ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n } else if (ts.isNumericLiteral(type.literal)) {\n return type.literal.text;\n }\n }\n return null;\n }).filter(Boolean);\n \n // 查找對應的 enum 類型\n const matchingEnum = apiGen.aliases.find(alias => {\n if (ts.isTypeAliasDeclaration(alias) && ts.isUnionTypeNode(alias.type)) {\n const aliasValues = alias.type.types.map(type => {\n if (ts.isLiteralTypeNode(type)) {\n if (ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n } else if (ts.isNumericLiteral(type.literal)) {\n return type.literal.text;\n }\n }\n return null;\n }).filter(Boolean);\n \n return aliasValues.length === enumValues.length && \n aliasValues.every(val => enumValues.includes(val));\n }\n return false;\n });\n \n // 對於所有的 enum 類型,直接使用字串型別,不轉換為 Enum\n // 這樣可以避免自動命名造成的變更問題\n if (matchingEnum && ts.isTypeAliasDeclaration(matchingEnum)) {\n // 直接返回原始的 union type,不轉換為 Enum\n return typeNode;\n }\n }\n \n return factory.createUnionTypeNode(typeNode.types.map(wrapWithSchemeIfComponent));\n }\n if (ts.isTypeLiteralNode(typeNode)) {\n return factory.createTypeLiteralNode(\n typeNode.members.map(member => {\n if (ts.isPropertySignature(member) && member.type) {\n return factory.updatePropertySignature(\n member,\n member.modifiers,\n member.name,\n member.questionToken,\n wrapWithSchemeIfComponent(member.type)\n );\n }\n return member;\n })\n );\n }\n return typeNode;\n }\n}\n\nfunction accessProperty(rootObject: ts.Identifier, propertyName: string) {\n return isValidIdentifier(propertyName)\n ? factory.createPropertyAccessExpression(rootObject, factory.createIdentifier(propertyName))\n : factory.createElementAccessExpression(rootObject, factory.createStringLiteral(propertyName));\n}\n\nfunction generatePathExpression(\n path: string,\n pathParameters: QueryArgDefinition[],\n rootObject: ts.Identifier | ts.PropertyAccessExpression,\n isFlatArg: boolean,\n encodePathParams: boolean\n) {\n const expressions: Array<[string, string]> = [];\n\n const head = path.replace(/\\{(.*?)}(.*?)(?=\\{|$)/g, (_, expression, literal) => {\n const param = pathParameters.find((p) => p.originalName === expression);\n if (!param) {\n throw new Error(`path parameter ${expression} does not seem to be defined in '${path}'!`);\n }\n expressions.push([param.name, literal]);\n return '';\n });\n\n return expressions.length\n ? factory.createTemplateExpression(\n factory.createTemplateHead(head),\n expressions.map(([prop, literal], index) => {\n const value = isFlatArg \n ? rootObject \n : factory.createPropertyAccessExpression(rootObject, factory.createIdentifier(prop));\n const encodedValue = encodePathParams\n ? factory.createCallExpression(factory.createIdentifier('encodeURIComponent'), undefined, [\n factory.createCallExpression(factory.createIdentifier('String'), undefined, [value]),\n ])\n : value;\n return factory.createTemplateSpan(\n encodedValue,\n index === expressions.length - 1\n ? factory.createTemplateTail(literal)\n : factory.createTemplateMiddle(literal)\n );\n })\n )\n : factory.createNoSubstitutionTemplateLiteral(head);\n}\n\ntype QueryArgDefinition = {\n name: string;\n originalName: string;\n type: ts.TypeNode;\n required?: boolean;\n param?: OpenAPIV3.ParameterObject;\n} & (\n | {\n origin: 'param';\n param: OpenAPIV3.ParameterObject;\n }\n | {\n origin: 'body';\n body: OpenAPIV3.RequestBodyObject;\n }\n);\ntype QueryArgDefinitions = Record<string, QueryArgDefinition>;\n","import ts from 'typescript';\nimport semver from 'semver';\n\nconst originalFactory = ts.factory;\n\nfunction createImportSpecifier(propertyName: ts.Identifier | undefined, name: ts.Identifier): ts.ImportSpecifier {\n if (semver.satisfies(ts.version, '>= 4.5'))\n // @ts-ignore\n return originalFactory.createImportSpecifier(false, propertyName, name);\n // @ts-ignore\n return originalFactory.createImportSpecifier(propertyName, name);\n}\n\nfunction createExportSpecifier(\n propertyName: string | ts.Identifier | undefined,\n name: string | ts.Identifier\n): ts.ExportSpecifier {\n if (semver.satisfies(ts.version, '>= 4.5'))\n // @ts-ignore\n return originalFactory.createExportSpecifier(false, propertyName, name);\n // @ts-ignore\n return originalFactory.createExportSpecifier(propertyName, name);\n}\n\nexport const factory = {\n ...originalFactory,\n createImportSpecifier,\n createExportSpecifier,\n};\n","import { factory } from './utils/factory';\nimport ts from 'typescript';\n\nconst defaultEndpointBuilder = factory.createIdentifier('build');\n\nexport type ObjectPropertyDefinitions = Record<string, ts.Expression | undefined>;\nexport function generateObjectProperties(obj: ObjectPropertyDefinitions) {\n return Object.entries(obj)\n .filter(([_, v]) => v)\n .map(([k, v]) => factory.createPropertyAssignment(factory.createIdentifier(k), v as ts.Expression));\n}\n\nexport function generateImportNode(pkg: string, namedImports: Record<string, string>, defaultImportName?: string) {\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(\n false,\n defaultImportName !== undefined ? factory.createIdentifier(defaultImportName) : undefined,\n factory.createNamedImports(\n Object.entries(namedImports).map(([propertyName, name]) =>\n factory.createImportSpecifier(\n name === propertyName ? undefined : factory.createIdentifier(propertyName),\n factory.createIdentifier(name)\n )\n )\n )\n ),\n factory.createStringLiteral(pkg)\n );\n}\n\nexport function generateCreateApiCall({\n endpointBuilder = defaultEndpointBuilder,\n endpointDefinitions,\n tag,\n}: {\n endpointBuilder?: ts.Identifier;\n endpointDefinitions: ts.ObjectLiteralExpression;\n tag: boolean;\n}) {\n const injectEndpointsObjectLiteralExpression = factory.createObjectLiteralExpression(\n generateObjectProperties({\n endpoints: factory.createArrowFunction(\n undefined,\n undefined,\n [factory.createParameterDeclaration(undefined, undefined, endpointBuilder, undefined, undefined, undefined)],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createParenthesizedExpression(endpointDefinitions)\n ),\n overrideExisting: factory.createFalse(),\n }),\n true\n );\n if (tag) {\n const enhanceEndpointsObjectLiteralExpression = factory.createObjectLiteralExpression(\n [factory.createShorthandPropertyAssignment(factory.createIdentifier('addTagTypes'), undefined)],\n true\n );\n return factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('injectedRtkApi'),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier('api'),\n factory.createIdentifier('enhanceEndpoints')\n ),\n undefined,\n [enhanceEndpointsObjectLiteralExpression]\n ),\n factory.createIdentifier('injectEndpoints')\n ),\n undefined,\n [injectEndpointsObjectLiteralExpression]\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n }\n\n return factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('injectedRtkApi'),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier('api'),\n factory.createIdentifier('injectEndpoints')\n ),\n undefined,\n [injectEndpointsObjectLiteralExpression]\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n}\n\nexport function generateEndpointDefinition({\n operationName,\n type,\n Response,\n QueryArg,\n queryFn,\n endpointBuilder = defaultEndpointBuilder,\n extraEndpointsProps,\n tags,\n}: {\n operationName: string;\n type: 'query' | 'mutation';\n Response: ts.TypeReferenceNode;\n QueryArg: ts.TypeReferenceNode;\n queryFn: ts.Expression;\n endpointBuilder?: ts.Identifier;\n extraEndpointsProps: ObjectPropertyDefinitions;\n tags: string[];\n}) {\n const objectProperties = generateObjectProperties({ query: queryFn, ...extraEndpointsProps });\n if (tags.length > 0) {\n objectProperties.push(\n factory.createPropertyAssignment(\n factory.createIdentifier(type === 'query' ? 'providesTags' : 'invalidatesTags'),\n factory.createArrayLiteralExpression(tags.map((tag) => factory.createStringLiteral(tag), false))\n )\n );\n }\n return factory.createPropertyAssignment(\n factory.createIdentifier(operationName),\n\n factory.createCallExpression(\n factory.createPropertyAccessExpression(endpointBuilder, factory.createIdentifier(type)),\n [Response, QueryArg],\n [factory.createObjectLiteralExpression(objectProperties, true)]\n )\n );\n}\n\nexport function generateTagTypes({ addTagTypes }: { addTagTypes: string[] }) {\n return factory.createVariableStatement(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('addTagTypes'),\n undefined,\n undefined,\n factory.createAsExpression(\n factory.createArrayLiteralExpression(\n addTagTypes.map((tagType) => factory.createStringLiteral(tagType)),\n true\n ),\n factory.createTypeReferenceNode(factory.createIdentifier('const'), undefined)\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n}\n","import ts from 'typescript';\nimport { getOperationName } from 'oazapfts/generate';\nimport { capitalize, isQuery } from '../utils';\nimport type { OperationDefinition, EndpointOverrides, ConfigFile } from '../types';\nimport { getOverrides } from '../generate';\nimport { factory } from '../utils/factory';\n\ntype HooksConfigOptions = NonNullable<ConfigFile['hooks']>;\n\ntype GetReactHookNameParams = {\n operationDefinition: OperationDefinition;\n endpointOverrides: EndpointOverrides[] | undefined;\n config: HooksConfigOptions;\n};\n\ntype CreateBindingParams = {\n operationDefinition: OperationDefinition;\n overrides?: EndpointOverrides;\n isLazy?: boolean;\n};\n\nconst createBinding = ({\n operationDefinition: { verb, path },\n overrides,\n isLazy = false,\n}: CreateBindingParams) =>\n factory.createBindingElement(\n undefined,\n undefined,\n factory.createIdentifier(\n `use${isLazy ? 'Lazy' : ''}${capitalize(getOperationName(verb, path, undefined))}${\n isQuery(verb, overrides) ? 'Query' : 'Mutation'\n }`\n ),\n undefined\n );\n\nconst getReactHookName = ({ operationDefinition, endpointOverrides, config }: GetReactHookNameParams) => {\n const overrides = getOverrides(operationDefinition, endpointOverrides);\n\n const baseParams = {\n operationDefinition,\n overrides,\n };\n\n const _isQuery = isQuery(operationDefinition.verb, overrides);\n\n // If `config` is true, just generate everything\n if (typeof config === 'boolean') {\n return createBinding(baseParams);\n }\n\n // `config` is an object and we need to check for the configuration of each property\n if (_isQuery) {\n return [\n ...(config.queries ? [createBinding(baseParams)] : []),\n ...(config.lazyQueries ? [createBinding({ ...baseParams, isLazy: true })] : []),\n ];\n }\n\n return config.mutations ? createBinding(baseParams) : [];\n};\n\ntype GenerateReactHooksParams = {\n exportName: string;\n operationDefinitions: OperationDefinition[];\n endpointOverrides: EndpointOverrides[] | undefined;\n config: HooksConfigOptions;\n};\nexport const generateReactHooks = ({\n exportName,\n operationDefinitions,\n endpointOverrides,\n config,\n}: GenerateReactHooksParams) =>\n factory.createVariableStatement(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createObjectBindingPattern(\n operationDefinitions\n .map((operationDefinition) => getReactHookName({ operationDefinition, endpointOverrides, config }))\n .flat()\n ),\n undefined,\n undefined,\n factory.createIdentifier(exportName)\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n","export function capitalize(str: string) {\n return str.replace(str[0], str[0].toUpperCase());\n}\n","import type SwaggerParser from '@apidevtools/swagger-parser';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nexport type OperationDefinition = {\n path: string;\n verb: (typeof operationKeys)[number];\n pathItem: OpenAPIV3.PathItemObject;\n operation: OpenAPIV3.OperationObject;\n};\n\nexport type ParameterDefinition = OpenAPIV3.ParameterObject;\n\ntype Require<T, K extends keyof T> = { [k in K]-?: NonNullable<T[k]> } & Omit<T, K>;\ntype Optional<T, K extends keyof T> = { [k in K]?: NonNullable<T[k]> } & Omit<T, K>;\ntype Id<T> = { [K in keyof T]: T[K] } & {};\ntype AtLeastOneKey<T> = {\n [K in keyof T]-?: Pick<T, K> & Partial<T>;\n}[keyof T];\n\nexport const operationKeys = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const;\n\nexport type GenerationOptions = Id<\n CommonOptions &\n Optional<OutputFileOptions, 'outputFile'> & {\n isDataResponse?(\n code: string,\n includeDefault: boolean,\n response: OpenAPIV3.ResponseObject,\n allResponses: OpenAPIV3.ResponsesObject\n ): boolean;\n }\n>;\n\nexport interface CommonOptions {\n apiFile: string;\n /**\n * filename or url\n */\n schemaFile: string;\n /**\n * defaults to \"api\"\n */\n apiImport?: string;\n /**\n * defaults to \"enhancedApi\"\n */\n exportName?: string;\n /**\n * defaults to \"ApiArg\"\n */\n argSuffix?: string;\n /**\n * defaults to \"ApiResponse\"\n */\n responseSuffix?: string;\n /**\n * defaults to empty\n */\n operationNameSuffix?: string;\n /**\n * defaults to `false`\n * `true` will generate hooks for queries and mutations, but no lazyQueries\n */\n hooks?: boolean | { queries: boolean; lazyQueries: boolean; mutations: boolean };\n /**\n * defaults to false\n * `true` will generate a union type for `undefined` properties like: `{ id?: string | undefined }` instead of `{ id?: string }`\n */\n unionUndefined?: boolean;\n /**\n * defaults to false\n * `true` will result in all generated endpoints having `providesTags`/`invalidatesTags` declarations for the `tags` of their respective operation definition\n * @see https://redux-toolkit.js.org/rtk-query/usage/code-generation for more information\n */\n tag?: boolean;\n /**\n * defaults to false\n * `true` will add `encodeURIComponent` to the generated path parameters\n */\n encodePathParams?: boolean;\n /**\n * defaults to false\n * `true` will add `encodeURIComponent` to the generated query parameters\n */\n encodeQueryParams?: boolean;\n /**\n * defaults to false\n * `true` will \"flatten\" the arg so that you can do things like `useGetEntityById(1)` instead of `useGetEntityById({ entityId: 1 })`\n */\n flattenArg?: boolean;\n /**\n * default to false\n * If set to `true`, the default response type will be included in the generated code for all endpoints.\n * @see https://swagger.io/docs/specification/describing-responses/#default\n */\n includeDefault?: boolean;\n /**\n * default to false\n * `true` will not generate separate types for read-only and write-only properties.\n */\n mergeReadWriteOnly?: boolean;\n /**\n *\n * HTTPResolverOptions object that is passed to the SwaggerParser bundle function.\n */\n httpResolverOptions?: SwaggerParser.HTTPResolverOptions;\n\n /**\n * defaults to undefined\n * If present the given file will be used as prettier config when formatting the generated code. If undefined the default prettier config\n * resolution mechanism will be used.\n */\n prettierConfigFile?: string;\n}\n\nexport type TextMatcher = string | RegExp | (string | RegExp)[];\n\nexport type EndpointMatcherFunction = (operationName: string, operationDefinition: OperationDefinition) => boolean;\n\nexport type EndpointMatcher = TextMatcher | EndpointMatcherFunction;\n\nexport type ParameterMatcherFunction = (parameterName: string, parameterDefinition: ParameterDefinition) => boolean;\n\nexport type ParameterMatcher = TextMatcher | ParameterMatcherFunction;\n\nexport interface OutputFileOptions extends Partial<CommonOptions> {\n outputFile: string;\n filterEndpoints?: EndpointMatcher;\n endpointOverrides?: EndpointOverrides[];\n /**\n * defaults to false\n * If passed as true it will generate TS enums instead of union of strings\n */\n useEnumType?: boolean;\n sharedTypesFile?: string;\n}\n\nexport type EndpointOverrides = {\n pattern: EndpointMatcher;\n} & AtLeastOneKey<{\n type: 'mutation' | 'query';\n parameterFilter: ParameterMatcher;\n}>;\n\nexport type OutputFilesConfig = {\n [outputFile: string]: {\n groupMatch: RegExp,\n filterEndpoint?: (groupName: string) => RegExp\n }\n};\n\nexport type ConfigFile =\n | Id<Require<CommonOptions & OutputFileOptions, 'outputFile'>>\n | Id<\n Omit<CommonOptions, 'outputFile'> & {\n // outputFiles: { [outputFile: string]: Omit<OutputFileOptions, 'outputFile'> };\n outputFiles: OutputFilesConfig\n }\n >;\n","import type { OpenAPIV3 } from 'openapi-types';\nimport type { OperationDefinition } from '../types';\nimport { operationKeys } from '../types';\n\nexport function getOperationDefinitions(v3Doc: OpenAPIV3.Document): OperationDefinition[] {\n return Object.entries(v3Doc.paths).flatMap(([path, pathItem]) =>\n !pathItem\n ? []\n : Object.entries(pathItem)\n .filter((arg): arg is [(typeof operationKeys)[number], OpenAPIV3.OperationObject] =>\n operationKeys.includes(arg[0] as any)\n )\n .map(([verb, operation]) => ({\n path,\n verb,\n pathItem,\n operation,\n }))\n );\n}\n","import SwaggerParser from '@apidevtools/swagger-parser';\nimport type { OpenAPIV3 } from 'openapi-types';\n// @ts-ignore\nimport converter from 'swagger2openapi';\n\nexport async function getV3Doc(\n spec: string,\n httpResolverOptions?: SwaggerParser.HTTPResolverOptions\n): Promise<OpenAPIV3.Document> {\n const doc = await SwaggerParser.bundle(spec, {\n resolve: {\n http: httpResolverOptions,\n },\n });\n\n const isOpenApiV3 = 'openapi' in doc && doc.openapi.startsWith('3');\n\n if (isOpenApiV3) {\n return doc as OpenAPIV3.Document;\n } else {\n const result = await converter.convertObj(doc, {});\n return result.openapi as OpenAPIV3.Document;\n }\n}\n","import type { EndpointOverrides, operationKeys } from '../types';\n\nexport function isQuery(verb: (typeof operationKeys)[number], overrides: EndpointOverrides | undefined) {\n if (overrides?.type) {\n return overrides.type === 'query';\n }\n return verb === 'get';\n}\n","export function isValidUrl(string: string) {\n try {\n new URL(string);\n } catch (_) {\n return false;\n }\n\n return true;\n}\n","import path from 'node:path';\nimport prettier from 'prettier';\nimport type { BuiltInParserName } from 'prettier';\n\nconst EXTENSION_TO_PARSER: Record<string, BuiltInParserName> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'babel',\n jsx: 'babel',\n 'js.flow': 'flow',\n flow: 'flow',\n gql: 'graphql',\n graphql: 'graphql',\n css: 'scss',\n scss: 'scss',\n less: 'scss',\n stylus: 'scss',\n markdown: 'markdown',\n md: 'markdown',\n json: 'json',\n};\n\nexport async function prettify(filePath: string | null, content: string, prettierConfigFile?: string): Promise<string> {\n let config = null;\n let parser = 'typescript';\n\n if (filePath) {\n const fileExtension = path.extname(filePath).slice(1);\n parser = EXTENSION_TO_PARSER[fileExtension];\n config = await prettier.resolveConfig(process.cwd(), {\n useCache: true,\n editorconfig: !prettierConfigFile,\n config: prettierConfigFile,\n });\n } else if (prettierConfigFile) {\n config = await prettier.resolveConfig(process.cwd(), {\n useCache: true,\n config: prettierConfigFile,\n });\n }\n\n return prettier.format(content, {\n parser,\n ...config,\n });\n}\n","export function removeUndefined<T>(t: T | undefined): t is T {\n return typeof t !== 'undefined';\n}\n"],"mappings":"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","names":["import_node_path","import_node_path","import_generate","import_typescript","ts","semver","import_typescript","ts","import_typescript","path","SwaggerParser","converter","path","prettier","path","ts","getOperationName","path","_getOperationName","ts","ApiGenerator","camelCase","resultFile","printer","fs","operationDefinitions","tag","sharedTypesFile","isQuery","encodePathParams","encodeQueryParams","path","import_lodash","require","path","fs","camelCase","paths"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/generate.ts","../src/utils/factory.ts","../src/codegen.ts","../src/generators/react-hooks.ts","../src/utils/capitalize.ts","../src/types.ts","../src/utils/getOperationDefinitions.ts","../src/utils/getV3Doc.ts","../src/utils/isQuery.ts","../src/utils/isValidUrl.ts","../src/utils/prettier.ts","../src/utils/removeUndefined.ts"],"sourcesContent":["import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { generateApi } from './generate';\nimport type { CommonOptions, ConfigFile, GenerationOptions, OutputFileOptions } from './types';\nimport { isValidUrl, prettify, getV3Doc } from './utils';\nimport camelCase from 'lodash.camelcase';\nexport type { OutputFilesConfig, ConfigFile } from './types';\n\nconst require = createRequire(__filename);\n\n\n\n// 確保目錄存在的函數\nasync function ensureDirectoryExists(filePath: string) {\n const dirname = path.dirname(filePath);\n if (!fs.existsSync(dirname)) {\n await fs.promises.mkdir(dirname, { recursive: true });\n }\n}\n\n\n// 檢查檔案是否存在的函數\nfunction fileExists(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\n// 獲取資料夾名稱並轉換為 API 名稱\nfunction getApiNameFromDir(dirPath: string): string {\n const dirName = path.basename(dirPath);\n return `${dirName}Api`;\n}\n\n// 確保基礎文件存在的函數\nasync function ensureBaseFilesExist(outputDir: string) {\n const enhanceEndpointsPath = path.join(outputDir, 'enhanceEndpoints.ts');\n const indexPath = path.join(outputDir, 'index.ts');\n const apiName = getApiNameFromDir(outputDir);\n\n // 如果 enhanceEndpoints.ts 不存在,創建它\n if (!fileExists(enhanceEndpointsPath)) {\n const enhanceEndpointsContent = `import api from './query.generated';\n\nconst enhancedApi = api.enhanceEndpoints({\n endpoints: {\n },\n});\n\nexport default enhancedApi;\n`;\n await fs.promises.writeFile(enhanceEndpointsPath, enhanceEndpointsContent, 'utf-8');\n }\n\n // 如果 index.ts 不存在,創建它\n if (!fileExists(indexPath)) {\n const indexContent = `export * from './query.generated';\nexport {default as ${apiName}} from './enhanceEndpoints';\n`;\n await fs.promises.writeFile(indexPath, indexContent, 'utf-8');\n }\n}\n\n\n// 從路徑中提取分類名稱\nfunction getGroupNameFromPath(path: string, pattern: RegExp): string {\n // console.log('pattern', pattern);\n\n const match = path.match(pattern);\n // console.log('match', path, match);\n\n if (match && match[1]) {\n return camelCase(match[1]);\n }\n return 'common';\n}\n\n\n\n\n\nexport async function generateEndpoints(options: GenerationOptions): Promise<string | void> {\n const schemaLocation = options.schemaFile;\n\n const schemaAbsPath = isValidUrl(options.schemaFile)\n ? options.schemaFile\n : path.resolve(process.cwd(), schemaLocation);\n\n // 如果是 URL 且使用 outputFiles 配置,需要特殊處理\n if (isValidUrl(options.schemaFile) && 'outputFiles' in options) {\n const { outputFiles, ...commonConfig } = options as any;\n \n // 異步獲取 OpenAPI 文檔\n const openApiDoc = await getV3Doc(options.schemaFile, options.httpResolverOptions);\n const paths = Object.keys(openApiDoc.paths);\n\n // 從配置中獲取分類規則\n const outputFilesEntries = Object.entries(outputFiles);\n const [outputPath, config] = outputFilesEntries[0];\n const patterns = (config as any).groupMatch;\n const filterEndpoint = (config as any).filterEndpoint;\n\n const pattern = patterns;\n // 根據路徑自動分類\n const groupedPaths = paths.reduce((acc, path) => {\n const groupName = getGroupNameFromPath(path, pattern);\n if (!acc[groupName]) {\n acc[groupName] = [];\n }\n acc[groupName].push(path);\n return acc;\n }, {} as Record<string, string[]>);\n\n // 為每個分類生成配置並執行\n for (const [groupName, paths] of Object.entries(groupedPaths)) {\n const finalOutputPath = outputPath.replace('$1', groupName);\n\n if (filterEndpoint) {\n // 如果有 filterEndpoint,使用基於路徑的篩選函數\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n if (pathGroupName !== groupName) {\n return false;\n }\n\n // 使用 filterEndpoint 進行額外篩選\n const endpointFilter = filterEndpoint(groupName);\n if (endpointFilter instanceof RegExp) {\n return endpointFilter.test(operationName);\n }\n\n return true;\n };\n\n const groupOptions = {\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n };\n\n await generateSingleEndpoint(groupOptions);\n } else {\n // 如果沒有 filterEndpoint,只使用路徑分組\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n return pathGroupName === groupName;\n };\n\n const groupOptions = {\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n };\n\n await generateSingleEndpoint(groupOptions);\n }\n }\n return;\n }\n\n // 原有的邏輯處理非 outputFiles 配置或本地文件\n await generateSingleEndpoint(options);\n}\n\nasync function generateSingleEndpoint(options: GenerationOptions): Promise<string | void> {\n const schemaLocation = options.schemaFile;\n\n const schemaAbsPath = isValidUrl(options.schemaFile)\n ? options.schemaFile\n : path.resolve(process.cwd(), schemaLocation);\n\n const sourceCode = await enforceOazapftsTsVersion(async () => {\n return generateApi(schemaAbsPath, options);\n });\n const { outputFile, prettierConfigFile } = options;\n if (outputFile) {\n const outputPath = path.resolve(process.cwd(), outputFile);\n await ensureDirectoryExists(outputPath);\n\n // 確保基礎文件存在\n const outputDir = path.dirname(outputPath);\n await ensureBaseFilesExist(outputDir);\n\n fs.writeFileSync(\n outputPath,\n await prettify(outputFile, sourceCode, prettierConfigFile)\n );\n } else {\n return await prettify(null, sourceCode, prettierConfigFile);\n }\n}\n\nexport function parseConfig(fullConfig: ConfigFile) {\n const outFiles: (CommonOptions & OutputFileOptions)[] = [];\n\n if ('outputFiles' in fullConfig) {\n const { outputFiles, ...commonConfig } = fullConfig;\n\n // 讀取 OpenAPI 文檔 - 支援 URL 和本地文件\n let openApiDoc: any;\n if (isValidUrl(fullConfig.schemaFile)) {\n // 如果是 URL,直接返回原始配置,讓 generateEndpoints 處理\n outFiles.push(fullConfig as any);\n return outFiles;\n } else {\n // 如果是本地文件,直接讀取\n openApiDoc = JSON.parse(fs.readFileSync(fullConfig.schemaFile, 'utf-8'));\n }\n\n const paths = Object.keys(openApiDoc.paths);\n\n // 從配置中獲取分類規則\n const outputFilesEntries = Object.entries(outputFiles);\n const [outputPath, config] = outputFilesEntries[0];\n const patterns = (config as any).groupMatch;\n const filterEndpoint = (config as any).filterEndpoint;\n\n const pattern = patterns;\n // 根據路徑自動分類\n const groupedPaths = paths.reduce((acc, path) => {\n const groupName = getGroupNameFromPath(path, pattern);\n if (!acc[groupName]) {\n acc[groupName] = [];\n }\n acc[groupName].push(path);\n return acc;\n }, {} as Record<string, string[]>);\n\n // 為每個分類生成配置\n Object.entries(groupedPaths).forEach(([groupName, paths]) => {\n const finalOutputPath = outputPath.replace('$1', groupName);\n\n if (filterEndpoint) {\n // 如果有 filterEndpoint,使用基於路徑的篩選函數\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n if (pathGroupName !== groupName) {\n return false;\n }\n\n // 使用 filterEndpoint 進行額外篩選\n const endpointFilter = filterEndpoint(groupName);\n if (endpointFilter instanceof RegExp) {\n return endpointFilter.test(operationName);\n }\n\n return true;\n };\n\n outFiles.push({\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n });\n } else {\n // 如果沒有 filterEndpoint,只使用路徑分組\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n return pathGroupName === groupName;\n };\n\n outFiles.push({\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n });\n }\n });\n\n } else {\n outFiles.push(fullConfig);\n }\n return outFiles;\n}\n\n/**\n * Enforces `oazapfts` to use the same TypeScript version as this module itself uses.\n * That should prevent enums from running out of sync if both libraries use different TS versions.\n */\nfunction enforceOazapftsTsVersion<T>(cb: () => T): T {\n const ozTsPath = require.resolve('typescript', { paths: [require.resolve('oazapfts')] });\n const tsPath = require.resolve('typescript');\n const originalEntry = require.cache[ozTsPath];\n try {\n require.cache[ozTsPath] = require.cache[tsPath];\n return cb();\n } finally {\n if (originalEntry) {\n require.cache[ozTsPath] = originalEntry;\n } else {\n delete require.cache[ozTsPath];\n }\n }\n}\n","import camelCase from 'lodash.camelcase';\nimport path from 'node:path';\nimport ApiGenerator, {\n getOperationName as _getOperationName,\n getReferenceName,\n isReference,\n supportDeepObjects,\n createPropertyAssignment,\n createQuestionToken,\n isValidIdentifier,\n keywordType,\n} from 'oazapfts/generate';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport ts from 'typescript';\nimport type { ObjectPropertyDefinitions } from './codegen';\nimport { generateCreateApiCall, generateEndpointDefinition, generateImportNode, generateTagTypes } from './codegen';\nimport { generateReactHooks } from './generators/react-hooks';\nimport type {\n EndpointMatcher,\n EndpointOverrides,\n GenerationOptions,\n OperationDefinition,\n ParameterDefinition,\n ParameterMatcher,\n TextMatcher,\n} from './types';\nimport { capitalize, getOperationDefinitions, getV3Doc, removeUndefined, isQuery as testIsQuery } from './utils';\nimport { factory } from './utils/factory';\n\nconst generatedApiName = 'injectedRtkApi';\nconst v3DocCache: Record<string, OpenAPIV3.Document> = {};\n\nfunction defaultIsDataResponse(code: string, includeDefault: boolean) {\n if (includeDefault && code === 'default') {\n return true;\n }\n const parsedCode = Number(code);\n return !Number.isNaN(parsedCode) && parsedCode >= 200 && parsedCode < 300;\n}\n\nfunction getOperationName({ verb, path }: Pick<OperationDefinition, 'verb' | 'path' >) {\n return _getOperationName(verb, path, undefined);\n}\n\nfunction getTags({ verb, pathItem }: Pick<OperationDefinition, 'verb' | 'pathItem'>): string[] {\n return verb ? pathItem[verb]?.tags || [] : [];\n}\n\nfunction patternMatches(pattern?: TextMatcher) {\n const filters = Array.isArray(pattern) ? pattern : [pattern];\n return function matcher(operationName: string) {\n if (!pattern) return true;\n return filters.some((filter) =>\n typeof filter === 'string' ? filter === operationName : filter?.test(operationName)\n );\n };\n}\n\nfunction operationMatches(pattern?: EndpointMatcher) {\n const checkMatch = typeof pattern === 'function' ? pattern : patternMatches(pattern);\n return function matcher(operationDefinition: OperationDefinition) {\n if (!pattern) return true;\n const operationName = getOperationName(operationDefinition);\n return checkMatch(operationName, operationDefinition);\n };\n}\n\nfunction argumentMatches(pattern?: ParameterMatcher) {\n const checkMatch = typeof pattern === 'function' ? pattern : patternMatches(pattern);\n return function matcher(argumentDefinition: ParameterDefinition) {\n if (!pattern || argumentDefinition.in === 'path') return true;\n const argumentName = argumentDefinition.name;\n return checkMatch(argumentName, argumentDefinition);\n };\n}\n\nfunction withQueryComment<T extends ts.Node>(node: T, def: QueryArgDefinition, hasTrailingNewLine: boolean): T {\n const comment = def.origin === 'param' ? def.param.description : def.body.description;\n if (comment) {\n return ts.addSyntheticLeadingComment(\n node,\n ts.SyntaxKind.MultiLineCommentTrivia,\n `* ${comment} `,\n hasTrailingNewLine\n );\n }\n return node;\n}\n\nexport function getOverrides(\n operation: OperationDefinition,\n endpointOverrides?: EndpointOverrides[]\n): EndpointOverrides | undefined {\n return endpointOverrides?.find((override) => operationMatches(override.pattern)(operation));\n}\n\nexport async function generateApi(\n spec: string,\n {\n apiFile,\n apiImport = 'api',\n exportName = 'enhancedApi',\n argSuffix = 'ApiArg',\n responseSuffix = 'ApiResponse',\n operationNameSuffix = '',\n hooks = false,\n tag = false,\n outputFile,\n isDataResponse = defaultIsDataResponse,\n filterEndpoints,\n endpointOverrides,\n unionUndefined,\n encodePathParams = false,\n encodeQueryParams = false,\n flattenArg = false,\n includeDefault = false,\n useEnumType = false,\n mergeReadWriteOnly = false,\n httpResolverOptions,\n sharedTypesFile,\n }: GenerationOptions\n) {\n const v3Doc = (v3DocCache[spec] ??= await getV3Doc(spec, httpResolverOptions));\n\n const apiGen = new ApiGenerator(v3Doc, {\n unionUndefined,\n useEnumType,\n mergeReadWriteOnly,\n });\n\n const schemeTypeNames = new Set<string>();\n\n function addSchemeTypeName(name: string) {\n schemeTypeNames.add(name);\n schemeTypeNames.add(camelCase(name));\n schemeTypeNames.add(capitalize(camelCase(name)));\n }\n\n if (sharedTypesFile) {\n const resultFile = ts.createSourceFile(\n 'sharedTypes.ts',\n '',\n ts.ScriptTarget.Latest,\n /*setParentNodes*/ false,\n ts.ScriptKind.TS\n );\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n\n const allTypeDefinitions: ts.Statement[] = [];\n const definedTypeNames = new Set<string>();\n\n const components = v3Doc.components;\n if (components) {\n const componentDefinitions = Object.entries(components).map(([componentType, componentDefs]) => {\n const typeEntries = Object.entries(componentDefs as Record<string, unknown>)\n .map(([name, def]) => {\n addSchemeTypeName(name);\n const typeName = capitalize(camelCase(name));\n definedTypeNames.add(typeName);\n const typeNode = wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(def as OpenAPIV3.SchemaObject));\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n typeNode\n );\n });\n return factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(typeEntries),\n ts.NodeFlags.Namespace\n );\n });\n allTypeDefinitions.push(...componentDefinitions);\n }\n\n const enumEntries = [\n ...apiGen.enumAliases.filter(e => ts.isEnumDeclaration(e)),\n ...apiGen.enumAliases.filter(e => ts.isTypeAliasDeclaration(e)),\n ].map(enumDecl => {\n if (ts.isEnumDeclaration(enumDecl)) {\n return factory.createEnumDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n enumDecl.name,\n enumDecl.members\n );\n } else if (ts.isTypeAliasDeclaration(enumDecl)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n enumDecl.name,\n enumDecl.typeParameters,\n enumDecl.type\n );\n }\n return enumDecl;\n });\n \n const unionTypeEnums = apiGen.aliases\n .filter(alias => {\n if (ts.isTypeAliasDeclaration(alias) && alias.type) {\n return ts.isUnionTypeNode(alias.type);\n }\n return false;\n })\n .map(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n alias.name,\n alias.typeParameters,\n alias.type\n );\n }\n return alias;\n });\n \n const allEnumEntries = [...enumEntries, ...unionTypeEnums];\n \n if (allEnumEntries.length > 0) {\n allTypeDefinitions.push(\n factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Enum'),\n factory.createModuleBlock(allEnumEntries),\n ts.NodeFlags.Namespace\n )\n );\n }\n\n if (apiGen.aliases.length > 0) {\n const aliasEntries = apiGen.aliases\n .filter(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n const isDefinedInComponents = definedTypeNames.has(alias.name.text);\n const isUnionTypeEnum = ts.isUnionTypeNode(alias.type);\n return !isDefinedInComponents && !isUnionTypeEnum;\n }\n return false;\n })\n .map(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n alias.name,\n alias.typeParameters,\n alias.type\n );\n }\n return alias;\n });\n\n if (aliasEntries.length > 0) {\n const existingSchemeIndex = allTypeDefinitions.findIndex(def => \n ts.isModuleDeclaration(def) && \n ts.isIdentifier(def.name) && \n def.name.text === 'Scheme'\n );\n\n if (existingSchemeIndex >= 0) {\n const existingScheme = allTypeDefinitions[existingSchemeIndex] as ts.ModuleDeclaration;\n const mergedMembers = [...(existingScheme.body as ts.ModuleBlock).statements, ...aliasEntries];\n allTypeDefinitions[existingSchemeIndex] = factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(mergedMembers),\n ts.NodeFlags.Namespace\n );\n } else {\n allTypeDefinitions.push(\n factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(aliasEntries),\n ts.NodeFlags.Namespace\n )\n );\n }\n }\n }\n\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n \n const sharedTypesDir = path.dirname(sharedTypesFile);\n await fs.mkdir(sharedTypesDir, { recursive: true });\n \n const output = printer.printNode(\n ts.EmitHint.Unspecified,\n factory.createSourceFile(\n allTypeDefinitions,\n factory.createToken(ts.SyntaxKind.EndOfFileToken),\n ts.NodeFlags.None\n ),\n resultFile\n );\n\n await fs.writeFile(sharedTypesFile, output, 'utf-8');\n }\n\n if (apiGen.spec.components?.schemas) {\n apiGen.preprocessComponents(apiGen.spec.components.schemas);\n }\n\n const operationDefinitions = getOperationDefinitions(v3Doc).filter(operationMatches(filterEndpoints));\n\n const resultFile = ts.createSourceFile(\n 'someFileName.ts',\n '',\n ts.ScriptTarget.Latest,\n /*setParentNodes*/ false,\n ts.ScriptKind.TS\n );\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n\n const interfaces: Record<string, ts.InterfaceDeclaration | ts.TypeAliasDeclaration> = {};\n function registerInterface(declaration: ts.InterfaceDeclaration | ts.TypeAliasDeclaration) {\n const name = declaration.name.escapedText.toString();\n if (name in interfaces) {\n throw new Error(`interface/type alias ${name} already registered`);\n }\n interfaces[name] = declaration;\n return declaration;\n }\n\n if (outputFile) {\n outputFile = path.resolve(process.cwd(), outputFile);\n if (apiFile.startsWith('.')) {\n apiFile = path.relative(path.dirname(outputFile), apiFile);\n apiFile = apiFile.replace(/\\\\/g, '/');\n if (!apiFile.startsWith('.')) apiFile = `./${apiFile}`;\n }\n }\n apiFile = apiFile.replace(/\\.[jt]sx?$/, '');\n\n const sharedTypesImportPath = sharedTypesFile && outputFile\n ? (() => {\n let rel = path.relative(path.dirname(outputFile), sharedTypesFile)\n .replace(/\\\\/g, '/')\n .replace(/\\.[jt]sx?$/, '');\n if (!rel.startsWith('.')) rel = './' + rel;\n return rel;\n })()\n : './shared-types';\n\n return printer.printNode(\n ts.EmitHint.Unspecified,\n factory.createSourceFile(\n [\n generateImportNode(apiFile, { [apiImport]: 'api' }),\n generateImportNode('@acrool/react-fetcher', { IRestFulEndpointsQueryReturn: 'IRestFulEndpointsQueryReturn' }),\n ...(sharedTypesFile ? [\n generateImportNode(sharedTypesImportPath, { \n Scheme: 'Scheme',\n ...(useEnumType ? { Enum: 'Enum' } : {})\n })\n ] : []),\n ...(tag ? [generateTagTypes({ addTagTypes: extractAllTagTypes({ operationDefinitions }) })] : []),\n generateCreateApiCall({\n tag,\n endpointDefinitions: factory.createObjectLiteralExpression(\n operationDefinitions.map((operationDefinition) =>\n generateEndpoint({\n operationDefinition,\n overrides: getOverrides(operationDefinition, endpointOverrides),\n sharedTypesFile: !!sharedTypesFile,\n })\n ),\n true\n ),\n }),\n factory.createExportAssignment(\n undefined,\n undefined,\n factory.createIdentifier(generatedApiName)\n ),\n ...Object.values(interfaces),\n ...(sharedTypesFile ? [] : [...apiGen.aliases, ...apiGen.enumAliases]),\n ...(hooks\n ? [\n generateReactHooks({\n exportName: generatedApiName,\n operationDefinitions,\n endpointOverrides,\n config: hooks,\n }),\n ]\n : []),\n ],\n factory.createToken(ts.SyntaxKind.EndOfFileToken),\n ts.NodeFlags.None\n ),\n resultFile\n );\n\n function extractAllTagTypes({ operationDefinitions }: { operationDefinitions: OperationDefinition[] }) {\n const allTagTypes = new Set<string>();\n\n for (const operationDefinition of operationDefinitions) {\n const { verb, pathItem } = operationDefinition;\n for (const tag of getTags({ verb, pathItem })) {\n allTagTypes.add(tag);\n }\n }\n return [...allTagTypes];\n }\n\n function generateEndpoint({\n operationDefinition,\n overrides,\n sharedTypesFile,\n }: {\n operationDefinition: OperationDefinition;\n overrides?: EndpointOverrides;\n sharedTypesFile: boolean;\n }) {\n const {\n verb,\n path,\n pathItem,\n operation,\n operation: { responses, requestBody },\n } = operationDefinition;\n const operationName = getOperationName({ verb, path });\n const tags = tag ? getTags({ verb, pathItem }) : [];\n const isQuery = testIsQuery(verb, overrides);\n\n const returnsJson = apiGen.getResponseType(responses) === 'json';\n let ResponseType: ts.TypeNode = factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword);\n if (returnsJson) {\n const returnTypes = Object.entries(responses || {})\n .map(\n ([code, response]) =>\n [\n code,\n apiGen.resolve(response),\n wrapWithSchemeIfComponent(\n apiGen.getTypeFromResponse(response, 'readOnly') ||\n factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)\n ),\n ] as const\n )\n .filter(([status, response]) =>\n isDataResponse(status, includeDefault, apiGen.resolve(response), responses || {})\n )\n .filter(([_1, _2, type]) => type !== keywordType.void)\n .map(([code, response, type]) => {\n return ts.addSyntheticLeadingComment(\n type,\n ts.SyntaxKind.MultiLineCommentTrivia,\n `* status ${code} ${response.description} `,\n false\n );\n });\n if (returnTypes.length > 0) {\n ResponseType = factory.createUnionTypeNode(returnTypes);\n }\n }\n\n const ResponseTypeName = factory.createTypeReferenceNode(\n registerInterface(\n factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n capitalize(operationName + operationNameSuffix + responseSuffix),\n undefined,\n ResponseType\n )\n ).name\n );\n\n const operationParameters = apiGen.resolveArray(operation.parameters);\n const pathItemParameters = apiGen\n .resolveArray(pathItem.parameters)\n .filter((pp) => !operationParameters.some((op) => op.name === pp.name && op.in === pp.in));\n\n const parameters = supportDeepObjects([...pathItemParameters, ...operationParameters])\n .filter(argumentMatches(overrides?.parameterFilter))\n .filter(param => param.in !== 'header');\n\n const allNames = parameters.map((p) => p.name);\n const queryArg: QueryArgDefinitions = {};\n function generateName(name: string, potentialPrefix: string) {\n const isPureSnakeCase = /^[a-zA-Z][a-zA-Z0-9_]*$/.test(name);\n const hasNamingConflict = allNames.filter((n) => n === name).length > 1;\n if (hasNamingConflict) {\n name = `${potentialPrefix}_${name}`;\n }\n const camelCaseName = camelCase(name);\n if (isPureSnakeCase && !allNames.includes(camelCaseName)) {\n name = camelCaseName;\n }\n while (name in queryArg) {\n name = `_${name}`;\n }\n return name;\n }\n\n for (const param of parameters) {\n const name = generateName(param.name, param.in);\n queryArg[name] = {\n origin: 'param',\n name,\n originalName: param.name,\n type: wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(isReference(param) ? param : param.schema, undefined, 'writeOnly')),\n required: param.required,\n param,\n };\n }\n\n if (requestBody) {\n const body = apiGen.resolve(requestBody);\n const schema = apiGen.getSchemaFromContent(body.content);\n const type = wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(schema));\n const schemaName = camelCase(\n (type as any).name ||\n getReferenceName(schema) ||\n (typeof schema === 'object' && 'title' in schema && schema.title) ||\n 'body'\n );\n const name = generateName(schemaName in queryArg ? 'body' : schemaName, 'body');\n\n queryArg[name] = {\n origin: 'body',\n name,\n originalName: schemaName,\n type: wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(schema, undefined, 'writeOnly')),\n required: true,\n body,\n };\n }\n\n const propertyName = (name: string | ts.PropertyName): ts.PropertyName => {\n if (typeof name === 'string') {\n return isValidIdentifier(name) ? factory.createIdentifier(name) : factory.createStringLiteral(name);\n }\n return name;\n };\n\n const queryArgValues = Object.values(queryArg);\n\n const isFlatArg = flattenArg && queryArgValues.length === 1;\n const QueryArg = factory.createTypeReferenceNode(\n registerInterface(\n factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n capitalize(operationName + operationNameSuffix + argSuffix),\n undefined,\n queryArgValues.length > 0\n ? isFlatArg\n ? withQueryComment(\n factory.createUnionTypeNode([\n queryArgValues[0].type,\n ...(!queryArgValues[0].required\n ? [factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)]\n : []),\n ]),\n queryArgValues[0],\n false\n )\n : factory.createTypeLiteralNode(\n queryArgValues.map((def) =>\n withQueryComment(\n factory.createPropertySignature(\n undefined,\n propertyName(def.name),\n createQuestionToken(!def.required),\n def.type\n ),\n def,\n true\n )\n )\n )\n : factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword)\n )\n ).name\n );\n\n return generateEndpointDefinition({\n operationName: operationNameSuffix ? capitalize(operationName + operationNameSuffix) : operationName,\n type: isQuery ? 'query' : 'mutation',\n Response: ResponseTypeName,\n QueryArg: factory.createTypeReferenceNode(\n factory.createIdentifier('IRestFulEndpointsQueryReturn'),\n [QueryArg]\n ),\n queryFn: generateQueryFn({\n operationDefinition,\n queryArg,\n isQuery,\n isFlatArg,\n encodePathParams,\n encodeQueryParams,\n }),\n extraEndpointsProps: isQuery\n ? generateQueryEndpointProps({ operationDefinition })\n : generateMutationEndpointProps({ operationDefinition }),\n tags,\n });\n }\n\n function generateQueryFn({\n operationDefinition,\n queryArg,\n isFlatArg,\n isQuery,\n encodePathParams,\n encodeQueryParams,\n }: {\n operationDefinition: OperationDefinition;\n queryArg: QueryArgDefinitions;\n isFlatArg: boolean;\n isQuery: boolean;\n encodePathParams: boolean;\n encodeQueryParams: boolean;\n }) {\n const { path, verb } = operationDefinition;\n\n const bodyParameter = Object.values(queryArg).find((def) => def.origin === 'body');\n\n const rootObject = factory.createIdentifier('queryArg');\n const variablesObject = factory.createPropertyAccessExpression(rootObject, factory.createIdentifier('variables'));\n\n function pickParams(paramIn: string) {\n return Object.values(queryArg).filter((def) => def.origin === 'param' && def.param.in === paramIn);\n }\n\n function createObjectLiteralProperty(parameters: QueryArgDefinition[], propertyName: string) {\n if (parameters.length === 0) return undefined;\n\n const properties = parameters.map((param) => {\n const value = isFlatArg \n ? variablesObject \n : factory.createPropertyAccessExpression(variablesObject, factory.createIdentifier(param.name));\n\n const encodedValue =\n encodeQueryParams && param.param?.in === 'query'\n ? factory.createConditionalExpression(\n value,\n undefined,\n factory.createCallExpression(factory.createIdentifier('encodeURIComponent'), undefined, [\n factory.createCallExpression(factory.createIdentifier('String'), undefined, [value]),\n ]),\n undefined,\n factory.createIdentifier('undefined')\n )\n : value;\n\n return createPropertyAssignment(param.originalName, encodedValue);\n });\n\n return factory.createPropertyAssignment(\n factory.createIdentifier(propertyName),\n factory.createObjectLiteralExpression(properties, true)\n );\n }\n\n return factory.createArrowFunction(\n undefined,\n undefined,\n [factory.createParameterDeclaration(undefined, undefined, rootObject, undefined, undefined, undefined)],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createParenthesizedExpression(\n factory.createObjectLiteralExpression(\n [\n factory.createPropertyAssignment(\n factory.createIdentifier('url'),\n generatePathExpression(path, pickParams('path'), variablesObject, isFlatArg, encodePathParams)\n ),\n isQuery && verb.toUpperCase() === 'GET'\n ? undefined\n : factory.createPropertyAssignment(\n factory.createIdentifier('method'),\n factory.createStringLiteral(verb.toUpperCase())\n ),\n bodyParameter === undefined\n ? undefined\n : factory.createPropertyAssignment(\n factory.createIdentifier('body'),\n isFlatArg\n ? variablesObject\n : factory.createPropertyAccessExpression(variablesObject, factory.createIdentifier(bodyParameter.name))\n ),\n createObjectLiteralProperty(pickParams('cookie'), 'cookies'),\n createObjectLiteralProperty(pickParams('query'), 'params'),\n factory.createPropertyAssignment(\n factory.createIdentifier('fetchOptions'),\n factory.createPropertyAccessChain(\n rootObject,\n factory.createToken(ts.SyntaxKind.QuestionDotToken),\n factory.createIdentifier('fetchOptions')\n )\n ),\n ].filter(removeUndefined),\n false\n )\n )\n );\n }\n\n function generateQueryEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {\n return {};\n }\n\n function generateMutationEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {\n return {};\n }\n\n function wrapWithSchemeIfComponent(typeNode: ts.TypeNode): ts.TypeNode {\n if (ts.isTypeReferenceNode(typeNode) && ts.isIdentifier(typeNode.typeName)) {\n const typeName = typeNode.typeName.text;\n \n // 檢查是否為 enum 類型(包括在 enumAliases 和 aliases 中的)\n const isEnumType = useEnumType && (\n apiGen.enumAliases.some(enumDecl => {\n if (ts.isEnumDeclaration(enumDecl) || ts.isTypeAliasDeclaration(enumDecl)) {\n return enumDecl.name.text === typeName;\n }\n return false;\n }) ||\n apiGen.aliases.some(alias => {\n if (ts.isTypeAliasDeclaration(alias) && alias.type) {\n // 檢查是否為 union type 的 enum\n if (ts.isUnionTypeNode(alias.type)) {\n return alias.name.text === typeName;\n }\n }\n return false;\n })\n );\n \n if (isEnumType) {\n return factory.createTypeReferenceNode(\n factory.createQualifiedName(\n factory.createIdentifier('Enum'),\n typeNode.typeName\n ),\n typeNode.typeArguments?.map(wrapWithSchemeIfComponent)\n );\n }\n \n if (schemeTypeNames.has(typeName)) {\n return factory.createTypeReferenceNode(\n factory.createQualifiedName(\n factory.createIdentifier('Scheme'),\n typeNode.typeName\n ),\n typeNode.typeArguments?.map(wrapWithSchemeIfComponent)\n );\n }\n if (typeNode.typeArguments) {\n return factory.createTypeReferenceNode(\n typeNode.typeName,\n typeNode.typeArguments.map(wrapWithSchemeIfComponent)\n );\n }\n }\n if (ts.isArrayTypeNode(typeNode)) {\n return factory.createArrayTypeNode(wrapWithSchemeIfComponent(typeNode.elementType));\n }\n if (ts.isUnionTypeNode(typeNode)) {\n // 檢查是否為 enum 的 union type\n const unionTypes = typeNode.types;\n if (unionTypes.length > 0 && unionTypes.every(type => \n ts.isLiteralTypeNode(type) && \n (ts.isStringLiteral(type.literal) || ts.isNumericLiteral(type.literal))\n )) {\n // 這是一個 enum 的 union type,我們需要找到對應的 enum 類型\n const enumValues = unionTypes.map(type => {\n if (ts.isLiteralTypeNode(type)) {\n if (ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n } else if (ts.isNumericLiteral(type.literal)) {\n return type.literal.text;\n }\n }\n return null;\n }).filter(Boolean);\n \n // 查找對應的 enum 類型\n const matchingEnum = apiGen.aliases.find(alias => {\n if (ts.isTypeAliasDeclaration(alias) && ts.isUnionTypeNode(alias.type)) {\n const aliasValues = alias.type.types.map(type => {\n if (ts.isLiteralTypeNode(type)) {\n if (ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n } else if (ts.isNumericLiteral(type.literal)) {\n return type.literal.text;\n }\n }\n return null;\n }).filter(Boolean);\n \n return aliasValues.length === enumValues.length && \n aliasValues.every(val => enumValues.includes(val));\n }\n return false;\n });\n \n // 對於所有的 enum 類型,直接使用字串型別,不轉換為 Enum\n // 這樣可以避免自動命名造成的變更問題\n if (matchingEnum && ts.isTypeAliasDeclaration(matchingEnum)) {\n // 直接返回原始的 union type,不轉換為 Enum\n return typeNode;\n }\n }\n \n return factory.createUnionTypeNode(typeNode.types.map(wrapWithSchemeIfComponent));\n }\n if (ts.isTypeLiteralNode(typeNode)) {\n return factory.createTypeLiteralNode(\n typeNode.members.map(member => {\n if (ts.isPropertySignature(member) && member.type) {\n return factory.updatePropertySignature(\n member,\n member.modifiers,\n member.name,\n member.questionToken,\n wrapWithSchemeIfComponent(member.type)\n );\n }\n return member;\n })\n );\n }\n return typeNode;\n }\n}\n\nfunction accessProperty(rootObject: ts.Identifier, propertyName: string) {\n return isValidIdentifier(propertyName)\n ? factory.createPropertyAccessExpression(rootObject, factory.createIdentifier(propertyName))\n : factory.createElementAccessExpression(rootObject, factory.createStringLiteral(propertyName));\n}\n\nfunction generatePathExpression(\n path: string,\n pathParameters: QueryArgDefinition[],\n rootObject: ts.Identifier | ts.PropertyAccessExpression,\n isFlatArg: boolean,\n encodePathParams: boolean\n) {\n const expressions: Array<[string, string]> = [];\n\n const head = path.replace(/\\{(.*?)}(.*?)(?=\\{|$)/g, (_, expression, literal) => {\n const param = pathParameters.find((p) => p.originalName === expression);\n if (!param) {\n throw new Error(`path parameter ${expression} does not seem to be defined in '${path}'!`);\n }\n expressions.push([param.name, literal]);\n return '';\n });\n\n return expressions.length\n ? factory.createTemplateExpression(\n factory.createTemplateHead(head),\n expressions.map(([prop, literal], index) => {\n const value = isFlatArg \n ? rootObject \n : factory.createPropertyAccessExpression(rootObject, factory.createIdentifier(prop));\n const encodedValue = encodePathParams\n ? factory.createCallExpression(factory.createIdentifier('encodeURIComponent'), undefined, [\n factory.createCallExpression(factory.createIdentifier('String'), undefined, [value]),\n ])\n : value;\n return factory.createTemplateSpan(\n encodedValue,\n index === expressions.length - 1\n ? factory.createTemplateTail(literal)\n : factory.createTemplateMiddle(literal)\n );\n })\n )\n : factory.createNoSubstitutionTemplateLiteral(head);\n}\n\ntype QueryArgDefinition = {\n name: string;\n originalName: string;\n type: ts.TypeNode;\n required?: boolean;\n param?: OpenAPIV3.ParameterObject;\n} & (\n | {\n origin: 'param';\n param: OpenAPIV3.ParameterObject;\n }\n | {\n origin: 'body';\n body: OpenAPIV3.RequestBodyObject;\n }\n);\ntype QueryArgDefinitions = Record<string, QueryArgDefinition>;\n","import ts from 'typescript';\nimport semver from 'semver';\n\nconst originalFactory = ts.factory;\n\nfunction createImportSpecifier(propertyName: ts.Identifier | undefined, name: ts.Identifier): ts.ImportSpecifier {\n if (semver.satisfies(ts.version, '>= 4.5'))\n // @ts-ignore\n return originalFactory.createImportSpecifier(false, propertyName, name);\n // @ts-ignore\n return originalFactory.createImportSpecifier(propertyName, name);\n}\n\nfunction createExportSpecifier(\n propertyName: string | ts.Identifier | undefined,\n name: string | ts.Identifier\n): ts.ExportSpecifier {\n if (semver.satisfies(ts.version, '>= 4.5'))\n // @ts-ignore\n return originalFactory.createExportSpecifier(false, propertyName, name);\n // @ts-ignore\n return originalFactory.createExportSpecifier(propertyName, name);\n}\n\nexport const factory = {\n ...originalFactory,\n createImportSpecifier,\n createExportSpecifier,\n};\n","import { factory } from './utils/factory';\nimport ts from 'typescript';\n\nconst defaultEndpointBuilder = factory.createIdentifier('build');\n\nexport type ObjectPropertyDefinitions = Record<string, ts.Expression | undefined>;\nexport function generateObjectProperties(obj: ObjectPropertyDefinitions) {\n return Object.entries(obj)\n .filter(([_, v]) => v)\n .map(([k, v]) => factory.createPropertyAssignment(factory.createIdentifier(k), v as ts.Expression));\n}\n\nexport function generateImportNode(pkg: string, namedImports: Record<string, string>, defaultImportName?: string) {\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(\n false,\n defaultImportName !== undefined ? factory.createIdentifier(defaultImportName) : undefined,\n factory.createNamedImports(\n Object.entries(namedImports).map(([propertyName, name]) =>\n factory.createImportSpecifier(\n name === propertyName ? undefined : factory.createIdentifier(propertyName),\n factory.createIdentifier(name)\n )\n )\n )\n ),\n factory.createStringLiteral(pkg)\n );\n}\n\nexport function generateCreateApiCall({\n endpointBuilder = defaultEndpointBuilder,\n endpointDefinitions,\n tag,\n}: {\n endpointBuilder?: ts.Identifier;\n endpointDefinitions: ts.ObjectLiteralExpression;\n tag: boolean;\n}) {\n const injectEndpointsObjectLiteralExpression = factory.createObjectLiteralExpression(\n generateObjectProperties({\n endpoints: factory.createArrowFunction(\n undefined,\n undefined,\n [factory.createParameterDeclaration(undefined, undefined, endpointBuilder, undefined, undefined, undefined)],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createParenthesizedExpression(endpointDefinitions)\n ),\n overrideExisting: factory.createFalse(),\n }),\n true\n );\n if (tag) {\n const enhanceEndpointsObjectLiteralExpression = factory.createObjectLiteralExpression(\n [factory.createShorthandPropertyAssignment(factory.createIdentifier('addTagTypes'), undefined)],\n true\n );\n return factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('injectedRtkApi'),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier('api'),\n factory.createIdentifier('enhanceEndpoints')\n ),\n undefined,\n [enhanceEndpointsObjectLiteralExpression]\n ),\n factory.createIdentifier('injectEndpoints')\n ),\n undefined,\n [injectEndpointsObjectLiteralExpression]\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n }\n\n return factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('injectedRtkApi'),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier('api'),\n factory.createIdentifier('injectEndpoints')\n ),\n undefined,\n [injectEndpointsObjectLiteralExpression]\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n}\n\nexport function generateEndpointDefinition({\n operationName,\n type,\n Response,\n QueryArg,\n queryFn,\n endpointBuilder = defaultEndpointBuilder,\n extraEndpointsProps,\n tags,\n}: {\n operationName: string;\n type: 'query' | 'mutation';\n Response: ts.TypeReferenceNode;\n QueryArg: ts.TypeReferenceNode;\n queryFn: ts.Expression;\n endpointBuilder?: ts.Identifier;\n extraEndpointsProps: ObjectPropertyDefinitions;\n tags: string[];\n}) {\n const objectProperties = generateObjectProperties({ query: queryFn, ...extraEndpointsProps });\n if (tags.length > 0) {\n objectProperties.push(\n factory.createPropertyAssignment(\n factory.createIdentifier(type === 'query' ? 'providesTags' : 'invalidatesTags'),\n factory.createArrayLiteralExpression(tags.map((tag) => factory.createStringLiteral(tag), false))\n )\n );\n }\n return factory.createPropertyAssignment(\n factory.createIdentifier(operationName),\n\n factory.createCallExpression(\n factory.createPropertyAccessExpression(endpointBuilder, factory.createIdentifier(type)),\n [Response, QueryArg],\n [factory.createObjectLiteralExpression(objectProperties, true)]\n )\n );\n}\n\nexport function generateTagTypes({ addTagTypes }: { addTagTypes: string[] }) {\n return factory.createVariableStatement(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('addTagTypes'),\n undefined,\n undefined,\n factory.createAsExpression(\n factory.createArrayLiteralExpression(\n addTagTypes.map((tagType) => factory.createStringLiteral(tagType)),\n true\n ),\n factory.createTypeReferenceNode(factory.createIdentifier('const'), undefined)\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n}\n","import ts from 'typescript';\nimport { getOperationName } from 'oazapfts/generate';\nimport { capitalize, isQuery } from '../utils';\nimport type { OperationDefinition, EndpointOverrides, ConfigFile } from '../types';\nimport { getOverrides } from '../generate';\nimport { factory } from '../utils/factory';\n\ntype HooksConfigOptions = NonNullable<ConfigFile['hooks']>;\n\ntype GetReactHookNameParams = {\n operationDefinition: OperationDefinition;\n endpointOverrides: EndpointOverrides[] | undefined;\n config: HooksConfigOptions;\n};\n\ntype CreateBindingParams = {\n operationDefinition: OperationDefinition;\n overrides?: EndpointOverrides;\n isLazy?: boolean;\n};\n\nconst createBinding = ({\n operationDefinition: { verb, path },\n overrides,\n isLazy = false,\n}: CreateBindingParams) =>\n factory.createBindingElement(\n undefined,\n undefined,\n factory.createIdentifier(\n `use${isLazy ? 'Lazy' : ''}${capitalize(getOperationName(verb, path, undefined))}${\n isQuery(verb, overrides) ? 'Query' : 'Mutation'\n }`\n ),\n undefined\n );\n\nconst getReactHookName = ({ operationDefinition, endpointOverrides, config }: GetReactHookNameParams) => {\n const overrides = getOverrides(operationDefinition, endpointOverrides);\n\n const baseParams = {\n operationDefinition,\n overrides,\n };\n\n const _isQuery = isQuery(operationDefinition.verb, overrides);\n\n // If `config` is true, just generate everything\n if (typeof config === 'boolean') {\n return createBinding(baseParams);\n }\n\n // `config` is an object and we need to check for the configuration of each property\n if (_isQuery) {\n return [\n ...(config.queries ? [createBinding(baseParams)] : []),\n ...(config.lazyQueries ? [createBinding({ ...baseParams, isLazy: true })] : []),\n ];\n }\n\n return config.mutations ? createBinding(baseParams) : [];\n};\n\ntype GenerateReactHooksParams = {\n exportName: string;\n operationDefinitions: OperationDefinition[];\n endpointOverrides: EndpointOverrides[] | undefined;\n config: HooksConfigOptions;\n};\nexport const generateReactHooks = ({\n exportName,\n operationDefinitions,\n endpointOverrides,\n config,\n}: GenerateReactHooksParams) =>\n factory.createVariableStatement(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createObjectBindingPattern(\n operationDefinitions\n .map((operationDefinition) => getReactHookName({ operationDefinition, endpointOverrides, config }))\n .flat()\n ),\n undefined,\n undefined,\n factory.createIdentifier(exportName)\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n","export function capitalize(str: string) {\n return str.replace(str[0], str[0].toUpperCase());\n}\n","import type SwaggerParser from '@apidevtools/swagger-parser';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nexport type OperationDefinition = {\n path: string;\n verb: (typeof operationKeys)[number];\n pathItem: OpenAPIV3.PathItemObject;\n operation: OpenAPIV3.OperationObject;\n};\n\nexport type ParameterDefinition = OpenAPIV3.ParameterObject;\n\ntype Require<T, K extends keyof T> = { [k in K]-?: NonNullable<T[k]> } & Omit<T, K>;\ntype Optional<T, K extends keyof T> = { [k in K]?: NonNullable<T[k]> } & Omit<T, K>;\ntype Id<T> = { [K in keyof T]: T[K] } & {};\ntype AtLeastOneKey<T> = {\n [K in keyof T]-?: Pick<T, K> & Partial<T>;\n}[keyof T];\n\nexport const operationKeys = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const;\n\nexport type GenerationOptions = Id<\n CommonOptions &\n Optional<OutputFileOptions, 'outputFile'> & {\n isDataResponse?(\n code: string,\n includeDefault: boolean,\n response: OpenAPIV3.ResponseObject,\n allResponses: OpenAPIV3.ResponsesObject\n ): boolean;\n }\n>;\n\nexport interface CommonOptions {\n apiFile: string;\n /**\n * filename or url\n */\n schemaFile: string;\n /**\n * defaults to \"api\"\n */\n apiImport?: string;\n /**\n * defaults to \"enhancedApi\"\n */\n exportName?: string;\n /**\n * defaults to \"ApiArg\"\n */\n argSuffix?: string;\n /**\n * defaults to \"ApiResponse\"\n */\n responseSuffix?: string;\n /**\n * defaults to empty\n */\n operationNameSuffix?: string;\n /**\n * defaults to `false`\n * `true` will generate hooks for queries and mutations, but no lazyQueries\n */\n hooks?: boolean | { queries: boolean; lazyQueries: boolean; mutations: boolean };\n /**\n * defaults to false\n * `true` will generate a union type for `undefined` properties like: `{ id?: string | undefined }` instead of `{ id?: string }`\n */\n unionUndefined?: boolean;\n /**\n * defaults to false\n * `true` will result in all generated endpoints having `providesTags`/`invalidatesTags` declarations for the `tags` of their respective operation definition\n * @see https://redux-toolkit.js.org/rtk-query/usage/code-generation for more information\n */\n tag?: boolean;\n /**\n * defaults to false\n * `true` will add `encodeURIComponent` to the generated path parameters\n */\n encodePathParams?: boolean;\n /**\n * defaults to false\n * `true` will add `encodeURIComponent` to the generated query parameters\n */\n encodeQueryParams?: boolean;\n /**\n * defaults to false\n * `true` will \"flatten\" the arg so that you can do things like `useGetEntityById(1)` instead of `useGetEntityById({ entityId: 1 })`\n */\n flattenArg?: boolean;\n /**\n * default to false\n * If set to `true`, the default response type will be included in the generated code for all endpoints.\n * @see https://swagger.io/docs/specification/describing-responses/#default\n */\n includeDefault?: boolean;\n /**\n * default to false\n * `true` will not generate separate types for read-only and write-only properties.\n */\n mergeReadWriteOnly?: boolean;\n /**\n *\n * HTTPResolverOptions object that is passed to the SwaggerParser bundle function.\n */\n httpResolverOptions?: SwaggerParser.HTTPResolverOptions;\n\n /**\n * defaults to undefined\n * If present the given file will be used as prettier config when formatting the generated code. If undefined the default prettier config\n * resolution mechanism will be used.\n */\n prettierConfigFile?: string;\n}\n\nexport type TextMatcher = string | RegExp | (string | RegExp)[];\n\nexport type EndpointMatcherFunction = (operationName: string, operationDefinition: OperationDefinition) => boolean;\n\nexport type EndpointMatcher = TextMatcher | EndpointMatcherFunction;\n\nexport type ParameterMatcherFunction = (parameterName: string, parameterDefinition: ParameterDefinition) => boolean;\n\nexport type ParameterMatcher = TextMatcher | ParameterMatcherFunction;\n\nexport interface OutputFileOptions extends Partial<CommonOptions> {\n outputFile: string;\n filterEndpoints?: EndpointMatcher;\n endpointOverrides?: EndpointOverrides[];\n /**\n * defaults to false\n * If passed as true it will generate TS enums instead of union of strings\n */\n useEnumType?: boolean;\n sharedTypesFile?: string;\n}\n\nexport type EndpointOverrides = {\n pattern: EndpointMatcher;\n} & AtLeastOneKey<{\n type: 'mutation' | 'query';\n parameterFilter: ParameterMatcher;\n}>;\n\nexport type OutputFilesConfig = {\n [outputFile: string]: {\n groupMatch: RegExp,\n filterEndpoint?: (groupName: string) => RegExp\n }\n};\n\nexport type ConfigFile =\n | Id<Require<CommonOptions & OutputFileOptions, 'outputFile'>>\n | Id<\n Omit<CommonOptions, 'outputFile'> & {\n // outputFiles: { [outputFile: string]: Omit<OutputFileOptions, 'outputFile'> };\n outputFiles: OutputFilesConfig\n }\n >;\n","import type { OpenAPIV3 } from 'openapi-types';\nimport type { OperationDefinition } from '../types';\nimport { operationKeys } from '../types';\n\nexport function getOperationDefinitions(v3Doc: OpenAPIV3.Document): OperationDefinition[] {\n return Object.entries(v3Doc.paths).flatMap(([path, pathItem]) =>\n !pathItem\n ? []\n : Object.entries(pathItem)\n .filter((arg): arg is [(typeof operationKeys)[number], OpenAPIV3.OperationObject] =>\n operationKeys.includes(arg[0] as any)\n )\n .map(([verb, operation]) => ({\n path,\n verb,\n pathItem,\n operation,\n }))\n );\n}\n","import SwaggerParser from '@apidevtools/swagger-parser';\nimport type { OpenAPIV3 } from 'openapi-types';\n// @ts-ignore\nimport converter from 'swagger2openapi';\n\nexport async function getV3Doc(\n spec: string,\n httpResolverOptions?: SwaggerParser.HTTPResolverOptions\n): Promise<OpenAPIV3.Document> {\n const doc = await SwaggerParser.bundle(spec, {\n resolve: {\n http: httpResolverOptions,\n },\n });\n\n const isOpenApiV3 = 'openapi' in doc && doc.openapi.startsWith('3');\n\n if (isOpenApiV3) {\n return doc as OpenAPIV3.Document;\n } else {\n const result = await converter.convertObj(doc, {});\n return result.openapi as OpenAPIV3.Document;\n }\n}\n","import type { EndpointOverrides, operationKeys } from '../types';\n\nexport function isQuery(verb: (typeof operationKeys)[number], overrides: EndpointOverrides | undefined) {\n if (overrides?.type) {\n return overrides.type === 'query';\n }\n return verb === 'get';\n}\n","export function isValidUrl(string: string) {\n try {\n new URL(string);\n } catch (_) {\n return false;\n }\n\n return true;\n}\n","import path from 'node:path';\nimport prettier from 'prettier';\nimport type { BuiltInParserName } from 'prettier';\n\nconst EXTENSION_TO_PARSER: Record<string, BuiltInParserName> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'babel',\n jsx: 'babel',\n 'js.flow': 'flow',\n flow: 'flow',\n gql: 'graphql',\n graphql: 'graphql',\n css: 'scss',\n scss: 'scss',\n less: 'scss',\n stylus: 'scss',\n markdown: 'markdown',\n md: 'markdown',\n json: 'json',\n};\n\nexport async function prettify(filePath: string | null, content: string, prettierConfigFile?: string): Promise<string> {\n let config = null;\n let parser = 'typescript';\n\n if (filePath) {\n const fileExtension = path.extname(filePath).slice(1);\n parser = EXTENSION_TO_PARSER[fileExtension];\n config = await prettier.resolveConfig(process.cwd(), {\n useCache: true,\n editorconfig: !prettierConfigFile,\n config: prettierConfigFile,\n });\n } else if (prettierConfigFile) {\n config = await prettier.resolveConfig(process.cwd(), {\n useCache: true,\n config: prettierConfigFile,\n });\n }\n\n return prettier.format(content, {\n parser,\n ...config,\n });\n}\n","export function removeUndefined<T>(t: T | undefined): t is T {\n return typeof t !== 'undefined';\n}\n"],"mappings":"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","names":["import_node_path","import_node_path","import_generate","import_typescript","ts","semver","import_typescript","ts","import_typescript","path","SwaggerParser","converter","path","prettier","path","ts","getOperationName","path","_getOperationName","ts","ApiGenerator","camelCase","resultFile","printer","fs","operationDefinitions","tag","sharedTypesFile","isQuery","encodePathParams","encodeQueryParams","path","import_lodash","require","path","fs","camelCase","paths"]}
package/lib/index.mjs CHANGED
@@ -1092,6 +1092,65 @@ function getGroupNameFromPath(path4, pattern) {
1092
1092
  return "common";
1093
1093
  }
1094
1094
  async function generateEndpoints(options) {
1095
+ const schemaLocation = options.schemaFile;
1096
+ const schemaAbsPath = isValidUrl(options.schemaFile) ? options.schemaFile : path3.resolve(process.cwd(), schemaLocation);
1097
+ if (isValidUrl(options.schemaFile) && "outputFiles" in options) {
1098
+ const { outputFiles, ...commonConfig } = options;
1099
+ const openApiDoc = await getV3Doc(options.schemaFile, options.httpResolverOptions);
1100
+ const paths = Object.keys(openApiDoc.paths);
1101
+ const outputFilesEntries = Object.entries(outputFiles);
1102
+ const [outputPath, config] = outputFilesEntries[0];
1103
+ const patterns = config.groupMatch;
1104
+ const filterEndpoint = config.filterEndpoint;
1105
+ const pattern = patterns;
1106
+ const groupedPaths = paths.reduce((acc, path4) => {
1107
+ const groupName = getGroupNameFromPath(path4, pattern);
1108
+ if (!acc[groupName]) {
1109
+ acc[groupName] = [];
1110
+ }
1111
+ acc[groupName].push(path4);
1112
+ return acc;
1113
+ }, {});
1114
+ for (const [groupName, paths2] of Object.entries(groupedPaths)) {
1115
+ const finalOutputPath = outputPath.replace("$1", groupName);
1116
+ if (filterEndpoint) {
1117
+ const pathBasedFilter = (operationName, operationDefinition) => {
1118
+ const path4 = operationDefinition.path;
1119
+ const pathGroupName = getGroupNameFromPath(path4, pattern);
1120
+ if (pathGroupName !== groupName) {
1121
+ return false;
1122
+ }
1123
+ const endpointFilter = filterEndpoint(groupName);
1124
+ if (endpointFilter instanceof RegExp) {
1125
+ return endpointFilter.test(operationName);
1126
+ }
1127
+ return true;
1128
+ };
1129
+ const groupOptions = {
1130
+ ...commonConfig,
1131
+ outputFile: finalOutputPath,
1132
+ filterEndpoints: pathBasedFilter
1133
+ };
1134
+ await generateSingleEndpoint(groupOptions);
1135
+ } else {
1136
+ const pathBasedFilter = (operationName, operationDefinition) => {
1137
+ const path4 = operationDefinition.path;
1138
+ const pathGroupName = getGroupNameFromPath(path4, pattern);
1139
+ return pathGroupName === groupName;
1140
+ };
1141
+ const groupOptions = {
1142
+ ...commonConfig,
1143
+ outputFile: finalOutputPath,
1144
+ filterEndpoints: pathBasedFilter
1145
+ };
1146
+ await generateSingleEndpoint(groupOptions);
1147
+ }
1148
+ }
1149
+ return;
1150
+ }
1151
+ await generateSingleEndpoint(options);
1152
+ }
1153
+ async function generateSingleEndpoint(options) {
1095
1154
  const schemaLocation = options.schemaFile;
1096
1155
  const schemaAbsPath = isValidUrl(options.schemaFile) ? options.schemaFile : path3.resolve(process.cwd(), schemaLocation);
1097
1156
  const sourceCode = await enforceOazapftsTsVersion(async () => {
@@ -1115,9 +1174,16 @@ function parseConfig(fullConfig) {
1115
1174
  const outFiles = [];
1116
1175
  if ("outputFiles" in fullConfig) {
1117
1176
  const { outputFiles, ...commonConfig } = fullConfig;
1118
- const openApiDoc = JSON.parse(fs.readFileSync(fullConfig.schemaFile, "utf-8"));
1177
+ let openApiDoc;
1178
+ if (isValidUrl(fullConfig.schemaFile)) {
1179
+ outFiles.push(fullConfig);
1180
+ return outFiles;
1181
+ } else {
1182
+ openApiDoc = JSON.parse(fs.readFileSync(fullConfig.schemaFile, "utf-8"));
1183
+ }
1119
1184
  const paths = Object.keys(openApiDoc.paths);
1120
- const [outputPath, config] = Object.entries(outputFiles)[0];
1185
+ const outputFilesEntries = Object.entries(outputFiles);
1186
+ const [outputPath, config] = outputFilesEntries[0];
1121
1187
  const patterns = config.groupMatch;
1122
1188
  const filterEndpoint = config.filterEndpoint;
1123
1189
  const pattern = patterns;
package/lib/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/index.ts","../src/generate.ts","../src/utils/factory.ts","../src/codegen.ts","../src/generators/react-hooks.ts","../src/utils/capitalize.ts","../src/types.ts","../src/utils/getOperationDefinitions.ts","../src/utils/getV3Doc.ts","../src/utils/isQuery.ts","../src/utils/isValidUrl.ts","../src/utils/prettier.ts","../src/utils/removeUndefined.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { generateApi } from './generate';\nimport type { CommonOptions, ConfigFile, GenerationOptions, OutputFileOptions } from './types';\nimport { isValidUrl, prettify } from './utils';\nimport camelCase from 'lodash.camelcase';\nexport type { OutputFilesConfig, ConfigFile } from './types';\n\nconst require = createRequire(__filename);\n\n\n\n// 確保目錄存在的函數\nasync function ensureDirectoryExists(filePath: string) {\n const dirname = path.dirname(filePath);\n if (!fs.existsSync(dirname)) {\n await fs.promises.mkdir(dirname, { recursive: true });\n }\n}\n\n\n// 檢查檔案是否存在的函數\nfunction fileExists(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\n// 獲取資料夾名稱並轉換為 API 名稱\nfunction getApiNameFromDir(dirPath: string): string {\n const dirName = path.basename(dirPath);\n return `${dirName}Api`;\n}\n\n// 確保基礎文件存在的函數\nasync function ensureBaseFilesExist(outputDir: string) {\n const enhanceEndpointsPath = path.join(outputDir, 'enhanceEndpoints.ts');\n const indexPath = path.join(outputDir, 'index.ts');\n const apiName = getApiNameFromDir(outputDir);\n\n // 如果 enhanceEndpoints.ts 不存在,創建它\n if (!fileExists(enhanceEndpointsPath)) {\n const enhanceEndpointsContent = `import api from './query.generated';\n\nconst enhancedApi = api.enhanceEndpoints({\n endpoints: {\n },\n});\n\nexport default enhancedApi;\n`;\n await fs.promises.writeFile(enhanceEndpointsPath, enhanceEndpointsContent, 'utf-8');\n }\n\n // 如果 index.ts 不存在,創建它\n if (!fileExists(indexPath)) {\n const indexContent = `export * from './query.generated';\nexport {default as ${apiName}} from './enhanceEndpoints';\n`;\n await fs.promises.writeFile(indexPath, indexContent, 'utf-8');\n }\n}\n\n\n// 從路徑中提取分類名稱\nfunction getGroupNameFromPath(path: string, pattern: RegExp): string {\n // console.log('pattern', pattern);\n\n const match = path.match(pattern);\n // console.log('match', path, match);\n\n if (match && match[1]) {\n return camelCase(match[1]);\n }\n return 'common';\n}\n\n\n\n\n\nexport async function generateEndpoints(options: GenerationOptions): Promise<string | void> {\n const schemaLocation = options.schemaFile;\n\n const schemaAbsPath = isValidUrl(options.schemaFile)\n ? options.schemaFile\n : path.resolve(process.cwd(), schemaLocation);\n\n const sourceCode = await enforceOazapftsTsVersion(async () => {\n return generateApi(schemaAbsPath, options);\n });\n const { outputFile, prettierConfigFile } = options;\n if (outputFile) {\n const outputPath = path.resolve(process.cwd(), outputFile);\n await ensureDirectoryExists(outputPath);\n\n // 確保基礎文件存在\n const outputDir = path.dirname(outputPath);\n await ensureBaseFilesExist(outputDir);\n\n fs.writeFileSync(\n outputPath,\n await prettify(outputFile, sourceCode, prettierConfigFile)\n );\n } else {\n return await prettify(null, sourceCode, prettierConfigFile);\n }\n}\n\n\nexport function parseConfig(fullConfig: ConfigFile) {\n const outFiles: (CommonOptions & OutputFileOptions)[] = [];\n\n if ('outputFiles' in fullConfig) {\n const { outputFiles, ...commonConfig } = fullConfig;\n\n // 讀取 OpenAPI 文檔\n const openApiDoc = JSON.parse(fs.readFileSync(fullConfig.schemaFile, 'utf-8'));\n const paths = Object.keys(openApiDoc.paths);\n\n // 從配置中獲取分類規則\n const [outputPath, config] = Object.entries(outputFiles)[0];\n const patterns = config.groupMatch;\n const filterEndpoint = config.filterEndpoint;\n\n const pattern = patterns;\n // 根據路徑自動分類\n const groupedPaths = paths.reduce((acc, path) => {\n const groupName = getGroupNameFromPath(path, pattern);\n if (!acc[groupName]) {\n acc[groupName] = [];\n }\n acc[groupName].push(path);\n return acc;\n }, {} as Record<string, string[]>);\n\n // 為每個分類生成配置\n Object.entries(groupedPaths).forEach(([groupName, paths]) => {\n const finalOutputPath = outputPath.replace('$1', groupName);\n\n if (filterEndpoint) {\n // 如果有 filterEndpoint,使用基於路徑的篩選函數\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n if (pathGroupName !== groupName) {\n return false;\n }\n\n // 使用 filterEndpoint 進行額外篩選\n const endpointFilter = filterEndpoint(groupName);\n if (endpointFilter instanceof RegExp) {\n return endpointFilter.test(operationName);\n }\n\n return true;\n };\n\n outFiles.push({\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n });\n } else {\n // 如果沒有 filterEndpoint,只使用路徑分組\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n return pathGroupName === groupName;\n };\n\n outFiles.push({\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n });\n }\n });\n\n } else {\n outFiles.push(fullConfig);\n }\n return outFiles;\n}\n\n/**\n * Enforces `oazapfts` to use the same TypeScript version as this module itself uses.\n * That should prevent enums from running out of sync if both libraries use different TS versions.\n */\nfunction enforceOazapftsTsVersion<T>(cb: () => T): T {\n const ozTsPath = require.resolve('typescript', { paths: [require.resolve('oazapfts')] });\n const tsPath = require.resolve('typescript');\n const originalEntry = require.cache[ozTsPath];\n try {\n require.cache[ozTsPath] = require.cache[tsPath];\n return cb();\n } finally {\n if (originalEntry) {\n require.cache[ozTsPath] = originalEntry;\n } else {\n delete require.cache[ozTsPath];\n }\n }\n}\n","import camelCase from 'lodash.camelcase';\nimport path from 'node:path';\nimport ApiGenerator, {\n getOperationName as _getOperationName,\n getReferenceName,\n isReference,\n supportDeepObjects,\n createPropertyAssignment,\n createQuestionToken,\n isValidIdentifier,\n keywordType,\n} from 'oazapfts/generate';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport ts from 'typescript';\nimport type { ObjectPropertyDefinitions } from './codegen';\nimport { generateCreateApiCall, generateEndpointDefinition, generateImportNode, generateTagTypes } from './codegen';\nimport { generateReactHooks } from './generators/react-hooks';\nimport type {\n EndpointMatcher,\n EndpointOverrides,\n GenerationOptions,\n OperationDefinition,\n ParameterDefinition,\n ParameterMatcher,\n TextMatcher,\n} from './types';\nimport { capitalize, getOperationDefinitions, getV3Doc, removeUndefined, isQuery as testIsQuery } from './utils';\nimport { factory } from './utils/factory';\n\nconst generatedApiName = 'injectedRtkApi';\nconst v3DocCache: Record<string, OpenAPIV3.Document> = {};\n\nfunction defaultIsDataResponse(code: string, includeDefault: boolean) {\n if (includeDefault && code === 'default') {\n return true;\n }\n const parsedCode = Number(code);\n return !Number.isNaN(parsedCode) && parsedCode >= 200 && parsedCode < 300;\n}\n\nfunction getOperationName({ verb, path }: Pick<OperationDefinition, 'verb' | 'path' >) {\n return _getOperationName(verb, path, undefined);\n}\n\nfunction getTags({ verb, pathItem }: Pick<OperationDefinition, 'verb' | 'pathItem'>): string[] {\n return verb ? pathItem[verb]?.tags || [] : [];\n}\n\nfunction patternMatches(pattern?: TextMatcher) {\n const filters = Array.isArray(pattern) ? pattern : [pattern];\n return function matcher(operationName: string) {\n if (!pattern) return true;\n return filters.some((filter) =>\n typeof filter === 'string' ? filter === operationName : filter?.test(operationName)\n );\n };\n}\n\nfunction operationMatches(pattern?: EndpointMatcher) {\n const checkMatch = typeof pattern === 'function' ? pattern : patternMatches(pattern);\n return function matcher(operationDefinition: OperationDefinition) {\n if (!pattern) return true;\n const operationName = getOperationName(operationDefinition);\n return checkMatch(operationName, operationDefinition);\n };\n}\n\nfunction argumentMatches(pattern?: ParameterMatcher) {\n const checkMatch = typeof pattern === 'function' ? pattern : patternMatches(pattern);\n return function matcher(argumentDefinition: ParameterDefinition) {\n if (!pattern || argumentDefinition.in === 'path') return true;\n const argumentName = argumentDefinition.name;\n return checkMatch(argumentName, argumentDefinition);\n };\n}\n\nfunction withQueryComment<T extends ts.Node>(node: T, def: QueryArgDefinition, hasTrailingNewLine: boolean): T {\n const comment = def.origin === 'param' ? def.param.description : def.body.description;\n if (comment) {\n return ts.addSyntheticLeadingComment(\n node,\n ts.SyntaxKind.MultiLineCommentTrivia,\n `* ${comment} `,\n hasTrailingNewLine\n );\n }\n return node;\n}\n\nexport function getOverrides(\n operation: OperationDefinition,\n endpointOverrides?: EndpointOverrides[]\n): EndpointOverrides | undefined {\n return endpointOverrides?.find((override) => operationMatches(override.pattern)(operation));\n}\n\nexport async function generateApi(\n spec: string,\n {\n apiFile,\n apiImport = 'api',\n exportName = 'enhancedApi',\n argSuffix = 'ApiArg',\n responseSuffix = 'ApiResponse',\n operationNameSuffix = '',\n hooks = false,\n tag = false,\n outputFile,\n isDataResponse = defaultIsDataResponse,\n filterEndpoints,\n endpointOverrides,\n unionUndefined,\n encodePathParams = false,\n encodeQueryParams = false,\n flattenArg = false,\n includeDefault = false,\n useEnumType = false,\n mergeReadWriteOnly = false,\n httpResolverOptions,\n sharedTypesFile,\n }: GenerationOptions\n) {\n const v3Doc = (v3DocCache[spec] ??= await getV3Doc(spec, httpResolverOptions));\n\n const apiGen = new ApiGenerator(v3Doc, {\n unionUndefined,\n useEnumType,\n mergeReadWriteOnly,\n });\n\n const schemeTypeNames = new Set<string>();\n\n function addSchemeTypeName(name: string) {\n schemeTypeNames.add(name);\n schemeTypeNames.add(camelCase(name));\n schemeTypeNames.add(capitalize(camelCase(name)));\n }\n\n if (sharedTypesFile) {\n const resultFile = ts.createSourceFile(\n 'sharedTypes.ts',\n '',\n ts.ScriptTarget.Latest,\n /*setParentNodes*/ false,\n ts.ScriptKind.TS\n );\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n\n const allTypeDefinitions: ts.Statement[] = [];\n const definedTypeNames = new Set<string>();\n\n const components = v3Doc.components;\n if (components) {\n const componentDefinitions = Object.entries(components).map(([componentType, componentDefs]) => {\n const typeEntries = Object.entries(componentDefs as Record<string, unknown>)\n .map(([name, def]) => {\n addSchemeTypeName(name);\n const typeName = capitalize(camelCase(name));\n definedTypeNames.add(typeName);\n const typeNode = wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(def as OpenAPIV3.SchemaObject));\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n typeNode\n );\n });\n return factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(typeEntries),\n ts.NodeFlags.Namespace\n );\n });\n allTypeDefinitions.push(...componentDefinitions);\n }\n\n const enumEntries = [\n ...apiGen.enumAliases.filter(e => ts.isEnumDeclaration(e)),\n ...apiGen.enumAliases.filter(e => ts.isTypeAliasDeclaration(e)),\n ].map(enumDecl => {\n if (ts.isEnumDeclaration(enumDecl)) {\n return factory.createEnumDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n enumDecl.name,\n enumDecl.members\n );\n } else if (ts.isTypeAliasDeclaration(enumDecl)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n enumDecl.name,\n enumDecl.typeParameters,\n enumDecl.type\n );\n }\n return enumDecl;\n });\n \n const unionTypeEnums = apiGen.aliases\n .filter(alias => {\n if (ts.isTypeAliasDeclaration(alias) && alias.type) {\n return ts.isUnionTypeNode(alias.type);\n }\n return false;\n })\n .map(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n alias.name,\n alias.typeParameters,\n alias.type\n );\n }\n return alias;\n });\n \n const allEnumEntries = [...enumEntries, ...unionTypeEnums];\n \n if (allEnumEntries.length > 0) {\n allTypeDefinitions.push(\n factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Enum'),\n factory.createModuleBlock(allEnumEntries),\n ts.NodeFlags.Namespace\n )\n );\n }\n\n if (apiGen.aliases.length > 0) {\n const aliasEntries = apiGen.aliases\n .filter(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n const isDefinedInComponents = definedTypeNames.has(alias.name.text);\n const isUnionTypeEnum = ts.isUnionTypeNode(alias.type);\n return !isDefinedInComponents && !isUnionTypeEnum;\n }\n return false;\n })\n .map(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n alias.name,\n alias.typeParameters,\n alias.type\n );\n }\n return alias;\n });\n\n if (aliasEntries.length > 0) {\n const existingSchemeIndex = allTypeDefinitions.findIndex(def => \n ts.isModuleDeclaration(def) && \n ts.isIdentifier(def.name) && \n def.name.text === 'Scheme'\n );\n\n if (existingSchemeIndex >= 0) {\n const existingScheme = allTypeDefinitions[existingSchemeIndex] as ts.ModuleDeclaration;\n const mergedMembers = [...(existingScheme.body as ts.ModuleBlock).statements, ...aliasEntries];\n allTypeDefinitions[existingSchemeIndex] = factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(mergedMembers),\n ts.NodeFlags.Namespace\n );\n } else {\n allTypeDefinitions.push(\n factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(aliasEntries),\n ts.NodeFlags.Namespace\n )\n );\n }\n }\n }\n\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n \n const sharedTypesDir = path.dirname(sharedTypesFile);\n await fs.mkdir(sharedTypesDir, { recursive: true });\n \n const output = printer.printNode(\n ts.EmitHint.Unspecified,\n factory.createSourceFile(\n allTypeDefinitions,\n factory.createToken(ts.SyntaxKind.EndOfFileToken),\n ts.NodeFlags.None\n ),\n resultFile\n );\n\n await fs.writeFile(sharedTypesFile, output, 'utf-8');\n }\n\n if (apiGen.spec.components?.schemas) {\n apiGen.preprocessComponents(apiGen.spec.components.schemas);\n }\n\n const operationDefinitions = getOperationDefinitions(v3Doc).filter(operationMatches(filterEndpoints));\n\n const resultFile = ts.createSourceFile(\n 'someFileName.ts',\n '',\n ts.ScriptTarget.Latest,\n /*setParentNodes*/ false,\n ts.ScriptKind.TS\n );\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n\n const interfaces: Record<string, ts.InterfaceDeclaration | ts.TypeAliasDeclaration> = {};\n function registerInterface(declaration: ts.InterfaceDeclaration | ts.TypeAliasDeclaration) {\n const name = declaration.name.escapedText.toString();\n if (name in interfaces) {\n throw new Error(`interface/type alias ${name} already registered`);\n }\n interfaces[name] = declaration;\n return declaration;\n }\n\n if (outputFile) {\n outputFile = path.resolve(process.cwd(), outputFile);\n if (apiFile.startsWith('.')) {\n apiFile = path.relative(path.dirname(outputFile), apiFile);\n apiFile = apiFile.replace(/\\\\/g, '/');\n if (!apiFile.startsWith('.')) apiFile = `./${apiFile}`;\n }\n }\n apiFile = apiFile.replace(/\\.[jt]sx?$/, '');\n\n const sharedTypesImportPath = sharedTypesFile && outputFile\n ? (() => {\n let rel = path.relative(path.dirname(outputFile), sharedTypesFile)\n .replace(/\\\\/g, '/')\n .replace(/\\.[jt]sx?$/, '');\n if (!rel.startsWith('.')) rel = './' + rel;\n return rel;\n })()\n : './shared-types';\n\n return printer.printNode(\n ts.EmitHint.Unspecified,\n factory.createSourceFile(\n [\n generateImportNode(apiFile, { [apiImport]: 'api' }),\n generateImportNode('@acrool/react-fetcher', { IRestFulEndpointsQueryReturn: 'IRestFulEndpointsQueryReturn' }),\n ...(sharedTypesFile ? [\n generateImportNode(sharedTypesImportPath, { \n Scheme: 'Scheme',\n ...(useEnumType ? { Enum: 'Enum' } : {})\n })\n ] : []),\n ...(tag ? [generateTagTypes({ addTagTypes: extractAllTagTypes({ operationDefinitions }) })] : []),\n generateCreateApiCall({\n tag,\n endpointDefinitions: factory.createObjectLiteralExpression(\n operationDefinitions.map((operationDefinition) =>\n generateEndpoint({\n operationDefinition,\n overrides: getOverrides(operationDefinition, endpointOverrides),\n sharedTypesFile: !!sharedTypesFile,\n })\n ),\n true\n ),\n }),\n factory.createExportAssignment(\n undefined,\n undefined,\n factory.createIdentifier(generatedApiName)\n ),\n ...Object.values(interfaces),\n ...(sharedTypesFile ? [] : [...apiGen.aliases, ...apiGen.enumAliases]),\n ...(hooks\n ? [\n generateReactHooks({\n exportName: generatedApiName,\n operationDefinitions,\n endpointOverrides,\n config: hooks,\n }),\n ]\n : []),\n ],\n factory.createToken(ts.SyntaxKind.EndOfFileToken),\n ts.NodeFlags.None\n ),\n resultFile\n );\n\n function extractAllTagTypes({ operationDefinitions }: { operationDefinitions: OperationDefinition[] }) {\n const allTagTypes = new Set<string>();\n\n for (const operationDefinition of operationDefinitions) {\n const { verb, pathItem } = operationDefinition;\n for (const tag of getTags({ verb, pathItem })) {\n allTagTypes.add(tag);\n }\n }\n return [...allTagTypes];\n }\n\n function generateEndpoint({\n operationDefinition,\n overrides,\n sharedTypesFile,\n }: {\n operationDefinition: OperationDefinition;\n overrides?: EndpointOverrides;\n sharedTypesFile: boolean;\n }) {\n const {\n verb,\n path,\n pathItem,\n operation,\n operation: { responses, requestBody },\n } = operationDefinition;\n const operationName = getOperationName({ verb, path });\n const tags = tag ? getTags({ verb, pathItem }) : [];\n const isQuery = testIsQuery(verb, overrides);\n\n const returnsJson = apiGen.getResponseType(responses) === 'json';\n let ResponseType: ts.TypeNode = factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword);\n if (returnsJson) {\n const returnTypes = Object.entries(responses || {})\n .map(\n ([code, response]) =>\n [\n code,\n apiGen.resolve(response),\n wrapWithSchemeIfComponent(\n apiGen.getTypeFromResponse(response, 'readOnly') ||\n factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)\n ),\n ] as const\n )\n .filter(([status, response]) =>\n isDataResponse(status, includeDefault, apiGen.resolve(response), responses || {})\n )\n .filter(([_1, _2, type]) => type !== keywordType.void)\n .map(([code, response, type]) => {\n return ts.addSyntheticLeadingComment(\n type,\n ts.SyntaxKind.MultiLineCommentTrivia,\n `* status ${code} ${response.description} `,\n false\n );\n });\n if (returnTypes.length > 0) {\n ResponseType = factory.createUnionTypeNode(returnTypes);\n }\n }\n\n const ResponseTypeName = factory.createTypeReferenceNode(\n registerInterface(\n factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n capitalize(operationName + operationNameSuffix + responseSuffix),\n undefined,\n ResponseType\n )\n ).name\n );\n\n const operationParameters = apiGen.resolveArray(operation.parameters);\n const pathItemParameters = apiGen\n .resolveArray(pathItem.parameters)\n .filter((pp) => !operationParameters.some((op) => op.name === pp.name && op.in === pp.in));\n\n const parameters = supportDeepObjects([...pathItemParameters, ...operationParameters])\n .filter(argumentMatches(overrides?.parameterFilter))\n .filter(param => param.in !== 'header');\n\n const allNames = parameters.map((p) => p.name);\n const queryArg: QueryArgDefinitions = {};\n function generateName(name: string, potentialPrefix: string) {\n const isPureSnakeCase = /^[a-zA-Z][a-zA-Z0-9_]*$/.test(name);\n const hasNamingConflict = allNames.filter((n) => n === name).length > 1;\n if (hasNamingConflict) {\n name = `${potentialPrefix}_${name}`;\n }\n const camelCaseName = camelCase(name);\n if (isPureSnakeCase && !allNames.includes(camelCaseName)) {\n name = camelCaseName;\n }\n while (name in queryArg) {\n name = `_${name}`;\n }\n return name;\n }\n\n for (const param of parameters) {\n const name = generateName(param.name, param.in);\n queryArg[name] = {\n origin: 'param',\n name,\n originalName: param.name,\n type: wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(isReference(param) ? param : param.schema, undefined, 'writeOnly')),\n required: param.required,\n param,\n };\n }\n\n if (requestBody) {\n const body = apiGen.resolve(requestBody);\n const schema = apiGen.getSchemaFromContent(body.content);\n const type = wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(schema));\n const schemaName = camelCase(\n (type as any).name ||\n getReferenceName(schema) ||\n (typeof schema === 'object' && 'title' in schema && schema.title) ||\n 'body'\n );\n const name = generateName(schemaName in queryArg ? 'body' : schemaName, 'body');\n\n queryArg[name] = {\n origin: 'body',\n name,\n originalName: schemaName,\n type: wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(schema, undefined, 'writeOnly')),\n required: true,\n body,\n };\n }\n\n const propertyName = (name: string | ts.PropertyName): ts.PropertyName => {\n if (typeof name === 'string') {\n return isValidIdentifier(name) ? factory.createIdentifier(name) : factory.createStringLiteral(name);\n }\n return name;\n };\n\n const queryArgValues = Object.values(queryArg);\n\n const isFlatArg = flattenArg && queryArgValues.length === 1;\n const QueryArg = factory.createTypeReferenceNode(\n registerInterface(\n factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n capitalize(operationName + operationNameSuffix + argSuffix),\n undefined,\n queryArgValues.length > 0\n ? isFlatArg\n ? withQueryComment(\n factory.createUnionTypeNode([\n queryArgValues[0].type,\n ...(!queryArgValues[0].required\n ? [factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)]\n : []),\n ]),\n queryArgValues[0],\n false\n )\n : factory.createTypeLiteralNode(\n queryArgValues.map((def) =>\n withQueryComment(\n factory.createPropertySignature(\n undefined,\n propertyName(def.name),\n createQuestionToken(!def.required),\n def.type\n ),\n def,\n true\n )\n )\n )\n : factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword)\n )\n ).name\n );\n\n return generateEndpointDefinition({\n operationName: operationNameSuffix ? capitalize(operationName + operationNameSuffix) : operationName,\n type: isQuery ? 'query' : 'mutation',\n Response: ResponseTypeName,\n QueryArg: factory.createTypeReferenceNode(\n factory.createIdentifier('IRestFulEndpointsQueryReturn'),\n [QueryArg]\n ),\n queryFn: generateQueryFn({\n operationDefinition,\n queryArg,\n isQuery,\n isFlatArg,\n encodePathParams,\n encodeQueryParams,\n }),\n extraEndpointsProps: isQuery\n ? generateQueryEndpointProps({ operationDefinition })\n : generateMutationEndpointProps({ operationDefinition }),\n tags,\n });\n }\n\n function generateQueryFn({\n operationDefinition,\n queryArg,\n isFlatArg,\n isQuery,\n encodePathParams,\n encodeQueryParams,\n }: {\n operationDefinition: OperationDefinition;\n queryArg: QueryArgDefinitions;\n isFlatArg: boolean;\n isQuery: boolean;\n encodePathParams: boolean;\n encodeQueryParams: boolean;\n }) {\n const { path, verb } = operationDefinition;\n\n const bodyParameter = Object.values(queryArg).find((def) => def.origin === 'body');\n\n const rootObject = factory.createIdentifier('queryArg');\n const variablesObject = factory.createPropertyAccessExpression(rootObject, factory.createIdentifier('variables'));\n\n function pickParams(paramIn: string) {\n return Object.values(queryArg).filter((def) => def.origin === 'param' && def.param.in === paramIn);\n }\n\n function createObjectLiteralProperty(parameters: QueryArgDefinition[], propertyName: string) {\n if (parameters.length === 0) return undefined;\n\n const properties = parameters.map((param) => {\n const value = isFlatArg \n ? variablesObject \n : factory.createPropertyAccessExpression(variablesObject, factory.createIdentifier(param.name));\n\n const encodedValue =\n encodeQueryParams && param.param?.in === 'query'\n ? factory.createConditionalExpression(\n value,\n undefined,\n factory.createCallExpression(factory.createIdentifier('encodeURIComponent'), undefined, [\n factory.createCallExpression(factory.createIdentifier('String'), undefined, [value]),\n ]),\n undefined,\n factory.createIdentifier('undefined')\n )\n : value;\n\n return createPropertyAssignment(param.originalName, encodedValue);\n });\n\n return factory.createPropertyAssignment(\n factory.createIdentifier(propertyName),\n factory.createObjectLiteralExpression(properties, true)\n );\n }\n\n return factory.createArrowFunction(\n undefined,\n undefined,\n [factory.createParameterDeclaration(undefined, undefined, rootObject, undefined, undefined, undefined)],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createParenthesizedExpression(\n factory.createObjectLiteralExpression(\n [\n factory.createPropertyAssignment(\n factory.createIdentifier('url'),\n generatePathExpression(path, pickParams('path'), variablesObject, isFlatArg, encodePathParams)\n ),\n isQuery && verb.toUpperCase() === 'GET'\n ? undefined\n : factory.createPropertyAssignment(\n factory.createIdentifier('method'),\n factory.createStringLiteral(verb.toUpperCase())\n ),\n bodyParameter === undefined\n ? undefined\n : factory.createPropertyAssignment(\n factory.createIdentifier('body'),\n isFlatArg\n ? variablesObject\n : factory.createPropertyAccessExpression(variablesObject, factory.createIdentifier(bodyParameter.name))\n ),\n createObjectLiteralProperty(pickParams('cookie'), 'cookies'),\n createObjectLiteralProperty(pickParams('query'), 'params'),\n factory.createPropertyAssignment(\n factory.createIdentifier('fetchOptions'),\n factory.createPropertyAccessChain(\n rootObject,\n factory.createToken(ts.SyntaxKind.QuestionDotToken),\n factory.createIdentifier('fetchOptions')\n )\n ),\n ].filter(removeUndefined),\n false\n )\n )\n );\n }\n\n function generateQueryEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {\n return {};\n }\n\n function generateMutationEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {\n return {};\n }\n\n function wrapWithSchemeIfComponent(typeNode: ts.TypeNode): ts.TypeNode {\n if (ts.isTypeReferenceNode(typeNode) && ts.isIdentifier(typeNode.typeName)) {\n const typeName = typeNode.typeName.text;\n \n // 檢查是否為 enum 類型(包括在 enumAliases 和 aliases 中的)\n const isEnumType = useEnumType && (\n apiGen.enumAliases.some(enumDecl => {\n if (ts.isEnumDeclaration(enumDecl) || ts.isTypeAliasDeclaration(enumDecl)) {\n return enumDecl.name.text === typeName;\n }\n return false;\n }) ||\n apiGen.aliases.some(alias => {\n if (ts.isTypeAliasDeclaration(alias) && alias.type) {\n // 檢查是否為 union type 的 enum\n if (ts.isUnionTypeNode(alias.type)) {\n return alias.name.text === typeName;\n }\n }\n return false;\n })\n );\n \n if (isEnumType) {\n return factory.createTypeReferenceNode(\n factory.createQualifiedName(\n factory.createIdentifier('Enum'),\n typeNode.typeName\n ),\n typeNode.typeArguments?.map(wrapWithSchemeIfComponent)\n );\n }\n \n if (schemeTypeNames.has(typeName)) {\n return factory.createTypeReferenceNode(\n factory.createQualifiedName(\n factory.createIdentifier('Scheme'),\n typeNode.typeName\n ),\n typeNode.typeArguments?.map(wrapWithSchemeIfComponent)\n );\n }\n if (typeNode.typeArguments) {\n return factory.createTypeReferenceNode(\n typeNode.typeName,\n typeNode.typeArguments.map(wrapWithSchemeIfComponent)\n );\n }\n }\n if (ts.isArrayTypeNode(typeNode)) {\n return factory.createArrayTypeNode(wrapWithSchemeIfComponent(typeNode.elementType));\n }\n if (ts.isUnionTypeNode(typeNode)) {\n // 檢查是否為 enum 的 union type\n const unionTypes = typeNode.types;\n if (unionTypes.length > 0 && unionTypes.every(type => \n ts.isLiteralTypeNode(type) && \n (ts.isStringLiteral(type.literal) || ts.isNumericLiteral(type.literal))\n )) {\n // 這是一個 enum 的 union type,我們需要找到對應的 enum 類型\n const enumValues = unionTypes.map(type => {\n if (ts.isLiteralTypeNode(type)) {\n if (ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n } else if (ts.isNumericLiteral(type.literal)) {\n return type.literal.text;\n }\n }\n return null;\n }).filter(Boolean);\n \n // 查找對應的 enum 類型\n const matchingEnum = apiGen.aliases.find(alias => {\n if (ts.isTypeAliasDeclaration(alias) && ts.isUnionTypeNode(alias.type)) {\n const aliasValues = alias.type.types.map(type => {\n if (ts.isLiteralTypeNode(type)) {\n if (ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n } else if (ts.isNumericLiteral(type.literal)) {\n return type.literal.text;\n }\n }\n return null;\n }).filter(Boolean);\n \n return aliasValues.length === enumValues.length && \n aliasValues.every(val => enumValues.includes(val));\n }\n return false;\n });\n \n // 對於所有的 enum 類型,直接使用字串型別,不轉換為 Enum\n // 這樣可以避免自動命名造成的變更問題\n if (matchingEnum && ts.isTypeAliasDeclaration(matchingEnum)) {\n // 直接返回原始的 union type,不轉換為 Enum\n return typeNode;\n }\n }\n \n return factory.createUnionTypeNode(typeNode.types.map(wrapWithSchemeIfComponent));\n }\n if (ts.isTypeLiteralNode(typeNode)) {\n return factory.createTypeLiteralNode(\n typeNode.members.map(member => {\n if (ts.isPropertySignature(member) && member.type) {\n return factory.updatePropertySignature(\n member,\n member.modifiers,\n member.name,\n member.questionToken,\n wrapWithSchemeIfComponent(member.type)\n );\n }\n return member;\n })\n );\n }\n return typeNode;\n }\n}\n\nfunction accessProperty(rootObject: ts.Identifier, propertyName: string) {\n return isValidIdentifier(propertyName)\n ? factory.createPropertyAccessExpression(rootObject, factory.createIdentifier(propertyName))\n : factory.createElementAccessExpression(rootObject, factory.createStringLiteral(propertyName));\n}\n\nfunction generatePathExpression(\n path: string,\n pathParameters: QueryArgDefinition[],\n rootObject: ts.Identifier | ts.PropertyAccessExpression,\n isFlatArg: boolean,\n encodePathParams: boolean\n) {\n const expressions: Array<[string, string]> = [];\n\n const head = path.replace(/\\{(.*?)}(.*?)(?=\\{|$)/g, (_, expression, literal) => {\n const param = pathParameters.find((p) => p.originalName === expression);\n if (!param) {\n throw new Error(`path parameter ${expression} does not seem to be defined in '${path}'!`);\n }\n expressions.push([param.name, literal]);\n return '';\n });\n\n return expressions.length\n ? factory.createTemplateExpression(\n factory.createTemplateHead(head),\n expressions.map(([prop, literal], index) => {\n const value = isFlatArg \n ? rootObject \n : factory.createPropertyAccessExpression(rootObject, factory.createIdentifier(prop));\n const encodedValue = encodePathParams\n ? factory.createCallExpression(factory.createIdentifier('encodeURIComponent'), undefined, [\n factory.createCallExpression(factory.createIdentifier('String'), undefined, [value]),\n ])\n : value;\n return factory.createTemplateSpan(\n encodedValue,\n index === expressions.length - 1\n ? factory.createTemplateTail(literal)\n : factory.createTemplateMiddle(literal)\n );\n })\n )\n : factory.createNoSubstitutionTemplateLiteral(head);\n}\n\ntype QueryArgDefinition = {\n name: string;\n originalName: string;\n type: ts.TypeNode;\n required?: boolean;\n param?: OpenAPIV3.ParameterObject;\n} & (\n | {\n origin: 'param';\n param: OpenAPIV3.ParameterObject;\n }\n | {\n origin: 'body';\n body: OpenAPIV3.RequestBodyObject;\n }\n);\ntype QueryArgDefinitions = Record<string, QueryArgDefinition>;\n","import ts from 'typescript';\nimport semver from 'semver';\n\nconst originalFactory = ts.factory;\n\nfunction createImportSpecifier(propertyName: ts.Identifier | undefined, name: ts.Identifier): ts.ImportSpecifier {\n if (semver.satisfies(ts.version, '>= 4.5'))\n // @ts-ignore\n return originalFactory.createImportSpecifier(false, propertyName, name);\n // @ts-ignore\n return originalFactory.createImportSpecifier(propertyName, name);\n}\n\nfunction createExportSpecifier(\n propertyName: string | ts.Identifier | undefined,\n name: string | ts.Identifier\n): ts.ExportSpecifier {\n if (semver.satisfies(ts.version, '>= 4.5'))\n // @ts-ignore\n return originalFactory.createExportSpecifier(false, propertyName, name);\n // @ts-ignore\n return originalFactory.createExportSpecifier(propertyName, name);\n}\n\nexport const factory = {\n ...originalFactory,\n createImportSpecifier,\n createExportSpecifier,\n};\n","import { factory } from './utils/factory';\nimport ts from 'typescript';\n\nconst defaultEndpointBuilder = factory.createIdentifier('build');\n\nexport type ObjectPropertyDefinitions = Record<string, ts.Expression | undefined>;\nexport function generateObjectProperties(obj: ObjectPropertyDefinitions) {\n return Object.entries(obj)\n .filter(([_, v]) => v)\n .map(([k, v]) => factory.createPropertyAssignment(factory.createIdentifier(k), v as ts.Expression));\n}\n\nexport function generateImportNode(pkg: string, namedImports: Record<string, string>, defaultImportName?: string) {\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(\n false,\n defaultImportName !== undefined ? factory.createIdentifier(defaultImportName) : undefined,\n factory.createNamedImports(\n Object.entries(namedImports).map(([propertyName, name]) =>\n factory.createImportSpecifier(\n name === propertyName ? undefined : factory.createIdentifier(propertyName),\n factory.createIdentifier(name)\n )\n )\n )\n ),\n factory.createStringLiteral(pkg)\n );\n}\n\nexport function generateCreateApiCall({\n endpointBuilder = defaultEndpointBuilder,\n endpointDefinitions,\n tag,\n}: {\n endpointBuilder?: ts.Identifier;\n endpointDefinitions: ts.ObjectLiteralExpression;\n tag: boolean;\n}) {\n const injectEndpointsObjectLiteralExpression = factory.createObjectLiteralExpression(\n generateObjectProperties({\n endpoints: factory.createArrowFunction(\n undefined,\n undefined,\n [factory.createParameterDeclaration(undefined, undefined, endpointBuilder, undefined, undefined, undefined)],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createParenthesizedExpression(endpointDefinitions)\n ),\n overrideExisting: factory.createFalse(),\n }),\n true\n );\n if (tag) {\n const enhanceEndpointsObjectLiteralExpression = factory.createObjectLiteralExpression(\n [factory.createShorthandPropertyAssignment(factory.createIdentifier('addTagTypes'), undefined)],\n true\n );\n return factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('injectedRtkApi'),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier('api'),\n factory.createIdentifier('enhanceEndpoints')\n ),\n undefined,\n [enhanceEndpointsObjectLiteralExpression]\n ),\n factory.createIdentifier('injectEndpoints')\n ),\n undefined,\n [injectEndpointsObjectLiteralExpression]\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n }\n\n return factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('injectedRtkApi'),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier('api'),\n factory.createIdentifier('injectEndpoints')\n ),\n undefined,\n [injectEndpointsObjectLiteralExpression]\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n}\n\nexport function generateEndpointDefinition({\n operationName,\n type,\n Response,\n QueryArg,\n queryFn,\n endpointBuilder = defaultEndpointBuilder,\n extraEndpointsProps,\n tags,\n}: {\n operationName: string;\n type: 'query' | 'mutation';\n Response: ts.TypeReferenceNode;\n QueryArg: ts.TypeReferenceNode;\n queryFn: ts.Expression;\n endpointBuilder?: ts.Identifier;\n extraEndpointsProps: ObjectPropertyDefinitions;\n tags: string[];\n}) {\n const objectProperties = generateObjectProperties({ query: queryFn, ...extraEndpointsProps });\n if (tags.length > 0) {\n objectProperties.push(\n factory.createPropertyAssignment(\n factory.createIdentifier(type === 'query' ? 'providesTags' : 'invalidatesTags'),\n factory.createArrayLiteralExpression(tags.map((tag) => factory.createStringLiteral(tag), false))\n )\n );\n }\n return factory.createPropertyAssignment(\n factory.createIdentifier(operationName),\n\n factory.createCallExpression(\n factory.createPropertyAccessExpression(endpointBuilder, factory.createIdentifier(type)),\n [Response, QueryArg],\n [factory.createObjectLiteralExpression(objectProperties, true)]\n )\n );\n}\n\nexport function generateTagTypes({ addTagTypes }: { addTagTypes: string[] }) {\n return factory.createVariableStatement(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('addTagTypes'),\n undefined,\n undefined,\n factory.createAsExpression(\n factory.createArrayLiteralExpression(\n addTagTypes.map((tagType) => factory.createStringLiteral(tagType)),\n true\n ),\n factory.createTypeReferenceNode(factory.createIdentifier('const'), undefined)\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n}\n","import ts from 'typescript';\nimport { getOperationName } from 'oazapfts/generate';\nimport { capitalize, isQuery } from '../utils';\nimport type { OperationDefinition, EndpointOverrides, ConfigFile } from '../types';\nimport { getOverrides } from '../generate';\nimport { factory } from '../utils/factory';\n\ntype HooksConfigOptions = NonNullable<ConfigFile['hooks']>;\n\ntype GetReactHookNameParams = {\n operationDefinition: OperationDefinition;\n endpointOverrides: EndpointOverrides[] | undefined;\n config: HooksConfigOptions;\n};\n\ntype CreateBindingParams = {\n operationDefinition: OperationDefinition;\n overrides?: EndpointOverrides;\n isLazy?: boolean;\n};\n\nconst createBinding = ({\n operationDefinition: { verb, path },\n overrides,\n isLazy = false,\n}: CreateBindingParams) =>\n factory.createBindingElement(\n undefined,\n undefined,\n factory.createIdentifier(\n `use${isLazy ? 'Lazy' : ''}${capitalize(getOperationName(verb, path, undefined))}${\n isQuery(verb, overrides) ? 'Query' : 'Mutation'\n }`\n ),\n undefined\n );\n\nconst getReactHookName = ({ operationDefinition, endpointOverrides, config }: GetReactHookNameParams) => {\n const overrides = getOverrides(operationDefinition, endpointOverrides);\n\n const baseParams = {\n operationDefinition,\n overrides,\n };\n\n const _isQuery = isQuery(operationDefinition.verb, overrides);\n\n // If `config` is true, just generate everything\n if (typeof config === 'boolean') {\n return createBinding(baseParams);\n }\n\n // `config` is an object and we need to check for the configuration of each property\n if (_isQuery) {\n return [\n ...(config.queries ? [createBinding(baseParams)] : []),\n ...(config.lazyQueries ? [createBinding({ ...baseParams, isLazy: true })] : []),\n ];\n }\n\n return config.mutations ? createBinding(baseParams) : [];\n};\n\ntype GenerateReactHooksParams = {\n exportName: string;\n operationDefinitions: OperationDefinition[];\n endpointOverrides: EndpointOverrides[] | undefined;\n config: HooksConfigOptions;\n};\nexport const generateReactHooks = ({\n exportName,\n operationDefinitions,\n endpointOverrides,\n config,\n}: GenerateReactHooksParams) =>\n factory.createVariableStatement(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createObjectBindingPattern(\n operationDefinitions\n .map((operationDefinition) => getReactHookName({ operationDefinition, endpointOverrides, config }))\n .flat()\n ),\n undefined,\n undefined,\n factory.createIdentifier(exportName)\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n","export function capitalize(str: string) {\n return str.replace(str[0], str[0].toUpperCase());\n}\n","import type SwaggerParser from '@apidevtools/swagger-parser';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nexport type OperationDefinition = {\n path: string;\n verb: (typeof operationKeys)[number];\n pathItem: OpenAPIV3.PathItemObject;\n operation: OpenAPIV3.OperationObject;\n};\n\nexport type ParameterDefinition = OpenAPIV3.ParameterObject;\n\ntype Require<T, K extends keyof T> = { [k in K]-?: NonNullable<T[k]> } & Omit<T, K>;\ntype Optional<T, K extends keyof T> = { [k in K]?: NonNullable<T[k]> } & Omit<T, K>;\ntype Id<T> = { [K in keyof T]: T[K] } & {};\ntype AtLeastOneKey<T> = {\n [K in keyof T]-?: Pick<T, K> & Partial<T>;\n}[keyof T];\n\nexport const operationKeys = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const;\n\nexport type GenerationOptions = Id<\n CommonOptions &\n Optional<OutputFileOptions, 'outputFile'> & {\n isDataResponse?(\n code: string,\n includeDefault: boolean,\n response: OpenAPIV3.ResponseObject,\n allResponses: OpenAPIV3.ResponsesObject\n ): boolean;\n }\n>;\n\nexport interface CommonOptions {\n apiFile: string;\n /**\n * filename or url\n */\n schemaFile: string;\n /**\n * defaults to \"api\"\n */\n apiImport?: string;\n /**\n * defaults to \"enhancedApi\"\n */\n exportName?: string;\n /**\n * defaults to \"ApiArg\"\n */\n argSuffix?: string;\n /**\n * defaults to \"ApiResponse\"\n */\n responseSuffix?: string;\n /**\n * defaults to empty\n */\n operationNameSuffix?: string;\n /**\n * defaults to `false`\n * `true` will generate hooks for queries and mutations, but no lazyQueries\n */\n hooks?: boolean | { queries: boolean; lazyQueries: boolean; mutations: boolean };\n /**\n * defaults to false\n * `true` will generate a union type for `undefined` properties like: `{ id?: string | undefined }` instead of `{ id?: string }`\n */\n unionUndefined?: boolean;\n /**\n * defaults to false\n * `true` will result in all generated endpoints having `providesTags`/`invalidatesTags` declarations for the `tags` of their respective operation definition\n * @see https://redux-toolkit.js.org/rtk-query/usage/code-generation for more information\n */\n tag?: boolean;\n /**\n * defaults to false\n * `true` will add `encodeURIComponent` to the generated path parameters\n */\n encodePathParams?: boolean;\n /**\n * defaults to false\n * `true` will add `encodeURIComponent` to the generated query parameters\n */\n encodeQueryParams?: boolean;\n /**\n * defaults to false\n * `true` will \"flatten\" the arg so that you can do things like `useGetEntityById(1)` instead of `useGetEntityById({ entityId: 1 })`\n */\n flattenArg?: boolean;\n /**\n * default to false\n * If set to `true`, the default response type will be included in the generated code for all endpoints.\n * @see https://swagger.io/docs/specification/describing-responses/#default\n */\n includeDefault?: boolean;\n /**\n * default to false\n * `true` will not generate separate types for read-only and write-only properties.\n */\n mergeReadWriteOnly?: boolean;\n /**\n *\n * HTTPResolverOptions object that is passed to the SwaggerParser bundle function.\n */\n httpResolverOptions?: SwaggerParser.HTTPResolverOptions;\n\n /**\n * defaults to undefined\n * If present the given file will be used as prettier config when formatting the generated code. If undefined the default prettier config\n * resolution mechanism will be used.\n */\n prettierConfigFile?: string;\n}\n\nexport type TextMatcher = string | RegExp | (string | RegExp)[];\n\nexport type EndpointMatcherFunction = (operationName: string, operationDefinition: OperationDefinition) => boolean;\n\nexport type EndpointMatcher = TextMatcher | EndpointMatcherFunction;\n\nexport type ParameterMatcherFunction = (parameterName: string, parameterDefinition: ParameterDefinition) => boolean;\n\nexport type ParameterMatcher = TextMatcher | ParameterMatcherFunction;\n\nexport interface OutputFileOptions extends Partial<CommonOptions> {\n outputFile: string;\n filterEndpoints?: EndpointMatcher;\n endpointOverrides?: EndpointOverrides[];\n /**\n * defaults to false\n * If passed as true it will generate TS enums instead of union of strings\n */\n useEnumType?: boolean;\n sharedTypesFile?: string;\n}\n\nexport type EndpointOverrides = {\n pattern: EndpointMatcher;\n} & AtLeastOneKey<{\n type: 'mutation' | 'query';\n parameterFilter: ParameterMatcher;\n}>;\n\nexport type OutputFilesConfig = {\n [outputFile: string]: {\n groupMatch: RegExp,\n filterEndpoint?: (groupName: string) => RegExp\n }\n};\n\nexport type ConfigFile =\n | Id<Require<CommonOptions & OutputFileOptions, 'outputFile'>>\n | Id<\n Omit<CommonOptions, 'outputFile'> & {\n // outputFiles: { [outputFile: string]: Omit<OutputFileOptions, 'outputFile'> };\n outputFiles: OutputFilesConfig\n }\n >;\n","import type { OpenAPIV3 } from 'openapi-types';\nimport type { OperationDefinition } from '../types';\nimport { operationKeys } from '../types';\n\nexport function getOperationDefinitions(v3Doc: OpenAPIV3.Document): OperationDefinition[] {\n return Object.entries(v3Doc.paths).flatMap(([path, pathItem]) =>\n !pathItem\n ? []\n : Object.entries(pathItem)\n .filter((arg): arg is [(typeof operationKeys)[number], OpenAPIV3.OperationObject] =>\n operationKeys.includes(arg[0] as any)\n )\n .map(([verb, operation]) => ({\n path,\n verb,\n pathItem,\n operation,\n }))\n );\n}\n","import SwaggerParser from '@apidevtools/swagger-parser';\nimport type { OpenAPIV3 } from 'openapi-types';\n// @ts-ignore\nimport converter from 'swagger2openapi';\n\nexport async function getV3Doc(\n spec: string,\n httpResolverOptions?: SwaggerParser.HTTPResolverOptions\n): Promise<OpenAPIV3.Document> {\n const doc = await SwaggerParser.bundle(spec, {\n resolve: {\n http: httpResolverOptions,\n },\n });\n\n const isOpenApiV3 = 'openapi' in doc && doc.openapi.startsWith('3');\n\n if (isOpenApiV3) {\n return doc as OpenAPIV3.Document;\n } else {\n const result = await converter.convertObj(doc, {});\n return result.openapi as OpenAPIV3.Document;\n }\n}\n","import type { EndpointOverrides, operationKeys } from '../types';\n\nexport function isQuery(verb: (typeof operationKeys)[number], overrides: EndpointOverrides | undefined) {\n if (overrides?.type) {\n return overrides.type === 'query';\n }\n return verb === 'get';\n}\n","export function isValidUrl(string: string) {\n try {\n new URL(string);\n } catch (_) {\n return false;\n }\n\n return true;\n}\n","import path from 'node:path';\nimport prettier from 'prettier';\nimport type { BuiltInParserName } from 'prettier';\n\nconst EXTENSION_TO_PARSER: Record<string, BuiltInParserName> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'babel',\n jsx: 'babel',\n 'js.flow': 'flow',\n flow: 'flow',\n gql: 'graphql',\n graphql: 'graphql',\n css: 'scss',\n scss: 'scss',\n less: 'scss',\n stylus: 'scss',\n markdown: 'markdown',\n md: 'markdown',\n json: 'json',\n};\n\nexport async function prettify(filePath: string | null, content: string, prettierConfigFile?: string): Promise<string> {\n let config = null;\n let parser = 'typescript';\n\n if (filePath) {\n const fileExtension = path.extname(filePath).slice(1);\n parser = EXTENSION_TO_PARSER[fileExtension];\n config = await prettier.resolveConfig(process.cwd(), {\n useCache: true,\n editorconfig: !prettierConfigFile,\n config: prettierConfigFile,\n });\n } else if (prettierConfigFile) {\n config = await prettier.resolveConfig(process.cwd(), {\n useCache: true,\n config: prettierConfigFile,\n });\n }\n\n return prettier.format(content, {\n parser,\n ...config,\n });\n}\n","export function removeUndefined<T>(t: T | undefined): t is T {\n return typeof t !== 'undefined';\n}\n"],"mappings":";AAEA,SAAS,qBAAqB;AAE9B,IAAM,cAAc,MAAM,cAAc,YAAY,GAAG;AAIhD,IAAM,aAA6B,4BAAY;;;ACRtD,OAAO,QAAQ;AACf,SAAS,qBAAqB;AAC9B,OAAOA,WAAU;;;ACFjB,OAAO,eAAe;AACtB,OAAOC,WAAU;AACjB,OAAO;AAAA,EACL,oBAAoB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,OAAOC,SAAQ;;;ACbf,OAAO,QAAQ;AACf,OAAO,YAAY;AAEnB,IAAM,kBAAkB,GAAG;AAE3B,SAAS,sBAAsB,cAAyC,MAAyC;AAC/G,MAAI,OAAO,UAAU,GAAG,SAAS,QAAQ;AAEvC,WAAO,gBAAgB,sBAAsB,OAAO,cAAc,IAAI;AAExE,SAAO,gBAAgB,sBAAsB,cAAc,IAAI;AACjE;AAEA,SAAS,sBACP,cACA,MACoB;AACpB,MAAI,OAAO,UAAU,GAAG,SAAS,QAAQ;AAEvC,WAAO,gBAAgB,sBAAsB,OAAO,cAAc,IAAI;AAExE,SAAO,gBAAgB,sBAAsB,cAAc,IAAI;AACjE;AAEO,IAAM,UAAU;AAAA,EACrB,GAAG;AAAA,EACH;AAAA,EACA;AACF;;;AC3BA,OAAOC,SAAQ;AAEf,IAAM,yBAAyB,QAAQ,iBAAiB,OAAO;AAGxD,SAAS,yBAAyB,KAAgC;AACvE,SAAO,OAAO,QAAQ,GAAG,EACtB,OAAO,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EACpB,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,QAAQ,yBAAyB,QAAQ,iBAAiB,CAAC,GAAG,CAAkB,CAAC;AACtG;AAEO,SAAS,mBAAmB,KAAa,cAAsC,mBAA4B;AAChH,SAAO,QAAQ;AAAA,IACb;AAAA,IACA,QAAQ;AAAA,MACN;AAAA,MACA,sBAAsB,SAAY,QAAQ,iBAAiB,iBAAiB,IAAI;AAAA,MAChF,QAAQ;AAAA,QACN,OAAO,QAAQ,YAAY,EAAE;AAAA,UAAI,CAAC,CAAC,cAAc,IAAI,MACnD,QAAQ;AAAA,YACN,SAAS,eAAe,SAAY,QAAQ,iBAAiB,YAAY;AAAA,YACzE,QAAQ,iBAAiB,IAAI;AAAA,UAC/B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA,QAAQ,oBAAoB,GAAG;AAAA,EACjC;AACF;AAEO,SAAS,sBAAsB;AAAA,EACpC,kBAAkB;AAAA,EAClB;AAAA,EACA;AACF,GAIG;AACD,QAAM,yCAAyC,QAAQ;AAAA,IACrD,yBAAyB;AAAA,MACvB,WAAW,QAAQ;AAAA,QACjB;AAAA,QACA;AAAA,QACA,CAAC,QAAQ,2BAA2B,QAAW,QAAW,iBAAiB,QAAW,QAAW,MAAS,CAAC;AAAA,QAC3G;AAAA,QACA,QAAQ,YAAYA,IAAG,WAAW,sBAAsB;AAAA,QACxD,QAAQ,8BAA8B,mBAAmB;AAAA,MAC3D;AAAA,MACA,kBAAkB,QAAQ,YAAY;AAAA,IACxC,CAAC;AAAA,IACD;AAAA,EACF;AACA,MAAI,KAAK;AACP,UAAM,0CAA0C,QAAQ;AAAA,MACtD,CAAC,QAAQ,kCAAkC,QAAQ,iBAAiB,aAAa,GAAG,MAAS,CAAC;AAAA,MAC9F;AAAA,IACF;AACA,WAAO,QAAQ;AAAA,MACb;AAAA,MACA,QAAQ;AAAA,QACN;AAAA,UACE,QAAQ;AAAA,YACN,QAAQ,iBAAiB,gBAAgB;AAAA,YACzC;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,cACN,QAAQ;AAAA,gBACN,QAAQ;AAAA,kBACN,QAAQ;AAAA,oBACN,QAAQ,iBAAiB,KAAK;AAAA,oBAC9B,QAAQ,iBAAiB,kBAAkB;AAAA,kBAC7C;AAAA,kBACA;AAAA,kBACA,CAAC,uCAAuC;AAAA,gBAC1C;AAAA,gBACA,QAAQ,iBAAiB,iBAAiB;AAAA,cAC5C;AAAA,cACA;AAAA,cACA,CAAC,sCAAsC;AAAA,YACzC;AAAA,UACF;AAAA,QACF;AAAA,QACAA,IAAG,UAAU;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ;AAAA,IACb;AAAA,IACA,QAAQ;AAAA,MACN;AAAA,QACE,QAAQ;AAAA,UACN,QAAQ,iBAAiB,gBAAgB;AAAA,UACzC;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,YACN,QAAQ;AAAA,cACN,QAAQ,iBAAiB,KAAK;AAAA,cAC9B,QAAQ,iBAAiB,iBAAiB;AAAA,YAC5C;AAAA,YACA;AAAA,YACA,CAAC,sCAAsC;AAAA,UACzC;AAAA,QACF;AAAA,MACF;AAAA,MACAA,IAAG,UAAU;AAAA,IACf;AAAA,EACF;AACF;AAEO,SAAS,2BAA2B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,kBAAkB;AAAA,EAClB;AAAA,EACA;AACF,GASG;AACD,QAAM,mBAAmB,yBAAyB,EAAE,OAAO,SAAS,GAAG,oBAAoB,CAAC;AAC5F,MAAI,KAAK,SAAS,GAAG;AACnB,qBAAiB;AAAA,MACf,QAAQ;AAAA,QACN,QAAQ,iBAAiB,SAAS,UAAU,iBAAiB,iBAAiB;AAAA,QAC9E,QAAQ,6BAA6B,KAAK,IAAI,CAAC,QAAQ,QAAQ,oBAAoB,GAAG,GAAG,KAAK,CAAC;AAAA,MACjG;AAAA,IACF;AAAA,EACF;AACA,SAAO,QAAQ;AAAA,IACb,QAAQ,iBAAiB,aAAa;AAAA,IAEtC,QAAQ;AAAA,MACN,QAAQ,+BAA+B,iBAAiB,QAAQ,iBAAiB,IAAI,CAAC;AAAA,MACtF,CAAC,UAAU,QAAQ;AAAA,MACnB,CAAC,QAAQ,8BAA8B,kBAAkB,IAAI,CAAC;AAAA,IAChE;AAAA,EACF;AACF;AAEO,SAAS,iBAAiB,EAAE,YAAY,GAA8B;AAC3E,SAAO,QAAQ;AAAA,IACb,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,IACpD,QAAQ;AAAA,MACN;AAAA,QACE,QAAQ;AAAA,UACN,QAAQ,iBAAiB,aAAa;AAAA,UACtC;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,YACN,QAAQ;AAAA,cACN,YAAY,IAAI,CAAC,YAAY,QAAQ,oBAAoB,OAAO,CAAC;AAAA,cACjE;AAAA,YACF;AAAA,YACA,QAAQ,wBAAwB,QAAQ,iBAAiB,OAAO,GAAG,MAAS;AAAA,UAC9E;AAAA,QACF;AAAA,MACF;AAAA,MACAA,IAAG,UAAU;AAAA,IACf;AAAA,EACF;AACF;;;AC5KA,OAAOC,SAAQ;AACf,SAAS,wBAAwB;;;ACD1B,SAAS,WAAW,KAAa;AACtC,SAAO,IAAI,QAAQ,IAAI,CAAC,GAAG,IAAI,CAAC,EAAE,YAAY,CAAC;AACjD;;;ACiBO,IAAM,gBAAgB,CAAC,OAAO,OAAO,QAAQ,UAAU,WAAW,QAAQ,SAAS,OAAO;;;ACf1F,SAAS,wBAAwB,OAAkD;AACxF,SAAO,OAAO,QAAQ,MAAM,KAAK,EAAE;AAAA,IAAQ,CAAC,CAACC,OAAM,QAAQ,MACzD,CAAC,WACG,CAAC,IACD,OAAO,QAAQ,QAAQ,EACpB;AAAA,MAAO,CAAC,QACP,cAAc,SAAS,IAAI,CAAC,CAAQ;AAAA,IACtC,EACC,IAAI,CAAC,CAAC,MAAM,SAAS,OAAO;AAAA,MAC3B,MAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE;AAAA,EACV;AACF;;;ACnBA,OAAO,mBAAmB;AAG1B,OAAO,eAAe;AAEtB,eAAsB,SACpB,MACA,qBAC6B;AAC7B,QAAM,MAAM,MAAM,cAAc,OAAO,MAAM;AAAA,IAC3C,SAAS;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF,CAAC;AAED,QAAM,cAAc,aAAa,OAAO,IAAI,QAAQ,WAAW,GAAG;AAElE,MAAI,aAAa;AACf,WAAO;AAAA,EACT,OAAO;AACL,UAAM,SAAS,MAAM,UAAU,WAAW,KAAK,CAAC,CAAC;AACjD,WAAO,OAAO;AAAA,EAChB;AACF;;;ACrBO,SAAS,QAAQ,MAAsC,WAA0C;AACtG,MAAI,WAAW,MAAM;AACnB,WAAO,UAAU,SAAS;AAAA,EAC5B;AACA,SAAO,SAAS;AAClB;;;ACPO,SAAS,WAAW,QAAgB;AACzC,MAAI;AACF,QAAI,IAAI,MAAM;AAAA,EAChB,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACRA,OAAO,UAAU;AACjB,OAAO,cAAc;AAGrB,IAAM,sBAAyD;AAAA,EAC7D,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,WAAW;AAAA,EACX,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,IAAI;AAAA,EACJ,MAAM;AACR;AAEA,eAAsB,SAAS,UAAyB,SAAiB,oBAA8C;AACrH,MAAI,SAAS;AACb,MAAI,SAAS;AAEb,MAAI,UAAU;AACZ,UAAM,gBAAgB,KAAK,QAAQ,QAAQ,EAAE,MAAM,CAAC;AACpD,aAAS,oBAAoB,aAAa;AAC1C,aAAS,MAAM,SAAS,cAAc,QAAQ,IAAI,GAAG;AAAA,MACnD,UAAU;AAAA,MACV,cAAc,CAAC;AAAA,MACf,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,WAAW,oBAAoB;AAC7B,aAAS,MAAM,SAAS,cAAc,QAAQ,IAAI,GAAG;AAAA,MACnD,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO,SAAS,OAAO,SAAS;AAAA,IAC9B;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AACH;;;AC7CO,SAAS,gBAAmB,GAA0B;AAC3D,SAAO,OAAO,MAAM;AACtB;;;ARmBA,IAAM,gBAAgB,CAAC;AAAA,EACrB,qBAAqB,EAAE,MAAM,MAAAC,MAAK;AAAA,EAClC;AAAA,EACA,SAAS;AACX,MACE,QAAQ;AAAA,EACN;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,IACN,MAAM,SAAS,SAAS,EAAE,GAAG,WAAW,iBAAiB,MAAMA,OAAM,MAAS,CAAC,CAAC,GAC9E,QAAQ,MAAM,SAAS,IAAI,UAAU,UACvC;AAAA,EACF;AAAA,EACA;AACF;AAEF,IAAM,mBAAmB,CAAC,EAAE,qBAAqB,mBAAmB,OAAO,MAA8B;AACvG,QAAM,YAAY,aAAa,qBAAqB,iBAAiB;AAErE,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,EACF;AAEA,QAAM,WAAW,QAAQ,oBAAoB,MAAM,SAAS;AAG5D,MAAI,OAAO,WAAW,WAAW;AAC/B,WAAO,cAAc,UAAU;AAAA,EACjC;AAGA,MAAI,UAAU;AACZ,WAAO;AAAA,MACL,GAAI,OAAO,UAAU,CAAC,cAAc,UAAU,CAAC,IAAI,CAAC;AAAA,MACpD,GAAI,OAAO,cAAc,CAAC,cAAc,EAAE,GAAG,YAAY,QAAQ,KAAK,CAAC,CAAC,IAAI,CAAC;AAAA,IAC/E;AAAA,EACF;AAEA,SAAO,OAAO,YAAY,cAAc,UAAU,IAAI,CAAC;AACzD;AAQO,IAAM,qBAAqB,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,QAAQ;AAAA,EACN,CAAC,QAAQ,eAAeC,IAAG,WAAW,aAAa,CAAC;AAAA,EACpD,QAAQ;AAAA,IACN;AAAA,MACE,QAAQ;AAAA,QACN,QAAQ;AAAA,UACN,qBACG,IAAI,CAAC,wBAAwB,iBAAiB,EAAE,qBAAqB,mBAAmB,OAAO,CAAC,CAAC,EACjG,KAAK;AAAA,QACV;AAAA,QACA;AAAA,QACA;AAAA,QACA,QAAQ,iBAAiB,UAAU;AAAA,MACrC;AAAA,IACF;AAAA,IACAA,IAAG,UAAU;AAAA,EACf;AACF;;;AH/DF,IAAM,mBAAmB;AACzB,IAAM,aAAiD,CAAC;AAExD,SAAS,sBAAsB,MAAc,gBAAyB;AACpE,MAAI,kBAAkB,SAAS,WAAW;AACxC,WAAO;AAAA,EACT;AACA,QAAM,aAAa,OAAO,IAAI;AAC9B,SAAO,CAAC,OAAO,MAAM,UAAU,KAAK,cAAc,OAAO,aAAa;AACxE;AAEA,SAASC,kBAAiB,EAAE,MAAM,MAAAC,MAAK,GAAgD;AACrF,SAAO,kBAAkB,MAAMA,OAAM,MAAS;AAChD;AAEA,SAAS,QAAQ,EAAE,MAAM,SAAS,GAA6D;AAC7F,SAAO,OAAO,SAAS,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;AAC9C;AAEA,SAAS,eAAe,SAAuB;AAC7C,QAAM,UAAU,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AAC3D,SAAO,SAAS,QAAQ,eAAuB;AAC7C,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,QAAQ;AAAA,MAAK,CAAC,WACnB,OAAO,WAAW,WAAW,WAAW,gBAAgB,QAAQ,KAAK,aAAa;AAAA,IACpF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,SAA2B;AACnD,QAAM,aAAa,OAAO,YAAY,aAAa,UAAU,eAAe,OAAO;AACnF,SAAO,SAAS,QAAQ,qBAA0C;AAChE,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,gBAAgBD,kBAAiB,mBAAmB;AAC1D,WAAO,WAAW,eAAe,mBAAmB;AAAA,EACtD;AACF;AAEA,SAAS,gBAAgB,SAA4B;AACnD,QAAM,aAAa,OAAO,YAAY,aAAa,UAAU,eAAe,OAAO;AACnF,SAAO,SAAS,QAAQ,oBAAyC;AAC/D,QAAI,CAAC,WAAW,mBAAmB,OAAO,OAAQ,QAAO;AACzD,UAAM,eAAe,mBAAmB;AACxC,WAAO,WAAW,cAAc,kBAAkB;AAAA,EACpD;AACF;AAEA,SAAS,iBAAoC,MAAS,KAAyB,oBAAgC;AAC7G,QAAM,UAAU,IAAI,WAAW,UAAU,IAAI,MAAM,cAAc,IAAI,KAAK;AAC1E,MAAI,SAAS;AACX,WAAOE,IAAG;AAAA,MACR;AAAA,MACAA,IAAG,WAAW;AAAA,MACd,KAAK,OAAO;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,aACd,WACA,mBAC+B;AAC/B,SAAO,mBAAmB,KAAK,CAAC,aAAa,iBAAiB,SAAS,OAAO,EAAE,SAAS,CAAC;AAC5F;AAEA,eAAsB,YACpB,MACA;AAAA,EACE;AAAA,EACA,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,QAAQ;AAAA,EACR,MAAM;AAAA,EACN;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA,mBAAmB;AAAA,EACnB,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,qBAAqB;AAAA,EACrB;AAAA,EACA;AACF,GACA;AACA,QAAM,QAAS,WAAW,IAAI,MAAM,MAAM,SAAS,MAAM,mBAAmB;AAE5E,QAAM,SAAS,IAAI,aAAa,OAAO;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,kBAAkB,oBAAI,IAAY;AAExC,WAAS,kBAAkB,MAAc;AACvC,oBAAgB,IAAI,IAAI;AACxB,oBAAgB,IAAI,UAAU,IAAI,CAAC;AACnC,oBAAgB,IAAI,WAAW,UAAU,IAAI,CAAC,CAAC;AAAA,EACjD;AAEA,MAAI,iBAAiB;AACnB,UAAMC,cAAaD,IAAG;AAAA,MACpB;AAAA,MACA;AAAA,MACAA,IAAG,aAAa;AAAA;AAAA,MACG;AAAA,MACnBA,IAAG,WAAW;AAAA,IAChB;AACA,UAAME,WAAUF,IAAG,cAAc,EAAE,SAASA,IAAG,YAAY,SAAS,CAAC;AAErE,UAAM,qBAAqC,CAAC;AAC5C,UAAM,mBAAmB,oBAAI,IAAY;AAEzC,UAAM,aAAa,MAAM;AACzB,QAAI,YAAY;AACd,YAAM,uBAAuB,OAAO,QAAQ,UAAU,EAAE,IAAI,CAAC,CAAC,eAAe,aAAa,MAAM;AAC9F,cAAM,cAAc,OAAO,QAAQ,aAAwC,EACxE,IAAI,CAAC,CAAC,MAAM,GAAG,MAAM;AACpB,4BAAkB,IAAI;AACtB,gBAAM,WAAW,WAAW,UAAU,IAAI,CAAC;AAC3C,2BAAiB,IAAI,QAAQ;AAC7B,gBAAM,WAAW,0BAA0B,OAAO,kBAAkB,GAA6B,CAAC;AAClG,iBAAO,QAAQ;AAAA,YACb,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,YACpD,QAAQ,iBAAiB,QAAQ;AAAA,YACjC;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AACH,eAAO,QAAQ;AAAA,UACb,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,UACpD,QAAQ,iBAAiB,QAAQ;AAAA,UACjC,QAAQ,kBAAkB,WAAW;AAAA,UACrCA,IAAG,UAAU;AAAA,QACf;AAAA,MACF,CAAC;AACD,yBAAmB,KAAK,GAAG,oBAAoB;AAAA,IACjD;AAEA,UAAM,cAAc;AAAA,MAClB,GAAG,OAAO,YAAY,OAAO,OAAKA,IAAG,kBAAkB,CAAC,CAAC;AAAA,MACzD,GAAG,OAAO,YAAY,OAAO,OAAKA,IAAG,uBAAuB,CAAC,CAAC;AAAA,IAChE,EAAE,IAAI,cAAY;AAChB,UAAIA,IAAG,kBAAkB,QAAQ,GAAG;AAClC,eAAO,QAAQ;AAAA,UACb,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,UACpD,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF,WAAWA,IAAG,uBAAuB,QAAQ,GAAG;AAC9C,eAAO,QAAQ;AAAA,UACb,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,UACpD,SAAS;AAAA,UACT,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,iBAAiB,OAAO,QAC3B,OAAO,WAAS;AACf,UAAIA,IAAG,uBAAuB,KAAK,KAAK,MAAM,MAAM;AAClD,eAAOA,IAAG,gBAAgB,MAAM,IAAI;AAAA,MACtC;AACA,aAAO;AAAA,IACT,CAAC,EACA,IAAI,WAAS;AACZ,UAAIA,IAAG,uBAAuB,KAAK,GAAG;AACpC,eAAO,QAAQ;AAAA,UACb,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,UACpD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AACA,aAAO;AAAA,IACT,CAAC;AAEH,UAAM,iBAAiB,CAAC,GAAG,aAAa,GAAG,cAAc;AAEzD,QAAI,eAAe,SAAS,GAAG;AAC7B,yBAAmB;AAAA,QACjB,QAAQ;AAAA,UACN,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,UACpD,QAAQ,iBAAiB,MAAM;AAAA,UAC/B,QAAQ,kBAAkB,cAAc;AAAA,UACxCA,IAAG,UAAU;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,YAAM,eAAe,OAAO,QACzB,OAAO,WAAS;AACf,YAAIA,IAAG,uBAAuB,KAAK,GAAG;AACpC,gBAAM,wBAAwB,iBAAiB,IAAI,MAAM,KAAK,IAAI;AAClE,gBAAM,kBAAkBA,IAAG,gBAAgB,MAAM,IAAI;AACrD,iBAAO,CAAC,yBAAyB,CAAC;AAAA,QACpC;AACA,eAAO;AAAA,MACT,CAAC,EACA,IAAI,WAAS;AACZ,YAAIA,IAAG,uBAAuB,KAAK,GAAG;AACpC,iBAAO,QAAQ;AAAA,YACb,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,YACpD,MAAM;AAAA,YACN,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AAEH,UAAI,aAAa,SAAS,GAAG;AAC3B,cAAM,sBAAsB,mBAAmB;AAAA,UAAU,SACvDA,IAAG,oBAAoB,GAAG,KAC1BA,IAAG,aAAa,IAAI,IAAI,KACxB,IAAI,KAAK,SAAS;AAAA,QACpB;AAEA,YAAI,uBAAuB,GAAG;AAC5B,gBAAM,iBAAiB,mBAAmB,mBAAmB;AAC7D,gBAAM,gBAAgB,CAAC,GAAI,eAAe,KAAwB,YAAY,GAAG,YAAY;AAC7F,6BAAmB,mBAAmB,IAAI,QAAQ;AAAA,YAChD,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,YACpD,QAAQ,iBAAiB,QAAQ;AAAA,YACjC,QAAQ,kBAAkB,aAAa;AAAA,YACvCA,IAAG,UAAU;AAAA,UACf;AAAA,QACF,OAAO;AACL,6BAAmB;AAAA,YACjB,QAAQ;AAAA,cACN,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,cACpD,QAAQ,iBAAiB,QAAQ;AAAA,cACjC,QAAQ,kBAAkB,YAAY;AAAA,cACtCA,IAAG,UAAU;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAMG,MAAK,MAAM,OAAO,kBAAkB;AAC1C,UAAMJ,QAAO,MAAM,OAAO,WAAW;AAErC,UAAM,iBAAiBA,MAAK,QAAQ,eAAe;AACnD,UAAMI,IAAG,MAAM,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAElD,UAAM,SAASD,SAAQ;AAAA,MACrBF,IAAG,SAAS;AAAA,MACZ,QAAQ;AAAA,QACN;AAAA,QACA,QAAQ,YAAYA,IAAG,WAAW,cAAc;AAAA,QAChDA,IAAG,UAAU;AAAA,MACf;AAAA,MACAC;AAAA,IACF;AAEA,UAAME,IAAG,UAAU,iBAAiB,QAAQ,OAAO;AAAA,EACrD;AAEA,MAAI,OAAO,KAAK,YAAY,SAAS;AACnC,WAAO,qBAAqB,OAAO,KAAK,WAAW,OAAO;AAAA,EAC5D;AAEA,QAAM,uBAAuB,wBAAwB,KAAK,EAAE,OAAO,iBAAiB,eAAe,CAAC;AAEpG,QAAM,aAAaH,IAAG;AAAA,IACpB;AAAA,IACA;AAAA,IACAA,IAAG,aAAa;AAAA;AAAA,IACG;AAAA,IACnBA,IAAG,WAAW;AAAA,EAChB;AACA,QAAM,UAAUA,IAAG,cAAc,EAAE,SAASA,IAAG,YAAY,SAAS,CAAC;AAErE,QAAM,aAAgF,CAAC;AACvF,WAAS,kBAAkB,aAAgE;AACzF,UAAM,OAAO,YAAY,KAAK,YAAY,SAAS;AACnD,QAAI,QAAQ,YAAY;AACtB,YAAM,IAAI,MAAM,wBAAwB,IAAI,qBAAqB;AAAA,IACnE;AACA,eAAW,IAAI,IAAI;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,YAAY;AACd,iBAAaD,MAAK,QAAQ,QAAQ,IAAI,GAAG,UAAU;AACnD,QAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,gBAAUA,MAAK,SAASA,MAAK,QAAQ,UAAU,GAAG,OAAO;AACzD,gBAAU,QAAQ,QAAQ,OAAO,GAAG;AACpC,UAAI,CAAC,QAAQ,WAAW,GAAG,EAAG,WAAU,KAAK,OAAO;AAAA,IACtD;AAAA,EACF;AACA,YAAU,QAAQ,QAAQ,cAAc,EAAE;AAE1C,QAAM,wBAAwB,mBAAmB,cAC5C,MAAM;AACL,QAAI,MAAMA,MAAK,SAASA,MAAK,QAAQ,UAAU,GAAG,eAAe,EAC9D,QAAQ,OAAO,GAAG,EAClB,QAAQ,cAAc,EAAE;AAC3B,QAAI,CAAC,IAAI,WAAW,GAAG,EAAG,OAAM,OAAO;AACvC,WAAO;AAAA,EACT,GAAG,IACH;AAEJ,SAAO,QAAQ;AAAA,IACbC,IAAG,SAAS;AAAA,IACZ,QAAQ;AAAA,MACN;AAAA,QACE,mBAAmB,SAAS,EAAE,CAAC,SAAS,GAAG,MAAM,CAAC;AAAA,QAClD,mBAAmB,yBAAyB,EAAE,8BAA8B,+BAA+B,CAAC;AAAA,QAC5G,GAAI,kBAAkB;AAAA,UACpB,mBAAmB,uBAAuB;AAAA,YACxC,QAAQ;AAAA,YACR,GAAI,cAAc,EAAE,MAAM,OAAO,IAAI,CAAC;AAAA,UACxC,CAAC;AAAA,QACH,IAAI,CAAC;AAAA,QACL,GAAI,MAAM,CAAC,iBAAiB,EAAE,aAAa,mBAAmB,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;AAAA,QAC/F,sBAAsB;AAAA,UACpB;AAAA,UACA,qBAAqB,QAAQ;AAAA,YAC3B,qBAAqB;AAAA,cAAI,CAAC,wBACxB,iBAAiB;AAAA,gBACf;AAAA,gBACA,WAAW,aAAa,qBAAqB,iBAAiB;AAAA,gBAC9D,iBAAiB,CAAC,CAAC;AAAA,cACrB,CAAC;AAAA,YACH;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA,QAAQ,iBAAiB,gBAAgB;AAAA,QAC3C;AAAA,QACA,GAAG,OAAO,OAAO,UAAU;AAAA,QAC3B,GAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,OAAO,SAAS,GAAG,OAAO,WAAW;AAAA,QACpE,GAAI,QACA;AAAA,UACE,mBAAmB;AAAA,YACjB,YAAY;AAAA,YACZ;AAAA,YACA;AAAA,YACA,QAAQ;AAAA,UACV,CAAC;AAAA,QACH,IACA,CAAC;AAAA,MACP;AAAA,MACA,QAAQ,YAAYA,IAAG,WAAW,cAAc;AAAA,MAChDA,IAAG,UAAU;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAEA,WAAS,mBAAmB,EAAE,sBAAAI,sBAAqB,GAAoD;AACrG,UAAM,cAAc,oBAAI,IAAY;AAEpC,eAAW,uBAAuBA,uBAAsB;AACtD,YAAM,EAAE,MAAM,SAAS,IAAI;AAC3B,iBAAWC,QAAO,QAAQ,EAAE,MAAM,SAAS,CAAC,GAAG;AAC7C,oBAAY,IAAIA,IAAG;AAAA,MACrB;AAAA,IACF;AACA,WAAO,CAAC,GAAG,WAAW;AAAA,EACxB;AAEA,WAAS,iBAAiB;AAAA,IACxB;AAAA,IACA;AAAA,IACA,iBAAAC;AAAA,EACF,GAIG;AACD,UAAM;AAAA,MACJ;AAAA,MACA,MAAAP;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW,EAAE,WAAW,YAAY;AAAA,IACtC,IAAI;AACJ,UAAM,gBAAgBD,kBAAiB,EAAE,MAAM,MAAAC,MAAK,CAAC;AACrD,UAAM,OAAO,MAAM,QAAQ,EAAE,MAAM,SAAS,CAAC,IAAI,CAAC;AAClD,UAAMQ,WAAU,QAAY,MAAM,SAAS;AAE3C,UAAM,cAAc,OAAO,gBAAgB,SAAS,MAAM;AAC1D,QAAI,eAA4B,QAAQ,sBAAsBP,IAAG,WAAW,cAAc;AAC1F,QAAI,aAAa;AACf,YAAM,cAAc,OAAO,QAAQ,aAAa,CAAC,CAAC,EAC/C;AAAA,QACC,CAAC,CAAC,MAAM,QAAQ,MACd;AAAA,UACE;AAAA,UACA,OAAO,QAAQ,QAAQ;AAAA,UACvB;AAAA,YACE,OAAO,oBAAoB,UAAU,UAAU,KAC7C,QAAQ,sBAAsBA,IAAG,WAAW,gBAAgB;AAAA,UAChE;AAAA,QACF;AAAA,MACJ,EACC;AAAA,QAAO,CAAC,CAAC,QAAQ,QAAQ,MACxB,eAAe,QAAQ,gBAAgB,OAAO,QAAQ,QAAQ,GAAG,aAAa,CAAC,CAAC;AAAA,MAClF,EACC,OAAO,CAAC,CAAC,IAAI,IAAI,IAAI,MAAM,SAAS,YAAY,IAAI,EACpD,IAAI,CAAC,CAAC,MAAM,UAAU,IAAI,MAAM;AAC/B,eAAOA,IAAG;AAAA,UACR;AAAA,UACAA,IAAG,WAAW;AAAA,UACd,YAAY,IAAI,IAAI,SAAS,WAAW;AAAA,UACxC;AAAA,QACF;AAAA,MACF,CAAC;AACH,UAAI,YAAY,SAAS,GAAG;AAC1B,uBAAe,QAAQ,oBAAoB,WAAW;AAAA,MACxD;AAAA,IACF;AAEA,UAAM,mBAAmB,QAAQ;AAAA,MAC/B;AAAA,QACE,QAAQ;AAAA,UACN,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,UACpD,WAAW,gBAAgB,sBAAsB,cAAc;AAAA,UAC/D;AAAA,UACA;AAAA,QACF;AAAA,MACF,EAAE;AAAA,IACJ;AAEA,UAAM,sBAAsB,OAAO,aAAa,UAAU,UAAU;AACpE,UAAM,qBAAqB,OACxB,aAAa,SAAS,UAAU,EAChC,OAAO,CAAC,OAAO,CAAC,oBAAoB,KAAK,CAAC,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,EAAE,CAAC;AAE3F,UAAM,aAAa,mBAAmB,CAAC,GAAG,oBAAoB,GAAG,mBAAmB,CAAC,EAClF,OAAO,gBAAgB,WAAW,eAAe,CAAC,EAClD,OAAO,WAAS,MAAM,OAAO,QAAQ;AAExC,UAAM,WAAW,WAAW,IAAI,CAAC,MAAM,EAAE,IAAI;AAC7C,UAAM,WAAgC,CAAC;AACvC,aAAS,aAAa,MAAc,iBAAyB;AAC3D,YAAM,kBAAkB,0BAA0B,KAAK,IAAI;AAC3D,YAAM,oBAAoB,SAAS,OAAO,CAAC,MAAM,MAAM,IAAI,EAAE,SAAS;AACtE,UAAI,mBAAmB;AACrB,eAAO,GAAG,eAAe,IAAI,IAAI;AAAA,MACnC;AACA,YAAM,gBAAgB,UAAU,IAAI;AACpC,UAAI,mBAAmB,CAAC,SAAS,SAAS,aAAa,GAAG;AACxD,eAAO;AAAA,MACT;AACA,aAAO,QAAQ,UAAU;AACvB,eAAO,IAAI,IAAI;AAAA,MACjB;AACA,aAAO;AAAA,IACT;AAEA,eAAW,SAAS,YAAY;AAC9B,YAAM,OAAO,aAAa,MAAM,MAAM,MAAM,EAAE;AAC9C,eAAS,IAAI,IAAI;AAAA,QACf,QAAQ;AAAA,QACR;AAAA,QACA,cAAc,MAAM;AAAA,QACpB,MAAM,0BAA0B,OAAO,kBAAkB,YAAY,KAAK,IAAI,QAAQ,MAAM,QAAQ,QAAW,WAAW,CAAC;AAAA,QAC3H,UAAU,MAAM;AAAA,QAChB;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa;AACf,YAAM,OAAO,OAAO,QAAQ,WAAW;AACvC,YAAM,SAAS,OAAO,qBAAqB,KAAK,OAAO;AACvD,YAAM,OAAO,0BAA0B,OAAO,kBAAkB,MAAM,CAAC;AACvE,YAAM,aAAa;AAAA,QAChB,KAAa,QACZ,iBAAiB,MAAM,KACtB,OAAO,WAAW,YAAY,WAAW,UAAU,OAAO,SAC3D;AAAA,MACJ;AACA,YAAM,OAAO,aAAa,cAAc,WAAW,SAAS,YAAY,MAAM;AAE9E,eAAS,IAAI,IAAI;AAAA,QACf,QAAQ;AAAA,QACR;AAAA,QACA,cAAc;AAAA,QACd,MAAM,0BAA0B,OAAO,kBAAkB,QAAQ,QAAW,WAAW,CAAC;AAAA,QACxF,UAAU;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAEA,UAAM,eAAe,CAAC,SAAoD;AACxE,UAAI,OAAO,SAAS,UAAU;AAC5B,eAAO,kBAAkB,IAAI,IAAI,QAAQ,iBAAiB,IAAI,IAAI,QAAQ,oBAAoB,IAAI;AAAA,MACpG;AACA,aAAO;AAAA,IACT;AAEA,UAAM,iBAAiB,OAAO,OAAO,QAAQ;AAE7C,UAAM,YAAY,cAAc,eAAe,WAAW;AAC1D,UAAM,WAAW,QAAQ;AAAA,MACvB;AAAA,QACE,QAAQ;AAAA,UACN,CAAC,QAAQ,eAAeA,IAAG,WAAW,aAAa,CAAC;AAAA,UACpD,WAAW,gBAAgB,sBAAsB,SAAS;AAAA,UAC1D;AAAA,UACA,eAAe,SAAS,IACpB,YACE;AAAA,YACE,QAAQ,oBAAoB;AAAA,cAC1B,eAAe,CAAC,EAAE;AAAA,cAClB,GAAI,CAAC,eAAe,CAAC,EAAE,WACnB,CAAC,QAAQ,sBAAsBA,IAAG,WAAW,gBAAgB,CAAC,IAC9D,CAAC;AAAA,YACP,CAAC;AAAA,YACD,eAAe,CAAC;AAAA,YAChB;AAAA,UACF,IACA,QAAQ;AAAA,YACN,eAAe;AAAA,cAAI,CAAC,QAClB;AAAA,gBACE,QAAQ;AAAA,kBACN;AAAA,kBACA,aAAa,IAAI,IAAI;AAAA,kBACrB,oBAAoB,CAAC,IAAI,QAAQ;AAAA,kBACjC,IAAI;AAAA,gBACN;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF,IACF,QAAQ,sBAAsBA,IAAG,WAAW,WAAW;AAAA,QAC7D;AAAA,MACF,EAAE;AAAA,IACJ;AAEA,WAAO,2BAA2B;AAAA,MAChC,eAAe,sBAAsB,WAAW,gBAAgB,mBAAmB,IAAI;AAAA,MACvF,MAAMO,WAAU,UAAU;AAAA,MAC1B,UAAU;AAAA,MACV,UAAU,QAAQ;AAAA,QAChB,QAAQ,iBAAiB,8BAA8B;AAAA,QACvD,CAAC,QAAQ;AAAA,MACX;AAAA,MACA,SAAS,gBAAgB;AAAA,QACvB;AAAA,QACA;AAAA,QACA,SAAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAAA,MACD,qBAAqBA,WACjB,2BAA2B,EAAE,oBAAoB,CAAC,IAClD,8BAA8B,EAAE,oBAAoB,CAAC;AAAA,MACzD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,gBAAgB;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAAA;AAAA,IACA,kBAAAC;AAAA,IACA,mBAAAC;AAAA,EACF,GAOG;AACD,UAAM,EAAE,MAAAV,OAAM,KAAK,IAAI;AAEvB,UAAM,gBAAgB,OAAO,OAAO,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,WAAW,MAAM;AAEjF,UAAM,aAAa,QAAQ,iBAAiB,UAAU;AACtD,UAAM,kBAAkB,QAAQ,+BAA+B,YAAY,QAAQ,iBAAiB,WAAW,CAAC;AAEhH,aAAS,WAAW,SAAiB;AACnC,aAAO,OAAO,OAAO,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,WAAW,WAAW,IAAI,MAAM,OAAO,OAAO;AAAA,IACnG;AAEA,aAAS,4BAA4B,YAAkC,cAAsB;AAC3F,UAAI,WAAW,WAAW,EAAG,QAAO;AAEpC,YAAM,aAAa,WAAW,IAAI,CAAC,UAAU;AAC3C,cAAM,QAAQ,YACV,kBACA,QAAQ,+BAA+B,iBAAiB,QAAQ,iBAAiB,MAAM,IAAI,CAAC;AAEhG,cAAM,eACJU,sBAAqB,MAAM,OAAO,OAAO,UACrC,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA,QAAQ,qBAAqB,QAAQ,iBAAiB,oBAAoB,GAAG,QAAW;AAAA,YACtF,QAAQ,qBAAqB,QAAQ,iBAAiB,QAAQ,GAAG,QAAW,CAAC,KAAK,CAAC;AAAA,UACrF,CAAC;AAAA,UACD;AAAA,UACA,QAAQ,iBAAiB,WAAW;AAAA,QACtC,IACA;AAEN,eAAO,yBAAyB,MAAM,cAAc,YAAY;AAAA,MAClE,CAAC;AAED,aAAO,QAAQ;AAAA,QACb,QAAQ,iBAAiB,YAAY;AAAA,QACrC,QAAQ,8BAA8B,YAAY,IAAI;AAAA,MACxD;AAAA,IACF;AAEA,WAAO,QAAQ;AAAA,MACb;AAAA,MACA;AAAA,MACA,CAAC,QAAQ,2BAA2B,QAAW,QAAW,YAAY,QAAW,QAAW,MAAS,CAAC;AAAA,MACtG;AAAA,MACA,QAAQ,YAAYT,IAAG,WAAW,sBAAsB;AAAA,MACxD,QAAQ;AAAA,QACN,QAAQ;AAAA,UACN;AAAA,YACE,QAAQ;AAAA,cACN,QAAQ,iBAAiB,KAAK;AAAA,cAC9B,uBAAuBD,OAAM,WAAW,MAAM,GAAG,iBAAiB,WAAWS,iBAAgB;AAAA,YAC/F;AAAA,YACAD,YAAW,KAAK,YAAY,MAAM,QAC9B,SACA,QAAQ;AAAA,cACN,QAAQ,iBAAiB,QAAQ;AAAA,cACjC,QAAQ,oBAAoB,KAAK,YAAY,CAAC;AAAA,YAChD;AAAA,YACJ,kBAAkB,SACd,SACA,QAAQ;AAAA,cACN,QAAQ,iBAAiB,MAAM;AAAA,cAC/B,YACI,kBACA,QAAQ,+BAA+B,iBAAiB,QAAQ,iBAAiB,cAAc,IAAI,CAAC;AAAA,YAC1G;AAAA,YACJ,4BAA4B,WAAW,QAAQ,GAAG,SAAS;AAAA,YAC3D,4BAA4B,WAAW,OAAO,GAAG,QAAQ;AAAA,YACzD,QAAQ;AAAA,cACN,QAAQ,iBAAiB,cAAc;AAAA,cACvC,QAAQ;AAAA,gBACN;AAAA,gBACA,QAAQ,YAAYP,IAAG,WAAW,gBAAgB;AAAA,gBAClD,QAAQ,iBAAiB,cAAc;AAAA,cACzC;AAAA,YACF;AAAA,UACF,EAAE,OAAO,eAAe;AAAA,UACxB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,WAAS,2BAA2B,CAAC,GAA4E;AAC/G,WAAO,CAAC;AAAA,EACV;AAEA,WAAS,8BAA8B,CAAC,GAA4E;AAClH,WAAO,CAAC;AAAA,EACV;AAEA,WAAS,0BAA0B,UAAoC;AACrE,QAAIA,IAAG,oBAAoB,QAAQ,KAAKA,IAAG,aAAa,SAAS,QAAQ,GAAG;AAC1E,YAAM,WAAW,SAAS,SAAS;AAGnC,YAAM,aAAa,gBACjB,OAAO,YAAY,KAAK,cAAY;AAClC,YAAIA,IAAG,kBAAkB,QAAQ,KAAKA,IAAG,uBAAuB,QAAQ,GAAG;AACzE,iBAAO,SAAS,KAAK,SAAS;AAAA,QAChC;AACA,eAAO;AAAA,MACT,CAAC,KACD,OAAO,QAAQ,KAAK,WAAS;AAC3B,YAAIA,IAAG,uBAAuB,KAAK,KAAK,MAAM,MAAM;AAElD,cAAIA,IAAG,gBAAgB,MAAM,IAAI,GAAG;AAClC,mBAAO,MAAM,KAAK,SAAS;AAAA,UAC7B;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AAGH,UAAI,YAAY;AACd,eAAO,QAAQ;AAAA,UACb,QAAQ;AAAA,YACN,QAAQ,iBAAiB,MAAM;AAAA,YAC/B,SAAS;AAAA,UACX;AAAA,UACA,SAAS,eAAe,IAAI,yBAAyB;AAAA,QACvD;AAAA,MACF;AAEA,UAAI,gBAAgB,IAAI,QAAQ,GAAG;AACjC,eAAO,QAAQ;AAAA,UACb,QAAQ;AAAA,YACN,QAAQ,iBAAiB,QAAQ;AAAA,YACjC,SAAS;AAAA,UACX;AAAA,UACA,SAAS,eAAe,IAAI,yBAAyB;AAAA,QACvD;AAAA,MACF;AACA,UAAI,SAAS,eAAe;AAC1B,eAAO,QAAQ;AAAA,UACb,SAAS;AAAA,UACT,SAAS,cAAc,IAAI,yBAAyB;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AACA,QAAIA,IAAG,gBAAgB,QAAQ,GAAG;AAChC,aAAO,QAAQ,oBAAoB,0BAA0B,SAAS,WAAW,CAAC;AAAA,IACpF;AACA,QAAIA,IAAG,gBAAgB,QAAQ,GAAG;AAEhC,YAAM,aAAa,SAAS;AAC5B,UAAI,WAAW,SAAS,KAAK,WAAW;AAAA,QAAM,UAC5CA,IAAG,kBAAkB,IAAI,MACxBA,IAAG,gBAAgB,KAAK,OAAO,KAAKA,IAAG,iBAAiB,KAAK,OAAO;AAAA,MACvE,GAAG;AAED,cAAM,aAAa,WAAW,IAAI,UAAQ;AACxC,cAAIA,IAAG,kBAAkB,IAAI,GAAG;AAC9B,gBAAIA,IAAG,gBAAgB,KAAK,OAAO,GAAG;AACpC,qBAAO,KAAK,QAAQ;AAAA,YACtB,WAAWA,IAAG,iBAAiB,KAAK,OAAO,GAAG;AAC5C,qBAAO,KAAK,QAAQ;AAAA,YACtB;AAAA,UACF;AACA,iBAAO;AAAA,QACT,CAAC,EAAE,OAAO,OAAO;AAGjB,cAAM,eAAe,OAAO,QAAQ,KAAK,WAAS;AAChD,cAAIA,IAAG,uBAAuB,KAAK,KAAKA,IAAG,gBAAgB,MAAM,IAAI,GAAG;AACtE,kBAAM,cAAc,MAAM,KAAK,MAAM,IAAI,UAAQ;AAC/C,kBAAIA,IAAG,kBAAkB,IAAI,GAAG;AAC9B,oBAAIA,IAAG,gBAAgB,KAAK,OAAO,GAAG;AACpC,yBAAO,KAAK,QAAQ;AAAA,gBACtB,WAAWA,IAAG,iBAAiB,KAAK,OAAO,GAAG;AAC5C,yBAAO,KAAK,QAAQ;AAAA,gBACtB;AAAA,cACF;AACA,qBAAO;AAAA,YACT,CAAC,EAAE,OAAO,OAAO;AAEjB,mBAAO,YAAY,WAAW,WAAW,UAClC,YAAY,MAAM,SAAO,WAAW,SAAS,GAAG,CAAC;AAAA,UAC1D;AACA,iBAAO;AAAA,QACT,CAAC;AAID,YAAI,gBAAgBA,IAAG,uBAAuB,YAAY,GAAG;AAE3D,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO,QAAQ,oBAAoB,SAAS,MAAM,IAAI,yBAAyB,CAAC;AAAA,IAClF;AACA,QAAIA,IAAG,kBAAkB,QAAQ,GAAG;AAClC,aAAO,QAAQ;AAAA,QACb,SAAS,QAAQ,IAAI,YAAU;AAC7B,cAAIA,IAAG,oBAAoB,MAAM,KAAK,OAAO,MAAM;AACjD,mBAAO,QAAQ;AAAA,cACb;AAAA,cACA,OAAO;AAAA,cACP,OAAO;AAAA,cACP,OAAO;AAAA,cACP,0BAA0B,OAAO,IAAI;AAAA,YACvC;AAAA,UACF;AACA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;AAQA,SAAS,uBACPU,OACA,gBACA,YACA,WACA,kBACA;AACA,QAAM,cAAuC,CAAC;AAE9C,QAAM,OAAOA,MAAK,QAAQ,0BAA0B,CAAC,GAAG,YAAY,YAAY;AAC9E,UAAM,QAAQ,eAAe,KAAK,CAAC,MAAM,EAAE,iBAAiB,UAAU;AACtE,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,kBAAkB,UAAU,oCAAoCA,KAAI,IAAI;AAAA,IAC1F;AACA,gBAAY,KAAK,CAAC,MAAM,MAAM,OAAO,CAAC;AACtC,WAAO;AAAA,EACT,CAAC;AAED,SAAO,YAAY,SACf,QAAQ;AAAA,IACN,QAAQ,mBAAmB,IAAI;AAAA,IAC/B,YAAY,IAAI,CAAC,CAAC,MAAM,OAAO,GAAG,UAAU;AAC1C,YAAM,QAAQ,YACV,aACA,QAAQ,+BAA+B,YAAY,QAAQ,iBAAiB,IAAI,CAAC;AACrF,YAAM,eAAe,mBACjB,QAAQ,qBAAqB,QAAQ,iBAAiB,oBAAoB,GAAG,QAAW;AAAA,QACtF,QAAQ,qBAAqB,QAAQ,iBAAiB,QAAQ,GAAG,QAAW,CAAC,KAAK,CAAC;AAAA,MACrF,CAAC,IACD;AACJ,aAAO,QAAQ;AAAA,QACb;AAAA,QACA,UAAU,YAAY,SAAS,IAC3B,QAAQ,mBAAmB,OAAO,IAClC,QAAQ,qBAAqB,OAAO;AAAA,MAC1C;AAAA,IACF,CAAC;AAAA,EACH,IACA,QAAQ,oCAAoC,IAAI;AACtD;;;ADr2BA,OAAOC,gBAAe;AAGtB,IAAMC,WAAU,cAAc,UAAU;AAKxC,eAAe,sBAAsB,UAAkB;AACrD,QAAM,UAAUC,MAAK,QAAQ,QAAQ;AACrC,MAAI,CAAC,GAAG,WAAW,OAAO,GAAG;AAC3B,UAAM,GAAG,SAAS,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EACtD;AACF;AAIA,SAAS,WAAW,UAA2B;AAC7C,MAAI;AACF,WAAO,GAAG,SAAS,QAAQ,EAAE,OAAO;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,kBAAkB,SAAyB;AAClD,QAAM,UAAUA,MAAK,SAAS,OAAO;AACrC,SAAO,GAAG,OAAO;AACnB;AAGA,eAAe,qBAAqB,WAAmB;AACrD,QAAM,uBAAuBA,MAAK,KAAK,WAAW,qBAAqB;AACvE,QAAM,YAAYA,MAAK,KAAK,WAAW,UAAU;AACjD,QAAM,UAAU,kBAAkB,SAAS;AAG3C,MAAI,CAAC,WAAW,oBAAoB,GAAG;AACrC,UAAM,0BAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAShC,UAAM,GAAG,SAAS,UAAU,sBAAsB,yBAAyB,OAAO;AAAA,EACpF;AAGA,MAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,UAAM,eAAe;AAAA,qBACJ,OAAO;AAAA;AAExB,UAAM,GAAG,SAAS,UAAU,WAAW,cAAc,OAAO;AAAA,EAC9D;AACF;AAIA,SAAS,qBAAqBA,OAAc,SAAyB;AAGnE,QAAM,QAAQA,MAAK,MAAM,OAAO;AAGhC,MAAI,SAAS,MAAM,CAAC,GAAG;AACrB,WAAOF,WAAU,MAAM,CAAC,CAAC;AAAA,EAC3B;AACA,SAAO;AACT;AAMA,eAAsB,kBAAkB,SAAoD;AAC1F,QAAM,iBAAiB,QAAQ;AAE/B,QAAM,gBAAgB,WAAW,QAAQ,UAAU,IAC/C,QAAQ,aACRE,MAAK,QAAQ,QAAQ,IAAI,GAAG,cAAc;AAE9C,QAAM,aAAa,MAAM,yBAAyB,YAAY;AAC5D,WAAO,YAAY,eAAe,OAAO;AAAA,EAC3C,CAAC;AACD,QAAM,EAAE,YAAY,mBAAmB,IAAI;AAC3C,MAAI,YAAY;AACd,UAAM,aAAaA,MAAK,QAAQ,QAAQ,IAAI,GAAG,UAAU;AACzD,UAAM,sBAAsB,UAAU;AAGtC,UAAM,YAAYA,MAAK,QAAQ,UAAU;AACzC,UAAM,qBAAqB,SAAS;AAEpC,OAAG;AAAA,MACD;AAAA,MACA,MAAM,SAAS,YAAY,YAAY,kBAAkB;AAAA,IAC3D;AAAA,EACF,OAAO;AACL,WAAO,MAAM,SAAS,MAAM,YAAY,kBAAkB;AAAA,EAC5D;AACF;AAGO,SAAS,YAAY,YAAwB;AAClD,QAAM,WAAkD,CAAC;AAEzD,MAAI,iBAAiB,YAAY;AAC/B,UAAM,EAAE,aAAa,GAAG,aAAa,IAAI;AAGzC,UAAM,aAAa,KAAK,MAAM,GAAG,aAAa,WAAW,YAAY,OAAO,CAAC;AAC7E,UAAM,QAAQ,OAAO,KAAK,WAAW,KAAK;AAG1C,UAAM,CAAC,YAAY,MAAM,IAAI,OAAO,QAAQ,WAAW,EAAE,CAAC;AAC1D,UAAM,WAAW,OAAO;AACxB,UAAM,iBAAiB,OAAO;AAE9B,UAAM,UAAU;AAEhB,UAAM,eAAe,MAAM,OAAO,CAAC,KAAKA,UAAS;AAC/C,YAAM,YAAY,qBAAqBA,OAAM,OAAO;AACpD,UAAI,CAAC,IAAI,SAAS,GAAG;AACnB,YAAI,SAAS,IAAI,CAAC;AAAA,MACpB;AACA,UAAI,SAAS,EAAE,KAAKA,KAAI;AACxB,aAAO;AAAA,IACT,GAAG,CAAC,CAA6B;AAGjC,WAAO,QAAQ,YAAY,EAAE,QAAQ,CAAC,CAAC,WAAWC,MAAK,MAAM;AAC3D,YAAM,kBAAkB,WAAW,QAAQ,MAAM,SAAS;AAE1D,UAAI,gBAAgB;AAElB,cAAM,kBAAkB,CAAC,eAAuB,wBAA6B;AAC3E,gBAAMD,QAAO,oBAAoB;AAGjC,gBAAM,gBAAgB,qBAAqBA,OAAM,OAAO;AACxD,cAAI,kBAAkB,WAAW;AAC/B,mBAAO;AAAA,UACT;AAGA,gBAAM,iBAAiB,eAAe,SAAS;AAC/C,cAAI,0BAA0B,QAAQ;AACpC,mBAAO,eAAe,KAAK,aAAa;AAAA,UAC1C;AAEA,iBAAO;AAAA,QACT;AAEA,iBAAS,KAAK;AAAA,UACZ,GAAG;AAAA,UACH,YAAY;AAAA,UACZ,iBAAiB;AAAA,QACnB,CAAC;AAAA,MACH,OAAO;AAEL,cAAM,kBAAkB,CAAC,eAAuB,wBAA6B;AAC3E,gBAAMA,QAAO,oBAAoB;AAGjC,gBAAM,gBAAgB,qBAAqBA,OAAM,OAAO;AACxD,iBAAO,kBAAkB;AAAA,QAC3B;AAEA,iBAAS,KAAK;AAAA,UACZ,GAAG;AAAA,UACH,YAAY;AAAA,UACZ,iBAAiB;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EAEH,OAAO;AACL,aAAS,KAAK,UAAU;AAAA,EAC1B;AACA,SAAO;AACT;AAMA,SAAS,yBAA4B,IAAgB;AACnD,QAAM,WAAWD,SAAQ,QAAQ,cAAc,EAAE,OAAO,CAACA,SAAQ,QAAQ,UAAU,CAAC,EAAE,CAAC;AACvF,QAAM,SAASA,SAAQ,QAAQ,YAAY;AAC3C,QAAM,gBAAgBA,SAAQ,MAAM,QAAQ;AAC5C,MAAI;AACF,IAAAA,SAAQ,MAAM,QAAQ,IAAIA,SAAQ,MAAM,MAAM;AAC9C,WAAO,GAAG;AAAA,EACZ,UAAE;AACA,QAAI,eAAe;AACjB,MAAAA,SAAQ,MAAM,QAAQ,IAAI;AAAA,IAC5B,OAAO;AACL,aAAOA,SAAQ,MAAM,QAAQ;AAAA,IAC/B;AAAA,EACF;AACF;","names":["path","path","ts","ts","ts","path","path","ts","getOperationName","path","ts","resultFile","printer","fs","operationDefinitions","tag","sharedTypesFile","isQuery","encodePathParams","encodeQueryParams","path","camelCase","require","path","paths"]}
1
+ {"version":3,"sources":["../node_modules/tsup/assets/esm_shims.js","../src/index.ts","../src/generate.ts","../src/utils/factory.ts","../src/codegen.ts","../src/generators/react-hooks.ts","../src/utils/capitalize.ts","../src/types.ts","../src/utils/getOperationDefinitions.ts","../src/utils/getV3Doc.ts","../src/utils/isQuery.ts","../src/utils/isValidUrl.ts","../src/utils/prettier.ts","../src/utils/removeUndefined.ts"],"sourcesContent":["// Shim globals in esm bundle\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nconst getFilename = () => fileURLToPath(import.meta.url)\nconst getDirname = () => path.dirname(getFilename())\n\nexport const __dirname = /* @__PURE__ */ getDirname()\nexport const __filename = /* @__PURE__ */ getFilename()\n","import fs from 'node:fs';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { generateApi } from './generate';\nimport type { CommonOptions, ConfigFile, GenerationOptions, OutputFileOptions } from './types';\nimport { isValidUrl, prettify, getV3Doc } from './utils';\nimport camelCase from 'lodash.camelcase';\nexport type { OutputFilesConfig, ConfigFile } from './types';\n\nconst require = createRequire(__filename);\n\n\n\n// 確保目錄存在的函數\nasync function ensureDirectoryExists(filePath: string) {\n const dirname = path.dirname(filePath);\n if (!fs.existsSync(dirname)) {\n await fs.promises.mkdir(dirname, { recursive: true });\n }\n}\n\n\n// 檢查檔案是否存在的函數\nfunction fileExists(filePath: string): boolean {\n try {\n return fs.statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\n// 獲取資料夾名稱並轉換為 API 名稱\nfunction getApiNameFromDir(dirPath: string): string {\n const dirName = path.basename(dirPath);\n return `${dirName}Api`;\n}\n\n// 確保基礎文件存在的函數\nasync function ensureBaseFilesExist(outputDir: string) {\n const enhanceEndpointsPath = path.join(outputDir, 'enhanceEndpoints.ts');\n const indexPath = path.join(outputDir, 'index.ts');\n const apiName = getApiNameFromDir(outputDir);\n\n // 如果 enhanceEndpoints.ts 不存在,創建它\n if (!fileExists(enhanceEndpointsPath)) {\n const enhanceEndpointsContent = `import api from './query.generated';\n\nconst enhancedApi = api.enhanceEndpoints({\n endpoints: {\n },\n});\n\nexport default enhancedApi;\n`;\n await fs.promises.writeFile(enhanceEndpointsPath, enhanceEndpointsContent, 'utf-8');\n }\n\n // 如果 index.ts 不存在,創建它\n if (!fileExists(indexPath)) {\n const indexContent = `export * from './query.generated';\nexport {default as ${apiName}} from './enhanceEndpoints';\n`;\n await fs.promises.writeFile(indexPath, indexContent, 'utf-8');\n }\n}\n\n\n// 從路徑中提取分類名稱\nfunction getGroupNameFromPath(path: string, pattern: RegExp): string {\n // console.log('pattern', pattern);\n\n const match = path.match(pattern);\n // console.log('match', path, match);\n\n if (match && match[1]) {\n return camelCase(match[1]);\n }\n return 'common';\n}\n\n\n\n\n\nexport async function generateEndpoints(options: GenerationOptions): Promise<string | void> {\n const schemaLocation = options.schemaFile;\n\n const schemaAbsPath = isValidUrl(options.schemaFile)\n ? options.schemaFile\n : path.resolve(process.cwd(), schemaLocation);\n\n // 如果是 URL 且使用 outputFiles 配置,需要特殊處理\n if (isValidUrl(options.schemaFile) && 'outputFiles' in options) {\n const { outputFiles, ...commonConfig } = options as any;\n \n // 異步獲取 OpenAPI 文檔\n const openApiDoc = await getV3Doc(options.schemaFile, options.httpResolverOptions);\n const paths = Object.keys(openApiDoc.paths);\n\n // 從配置中獲取分類規則\n const outputFilesEntries = Object.entries(outputFiles);\n const [outputPath, config] = outputFilesEntries[0];\n const patterns = (config as any).groupMatch;\n const filterEndpoint = (config as any).filterEndpoint;\n\n const pattern = patterns;\n // 根據路徑自動分類\n const groupedPaths = paths.reduce((acc, path) => {\n const groupName = getGroupNameFromPath(path, pattern);\n if (!acc[groupName]) {\n acc[groupName] = [];\n }\n acc[groupName].push(path);\n return acc;\n }, {} as Record<string, string[]>);\n\n // 為每個分類生成配置並執行\n for (const [groupName, paths] of Object.entries(groupedPaths)) {\n const finalOutputPath = outputPath.replace('$1', groupName);\n\n if (filterEndpoint) {\n // 如果有 filterEndpoint,使用基於路徑的篩選函數\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n if (pathGroupName !== groupName) {\n return false;\n }\n\n // 使用 filterEndpoint 進行額外篩選\n const endpointFilter = filterEndpoint(groupName);\n if (endpointFilter instanceof RegExp) {\n return endpointFilter.test(operationName);\n }\n\n return true;\n };\n\n const groupOptions = {\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n };\n\n await generateSingleEndpoint(groupOptions);\n } else {\n // 如果沒有 filterEndpoint,只使用路徑分組\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n return pathGroupName === groupName;\n };\n\n const groupOptions = {\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n };\n\n await generateSingleEndpoint(groupOptions);\n }\n }\n return;\n }\n\n // 原有的邏輯處理非 outputFiles 配置或本地文件\n await generateSingleEndpoint(options);\n}\n\nasync function generateSingleEndpoint(options: GenerationOptions): Promise<string | void> {\n const schemaLocation = options.schemaFile;\n\n const schemaAbsPath = isValidUrl(options.schemaFile)\n ? options.schemaFile\n : path.resolve(process.cwd(), schemaLocation);\n\n const sourceCode = await enforceOazapftsTsVersion(async () => {\n return generateApi(schemaAbsPath, options);\n });\n const { outputFile, prettierConfigFile } = options;\n if (outputFile) {\n const outputPath = path.resolve(process.cwd(), outputFile);\n await ensureDirectoryExists(outputPath);\n\n // 確保基礎文件存在\n const outputDir = path.dirname(outputPath);\n await ensureBaseFilesExist(outputDir);\n\n fs.writeFileSync(\n outputPath,\n await prettify(outputFile, sourceCode, prettierConfigFile)\n );\n } else {\n return await prettify(null, sourceCode, prettierConfigFile);\n }\n}\n\nexport function parseConfig(fullConfig: ConfigFile) {\n const outFiles: (CommonOptions & OutputFileOptions)[] = [];\n\n if ('outputFiles' in fullConfig) {\n const { outputFiles, ...commonConfig } = fullConfig;\n\n // 讀取 OpenAPI 文檔 - 支援 URL 和本地文件\n let openApiDoc: any;\n if (isValidUrl(fullConfig.schemaFile)) {\n // 如果是 URL,直接返回原始配置,讓 generateEndpoints 處理\n outFiles.push(fullConfig as any);\n return outFiles;\n } else {\n // 如果是本地文件,直接讀取\n openApiDoc = JSON.parse(fs.readFileSync(fullConfig.schemaFile, 'utf-8'));\n }\n\n const paths = Object.keys(openApiDoc.paths);\n\n // 從配置中獲取分類規則\n const outputFilesEntries = Object.entries(outputFiles);\n const [outputPath, config] = outputFilesEntries[0];\n const patterns = (config as any).groupMatch;\n const filterEndpoint = (config as any).filterEndpoint;\n\n const pattern = patterns;\n // 根據路徑自動分類\n const groupedPaths = paths.reduce((acc, path) => {\n const groupName = getGroupNameFromPath(path, pattern);\n if (!acc[groupName]) {\n acc[groupName] = [];\n }\n acc[groupName].push(path);\n return acc;\n }, {} as Record<string, string[]>);\n\n // 為每個分類生成配置\n Object.entries(groupedPaths).forEach(([groupName, paths]) => {\n const finalOutputPath = outputPath.replace('$1', groupName);\n\n if (filterEndpoint) {\n // 如果有 filterEndpoint,使用基於路徑的篩選函數\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n if (pathGroupName !== groupName) {\n return false;\n }\n\n // 使用 filterEndpoint 進行額外篩選\n const endpointFilter = filterEndpoint(groupName);\n if (endpointFilter instanceof RegExp) {\n return endpointFilter.test(operationName);\n }\n\n return true;\n };\n\n outFiles.push({\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n });\n } else {\n // 如果沒有 filterEndpoint,只使用路徑分組\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n \n // 檢查路徑是否匹配當前分組\n const pathGroupName = getGroupNameFromPath(path, pattern);\n return pathGroupName === groupName;\n };\n\n outFiles.push({\n ...commonConfig,\n outputFile: finalOutputPath,\n filterEndpoints: pathBasedFilter,\n });\n }\n });\n\n } else {\n outFiles.push(fullConfig);\n }\n return outFiles;\n}\n\n/**\n * Enforces `oazapfts` to use the same TypeScript version as this module itself uses.\n * That should prevent enums from running out of sync if both libraries use different TS versions.\n */\nfunction enforceOazapftsTsVersion<T>(cb: () => T): T {\n const ozTsPath = require.resolve('typescript', { paths: [require.resolve('oazapfts')] });\n const tsPath = require.resolve('typescript');\n const originalEntry = require.cache[ozTsPath];\n try {\n require.cache[ozTsPath] = require.cache[tsPath];\n return cb();\n } finally {\n if (originalEntry) {\n require.cache[ozTsPath] = originalEntry;\n } else {\n delete require.cache[ozTsPath];\n }\n }\n}\n","import camelCase from 'lodash.camelcase';\nimport path from 'node:path';\nimport ApiGenerator, {\n getOperationName as _getOperationName,\n getReferenceName,\n isReference,\n supportDeepObjects,\n createPropertyAssignment,\n createQuestionToken,\n isValidIdentifier,\n keywordType,\n} from 'oazapfts/generate';\nimport type { OpenAPIV3 } from 'openapi-types';\nimport ts from 'typescript';\nimport type { ObjectPropertyDefinitions } from './codegen';\nimport { generateCreateApiCall, generateEndpointDefinition, generateImportNode, generateTagTypes } from './codegen';\nimport { generateReactHooks } from './generators/react-hooks';\nimport type {\n EndpointMatcher,\n EndpointOverrides,\n GenerationOptions,\n OperationDefinition,\n ParameterDefinition,\n ParameterMatcher,\n TextMatcher,\n} from './types';\nimport { capitalize, getOperationDefinitions, getV3Doc, removeUndefined, isQuery as testIsQuery } from './utils';\nimport { factory } from './utils/factory';\n\nconst generatedApiName = 'injectedRtkApi';\nconst v3DocCache: Record<string, OpenAPIV3.Document> = {};\n\nfunction defaultIsDataResponse(code: string, includeDefault: boolean) {\n if (includeDefault && code === 'default') {\n return true;\n }\n const parsedCode = Number(code);\n return !Number.isNaN(parsedCode) && parsedCode >= 200 && parsedCode < 300;\n}\n\nfunction getOperationName({ verb, path }: Pick<OperationDefinition, 'verb' | 'path' >) {\n return _getOperationName(verb, path, undefined);\n}\n\nfunction getTags({ verb, pathItem }: Pick<OperationDefinition, 'verb' | 'pathItem'>): string[] {\n return verb ? pathItem[verb]?.tags || [] : [];\n}\n\nfunction patternMatches(pattern?: TextMatcher) {\n const filters = Array.isArray(pattern) ? pattern : [pattern];\n return function matcher(operationName: string) {\n if (!pattern) return true;\n return filters.some((filter) =>\n typeof filter === 'string' ? filter === operationName : filter?.test(operationName)\n );\n };\n}\n\nfunction operationMatches(pattern?: EndpointMatcher) {\n const checkMatch = typeof pattern === 'function' ? pattern : patternMatches(pattern);\n return function matcher(operationDefinition: OperationDefinition) {\n if (!pattern) return true;\n const operationName = getOperationName(operationDefinition);\n return checkMatch(operationName, operationDefinition);\n };\n}\n\nfunction argumentMatches(pattern?: ParameterMatcher) {\n const checkMatch = typeof pattern === 'function' ? pattern : patternMatches(pattern);\n return function matcher(argumentDefinition: ParameterDefinition) {\n if (!pattern || argumentDefinition.in === 'path') return true;\n const argumentName = argumentDefinition.name;\n return checkMatch(argumentName, argumentDefinition);\n };\n}\n\nfunction withQueryComment<T extends ts.Node>(node: T, def: QueryArgDefinition, hasTrailingNewLine: boolean): T {\n const comment = def.origin === 'param' ? def.param.description : def.body.description;\n if (comment) {\n return ts.addSyntheticLeadingComment(\n node,\n ts.SyntaxKind.MultiLineCommentTrivia,\n `* ${comment} `,\n hasTrailingNewLine\n );\n }\n return node;\n}\n\nexport function getOverrides(\n operation: OperationDefinition,\n endpointOverrides?: EndpointOverrides[]\n): EndpointOverrides | undefined {\n return endpointOverrides?.find((override) => operationMatches(override.pattern)(operation));\n}\n\nexport async function generateApi(\n spec: string,\n {\n apiFile,\n apiImport = 'api',\n exportName = 'enhancedApi',\n argSuffix = 'ApiArg',\n responseSuffix = 'ApiResponse',\n operationNameSuffix = '',\n hooks = false,\n tag = false,\n outputFile,\n isDataResponse = defaultIsDataResponse,\n filterEndpoints,\n endpointOverrides,\n unionUndefined,\n encodePathParams = false,\n encodeQueryParams = false,\n flattenArg = false,\n includeDefault = false,\n useEnumType = false,\n mergeReadWriteOnly = false,\n httpResolverOptions,\n sharedTypesFile,\n }: GenerationOptions\n) {\n const v3Doc = (v3DocCache[spec] ??= await getV3Doc(spec, httpResolverOptions));\n\n const apiGen = new ApiGenerator(v3Doc, {\n unionUndefined,\n useEnumType,\n mergeReadWriteOnly,\n });\n\n const schemeTypeNames = new Set<string>();\n\n function addSchemeTypeName(name: string) {\n schemeTypeNames.add(name);\n schemeTypeNames.add(camelCase(name));\n schemeTypeNames.add(capitalize(camelCase(name)));\n }\n\n if (sharedTypesFile) {\n const resultFile = ts.createSourceFile(\n 'sharedTypes.ts',\n '',\n ts.ScriptTarget.Latest,\n /*setParentNodes*/ false,\n ts.ScriptKind.TS\n );\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n\n const allTypeDefinitions: ts.Statement[] = [];\n const definedTypeNames = new Set<string>();\n\n const components = v3Doc.components;\n if (components) {\n const componentDefinitions = Object.entries(components).map(([componentType, componentDefs]) => {\n const typeEntries = Object.entries(componentDefs as Record<string, unknown>)\n .map(([name, def]) => {\n addSchemeTypeName(name);\n const typeName = capitalize(camelCase(name));\n definedTypeNames.add(typeName);\n const typeNode = wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(def as OpenAPIV3.SchemaObject));\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier(typeName),\n undefined,\n typeNode\n );\n });\n return factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(typeEntries),\n ts.NodeFlags.Namespace\n );\n });\n allTypeDefinitions.push(...componentDefinitions);\n }\n\n const enumEntries = [\n ...apiGen.enumAliases.filter(e => ts.isEnumDeclaration(e)),\n ...apiGen.enumAliases.filter(e => ts.isTypeAliasDeclaration(e)),\n ].map(enumDecl => {\n if (ts.isEnumDeclaration(enumDecl)) {\n return factory.createEnumDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n enumDecl.name,\n enumDecl.members\n );\n } else if (ts.isTypeAliasDeclaration(enumDecl)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n enumDecl.name,\n enumDecl.typeParameters,\n enumDecl.type\n );\n }\n return enumDecl;\n });\n \n const unionTypeEnums = apiGen.aliases\n .filter(alias => {\n if (ts.isTypeAliasDeclaration(alias) && alias.type) {\n return ts.isUnionTypeNode(alias.type);\n }\n return false;\n })\n .map(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n alias.name,\n alias.typeParameters,\n alias.type\n );\n }\n return alias;\n });\n \n const allEnumEntries = [...enumEntries, ...unionTypeEnums];\n \n if (allEnumEntries.length > 0) {\n allTypeDefinitions.push(\n factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Enum'),\n factory.createModuleBlock(allEnumEntries),\n ts.NodeFlags.Namespace\n )\n );\n }\n\n if (apiGen.aliases.length > 0) {\n const aliasEntries = apiGen.aliases\n .filter(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n const isDefinedInComponents = definedTypeNames.has(alias.name.text);\n const isUnionTypeEnum = ts.isUnionTypeNode(alias.type);\n return !isDefinedInComponents && !isUnionTypeEnum;\n }\n return false;\n })\n .map(alias => {\n if (ts.isTypeAliasDeclaration(alias)) {\n return factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n alias.name,\n alias.typeParameters,\n alias.type\n );\n }\n return alias;\n });\n\n if (aliasEntries.length > 0) {\n const existingSchemeIndex = allTypeDefinitions.findIndex(def => \n ts.isModuleDeclaration(def) && \n ts.isIdentifier(def.name) && \n def.name.text === 'Scheme'\n );\n\n if (existingSchemeIndex >= 0) {\n const existingScheme = allTypeDefinitions[existingSchemeIndex] as ts.ModuleDeclaration;\n const mergedMembers = [...(existingScheme.body as ts.ModuleBlock).statements, ...aliasEntries];\n allTypeDefinitions[existingSchemeIndex] = factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(mergedMembers),\n ts.NodeFlags.Namespace\n );\n } else {\n allTypeDefinitions.push(\n factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(aliasEntries),\n ts.NodeFlags.Namespace\n )\n );\n }\n }\n }\n\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n \n const sharedTypesDir = path.dirname(sharedTypesFile);\n await fs.mkdir(sharedTypesDir, { recursive: true });\n \n const output = printer.printNode(\n ts.EmitHint.Unspecified,\n factory.createSourceFile(\n allTypeDefinitions,\n factory.createToken(ts.SyntaxKind.EndOfFileToken),\n ts.NodeFlags.None\n ),\n resultFile\n );\n\n await fs.writeFile(sharedTypesFile, output, 'utf-8');\n }\n\n if (apiGen.spec.components?.schemas) {\n apiGen.preprocessComponents(apiGen.spec.components.schemas);\n }\n\n const operationDefinitions = getOperationDefinitions(v3Doc).filter(operationMatches(filterEndpoints));\n\n const resultFile = ts.createSourceFile(\n 'someFileName.ts',\n '',\n ts.ScriptTarget.Latest,\n /*setParentNodes*/ false,\n ts.ScriptKind.TS\n );\n const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed });\n\n const interfaces: Record<string, ts.InterfaceDeclaration | ts.TypeAliasDeclaration> = {};\n function registerInterface(declaration: ts.InterfaceDeclaration | ts.TypeAliasDeclaration) {\n const name = declaration.name.escapedText.toString();\n if (name in interfaces) {\n throw new Error(`interface/type alias ${name} already registered`);\n }\n interfaces[name] = declaration;\n return declaration;\n }\n\n if (outputFile) {\n outputFile = path.resolve(process.cwd(), outputFile);\n if (apiFile.startsWith('.')) {\n apiFile = path.relative(path.dirname(outputFile), apiFile);\n apiFile = apiFile.replace(/\\\\/g, '/');\n if (!apiFile.startsWith('.')) apiFile = `./${apiFile}`;\n }\n }\n apiFile = apiFile.replace(/\\.[jt]sx?$/, '');\n\n const sharedTypesImportPath = sharedTypesFile && outputFile\n ? (() => {\n let rel = path.relative(path.dirname(outputFile), sharedTypesFile)\n .replace(/\\\\/g, '/')\n .replace(/\\.[jt]sx?$/, '');\n if (!rel.startsWith('.')) rel = './' + rel;\n return rel;\n })()\n : './shared-types';\n\n return printer.printNode(\n ts.EmitHint.Unspecified,\n factory.createSourceFile(\n [\n generateImportNode(apiFile, { [apiImport]: 'api' }),\n generateImportNode('@acrool/react-fetcher', { IRestFulEndpointsQueryReturn: 'IRestFulEndpointsQueryReturn' }),\n ...(sharedTypesFile ? [\n generateImportNode(sharedTypesImportPath, { \n Scheme: 'Scheme',\n ...(useEnumType ? { Enum: 'Enum' } : {})\n })\n ] : []),\n ...(tag ? [generateTagTypes({ addTagTypes: extractAllTagTypes({ operationDefinitions }) })] : []),\n generateCreateApiCall({\n tag,\n endpointDefinitions: factory.createObjectLiteralExpression(\n operationDefinitions.map((operationDefinition) =>\n generateEndpoint({\n operationDefinition,\n overrides: getOverrides(operationDefinition, endpointOverrides),\n sharedTypesFile: !!sharedTypesFile,\n })\n ),\n true\n ),\n }),\n factory.createExportAssignment(\n undefined,\n undefined,\n factory.createIdentifier(generatedApiName)\n ),\n ...Object.values(interfaces),\n ...(sharedTypesFile ? [] : [...apiGen.aliases, ...apiGen.enumAliases]),\n ...(hooks\n ? [\n generateReactHooks({\n exportName: generatedApiName,\n operationDefinitions,\n endpointOverrides,\n config: hooks,\n }),\n ]\n : []),\n ],\n factory.createToken(ts.SyntaxKind.EndOfFileToken),\n ts.NodeFlags.None\n ),\n resultFile\n );\n\n function extractAllTagTypes({ operationDefinitions }: { operationDefinitions: OperationDefinition[] }) {\n const allTagTypes = new Set<string>();\n\n for (const operationDefinition of operationDefinitions) {\n const { verb, pathItem } = operationDefinition;\n for (const tag of getTags({ verb, pathItem })) {\n allTagTypes.add(tag);\n }\n }\n return [...allTagTypes];\n }\n\n function generateEndpoint({\n operationDefinition,\n overrides,\n sharedTypesFile,\n }: {\n operationDefinition: OperationDefinition;\n overrides?: EndpointOverrides;\n sharedTypesFile: boolean;\n }) {\n const {\n verb,\n path,\n pathItem,\n operation,\n operation: { responses, requestBody },\n } = operationDefinition;\n const operationName = getOperationName({ verb, path });\n const tags = tag ? getTags({ verb, pathItem }) : [];\n const isQuery = testIsQuery(verb, overrides);\n\n const returnsJson = apiGen.getResponseType(responses) === 'json';\n let ResponseType: ts.TypeNode = factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword);\n if (returnsJson) {\n const returnTypes = Object.entries(responses || {})\n .map(\n ([code, response]) =>\n [\n code,\n apiGen.resolve(response),\n wrapWithSchemeIfComponent(\n apiGen.getTypeFromResponse(response, 'readOnly') ||\n factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)\n ),\n ] as const\n )\n .filter(([status, response]) =>\n isDataResponse(status, includeDefault, apiGen.resolve(response), responses || {})\n )\n .filter(([_1, _2, type]) => type !== keywordType.void)\n .map(([code, response, type]) => {\n return ts.addSyntheticLeadingComment(\n type,\n ts.SyntaxKind.MultiLineCommentTrivia,\n `* status ${code} ${response.description} `,\n false\n );\n });\n if (returnTypes.length > 0) {\n ResponseType = factory.createUnionTypeNode(returnTypes);\n }\n }\n\n const ResponseTypeName = factory.createTypeReferenceNode(\n registerInterface(\n factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n capitalize(operationName + operationNameSuffix + responseSuffix),\n undefined,\n ResponseType\n )\n ).name\n );\n\n const operationParameters = apiGen.resolveArray(operation.parameters);\n const pathItemParameters = apiGen\n .resolveArray(pathItem.parameters)\n .filter((pp) => !operationParameters.some((op) => op.name === pp.name && op.in === pp.in));\n\n const parameters = supportDeepObjects([...pathItemParameters, ...operationParameters])\n .filter(argumentMatches(overrides?.parameterFilter))\n .filter(param => param.in !== 'header');\n\n const allNames = parameters.map((p) => p.name);\n const queryArg: QueryArgDefinitions = {};\n function generateName(name: string, potentialPrefix: string) {\n const isPureSnakeCase = /^[a-zA-Z][a-zA-Z0-9_]*$/.test(name);\n const hasNamingConflict = allNames.filter((n) => n === name).length > 1;\n if (hasNamingConflict) {\n name = `${potentialPrefix}_${name}`;\n }\n const camelCaseName = camelCase(name);\n if (isPureSnakeCase && !allNames.includes(camelCaseName)) {\n name = camelCaseName;\n }\n while (name in queryArg) {\n name = `_${name}`;\n }\n return name;\n }\n\n for (const param of parameters) {\n const name = generateName(param.name, param.in);\n queryArg[name] = {\n origin: 'param',\n name,\n originalName: param.name,\n type: wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(isReference(param) ? param : param.schema, undefined, 'writeOnly')),\n required: param.required,\n param,\n };\n }\n\n if (requestBody) {\n const body = apiGen.resolve(requestBody);\n const schema = apiGen.getSchemaFromContent(body.content);\n const type = wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(schema));\n const schemaName = camelCase(\n (type as any).name ||\n getReferenceName(schema) ||\n (typeof schema === 'object' && 'title' in schema && schema.title) ||\n 'body'\n );\n const name = generateName(schemaName in queryArg ? 'body' : schemaName, 'body');\n\n queryArg[name] = {\n origin: 'body',\n name,\n originalName: schemaName,\n type: wrapWithSchemeIfComponent(apiGen.getTypeFromSchema(schema, undefined, 'writeOnly')),\n required: true,\n body,\n };\n }\n\n const propertyName = (name: string | ts.PropertyName): ts.PropertyName => {\n if (typeof name === 'string') {\n return isValidIdentifier(name) ? factory.createIdentifier(name) : factory.createStringLiteral(name);\n }\n return name;\n };\n\n const queryArgValues = Object.values(queryArg);\n\n const isFlatArg = flattenArg && queryArgValues.length === 1;\n const QueryArg = factory.createTypeReferenceNode(\n registerInterface(\n factory.createTypeAliasDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n capitalize(operationName + operationNameSuffix + argSuffix),\n undefined,\n queryArgValues.length > 0\n ? isFlatArg\n ? withQueryComment(\n factory.createUnionTypeNode([\n queryArgValues[0].type,\n ...(!queryArgValues[0].required\n ? [factory.createKeywordTypeNode(ts.SyntaxKind.UndefinedKeyword)]\n : []),\n ]),\n queryArgValues[0],\n false\n )\n : factory.createTypeLiteralNode(\n queryArgValues.map((def) =>\n withQueryComment(\n factory.createPropertySignature(\n undefined,\n propertyName(def.name),\n createQuestionToken(!def.required),\n def.type\n ),\n def,\n true\n )\n )\n )\n : factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword)\n )\n ).name\n );\n\n return generateEndpointDefinition({\n operationName: operationNameSuffix ? capitalize(operationName + operationNameSuffix) : operationName,\n type: isQuery ? 'query' : 'mutation',\n Response: ResponseTypeName,\n QueryArg: factory.createTypeReferenceNode(\n factory.createIdentifier('IRestFulEndpointsQueryReturn'),\n [QueryArg]\n ),\n queryFn: generateQueryFn({\n operationDefinition,\n queryArg,\n isQuery,\n isFlatArg,\n encodePathParams,\n encodeQueryParams,\n }),\n extraEndpointsProps: isQuery\n ? generateQueryEndpointProps({ operationDefinition })\n : generateMutationEndpointProps({ operationDefinition }),\n tags,\n });\n }\n\n function generateQueryFn({\n operationDefinition,\n queryArg,\n isFlatArg,\n isQuery,\n encodePathParams,\n encodeQueryParams,\n }: {\n operationDefinition: OperationDefinition;\n queryArg: QueryArgDefinitions;\n isFlatArg: boolean;\n isQuery: boolean;\n encodePathParams: boolean;\n encodeQueryParams: boolean;\n }) {\n const { path, verb } = operationDefinition;\n\n const bodyParameter = Object.values(queryArg).find((def) => def.origin === 'body');\n\n const rootObject = factory.createIdentifier('queryArg');\n const variablesObject = factory.createPropertyAccessExpression(rootObject, factory.createIdentifier('variables'));\n\n function pickParams(paramIn: string) {\n return Object.values(queryArg).filter((def) => def.origin === 'param' && def.param.in === paramIn);\n }\n\n function createObjectLiteralProperty(parameters: QueryArgDefinition[], propertyName: string) {\n if (parameters.length === 0) return undefined;\n\n const properties = parameters.map((param) => {\n const value = isFlatArg \n ? variablesObject \n : factory.createPropertyAccessExpression(variablesObject, factory.createIdentifier(param.name));\n\n const encodedValue =\n encodeQueryParams && param.param?.in === 'query'\n ? factory.createConditionalExpression(\n value,\n undefined,\n factory.createCallExpression(factory.createIdentifier('encodeURIComponent'), undefined, [\n factory.createCallExpression(factory.createIdentifier('String'), undefined, [value]),\n ]),\n undefined,\n factory.createIdentifier('undefined')\n )\n : value;\n\n return createPropertyAssignment(param.originalName, encodedValue);\n });\n\n return factory.createPropertyAssignment(\n factory.createIdentifier(propertyName),\n factory.createObjectLiteralExpression(properties, true)\n );\n }\n\n return factory.createArrowFunction(\n undefined,\n undefined,\n [factory.createParameterDeclaration(undefined, undefined, rootObject, undefined, undefined, undefined)],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createParenthesizedExpression(\n factory.createObjectLiteralExpression(\n [\n factory.createPropertyAssignment(\n factory.createIdentifier('url'),\n generatePathExpression(path, pickParams('path'), variablesObject, isFlatArg, encodePathParams)\n ),\n isQuery && verb.toUpperCase() === 'GET'\n ? undefined\n : factory.createPropertyAssignment(\n factory.createIdentifier('method'),\n factory.createStringLiteral(verb.toUpperCase())\n ),\n bodyParameter === undefined\n ? undefined\n : factory.createPropertyAssignment(\n factory.createIdentifier('body'),\n isFlatArg\n ? variablesObject\n : factory.createPropertyAccessExpression(variablesObject, factory.createIdentifier(bodyParameter.name))\n ),\n createObjectLiteralProperty(pickParams('cookie'), 'cookies'),\n createObjectLiteralProperty(pickParams('query'), 'params'),\n factory.createPropertyAssignment(\n factory.createIdentifier('fetchOptions'),\n factory.createPropertyAccessChain(\n rootObject,\n factory.createToken(ts.SyntaxKind.QuestionDotToken),\n factory.createIdentifier('fetchOptions')\n )\n ),\n ].filter(removeUndefined),\n false\n )\n )\n );\n }\n\n function generateQueryEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {\n return {};\n }\n\n function generateMutationEndpointProps({}: { operationDefinition: OperationDefinition }): ObjectPropertyDefinitions {\n return {};\n }\n\n function wrapWithSchemeIfComponent(typeNode: ts.TypeNode): ts.TypeNode {\n if (ts.isTypeReferenceNode(typeNode) && ts.isIdentifier(typeNode.typeName)) {\n const typeName = typeNode.typeName.text;\n \n // 檢查是否為 enum 類型(包括在 enumAliases 和 aliases 中的)\n const isEnumType = useEnumType && (\n apiGen.enumAliases.some(enumDecl => {\n if (ts.isEnumDeclaration(enumDecl) || ts.isTypeAliasDeclaration(enumDecl)) {\n return enumDecl.name.text === typeName;\n }\n return false;\n }) ||\n apiGen.aliases.some(alias => {\n if (ts.isTypeAliasDeclaration(alias) && alias.type) {\n // 檢查是否為 union type 的 enum\n if (ts.isUnionTypeNode(alias.type)) {\n return alias.name.text === typeName;\n }\n }\n return false;\n })\n );\n \n if (isEnumType) {\n return factory.createTypeReferenceNode(\n factory.createQualifiedName(\n factory.createIdentifier('Enum'),\n typeNode.typeName\n ),\n typeNode.typeArguments?.map(wrapWithSchemeIfComponent)\n );\n }\n \n if (schemeTypeNames.has(typeName)) {\n return factory.createTypeReferenceNode(\n factory.createQualifiedName(\n factory.createIdentifier('Scheme'),\n typeNode.typeName\n ),\n typeNode.typeArguments?.map(wrapWithSchemeIfComponent)\n );\n }\n if (typeNode.typeArguments) {\n return factory.createTypeReferenceNode(\n typeNode.typeName,\n typeNode.typeArguments.map(wrapWithSchemeIfComponent)\n );\n }\n }\n if (ts.isArrayTypeNode(typeNode)) {\n return factory.createArrayTypeNode(wrapWithSchemeIfComponent(typeNode.elementType));\n }\n if (ts.isUnionTypeNode(typeNode)) {\n // 檢查是否為 enum 的 union type\n const unionTypes = typeNode.types;\n if (unionTypes.length > 0 && unionTypes.every(type => \n ts.isLiteralTypeNode(type) && \n (ts.isStringLiteral(type.literal) || ts.isNumericLiteral(type.literal))\n )) {\n // 這是一個 enum 的 union type,我們需要找到對應的 enum 類型\n const enumValues = unionTypes.map(type => {\n if (ts.isLiteralTypeNode(type)) {\n if (ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n } else if (ts.isNumericLiteral(type.literal)) {\n return type.literal.text;\n }\n }\n return null;\n }).filter(Boolean);\n \n // 查找對應的 enum 類型\n const matchingEnum = apiGen.aliases.find(alias => {\n if (ts.isTypeAliasDeclaration(alias) && ts.isUnionTypeNode(alias.type)) {\n const aliasValues = alias.type.types.map(type => {\n if (ts.isLiteralTypeNode(type)) {\n if (ts.isStringLiteral(type.literal)) {\n return type.literal.text;\n } else if (ts.isNumericLiteral(type.literal)) {\n return type.literal.text;\n }\n }\n return null;\n }).filter(Boolean);\n \n return aliasValues.length === enumValues.length && \n aliasValues.every(val => enumValues.includes(val));\n }\n return false;\n });\n \n // 對於所有的 enum 類型,直接使用字串型別,不轉換為 Enum\n // 這樣可以避免自動命名造成的變更問題\n if (matchingEnum && ts.isTypeAliasDeclaration(matchingEnum)) {\n // 直接返回原始的 union type,不轉換為 Enum\n return typeNode;\n }\n }\n \n return factory.createUnionTypeNode(typeNode.types.map(wrapWithSchemeIfComponent));\n }\n if (ts.isTypeLiteralNode(typeNode)) {\n return factory.createTypeLiteralNode(\n typeNode.members.map(member => {\n if (ts.isPropertySignature(member) && member.type) {\n return factory.updatePropertySignature(\n member,\n member.modifiers,\n member.name,\n member.questionToken,\n wrapWithSchemeIfComponent(member.type)\n );\n }\n return member;\n })\n );\n }\n return typeNode;\n }\n}\n\nfunction accessProperty(rootObject: ts.Identifier, propertyName: string) {\n return isValidIdentifier(propertyName)\n ? factory.createPropertyAccessExpression(rootObject, factory.createIdentifier(propertyName))\n : factory.createElementAccessExpression(rootObject, factory.createStringLiteral(propertyName));\n}\n\nfunction generatePathExpression(\n path: string,\n pathParameters: QueryArgDefinition[],\n rootObject: ts.Identifier | ts.PropertyAccessExpression,\n isFlatArg: boolean,\n encodePathParams: boolean\n) {\n const expressions: Array<[string, string]> = [];\n\n const head = path.replace(/\\{(.*?)}(.*?)(?=\\{|$)/g, (_, expression, literal) => {\n const param = pathParameters.find((p) => p.originalName === expression);\n if (!param) {\n throw new Error(`path parameter ${expression} does not seem to be defined in '${path}'!`);\n }\n expressions.push([param.name, literal]);\n return '';\n });\n\n return expressions.length\n ? factory.createTemplateExpression(\n factory.createTemplateHead(head),\n expressions.map(([prop, literal], index) => {\n const value = isFlatArg \n ? rootObject \n : factory.createPropertyAccessExpression(rootObject, factory.createIdentifier(prop));\n const encodedValue = encodePathParams\n ? factory.createCallExpression(factory.createIdentifier('encodeURIComponent'), undefined, [\n factory.createCallExpression(factory.createIdentifier('String'), undefined, [value]),\n ])\n : value;\n return factory.createTemplateSpan(\n encodedValue,\n index === expressions.length - 1\n ? factory.createTemplateTail(literal)\n : factory.createTemplateMiddle(literal)\n );\n })\n )\n : factory.createNoSubstitutionTemplateLiteral(head);\n}\n\ntype QueryArgDefinition = {\n name: string;\n originalName: string;\n type: ts.TypeNode;\n required?: boolean;\n param?: OpenAPIV3.ParameterObject;\n} & (\n | {\n origin: 'param';\n param: OpenAPIV3.ParameterObject;\n }\n | {\n origin: 'body';\n body: OpenAPIV3.RequestBodyObject;\n }\n);\ntype QueryArgDefinitions = Record<string, QueryArgDefinition>;\n","import ts from 'typescript';\nimport semver from 'semver';\n\nconst originalFactory = ts.factory;\n\nfunction createImportSpecifier(propertyName: ts.Identifier | undefined, name: ts.Identifier): ts.ImportSpecifier {\n if (semver.satisfies(ts.version, '>= 4.5'))\n // @ts-ignore\n return originalFactory.createImportSpecifier(false, propertyName, name);\n // @ts-ignore\n return originalFactory.createImportSpecifier(propertyName, name);\n}\n\nfunction createExportSpecifier(\n propertyName: string | ts.Identifier | undefined,\n name: string | ts.Identifier\n): ts.ExportSpecifier {\n if (semver.satisfies(ts.version, '>= 4.5'))\n // @ts-ignore\n return originalFactory.createExportSpecifier(false, propertyName, name);\n // @ts-ignore\n return originalFactory.createExportSpecifier(propertyName, name);\n}\n\nexport const factory = {\n ...originalFactory,\n createImportSpecifier,\n createExportSpecifier,\n};\n","import { factory } from './utils/factory';\nimport ts from 'typescript';\n\nconst defaultEndpointBuilder = factory.createIdentifier('build');\n\nexport type ObjectPropertyDefinitions = Record<string, ts.Expression | undefined>;\nexport function generateObjectProperties(obj: ObjectPropertyDefinitions) {\n return Object.entries(obj)\n .filter(([_, v]) => v)\n .map(([k, v]) => factory.createPropertyAssignment(factory.createIdentifier(k), v as ts.Expression));\n}\n\nexport function generateImportNode(pkg: string, namedImports: Record<string, string>, defaultImportName?: string) {\n return factory.createImportDeclaration(\n undefined,\n factory.createImportClause(\n false,\n defaultImportName !== undefined ? factory.createIdentifier(defaultImportName) : undefined,\n factory.createNamedImports(\n Object.entries(namedImports).map(([propertyName, name]) =>\n factory.createImportSpecifier(\n name === propertyName ? undefined : factory.createIdentifier(propertyName),\n factory.createIdentifier(name)\n )\n )\n )\n ),\n factory.createStringLiteral(pkg)\n );\n}\n\nexport function generateCreateApiCall({\n endpointBuilder = defaultEndpointBuilder,\n endpointDefinitions,\n tag,\n}: {\n endpointBuilder?: ts.Identifier;\n endpointDefinitions: ts.ObjectLiteralExpression;\n tag: boolean;\n}) {\n const injectEndpointsObjectLiteralExpression = factory.createObjectLiteralExpression(\n generateObjectProperties({\n endpoints: factory.createArrowFunction(\n undefined,\n undefined,\n [factory.createParameterDeclaration(undefined, undefined, endpointBuilder, undefined, undefined, undefined)],\n undefined,\n factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken),\n factory.createParenthesizedExpression(endpointDefinitions)\n ),\n overrideExisting: factory.createFalse(),\n }),\n true\n );\n if (tag) {\n const enhanceEndpointsObjectLiteralExpression = factory.createObjectLiteralExpression(\n [factory.createShorthandPropertyAssignment(factory.createIdentifier('addTagTypes'), undefined)],\n true\n );\n return factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('injectedRtkApi'),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier('api'),\n factory.createIdentifier('enhanceEndpoints')\n ),\n undefined,\n [enhanceEndpointsObjectLiteralExpression]\n ),\n factory.createIdentifier('injectEndpoints')\n ),\n undefined,\n [injectEndpointsObjectLiteralExpression]\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n }\n\n return factory.createVariableStatement(\n undefined,\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('injectedRtkApi'),\n undefined,\n undefined,\n factory.createCallExpression(\n factory.createPropertyAccessExpression(\n factory.createIdentifier('api'),\n factory.createIdentifier('injectEndpoints')\n ),\n undefined,\n [injectEndpointsObjectLiteralExpression]\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n}\n\nexport function generateEndpointDefinition({\n operationName,\n type,\n Response,\n QueryArg,\n queryFn,\n endpointBuilder = defaultEndpointBuilder,\n extraEndpointsProps,\n tags,\n}: {\n operationName: string;\n type: 'query' | 'mutation';\n Response: ts.TypeReferenceNode;\n QueryArg: ts.TypeReferenceNode;\n queryFn: ts.Expression;\n endpointBuilder?: ts.Identifier;\n extraEndpointsProps: ObjectPropertyDefinitions;\n tags: string[];\n}) {\n const objectProperties = generateObjectProperties({ query: queryFn, ...extraEndpointsProps });\n if (tags.length > 0) {\n objectProperties.push(\n factory.createPropertyAssignment(\n factory.createIdentifier(type === 'query' ? 'providesTags' : 'invalidatesTags'),\n factory.createArrayLiteralExpression(tags.map((tag) => factory.createStringLiteral(tag), false))\n )\n );\n }\n return factory.createPropertyAssignment(\n factory.createIdentifier(operationName),\n\n factory.createCallExpression(\n factory.createPropertyAccessExpression(endpointBuilder, factory.createIdentifier(type)),\n [Response, QueryArg],\n [factory.createObjectLiteralExpression(objectProperties, true)]\n )\n );\n}\n\nexport function generateTagTypes({ addTagTypes }: { addTagTypes: string[] }) {\n return factory.createVariableStatement(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createIdentifier('addTagTypes'),\n undefined,\n undefined,\n factory.createAsExpression(\n factory.createArrayLiteralExpression(\n addTagTypes.map((tagType) => factory.createStringLiteral(tagType)),\n true\n ),\n factory.createTypeReferenceNode(factory.createIdentifier('const'), undefined)\n )\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n}\n","import ts from 'typescript';\nimport { getOperationName } from 'oazapfts/generate';\nimport { capitalize, isQuery } from '../utils';\nimport type { OperationDefinition, EndpointOverrides, ConfigFile } from '../types';\nimport { getOverrides } from '../generate';\nimport { factory } from '../utils/factory';\n\ntype HooksConfigOptions = NonNullable<ConfigFile['hooks']>;\n\ntype GetReactHookNameParams = {\n operationDefinition: OperationDefinition;\n endpointOverrides: EndpointOverrides[] | undefined;\n config: HooksConfigOptions;\n};\n\ntype CreateBindingParams = {\n operationDefinition: OperationDefinition;\n overrides?: EndpointOverrides;\n isLazy?: boolean;\n};\n\nconst createBinding = ({\n operationDefinition: { verb, path },\n overrides,\n isLazy = false,\n}: CreateBindingParams) =>\n factory.createBindingElement(\n undefined,\n undefined,\n factory.createIdentifier(\n `use${isLazy ? 'Lazy' : ''}${capitalize(getOperationName(verb, path, undefined))}${\n isQuery(verb, overrides) ? 'Query' : 'Mutation'\n }`\n ),\n undefined\n );\n\nconst getReactHookName = ({ operationDefinition, endpointOverrides, config }: GetReactHookNameParams) => {\n const overrides = getOverrides(operationDefinition, endpointOverrides);\n\n const baseParams = {\n operationDefinition,\n overrides,\n };\n\n const _isQuery = isQuery(operationDefinition.verb, overrides);\n\n // If `config` is true, just generate everything\n if (typeof config === 'boolean') {\n return createBinding(baseParams);\n }\n\n // `config` is an object and we need to check for the configuration of each property\n if (_isQuery) {\n return [\n ...(config.queries ? [createBinding(baseParams)] : []),\n ...(config.lazyQueries ? [createBinding({ ...baseParams, isLazy: true })] : []),\n ];\n }\n\n return config.mutations ? createBinding(baseParams) : [];\n};\n\ntype GenerateReactHooksParams = {\n exportName: string;\n operationDefinitions: OperationDefinition[];\n endpointOverrides: EndpointOverrides[] | undefined;\n config: HooksConfigOptions;\n};\nexport const generateReactHooks = ({\n exportName,\n operationDefinitions,\n endpointOverrides,\n config,\n}: GenerateReactHooksParams) =>\n factory.createVariableStatement(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createVariableDeclarationList(\n [\n factory.createVariableDeclaration(\n factory.createObjectBindingPattern(\n operationDefinitions\n .map((operationDefinition) => getReactHookName({ operationDefinition, endpointOverrides, config }))\n .flat()\n ),\n undefined,\n undefined,\n factory.createIdentifier(exportName)\n ),\n ],\n ts.NodeFlags.Const\n )\n );\n","export function capitalize(str: string) {\n return str.replace(str[0], str[0].toUpperCase());\n}\n","import type SwaggerParser from '@apidevtools/swagger-parser';\nimport type { OpenAPIV3 } from 'openapi-types';\n\nexport type OperationDefinition = {\n path: string;\n verb: (typeof operationKeys)[number];\n pathItem: OpenAPIV3.PathItemObject;\n operation: OpenAPIV3.OperationObject;\n};\n\nexport type ParameterDefinition = OpenAPIV3.ParameterObject;\n\ntype Require<T, K extends keyof T> = { [k in K]-?: NonNullable<T[k]> } & Omit<T, K>;\ntype Optional<T, K extends keyof T> = { [k in K]?: NonNullable<T[k]> } & Omit<T, K>;\ntype Id<T> = { [K in keyof T]: T[K] } & {};\ntype AtLeastOneKey<T> = {\n [K in keyof T]-?: Pick<T, K> & Partial<T>;\n}[keyof T];\n\nexport const operationKeys = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const;\n\nexport type GenerationOptions = Id<\n CommonOptions &\n Optional<OutputFileOptions, 'outputFile'> & {\n isDataResponse?(\n code: string,\n includeDefault: boolean,\n response: OpenAPIV3.ResponseObject,\n allResponses: OpenAPIV3.ResponsesObject\n ): boolean;\n }\n>;\n\nexport interface CommonOptions {\n apiFile: string;\n /**\n * filename or url\n */\n schemaFile: string;\n /**\n * defaults to \"api\"\n */\n apiImport?: string;\n /**\n * defaults to \"enhancedApi\"\n */\n exportName?: string;\n /**\n * defaults to \"ApiArg\"\n */\n argSuffix?: string;\n /**\n * defaults to \"ApiResponse\"\n */\n responseSuffix?: string;\n /**\n * defaults to empty\n */\n operationNameSuffix?: string;\n /**\n * defaults to `false`\n * `true` will generate hooks for queries and mutations, but no lazyQueries\n */\n hooks?: boolean | { queries: boolean; lazyQueries: boolean; mutations: boolean };\n /**\n * defaults to false\n * `true` will generate a union type for `undefined` properties like: `{ id?: string | undefined }` instead of `{ id?: string }`\n */\n unionUndefined?: boolean;\n /**\n * defaults to false\n * `true` will result in all generated endpoints having `providesTags`/`invalidatesTags` declarations for the `tags` of their respective operation definition\n * @see https://redux-toolkit.js.org/rtk-query/usage/code-generation for more information\n */\n tag?: boolean;\n /**\n * defaults to false\n * `true` will add `encodeURIComponent` to the generated path parameters\n */\n encodePathParams?: boolean;\n /**\n * defaults to false\n * `true` will add `encodeURIComponent` to the generated query parameters\n */\n encodeQueryParams?: boolean;\n /**\n * defaults to false\n * `true` will \"flatten\" the arg so that you can do things like `useGetEntityById(1)` instead of `useGetEntityById({ entityId: 1 })`\n */\n flattenArg?: boolean;\n /**\n * default to false\n * If set to `true`, the default response type will be included in the generated code for all endpoints.\n * @see https://swagger.io/docs/specification/describing-responses/#default\n */\n includeDefault?: boolean;\n /**\n * default to false\n * `true` will not generate separate types for read-only and write-only properties.\n */\n mergeReadWriteOnly?: boolean;\n /**\n *\n * HTTPResolverOptions object that is passed to the SwaggerParser bundle function.\n */\n httpResolverOptions?: SwaggerParser.HTTPResolverOptions;\n\n /**\n * defaults to undefined\n * If present the given file will be used as prettier config when formatting the generated code. If undefined the default prettier config\n * resolution mechanism will be used.\n */\n prettierConfigFile?: string;\n}\n\nexport type TextMatcher = string | RegExp | (string | RegExp)[];\n\nexport type EndpointMatcherFunction = (operationName: string, operationDefinition: OperationDefinition) => boolean;\n\nexport type EndpointMatcher = TextMatcher | EndpointMatcherFunction;\n\nexport type ParameterMatcherFunction = (parameterName: string, parameterDefinition: ParameterDefinition) => boolean;\n\nexport type ParameterMatcher = TextMatcher | ParameterMatcherFunction;\n\nexport interface OutputFileOptions extends Partial<CommonOptions> {\n outputFile: string;\n filterEndpoints?: EndpointMatcher;\n endpointOverrides?: EndpointOverrides[];\n /**\n * defaults to false\n * If passed as true it will generate TS enums instead of union of strings\n */\n useEnumType?: boolean;\n sharedTypesFile?: string;\n}\n\nexport type EndpointOverrides = {\n pattern: EndpointMatcher;\n} & AtLeastOneKey<{\n type: 'mutation' | 'query';\n parameterFilter: ParameterMatcher;\n}>;\n\nexport type OutputFilesConfig = {\n [outputFile: string]: {\n groupMatch: RegExp,\n filterEndpoint?: (groupName: string) => RegExp\n }\n};\n\nexport type ConfigFile =\n | Id<Require<CommonOptions & OutputFileOptions, 'outputFile'>>\n | Id<\n Omit<CommonOptions, 'outputFile'> & {\n // outputFiles: { [outputFile: string]: Omit<OutputFileOptions, 'outputFile'> };\n outputFiles: OutputFilesConfig\n }\n >;\n","import type { OpenAPIV3 } from 'openapi-types';\nimport type { OperationDefinition } from '../types';\nimport { operationKeys } from '../types';\n\nexport function getOperationDefinitions(v3Doc: OpenAPIV3.Document): OperationDefinition[] {\n return Object.entries(v3Doc.paths).flatMap(([path, pathItem]) =>\n !pathItem\n ? []\n : Object.entries(pathItem)\n .filter((arg): arg is [(typeof operationKeys)[number], OpenAPIV3.OperationObject] =>\n operationKeys.includes(arg[0] as any)\n )\n .map(([verb, operation]) => ({\n path,\n verb,\n pathItem,\n operation,\n }))\n );\n}\n","import SwaggerParser from '@apidevtools/swagger-parser';\nimport type { OpenAPIV3 } from 'openapi-types';\n// @ts-ignore\nimport converter from 'swagger2openapi';\n\nexport async function getV3Doc(\n spec: string,\n httpResolverOptions?: SwaggerParser.HTTPResolverOptions\n): Promise<OpenAPIV3.Document> {\n const doc = await SwaggerParser.bundle(spec, {\n resolve: {\n http: httpResolverOptions,\n },\n });\n\n const isOpenApiV3 = 'openapi' in doc && doc.openapi.startsWith('3');\n\n if (isOpenApiV3) {\n return doc as OpenAPIV3.Document;\n } else {\n const result = await converter.convertObj(doc, {});\n return result.openapi as OpenAPIV3.Document;\n }\n}\n","import type { EndpointOverrides, operationKeys } from '../types';\n\nexport function isQuery(verb: (typeof operationKeys)[number], overrides: EndpointOverrides | undefined) {\n if (overrides?.type) {\n return overrides.type === 'query';\n }\n return verb === 'get';\n}\n","export function isValidUrl(string: string) {\n try {\n new URL(string);\n } catch (_) {\n return false;\n }\n\n return true;\n}\n","import path from 'node:path';\nimport prettier from 'prettier';\nimport type { BuiltInParserName } from 'prettier';\n\nconst EXTENSION_TO_PARSER: Record<string, BuiltInParserName> = {\n ts: 'typescript',\n tsx: 'typescript',\n js: 'babel',\n jsx: 'babel',\n 'js.flow': 'flow',\n flow: 'flow',\n gql: 'graphql',\n graphql: 'graphql',\n css: 'scss',\n scss: 'scss',\n less: 'scss',\n stylus: 'scss',\n markdown: 'markdown',\n md: 'markdown',\n json: 'json',\n};\n\nexport async function prettify(filePath: string | null, content: string, prettierConfigFile?: string): Promise<string> {\n let config = null;\n let parser = 'typescript';\n\n if (filePath) {\n const fileExtension = path.extname(filePath).slice(1);\n parser = EXTENSION_TO_PARSER[fileExtension];\n config = await prettier.resolveConfig(process.cwd(), {\n useCache: true,\n editorconfig: !prettierConfigFile,\n config: prettierConfigFile,\n });\n } else if (prettierConfigFile) {\n config = await prettier.resolveConfig(process.cwd(), {\n useCache: true,\n config: prettierConfigFile,\n });\n }\n\n return prettier.format(content, {\n parser,\n ...config,\n });\n}\n","export function removeUndefined<T>(t: T | undefined): t is T {\n return typeof t !== 'undefined';\n}\n"],"mappings":"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","names":["path","path","ts","ts","ts","path","path","ts","getOperationName","path","ts","resultFile","printer","fs","operationDefinitions","tag","sharedTypesFile","isQuery","encodePathParams","encodeQueryParams","path","camelCase","require","path","paths"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acrool/rtk-query-codegen-openapi",
3
- "version": "0.0.2-test.9",
3
+ "version": "0.0.6",
4
4
  "main": "lib/index.js",
5
5
  "types": "lib/index.d.ts",
6
6
  "module": "lib/index.mjs",
@@ -39,7 +39,12 @@
39
39
  "test:update:enum": "lib/bin/cli.mjs test/config.example.enum.ts",
40
40
  "test": "vitest --run --typecheck",
41
41
  "test:watch": "vitest --watch",
42
- "cli": "esr src/bin/cli.ts"
42
+ "cli": "esr src/bin/cli.ts",
43
+ "release": "standard-version --release-as",
44
+ "release:major": "standard-version -r major",
45
+ "release:minor": "standard-version -r minor",
46
+ "release:patch": "standard-version -r patch",
47
+ "release:alpha": "standard-version --prerelease alpha"
43
48
  },
44
49
  "files": [
45
50
  "lib",
@@ -65,6 +70,10 @@
65
70
  "husky": "^4.3.6",
66
71
  "msw": "^2.1.5",
67
72
  "node-fetch": "^3.3.2",
73
+ "cz-conventional-changelog": "3.3.0",
74
+ "cz-customizable": "6.6.0",
75
+ "cz-git": "^1.11.1",
76
+ "standard-version": "^9.5.0",
68
77
  "openapi-types": "^9.1.0",
69
78
  "pretty-quick": "^4.0.0",
70
79
  "rimraf": "^5.0.5",
package/src/index.ts CHANGED
@@ -3,7 +3,7 @@ import { createRequire } from 'node:module';
3
3
  import path from 'node:path';
4
4
  import { generateApi } from './generate';
5
5
  import type { CommonOptions, ConfigFile, GenerationOptions, OutputFileOptions } from './types';
6
- import { isValidUrl, prettify } from './utils';
6
+ import { isValidUrl, prettify, getV3Doc } from './utils';
7
7
  import camelCase from 'lodash.camelcase';
8
8
  export type { OutputFilesConfig, ConfigFile } from './types';
9
9
 
@@ -85,6 +85,95 @@ function getGroupNameFromPath(path: string, pattern: RegExp): string {
85
85
  export async function generateEndpoints(options: GenerationOptions): Promise<string | void> {
86
86
  const schemaLocation = options.schemaFile;
87
87
 
88
+ const schemaAbsPath = isValidUrl(options.schemaFile)
89
+ ? options.schemaFile
90
+ : path.resolve(process.cwd(), schemaLocation);
91
+
92
+ // 如果是 URL 且使用 outputFiles 配置,需要特殊處理
93
+ if (isValidUrl(options.schemaFile) && 'outputFiles' in options) {
94
+ const { outputFiles, ...commonConfig } = options as any;
95
+
96
+ // 異步獲取 OpenAPI 文檔
97
+ const openApiDoc = await getV3Doc(options.schemaFile, options.httpResolverOptions);
98
+ const paths = Object.keys(openApiDoc.paths);
99
+
100
+ // 從配置中獲取分類規則
101
+ const outputFilesEntries = Object.entries(outputFiles);
102
+ const [outputPath, config] = outputFilesEntries[0];
103
+ const patterns = (config as any).groupMatch;
104
+ const filterEndpoint = (config as any).filterEndpoint;
105
+
106
+ const pattern = patterns;
107
+ // 根據路徑自動分類
108
+ const groupedPaths = paths.reduce((acc, path) => {
109
+ const groupName = getGroupNameFromPath(path, pattern);
110
+ if (!acc[groupName]) {
111
+ acc[groupName] = [];
112
+ }
113
+ acc[groupName].push(path);
114
+ return acc;
115
+ }, {} as Record<string, string[]>);
116
+
117
+ // 為每個分類生成配置並執行
118
+ for (const [groupName, paths] of Object.entries(groupedPaths)) {
119
+ const finalOutputPath = outputPath.replace('$1', groupName);
120
+
121
+ if (filterEndpoint) {
122
+ // 如果有 filterEndpoint,使用基於路徑的篩選函數
123
+ const pathBasedFilter = (operationName: string, operationDefinition: any) => {
124
+ const path = operationDefinition.path;
125
+
126
+ // 檢查路徑是否匹配當前分組
127
+ const pathGroupName = getGroupNameFromPath(path, pattern);
128
+ if (pathGroupName !== groupName) {
129
+ return false;
130
+ }
131
+
132
+ // 使用 filterEndpoint 進行額外篩選
133
+ const endpointFilter = filterEndpoint(groupName);
134
+ if (endpointFilter instanceof RegExp) {
135
+ return endpointFilter.test(operationName);
136
+ }
137
+
138
+ return true;
139
+ };
140
+
141
+ const groupOptions = {
142
+ ...commonConfig,
143
+ outputFile: finalOutputPath,
144
+ filterEndpoints: pathBasedFilter,
145
+ };
146
+
147
+ await generateSingleEndpoint(groupOptions);
148
+ } else {
149
+ // 如果沒有 filterEndpoint,只使用路徑分組
150
+ const pathBasedFilter = (operationName: string, operationDefinition: any) => {
151
+ const path = operationDefinition.path;
152
+
153
+ // 檢查路徑是否匹配當前分組
154
+ const pathGroupName = getGroupNameFromPath(path, pattern);
155
+ return pathGroupName === groupName;
156
+ };
157
+
158
+ const groupOptions = {
159
+ ...commonConfig,
160
+ outputFile: finalOutputPath,
161
+ filterEndpoints: pathBasedFilter,
162
+ };
163
+
164
+ await generateSingleEndpoint(groupOptions);
165
+ }
166
+ }
167
+ return;
168
+ }
169
+
170
+ // 原有的邏輯處理非 outputFiles 配置或本地文件
171
+ await generateSingleEndpoint(options);
172
+ }
173
+
174
+ async function generateSingleEndpoint(options: GenerationOptions): Promise<string | void> {
175
+ const schemaLocation = options.schemaFile;
176
+
88
177
  const schemaAbsPath = isValidUrl(options.schemaFile)
89
178
  ? options.schemaFile
90
179
  : path.resolve(process.cwd(), schemaLocation);
@@ -110,21 +199,30 @@ export async function generateEndpoints(options: GenerationOptions): Promise<str
110
199
  }
111
200
  }
112
201
 
113
-
114
202
  export function parseConfig(fullConfig: ConfigFile) {
115
203
  const outFiles: (CommonOptions & OutputFileOptions)[] = [];
116
204
 
117
205
  if ('outputFiles' in fullConfig) {
118
206
  const { outputFiles, ...commonConfig } = fullConfig;
119
207
 
120
- // 讀取 OpenAPI 文檔
121
- const openApiDoc = JSON.parse(fs.readFileSync(fullConfig.schemaFile, 'utf-8'));
208
+ // 讀取 OpenAPI 文檔 - 支援 URL 和本地文件
209
+ let openApiDoc: any;
210
+ if (isValidUrl(fullConfig.schemaFile)) {
211
+ // 如果是 URL,直接返回原始配置,讓 generateEndpoints 處理
212
+ outFiles.push(fullConfig as any);
213
+ return outFiles;
214
+ } else {
215
+ // 如果是本地文件,直接讀取
216
+ openApiDoc = JSON.parse(fs.readFileSync(fullConfig.schemaFile, 'utf-8'));
217
+ }
218
+
122
219
  const paths = Object.keys(openApiDoc.paths);
123
220
 
124
221
  // 從配置中獲取分類規則
125
- const [outputPath, config] = Object.entries(outputFiles)[0];
126
- const patterns = config.groupMatch;
127
- const filterEndpoint = config.filterEndpoint;
222
+ const outputFilesEntries = Object.entries(outputFiles);
223
+ const [outputPath, config] = outputFilesEntries[0];
224
+ const patterns = (config as any).groupMatch;
225
+ const filterEndpoint = (config as any).filterEndpoint;
128
226
 
129
227
  const pattern = patterns;
130
228
  // 根據路徑自動分類