@acrool/rtk-query-codegen-openapi 0.0.6 → 0.0.9
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/README.md +33 -0
- package/lib/index.d.mts +15 -5
- package/lib/index.d.ts +15 -5
- package/lib/index.js +219 -157
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +219 -157
- package/lib/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/generate.ts +180 -132
- package/src/generators/react-hooks.ts +10 -4
- package/src/index.ts +76 -77
- package/src/types.ts +20 -5
- package/src/utils/downloadSchema.ts +33 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/isQuery.ts +9 -1
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, 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAe;AACf,yBAA8B;AAC9B,IAAAA,oBAAiB;;;ACFjB,oBAAsB;AACtB,IAAAC,oBAAiB;AACjB,IAAAC,mBASO;AAEP,IAAAC,qBAAe;;;ACbf,wBAAe;AACf,oBAAmB;AAEnB,IAAM,kBAAkB,kBAAAC,QAAG;AAE3B,SAAS,sBAAsB,cAAyC,MAAyC;AAC/G,MAAI,cAAAC,QAAO,UAAU,kBAAAD,QAAG,SAAS,QAAQ;AAEvC,WAAO,gBAAgB,sBAAsB,OAAO,cAAc,IAAI;AAExE,SAAO,gBAAgB,sBAAsB,cAAc,IAAI;AACjE;AAEA,SAAS,sBACP,cACA,MACoB;AACpB,MAAI,cAAAC,QAAO,UAAU,kBAAAD,QAAG,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,IAAAE,qBAAe;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,YAAY,mBAAAC,QAAG,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,QACA,mBAAAA,QAAG,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,MACA,mBAAAA,QAAG,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,eAAe,mBAAAA,QAAG,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,MACA,mBAAAA,QAAG,UAAU;AAAA,IACf;AAAA,EACF;AACF;;;AC5KA,IAAAC,qBAAe;AACf,sBAAiC;;;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,4BAA0B;AAG1B,6BAAsB;AAEtB,eAAsB,SACpB,MACA,qBAC6B;AAC7B,QAAM,MAAM,MAAM,sBAAAC,QAAc,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,uBAAAC,QAAU,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,uBAAiB;AACjB,sBAAqB;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,iBAAAC,QAAK,QAAQ,QAAQ,EAAE,MAAM,CAAC;AACpD,aAAS,oBAAoB,aAAa;AAC1C,aAAS,MAAM,gBAAAC,QAAS,cAAc,QAAQ,IAAI,GAAG;AAAA,MACnD,UAAU;AAAA,MACV,cAAc,CAAC;AAAA,MACf,QAAQ;AAAA,IACV,CAAC;AAAA,EACH,WAAW,oBAAoB;AAC7B,aAAS,MAAM,gBAAAA,QAAS,cAAc,QAAQ,IAAI,GAAG;AAAA,MACnD,UAAU;AAAA,MACV,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAEA,SAAO,gBAAAA,QAAS,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,eAAW,kCAAiB,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,eAAe,mBAAAC,QAAG,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,IACA,mBAAAA,QAAG,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,aAAO,iBAAAC,kBAAkB,MAAMD,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,WAAO,mBAAAG,QAAG;AAAA,MACR;AAAA,MACA,mBAAAA,QAAG,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,iBAAAC,QAAa,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,QAAI,cAAAC,SAAU,IAAI,CAAC;AACnC,oBAAgB,IAAI,eAAW,cAAAA,SAAU,IAAI,CAAC,CAAC;AAAA,EACjD;AAEA,MAAI,iBAAiB;AACnB,UAAMC,cAAa,mBAAAH,QAAG;AAAA,MACpB;AAAA,MACA;AAAA,MACA,mBAAAA,QAAG,aAAa;AAAA;AAAA,MACG;AAAA,MACnB,mBAAAA,QAAG,WAAW;AAAA,IAChB;AACA,UAAMI,WAAU,mBAAAJ,QAAG,cAAc,EAAE,SAAS,mBAAAA,QAAG,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,eAAW,cAAAE,SAAU,IAAI,CAAC;AAC3C,2BAAiB,IAAI,QAAQ;AAC7B,gBAAM,WAAW,0BAA0B,OAAO,kBAAkB,GAA6B,CAAC;AAClG,iBAAO,QAAQ;AAAA,YACb,CAAC,QAAQ,eAAe,mBAAAF,QAAG,WAAW,aAAa,CAAC;AAAA,YACpD,QAAQ,iBAAiB,QAAQ;AAAA,YACjC;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AACH,eAAO,QAAQ;AAAA,UACb,CAAC,QAAQ,eAAe,mBAAAA,QAAG,WAAW,aAAa,CAAC;AAAA,UACpD,QAAQ,iBAAiB,QAAQ;AAAA,UACjC,QAAQ,kBAAkB,WAAW;AAAA,UACrC,mBAAAA,QAAG,UAAU;AAAA,QACf;AAAA,MACF,CAAC;AACD,yBAAmB,KAAK,GAAG,oBAAoB;AAAA,IACjD;AAEA,UAAM,cAAc;AAAA,MAClB,GAAG,OAAO,YAAY,OAAO,OAAK,mBAAAA,QAAG,kBAAkB,CAAC,CAAC;AAAA,MACzD,GAAG,OAAO,YAAY,OAAO,OAAK,mBAAAA,QAAG,uBAAuB,CAAC,CAAC;AAAA,IAChE,EAAE,IAAI,cAAY;AAChB,UAAI,mBAAAA,QAAG,kBAAkB,QAAQ,GAAG;AAClC,eAAO,QAAQ;AAAA,UACb,CAAC,QAAQ,eAAe,mBAAAA,QAAG,WAAW,aAAa,CAAC;AAAA,UACpD,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF,WAAW,mBAAAA,QAAG,uBAAuB,QAAQ,GAAG;AAC9C,eAAO,QAAQ;AAAA,UACb,CAAC,QAAQ,eAAe,mBAAAA,QAAG,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,UAAI,mBAAAA,QAAG,uBAAuB,KAAK,KAAK,MAAM,MAAM;AAClD,eAAO,mBAAAA,QAAG,gBAAgB,MAAM,IAAI;AAAA,MACtC;AACA,aAAO;AAAA,IACT,CAAC,EACA,IAAI,WAAS;AACZ,UAAI,mBAAAA,QAAG,uBAAuB,KAAK,GAAG;AACpC,eAAO,QAAQ;AAAA,UACb,CAAC,QAAQ,eAAe,mBAAAA,QAAG,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,eAAe,mBAAAA,QAAG,WAAW,aAAa,CAAC;AAAA,UACpD,QAAQ,iBAAiB,MAAM;AAAA,UAC/B,QAAQ,kBAAkB,cAAc;AAAA,UACxC,mBAAAA,QAAG,UAAU;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAEA,QAAI,OAAO,QAAQ,SAAS,GAAG;AAC7B,YAAM,eAAe,OAAO,QACzB,OAAO,WAAS;AACf,YAAI,mBAAAA,QAAG,uBAAuB,KAAK,GAAG;AACpC,gBAAM,wBAAwB,iBAAiB,IAAI,MAAM,KAAK,IAAI;AAClE,gBAAM,kBAAkB,mBAAAA,QAAG,gBAAgB,MAAM,IAAI;AACrD,iBAAO,CAAC,yBAAyB,CAAC;AAAA,QACpC;AACA,eAAO;AAAA,MACT,CAAC,EACA,IAAI,WAAS;AACZ,YAAI,mBAAAA,QAAG,uBAAuB,KAAK,GAAG;AACpC,iBAAO,QAAQ;AAAA,YACb,CAAC,QAAQ,eAAe,mBAAAA,QAAG,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,SACvD,mBAAAA,QAAG,oBAAoB,GAAG,KAC1B,mBAAAA,QAAG,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,eAAe,mBAAAA,QAAG,WAAW,aAAa,CAAC;AAAA,YACpD,QAAQ,iBAAiB,QAAQ;AAAA,YACjC,QAAQ,kBAAkB,aAAa;AAAA,YACvC,mBAAAA,QAAG,UAAU;AAAA,UACf;AAAA,QACF,OAAO;AACL,6BAAmB;AAAA,YACjB,QAAQ;AAAA,cACN,CAAC,QAAQ,eAAe,mBAAAA,QAAG,WAAW,aAAa,CAAC;AAAA,cACpD,QAAQ,iBAAiB,QAAQ;AAAA,cACjC,QAAQ,kBAAkB,YAAY;AAAA,cACtC,mBAAAA,QAAG,UAAU;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAMK,MAAK,MAAM,OAAO,kBAAkB;AAC1C,UAAMP,QAAO,MAAM,OAAO,WAAW;AAErC,UAAM,iBAAiBA,MAAK,QAAQ,eAAe;AACnD,UAAMO,IAAG,MAAM,gBAAgB,EAAE,WAAW,KAAK,CAAC;AAElD,UAAM,SAASD,SAAQ;AAAA,MACrB,mBAAAJ,QAAG,SAAS;AAAA,MACZ,QAAQ;AAAA,QACN;AAAA,QACA,QAAQ,YAAY,mBAAAA,QAAG,WAAW,cAAc;AAAA,QAChD,mBAAAA,QAAG,UAAU;AAAA,MACf;AAAA,MACAG;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,aAAa,mBAAAL,QAAG;AAAA,IACpB;AAAA,IACA;AAAA,IACA,mBAAAA,QAAG,aAAa;AAAA;AAAA,IACG;AAAA,IACnB,mBAAAA,QAAG,WAAW;AAAA,EAChB;AACA,QAAM,UAAU,mBAAAA,QAAG,cAAc,EAAE,SAAS,mBAAAA,QAAG,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,iBAAa,kBAAAF,QAAK,QAAQ,QAAQ,IAAI,GAAG,UAAU;AACnD,QAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,gBAAU,kBAAAA,QAAK,SAAS,kBAAAA,QAAK,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,MAAM,kBAAAA,QAAK,SAAS,kBAAAA,QAAK,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,IACb,mBAAAE,QAAG,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,YAAY,mBAAAA,QAAG,WAAW,cAAc;AAAA,MAChD,mBAAAA,QAAG,UAAU;AAAA,IACf;AAAA,IACA;AAAA,EACF;AAEA,WAAS,mBAAmB,EAAE,sBAAAM,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,MAAAV;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,UAAMW,WAAU,QAAY,MAAM,SAAS;AAE3C,UAAM,cAAc,OAAO,gBAAgB,SAAS,MAAM;AAC1D,QAAI,eAA4B,QAAQ,sBAAsB,mBAAAT,QAAG,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,sBAAsB,mBAAAA,QAAG,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,6BAAY,IAAI,EACpD,IAAI,CAAC,CAAC,MAAM,UAAU,IAAI,MAAM;AAC/B,eAAO,mBAAAA,QAAG;AAAA,UACR;AAAA,UACA,mBAAAA,QAAG,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,eAAe,mBAAAA,QAAG,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,iBAAa,qCAAmB,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,oBAAgB,cAAAE,SAAU,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,sBAAkB,8BAAY,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,iBAAa,cAAAA;AAAA,QAChB,KAAa,YACZ,mCAAiB,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,mBAAO,oCAAkB,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,eAAe,mBAAAF,QAAG,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,sBAAsB,mBAAAA,QAAG,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,sBACrB,sCAAoB,CAAC,IAAI,QAAQ;AAAA,kBACjC,IAAI;AAAA,gBACN;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AAAA,UACF,IACF,QAAQ,sBAAsB,mBAAAA,QAAG,WAAW,WAAW;AAAA,QAC7D;AAAA,MACF,EAAE;AAAA,IACJ;AAEA,WAAO,2BAA2B;AAAA,MAChC,eAAe,sBAAsB,WAAW,gBAAgB,mBAAmB,IAAI;AAAA,MACvF,MAAMS,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,MAAAb,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,eACJa,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,mBAAO,2CAAyB,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,YAAY,mBAAAX,QAAG,WAAW,sBAAsB;AAAA,MACxD,QAAQ;AAAA,QACN,QAAQ;AAAA,UACN;AAAA,YACE,QAAQ;AAAA,cACN,QAAQ,iBAAiB,KAAK;AAAA,cAC9B,uBAAuBF,OAAM,WAAW,MAAM,GAAG,iBAAiB,WAAWY,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,YAAY,mBAAAT,QAAG,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,QAAI,mBAAAA,QAAG,oBAAoB,QAAQ,KAAK,mBAAAA,QAAG,aAAa,SAAS,QAAQ,GAAG;AAC1E,YAAM,WAAW,SAAS,SAAS;AAGnC,YAAM,aAAa,gBACjB,OAAO,YAAY,KAAK,cAAY;AAClC,YAAI,mBAAAA,QAAG,kBAAkB,QAAQ,KAAK,mBAAAA,QAAG,uBAAuB,QAAQ,GAAG;AACzE,iBAAO,SAAS,KAAK,SAAS;AAAA,QAChC;AACA,eAAO;AAAA,MACT,CAAC,KACD,OAAO,QAAQ,KAAK,WAAS;AAC3B,YAAI,mBAAAA,QAAG,uBAAuB,KAAK,KAAK,MAAM,MAAM;AAElD,cAAI,mBAAAA,QAAG,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,QAAI,mBAAAA,QAAG,gBAAgB,QAAQ,GAAG;AAChC,aAAO,QAAQ,oBAAoB,0BAA0B,SAAS,WAAW,CAAC;AAAA,IACpF;AACA,QAAI,mBAAAA,QAAG,gBAAgB,QAAQ,GAAG;AAEhC,YAAM,aAAa,SAAS;AAC5B,UAAI,WAAW,SAAS,KAAK,WAAW;AAAA,QAAM,UAC5C,mBAAAA,QAAG,kBAAkB,IAAI,MACxB,mBAAAA,QAAG,gBAAgB,KAAK,OAAO,KAAK,mBAAAA,QAAG,iBAAiB,KAAK,OAAO;AAAA,MACvE,GAAG;AAED,cAAM,aAAa,WAAW,IAAI,UAAQ;AACxC,cAAI,mBAAAA,QAAG,kBAAkB,IAAI,GAAG;AAC9B,gBAAI,mBAAAA,QAAG,gBAAgB,KAAK,OAAO,GAAG;AACpC,qBAAO,KAAK,QAAQ;AAAA,YACtB,WAAW,mBAAAA,QAAG,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,cAAI,mBAAAA,QAAG,uBAAuB,KAAK,KAAK,mBAAAA,QAAG,gBAAgB,MAAM,IAAI,GAAG;AACtE,kBAAM,cAAc,MAAM,KAAK,MAAM,IAAI,UAAQ;AAC/C,kBAAI,mBAAAA,QAAG,kBAAkB,IAAI,GAAG;AAC9B,oBAAI,mBAAAA,QAAG,gBAAgB,KAAK,OAAO,GAAG;AACpC,yBAAO,KAAK,QAAQ;AAAA,gBACtB,WAAW,mBAAAA,QAAG,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,gBAAgB,mBAAAA,QAAG,uBAAuB,YAAY,GAAG;AAE3D,iBAAO;AAAA,QACT;AAAA,MACF;AAEA,aAAO,QAAQ,oBAAoB,SAAS,MAAM,IAAI,yBAAyB,CAAC;AAAA,IAClF;AACA,QAAI,mBAAAA,QAAG,kBAAkB,QAAQ,GAAG;AAClC,aAAO,QAAQ;AAAA,QACb,SAAS,QAAQ,IAAI,YAAU;AAC7B,cAAI,mBAAAA,QAAG,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,uBACPY,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,IAAAC,iBAAsB;AAGtB,IAAMC,eAAU,kCAAc,UAAU;AAKxC,eAAe,sBAAsB,UAAkB;AACrD,QAAM,UAAU,kBAAAC,QAAK,QAAQ,QAAQ;AACrC,MAAI,CAAC,eAAAC,QAAG,WAAW,OAAO,GAAG;AAC3B,UAAM,eAAAA,QAAG,SAAS,MAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AAAA,EACtD;AACF;AAIA,SAAS,WAAW,UAA2B;AAC7C,MAAI;AACF,WAAO,eAAAA,QAAG,SAAS,QAAQ,EAAE,OAAO;AAAA,EACtC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA,SAAS,kBAAkB,SAAyB;AAClD,QAAM,UAAU,kBAAAD,QAAK,SAAS,OAAO;AACrC,SAAO,GAAG,OAAO;AACnB;AAGA,eAAe,qBAAqB,WAAmB;AACrD,QAAM,uBAAuB,kBAAAA,QAAK,KAAK,WAAW,qBAAqB;AACvE,QAAM,YAAY,kBAAAA,QAAK,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,eAAAC,QAAG,SAAS,UAAU,sBAAsB,yBAAyB,OAAO;AAAA,EACpF;AAGA,MAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,UAAM,eAAe;AAAA,qBACJ,OAAO;AAAA;AAExB,UAAM,eAAAA,QAAG,SAAS,UAAU,WAAW,cAAc,OAAO;AAAA,EAC9D;AACF;AAIA,SAAS,qBAAqBD,OAAc,SAAyB;AAGnE,QAAM,QAAQA,MAAK,MAAM,OAAO;AAGhC,MAAI,SAAS,MAAM,CAAC,GAAG;AACrB,eAAO,eAAAE,SAAU,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,aACR,kBAAAF,QAAK,QAAQ,QAAQ,IAAI,GAAG,cAAc;AAG9C,MAAI,WAAW,QAAQ,UAAU,KAAK,iBAAiB,SAAS;AAC9D,UAAM,EAAE,aAAa,GAAG,aAAa,IAAI;AAGzC,UAAM,aAAa,MAAM,SAAS,QAAQ,YAAY,QAAQ,mBAAmB;AACjF,UAAM,QAAQ,OAAO,KAAK,WAAW,KAAK;AAG1C,UAAM,qBAAqB,OAAO,QAAQ,WAAW;AACrD,UAAM,CAAC,YAAY,MAAM,IAAI,mBAAmB,CAAC;AACjD,UAAM,WAAY,OAAe;AACjC,UAAM,iBAAkB,OAAe;AAEvC,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,eAAW,CAAC,WAAWG,MAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AAC7D,YAAM,kBAAkB,WAAW,QAAQ,MAAM,SAAS;AAE1D,UAAI,gBAAgB;AAElB,cAAM,kBAAkB,CAAC,eAAuB,wBAA6B;AAC3E,gBAAMH,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,cAAM,eAAe;AAAA,UACnB,GAAG;AAAA,UACH,YAAY;AAAA,UACZ,iBAAiB;AAAA,QACnB;AAEA,cAAM,uBAAuB,YAAY;AAAA,MAC3C,OAAO;AAEL,cAAM,kBAAkB,CAAC,eAAuB,wBAA6B;AAC3E,gBAAMA,QAAO,oBAAoB;AAGjC,gBAAM,gBAAgB,qBAAqBA,OAAM,OAAO;AACxD,iBAAO,kBAAkB;AAAA,QAC3B;AAEA,cAAM,eAAe;AAAA,UACnB,GAAG;AAAA,UACH,YAAY;AAAA,UACZ,iBAAiB;AAAA,QACnB;AAEA,cAAM,uBAAuB,YAAY;AAAA,MAC3C;AAAA,IACF;AACA;AAAA,EACF;AAGA,QAAM,uBAAuB,OAAO;AACtC;AAEA,eAAe,uBAAuB,SAAoD;AACxF,QAAM,iBAAiB,QAAQ;AAE/B,QAAM,gBAAgB,WAAW,QAAQ,UAAU,IAC/C,QAAQ,aACR,kBAAAA,QAAK,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,aAAa,kBAAAA,QAAK,QAAQ,QAAQ,IAAI,GAAG,UAAU;AACzD,UAAM,sBAAsB,UAAU;AAGtC,UAAM,YAAY,kBAAAA,QAAK,QAAQ,UAAU;AACzC,UAAM,qBAAqB,SAAS;AAEpC,mBAAAC,QAAG;AAAA,MACD;AAAA,MACA,MAAM,SAAS,YAAY,YAAY,kBAAkB;AAAA,IAC3D;AAAA,EACF,OAAO;AACL,WAAO,MAAM,SAAS,MAAM,YAAY,kBAAkB;AAAA,EAC5D;AACF;AAEO,SAAS,YAAY,YAAwB;AAClD,QAAM,WAAkD,CAAC;AAEzD,MAAI,iBAAiB,YAAY;AAC/B,UAAM,EAAE,aAAa,GAAG,aAAa,IAAI;AAGzC,QAAI;AACJ,QAAI,WAAW,WAAW,UAAU,GAAG;AAErC,eAAS,KAAK,UAAiB;AAC/B,aAAO;AAAA,IACT,OAAO;AAEL,mBAAa,KAAK,MAAM,eAAAA,QAAG,aAAa,WAAW,YAAY,OAAO,CAAC;AAAA,IACzE;AAEA,UAAM,QAAQ,OAAO,KAAK,WAAW,KAAK;AAG1C,UAAM,qBAAqB,OAAO,QAAQ,WAAW;AACrD,UAAM,CAAC,YAAY,MAAM,IAAI,mBAAmB,CAAC;AACjD,UAAM,WAAY,OAAe;AACjC,UAAM,iBAAkB,OAAe;AAEvC,UAAM,UAAU;AAEhB,UAAM,eAAe,MAAM,OAAO,CAAC,KAAKD,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,WAAWG,MAAK,MAAM;AAC3D,YAAM,kBAAkB,WAAW,QAAQ,MAAM,SAAS;AAE1D,UAAI,gBAAgB;AAElB,cAAM,kBAAkB,CAAC,eAAuB,wBAA6B;AAC3E,gBAAMH,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":["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/utils/downloadSchema.ts","../src/utils/isValidUrl.ts","../src/types.ts","../src/utils/getOperationDefinitions.ts","../src/utils/getV3Doc.ts","../src/utils/isQuery.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 { prettify, getV3Doc, downloadSchemaFile } from './utils';\nimport camelCase from 'lodash.camelcase';\nexport type { OutputFilesConfig, ConfigFile } from './types';\n\nconst require = createRequire(__filename);\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// 檢查檔案是否存在的函數\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, operationNames: 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 // 生成操作名稱的字符串\n const operationNamesString = operationNames\n .map(name => ` ${name}: {},`)\n .join('\\n');\n\n const enhanceEndpointsContent = `import api from './query.generated';\n\nconst enhancedApi = api.enhanceEndpoints({\n endpoints: {\n${operationNamesString}\n },\n});\n\nexport default enhancedApi;\n`;\n await fs.promises.writeFile(enhanceEndpointsPath, enhanceEndpointsContent, 'utf-8');\n }\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\nexport async function generateEndpoints(options: GenerationOptions): Promise<string | void> {\n // 如果有 remoteFile,先下載到 schemaFile 路徑\n let actualSchemaFile = options.schemaFile;\n \n if (options.remoteFile) {\n actualSchemaFile = await downloadSchemaFile(options.remoteFile, options.schemaFile);\n }\n \n // 更新 options 中的 schemaFile 為實際的檔案路徑\n const updatedOptions = {\n ...options,\n schemaFile: actualSchemaFile\n };\n\n const schemaLocation = updatedOptions.schemaFile;\n\n const schemaAbsPath = path.resolve(process.cwd(), schemaLocation);\n\n // 如果是使用 outputFiles 配置,需要特殊處理\n if ('outputFiles' in options) {\n const { outputFiles, ...commonConfig } = updatedOptions as any;\n \n // 異步獲取 OpenAPI 文檔\n const openApiDoc = await getV3Doc(actualSchemaFile, updatedOptions.httpResolverOptions);\n const paths = Object.keys(openApiDoc.paths);\n\n // 從配置中獲取分類規則\n const { groupKeyMatch, outputDir, filterEndpoint, queryMatch } = outputFiles;\n\n // 根據路徑自動分類\n const groupedPaths = paths.reduce((acc, path) => {\n // 使用 groupKeyMatch 方法獲取 groupKey,並轉換為小駝峰格式\n const groupKey = camelCase(groupKeyMatch(path));\n if (!acc[groupKey]) {\n acc[groupKey] = [];\n }\n acc[groupKey].push(path);\n return acc;\n }, {} as Record<string, string[]>);\n\n // 為每個分類生成配置並執行\n for (const [groupKey, paths] of Object.entries(groupedPaths)) {\n const finalOutputPath = `${outputDir}/${groupKey}/query.generated.ts`;\n\n if (filterEndpoint) {\n // 如果有 filterEndpoint,使用基於路徑的篩選函數\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n\n // 檢查路徑是否匹配當前分組\n const pathGroupKey = camelCase(groupKeyMatch(path));\n if (pathGroupKey !== groupKey) {\n return false;\n }\n\n // 使用 filterEndpoint 進行額外篩選\n const endpointFilter = filterEndpoint(groupKey);\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 sharedTypesFile: `${outputDir}/shared-types.ts`,\n filterEndpoints: pathBasedFilter,\n queryMatch,\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 pathGroupKey = camelCase(groupKeyMatch(path));\n return pathGroupKey === groupKey;\n };\n\n const groupOptions = {\n ...commonConfig,\n outputFile: finalOutputPath,\n sharedTypesFile: `${outputDir}/shared-types.ts`,\n filterEndpoints: pathBasedFilter,\n queryMatch,\n };\n\n await generateSingleEndpoint(groupOptions);\n }\n }\n return;\n }\n\n // 原有的邏輯處理非 outputFiles 配置或本地文件\n await generateSingleEndpoint(updatedOptions);\n}\n\nasync function generateSingleEndpoint(options: GenerationOptions): Promise<string | void> {\n const schemaLocation = options.schemaFile;\n\n const schemaAbsPath = path.resolve(process.cwd(), schemaLocation);\n\n const result = await enforceOazapftsTsVersion(async () => {\n return generateApi(schemaAbsPath, options);\n });\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, result.operationNames);\n\n fs.writeFileSync(\n outputPath,\n await prettify(outputFile, result.sourceCode, prettierConfigFile)\n );\n } else {\n return await prettify(null, result.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 文檔 - 支援本地文件\n let openApiDoc: any;\n \n // 如果有 remoteFile,直接返回原始配置,讓 generateEndpoints 處理下載\n if (fullConfig.remoteFile) {\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 { groupKeyMatch, outputDir, filterEndpoint, queryMatch } = outputFiles;\n\n // 根據路徑自動分類\n const groupedPaths = paths.reduce((acc, path) => {\n // 使用 groupKeyMatch 方法獲取 groupKey,並轉換為小駝峰格式\n const groupKey = camelCase(groupKeyMatch(path));\n if (!acc[groupKey]) {\n acc[groupKey] = [];\n }\n acc[groupKey].push(path);\n return acc;\n }, {} as Record<string, string[]>);\n\n // 為每個分類生成配置\n Object.entries(groupedPaths).forEach(([groupKey, paths]) => {\n const finalOutputPath = `${outputDir}/${groupKey}/query.generated.ts`;\n\n if (filterEndpoint) {\n // 如果有 filterEndpoint,使用基於路徑的篩選函數\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n\n // 檢查路徑是否匹配當前分組\n const pathGroupKey = camelCase(groupKeyMatch(path));\n if (pathGroupKey !== groupKey) {\n return false;\n }\n\n // 使用 filterEndpoint 進行額外篩選\n const endpointFilter = filterEndpoint(groupKey);\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 sharedTypesFile: `${outputDir}/shared-types.ts`,\n filterEndpoints: pathBasedFilter,\n queryMatch,\n });\n } else {\n // 如果沒有 filterEndpoint,只使用路徑分組\n const pathBasedFilter = (operationName: string, operationDefinition: any) => {\n const path = operationDefinition.path;\n\n // 檢查路徑是否匹配當前分組\n const pathGroupKey = camelCase(groupKeyMatch(path));\n return pathGroupKey === groupKey;\n };\n\n outFiles.push({\n ...commonConfig,\n outputFile: finalOutputPath,\n sharedTypesFile: `${outputDir}/shared-types.ts`,\n filterEndpoints: pathBasedFilter,\n queryMatch,\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 GenerateApiResult,\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 queryMatch,\n endpointsQueryReturnTypeFile = './endpointsQueryReturnType',\n }: GenerationOptions\n): Promise<GenerateApiResult> {\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 // 只處理 schemas,其他 component 類型暫時不處理\n if (components.schemas) {\n const typeEntries = Object.entries(components.schemas).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\n allTypeDefinitions.push(\n factory.createModuleDeclaration(\n [factory.createModifier(ts.SyntaxKind.ExportKeyword)],\n factory.createIdentifier('Scheme'),\n factory.createModuleBlock(typeEntries),\n ts.NodeFlags.Namespace\n )\n );\n }\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(\n (def) => ts.isModuleDeclaration(def) && ts.isIdentifier(def.name) && 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\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 if (endpointsQueryReturnTypeFile.startsWith('.')) {\n endpointsQueryReturnTypeFile = path.relative(path.dirname(outputFile), endpointsQueryReturnTypeFile);\n endpointsQueryReturnTypeFile = endpointsQueryReturnTypeFile.replace(/\\\\/g, '/');\n if (!endpointsQueryReturnTypeFile.startsWith('.')) endpointsQueryReturnTypeFile = `./${endpointsQueryReturnTypeFile}`;\n }\n }\n apiFile = apiFile.replace(/\\.[jt]sx?$/, '');\n endpointsQueryReturnTypeFile = endpointsQueryReturnTypeFile.replace(/\\.[jt]sx?$/, '');\n\n const sharedTypesImportPath =\n sharedTypesFile && outputFile\n ? (() => {\n let rel = path\n .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 // 收集操作名稱\n const operationNames: string[] = [];\n\n const sourceCode = printer.printNode(\n ts.EmitHint.Unspecified,\n factory.createSourceFile(\n [\n generateImportNode(apiFile, { [apiImport]: 'api' }),\n generateImportNode(endpointsQueryReturnTypeFile, { IRestFulEndpointsQueryReturn: 'IRestFulEndpointsQueryReturn' }),\n ...(sharedTypesFile\n ? [\n generateImportNode(sharedTypesImportPath, {\n Scheme: 'Scheme',\n ...(useEnumType ? { Enum: 'Enum' } : {}),\n }),\n ]\n : []),\n ...(tag ? [generateTagTypes({ addTagTypes: extractAllTagTypes({ operationDefinitions }) })] : []),\n generateCreateApiCall({\n tag,\n endpointDefinitions: factory.createObjectLiteralExpression(\n operationDefinitions.map((operationDefinition) => {\n const operationName = getOperationName({ verb: operationDefinition.verb, path: operationDefinition.path });\n const finalOperationName = operationNameSuffix ? capitalize(operationName + operationNameSuffix) : operationName;\n operationNames.push(finalOperationName);\n \n return generateEndpoint({\n operationDefinition,\n overrides: getOverrides(operationDefinition, endpointOverrides),\n sharedTypesFile: !!sharedTypesFile,\n queryMatch,\n });\n }),\n true\n ),\n }),\n factory.createExportAssignment(undefined, undefined, factory.createIdentifier(generatedApiName)),\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 queryMatch,\n }),\n ]\n : []),\n ],\n factory.createToken(ts.SyntaxKind.EndOfFileToken),\n ts.NodeFlags.None\n ),\n resultFile\n );\n\n return {\n sourceCode,\n operationNames,\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 queryMatch,\n }: {\n operationDefinition: OperationDefinition;\n overrides?: EndpointOverrides;\n sharedTypesFile: boolean;\n queryMatch?: (method: string, path: string) => 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, path, overrides, queryMatch);\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\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(\n apiGen.getTypeFromSchema(isReference(param) ? param : param.schema, undefined, 'writeOnly')\n ),\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(factory.createIdentifier('IRestFulEndpointsQueryReturn'), [QueryArg]),\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, operation } = 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 // 提取 content type 的輔助函數\n function getContentType(): string | undefined {\n if (operation.requestBody) {\n const requestBody = apiGen.resolve(operation.requestBody);\n const contentTypes = Object.keys(requestBody.content || {});\n // 直接返回第一個可用的 content type\n return contentTypes[0];\n }\n return undefined;\n }\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 const contentType = getContentType();\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 contentType\n ? factory.createPropertyAssignment(\n factory.createIdentifier('contentType'),\n factory.createStringLiteral(contentType)\n )\n : undefined,\n bodyParameter === undefined\n ? undefined\n : factory.createPropertyAssignment(\n factory.createIdentifier('body'),\n isFlatArg\n ? variablesObject\n : factory.createPropertyAccessExpression(\n variablesObject,\n factory.createIdentifier(bodyParameter.name)\n )\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 =\n 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 if (isEnumType) {\n return factory.createTypeReferenceNode(\n factory.createQualifiedName(factory.createIdentifier('Enum'), typeNode.typeName),\n typeNode.typeArguments?.map(wrapWithSchemeIfComponent)\n );\n }\n\n if (schemeTypeNames.has(typeName)) {\n return factory.createTypeReferenceNode(\n factory.createQualifiedName(factory.createIdentifier('Scheme'), typeNode.typeName),\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 (\n unionTypes.length > 0 &&\n unionTypes.every(\n (type) =>\n ts.isLiteralTypeNode(type) && (ts.isStringLiteral(type.literal) || ts.isNumericLiteral(type.literal))\n )\n ) {\n // 這是一個 enum 的 union type,我們需要找到對應的 enum 類型\n const enumValues = unionTypes\n .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 })\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\n .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 })\n .filter(Boolean);\n\n return aliasValues.length === enumValues.length && 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 queryMatch?: (method: string, path: string) => boolean;\n};\n\ntype CreateBindingParams = {\n operationDefinition: OperationDefinition;\n overrides?: EndpointOverrides;\n isLazy?: boolean;\n queryMatch?: (method: string, path: string) => boolean;\n};\n\nconst createBinding = ({\n operationDefinition: { verb, path },\n overrides,\n isLazy = false,\n queryMatch,\n}: CreateBindingParams) =>\n factory.createBindingElement(\n undefined,\n undefined,\n factory.createIdentifier(\n `use${isLazy ? 'Lazy' : ''}${capitalize(getOperationName(verb, path, undefined))}${\n isQuery(verb, path, overrides, queryMatch) ? 'Query' : 'Mutation'\n }`\n ),\n undefined\n );\n\nconst getReactHookName = ({ operationDefinition, endpointOverrides, config, queryMatch }: GetReactHookNameParams) => {\n const overrides = getOverrides(operationDefinition, endpointOverrides);\n\n const baseParams = {\n operationDefinition,\n overrides,\n queryMatch,\n };\n\n const _isQuery = isQuery(operationDefinition.verb, operationDefinition.path, overrides, queryMatch);\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 queryMatch?: (method: string, path: string) => boolean;\n};\nexport const generateReactHooks = ({\n exportName,\n operationDefinitions,\n endpointOverrides,\n config,\n queryMatch,\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, queryMatch }))\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 fs from 'node:fs';\nimport path from 'node:path';\nimport { isValidUrl } from './isValidUrl';\n\nexport async function downloadSchemaFile(remoteFile: string, targetPath: string): Promise<string> {\n // 如果不是網址,拋出錯誤\n if (!isValidUrl(remoteFile)) {\n throw new Error(`remoteFile must be a valid URL: ${remoteFile}`);\n }\n\n try {\n // 確保目錄存在\n const dir = path.dirname(targetPath);\n if (!fs.existsSync(dir)) {\n await fs.promises.mkdir(dir, { recursive: true });\n }\n\n // 下載檔案\n const response = await fetch(remoteFile);\n if (!response.ok) {\n throw new Error(`Failed to download schema from ${remoteFile}: ${response.statusText}`);\n }\n\n const content = await response.text();\n await fs.promises.writeFile(targetPath, content, 'utf-8');\n\n console.log(`Schema downloaded from ${remoteFile} to ${targetPath}`);\n return targetPath;\n } catch (error) {\n console.error(`Error downloading schema from ${remoteFile}:`, error);\n throw error;\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 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 * local schema file path (only supports local files)\n */\n schemaFile: string;\n /**\n * remote schema file URL (when provided, will download to schemaFile path)\n */\n remoteFile?: 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 * defaults to \"@acrool/react-fetcher\"\n * File path for importing IRestFulEndpointsQueryReturn type\n */\n endpointsQueryReturnTypeFile?: 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 queryMatch?: (method: string, path: string) => boolean;\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 groupKeyMatch: (path: string) => string;\n outputDir: string;\n queryMatch?: (method: string, path: string) => boolean;\n filterEndpoint?: (groupName: string) => RegExp;\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\nexport type GenerateApiResult = {\n sourceCode: string;\n operationNames: string[];\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(\n verb: (typeof operationKeys)[number],\n path: string,\n overrides: EndpointOverrides | undefined,\n queryMatch?: (method: string, path: string) => boolean\n) {\n if (queryMatch) {\n return queryMatch(verb, path);\n }\n if (overrides?.type) {\n return overrides.type === 'query';\n }\n return verb === 'get';\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_fs","import_node_path","import_node_path","import_generate","import_typescript","ts","semver","import_typescript","ts","import_typescript","path","fs","path","SwaggerParser","converter","path","import_node_path","path","prettier","path","ts","getOperationName","path","_getOperationName","ts","ApiGenerator","camelCase","resultFile","printer","fs","operationDefinitions","tag","sharedTypesFile","queryMatch","isQuery","encodePathParams","encodeQueryParams","path","import_lodash","require","path","fs","camelCase","paths"]}
|