moonflower 1.4.8 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/openapi/analyzerModule/analyzerModule.cjs +1 -1
- package/dist/openapi/analyzerModule/analyzerModule.cjs.map +1 -1
- package/dist/openapi/analyzerModule/analyzerModule.d.ts +18 -3
- package/dist/openapi/analyzerModule/analyzerModule.d.ts.map +1 -1
- package/dist/openapi/analyzerModule/analyzerModule.mjs +168 -112
- package/dist/openapi/analyzerModule/analyzerModule.mjs.map +1 -1
- package/dist/openapi/analyzerModule/analyzerWorker.cjs +2 -0
- package/dist/openapi/analyzerModule/analyzerWorker.cjs.map +1 -0
- package/dist/openapi/analyzerModule/analyzerWorker.d.ts +2 -0
- package/dist/openapi/analyzerModule/analyzerWorker.d.ts.map +1 -0
- package/dist/openapi/analyzerModule/analyzerWorker.mjs +44 -0
- package/dist/openapi/analyzerModule/analyzerWorker.mjs.map +1 -0
- package/dist/openapi/analyzerModule/nodeParsers.cjs +1 -1
- package/dist/openapi/analyzerModule/nodeParsers.cjs.map +1 -1
- package/dist/openapi/analyzerModule/nodeParsers.d.ts.map +1 -1
- package/dist/openapi/analyzerModule/nodeParsers.mjs +199 -264
- package/dist/openapi/analyzerModule/nodeParsers.mjs.map +1 -1
- package/dist/openapi/analyzerModule/parseEndpoint.cjs +1 -1
- package/dist/openapi/analyzerModule/parseEndpoint.cjs.map +1 -1
- package/dist/openapi/analyzerModule/parseEndpoint.d.ts +8 -1
- package/dist/openapi/analyzerModule/parseEndpoint.d.ts.map +1 -1
- package/dist/openapi/analyzerModule/parseEndpoint.mjs +121 -106
- package/dist/openapi/analyzerModule/parseEndpoint.mjs.map +1 -1
- package/dist/openapi/analyzerModule/test/TestCase.d.ts +1 -0
- package/dist/openapi/analyzerModule/test/TestCase.d.ts.map +1 -1
- package/dist/openapi/analyzerModule/test/workerGlobalSetup.d.ts +3 -0
- package/dist/openapi/analyzerModule/test/workerGlobalSetup.d.ts.map +1 -0
- package/dist/openapi/analyzerModule/workerPaths.d.ts +2 -0
- package/dist/openapi/analyzerModule/workerPaths.d.ts.map +1 -0
- package/dist/openapi/analyzerModule/workerPool.cjs +2 -0
- package/dist/openapi/analyzerModule/workerPool.cjs.map +1 -0
- package/dist/openapi/analyzerModule/workerPool.d.ts +33 -0
- package/dist/openapi/analyzerModule/workerPool.d.ts.map +1 -0
- package/dist/openapi/analyzerModule/workerPool.mjs +46 -0
- package/dist/openapi/analyzerModule/workerPool.mjs.map +1 -0
- package/package.json +1 -1
- package/src/openapi/analyzerModule/analyzerModule.ts +198 -25
- package/src/openapi/analyzerModule/analyzerWorker.ts +73 -0
- package/src/openapi/analyzerModule/nodeParsers.ts +4 -104
- package/src/openapi/analyzerModule/parseEndpoint.ts +31 -9
- package/src/openapi/analyzerModule/test/TestCase.ts +1 -0
- package/src/openapi/analyzerModule/test/openApiAnalyzer.spec.ts +2 -2
- package/src/openapi/analyzerModule/test/openApiAnalyzer.zod.spec.data.ts +6 -0
- package/src/openapi/analyzerModule/test/openApiAnalyzer.zod.spec.ts +9 -1
- package/src/openapi/analyzerModule/test/workerGlobalSetup.ts +25 -0
- package/src/openapi/analyzerModule/workerPaths.ts +4 -0
- package/src/openapi/analyzerModule/workerPool.ts +92 -0
- package/src/test/app.spec.ts +10 -1
- package/vite.config.ts +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyzerModule.mjs","sources":["../../../src/openapi/analyzerModule/analyzerModule.ts"],"sourcesContent":["import * as path from 'path'\nimport { SourceFile, SyntaxKind } from 'ts-morph'\nimport { Project } from 'ts-morph'\n\nimport { Logger } from '../../utils/logger'\nimport { discoverImportedName } from '../discoveryModule/discoverImports/discoverImports'\nimport {\n\tDiscoveredSourceFile,\n\tdiscoverRouterFiles,\n} from '../discoveryModule/discoverRouterFiles/discoverRouterFiles'\nimport { discoverRouters } from '../discoveryModule/discoverRouters/discoverRouters'\nimport { ApiDocsHeader, OpenApiManager } from '../manager/OpenApiManager'\nimport { EndpointData, ExposedModelData } from '../types'\nimport { getSourceFileTimestamp, TimestampCache } from './getSourceFileTimestamp'\nimport { getValuesOfObjectLiteral, resolveEndpointPath } from './nodeParsers'\nimport { parseEndpoint } from './parseEndpoint'\nimport { parseExposedModel, parseNamedExposedModels } from './parseExposedModels'\nimport { SourceFileCache } from './sourceFileCache'\n\ntype Props = {\n\tlogLevel?: Parameters<(typeof Logger)['setLevel']>[0]\n\ttsconfigPath: string\n\tsourceFilePaths?: string[]\n\tsourceFileDiscovery?: boolean | FileDiscoveryConfig\n\tincremental?:\n\t\t| boolean\n\t\t| {\n\t\t\t\tcachePath: string\n\t\t }\n}\n\ntype FileDiscoveryConfig = {\n\trootPath: string\n}\n\n/**\n * @param tsconfigPath Path to tsconfig file relative to project root\n * @param sourceFilePaths Array of router source files relative to project root\n */\nexport const prepareOpenApiSpec = ({\n\tlogLevel,\n\ttsconfigPath,\n\tsourceFilePaths,\n\tsourceFileDiscovery,\n\tincremental,\n}: Props) => {\n\tconst openApiManager = OpenApiManager.getInstance()\n\n\tif (openApiManager.isReady()) {\n\t\treturn\n\t}\n\n\tif (logLevel) {\n\t\tLogger.setLevel(logLevel)\n\t}\n\n\tLogger.info('Preparing OpenAPI spec')\n\n\tconst project = new Project({\n\t\ttsConfigFilePath: path.resolve(tsconfigPath),\n\t\tskipFileDependencyResolution: true,\n\t})\n\n\tconst { explicitRouters, discoveredRouterFiles, allSourceFiles } = (() => {\n\t\tconst sourceFilesToAdd = sourceFilePaths ?? []\n\t\tconst resolvedSourceFilePaths = sourceFilesToAdd.map((filepath) => path.resolve(filepath))\n\t\tconst sourceFiles = resolvedSourceFilePaths.map((filePath) => project.getSourceFileOrThrow(filePath))\n\t\tconst explicitRouters = sourceFiles.flatMap((file) => ({\n\t\t\tfileName: file.getFilePath(),\n\t\t\tsourceFile: file,\n\t\t\trouters: discoverRouters(file),\n\t\t}))\n\n\t\tconst { discoveredRouterFiles, discoveredSourceFiles } = (() => {\n\t\t\tif (sourceFileDiscovery === false) {\n\t\t\t\treturn { discoveredRouterFiles: [], discoveredSourceFiles: [] }\n\t\t\t}\n\n\t\t\tconst startTime = performance.now()\n\t\t\tconst files = discoverRouterFiles({\n\t\t\t\ttargetPath: typeof sourceFileDiscovery === 'object' ? sourceFileDiscovery.rootPath : '.',\n\t\t\t\ttsConfigPath: tsconfigPath,\n\t\t\t})\n\t\t\tLogger.info(`File discovery took ${Math.round(performance.now() - startTime)}ms`)\n\t\t\treturn files\n\t\t})()\n\n\t\tconst allSourceFiles = sourceFiles.reduce(\n\t\t\t(acc, current) =>\n\t\t\t\tacc.some((r) => r.getFilePath() === current.getFilePath()) ? acc : acc.concat(current),\n\t\t\tdiscoveredSourceFiles,\n\t\t)\n\n\t\treturn { explicitRouters, discoveredRouterFiles, allSourceFiles }\n\t})()\n\n\tconst filesToAnalyze = explicitRouters.reduce(\n\t\t(acc, current) => (acc.some((r) => r.fileName === current.fileName) ? acc : acc.concat(current)),\n\t\tdiscoveredRouterFiles,\n\t)\n\n\tconst apiHeaders = allSourceFiles\n\t\t.flatMap((file) => analyzeSourceFileApiHeader(file))\n\t\t.filter((headers) => !!headers)\n\tif (apiHeaders.length > 0 && apiHeaders[0]) {\n\t\topenApiManager.setHeader(apiHeaders[0])\n\t}\n\n\tconst exposedModels = allSourceFiles.flatMap((file) => analyzeSourceFileExposedModels(file))\n\n\topenApiManager.setExposedModels(exposedModels)\n\n\tconst cachePath = (() => {\n\t\tif (typeof incremental === 'object' && incremental.cachePath) {\n\t\t\treturn incremental.cachePath\n\t\t}\n\t\treturn path.resolve(process.cwd(), 'node_modules', '.cache', 'moonflower')\n\t})()\n\tconst endpoints = analyzeMultipleSourceFiles(filesToAnalyze, {\n\t\tincremental: incremental !== false,\n\t\tcachePath,\n\t\ttimestampCache: {},\n\t})\n\n\topenApiManager.setStats({\n\t\tdiscoveredRouterFiles: discoveredRouterFiles.map((file) => ({\n\t\t\tpath: file.fileName,\n\t\t\trouters: file.routers.named.map((r) => ({\n\t\t\t\tname: r,\n\t\t\t\tendpoints: endpoints\n\t\t\t\t\t.filter((e) => e.sourceFilePath === file.fileName)\n\t\t\t\t\t.map((e) => `${e.method.toUpperCase()} ${e.path}`),\n\t\t\t})),\n\t\t})),\n\t\texplicitRouterFiles: explicitRouters.map((file) => ({\n\t\t\tpath: file.fileName,\n\t\t\trouters: file.routers.named.map((r) => ({\n\t\t\t\tname: r,\n\t\t\t\tendpoints: endpoints\n\t\t\t\t\t.filter((e) => e.sourceFilePath === file.fileName)\n\t\t\t\t\t.map((e) => `${e.method.toUpperCase()} ${e.path}`),\n\t\t\t})),\n\t\t})),\n\t})\n\n\topenApiManager.setEndpoints(endpoints)\n\topenApiManager.markAsReady()\n}\n\nexport const analyzeMultipleSourceFiles = (\n\tfiles: DiscoveredSourceFile[],\n\tconfig: {\n\t\tincremental: boolean\n\t\tcachePath: string\n\t\ttimestampCache: TimestampCache\n\t},\n\tfilterEndpointPaths?: string[],\n): EndpointData[] => {\n\tconst startTime = performance.now()\n\tconst analyzedFiles = files.map((file) => analyzeSourceFileWithCache(file, config, filterEndpointPaths))\n\tLogger.info(`Router analysis took ${Math.round(performance.now() - startTime)}ms`)\n\n\tanalyzedFiles\n\t\t.map((f, index) => ({\n\t\t\tfileName: files[index].fileName,\n\t\t\ttimeTaken: f.timing,\n\t\t}))\n\t\t.sort((a, b) => b.timeTaken - a.timeTaken)\n\t\t.filter((t) => t.timeTaken > 500)\n\t\t.forEach((t) => {\n\t\t\tLogger.info(`- [${t.fileName}] Took ${Math.round(t.timeTaken)}ms to analyze`)\n\t\t})\n\n\treturn analyzedFiles.flatMap((f) => f.endpoints)\n}\n\nexport const analyzeSourceFileWithCache = (\n\tfile: DiscoveredSourceFile,\n\tconfig: {\n\t\tincremental: boolean\n\t\tcachePath: string\n\t\ttimestampCache: TimestampCache\n\t},\n\tfilterEndpointPaths?: string[],\n): { endpoints: EndpointData[]; timing: number } => {\n\tconst timestamp = getSourceFileTimestamp(file.sourceFile, config.timestampCache)\n\tconst cachedResults = SourceFileCache.getCachedResults(file.sourceFile, timestamp, config.cachePath)\n\n\tif (cachedResults) {\n\t\tLogger.debug(`[${file.fileName}] Found cached results`)\n\t\treturn { endpoints: cachedResults.endpoints, timing: 0 }\n\t}\n\tLogger.debug(`[${file.fileName}] Analyzing...`)\n\n\tconst t1 = performance.now()\n\tconst endpoints = analyzeSourceFileEndpoints(file, filterEndpointPaths)\n\tconst t2 = performance.now()\n\tLogger.debug(`[${file.fileName}] Analyzed in ${t2 - t1}ms`)\n\tSourceFileCache.cacheResults(file.sourceFile, timestamp, config.cachePath, endpoints)\n\treturn { endpoints, timing: t2 - t1 }\n}\n\nexport const analyzeSourceFileEndpoints = (\n\tfile: DiscoveredSourceFile,\n\tfilterEndpointPaths?: string[],\n): EndpointData[] => {\n\tconst endpoints: EndpointData[] = []\n\tconst operations = ['get', 'post', 'put', 'delete', 'del', 'patch']\n\tconst joinedOperations = operations.join('|')\n\n\tfile.routers.named.forEach((routerName) => {\n\t\tconst routerPattern = new RegExp(`${routerName}\\\\.(?:${joinedOperations})`)\n\t\tfile.sourceFile.forEachChild((node) => {\n\t\t\tconst nodeText = node.getText()\n\n\t\t\tif (routerPattern.test(nodeText)) {\n\t\t\t\tconst endpointPath = resolveEndpointPath(node) ?? ''\n\n\t\t\t\tif (filterEndpointPaths && !filterEndpointPaths.some((path) => endpointPath.includes(path))) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tendpoints.push(parseEndpoint(node, file.fileName))\n\t\t\t}\n\t\t})\n\t})\n\n\treturn endpoints\n}\n\nexport const analyzeSourceFileApiHeader = (sourceFile: SourceFile): ApiDocsHeader | null => {\n\tconst nameOfUseApiHeader = discoverImportedName({\n\t\tsourceFile,\n\t\toriginalName: 'useApiHeader',\n\t})\n\n\tif (!nameOfUseApiHeader) {\n\t\treturn null\n\t}\n\n\tconst node = sourceFile\n\t\t.forEachChildAsArray()\n\t\t.filter((node) => node.isKind(SyntaxKind.ExpressionStatement))\n\t\t.find((node) => nameOfUseApiHeader && node.getText().startsWith(nameOfUseApiHeader))\n\n\tif (!node) {\n\t\treturn null\n\t}\n\n\tconst targetNode = node.getFirstDescendantByKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n\tconst values = getValuesOfObjectLiteral(targetNode)\n\n\tconst collapseObject = (v: string | string[] | typeof values): any => {\n\t\tif (typeof v === 'string') {\n\t\t\treturn v\n\t\t}\n\t\tif (Array.isArray(v) && v.every((value) => typeof value === 'string')) {\n\t\t\treturn v\n\t\t}\n\n\t\treturn v.reduce((acc, current) => {\n\t\t\tif (typeof current === 'string') {\n\t\t\t\treturn acc\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[current.identifier]: collapseObject(current.value as string[]),\n\t\t\t}\n\t\t}, {})\n\t}\n\treturn collapseObject(values)\n}\n\nexport const analyzeSourceFileExposedModels = (sourceFile: SourceFile): ExposedModelData[] => {\n\tconst models: ExposedModelData[] = []\n\n\tconst nameOfUseExposeApiModel = discoverImportedName({\n\t\tsourceFile,\n\t\toriginalName: 'useExposeApiModel',\n\t})\n\n\tconst nameOfUseExposeNamedApiModels = discoverImportedName({\n\t\tsourceFile,\n\t\toriginalName: 'useExposeNamedApiModels',\n\t})\n\n\tsourceFile\n\t\t.forEachChildAsArray()\n\t\t.filter((node) => node.isKind(SyntaxKind.ExpressionStatement))\n\t\t.map((node) => {\n\t\t\tif (nameOfUseExposeApiModel && node.getText().startsWith(nameOfUseExposeApiModel)) {\n\t\t\t\tconst callExpressionNode = node.getFirstChild()\n\t\t\t\tconst syntaxListChildren = callExpressionNode?.getChildrenOfKind(SyntaxKind.SyntaxList) || []\n\n\t\t\t\tconst firstChild = syntaxListChildren[0].getFirstChild()\n\t\t\t\tif (!firstChild) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tmodels.push(parseExposedModel(firstChild))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (nameOfUseExposeNamedApiModels && node.getText().startsWith(nameOfUseExposeNamedApiModels)) {\n\t\t\t\tconst callExpressionNode = node.getFirstChild()\n\t\t\t\tconst syntaxListChildren = callExpressionNode?.getChildrenOfKind(SyntaxKind.SyntaxList) || []\n\n\t\t\t\tconst firstChild = syntaxListChildren[0].getFirstChild()\n\t\t\t\tif (!firstChild) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst parsedModels = parseNamedExposedModels(firstChild)\n\t\t\t\tparsedModels.forEach((model) => models.push(model))\n\t\t\t}\n\t\t})\n\treturn models\n}\n"],"names":["prepareOpenApiSpec","logLevel","tsconfigPath","sourceFilePaths","sourceFileDiscovery","incremental","openApiManager","OpenApiManager","Logger","project","Project","path","explicitRouters","discoveredRouterFiles","allSourceFiles","sourceFiles","filepath","filePath","file","discoverRouters","discoveredSourceFiles","startTime","files","discoverRouterFiles","acc","current","r","filesToAnalyze","apiHeaders","analyzeSourceFileApiHeader","headers","exposedModels","analyzeSourceFileExposedModels","cachePath","endpoints","analyzeMultipleSourceFiles","e","config","filterEndpointPaths","analyzedFiles","analyzeSourceFileWithCache","f","index","a","b","t","timestamp","getSourceFileTimestamp","cachedResults","SourceFileCache","t1","analyzeSourceFileEndpoints","t2","joinedOperations","routerName","routerPattern","node","nodeText","resolveEndpointPath","parseEndpoint","sourceFile","nameOfUseApiHeader","discoverImportedName","SyntaxKind","targetNode","values","getValuesOfObjectLiteral","collapseObject","v","value","models","nameOfUseExposeApiModel","nameOfUseExposeNamedApiModels","firstChild","parseExposedModel","parseNamedExposedModels","model"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"analyzerModule.mjs","sources":["../../../src/openapi/analyzerModule/analyzerModule.ts"],"sourcesContent":["import crypto from 'crypto'\nimport { existsSync } from 'fs'\nimport * as path from 'path'\nimport { fileURLToPath } from 'url'\n\nfunction resolveWorkerUrl(): URL {\n\tconst candidates = ['./analyzerWorker.mjs', './analyzerWorker.test.mjs']\n\tfor (const candidate of candidates) {\n\t\tconst url = new URL(candidate, import.meta.url)\n\t\tif (existsSync(fileURLToPath(url))) {\n\t\t\treturn url\n\t\t}\n\t}\n\tthrow new Error(\n\t\t'analyzerWorker.mjs not found. Run yarn build, or run tests via yarn test (which compiles the worker first).',\n\t)\n}\nimport { SourceFile, SyntaxKind } from 'ts-morph'\nimport { Project } from 'ts-morph'\n\nimport { Logger } from '../../utils/logger'\nimport { discoverImportedName } from '../discoveryModule/discoverImports/discoverImports'\nimport {\n\tDiscoveredSourceFile,\n\tdiscoverRouterFiles,\n} from '../discoveryModule/discoverRouterFiles/discoverRouterFiles'\nimport { discoverRouters } from '../discoveryModule/discoverRouters/discoverRouters'\nimport { ApiDocsHeader, OpenApiManager } from '../manager/OpenApiManager'\nimport { EndpointData, ExposedModelData } from '../types'\nimport { getSourceFileTimestamp, TimestampCache } from './getSourceFileTimestamp'\nimport { getValuesOfObjectLiteral, resolveEndpointPath } from './nodeParsers'\nimport { parseEndpoint, SectionTiming } from './parseEndpoint'\nimport { parseExposedModel, parseNamedExposedModels } from './parseExposedModels'\nimport { SourceFileCache } from './sourceFileCache'\nimport { WorkerPool, WorkerResult, WorkerTask } from './workerPool'\n\ntype Props = {\n\tlogLevel?: Parameters<(typeof Logger)['setLevel']>[0]\n\ttsconfigPath: string\n\tsourceFilePaths?: string[]\n\tsourceFileDiscovery?: boolean | FileDiscoveryConfig\n\tincremental?:\n\t\t| boolean\n\t\t| {\n\t\t\t\tcachePath: string\n\t\t }\n\tprofiling?: 'stats' | 'off' | 'debug'\n}\n\ntype FileDiscoveryConfig = {\n\trootPath: string\n}\n\ntype EndpointTiming = { method: string; path: string; timing: number; sectionTimings: SectionTiming[] }\n\n/**\n * @param tsconfigPath Path to tsconfig file relative to project root\n * @param sourceFilePaths Array of router source files relative to project root\n */\nexport const prepareOpenApiSpec = async ({\n\tlogLevel,\n\ttsconfigPath,\n\tsourceFilePaths,\n\tsourceFileDiscovery,\n\tincremental,\n\tprofiling = 'stats',\n}: Props): Promise<void> => {\n\tconst openApiManager = OpenApiManager.getInstance()\n\n\tif (openApiManager.isReady()) {\n\t\treturn\n\t}\n\n\tif (logLevel) {\n\t\tLogger.setLevel(logLevel)\n\t}\n\n\tLogger.info('Preparing OpenAPI spec')\n\n\tconst project = new Project({\n\t\ttsConfigFilePath: path.resolve(tsconfigPath),\n\t\tskipFileDependencyResolution: true,\n\t})\n\n\tconst { explicitRouters, discoveredRouterFiles, allSourceFiles } = (() => {\n\t\tconst sourceFilesToAdd = sourceFilePaths ?? []\n\t\tconst resolvedSourceFilePaths = sourceFilesToAdd.map((filepath) => path.resolve(filepath))\n\t\tconst sourceFiles = resolvedSourceFilePaths.map((filePath) => project.getSourceFileOrThrow(filePath))\n\t\tconst explicitRouters = sourceFiles.flatMap((file) => ({\n\t\t\tfileName: file.getFilePath(),\n\t\t\tsourceFile: file,\n\t\t\trouters: discoverRouters(file),\n\t\t}))\n\n\t\tconst { discoveredRouterFiles, discoveredSourceFiles } = (() => {\n\t\t\tif (sourceFileDiscovery === false) {\n\t\t\t\treturn { discoveredRouterFiles: [], discoveredSourceFiles: [] }\n\t\t\t}\n\n\t\t\tconst startTime = performance.now()\n\t\t\tconst files = discoverRouterFiles({\n\t\t\t\ttargetPath: typeof sourceFileDiscovery === 'object' ? sourceFileDiscovery.rootPath : '.',\n\t\t\t\ttsConfigPath: tsconfigPath,\n\t\t\t})\n\t\t\tif (profiling !== 'off') {\n\t\t\t\tLogger.info(`File discovery took ${Math.round(performance.now() - startTime)}ms`)\n\t\t\t}\n\t\t\treturn files\n\t\t})()\n\n\t\tconst allSourceFiles = sourceFiles.reduce(\n\t\t\t(acc, current) =>\n\t\t\t\tacc.some((r) => r.getFilePath() === current.getFilePath()) ? acc : acc.concat(current),\n\t\t\tdiscoveredSourceFiles,\n\t\t)\n\n\t\treturn { explicitRouters, discoveredRouterFiles, allSourceFiles }\n\t})()\n\n\tconst filesToAnalyze = explicitRouters.reduce(\n\t\t(acc, current) => (acc.some((r) => r.fileName === current.fileName) ? acc : acc.concat(current)),\n\t\tdiscoveredRouterFiles,\n\t)\n\n\tconst apiHeaders = allSourceFiles\n\t\t.flatMap((file) => analyzeSourceFileApiHeader(file))\n\t\t.filter((headers) => !!headers)\n\tif (apiHeaders.length > 0 && apiHeaders[0]) {\n\t\topenApiManager.setHeader(apiHeaders[0])\n\t}\n\n\tconst exposedModels = allSourceFiles.flatMap((file) => analyzeSourceFileExposedModels(file))\n\n\topenApiManager.setExposedModels(exposedModels)\n\n\tconst cachePath = (() => {\n\t\tif (typeof incremental === 'object' && incremental.cachePath) {\n\t\t\treturn incremental.cachePath\n\t\t}\n\t\treturn path.resolve(process.cwd(), 'node_modules', '.cache', 'moonflower')\n\t})()\n\tconst endpoints = await analyzeMultipleSourceFiles(filesToAnalyze, {\n\t\tincremental: incremental !== false,\n\t\tcachePath,\n\t\ttimestampCache: {},\n\t\tprofiling,\n\t\ttsconfigPath: path.resolve(tsconfigPath),\n\t})\n\n\topenApiManager.setStats({\n\t\tdiscoveredRouterFiles: discoveredRouterFiles.map((file) => ({\n\t\t\tpath: file.fileName,\n\t\t\trouters: file.routers.named.map((r) => ({\n\t\t\t\tname: r,\n\t\t\t\tendpoints: endpoints\n\t\t\t\t\t.filter((e) => e.sourceFilePath === file.fileName)\n\t\t\t\t\t.map((e) => `${e.method.toUpperCase()} ${e.path}`),\n\t\t\t})),\n\t\t})),\n\t\texplicitRouterFiles: explicitRouters.map((file) => ({\n\t\t\tpath: file.fileName,\n\t\t\trouters: file.routers.named.map((r) => ({\n\t\t\t\tname: r,\n\t\t\t\tendpoints: endpoints\n\t\t\t\t\t.filter((e) => e.sourceFilePath === file.fileName)\n\t\t\t\t\t.map((e) => `${e.method.toUpperCase()} ${e.path}`),\n\t\t\t})),\n\t\t})),\n\t})\n\n\topenApiManager.setEndpoints(endpoints)\n\topenApiManager.markAsReady()\n}\n\nexport const analyzeMultipleSourceFiles = async (\n\tfiles: DiscoveredSourceFile[],\n\tconfig: {\n\t\tincremental: boolean\n\t\tcachePath: string\n\t\ttimestampCache: TimestampCache\n\t\tprofiling?: 'stats' | 'off' | 'debug'\n\t\ttsconfigPath: string\n\t},\n\tfilterEndpointPaths?: string[],\n): Promise<EndpointData[]> => {\n\tconst profiling = config.profiling ?? 'stats'\n\tconst startTime = performance.now()\n\n\t// Separate cached files from those needing analysis\n\ttype CachedFile = { endpoints: EndpointData[]; fileName: string; timing: 0; endpointTimings: [] }\n\ttype UncachedFile = { file: DiscoveredSourceFile; timestamp: number }\n\n\tconst cached: CachedFile[] = []\n\tconst uncached: UncachedFile[] = []\n\n\tfor (const file of files) {\n\t\tconst timestamp = getSourceFileTimestamp(file.sourceFile, config.timestampCache)\n\t\tconst hit = config.incremental\n\t\t\t? SourceFileCache.getCachedResults(file.sourceFile, timestamp, config.cachePath)\n\t\t\t: null\n\t\tif (hit) {\n\t\t\tLogger.debug(`[${file.fileName}] Found cached results`)\n\t\t\tcached.push({ endpoints: hit.endpoints, fileName: file.fileName, timing: 0, endpointTimings: [] })\n\t\t} else {\n\t\t\tuncached.push({ file, timestamp })\n\t\t}\n\t}\n\n\tif (uncached.length === 0) {\n\t\tif (profiling !== 'off') {\n\t\t\tLogger.info(`Router analysis took ${Math.round(performance.now() - startTime)}ms`)\n\t\t}\n\t\treturn cached.flatMap((f) => f.endpoints)\n\t}\n\n\t// Build one task per endpoint across all uncached files\n\tconst OPERATIONS = ['get', 'post', 'put', 'delete', 'del', 'patch']\n\tconst operationsPattern = OPERATIONS.join('|')\n\n\ttype FileTask = { task: WorkerTask; fileName: string }\n\tconst allTasks: FileTask[] = []\n\n\tfor (const { file } of uncached) {\n\t\tfor (const routerName of file.routers.named) {\n\t\t\tconst routerPattern = new RegExp(`${routerName}\\\\.(?:${operationsPattern})`)\n\t\t\tlet endpointIndex = 0\n\t\t\tfile.sourceFile.forEachChild((node) => {\n\t\t\t\tconst nodeText = node.getText()\n\t\t\t\tif (routerPattern.test(nodeText)) {\n\t\t\t\t\tif (\n\t\t\t\t\t\t!filterEndpointPaths ||\n\t\t\t\t\t\tfilterEndpointPaths.some((p) => resolveEndpointPath(node)?.includes(p))\n\t\t\t\t\t) {\n\t\t\t\t\t\tallTasks.push({\n\t\t\t\t\t\t\tfileName: file.fileName,\n\t\t\t\t\t\t\ttask: {\n\t\t\t\t\t\t\t\ttaskId: crypto.randomUUID(),\n\t\t\t\t\t\t\t\ttsconfigPath: config.tsconfigPath,\n\t\t\t\t\t\t\t\tsourceFilePath: file.sourceFile.getFilePath(),\n\t\t\t\t\t\t\t\trouterName,\n\t\t\t\t\t\t\t\tendpointIndex,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\tendpointIndex++\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\t// Dispatch all tasks to the worker pool\n\tconst pool = new WorkerPool(resolveWorkerUrl())\n\n\ttype EndpointTiming = { method: string; path: string; timing: number; sectionTimings: SectionTiming[] }\n\ttype FileResult = {\n\t\tendpoints: EndpointData[]\n\t\tfileName: string\n\t\ttiming: number\n\t\tendpointTimings: EndpointTiming[]\n\t}\n\n\tlet results: WorkerResult[]\n\ttry {\n\t\tresults = await pool.runAll(allTasks.map((ft) => ft.task))\n\t} finally {\n\t\tpool.terminate()\n\t}\n\n\t// Group results by file\n\tconst byFile = new Map<string, FileResult>()\n\tfor (const { file } of uncached) {\n\t\tbyFile.set(file.fileName, { endpoints: [], fileName: file.fileName, timing: 0, endpointTimings: [] })\n\t}\n\n\tfor (let i = 0; i < results.length; i++) {\n\t\tconst result = results[i]\n\t\tconst fileName = allTasks[i].fileName\n\t\tconst fileResult = byFile.get(fileName)!\n\n\t\tif ('error' in result) {\n\t\t\tLogger.error(`[${fileName}] Worker error: ${result.error}`)\n\t\t\tcontinue\n\t\t}\n\n\t\tfileResult.endpoints.push(result.endpoint)\n\t\tfileResult.timing += result.timing\n\t\tfileResult.endpointTimings.push({\n\t\t\tmethod: result.endpoint.method,\n\t\t\tpath: result.endpoint.path,\n\t\t\ttiming: result.timing,\n\t\t\tsectionTimings: result.sectionTimings,\n\t\t})\n\t}\n\n\t// Write cache for each uncached file\n\tfor (const { file, timestamp } of uncached) {\n\t\tconst fileResult = byFile.get(file.fileName)!\n\t\tif (fileResult.endpoints.length > 0) {\n\t\t\tSourceFileCache.cacheResults(file.sourceFile, timestamp, config.cachePath, fileResult.endpoints)\n\t\t}\n\t}\n\n\tconst analyzedFiles = [...cached, ...Array.from(byFile.values())]\n\n\tif (profiling !== 'off') {\n\t\tLogger.info(`Router analysis took ${Math.round(performance.now() - startTime)}ms`)\n\t}\n\n\tif (profiling === 'stats') {\n\t\tanalyzedFiles\n\t\t\t.map((f) => ({ fileName: f.fileName, timeTaken: f.timing }))\n\t\t\t.sort((a, b) => b.timeTaken - a.timeTaken)\n\t\t\t.filter((t) => t.timeTaken > 500)\n\t\t\t.forEach((t) => {\n\t\t\t\tLogger.info(`- [${t.fileName}] Took ${Math.round(t.timeTaken)}ms to analyze`)\n\t\t\t})\n\t} else if (profiling === 'debug') {\n\t\tanalyzedFiles\n\t\t\t.map((f) => ({ fileName: f.fileName, timeTaken: f.timing, endpointTimings: f.endpointTimings }))\n\t\t\t.sort((a, b) => b.timeTaken - a.timeTaken)\n\t\t\t.forEach((t) => {\n\t\t\t\tLogger.info(`- [${t.fileName}] Took ${Math.round(t.timeTaken)}ms to analyze`)\n\t\t\t\tt.endpointTimings\n\t\t\t\t\t.sort((a, b) => b.timing - a.timing)\n\t\t\t\t\t.forEach((ep) => {\n\t\t\t\t\t\tLogger.info(` - ${ep.method} ${ep.path} (${Math.round(ep.timing)}ms)`)\n\t\t\t\t\t\tep.sectionTimings\n\t\t\t\t\t\t\t.filter((s) => s.timing >= 1)\n\t\t\t\t\t\t\t.sort((a, b) => b.timing - a.timing)\n\t\t\t\t\t\t\t.forEach((s) => {\n\t\t\t\t\t\t\t\tLogger.info(` - ${s.section}: ${Math.round(s.timing)}ms`)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t})\n\t}\n\n\treturn analyzedFiles.flatMap((f) => f.endpoints)\n}\n\nexport const analyzeSourceFileWithCache = (\n\tfile: DiscoveredSourceFile,\n\tconfig: {\n\t\tincremental: boolean\n\t\tcachePath: string\n\t\ttimestampCache: TimestampCache\n\t\tprofiling?: 'stats' | 'off' | 'debug'\n\t},\n\tfilterEndpointPaths?: string[],\n): { endpoints: EndpointData[]; timing: number; endpointTimings: EndpointTiming[] } => {\n\tconst timestamp = getSourceFileTimestamp(file.sourceFile, config.timestampCache)\n\tconst cachedResults = SourceFileCache.getCachedResults(file.sourceFile, timestamp, config.cachePath)\n\n\tif (cachedResults) {\n\t\tLogger.debug(`[${file.fileName}] Found cached results`)\n\t\treturn { endpoints: cachedResults.endpoints, timing: 0, endpointTimings: [] }\n\t}\n\tLogger.debug(`[${file.fileName}] Analyzing...`)\n\n\tconst t1 = performance.now()\n\tconst { endpoints, endpointTimings } = analyzeSourceFileEndpoints(file, filterEndpointPaths)\n\tconst t2 = performance.now()\n\tLogger.debug(`[${file.fileName}] Analyzed in ${t2 - t1}ms`)\n\tSourceFileCache.cacheResults(file.sourceFile, timestamp, config.cachePath, endpoints)\n\treturn { endpoints, timing: t2 - t1, endpointTimings }\n}\n\nexport const analyzeSourceFileEndpoints = (\n\tfile: DiscoveredSourceFile,\n\tfilterEndpointPaths?: string[],\n): { endpoints: EndpointData[]; endpointTimings: EndpointTiming[] } => {\n\tconst endpoints: EndpointData[] = []\n\tconst endpointTimings: EndpointTiming[] = []\n\tconst operations = ['get', 'post', 'put', 'delete', 'del', 'patch']\n\tconst joinedOperations = operations.join('|')\n\n\tfile.routers.named.forEach((routerName) => {\n\t\tconst routerPattern = new RegExp(`${routerName}\\\\.(?:${joinedOperations})`)\n\t\tfile.sourceFile.forEachChild((node) => {\n\t\t\tconst nodeText = node.getText()\n\n\t\t\tif (routerPattern.test(nodeText)) {\n\t\t\t\tconst endpointPath = resolveEndpointPath(node) ?? ''\n\n\t\t\t\tif (filterEndpointPaths && !filterEndpointPaths.some((path) => endpointPath.includes(path))) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst t1 = performance.now()\n\t\t\t\tconst { endpoint, sectionTimings } = parseEndpoint(node, file.fileName)\n\t\t\t\tendpointTimings.push({\n\t\t\t\t\tmethod: endpoint.method,\n\t\t\t\t\tpath: endpoint.path,\n\t\t\t\t\ttiming: performance.now() - t1,\n\t\t\t\t\tsectionTimings,\n\t\t\t\t})\n\t\t\t\tendpoints.push(endpoint)\n\t\t\t}\n\t\t})\n\t})\n\n\treturn { endpoints, endpointTimings }\n}\n\nexport const analyzeSourceFileApiHeader = (sourceFile: SourceFile): ApiDocsHeader | null => {\n\tconst nameOfUseApiHeader = discoverImportedName({\n\t\tsourceFile,\n\t\toriginalName: 'useApiHeader',\n\t})\n\n\tif (!nameOfUseApiHeader) {\n\t\treturn null\n\t}\n\n\tconst node = sourceFile\n\t\t.forEachChildAsArray()\n\t\t.filter((node) => node.isKind(SyntaxKind.ExpressionStatement))\n\t\t.find((node) => nameOfUseApiHeader && node.getText().startsWith(nameOfUseApiHeader))\n\n\tif (!node) {\n\t\treturn null\n\t}\n\n\tconst targetNode = node.getFirstDescendantByKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n\tconst values = getValuesOfObjectLiteral(targetNode)\n\n\tconst collapseObject = (v: string | string[] | typeof values): any => {\n\t\tif (typeof v === 'string') {\n\t\t\treturn v\n\t\t}\n\t\tif (Array.isArray(v) && v.every((value) => typeof value === 'string')) {\n\t\t\treturn v\n\t\t}\n\n\t\treturn v.reduce((acc, current) => {\n\t\t\tif (typeof current === 'string') {\n\t\t\t\treturn acc\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...acc,\n\t\t\t\t[current.identifier]: collapseObject(current.value as string[]),\n\t\t\t}\n\t\t}, {})\n\t}\n\treturn collapseObject(values)\n}\n\nexport const analyzeSourceFileExposedModels = (sourceFile: SourceFile): ExposedModelData[] => {\n\tconst models: ExposedModelData[] = []\n\n\tconst nameOfUseExposeApiModel = discoverImportedName({\n\t\tsourceFile,\n\t\toriginalName: 'useExposeApiModel',\n\t})\n\n\tconst nameOfUseExposeNamedApiModels = discoverImportedName({\n\t\tsourceFile,\n\t\toriginalName: 'useExposeNamedApiModels',\n\t})\n\n\tsourceFile\n\t\t.forEachChildAsArray()\n\t\t.filter((node) => node.isKind(SyntaxKind.ExpressionStatement))\n\t\t.map((node) => {\n\t\t\tif (nameOfUseExposeApiModel && node.getText().startsWith(nameOfUseExposeApiModel)) {\n\t\t\t\tconst callExpressionNode = node.getFirstChild()\n\t\t\t\tconst syntaxListChildren = callExpressionNode?.getChildrenOfKind(SyntaxKind.SyntaxList) || []\n\n\t\t\t\tconst firstChild = syntaxListChildren[0].getFirstChild()\n\t\t\t\tif (!firstChild) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tmodels.push(parseExposedModel(firstChild))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (nameOfUseExposeNamedApiModels && node.getText().startsWith(nameOfUseExposeNamedApiModels)) {\n\t\t\t\tconst callExpressionNode = node.getFirstChild()\n\t\t\t\tconst syntaxListChildren = callExpressionNode?.getChildrenOfKind(SyntaxKind.SyntaxList) || []\n\n\t\t\t\tconst firstChild = syntaxListChildren[0].getFirstChild()\n\t\t\t\tif (!firstChild) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\tconst parsedModels = parseNamedExposedModels(firstChild)\n\t\t\t\tparsedModels.forEach((model) => models.push(model))\n\t\t\t}\n\t\t})\n\treturn models\n}\n"],"names":["resolveWorkerUrl","candidates","candidate","url","existsSync","fileURLToPath","prepareOpenApiSpec","logLevel","tsconfigPath","sourceFilePaths","sourceFileDiscovery","incremental","profiling","openApiManager","OpenApiManager","Logger","project","Project","path","explicitRouters","discoveredRouterFiles","allSourceFiles","sourceFiles","filepath","filePath","file","discoverRouters","discoveredSourceFiles","startTime","files","discoverRouterFiles","acc","current","r","filesToAnalyze","apiHeaders","analyzeSourceFileApiHeader","headers","exposedModels","analyzeSourceFileExposedModels","cachePath","endpoints","analyzeMultipleSourceFiles","e","config","filterEndpointPaths","cached","uncached","timestamp","getSourceFileTimestamp","hit","SourceFileCache","f","operationsPattern","allTasks","routerName","routerPattern","endpointIndex","node","nodeText","crypto","pool","WorkerPool","results","ft","byFile","i","result","fileName","fileResult","analyzedFiles","a","b","t","ep","s","sourceFile","nameOfUseApiHeader","discoverImportedName","SyntaxKind","targetNode","values","getValuesOfObjectLiteral","collapseObject","v","value","models","nameOfUseExposeApiModel","nameOfUseExposeNamedApiModels","firstChild","parseExposedModel","parseNamedExposedModels","model"],"mappings":"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"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";const g=require("ts-morph"),i=require("worker_threads"),f=require("./parseEndpoint.cjs"),h=["get","post","put","delete","del","patch"],I=h.join("|");let s=null,u=null;function F(e){return(!s||u!==e)&&(s=new g.Project({tsConfigFilePath:e,skipFileDependencyResolution:!0}),u=e),s}i.parentPort.on("message",e=>{try{const r=F(e.tsconfigPath);let t=r.getSourceFile(e.sourceFilePath);t||(t=r.addSourceFileAtPath(e.sourceFilePath));const p=new RegExp(`${e.routerName}\\.(?:${I})`);let c=0,n;if(t.forEachChild(o=>{n||p.test(o.getText())&&(c===e.endpointIndex&&(n=o),c++)}),!n){const o={taskId:e.taskId,error:`Endpoint not found: routerName=${e.routerName} index=${e.endpointIndex} in ${e.sourceFilePath}`};i.parentPort.postMessage(o);return}const l=performance.now(),{endpoint:d,sectionTimings:a}=f.parseEndpoint(n,e.sourceFilePath),P={taskId:e.taskId,endpoint:d,sectionTimings:a,timing:performance.now()-l};i.parentPort.postMessage(P)}catch(r){const t={taskId:e.taskId,error:String(r)};i.parentPort.postMessage(t)}});
|
|
2
|
+
//# sourceMappingURL=analyzerWorker.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzerWorker.cjs","sources":["../../../src/openapi/analyzerModule/analyzerWorker.ts"],"sourcesContent":["import { Node, Project, ts } from 'ts-morph'\nimport { parentPort } from 'worker_threads'\n\nimport { parseEndpoint } from './parseEndpoint'\nimport { WorkerResult, WorkerTask } from './workerPool'\n\nconst OPERATIONS = ['get', 'post', 'put', 'delete', 'del', 'patch']\nconst OPERATIONS_PATTERN = OPERATIONS.join('|')\n\nlet project: Project | null = null\nlet currentTsconfigPath: string | null = null\n\nfunction getProject(tsconfigPath: string): Project {\n\tif (!project || currentTsconfigPath !== tsconfigPath) {\n\t\tproject = new Project({\n\t\t\ttsConfigFilePath: tsconfigPath,\n\t\t\tskipFileDependencyResolution: true,\n\t\t})\n\t\tcurrentTsconfigPath = tsconfigPath\n\t}\n\treturn project\n}\n\nparentPort!.on('message', (task: WorkerTask) => {\n\ttry {\n\t\tconst proj = getProject(task.tsconfigPath)\n\n\t\tlet sourceFile = proj.getSourceFile(task.sourceFilePath)\n\t\tif (!sourceFile) {\n\t\t\tsourceFile = proj.addSourceFileAtPath(task.sourceFilePath)\n\t\t}\n\n\t\tconst routerPattern = new RegExp(`${task.routerName}\\\\.(?:${OPERATIONS_PATTERN})`)\n\t\tlet index = 0\n\t\tlet targetNode: Node<ts.Node> | undefined\n\n\t\tsourceFile.forEachChild((node) => {\n\t\t\tif (targetNode) return\n\t\t\tif (routerPattern.test(node.getText())) {\n\t\t\t\tif (index === task.endpointIndex) {\n\t\t\t\t\ttargetNode = node\n\t\t\t\t}\n\t\t\t\tindex++\n\t\t\t}\n\t\t})\n\n\t\tif (!targetNode) {\n\t\t\tconst result: WorkerResult = {\n\t\t\t\ttaskId: task.taskId,\n\t\t\t\terror: `Endpoint not found: routerName=${task.routerName} index=${task.endpointIndex} in ${task.sourceFilePath}`,\n\t\t\t}\n\t\t\tparentPort!.postMessage(result)\n\t\t\treturn\n\t\t}\n\n\t\tconst t1 = performance.now()\n\t\tconst { endpoint, sectionTimings } = parseEndpoint(targetNode, task.sourceFilePath)\n\n\t\tconst result: WorkerResult = {\n\t\t\ttaskId: task.taskId,\n\t\t\tendpoint,\n\t\t\tsectionTimings,\n\t\t\ttiming: performance.now() - t1,\n\t\t}\n\t\tparentPort!.postMessage(result)\n\t} catch (err) {\n\t\tconst result: WorkerResult = {\n\t\t\ttaskId: task.taskId,\n\t\t\terror: String(err),\n\t\t}\n\t\tparentPort!.postMessage(result)\n\t}\n})\n"],"names":["OPERATIONS","OPERATIONS_PATTERN","project","currentTsconfigPath","getProject","tsconfigPath","Project","parentPort","task","proj","sourceFile","routerPattern","index","targetNode","node","result","t1","endpoint","sectionTimings","parseEndpoint","err"],"mappings":"sGAMMA,EAAa,CAAC,MAAO,OAAQ,MAAO,SAAU,MAAO,OAAO,EAC5DC,EAAqBD,EAAW,KAAK,GAAG,EAE9C,IAAIE,EAA0B,KAC1BC,EAAqC,KAEzC,SAASC,EAAWC,EAA+B,CAC9C,OAAA,CAACH,GAAWC,IAAwBE,KACvCH,EAAU,IAAII,EAAAA,QAAQ,CACrB,iBAAkBD,EAClB,6BAA8B,EAAA,CAC9B,EACqBF,EAAAE,GAEhBH,CACR,CAEAK,EAAAA,WAAY,GAAG,UAAYC,GAAqB,CAC3C,GAAA,CACG,MAAAC,EAAOL,EAAWI,EAAK,YAAY,EAEzC,IAAIE,EAAaD,EAAK,cAAcD,EAAK,cAAc,EAClDE,IACSA,EAAAD,EAAK,oBAAoBD,EAAK,cAAc,GAGpD,MAAAG,EAAgB,IAAI,OAAO,GAAGH,EAAK,UAAU,SAASP,CAAkB,GAAG,EACjF,IAAIW,EAAQ,EACRC,EAYJ,GAVWH,EAAA,aAAcI,GAAS,CAC7BD,GACAF,EAAc,KAAKG,EAAK,QAAS,CAAA,IAChCF,IAAUJ,EAAK,gBACLK,EAAAC,GAEdF,IACD,CACA,EAEG,CAACC,EAAY,CAChB,MAAME,EAAuB,CAC5B,OAAQP,EAAK,OACb,MAAO,kCAAkCA,EAAK,UAAU,UAAUA,EAAK,aAAa,OAAOA,EAAK,cAAc,EAC/G,EACAD,EAAA,WAAY,YAAYQ,CAAM,EAC9B,MAAA,CAGK,MAAAC,EAAK,YAAY,IAAI,EACrB,CAAE,SAAAC,EAAU,eAAAC,GAAmBC,EAAc,cAAAN,EAAYL,EAAK,cAAc,EAE5EO,EAAuB,CAC5B,OAAQP,EAAK,OACb,SAAAS,EACA,eAAAC,EACA,OAAQ,YAAY,MAAQF,CAC7B,EACAT,EAAA,WAAY,YAAYQ,CAAM,QACtBK,EAAK,CACb,MAAML,EAAuB,CAC5B,OAAQP,EAAK,OACb,MAAO,OAAOY,CAAG,CAClB,EACAb,EAAA,WAAY,YAAYQ,CAAM,CAAA,CAEhC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzerWorker.d.ts","sourceRoot":"","sources":["../../../src/openapi/analyzerModule/analyzerWorker.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Project as g } from "ts-morph";
|
|
2
|
+
import { parentPort as i } from "worker_threads";
|
|
3
|
+
import { parseEndpoint as m } from "./parseEndpoint.mjs";
|
|
4
|
+
const P = ["get", "post", "put", "delete", "del", "patch"], h = P.join("|");
|
|
5
|
+
let s = null, l = null;
|
|
6
|
+
function I(e) {
|
|
7
|
+
return (!s || l !== e) && (s = new g({
|
|
8
|
+
tsConfigFilePath: e,
|
|
9
|
+
skipFileDependencyResolution: !0
|
|
10
|
+
}), l = e), s;
|
|
11
|
+
}
|
|
12
|
+
i.on("message", (e) => {
|
|
13
|
+
try {
|
|
14
|
+
const r = I(e.tsconfigPath);
|
|
15
|
+
let t = r.getSourceFile(e.sourceFilePath);
|
|
16
|
+
t || (t = r.addSourceFileAtPath(e.sourceFilePath));
|
|
17
|
+
const u = new RegExp(`${e.routerName}\\.(?:${h})`);
|
|
18
|
+
let c = 0, o;
|
|
19
|
+
if (t.forEachChild((n) => {
|
|
20
|
+
o || u.test(n.getText()) && (c === e.endpointIndex && (o = n), c++);
|
|
21
|
+
}), !o) {
|
|
22
|
+
const n = {
|
|
23
|
+
taskId: e.taskId,
|
|
24
|
+
error: `Endpoint not found: routerName=${e.routerName} index=${e.endpointIndex} in ${e.sourceFilePath}`
|
|
25
|
+
};
|
|
26
|
+
i.postMessage(n);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const p = performance.now(), { endpoint: d, sectionTimings: a } = m(o, e.sourceFilePath), f = {
|
|
30
|
+
taskId: e.taskId,
|
|
31
|
+
endpoint: d,
|
|
32
|
+
sectionTimings: a,
|
|
33
|
+
timing: performance.now() - p
|
|
34
|
+
};
|
|
35
|
+
i.postMessage(f);
|
|
36
|
+
} catch (r) {
|
|
37
|
+
const t = {
|
|
38
|
+
taskId: e.taskId,
|
|
39
|
+
error: String(r)
|
|
40
|
+
};
|
|
41
|
+
i.postMessage(t);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=analyzerWorker.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzerWorker.mjs","sources":["../../../src/openapi/analyzerModule/analyzerWorker.ts"],"sourcesContent":["import { Node, Project, ts } from 'ts-morph'\nimport { parentPort } from 'worker_threads'\n\nimport { parseEndpoint } from './parseEndpoint'\nimport { WorkerResult, WorkerTask } from './workerPool'\n\nconst OPERATIONS = ['get', 'post', 'put', 'delete', 'del', 'patch']\nconst OPERATIONS_PATTERN = OPERATIONS.join('|')\n\nlet project: Project | null = null\nlet currentTsconfigPath: string | null = null\n\nfunction getProject(tsconfigPath: string): Project {\n\tif (!project || currentTsconfigPath !== tsconfigPath) {\n\t\tproject = new Project({\n\t\t\ttsConfigFilePath: tsconfigPath,\n\t\t\tskipFileDependencyResolution: true,\n\t\t})\n\t\tcurrentTsconfigPath = tsconfigPath\n\t}\n\treturn project\n}\n\nparentPort!.on('message', (task: WorkerTask) => {\n\ttry {\n\t\tconst proj = getProject(task.tsconfigPath)\n\n\t\tlet sourceFile = proj.getSourceFile(task.sourceFilePath)\n\t\tif (!sourceFile) {\n\t\t\tsourceFile = proj.addSourceFileAtPath(task.sourceFilePath)\n\t\t}\n\n\t\tconst routerPattern = new RegExp(`${task.routerName}\\\\.(?:${OPERATIONS_PATTERN})`)\n\t\tlet index = 0\n\t\tlet targetNode: Node<ts.Node> | undefined\n\n\t\tsourceFile.forEachChild((node) => {\n\t\t\tif (targetNode) return\n\t\t\tif (routerPattern.test(node.getText())) {\n\t\t\t\tif (index === task.endpointIndex) {\n\t\t\t\t\ttargetNode = node\n\t\t\t\t}\n\t\t\t\tindex++\n\t\t\t}\n\t\t})\n\n\t\tif (!targetNode) {\n\t\t\tconst result: WorkerResult = {\n\t\t\t\ttaskId: task.taskId,\n\t\t\t\terror: `Endpoint not found: routerName=${task.routerName} index=${task.endpointIndex} in ${task.sourceFilePath}`,\n\t\t\t}\n\t\t\tparentPort!.postMessage(result)\n\t\t\treturn\n\t\t}\n\n\t\tconst t1 = performance.now()\n\t\tconst { endpoint, sectionTimings } = parseEndpoint(targetNode, task.sourceFilePath)\n\n\t\tconst result: WorkerResult = {\n\t\t\ttaskId: task.taskId,\n\t\t\tendpoint,\n\t\t\tsectionTimings,\n\t\t\ttiming: performance.now() - t1,\n\t\t}\n\t\tparentPort!.postMessage(result)\n\t} catch (err) {\n\t\tconst result: WorkerResult = {\n\t\t\ttaskId: task.taskId,\n\t\t\terror: String(err),\n\t\t}\n\t\tparentPort!.postMessage(result)\n\t}\n})\n"],"names":["OPERATIONS","OPERATIONS_PATTERN","project","currentTsconfigPath","getProject","tsconfigPath","Project","parentPort","task","proj","sourceFile","routerPattern","index","targetNode","node","result","t1","endpoint","sectionTimings","parseEndpoint","err"],"mappings":";;;AAMA,MAAMA,IAAa,CAAC,OAAO,QAAQ,OAAO,UAAU,OAAO,OAAO,GAC5DC,IAAqBD,EAAW,KAAK,GAAG;AAE9C,IAAIE,IAA0B,MAC1BC,IAAqC;AAEzC,SAASC,EAAWC,GAA+B;AAC9C,UAAA,CAACH,KAAWC,MAAwBE,OACvCH,IAAU,IAAII,EAAQ;AAAA,IACrB,kBAAkBD;AAAA,IAClB,8BAA8B;AAAA,EAAA,CAC9B,GACqBF,IAAAE,IAEhBH;AACR;AAEAK,EAAY,GAAG,WAAW,CAACC,MAAqB;AAC3C,MAAA;AACG,UAAAC,IAAOL,EAAWI,EAAK,YAAY;AAEzC,QAAIE,IAAaD,EAAK,cAAcD,EAAK,cAAc;AACvD,IAAKE,MACSA,IAAAD,EAAK,oBAAoBD,EAAK,cAAc;AAGpD,UAAAG,IAAgB,IAAI,OAAO,GAAGH,EAAK,UAAU,SAASP,CAAkB,GAAG;AACjF,QAAIW,IAAQ,GACRC;AAYJ,QAVWH,EAAA,aAAa,CAACI,MAAS;AACjC,MAAID,KACAF,EAAc,KAAKG,EAAK,QAAS,CAAA,MAChCF,MAAUJ,EAAK,kBACLK,IAAAC,IAEdF;AAAA,IACD,CACA,GAEG,CAACC,GAAY;AAChB,YAAME,IAAuB;AAAA,QAC5B,QAAQP,EAAK;AAAA,QACb,OAAO,kCAAkCA,EAAK,UAAU,UAAUA,EAAK,aAAa,OAAOA,EAAK,cAAc;AAAA,MAC/G;AACA,MAAAD,EAAY,YAAYQ,CAAM;AAC9B;AAAA,IAAA;AAGK,UAAAC,IAAK,YAAY,IAAI,GACrB,EAAE,UAAAC,GAAU,gBAAAC,MAAmBC,EAAcN,GAAYL,EAAK,cAAc,GAE5EO,IAAuB;AAAA,MAC5B,QAAQP,EAAK;AAAA,MACb,UAAAS;AAAA,MACA,gBAAAC;AAAA,MACA,QAAQ,YAAY,QAAQF;AAAA,IAC7B;AACA,IAAAT,EAAY,YAAYQ,CAAM;AAAA,WACtBK,GAAK;AACb,UAAML,IAAuB;AAAA,MAC5B,QAAQP,EAAK;AAAA,MACb,OAAO,OAAOY,CAAG;AAAA,IAClB;AACA,IAAAb,EAAY,YAAYQ,CAAM;AAAA,EAAA;AAEhC,CAAC;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("ts-morph"),x=require("../../utils/logger.cjs"),j=require("../manager/OpenApiManager.cjs"),L=new WeakMap,_=new WeakMap,R=new WeakMap,c=e=>{const n=L.get(e);if(n)return n;if(e.getKind()===t.SyntaxKind.Identifier){const i=e.asKind(t.SyntaxKind.Identifier).getImplementations()[0]?.getNode();if(i){const o=i.getParent().getLastChild();if(o===e)throw new Error("Recursive implementation found");const g=c(o);return L.set(e,g),g}const s=e.asKind(t.SyntaxKind.Identifier).getDefinitions()[0]?.getNode();if(s){const o=s.getParent().getLastChild();if(o===e)throw new Error("Recursive implementation found");const g=c(o);return L.set(e,g),g}throw new Error("No implementation nor definition available")}return L.set(e,e),e},N=e=>{const n=e.getChildrenOfKind(t.SyntaxKind.Identifier);return n.length===2?c(n[1]):e.getChildren().reverse().find(s=>s.getKind()!==t.SyntaxKind.GreaterThanToken&&s.getKind()!==t.SyntaxKind.CommaToken&&s.getKind()!==t.SyntaxKind.SemicolonToken)},b=e=>{const n=e.getFirstChildByKind(t.SyntaxKind.SyntaxList);return n.isKind(t.SyntaxKind.SyntaxList)?f(n.getFirstChild()):f(n)},f=e=>{const n=_.get(e);if(n!==void 0)return n;const i=M(e);return _.set(e,i),i},M=e=>{const n=e.getSymbol()?.getName();if(n&&j.OpenApiManager.getInstance().hasExposedModel(n))return[{role:"ref",shape:n,optional:!1}];const i=c(e);if(i.asKind(t.SyntaxKind.UndefinedKeyword))return"undefined";const l=i.asKind(t.SyntaxKind.LiteralType);if(l){if(l.getFirstChildByKind(t.SyntaxKind.TrueKeyword))return"true";if(l.getFirstChildByKind(t.SyntaxKind.FalseKeyword))return"false"}if(i.asKind(t.SyntaxKind.BooleanKeyword)||i.asKind(t.SyntaxKind.TrueKeyword)||i.asKind(t.SyntaxKind.FalseKeyword))return"boolean";if(i.asKind(t.SyntaxKind.StringKeyword)||i.asKind(t.SyntaxKind.StringLiteral))return"string";if(i.asKind(t.SyntaxKind.NumberKeyword)||i.asKind(t.SyntaxKind.NumericLiteral))return"number";if(i.asKind(t.SyntaxKind.BigIntKeyword)||i.asKind(t.SyntaxKind.BigIntLiteral))return"bigint";const r=i.asKind(t.SyntaxKind.TypeLiteral);if(r)return r.getFirstChildByKind(t.SyntaxKind.SyntaxList).getChildrenOfKind(t.SyntaxKind.PropertySignature).map(O=>{const v=O.getFirstChildByKind(t.SyntaxKind.Identifier),V=N(O),D=v.getNextSiblingIfKind(t.SyntaxKind.QuestionToken);return{role:"property",identifier:v.getText(),shape:f(V),optional:V.getType().isNullable()||!!D}});const y=i.asKind(t.SyntaxKind.TypeReference);if(y)return f(y.getFirstChild());if(i.asKind(t.SyntaxKind.PropertyAccessExpression)){const w=c(i.getLastChild());return u(w.asKind(t.SyntaxKind.CallExpression).getReturnType(),w)}const K=i.asKind(t.SyntaxKind.UnionType);if(K)return u(K.getType(),i);const A=i.asKind(t.SyntaxKind.TypeQuery);if(A)return f(A.getLastChild());const F=i.asKind(t.SyntaxKind.QualifiedName);if(F)return f(F.getLastChild());const T=i.asKind(t.SyntaxKind.CallExpression);if(T)return u(T.getReturnType(),T);const I=i.asKind(t.SyntaxKind.AwaitExpression);if(I)return f(I.getChildAtIndex(1));const k=i.asKind(t.SyntaxKind.AsExpression);if(k)return f(k.getChildAtIndex(2));const U=i.getSourceFile().getFilePath().split("/").pop();return x.Logger.warn(`[${U}] Unknown node type: ${i.getKindName()}`),"unknown_1"},$=e=>e.getFirstDescendantByKind(t.SyntaxKind.SyntaxList).getChildrenOfKind(t.SyntaxKind.PropertyAssignment).map(l=>{const o=l.getFirstChild(),g=(()=>{if(o.isKind(t.SyntaxKind.Identifier))return o.getText();if(o.isKind(t.SyntaxKind.StringLiteral))return o.getLiteralText();const r=l.getSourceFile().getFilePath().split("/").pop();return x.Logger.warn(`[${r}] Unknown identifier name: ${o.getText()}`),"unknown_30"})(),a=l.getLastChild(),d=c(a);return{role:"property",identifier:g,shape:m(d),optional:B(d),description:h(d,"description"),errorMessage:h(d,"errorMessage")}})||[],S=e=>{const n=e.asKind(t.SyntaxKind.CallExpression);return n?(n.getReturnType().getSymbol()?.getName()??"").startsWith("Zod"):!1},C=e=>{const n=e.asKind(t.SyntaxKind.CallExpression),i=n.getReturnType(),s=i.getSymbol()?.getName()??"";if(s==="ZodNumber")return"number";if(s==="ZodString")return"string";if(s==="ZodBoolean")return"boolean";if(s==="ZodBigInt")return"bigint";if(s==="ZodObject"){const g=n.getFirstChildByKind(t.SyntaxKind.SyntaxList)?.getFirstChild()?.asKind(t.SyntaxKind.ObjectLiteralExpression);if(!g)return"unknown_zod_object";const a=g.getFirstChildByKind(t.SyntaxKind.SyntaxList);return a?a.getChildrenOfKind(t.SyntaxKind.PropertyAssignment).map(r=>{const y=r.getFirstChildByKind(t.SyntaxKind.Identifier).getText(),p=r.getLastChild();return{role:"property",identifier:y,shape:S(p)?C(p):m(p),optional:!1}}):[]}if(s==="ZodArray"){const o=n.getFirstChildByKind(t.SyntaxKind.SyntaxList)?.getFirstChild();if(o)return[{role:"array",shape:S(o)?C(o):m(o),optional:!1}];const a=n.getFirstChildByKind(t.SyntaxKind.PropertyAccessExpression)?.getFirstChildByKind(t.SyntaxKind.CallExpression);return a&&S(a)?[{role:"array",shape:C(a),optional:!1}]:"unknown_zod_array"}if(s==="ZodEnum"){const o=i.getTypeArguments();if(o.length>0){const d=o[0].getProperties().map(r=>({role:"union_entry",shape:u(r.getTypeAtLocation(n),n,[]),optional:!1}));if(d.length===1)return d[0].shape;if(d.length>1)return[{role:"union",shape:d,optional:!1}]}return"unknown_zod_enum"}if(s==="ZodOptional"){const o=n.getFirstChildByKind(t.SyntaxKind.PropertyAccessExpression)?.getFirstChildByKind(t.SyntaxKind.CallExpression);return o&&S(o)?C(o):"unknown_zod_optional"}const l=e.getSourceFile().getFilePath().split("/").pop();return x.Logger.warn(`[${l}] Unknown zod type: ${s}`),"unknown_zod"},m=e=>{if(S(e))return C(e);const n=e.getParent().getFirstChildByKind(t.SyntaxKind.AsExpression);if(n){const r=n.getLastChildByKind(t.SyntaxKind.TypeReference);return b(r)}const i=e.getParent().getFirstChildByKind(t.SyntaxKind.TypeReference);if(i)return b(i);if(e.getParent().getChildrenOfKind(t.SyntaxKind.SyntaxList).length>=2){const r=e.getParent().getFirstChildByKind(t.SyntaxKind.SyntaxList).getFirstChild();return f(r)}const s=e.getParent().getFirstChildByKind(t.SyntaxKind.CallExpression);if(s){const r=c(s.getFirstChildByKind(t.SyntaxKind.SyntaxList).getFirstChild()),y=r.getParent().getFirstChildByKind(t.SyntaxKind.TypeReference);if(y)return u(y.getType(),y,[]);const p=r.getParent().getFirstChildByKind(t.SyntaxKind.ObjectLiteralExpression);if(p)return m(p);if(r.getKind()===t.SyntaxKind.CallExpression||r.getKind()===t.SyntaxKind.IntersectionType)return m(r);const K=e.getSourceFile().getFilePath().split("/").pop();return x.Logger.warn(`[${K}] Unknown call expression argument: ${r.getKindName()}`),"unknown_3"}const o=e.getFirstChildByKind(t.SyntaxKind.SyntaxList).getChildrenOfKind(t.SyntaxKind.PropertyAssignment).find(r=>r.getFirstChildByKind(t.SyntaxKind.Identifier)?.getText()==="parse");if(o){const r=N(o).asKind(t.SyntaxKind.ArrowFunction).getReturnType();return u(r,o)}const g=e.getFirstChildByKind(t.SyntaxKind.SyntaxList)?.getFirstChildByKind(t.SyntaxKind.ImportType);if(g){const r=g.getLastChildByKind(t.SyntaxKind.GreaterThanToken).getChildIndex(),y=g.getChildAtIndex(r-1);return f(y.getFirstChild())}const a=e.isKind(t.SyntaxKind.IntersectionType)?e:e.getParent()?.isKind(t.SyntaxKind.VariableDeclaration)?e.getParent()?.getFirstChildByKind(t.SyntaxKind.IntersectionType):null;if(a){const r=a.getFirstChildByKind(t.SyntaxKind.TypeReference);if(r)return b(r)}const d=e.getSourceFile().getFilePath().split("/").pop();return x.Logger.warn(`[${d}] Unknown import type node`),"unknown_2"},B=e=>{if(S(e))return(e.asKind(t.SyntaxKind.CallExpression).getReturnType().getSymbol()?.getName()??"")==="ZodOptional";const n=e.asKind(t.SyntaxKind.CallExpression);if(n){const l=n.getFirstChildByKind(t.SyntaxKind.Identifier);if(l?.getText()==="OptionalParam")return!0;if(l?.getText()==="RequiredParam")return!1;const o=n.getFirstChildByKind(t.SyntaxKind.SyntaxList),g=c(o.getFirstChild());return B(g)}return e.getFirstDescendantByKind(t.SyntaxKind.SyntaxList).getChildrenOfKind(t.SyntaxKind.PropertyAssignment).some(l=>l.getFirstDescendantByKind(t.SyntaxKind.Identifier).getText()==="optional"?N(l).getKind()===t.SyntaxKind.TrueKeyword:!1)},h=(e,n)=>{if(S(e))return"";const i=c(e),s=i.asKind(t.SyntaxKind.CallExpression);if(s){const y=s.getLastChildByKind(t.SyntaxKind.SyntaxList);return h(y,n)}const l=i.asKind(t.SyntaxKind.SyntaxList);if(l)return l.getChildren().map(p=>h(p,n)).find(p=>!!p&&p!=="unknown_25")||"";const o=i.asKind(t.SyntaxKind.ObjectLiteralExpression);if(o){const p=E(o).find(K=>K.identifier===n);return p?Array.isArray(p.value)?"array":p.value||"":""}const g=i.asKind(t.SyntaxKind.IntersectionType);if(g)return g.getTypeNodes().flatMap(y=>h(y,n)).filter(y=>!!y&&y!=="unknown_25")[0]||"unknown_27";const a=i.asKind(t.SyntaxKind.TypeLiteral);if(a)return h(a.getFirstChildByKind(t.SyntaxKind.SyntaxList),n);const d=i.asKind(t.SyntaxKind.PropertySignature);if(d&&i.getFirstDescendantByKind(t.SyntaxKind.Identifier).getText()===n)return N(d).getFirstDescendantByKind(t.SyntaxKind.StringLiteral).getLiteralText();const r=i.getSourceFile().getFilePath().split("/").pop();return x.Logger.dev(`[${r}] Unknown property string value node ${i.getKindName()}`),"unknown_25"},Z=e=>{const n=e.getSymbol();if(!e.isObject()||!n)return!1;const i=e.getTypeArguments();return n.getName()==="Promise"&&i.length===1},u=(e,n,i=[])=>{const s=e.getAliasSymbol()?.getName();if(s&&j.OpenApiManager.getInstance().hasExposedModel(s))return[{role:"ref",shape:s,optional:!1}];const l=Z(e)?e.getTypeArguments()[0]:e;if(i.some(d=>d===l))return"circular";const o=l.compilerType,g=R.get(o);if(g!==void 0)return g;const a=q(l,n,i);return R.set(o,a),a},q=(e,n,i)=>{const s=i.concat(e);if(e.getText()==="void")return"void";if(e.isAny())return"any";if(e.isUnknown())return"unknown";if(e.isNull())return"null";if(e.isUndefined())return"undefined";if(e.isBoolean()||e.isBooleanLiteral())return"boolean";if(e.isStringLiteral())return[{role:"literal_string",shape:String(e.getLiteralValue()),optional:!1}];if(e.isNumberLiteral())return[{role:"literal_number",shape:String(e.getLiteralValue()),optional:!1}];if(e.isString()||e.isTemplateLiteral())return"string";if(e.isNumber())return"number";if(e.getText()==="bigint")return"bigint";if(e.isTuple())return[{role:"tuple",shape:e.getTupleElements().map(a=>({role:"tuple_entry",shape:u(a,n,s),optional:!1})),optional:!1}];if(e.isArray())return[{role:"array",shape:u(e.getArrayElementType(),n,s),optional:!1}];if(e.isObject()){const a=e.getNumberIndexType(),r=e.getBaseTypes()?.find(y=>y.isArray());if(r)return[{role:"array",shape:u(r.getArrayElementType()??a,n,s),optional:!1}]}const l=e.getSymbol()?.getName(),o=new Set(["Buffer","Uint8Array","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array","ArrayBuffer","SharedArrayBuffer","ReadableStream"]);if(e.isObject()&&l&&o.has(l))return[{role:"buffer",shape:"buffer",optional:!1}];if(e.isObject()&&l==="RegExp")return"string";if(e.isObject()&&l==="Map"){const d=e.getTypeArguments()[1];return[{role:"record",shape:d?u(d,n,s):"unknown",optional:!1}]}if(e.isObject()&&l==="Set"){const d=e.getTypeArguments()[0];return[{role:"array",shape:d?u(d,n,s):"unknown",optional:!1}]}if(e.isObject()&&e.getProperties().length===0){const a=e.getAliasTypeArguments()[1]??e.getStringIndexType();if(a)return[{role:"record",shape:u(a,n,s),optional:!1}]}if(e.isObject())return l==="Date"||e.getText()==="Date"?"Date":e.getProperties().map(a=>{const d=a.getValueDeclaration()||a.getDeclarations()[0],r=u(a.getTypeAtLocation(n),n,s);if(!d)return{role:"property",identifier:a.getName(),shape:r,optional:!1};if(!(d.asKind(t.SyntaxKind.PropertySignature)||d.asKind(t.SyntaxKind.PropertyAssignment)||d.asKind(t.SyntaxKind.ShorthandPropertyAssignment)))return{role:"property",identifier:a.getName(),shape:r,optional:!1};const p=a.getTypeAtLocation(n).isNullable();return{role:"property",identifier:a.getName(),shape:r,optional:p}}).filter(a=>a.shape!=="undefined");if(e.isUnion()){const d=e.getUnionTypes().map(p=>({role:"union_entry",shape:u(p,n,s),optional:!1})).filter((p,K,A)=>!A.find((F,T)=>F.shape===p.shape&&T>K)),r=d.some(p=>p.shape==="undefined"),y=d.filter(p=>p.shape!=="undefined");return y.length===1?y[0].shape:[{role:"union",shape:y,optional:r}]}if(e.isIntersection())return e.getIntersectionTypes().map(r=>u(r,n,s)).filter(r=>typeof r!="string").reduce((r,y)=>[...r,...y],[]);const g=n.getSourceFile().getFilePath().split("/").pop();return x.Logger.warn(`[${g}] Unknown type shape node ${e.getText()}`),"unknown_5"},P=e=>{if(e.isKind(t.SyntaxKind.Identifier))return P(c(e));if(e.isKind(t.SyntaxKind.StringLiteral))return e.getLiteralValue();if(e.isKind(t.SyntaxKind.ArrayLiteralExpression))return e.forEachChildAsArray().map(i=>P(i));if(e.isKind(t.SyntaxKind.PropertyAccessExpression))return P(N(e));if(e.isKind(t.SyntaxKind.ObjectLiteralExpression))return E(e);const n=e.getSourceFile().getFilePath().split("/").pop();return x.Logger.dev(`[${n}] Unknown literal value node ${e.getKindName()}`),"unknown_6"},z=e=>{const n=e.getFirstDescendantByKind(t.SyntaxKind.CallExpression);if(!n)return null;const i=n.getArguments()[0];if(!i)return null;const s=i.getType();return s.isStringLiteral()?s.getLiteralValue():null},E=e=>e.getFirstDescendantByKind(t.SyntaxKind.SyntaxList).getChildrenOfKind(t.SyntaxKind.PropertyAssignment).map(l=>{const g=l.getFirstDescendantByKind(t.SyntaxKind.Identifier).getText(),a=l.getLastChild(),d=c(a),r=P(d);return{identifier:g,value:r}})||[];exports.findNodeImplementation=c;exports.findPropertyAssignmentValueNode=N;exports.getProperTypeShape=u;exports.getRecursiveNodeShape=f;exports.getShapeOfValidatorLiteral=$;exports.getTypeReferenceShape=b;exports.getValidatorPropertyOptionality=B;exports.getValidatorPropertyShape=m;exports.getValidatorPropertyStringValue=h;exports.getValuesOfObjectLiteral=E;exports.resolveEndpointPath=z;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("ts-morph"),x=require("../../utils/logger.cjs"),U=require("../manager/OpenApiManager.cjs"),A=new WeakMap,V=new WeakMap,R=new WeakMap,c=e=>{const i=A.get(e);if(i)return i;if(e.getKind()===t.SyntaxKind.Identifier){const n=e.asKind(t.SyntaxKind.Identifier).getImplementations()[0]?.getNode();if(n){const d=n.getParent().getLastChild();if(d===e)throw new Error("Recursive implementation found");const y=c(d);return A.set(e,y),y}const s=e.asKind(t.SyntaxKind.Identifier).getDefinitions()[0]?.getNode();if(s){const d=s.getParent().getLastChild();if(d===e)throw new Error("Recursive implementation found");const y=c(d);return A.set(e,y),y}throw new Error("No implementation nor definition available")}return A.set(e,e),e},h=e=>{const i=e.getChildrenOfKind(t.SyntaxKind.Identifier);return i.length===2?c(i[1]):e.getChildren().reverse().find(s=>s.getKind()!==t.SyntaxKind.GreaterThanToken&&s.getKind()!==t.SyntaxKind.CommaToken&&s.getKind()!==t.SyntaxKind.SemicolonToken)},L=e=>{const i=e.getFirstChildByKind(t.SyntaxKind.SyntaxList);return i.isKind(t.SyntaxKind.SyntaxList)?f(i.getFirstChild()):f(i)},f=e=>{const i=V.get(e);if(i!==void 0)return i;const n=_(e);return V.set(e,n),n},_=e=>{const i=e.getSymbol()?.getName();if(i&&U.OpenApiManager.getInstance().hasExposedModel(i))return[{role:"ref",shape:i,optional:!1}];const n=c(e);if(n.asKind(t.SyntaxKind.UndefinedKeyword))return"undefined";const a=n.asKind(t.SyntaxKind.LiteralType);if(a){if(a.getFirstChildByKind(t.SyntaxKind.TrueKeyword))return"true";if(a.getFirstChildByKind(t.SyntaxKind.FalseKeyword))return"false"}if(n.asKind(t.SyntaxKind.BooleanKeyword)||n.asKind(t.SyntaxKind.TrueKeyword)||n.asKind(t.SyntaxKind.FalseKeyword))return"boolean";if(n.asKind(t.SyntaxKind.StringKeyword)||n.asKind(t.SyntaxKind.StringLiteral))return"string";if(n.asKind(t.SyntaxKind.NumberKeyword)||n.asKind(t.SyntaxKind.NumericLiteral))return"number";if(n.asKind(t.SyntaxKind.BigIntKeyword)||n.asKind(t.SyntaxKind.BigIntLiteral))return"bigint";const r=n.asKind(t.SyntaxKind.TypeLiteral);if(r)return r.getFirstChildByKind(t.SyntaxKind.SyntaxList).getChildrenOfKind(t.SyntaxKind.PropertySignature).map(k=>{const O=k.getFirstChildByKind(t.SyntaxKind.Identifier),v=h(k),M=O.getNextSiblingIfKind(t.SyntaxKind.QuestionToken);return{role:"property",identifier:O.getText(),shape:f(v),optional:v.getType().isNullable()||!!M}});const g=n.asKind(t.SyntaxKind.TypeReference);if(g)return f(g.getFirstChild());if(n.asKind(t.SyntaxKind.PropertyAccessExpression)){const P=c(n.getLastChild());return u(P.asKind(t.SyntaxKind.CallExpression).getReturnType(),P)}const K=n.asKind(t.SyntaxKind.UnionType);if(K)return u(K.getType(),n);const T=n.asKind(t.SyntaxKind.TypeQuery);if(T)return f(T.getLastChild());const C=n.asKind(t.SyntaxKind.QualifiedName);if(C)return f(C.getLastChild());const m=n.asKind(t.SyntaxKind.CallExpression);if(m)return u(m.getReturnType(),m);const B=n.asKind(t.SyntaxKind.AwaitExpression);if(B)return f(B.getChildAtIndex(1));const I=n.asKind(t.SyntaxKind.AsExpression);if(I)return f(I.getChildAtIndex(2));const D=n.getSourceFile().getFilePath().split("/").pop();return x.Logger.warn(`[${D}] Unknown node type: ${n.getKindName()}`),"unknown_1"},j=e=>e.getFirstDescendantByKind(t.SyntaxKind.SyntaxList).getChildrenOfKind(t.SyntaxKind.PropertyAssignment).map(a=>{const d=a.getFirstChild(),y=(()=>{if(d.isKind(t.SyntaxKind.Identifier))return d.getText();if(d.isKind(t.SyntaxKind.StringLiteral))return d.getLiteralText();const r=a.getSourceFile().getFilePath().split("/").pop();return x.Logger.warn(`[${r}] Unknown identifier name: ${d.getText()}`),"unknown_30"})(),o=a.getLastChild(),l=c(o);return{role:"property",identifier:y,shape:N(l),optional:w(l),description:S(l,"description"),errorMessage:S(l,"errorMessage")}})||[],b=e=>{const i=e.asKind(t.SyntaxKind.CallExpression);return i?(i.getReturnType().getSymbol()?.getName()??"").startsWith("Zod"):!1},$=e=>{const i=e.asKind(t.SyntaxKind.CallExpression),n=i.getReturnType(),s=n.getProperty("_output");if(s)return u(s.getTypeAtLocation(i),i);const a=e.getSourceFile().getFilePath().split("/").pop(),d=n.getSymbol()?.getName()??"";return x.Logger.warn(`[${a}] Unknown zod type: ${d}`),"unknown_zod"},N=e=>{if(b(e))return $(e);const i=e.getParent().getFirstChildByKind(t.SyntaxKind.AsExpression);if(i){const r=i.getLastChildByKind(t.SyntaxKind.TypeReference);return L(r)}const n=e.getParent().getFirstChildByKind(t.SyntaxKind.TypeReference);if(n)return L(n);if(e.getParent().getChildrenOfKind(t.SyntaxKind.SyntaxList).length>=2){const r=e.getParent().getFirstChildByKind(t.SyntaxKind.SyntaxList).getFirstChild();return f(r)}const s=e.getParent().getFirstChildByKind(t.SyntaxKind.CallExpression);if(s){const r=c(s.getFirstChildByKind(t.SyntaxKind.SyntaxList).getFirstChild()),g=r.getParent().getFirstChildByKind(t.SyntaxKind.TypeReference);if(g)return u(g.getType(),g,[]);const p=r.getParent().getFirstChildByKind(t.SyntaxKind.ObjectLiteralExpression);if(p)return N(p);if(r.getKind()===t.SyntaxKind.CallExpression||r.getKind()===t.SyntaxKind.IntersectionType)return N(r);const K=e.getSourceFile().getFilePath().split("/").pop();return x.Logger.warn(`[${K}] Unknown call expression argument: ${r.getKindName()}`),"unknown_3"}const d=e.getFirstChildByKind(t.SyntaxKind.SyntaxList).getChildrenOfKind(t.SyntaxKind.PropertyAssignment).find(r=>r.getFirstChildByKind(t.SyntaxKind.Identifier)?.getText()==="parse");if(d){const r=h(d).asKind(t.SyntaxKind.ArrowFunction).getReturnType();return u(r,d)}const y=e.getFirstChildByKind(t.SyntaxKind.SyntaxList)?.getFirstChildByKind(t.SyntaxKind.ImportType);if(y){const r=y.getLastChildByKind(t.SyntaxKind.GreaterThanToken).getChildIndex(),g=y.getChildAtIndex(r-1);return f(g.getFirstChild())}const o=e.isKind(t.SyntaxKind.IntersectionType)?e:e.getParent()?.isKind(t.SyntaxKind.VariableDeclaration)?e.getParent()?.getFirstChildByKind(t.SyntaxKind.IntersectionType):null;if(o){const r=o.getFirstChildByKind(t.SyntaxKind.TypeReference);if(r)return L(r)}const l=e.getSourceFile().getFilePath().split("/").pop();return x.Logger.warn(`[${l}] Unknown import type node`),"unknown_2"},w=e=>{if(b(e))return(e.asKind(t.SyntaxKind.CallExpression).getReturnType().getSymbol()?.getName()??"")==="ZodOptional";const i=e.asKind(t.SyntaxKind.CallExpression);if(i){const a=i.getFirstChildByKind(t.SyntaxKind.Identifier);if(a?.getText()==="OptionalParam")return!0;if(a?.getText()==="RequiredParam")return!1;const d=i.getFirstChildByKind(t.SyntaxKind.SyntaxList),y=c(d.getFirstChild());return w(y)}return e.getFirstDescendantByKind(t.SyntaxKind.SyntaxList).getChildrenOfKind(t.SyntaxKind.PropertyAssignment).some(a=>a.getFirstDescendantByKind(t.SyntaxKind.Identifier).getText()==="optional"?h(a).getKind()===t.SyntaxKind.TrueKeyword:!1)},S=(e,i)=>{if(b(e))return"";const n=c(e),s=n.asKind(t.SyntaxKind.CallExpression);if(s){const g=s.getLastChildByKind(t.SyntaxKind.SyntaxList);return S(g,i)}const a=n.asKind(t.SyntaxKind.SyntaxList);if(a)return a.getChildren().map(p=>S(p,i)).find(p=>!!p&&p!=="unknown_25")||"";const d=n.asKind(t.SyntaxKind.ObjectLiteralExpression);if(d){const p=E(d).find(K=>K.identifier===i);return p?Array.isArray(p.value)?"array":p.value||"":""}const y=n.asKind(t.SyntaxKind.IntersectionType);if(y)return y.getTypeNodes().flatMap(g=>S(g,i)).filter(g=>!!g&&g!=="unknown_25")[0]||"unknown_27";const o=n.asKind(t.SyntaxKind.TypeLiteral);if(o)return S(o.getFirstChildByKind(t.SyntaxKind.SyntaxList),i);const l=n.asKind(t.SyntaxKind.PropertySignature);if(l&&n.getFirstDescendantByKind(t.SyntaxKind.Identifier).getText()===i)return h(l).getFirstDescendantByKind(t.SyntaxKind.StringLiteral).getLiteralText();const r=n.getSourceFile().getFilePath().split("/").pop();return x.Logger.dev(`[${r}] Unknown property string value node ${n.getKindName()}`),"unknown_25"},q=e=>{const i=e.getSymbol();if(!e.isObject()||!i)return!1;const n=e.getTypeArguments();return i.getName()==="Promise"&&n.length===1},u=(e,i,n=[])=>{const s=e.getAliasSymbol()?.getName();if(s&&U.OpenApiManager.getInstance().hasExposedModel(s))return[{role:"ref",shape:s,optional:!1}];const a=q(e)?e.getTypeArguments()[0]:e;if(n.some(l=>l===a))return"circular";const d=a.compilerType,y=R.get(d);if(y!==void 0)return y;const o=Q(a,i,n);return R.set(d,o),o},Q=(e,i,n)=>{const s=n.concat(e);if(e.getText()==="void")return"void";if(e.isAny())return"any";if(e.isUnknown())return"unknown";if(e.isNull())return"null";if(e.isUndefined())return"undefined";if(e.isBoolean()||e.isBooleanLiteral())return"boolean";if(e.isStringLiteral())return[{role:"literal_string",shape:String(e.getLiteralValue()),optional:!1}];if(e.isNumberLiteral())return[{role:"literal_number",shape:String(e.getLiteralValue()),optional:!1}];if(e.isString()||e.isTemplateLiteral())return"string";if(e.isNumber())return"number";if(e.getText()==="bigint")return"bigint";if(e.isTuple())return[{role:"tuple",shape:e.getTupleElements().map(o=>({role:"tuple_entry",shape:u(o,i,s),optional:!1})),optional:!1}];if(e.isArray())return[{role:"array",shape:u(e.getArrayElementType(),i,s),optional:!1}];if(e.isObject()){const o=e.getNumberIndexType(),r=e.getBaseTypes()?.find(g=>g.isArray());if(r)return[{role:"array",shape:u(r.getArrayElementType()??o,i,s),optional:!1}]}const a=e.getSymbol()?.getName(),d=new Set(["Buffer","Uint8Array","Int8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array","ArrayBuffer","SharedArrayBuffer","ReadableStream"]);if(e.isObject()&&a&&d.has(a))return[{role:"buffer",shape:"buffer",optional:!1}];if(e.isObject()&&a==="RegExp")return"string";if(e.isObject()&&a==="Map"){const l=e.getTypeArguments()[1];return[{role:"record",shape:l?u(l,i,s):"unknown",optional:!1}]}if(e.isObject()&&a==="Set"){const l=e.getTypeArguments()[0];return[{role:"array",shape:l?u(l,i,s):"unknown",optional:!1}]}if(e.isObject()&&e.getProperties().length===0){const o=e.getAliasTypeArguments()[1]??e.getStringIndexType();if(o)return[{role:"record",shape:u(o,i,s),optional:!1}]}if(e.isObject())return a==="Date"||e.getText()==="Date"?"Date":e.getProperties().map(o=>{const l=o.getValueDeclaration()||o.getDeclarations()[0],r=u(o.getTypeAtLocation(i),i,s);if(!l)return{role:"property",identifier:o.getName(),shape:r,optional:!1};if(!(l.asKind(t.SyntaxKind.PropertySignature)||l.asKind(t.SyntaxKind.PropertyAssignment)||l.asKind(t.SyntaxKind.ShorthandPropertyAssignment)))return{role:"property",identifier:o.getName(),shape:r,optional:!1};const p=o.getTypeAtLocation(i).isNullable();return{role:"property",identifier:o.getName(),shape:r,optional:p}}).filter(o=>o.shape!=="undefined");if(e.isUnion()){const l=e.getUnionTypes().map(p=>({role:"union_entry",shape:u(p,i,s),optional:!1})).filter((p,K,T)=>!T.find((C,m)=>C.shape===p.shape&&m>K)),r=l.some(p=>p.shape==="undefined"),g=l.filter(p=>p.shape!=="undefined");return g.length===1?g[0].shape:[{role:"union",shape:g,optional:r}]}if(e.isIntersection())return e.getIntersectionTypes().map(r=>u(r,i,s)).filter(r=>typeof r!="string").reduce((r,g)=>[...r,...g],[]);const y=i.getSourceFile().getFilePath().split("/").pop();return x.Logger.warn(`[${y}] Unknown type shape node ${e.getText()}`),"unknown_5"},F=e=>{if(e.isKind(t.SyntaxKind.Identifier))return F(c(e));if(e.isKind(t.SyntaxKind.StringLiteral))return e.getLiteralValue();if(e.isKind(t.SyntaxKind.ArrayLiteralExpression))return e.forEachChildAsArray().map(n=>F(n));if(e.isKind(t.SyntaxKind.PropertyAccessExpression))return F(h(e));if(e.isKind(t.SyntaxKind.ObjectLiteralExpression))return E(e);const i=e.getSourceFile().getFilePath().split("/").pop();return x.Logger.dev(`[${i}] Unknown literal value node ${e.getKindName()}`),"unknown_6"},W=e=>{const i=e.getFirstDescendantByKind(t.SyntaxKind.CallExpression);if(!i)return null;const n=i.getArguments()[0];if(!n)return null;const s=n.getType();return s.isStringLiteral()?s.getLiteralValue():null},E=e=>e.getFirstDescendantByKind(t.SyntaxKind.SyntaxList).getChildrenOfKind(t.SyntaxKind.PropertyAssignment).map(a=>{const y=a.getFirstDescendantByKind(t.SyntaxKind.Identifier).getText(),o=a.getLastChild(),l=c(o),r=F(l);return{identifier:y,value:r}})||[];exports.findNodeImplementation=c;exports.findPropertyAssignmentValueNode=h;exports.getProperTypeShape=u;exports.getRecursiveNodeShape=f;exports.getShapeOfValidatorLiteral=j;exports.getTypeReferenceShape=L;exports.getValidatorPropertyOptionality=w;exports.getValidatorPropertyShape=N;exports.getValidatorPropertyStringValue=S;exports.getValuesOfObjectLiteral=E;exports.resolveEndpointPath=W;
|
|
2
2
|
//# sourceMappingURL=nodeParsers.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeParsers.cjs","sources":["../../../src/openapi/analyzerModule/nodeParsers.ts"],"sourcesContent":["import {\n\tNode,\n\tPropertyAccessExpression,\n\tPropertyAssignment,\n\tPropertySignature,\n\tShorthandPropertyAssignment,\n\tSyntaxKind,\n\tts,\n\tType,\n\tTypeReferenceNode,\n} from 'ts-morph'\n\nimport { Logger } from '../../utils/logger'\nimport { OpenApiManager } from '../manager/OpenApiManager'\nimport { ShapeOfProperty, ShapeOfType, ShapeOfUnionEntry } from './types'\n\nconst implementationCache = new WeakMap<Node, Node>()\nconst nodeShapeCache = new WeakMap<Node, ShapeOfType['shape']>()\nconst typeShapeCache = new WeakMap<object, ShapeOfType['shape']>()\n\nexport const findNodeImplementation = (node: Node): Node => {\n\tconst cached = implementationCache.get(node)\n\tif (cached) {\n\t\treturn cached\n\t}\n\n\tif (node.getKind() === SyntaxKind.Identifier) {\n\t\tconst implementationNode = node.asKind(SyntaxKind.Identifier)!.getImplementations()[0]?.getNode()\n\t\tif (implementationNode) {\n\t\t\tconst implementationParentNode = implementationNode.getParent()!\n\t\t\tconst assignmentValueNode = implementationParentNode.getLastChild()!\n\t\t\tif (assignmentValueNode === node) {\n\t\t\t\tthrow new Error('Recursive implementation found')\n\t\t\t}\n\t\t\tconst result = findNodeImplementation(assignmentValueNode)\n\t\t\timplementationCache.set(node, result)\n\t\t\treturn result\n\t\t}\n\n\t\tconst definitionNode = node.asKind(SyntaxKind.Identifier)!.getDefinitions()[0]?.getNode()\n\t\tif (definitionNode) {\n\t\t\tconst definitionParentNode = definitionNode.getParent()!\n\t\t\tconst assignmentValueNode = definitionParentNode.getLastChild()!\n\t\t\tif (assignmentValueNode === node) {\n\t\t\t\tthrow new Error('Recursive implementation found')\n\t\t\t}\n\t\t\tconst result = findNodeImplementation(assignmentValueNode)\n\t\t\timplementationCache.set(node, result)\n\t\t\treturn result\n\t\t}\n\t\tthrow new Error('No implementation nor definition available')\n\t}\n\n\timplementationCache.set(node, node)\n\treturn node\n}\n\nexport const findPropertyAssignmentValueNode = (\n\tnode:\n\t\t| PropertyAssignment\n\t\t| TypeReferenceNode\n\t\t| PropertySignature\n\t\t| PropertyAccessExpression\n\t\t| ShorthandPropertyAssignment,\n): Node => {\n\tconst identifierChildren = node.getChildrenOfKind(SyntaxKind.Identifier)\n\tif (identifierChildren.length === 2) {\n\t\treturn findNodeImplementation(identifierChildren[1])\n\t}\n\tconst lastMatchingChild = node.getChildren().reverse()\n\treturn lastMatchingChild.find(\n\t\t(child) =>\n\t\t\tchild.getKind() !== SyntaxKind.GreaterThanToken &&\n\t\t\tchild.getKind() !== SyntaxKind.CommaToken &&\n\t\t\tchild.getKind() !== SyntaxKind.SemicolonToken,\n\t)!\n}\n\nexport const getTypeReferenceShape = (node: TypeReferenceNode): ShapeOfType['shape'] => {\n\tconst firstChild = node.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\tif (firstChild.isKind(SyntaxKind.SyntaxList)) {\n\t\treturn getRecursiveNodeShape(firstChild.getFirstChild()!)\n\t} else {\n\t\treturn getRecursiveNodeShape(firstChild)\n\t}\n}\n\nexport const getRecursiveNodeShape = (nodeOrReference: Node): ShapeOfType['shape'] => {\n\tconst cached = nodeShapeCache.get(nodeOrReference)\n\tif (cached !== undefined) {\n\t\treturn cached\n\t}\n\tconst result = computeRecursiveNodeShape(nodeOrReference)\n\tnodeShapeCache.set(nodeOrReference, result)\n\treturn result\n}\n\nconst computeRecursiveNodeShape = (nodeOrReference: Node): ShapeOfType['shape'] => {\n\tconst typeName = nodeOrReference.getSymbol()?.getName()\n\tif (typeName && OpenApiManager.getInstance().hasExposedModel(typeName)) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'ref',\n\t\t\t\tshape: typeName,\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tconst node = findNodeImplementation(nodeOrReference)\n\n\t// Undefined\n\tconst undefinedNode = node.asKind(SyntaxKind.UndefinedKeyword)\n\tif (undefinedNode) {\n\t\treturn 'undefined'\n\t}\n\n\t// Literal type\n\tconst literalNode = node.asKind(SyntaxKind.LiteralType)\n\tif (literalNode) {\n\t\tif (literalNode.getFirstChildByKind(SyntaxKind.TrueKeyword)) {\n\t\t\treturn 'true'\n\t\t}\n\t\tif (literalNode.getFirstChildByKind(SyntaxKind.FalseKeyword)) {\n\t\t\treturn 'false'\n\t\t}\n\t}\n\n\t// Boolean literal\n\tconst booleanLiteralNode =\n\t\tnode.asKind(SyntaxKind.BooleanKeyword) ||\n\t\tnode.asKind(SyntaxKind.TrueKeyword) ||\n\t\tnode.asKind(SyntaxKind.FalseKeyword)\n\tif (booleanLiteralNode) {\n\t\treturn 'boolean'\n\t}\n\n\t// String literal\n\tconst stringLiteralNode = node.asKind(SyntaxKind.StringKeyword) || node.asKind(SyntaxKind.StringLiteral)\n\tif (stringLiteralNode) {\n\t\treturn 'string'\n\t}\n\n\t// Number literal\n\tconst numberLiteralNode = node.asKind(SyntaxKind.NumberKeyword) || node.asKind(SyntaxKind.NumericLiteral)\n\tif (numberLiteralNode) {\n\t\treturn 'number'\n\t}\n\n\t// BigInt literal\n\tconst bigIntNode = node.asKind(SyntaxKind.BigIntKeyword) || node.asKind(SyntaxKind.BigIntLiteral)\n\tif (bigIntNode) {\n\t\treturn 'bigint'\n\t}\n\n\t// Type literal\n\tconst typeLiteralNode = node.asKind(SyntaxKind.TypeLiteral)\n\tif (typeLiteralNode) {\n\t\tconst properties = typeLiteralNode\n\t\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t\t.getChildrenOfKind(SyntaxKind.PropertySignature)\n\n\t\tconst propertyShapes = properties.map((propNode) => {\n\t\t\tconst identifier = propNode.getFirstChildByKind(SyntaxKind.Identifier)!\n\t\t\tconst valueNode = findPropertyAssignmentValueNode(propNode)\n\t\t\tconst questionMarkToken = identifier.getNextSiblingIfKind(SyntaxKind.QuestionToken)\n\t\t\treturn {\n\t\t\t\trole: 'property' as const,\n\t\t\t\tidentifier: identifier.getText(),\n\t\t\t\tshape: getRecursiveNodeShape(valueNode),\n\t\t\t\toptional: valueNode.getType().isNullable() || !!questionMarkToken,\n\t\t\t}\n\t\t})\n\t\treturn propertyShapes\n\t}\n\n\t// Type reference\n\tconst typeReferenceNode = node.asKind(SyntaxKind.TypeReference)\n\tif (typeReferenceNode) {\n\t\treturn getRecursiveNodeShape(typeReferenceNode.getFirstChild()!)\n\t}\n\n\t// Property access expression\n\tconst propertyAccessNode = node.asKind(SyntaxKind.PropertyAccessExpression)\n\tif (propertyAccessNode) {\n\t\tconst lastChild = findNodeImplementation(node.getLastChild()!)\n\t\treturn getProperTypeShape(lastChild.asKind(SyntaxKind.CallExpression)!.getReturnType(), lastChild)\n\t}\n\n\t// Union type\n\tconst unionTypeNode = node.asKind(SyntaxKind.UnionType)\n\tif (unionTypeNode) {\n\t\treturn getProperTypeShape(unionTypeNode.getType(), node)\n\t}\n\n\t// Typeof query\n\tconst typeQueryNode = node.asKind(SyntaxKind.TypeQuery)\n\tif (typeQueryNode) {\n\t\treturn getRecursiveNodeShape(typeQueryNode.getLastChild()!)\n\t}\n\n\t// Qualified name\n\tconst qualifiedNameNode = node.asKind(SyntaxKind.QualifiedName)\n\tif (qualifiedNameNode) {\n\t\treturn getRecursiveNodeShape(qualifiedNameNode.getLastChild()!)\n\t}\n\n\t// Call expression\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\treturn getProperTypeShape(callExpressionNode.getReturnType(), callExpressionNode)\n\t}\n\n\t// Await expression\n\tconst awaitExpressionNode = node.asKind(SyntaxKind.AwaitExpression)\n\tif (awaitExpressionNode) {\n\t\treturn getRecursiveNodeShape(awaitExpressionNode.getChildAtIndex(1)!)\n\t}\n\n\t// 'As' Expression\n\tconst asExpressionNode = node.asKind(SyntaxKind.AsExpression)\n\tif (asExpressionNode) {\n\t\treturn getRecursiveNodeShape(asExpressionNode.getChildAtIndex(2)!)\n\t}\n\n\t// TODO\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown node type: ${node.getKindName()}`)\n\treturn 'unknown_1'\n}\n\nexport const getShapeOfValidatorLiteral = (\n\tobjectLiteralNode: Node<ts.ObjectLiteralExpression>,\n): (ShapeOfProperty & { description: string; errorMessage: string })[] => {\n\tconst syntaxListNode = objectLiteralNode.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\tconst properties = assignmentNodes.map((node) => {\n\t\tconst identifierNode = node.getFirstChild()!\n\t\tconst identifierName = (() => {\n\t\t\tif (identifierNode.isKind(SyntaxKind.Identifier)) {\n\t\t\t\treturn identifierNode.getText()\n\t\t\t}\n\t\t\tif (identifierNode.isKind(SyntaxKind.StringLiteral)) {\n\t\t\t\treturn identifierNode.getLiteralText()\n\t\t\t}\n\t\t\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\t\t\tLogger.warn(`[${fileName}] Unknown identifier name: ${identifierNode.getText()}`)\n\t\t\treturn 'unknown_30'\n\t\t})()\n\n\t\tconst assignmentValueNode = node.getLastChild()!\n\t\tconst innerLiteralNode = findNodeImplementation(assignmentValueNode)\n\n\t\treturn {\n\t\t\trole: 'property' as const,\n\t\t\tidentifier: identifierName,\n\t\t\tshape: getValidatorPropertyShape(innerLiteralNode),\n\t\t\toptional: getValidatorPropertyOptionality(innerLiteralNode),\n\t\t\tdescription: getValidatorPropertyStringValue(innerLiteralNode, 'description'),\n\t\t\terrorMessage: getValidatorPropertyStringValue(innerLiteralNode, 'errorMessage'),\n\t\t}\n\t})\n\n\treturn properties || []\n}\n\nconst isZodCallExpression = (node: Node): boolean => {\n\tconst callExpression = node.asKind(SyntaxKind.CallExpression)\n\tif (!callExpression) {\n\t\treturn false\n\t}\n\tconst returnType = callExpression.getReturnType()\n\tconst typeName = returnType.getSymbol()?.getName() ?? ''\n\treturn typeName.startsWith('Zod')\n}\n\nconst getZodCallShape = (node: Node): ShapeOfType['shape'] => {\n\tconst callExpression = node.asKind(SyntaxKind.CallExpression)!\n\tconst returnType = callExpression.getReturnType()\n\tconst typeName = returnType.getSymbol()?.getName() ?? ''\n\n\tif (typeName === 'ZodNumber') {\n\t\treturn 'number'\n\t}\n\tif (typeName === 'ZodString') {\n\t\treturn 'string'\n\t}\n\tif (typeName === 'ZodBoolean') {\n\t\treturn 'boolean'\n\t}\n\tif (typeName === 'ZodBigInt') {\n\t\treturn 'bigint'\n\t}\n\n\tif (typeName === 'ZodObject') {\n\t\tconst argNode = callExpression.getFirstChildByKind(SyntaxKind.SyntaxList)?.getFirstChild()\n\t\tconst objectLiteral = argNode?.asKind(SyntaxKind.ObjectLiteralExpression)\n\t\tif (!objectLiteral) {\n\t\t\treturn 'unknown_zod_object'\n\t\t}\n\t\tconst syntaxList = objectLiteral.getFirstChildByKind(SyntaxKind.SyntaxList)\n\t\tif (!syntaxList) {\n\t\t\treturn []\n\t\t}\n\t\tconst properties = syntaxList.getChildrenOfKind(SyntaxKind.PropertyAssignment)\n\t\treturn properties.map((prop) => {\n\t\t\tconst identifier = prop.getFirstChildByKind(SyntaxKind.Identifier)!.getText()\n\t\t\tconst valueNode = prop.getLastChild()!\n\t\t\treturn {\n\t\t\t\trole: 'property' as const,\n\t\t\t\tidentifier,\n\t\t\t\tshape: isZodCallExpression(valueNode)\n\t\t\t\t\t? getZodCallShape(valueNode)\n\t\t\t\t\t: getValidatorPropertyShape(valueNode),\n\t\t\t\toptional: false,\n\t\t\t}\n\t\t})\n\t}\n\n\tif (typeName === 'ZodArray') {\n\t\tconst argNode = callExpression.getFirstChildByKind(SyntaxKind.SyntaxList)?.getFirstChild()\n\t\tif (argNode) {\n\t\t\tconst elementShape = isZodCallExpression(argNode)\n\t\t\t\t? getZodCallShape(argNode)\n\t\t\t\t: getValidatorPropertyShape(argNode)\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\trole: 'array' as const,\n\t\t\t\t\tshape: elementShape,\n\t\t\t\t\toptional: false,\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\t\t// Handle chained form: z.string().array()\n\t\tconst propertyAccess = callExpression.getFirstChildByKind(SyntaxKind.PropertyAccessExpression)\n\t\tconst receiverCall = propertyAccess?.getFirstChildByKind(SyntaxKind.CallExpression)\n\t\tif (receiverCall && isZodCallExpression(receiverCall)) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\trole: 'array' as const,\n\t\t\t\t\tshape: getZodCallShape(receiverCall),\n\t\t\t\t\toptional: false,\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\t\treturn 'unknown_zod_array'\n\t}\n\n\tif (typeName === 'ZodEnum') {\n\t\tconst typeArgs = returnType.getTypeArguments()\n\t\tif (typeArgs.length > 0) {\n\t\t\tconst enumType = typeArgs[0]\n\t\t\tconst properties = enumType.getProperties()\n\t\t\tconst shapes: ShapeOfUnionEntry[] = properties.map((prop) => ({\n\t\t\t\trole: 'union_entry' as const,\n\t\t\t\tshape: getProperTypeShape(prop.getTypeAtLocation(callExpression), callExpression, []),\n\t\t\t\toptional: false,\n\t\t\t}))\n\t\t\tif (shapes.length === 1) {\n\t\t\t\treturn shapes[0].shape\n\t\t\t}\n\t\t\tif (shapes.length > 1) {\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\trole: 'union' as const,\n\t\t\t\t\t\tshape: shapes,\n\t\t\t\t\t\toptional: false,\n\t\t\t\t\t},\n\t\t\t\t]\n\t\t\t}\n\t\t}\n\t\treturn 'unknown_zod_enum'\n\t}\n\n\tif (typeName === 'ZodOptional') {\n\t\tconst innerCallExpression = callExpression\n\t\t\t.getFirstChildByKind(SyntaxKind.PropertyAccessExpression)\n\t\t\t?.getFirstChildByKind(SyntaxKind.CallExpression)\n\t\tif (innerCallExpression && isZodCallExpression(innerCallExpression)) {\n\t\t\treturn getZodCallShape(innerCallExpression)\n\t\t}\n\t\treturn 'unknown_zod_optional'\n\t}\n\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown zod type: ${typeName}`)\n\treturn 'unknown_zod'\n}\n\nexport const getValidatorPropertyShape = (innerLiteralNode: Node): ShapeOfType['shape'] => {\n\t// Zod validator (e.g. z.number(), z.string(), z.object({...}), z.array(...))\n\tif (isZodCallExpression(innerLiteralNode)) {\n\t\treturn getZodCallShape(innerLiteralNode)\n\t}\n\n\t// Inline definition with `as Validator<...>` clause\n\tconst inlineValidatorAsExpression = innerLiteralNode\n\t\t.getParent()!\n\t\t.getFirstChildByKind(SyntaxKind.AsExpression)\n\tif (inlineValidatorAsExpression) {\n\t\tconst typeReference = inlineValidatorAsExpression.getLastChildByKind(SyntaxKind.TypeReference)!\n\t\treturn getTypeReferenceShape(typeReference)\n\t}\n\n\t// Variable with `: Validator<...>` clause\n\tconst childTypeReferenceNode = innerLiteralNode.getParent()!.getFirstChildByKind(SyntaxKind.TypeReference)\n\tif (childTypeReferenceNode) {\n\t\treturn getTypeReferenceShape(childTypeReferenceNode)\n\t}\n\n\t// `RequiredParam<...>` inline call expression\n\tif (innerLiteralNode.getParent()!.getChildrenOfKind(SyntaxKind.SyntaxList).length >= 2) {\n\t\tconst typeNode = innerLiteralNode\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t\t.getFirstChild()!\n\t\treturn getRecursiveNodeShape(typeNode)\n\t}\n\n\t// `RequestParam | RequiredParam | OptionalParam` call expression\n\tconst childCallExpressionNode = innerLiteralNode.getParent()!.getFirstChildByKind(SyntaxKind.CallExpression)\n\tif (childCallExpressionNode) {\n\t\tconst callExpressionArgument = findNodeImplementation(\n\t\t\tchildCallExpressionNode.getFirstChildByKind(SyntaxKind.SyntaxList)!.getFirstChild()!,\n\t\t)\n\n\t\t// Param is a type reference\n\t\tconst typeReferenceNode = callExpressionArgument\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.TypeReference)!\n\t\tif (typeReferenceNode) {\n\t\t\treturn getProperTypeShape(typeReferenceNode.getType(), typeReferenceNode, [])\n\t\t}\n\n\t\tconst thingyNode = callExpressionArgument\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.ObjectLiteralExpression)!\n\t\tif (thingyNode) {\n\t\t\treturn getValidatorPropertyShape(thingyNode)\n\t\t}\n\n\t\tif (callExpressionArgument.getKind() === SyntaxKind.CallExpression) {\n\t\t\treturn getValidatorPropertyShape(callExpressionArgument)\n\t\t}\n\n\t\tif (callExpressionArgument.getKind() === SyntaxKind.IntersectionType) {\n\t\t\treturn getValidatorPropertyShape(callExpressionArgument)\n\t\t}\n\n\t\tconst fileName = innerLiteralNode.getSourceFile().getFilePath().split('/').pop()\n\t\tLogger.warn(`[${fileName}] Unknown call expression argument: ${callExpressionArgument.getKindName()}`)\n\t\treturn 'unknown_3'\n\t}\n\n\t// Attempting to infer type from `parse` function\n\tconst innerNodePropertyAssignments = innerLiteralNode\n\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t.getChildrenOfKind(SyntaxKind.PropertyAssignment)\n\tconst parsePropertyAssignment = innerNodePropertyAssignments.find((prop) => {\n\t\treturn prop.getFirstChildByKind(SyntaxKind.Identifier)?.getText() === 'parse'\n\t})\n\tif (parsePropertyAssignment) {\n\t\tconst returnType = findPropertyAssignmentValueNode(parsePropertyAssignment)\n\t\t\t.asKind(SyntaxKind.ArrowFunction)!\n\t\t\t.getReturnType()\n\t\treturn getProperTypeShape(returnType, parsePropertyAssignment)\n\t}\n\n\t// Import statement\n\tconst importTypeNode = innerLiteralNode\n\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)\n\t\t?.getFirstChildByKind(SyntaxKind.ImportType)\n\tif (importTypeNode) {\n\t\tconst indexOfGreaterThanToken = importTypeNode\n\t\t\t.getLastChildByKind(SyntaxKind.GreaterThanToken)!\n\t\t\t.getChildIndex()\n\t\tconst targetSyntaxList = importTypeNode.getChildAtIndex(indexOfGreaterThanToken - 1)\n\t\treturn getRecursiveNodeShape(targetSyntaxList.getFirstChild()!)\n\t}\n\n\t// Intersection type with Validator\n\tconst intersectionType = innerLiteralNode.isKind(SyntaxKind.IntersectionType)\n\t\t? innerLiteralNode\n\t\t: innerLiteralNode.getParent()?.isKind(SyntaxKind.VariableDeclaration)\n\t\t\t? innerLiteralNode.getParent()?.getFirstChildByKind(SyntaxKind.IntersectionType)\n\t\t\t: null\n\n\tif (intersectionType) {\n\t\tconst validatorType = intersectionType.getFirstChildByKind(SyntaxKind.TypeReference)\n\t\tif (validatorType) {\n\t\t\treturn getTypeReferenceShape(validatorType)\n\t\t}\n\t}\n\n\tconst fileName = innerLiteralNode.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown import type node`)\n\n\treturn 'unknown_2'\n}\n\nexport const getValidatorPropertyOptionality = (node: Node): boolean => {\n\tif (isZodCallExpression(node)) {\n\t\tconst callExpression = node.asKind(SyntaxKind.CallExpression)!\n\t\tconst returnType = callExpression.getReturnType()\n\t\tconst typeName = returnType.getSymbol()?.getName() ?? ''\n\t\tif (typeName === 'ZodOptional') {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\tconst identifierNode = callExpressionNode.getFirstChildByKind(SyntaxKind.Identifier)\n\t\tif (identifierNode?.getText() === 'OptionalParam') {\n\t\t\treturn true\n\t\t} else if (identifierNode?.getText() === 'RequiredParam') {\n\t\t\treturn false\n\t\t}\n\n\t\tconst syntaxListNode = callExpressionNode.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\tconst literalExpression = findNodeImplementation(syntaxListNode.getFirstChild()!)\n\t\treturn getValidatorPropertyOptionality(literalExpression)\n\t}\n\n\tconst syntaxListNode = node.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\treturn assignmentNodes.some((node) => {\n\t\tconst identifierNode = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tconst identifierName = identifierNode.getText()\n\n\t\tif (identifierName === 'optional') {\n\t\t\tconst value = findPropertyAssignmentValueNode(node)\n\t\t\treturn value.getKind() === SyntaxKind.TrueKeyword\n\t\t}\n\t\treturn false\n\t})\n}\n\nexport const getValidatorPropertyStringValue = (\n\tnodeOrReference: Node,\n\tname: 'description' | 'errorMessage',\n): string => {\n\tif (isZodCallExpression(nodeOrReference)) {\n\t\treturn ''\n\t}\n\n\tconst node = findNodeImplementation(nodeOrReference)\n\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\tconst targetChild = callExpressionNode.getLastChildByKind(SyntaxKind.SyntaxList)!\n\t\treturn getValidatorPropertyStringValue(targetChild, name)\n\t}\n\n\tconst syntaxListNode = node.asKind(SyntaxKind.SyntaxList)\n\tif (syntaxListNode) {\n\t\tconst children = syntaxListNode.getChildren().map((c) => getValidatorPropertyStringValue(c, name))\n\t\treturn children.find((value) => !!value && value !== 'unknown_25') || ''\n\t}\n\n\tconst objectLiteralNode = node.asKind(SyntaxKind.ObjectLiteralExpression)\n\tif (objectLiteralNode) {\n\t\tconst values = getValuesOfObjectLiteral(objectLiteralNode)\n\t\tconst targetValue = values.find((value) => value.identifier === name)\n\t\tif (!targetValue) {\n\t\t\treturn ''\n\t\t}\n\t\tif (Array.isArray(targetValue.value)) {\n\t\t\treturn 'array'\n\t\t}\n\t\treturn targetValue.value || ''\n\t}\n\n\tconst intersectionTypeNode = node.asKind(SyntaxKind.IntersectionType)\n\tif (intersectionTypeNode) {\n\t\treturn (\n\t\t\tintersectionTypeNode\n\t\t\t\t.getTypeNodes()\n\t\t\t\t.flatMap((t) => getValidatorPropertyStringValue(t, name))\n\t\t\t\t.filter((v) => !!v && v !== 'unknown_25')[0] || 'unknown_27'\n\t\t)\n\t}\n\n\tconst typeLiteralNode = node.asKind(SyntaxKind.TypeLiteral)\n\tif (typeLiteralNode) {\n\t\treturn getValidatorPropertyStringValue(typeLiteralNode.getFirstChildByKind(SyntaxKind.SyntaxList)!, name)\n\t}\n\n\tconst propertySignatureNode = node.asKind(SyntaxKind.PropertySignature)\n\tif (propertySignatureNode) {\n\t\tconst identifier = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tif (identifier.getText() === name) {\n\t\t\tconst targetNode = findPropertyAssignmentValueNode(propertySignatureNode).getFirstDescendantByKind(\n\t\t\t\tSyntaxKind.StringLiteral,\n\t\t\t)!\n\t\t\treturn targetNode.getLiteralText()\n\t\t}\n\t}\n\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.dev(`[${fileName}] Unknown property string value node ${node.getKindName()}`)\n\treturn 'unknown_25'\n}\n\nconst isPromise = (type: Type) => {\n\tconst symbol = type.getSymbol()\n\tif (!type.isObject() || !symbol) {\n\t\treturn false\n\t}\n\tconst args = type.getTypeArguments()\n\treturn symbol.getName() === 'Promise' && args.length === 1\n}\n\nexport const getProperTypeShape = (\n\ttypeOrPromise: Type,\n\tatLocation: Node,\n\tstack: Type[] = [],\n): ShapeOfType['shape'] => {\n\tconst typeName = typeOrPromise.getAliasSymbol()?.getName()\n\tif (typeName && OpenApiManager.getInstance().hasExposedModel(typeName)) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'ref',\n\t\t\t\tshape: typeName,\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tconst type = isPromise(typeOrPromise) ? typeOrPromise.getTypeArguments()[0] : typeOrPromise\n\n\tif (stack.some((previousType) => previousType === type)) {\n\t\treturn 'circular'\n\t}\n\n\tconst cacheKey = type.compilerType\n\tconst cached = typeShapeCache.get(cacheKey)\n\tif (cached !== undefined) {\n\t\treturn cached\n\t}\n\tconst result = computeProperTypeShape(type, atLocation, stack)\n\ttypeShapeCache.set(cacheKey, result)\n\treturn result\n}\n\nconst computeProperTypeShape = (type: Type, atLocation: Node, stack: Type[]): ShapeOfType['shape'] => {\n\tconst nextStack = stack.concat(type)\n\n\tif (type.getText() === 'void') {\n\t\treturn 'void'\n\t}\n\n\tif (type.isAny()) {\n\t\treturn 'any'\n\t}\n\n\tif (type.isUnknown()) {\n\t\treturn 'unknown'\n\t}\n\n\tif (type.isNull()) {\n\t\treturn 'null'\n\t}\n\n\tif (type.isUndefined()) {\n\t\treturn 'undefined'\n\t}\n\n\tif (type.isBoolean() || type.isBooleanLiteral()) {\n\t\treturn 'boolean'\n\t}\n\n\tif (type.isStringLiteral()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'literal_string' as const,\n\t\t\t\tshape: String(type.getLiteralValue()!),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isNumberLiteral()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'literal_number' as const,\n\t\t\t\tshape: String(type.getLiteralValue()!),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isString() || type.isTemplateLiteral()) {\n\t\treturn 'string'\n\t}\n\n\tif (type.isNumber()) {\n\t\treturn 'number'\n\t}\n\n\tif (type.getText() === 'bigint') {\n\t\treturn 'bigint'\n\t}\n\n\tif (type.isTuple()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'tuple' as const,\n\t\t\t\tshape: type.getTupleElements().map((t) => ({\n\t\t\t\t\trole: 'tuple_entry' as const,\n\t\t\t\t\tshape: getProperTypeShape(t, atLocation, nextStack),\n\t\t\t\t\toptional: false,\n\t\t\t\t})),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isArray()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'array' as const,\n\t\t\t\tshape: getProperTypeShape(type.getArrayElementType()!, atLocation, nextStack),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\t// Handles `interface Foo extends Array<T>` (e.g. Prisma's JsonArray)\n\t// which fails type.isArray() but is still array-like\n\tif (type.isObject()) {\n\t\tconst arrayElementType = type.getNumberIndexType()\n\t\tconst baseTypes = type.getBaseTypes()\n\t\tconst arrayBase = baseTypes?.find((base) => base.isArray())\n\t\tif (arrayBase) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\trole: 'array' as const,\n\t\t\t\t\tshape: getProperTypeShape(\n\t\t\t\t\t\tarrayBase.getArrayElementType() ?? arrayElementType!,\n\t\t\t\t\t\tatLocation,\n\t\t\t\t\t\tnextStack,\n\t\t\t\t\t),\n\t\t\t\t\toptional: false,\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\t}\n\n\tconst typeSymbolName = type.getSymbol()?.getName()\n\n\tconst bufferLikeTypes = new Set([\n\t\t'Buffer',\n\t\t'Uint8Array',\n\t\t'Int8Array',\n\t\t'Uint8ClampedArray',\n\t\t'Int16Array',\n\t\t'Uint16Array',\n\t\t'Int32Array',\n\t\t'Uint32Array',\n\t\t'Float32Array',\n\t\t'Float64Array',\n\t\t'BigInt64Array',\n\t\t'BigUint64Array',\n\t\t'ArrayBuffer',\n\t\t'SharedArrayBuffer',\n\t\t'ReadableStream',\n\t])\n\n\tif (type.isObject() && typeSymbolName && bufferLikeTypes.has(typeSymbolName)) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'buffer' as const,\n\t\t\t\tshape: 'buffer',\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isObject() && typeSymbolName === 'RegExp') {\n\t\treturn 'string'\n\t}\n\n\tif (type.isObject() && typeSymbolName === 'Map') {\n\t\tconst typeArgs = type.getTypeArguments()\n\t\tconst valueType = typeArgs[1]\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'record' as const,\n\t\t\t\tshape: valueType ? getProperTypeShape(valueType, atLocation, nextStack) : 'unknown',\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isObject() && typeSymbolName === 'Set') {\n\t\tconst typeArgs = type.getTypeArguments()\n\t\tconst elementType = typeArgs[0]\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'array' as const,\n\t\t\t\tshape: elementType ? getProperTypeShape(elementType, atLocation, nextStack) : 'unknown',\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isObject() && type.getProperties().length === 0) {\n\t\tconst targetType = type.getAliasTypeArguments()[1] ?? type.getStringIndexType()\n\t\tif (targetType) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\trole: 'record' as const,\n\t\t\t\t\tshape: getProperTypeShape(targetType, atLocation, nextStack),\n\t\t\t\t\toptional: false,\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\t}\n\n\tif (type.isObject()) {\n\t\tif (typeSymbolName === 'Date' || type.getText() === 'Date') {\n\t\t\treturn 'Date'\n\t\t}\n\t\treturn type\n\t\t\t.getProperties()\n\t\t\t.map((prop) => {\n\t\t\t\tconst valueDeclaration = prop.getValueDeclaration() || prop.getDeclarations()[0]!\n\t\t\t\tconst shape = getProperTypeShape(prop.getTypeAtLocation(atLocation), atLocation, nextStack)\n\t\t\t\tif (!valueDeclaration) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\t\tshape,\n\t\t\t\t\t\toptional: false,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst valueDeclarationNode =\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.PropertySignature) ||\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.PropertyAssignment) ||\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.ShorthandPropertyAssignment)\n\n\t\t\t\tif (!valueDeclarationNode) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\t\tshape,\n\t\t\t\t\t\toptional: false,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isOptional = prop.getTypeAtLocation(atLocation).isNullable()\n\n\t\t\t\treturn {\n\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\tshape,\n\t\t\t\t\toptional: isOptional,\n\t\t\t\t}\n\t\t\t})\n\t\t\t.filter((val) => val.shape !== 'undefined')\n\t}\n\n\tif (type.isUnion()) {\n\t\tconst unfilteredShapes: ShapeOfUnionEntry[] = type.getUnionTypes().map((type) => ({\n\t\t\trole: 'union_entry',\n\t\t\tshape: getProperTypeShape(type, atLocation, nextStack),\n\t\t\toptional: false,\n\t\t}))\n\n\t\tconst dedupedShapes = unfilteredShapes.filter(\n\t\t\t(type, index, arr) => !arr.find((dup, dupIndex) => dup.shape === type.shape && dupIndex > index),\n\t\t)\n\t\tconst isNullable = dedupedShapes.some((shape) => shape.shape === 'undefined')\n\t\tconst shapes = dedupedShapes.filter((shape) => shape.shape !== 'undefined')\n\t\tif (shapes.length === 1) {\n\t\t\treturn shapes[0].shape\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'union',\n\t\t\t\tshape: shapes,\n\t\t\t\toptional: isNullable,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isIntersection()) {\n\t\tconst children = type.getIntersectionTypes()\n\t\tconst shapesOfChildren = children\n\t\t\t.map((child) => getProperTypeShape(child, atLocation, nextStack))\n\t\t\t.filter((shape) => typeof shape !== 'string') as ShapeOfProperty[][]\n\t\treturn shapesOfChildren.reduce<ShapeOfType[]>((total, current) => [...total, ...current], [])\n\t}\n\n\tconst fileName = atLocation.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown type shape node ${type.getText()}`)\n\treturn 'unknown_5'\n}\n\nconst getLiteralValueOfNode = (node: Node): string | string[] | unknown[] => {\n\tif (node.isKind(SyntaxKind.Identifier)) {\n\t\treturn getLiteralValueOfNode(findNodeImplementation(node))\n\t} else if (node.isKind(SyntaxKind.StringLiteral)) {\n\t\treturn node.getLiteralValue()\n\t} else if (node.isKind(SyntaxKind.ArrayLiteralExpression)) {\n\t\treturn node.forEachChildAsArray().map((child) => getLiteralValueOfNode(child)) as string[]\n\t} else if (node.isKind(SyntaxKind.PropertyAccessExpression)) {\n\t\treturn getLiteralValueOfNode(findPropertyAssignmentValueNode(node))\n\t} else if (node.isKind(SyntaxKind.ObjectLiteralExpression)) {\n\t\treturn getValuesOfObjectLiteral(node)\n\t}\n\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.dev(`[${fileName}] Unknown literal value node ${node.getKindName()}`)\n\n\treturn 'unknown_6'\n}\n\nexport const resolveEndpointPath = (node: Node): string | null => {\n\tconst callExpression = node.getFirstDescendantByKind(SyntaxKind.CallExpression)\n\tif (!callExpression) return null\n\n\tconst firstArg = callExpression.getArguments()[0]\n\tif (!firstArg) return null\n\n\tconst argType = firstArg.getType()\n\tif (argType.isStringLiteral()) {\n\t\treturn argType.getLiteralValue() as string\n\t}\n\n\treturn null\n}\n\nexport const getValuesOfObjectLiteral = (objectLiteralNode: Node<ts.ObjectLiteralExpression>) => {\n\tconst syntaxListNode = objectLiteralNode.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\tconst properties = assignmentNodes.map((node) => {\n\t\tconst identifierNode = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tconst identifierName = identifierNode.getText()\n\n\t\tconst assignmentValueNode = node.getLastChild()!\n\t\tconst targetNode = findNodeImplementation(assignmentValueNode)\n\t\tconst value = getLiteralValueOfNode(targetNode)\n\n\t\treturn {\n\t\t\tidentifier: identifierName,\n\t\t\tvalue,\n\t\t}\n\t})\n\n\treturn properties || []\n}\n"],"names":["implementationCache","nodeShapeCache","typeShapeCache","findNodeImplementation","node","cached","SyntaxKind","implementationNode","assignmentValueNode","result","definitionNode","findPropertyAssignmentValueNode","identifierChildren","child","getTypeReferenceShape","firstChild","getRecursiveNodeShape","nodeOrReference","computeRecursiveNodeShape","typeName","OpenApiManager","literalNode","typeLiteralNode","propNode","identifier","valueNode","questionMarkToken","typeReferenceNode","lastChild","getProperTypeShape","unionTypeNode","typeQueryNode","qualifiedNameNode","callExpressionNode","awaitExpressionNode","asExpressionNode","fileName","Logger","getShapeOfValidatorLiteral","objectLiteralNode","identifierNode","identifierName","innerLiteralNode","getValidatorPropertyShape","getValidatorPropertyOptionality","getValidatorPropertyStringValue","isZodCallExpression","callExpression","getZodCallShape","returnType","objectLiteral","syntaxList","prop","argNode","receiverCall","typeArgs","shapes","innerCallExpression","inlineValidatorAsExpression","typeReference","childTypeReferenceNode","typeNode","childCallExpressionNode","callExpressionArgument","thingyNode","parsePropertyAssignment","importTypeNode","indexOfGreaterThanToken","targetSyntaxList","intersectionType","validatorType","syntaxListNode","literalExpression","name","targetChild","c","value","targetValue","getValuesOfObjectLiteral","intersectionTypeNode","t","v","propertySignatureNode","isPromise","type","symbol","args","typeOrPromise","atLocation","stack","previousType","cacheKey","computeProperTypeShape","nextStack","arrayElementType","arrayBase","base","typeSymbolName","bufferLikeTypes","valueType","elementType","targetType","valueDeclaration","shape","isOptional","val","dedupedShapes","index","arr","dup","dupIndex","isNullable","total","current","getLiteralValueOfNode","resolveEndpointPath","firstArg","argType","targetNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nodeParsers.cjs","sources":["../../../src/openapi/analyzerModule/nodeParsers.ts"],"sourcesContent":["import {\n\tNode,\n\tPropertyAccessExpression,\n\tPropertyAssignment,\n\tPropertySignature,\n\tShorthandPropertyAssignment,\n\tSyntaxKind,\n\tts,\n\tType,\n\tTypeReferenceNode,\n} from 'ts-morph'\n\nimport { Logger } from '../../utils/logger'\nimport { OpenApiManager } from '../manager/OpenApiManager'\nimport { ShapeOfProperty, ShapeOfType, ShapeOfUnionEntry } from './types'\n\nconst implementationCache = new WeakMap<Node, Node>()\nconst nodeShapeCache = new WeakMap<Node, ShapeOfType['shape']>()\nconst typeShapeCache = new WeakMap<object, ShapeOfType['shape']>()\n\nexport const findNodeImplementation = (node: Node): Node => {\n\tconst cached = implementationCache.get(node)\n\tif (cached) {\n\t\treturn cached\n\t}\n\n\tif (node.getKind() === SyntaxKind.Identifier) {\n\t\tconst implementationNode = node.asKind(SyntaxKind.Identifier)!.getImplementations()[0]?.getNode()\n\t\tif (implementationNode) {\n\t\t\tconst implementationParentNode = implementationNode.getParent()!\n\t\t\tconst assignmentValueNode = implementationParentNode.getLastChild()!\n\t\t\tif (assignmentValueNode === node) {\n\t\t\t\tthrow new Error('Recursive implementation found')\n\t\t\t}\n\t\t\tconst result = findNodeImplementation(assignmentValueNode)\n\t\t\timplementationCache.set(node, result)\n\t\t\treturn result\n\t\t}\n\n\t\tconst definitionNode = node.asKind(SyntaxKind.Identifier)!.getDefinitions()[0]?.getNode()\n\t\tif (definitionNode) {\n\t\t\tconst definitionParentNode = definitionNode.getParent()!\n\t\t\tconst assignmentValueNode = definitionParentNode.getLastChild()!\n\t\t\tif (assignmentValueNode === node) {\n\t\t\t\tthrow new Error('Recursive implementation found')\n\t\t\t}\n\t\t\tconst result = findNodeImplementation(assignmentValueNode)\n\t\t\timplementationCache.set(node, result)\n\t\t\treturn result\n\t\t}\n\t\tthrow new Error('No implementation nor definition available')\n\t}\n\n\timplementationCache.set(node, node)\n\treturn node\n}\n\nexport const findPropertyAssignmentValueNode = (\n\tnode:\n\t\t| PropertyAssignment\n\t\t| TypeReferenceNode\n\t\t| PropertySignature\n\t\t| PropertyAccessExpression\n\t\t| ShorthandPropertyAssignment,\n): Node => {\n\tconst identifierChildren = node.getChildrenOfKind(SyntaxKind.Identifier)\n\tif (identifierChildren.length === 2) {\n\t\treturn findNodeImplementation(identifierChildren[1])\n\t}\n\tconst lastMatchingChild = node.getChildren().reverse()\n\treturn lastMatchingChild.find(\n\t\t(child) =>\n\t\t\tchild.getKind() !== SyntaxKind.GreaterThanToken &&\n\t\t\tchild.getKind() !== SyntaxKind.CommaToken &&\n\t\t\tchild.getKind() !== SyntaxKind.SemicolonToken,\n\t)!\n}\n\nexport const getTypeReferenceShape = (node: TypeReferenceNode): ShapeOfType['shape'] => {\n\tconst firstChild = node.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\tif (firstChild.isKind(SyntaxKind.SyntaxList)) {\n\t\treturn getRecursiveNodeShape(firstChild.getFirstChild()!)\n\t} else {\n\t\treturn getRecursiveNodeShape(firstChild)\n\t}\n}\n\nexport const getRecursiveNodeShape = (nodeOrReference: Node): ShapeOfType['shape'] => {\n\tconst cached = nodeShapeCache.get(nodeOrReference)\n\tif (cached !== undefined) {\n\t\treturn cached\n\t}\n\tconst result = computeRecursiveNodeShape(nodeOrReference)\n\tnodeShapeCache.set(nodeOrReference, result)\n\treturn result\n}\n\nconst computeRecursiveNodeShape = (nodeOrReference: Node): ShapeOfType['shape'] => {\n\tconst typeName = nodeOrReference.getSymbol()?.getName()\n\tif (typeName && OpenApiManager.getInstance().hasExposedModel(typeName)) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'ref',\n\t\t\t\tshape: typeName,\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tconst node = findNodeImplementation(nodeOrReference)\n\n\t// Undefined\n\tconst undefinedNode = node.asKind(SyntaxKind.UndefinedKeyword)\n\tif (undefinedNode) {\n\t\treturn 'undefined'\n\t}\n\n\t// Literal type\n\tconst literalNode = node.asKind(SyntaxKind.LiteralType)\n\tif (literalNode) {\n\t\tif (literalNode.getFirstChildByKind(SyntaxKind.TrueKeyword)) {\n\t\t\treturn 'true'\n\t\t}\n\t\tif (literalNode.getFirstChildByKind(SyntaxKind.FalseKeyword)) {\n\t\t\treturn 'false'\n\t\t}\n\t}\n\n\t// Boolean literal\n\tconst booleanLiteralNode =\n\t\tnode.asKind(SyntaxKind.BooleanKeyword) ||\n\t\tnode.asKind(SyntaxKind.TrueKeyword) ||\n\t\tnode.asKind(SyntaxKind.FalseKeyword)\n\tif (booleanLiteralNode) {\n\t\treturn 'boolean'\n\t}\n\n\t// String literal\n\tconst stringLiteralNode = node.asKind(SyntaxKind.StringKeyword) || node.asKind(SyntaxKind.StringLiteral)\n\tif (stringLiteralNode) {\n\t\treturn 'string'\n\t}\n\n\t// Number literal\n\tconst numberLiteralNode = node.asKind(SyntaxKind.NumberKeyword) || node.asKind(SyntaxKind.NumericLiteral)\n\tif (numberLiteralNode) {\n\t\treturn 'number'\n\t}\n\n\t// BigInt literal\n\tconst bigIntNode = node.asKind(SyntaxKind.BigIntKeyword) || node.asKind(SyntaxKind.BigIntLiteral)\n\tif (bigIntNode) {\n\t\treturn 'bigint'\n\t}\n\n\t// Type literal\n\tconst typeLiteralNode = node.asKind(SyntaxKind.TypeLiteral)\n\tif (typeLiteralNode) {\n\t\tconst properties = typeLiteralNode\n\t\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t\t.getChildrenOfKind(SyntaxKind.PropertySignature)\n\n\t\tconst propertyShapes = properties.map((propNode) => {\n\t\t\tconst identifier = propNode.getFirstChildByKind(SyntaxKind.Identifier)!\n\t\t\tconst valueNode = findPropertyAssignmentValueNode(propNode)\n\t\t\tconst questionMarkToken = identifier.getNextSiblingIfKind(SyntaxKind.QuestionToken)\n\t\t\treturn {\n\t\t\t\trole: 'property' as const,\n\t\t\t\tidentifier: identifier.getText(),\n\t\t\t\tshape: getRecursiveNodeShape(valueNode),\n\t\t\t\toptional: valueNode.getType().isNullable() || !!questionMarkToken,\n\t\t\t}\n\t\t})\n\t\treturn propertyShapes\n\t}\n\n\t// Type reference\n\tconst typeReferenceNode = node.asKind(SyntaxKind.TypeReference)\n\tif (typeReferenceNode) {\n\t\treturn getRecursiveNodeShape(typeReferenceNode.getFirstChild()!)\n\t}\n\n\t// Property access expression\n\tconst propertyAccessNode = node.asKind(SyntaxKind.PropertyAccessExpression)\n\tif (propertyAccessNode) {\n\t\tconst lastChild = findNodeImplementation(node.getLastChild()!)\n\t\treturn getProperTypeShape(lastChild.asKind(SyntaxKind.CallExpression)!.getReturnType(), lastChild)\n\t}\n\n\t// Union type\n\tconst unionTypeNode = node.asKind(SyntaxKind.UnionType)\n\tif (unionTypeNode) {\n\t\treturn getProperTypeShape(unionTypeNode.getType(), node)\n\t}\n\n\t// Typeof query\n\tconst typeQueryNode = node.asKind(SyntaxKind.TypeQuery)\n\tif (typeQueryNode) {\n\t\treturn getRecursiveNodeShape(typeQueryNode.getLastChild()!)\n\t}\n\n\t// Qualified name\n\tconst qualifiedNameNode = node.asKind(SyntaxKind.QualifiedName)\n\tif (qualifiedNameNode) {\n\t\treturn getRecursiveNodeShape(qualifiedNameNode.getLastChild()!)\n\t}\n\n\t// Call expression\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\treturn getProperTypeShape(callExpressionNode.getReturnType(), callExpressionNode)\n\t}\n\n\t// Await expression\n\tconst awaitExpressionNode = node.asKind(SyntaxKind.AwaitExpression)\n\tif (awaitExpressionNode) {\n\t\treturn getRecursiveNodeShape(awaitExpressionNode.getChildAtIndex(1)!)\n\t}\n\n\t// 'As' Expression\n\tconst asExpressionNode = node.asKind(SyntaxKind.AsExpression)\n\tif (asExpressionNode) {\n\t\treturn getRecursiveNodeShape(asExpressionNode.getChildAtIndex(2)!)\n\t}\n\n\t// TODO\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown node type: ${node.getKindName()}`)\n\treturn 'unknown_1'\n}\n\nexport const getShapeOfValidatorLiteral = (\n\tobjectLiteralNode: Node<ts.ObjectLiteralExpression>,\n): (ShapeOfProperty & { description: string; errorMessage: string })[] => {\n\tconst syntaxListNode = objectLiteralNode.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\tconst properties = assignmentNodes.map((node) => {\n\t\tconst identifierNode = node.getFirstChild()!\n\t\tconst identifierName = (() => {\n\t\t\tif (identifierNode.isKind(SyntaxKind.Identifier)) {\n\t\t\t\treturn identifierNode.getText()\n\t\t\t}\n\t\t\tif (identifierNode.isKind(SyntaxKind.StringLiteral)) {\n\t\t\t\treturn identifierNode.getLiteralText()\n\t\t\t}\n\t\t\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\t\t\tLogger.warn(`[${fileName}] Unknown identifier name: ${identifierNode.getText()}`)\n\t\t\treturn 'unknown_30'\n\t\t})()\n\n\t\tconst assignmentValueNode = node.getLastChild()!\n\t\tconst innerLiteralNode = findNodeImplementation(assignmentValueNode)\n\n\t\treturn {\n\t\t\trole: 'property' as const,\n\t\t\tidentifier: identifierName,\n\t\t\tshape: getValidatorPropertyShape(innerLiteralNode),\n\t\t\toptional: getValidatorPropertyOptionality(innerLiteralNode),\n\t\t\tdescription: getValidatorPropertyStringValue(innerLiteralNode, 'description'),\n\t\t\terrorMessage: getValidatorPropertyStringValue(innerLiteralNode, 'errorMessage'),\n\t\t}\n\t})\n\n\treturn properties || []\n}\n\nconst isZodCallExpression = (node: Node): boolean => {\n\tconst callExpression = node.asKind(SyntaxKind.CallExpression)\n\tif (!callExpression) {\n\t\treturn false\n\t}\n\tconst returnType = callExpression.getReturnType()\n\tconst typeName = returnType.getSymbol()?.getName() ?? ''\n\treturn typeName.startsWith('Zod')\n}\n\nconst getZodCallShape = (node: Node): ShapeOfType['shape'] => {\n\tconst callExpression = node.asKind(SyntaxKind.CallExpression)!\n\tconst returnType = callExpression.getReturnType()\n\tconst outputProp = returnType.getProperty('_output')\n\tif (outputProp) {\n\t\treturn getProperTypeShape(outputProp.getTypeAtLocation(callExpression), callExpression)\n\t}\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tconst typeName = returnType.getSymbol()?.getName() ?? ''\n\tLogger.warn(`[${fileName}] Unknown zod type: ${typeName}`)\n\treturn 'unknown_zod'\n}\n\nexport const getValidatorPropertyShape = (innerLiteralNode: Node): ShapeOfType['shape'] => {\n\t// Zod validator (e.g. z.number(), z.string(), z.object({...}), z.array(...))\n\tif (isZodCallExpression(innerLiteralNode)) {\n\t\treturn getZodCallShape(innerLiteralNode)\n\t}\n\n\t// Inline definition with `as Validator<...>` clause\n\tconst inlineValidatorAsExpression = innerLiteralNode\n\t\t.getParent()!\n\t\t.getFirstChildByKind(SyntaxKind.AsExpression)\n\tif (inlineValidatorAsExpression) {\n\t\tconst typeReference = inlineValidatorAsExpression.getLastChildByKind(SyntaxKind.TypeReference)!\n\t\treturn getTypeReferenceShape(typeReference)\n\t}\n\n\t// Variable with `: Validator<...>` clause\n\tconst childTypeReferenceNode = innerLiteralNode.getParent()!.getFirstChildByKind(SyntaxKind.TypeReference)\n\tif (childTypeReferenceNode) {\n\t\treturn getTypeReferenceShape(childTypeReferenceNode)\n\t}\n\n\t// `RequiredParam<...>` inline call expression\n\tif (innerLiteralNode.getParent()!.getChildrenOfKind(SyntaxKind.SyntaxList).length >= 2) {\n\t\tconst typeNode = innerLiteralNode\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t\t.getFirstChild()!\n\t\treturn getRecursiveNodeShape(typeNode)\n\t}\n\n\t// `RequestParam | RequiredParam | OptionalParam` call expression\n\tconst childCallExpressionNode = innerLiteralNode.getParent()!.getFirstChildByKind(SyntaxKind.CallExpression)\n\tif (childCallExpressionNode) {\n\t\tconst callExpressionArgument = findNodeImplementation(\n\t\t\tchildCallExpressionNode.getFirstChildByKind(SyntaxKind.SyntaxList)!.getFirstChild()!,\n\t\t)\n\n\t\t// Param is a type reference\n\t\tconst typeReferenceNode = callExpressionArgument\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.TypeReference)!\n\t\tif (typeReferenceNode) {\n\t\t\treturn getProperTypeShape(typeReferenceNode.getType(), typeReferenceNode, [])\n\t\t}\n\n\t\tconst thingyNode = callExpressionArgument\n\t\t\t.getParent()!\n\t\t\t.getFirstChildByKind(SyntaxKind.ObjectLiteralExpression)!\n\t\tif (thingyNode) {\n\t\t\treturn getValidatorPropertyShape(thingyNode)\n\t\t}\n\n\t\tif (callExpressionArgument.getKind() === SyntaxKind.CallExpression) {\n\t\t\treturn getValidatorPropertyShape(callExpressionArgument)\n\t\t}\n\n\t\tif (callExpressionArgument.getKind() === SyntaxKind.IntersectionType) {\n\t\t\treturn getValidatorPropertyShape(callExpressionArgument)\n\t\t}\n\n\t\tconst fileName = innerLiteralNode.getSourceFile().getFilePath().split('/').pop()\n\t\tLogger.warn(`[${fileName}] Unknown call expression argument: ${callExpressionArgument.getKindName()}`)\n\t\treturn 'unknown_3'\n\t}\n\n\t// Attempting to infer type from `parse` function\n\tconst innerNodePropertyAssignments = innerLiteralNode\n\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\t.getChildrenOfKind(SyntaxKind.PropertyAssignment)\n\tconst parsePropertyAssignment = innerNodePropertyAssignments.find((prop) => {\n\t\treturn prop.getFirstChildByKind(SyntaxKind.Identifier)?.getText() === 'parse'\n\t})\n\tif (parsePropertyAssignment) {\n\t\tconst returnType = findPropertyAssignmentValueNode(parsePropertyAssignment)\n\t\t\t.asKind(SyntaxKind.ArrowFunction)!\n\t\t\t.getReturnType()\n\t\treturn getProperTypeShape(returnType, parsePropertyAssignment)\n\t}\n\n\t// Import statement\n\tconst importTypeNode = innerLiteralNode\n\t\t.getFirstChildByKind(SyntaxKind.SyntaxList)\n\t\t?.getFirstChildByKind(SyntaxKind.ImportType)\n\tif (importTypeNode) {\n\t\tconst indexOfGreaterThanToken = importTypeNode\n\t\t\t.getLastChildByKind(SyntaxKind.GreaterThanToken)!\n\t\t\t.getChildIndex()\n\t\tconst targetSyntaxList = importTypeNode.getChildAtIndex(indexOfGreaterThanToken - 1)\n\t\treturn getRecursiveNodeShape(targetSyntaxList.getFirstChild()!)\n\t}\n\n\t// Intersection type with Validator\n\tconst intersectionType = innerLiteralNode.isKind(SyntaxKind.IntersectionType)\n\t\t? innerLiteralNode\n\t\t: innerLiteralNode.getParent()?.isKind(SyntaxKind.VariableDeclaration)\n\t\t\t? innerLiteralNode.getParent()?.getFirstChildByKind(SyntaxKind.IntersectionType)\n\t\t\t: null\n\n\tif (intersectionType) {\n\t\tconst validatorType = intersectionType.getFirstChildByKind(SyntaxKind.TypeReference)\n\t\tif (validatorType) {\n\t\t\treturn getTypeReferenceShape(validatorType)\n\t\t}\n\t}\n\n\tconst fileName = innerLiteralNode.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown import type node`)\n\n\treturn 'unknown_2'\n}\n\nexport const getValidatorPropertyOptionality = (node: Node): boolean => {\n\tif (isZodCallExpression(node)) {\n\t\tconst callExpression = node.asKind(SyntaxKind.CallExpression)!\n\t\tconst returnType = callExpression.getReturnType()\n\t\tconst typeName = returnType.getSymbol()?.getName() ?? ''\n\t\tif (typeName === 'ZodOptional') {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\tconst identifierNode = callExpressionNode.getFirstChildByKind(SyntaxKind.Identifier)\n\t\tif (identifierNode?.getText() === 'OptionalParam') {\n\t\t\treturn true\n\t\t} else if (identifierNode?.getText() === 'RequiredParam') {\n\t\t\treturn false\n\t\t}\n\n\t\tconst syntaxListNode = callExpressionNode.getFirstChildByKind(SyntaxKind.SyntaxList)!\n\t\tconst literalExpression = findNodeImplementation(syntaxListNode.getFirstChild()!)\n\t\treturn getValidatorPropertyOptionality(literalExpression)\n\t}\n\n\tconst syntaxListNode = node.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\treturn assignmentNodes.some((node) => {\n\t\tconst identifierNode = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tconst identifierName = identifierNode.getText()\n\n\t\tif (identifierName === 'optional') {\n\t\t\tconst value = findPropertyAssignmentValueNode(node)\n\t\t\treturn value.getKind() === SyntaxKind.TrueKeyword\n\t\t}\n\t\treturn false\n\t})\n}\n\nexport const getValidatorPropertyStringValue = (\n\tnodeOrReference: Node,\n\tname: 'description' | 'errorMessage',\n): string => {\n\tif (isZodCallExpression(nodeOrReference)) {\n\t\treturn ''\n\t}\n\n\tconst node = findNodeImplementation(nodeOrReference)\n\n\tconst callExpressionNode = node.asKind(SyntaxKind.CallExpression)\n\tif (callExpressionNode) {\n\t\tconst targetChild = callExpressionNode.getLastChildByKind(SyntaxKind.SyntaxList)!\n\t\treturn getValidatorPropertyStringValue(targetChild, name)\n\t}\n\n\tconst syntaxListNode = node.asKind(SyntaxKind.SyntaxList)\n\tif (syntaxListNode) {\n\t\tconst children = syntaxListNode.getChildren().map((c) => getValidatorPropertyStringValue(c, name))\n\t\treturn children.find((value) => !!value && value !== 'unknown_25') || ''\n\t}\n\n\tconst objectLiteralNode = node.asKind(SyntaxKind.ObjectLiteralExpression)\n\tif (objectLiteralNode) {\n\t\tconst values = getValuesOfObjectLiteral(objectLiteralNode)\n\t\tconst targetValue = values.find((value) => value.identifier === name)\n\t\tif (!targetValue) {\n\t\t\treturn ''\n\t\t}\n\t\tif (Array.isArray(targetValue.value)) {\n\t\t\treturn 'array'\n\t\t}\n\t\treturn targetValue.value || ''\n\t}\n\n\tconst intersectionTypeNode = node.asKind(SyntaxKind.IntersectionType)\n\tif (intersectionTypeNode) {\n\t\treturn (\n\t\t\tintersectionTypeNode\n\t\t\t\t.getTypeNodes()\n\t\t\t\t.flatMap((t) => getValidatorPropertyStringValue(t, name))\n\t\t\t\t.filter((v) => !!v && v !== 'unknown_25')[0] || 'unknown_27'\n\t\t)\n\t}\n\n\tconst typeLiteralNode = node.asKind(SyntaxKind.TypeLiteral)\n\tif (typeLiteralNode) {\n\t\treturn getValidatorPropertyStringValue(typeLiteralNode.getFirstChildByKind(SyntaxKind.SyntaxList)!, name)\n\t}\n\n\tconst propertySignatureNode = node.asKind(SyntaxKind.PropertySignature)\n\tif (propertySignatureNode) {\n\t\tconst identifier = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tif (identifier.getText() === name) {\n\t\t\tconst targetNode = findPropertyAssignmentValueNode(propertySignatureNode).getFirstDescendantByKind(\n\t\t\t\tSyntaxKind.StringLiteral,\n\t\t\t)!\n\t\t\treturn targetNode.getLiteralText()\n\t\t}\n\t}\n\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.dev(`[${fileName}] Unknown property string value node ${node.getKindName()}`)\n\treturn 'unknown_25'\n}\n\nconst isPromise = (type: Type) => {\n\tconst symbol = type.getSymbol()\n\tif (!type.isObject() || !symbol) {\n\t\treturn false\n\t}\n\tconst args = type.getTypeArguments()\n\treturn symbol.getName() === 'Promise' && args.length === 1\n}\n\nexport const getProperTypeShape = (\n\ttypeOrPromise: Type,\n\tatLocation: Node,\n\tstack: Type[] = [],\n): ShapeOfType['shape'] => {\n\tconst typeName = typeOrPromise.getAliasSymbol()?.getName()\n\tif (typeName && OpenApiManager.getInstance().hasExposedModel(typeName)) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'ref',\n\t\t\t\tshape: typeName,\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tconst type = isPromise(typeOrPromise) ? typeOrPromise.getTypeArguments()[0] : typeOrPromise\n\n\tif (stack.some((previousType) => previousType === type)) {\n\t\treturn 'circular'\n\t}\n\n\tconst cacheKey = type.compilerType\n\tconst cached = typeShapeCache.get(cacheKey)\n\tif (cached !== undefined) {\n\t\treturn cached\n\t}\n\tconst result = computeProperTypeShape(type, atLocation, stack)\n\ttypeShapeCache.set(cacheKey, result)\n\treturn result\n}\n\nconst computeProperTypeShape = (type: Type, atLocation: Node, stack: Type[]): ShapeOfType['shape'] => {\n\tconst nextStack = stack.concat(type)\n\n\tif (type.getText() === 'void') {\n\t\treturn 'void'\n\t}\n\n\tif (type.isAny()) {\n\t\treturn 'any'\n\t}\n\n\tif (type.isUnknown()) {\n\t\treturn 'unknown'\n\t}\n\n\tif (type.isNull()) {\n\t\treturn 'null'\n\t}\n\n\tif (type.isUndefined()) {\n\t\treturn 'undefined'\n\t}\n\n\tif (type.isBoolean() || type.isBooleanLiteral()) {\n\t\treturn 'boolean'\n\t}\n\n\tif (type.isStringLiteral()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'literal_string' as const,\n\t\t\t\tshape: String(type.getLiteralValue()!),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isNumberLiteral()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'literal_number' as const,\n\t\t\t\tshape: String(type.getLiteralValue()!),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isString() || type.isTemplateLiteral()) {\n\t\treturn 'string'\n\t}\n\n\tif (type.isNumber()) {\n\t\treturn 'number'\n\t}\n\n\tif (type.getText() === 'bigint') {\n\t\treturn 'bigint'\n\t}\n\n\tif (type.isTuple()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'tuple' as const,\n\t\t\t\tshape: type.getTupleElements().map((t) => ({\n\t\t\t\t\trole: 'tuple_entry' as const,\n\t\t\t\t\tshape: getProperTypeShape(t, atLocation, nextStack),\n\t\t\t\t\toptional: false,\n\t\t\t\t})),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isArray()) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'array' as const,\n\t\t\t\tshape: getProperTypeShape(type.getArrayElementType()!, atLocation, nextStack),\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\t// Handles `interface Foo extends Array<T>` (e.g. Prisma's JsonArray)\n\t// which fails type.isArray() but is still array-like\n\tif (type.isObject()) {\n\t\tconst arrayElementType = type.getNumberIndexType()\n\t\tconst baseTypes = type.getBaseTypes()\n\t\tconst arrayBase = baseTypes?.find((base) => base.isArray())\n\t\tif (arrayBase) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\trole: 'array' as const,\n\t\t\t\t\tshape: getProperTypeShape(\n\t\t\t\t\t\tarrayBase.getArrayElementType() ?? arrayElementType!,\n\t\t\t\t\t\tatLocation,\n\t\t\t\t\t\tnextStack,\n\t\t\t\t\t),\n\t\t\t\t\toptional: false,\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\t}\n\n\tconst typeSymbolName = type.getSymbol()?.getName()\n\n\tconst bufferLikeTypes = new Set([\n\t\t'Buffer',\n\t\t'Uint8Array',\n\t\t'Int8Array',\n\t\t'Uint8ClampedArray',\n\t\t'Int16Array',\n\t\t'Uint16Array',\n\t\t'Int32Array',\n\t\t'Uint32Array',\n\t\t'Float32Array',\n\t\t'Float64Array',\n\t\t'BigInt64Array',\n\t\t'BigUint64Array',\n\t\t'ArrayBuffer',\n\t\t'SharedArrayBuffer',\n\t\t'ReadableStream',\n\t])\n\n\tif (type.isObject() && typeSymbolName && bufferLikeTypes.has(typeSymbolName)) {\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'buffer' as const,\n\t\t\t\tshape: 'buffer',\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isObject() && typeSymbolName === 'RegExp') {\n\t\treturn 'string'\n\t}\n\n\tif (type.isObject() && typeSymbolName === 'Map') {\n\t\tconst typeArgs = type.getTypeArguments()\n\t\tconst valueType = typeArgs[1]\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'record' as const,\n\t\t\t\tshape: valueType ? getProperTypeShape(valueType, atLocation, nextStack) : 'unknown',\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isObject() && typeSymbolName === 'Set') {\n\t\tconst typeArgs = type.getTypeArguments()\n\t\tconst elementType = typeArgs[0]\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'array' as const,\n\t\t\t\tshape: elementType ? getProperTypeShape(elementType, atLocation, nextStack) : 'unknown',\n\t\t\t\toptional: false,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isObject() && type.getProperties().length === 0) {\n\t\tconst targetType = type.getAliasTypeArguments()[1] ?? type.getStringIndexType()\n\t\tif (targetType) {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\trole: 'record' as const,\n\t\t\t\t\tshape: getProperTypeShape(targetType, atLocation, nextStack),\n\t\t\t\t\toptional: false,\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\t}\n\n\tif (type.isObject()) {\n\t\tif (typeSymbolName === 'Date' || type.getText() === 'Date') {\n\t\t\treturn 'Date'\n\t\t}\n\t\treturn type\n\t\t\t.getProperties()\n\t\t\t.map((prop) => {\n\t\t\t\tconst valueDeclaration = prop.getValueDeclaration() || prop.getDeclarations()[0]!\n\t\t\t\tconst shape = getProperTypeShape(prop.getTypeAtLocation(atLocation), atLocation, nextStack)\n\t\t\t\tif (!valueDeclaration) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\t\tshape,\n\t\t\t\t\t\toptional: false,\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconst valueDeclarationNode =\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.PropertySignature) ||\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.PropertyAssignment) ||\n\t\t\t\t\tvalueDeclaration.asKind(SyntaxKind.ShorthandPropertyAssignment)\n\n\t\t\t\tif (!valueDeclarationNode) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\t\tshape,\n\t\t\t\t\t\toptional: false,\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst isOptional = prop.getTypeAtLocation(atLocation).isNullable()\n\n\t\t\t\treturn {\n\t\t\t\t\trole: 'property' as const,\n\t\t\t\t\tidentifier: prop.getName(),\n\t\t\t\t\tshape,\n\t\t\t\t\toptional: isOptional,\n\t\t\t\t}\n\t\t\t})\n\t\t\t.filter((val) => val.shape !== 'undefined')\n\t}\n\n\tif (type.isUnion()) {\n\t\tconst unfilteredShapes: ShapeOfUnionEntry[] = type.getUnionTypes().map((type) => ({\n\t\t\trole: 'union_entry',\n\t\t\tshape: getProperTypeShape(type, atLocation, nextStack),\n\t\t\toptional: false,\n\t\t}))\n\n\t\tconst dedupedShapes = unfilteredShapes.filter(\n\t\t\t(type, index, arr) => !arr.find((dup, dupIndex) => dup.shape === type.shape && dupIndex > index),\n\t\t)\n\t\tconst isNullable = dedupedShapes.some((shape) => shape.shape === 'undefined')\n\t\tconst shapes = dedupedShapes.filter((shape) => shape.shape !== 'undefined')\n\t\tif (shapes.length === 1) {\n\t\t\treturn shapes[0].shape\n\t\t}\n\t\treturn [\n\t\t\t{\n\t\t\t\trole: 'union',\n\t\t\t\tshape: shapes,\n\t\t\t\toptional: isNullable,\n\t\t\t},\n\t\t]\n\t}\n\n\tif (type.isIntersection()) {\n\t\tconst children = type.getIntersectionTypes()\n\t\tconst shapesOfChildren = children\n\t\t\t.map((child) => getProperTypeShape(child, atLocation, nextStack))\n\t\t\t.filter((shape) => typeof shape !== 'string') as ShapeOfProperty[][]\n\t\treturn shapesOfChildren.reduce<ShapeOfType[]>((total, current) => [...total, ...current], [])\n\t}\n\n\tconst fileName = atLocation.getSourceFile().getFilePath().split('/').pop()\n\tLogger.warn(`[${fileName}] Unknown type shape node ${type.getText()}`)\n\treturn 'unknown_5'\n}\n\nconst getLiteralValueOfNode = (node: Node): string | string[] | unknown[] => {\n\tif (node.isKind(SyntaxKind.Identifier)) {\n\t\treturn getLiteralValueOfNode(findNodeImplementation(node))\n\t} else if (node.isKind(SyntaxKind.StringLiteral)) {\n\t\treturn node.getLiteralValue()\n\t} else if (node.isKind(SyntaxKind.ArrayLiteralExpression)) {\n\t\treturn node.forEachChildAsArray().map((child) => getLiteralValueOfNode(child)) as string[]\n\t} else if (node.isKind(SyntaxKind.PropertyAccessExpression)) {\n\t\treturn getLiteralValueOfNode(findPropertyAssignmentValueNode(node))\n\t} else if (node.isKind(SyntaxKind.ObjectLiteralExpression)) {\n\t\treturn getValuesOfObjectLiteral(node)\n\t}\n\n\tconst fileName = node.getSourceFile().getFilePath().split('/').pop()\n\tLogger.dev(`[${fileName}] Unknown literal value node ${node.getKindName()}`)\n\n\treturn 'unknown_6'\n}\n\nexport const resolveEndpointPath = (node: Node): string | null => {\n\tconst callExpression = node.getFirstDescendantByKind(SyntaxKind.CallExpression)\n\tif (!callExpression) return null\n\n\tconst firstArg = callExpression.getArguments()[0]\n\tif (!firstArg) return null\n\n\tconst argType = firstArg.getType()\n\tif (argType.isStringLiteral()) {\n\t\treturn argType.getLiteralValue() as string\n\t}\n\n\treturn null\n}\n\nexport const getValuesOfObjectLiteral = (objectLiteralNode: Node<ts.ObjectLiteralExpression>) => {\n\tconst syntaxListNode = objectLiteralNode.getFirstDescendantByKind(SyntaxKind.SyntaxList)!\n\tconst assignmentNodes = syntaxListNode.getChildrenOfKind(SyntaxKind.PropertyAssignment)!\n\n\tconst properties = assignmentNodes.map((node) => {\n\t\tconst identifierNode = node.getFirstDescendantByKind(SyntaxKind.Identifier)!\n\t\tconst identifierName = identifierNode.getText()\n\n\t\tconst assignmentValueNode = node.getLastChild()!\n\t\tconst targetNode = findNodeImplementation(assignmentValueNode)\n\t\tconst value = getLiteralValueOfNode(targetNode)\n\n\t\treturn {\n\t\t\tidentifier: identifierName,\n\t\t\tvalue,\n\t\t}\n\t})\n\n\treturn properties || []\n}\n"],"names":["implementationCache","nodeShapeCache","typeShapeCache","findNodeImplementation","node","cached","SyntaxKind","implementationNode","assignmentValueNode","result","definitionNode","findPropertyAssignmentValueNode","identifierChildren","child","getTypeReferenceShape","firstChild","getRecursiveNodeShape","nodeOrReference","computeRecursiveNodeShape","typeName","OpenApiManager","literalNode","typeLiteralNode","propNode","identifier","valueNode","questionMarkToken","typeReferenceNode","lastChild","getProperTypeShape","unionTypeNode","typeQueryNode","qualifiedNameNode","callExpressionNode","awaitExpressionNode","asExpressionNode","fileName","Logger","getShapeOfValidatorLiteral","objectLiteralNode","identifierNode","identifierName","innerLiteralNode","getValidatorPropertyShape","getValidatorPropertyOptionality","getValidatorPropertyStringValue","isZodCallExpression","callExpression","getZodCallShape","returnType","outputProp","inlineValidatorAsExpression","typeReference","childTypeReferenceNode","typeNode","childCallExpressionNode","callExpressionArgument","thingyNode","parsePropertyAssignment","prop","importTypeNode","indexOfGreaterThanToken","targetSyntaxList","intersectionType","validatorType","syntaxListNode","literalExpression","name","targetChild","c","value","targetValue","getValuesOfObjectLiteral","intersectionTypeNode","t","v","propertySignatureNode","isPromise","type","symbol","args","typeOrPromise","atLocation","stack","previousType","cacheKey","computeProperTypeShape","nextStack","arrayElementType","arrayBase","base","typeSymbolName","bufferLikeTypes","valueType","elementType","targetType","valueDeclaration","shape","isOptional","val","dedupedShapes","index","arr","dup","dupIndex","isNullable","shapes","total","current","getLiteralValueOfNode","resolveEndpointPath","firstArg","argType","targetNode"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodeParsers.d.ts","sourceRoot":"","sources":["../../../src/openapi/analyzerModule/nodeParsers.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,IAAI,EACJ,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,2BAA2B,EAE3B,EAAE,EACF,IAAI,EACJ,iBAAiB,EACjB,MAAM,UAAU,CAAA;AAIjB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAA;AAMzE,eAAO,MAAM,sBAAsB,SAAU,IAAI,KAAG,IAmCnD,CAAA;AAED,eAAO,MAAM,+BAA+B,SAExC,kBAAkB,GAClB,iBAAiB,GACjB,iBAAiB,GACjB,wBAAwB,GACxB,2BAA2B,KAC5B,IAYF,CAAA;AAED,eAAO,MAAM,qBAAqB,SAAU,iBAAiB,KAAG,WAAW,CAAC,OAAO,CAOlF,CAAA;AAED,eAAO,MAAM,qBAAqB,oBAAqB,IAAI,KAAG,WAAW,CAAC,OAAO,CAQhF,CAAA;AAwID,eAAO,MAAM,0BAA0B,sBACnB,IAAI,CAAC,EAAE,CAAC,uBAAuB,CAAC,KACjD,CAAC,eAAe,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,EAgCnE,CAAA;
|
|
1
|
+
{"version":3,"file":"nodeParsers.d.ts","sourceRoot":"","sources":["../../../src/openapi/analyzerModule/nodeParsers.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,IAAI,EACJ,wBAAwB,EACxB,kBAAkB,EAClB,iBAAiB,EACjB,2BAA2B,EAE3B,EAAE,EACF,IAAI,EACJ,iBAAiB,EACjB,MAAM,UAAU,CAAA;AAIjB,OAAO,EAAE,eAAe,EAAE,WAAW,EAAqB,MAAM,SAAS,CAAA;AAMzE,eAAO,MAAM,sBAAsB,SAAU,IAAI,KAAG,IAmCnD,CAAA;AAED,eAAO,MAAM,+BAA+B,SAExC,kBAAkB,GAClB,iBAAiB,GACjB,iBAAiB,GACjB,wBAAwB,GACxB,2BAA2B,KAC5B,IAYF,CAAA;AAED,eAAO,MAAM,qBAAqB,SAAU,iBAAiB,KAAG,WAAW,CAAC,OAAO,CAOlF,CAAA;AAED,eAAO,MAAM,qBAAqB,oBAAqB,IAAI,KAAG,WAAW,CAAC,OAAO,CAQhF,CAAA;AAwID,eAAO,MAAM,0BAA0B,sBACnB,IAAI,CAAC,EAAE,CAAC,uBAAuB,CAAC,KACjD,CAAC,eAAe,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,EAgCnE,CAAA;AAyBD,eAAO,MAAM,yBAAyB,qBAAsB,IAAI,KAAG,WAAW,CAAC,OAAO,CA6GrF,CAAA;AAED,eAAO,MAAM,+BAA+B,SAAU,IAAI,KAAG,OAsC5D,CAAA;AAED,eAAO,MAAM,+BAA+B,oBAC1B,IAAI,QACf,aAAa,GAAG,cAAc,KAClC,MA6DF,CAAA;AAWD,eAAO,MAAM,kBAAkB,kBACf,IAAI,cACP,IAAI,UACT,IAAI,EAAE,KACX,WAAW,CAAC,OAAO,CA0BrB,CAAA;AAoRD,eAAO,MAAM,mBAAmB,SAAU,IAAI,KAAG,MAAM,GAAG,IAazD,CAAA;AAED,eAAO,MAAM,wBAAwB,sBAAuB,IAAI,CAAC,EAAE,CAAC,uBAAuB,CAAC;;;GAmB3F,CAAA"}
|