moonflower 1.4.9 → 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.
Files changed (41) hide show
  1. package/dist/openapi/analyzerModule/analyzerModule.cjs +1 -1
  2. package/dist/openapi/analyzerModule/analyzerModule.cjs.map +1 -1
  3. package/dist/openapi/analyzerModule/analyzerModule.d.ts +3 -2
  4. package/dist/openapi/analyzerModule/analyzerModule.d.ts.map +1 -1
  5. package/dist/openapi/analyzerModule/analyzerModule.mjs +163 -125
  6. package/dist/openapi/analyzerModule/analyzerModule.mjs.map +1 -1
  7. package/dist/openapi/analyzerModule/analyzerWorker.cjs +2 -0
  8. package/dist/openapi/analyzerModule/analyzerWorker.cjs.map +1 -0
  9. package/dist/openapi/analyzerModule/analyzerWorker.d.ts +2 -0
  10. package/dist/openapi/analyzerModule/analyzerWorker.d.ts.map +1 -0
  11. package/dist/openapi/analyzerModule/analyzerWorker.mjs +44 -0
  12. package/dist/openapi/analyzerModule/analyzerWorker.mjs.map +1 -0
  13. package/dist/openapi/analyzerModule/nodeParsers.cjs +1 -1
  14. package/dist/openapi/analyzerModule/nodeParsers.cjs.map +1 -1
  15. package/dist/openapi/analyzerModule/nodeParsers.d.ts.map +1 -1
  16. package/dist/openapi/analyzerModule/nodeParsers.mjs +199 -264
  17. package/dist/openapi/analyzerModule/nodeParsers.mjs.map +1 -1
  18. package/dist/openapi/analyzerModule/test/TestCase.d.ts +1 -0
  19. package/dist/openapi/analyzerModule/test/TestCase.d.ts.map +1 -1
  20. package/dist/openapi/analyzerModule/test/workerGlobalSetup.d.ts +3 -0
  21. package/dist/openapi/analyzerModule/test/workerGlobalSetup.d.ts.map +1 -0
  22. package/dist/openapi/analyzerModule/workerPaths.d.ts +2 -0
  23. package/dist/openapi/analyzerModule/workerPaths.d.ts.map +1 -0
  24. package/dist/openapi/analyzerModule/workerPool.cjs +2 -0
  25. package/dist/openapi/analyzerModule/workerPool.cjs.map +1 -0
  26. package/dist/openapi/analyzerModule/workerPool.d.ts +33 -0
  27. package/dist/openapi/analyzerModule/workerPool.d.ts.map +1 -0
  28. package/dist/openapi/analyzerModule/workerPool.mjs +46 -0
  29. package/dist/openapi/analyzerModule/workerPool.mjs.map +1 -0
  30. package/package.json +1 -1
  31. package/src/openapi/analyzerModule/analyzerModule.ts +142 -12
  32. package/src/openapi/analyzerModule/analyzerWorker.ts +73 -0
  33. package/src/openapi/analyzerModule/nodeParsers.ts +4 -104
  34. package/src/openapi/analyzerModule/test/TestCase.ts +1 -0
  35. package/src/openapi/analyzerModule/test/openApiAnalyzer.zod.spec.data.ts +6 -0
  36. package/src/openapi/analyzerModule/test/openApiAnalyzer.zod.spec.ts +8 -0
  37. package/src/openapi/analyzerModule/test/workerGlobalSetup.ts +25 -0
  38. package/src/openapi/analyzerModule/workerPaths.ts +4 -0
  39. package/src/openapi/analyzerModule/workerPool.ts +92 -0
  40. package/src/test/app.spec.ts +10 -1
  41. package/vite.config.ts +5 -0
@@ -1 +1 @@
1
- {"version":3,"file":"nodeParsers.mjs","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":";;;AAgBA,MAAMA,wBAA0B,QAAoB,GAC9CC,wBAAqB,QAAoC,GACzDC,wBAAqB,QAAsC,GAEpDC,IAAyB,CAACC,MAAqB;AACrD,QAAAC,IAASL,EAAoB,IAAII,CAAI;AAC3C,MAAIC;AACI,WAAAA;AAGR,MAAID,EAAK,cAAcE,EAAW,YAAY;AACvC,UAAAC,IAAqBH,EAAK,OAAOE,EAAW,UAAU,EAAG,mBAAmB,EAAE,CAAC,GAAG,QAAQ;AAChG,QAAIC,GAAoB;AAEjB,YAAAC,IAD2BD,EAAmB,UAAU,EACT,aAAa;AAClE,UAAIC,MAAwBJ;AACrB,cAAA,IAAI,MAAM,gCAAgC;AAE3C,YAAAK,IAASN,EAAuBK,CAAmB;AACrC,aAAAR,EAAA,IAAII,GAAMK,CAAM,GAC7BA;AAAA,IAAA;AAGF,UAAAC,IAAiBN,EAAK,OAAOE,EAAW,UAAU,EAAG,eAAe,EAAE,CAAC,GAAG,QAAQ;AACxF,QAAII,GAAgB;AAEb,YAAAF,IADuBE,EAAe,UAAU,EACL,aAAa;AAC9D,UAAIF,MAAwBJ;AACrB,cAAA,IAAI,MAAM,gCAAgC;AAE3C,YAAAK,IAASN,EAAuBK,CAAmB;AACrC,aAAAR,EAAA,IAAII,GAAMK,CAAM,GAC7BA;AAAA,IAAA;AAEF,UAAA,IAAI,MAAM,4CAA4C;AAAA,EAAA;AAGzC,SAAAT,EAAA,IAAII,GAAMA,CAAI,GAC3BA;AACR,GAEaO,IAAkC,CAC9CP,MAMU;AACV,QAAMQ,IAAqBR,EAAK,kBAAkBE,EAAW,UAAU;AACnE,SAAAM,EAAmB,WAAW,IAC1BT,EAAuBS,EAAmB,CAAC,CAAC,IAE1BR,EAAK,YAAY,EAAE,QAAQ,EAC5B;AAAA,IACxB,CAACS,MACAA,EAAM,QAAA,MAAcP,EAAW,oBAC/BO,EAAM,cAAcP,EAAW,cAC/BO,EAAM,QAAA,MAAcP,EAAW;AAAA,EACjC;AACD,GAEaQ,IAAwB,CAACV,MAAkD;AACvF,QAAMW,IAAaX,EAAK,oBAAoBE,EAAW,UAAU;AACjE,SAAIS,EAAW,OAAOT,EAAW,UAAU,IACnCU,EAAsBD,EAAW,eAAgB,IAEjDC,EAAsBD,CAAU;AAEzC,GAEaC,IAAwB,CAACC,MAAgD;AAC/E,QAAAZ,IAASJ,EAAe,IAAIgB,CAAe;AACjD,MAAIZ,MAAW;AACP,WAAAA;AAEF,QAAAI,IAASS,EAA0BD,CAAe;AACzC,SAAAhB,EAAA,IAAIgB,GAAiBR,CAAM,GACnCA;AACR,GAEMS,IAA4B,CAACD,MAAgD;AAClF,QAAME,IAAWF,EAAgB,UAAU,GAAG,QAAQ;AACtD,MAAIE,KAAYC,EAAe,YAAc,EAAA,gBAAgBD,CAAQ;AAC7D,WAAA;AAAA,MACN;AAAA,QACC,MAAM;AAAA,QACN,OAAOA;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,IAEZ;AAGK,QAAAf,IAAOD,EAAuBc,CAAe;AAInD,MADsBb,EAAK,OAAOE,EAAW,gBAAgB;AAErD,WAAA;AAIR,QAAMe,IAAcjB,EAAK,OAAOE,EAAW,WAAW;AACtD,MAAIe,GAAa;AAChB,QAAIA,EAAY,oBAAoBf,EAAW,WAAW;AAClD,aAAA;AAER,QAAIe,EAAY,oBAAoBf,EAAW,YAAY;AACnD,aAAA;AAAA,EACR;AAQD,MAHCF,EAAK,OAAOE,EAAW,cAAc,KACrCF,EAAK,OAAOE,EAAW,WAAW,KAClCF,EAAK,OAAOE,EAAW,YAAY;AAE5B,WAAA;AAKR,MAD0BF,EAAK,OAAOE,EAAW,aAAa,KAAKF,EAAK,OAAOE,EAAW,aAAa;AAE/F,WAAA;AAKR,MAD0BF,EAAK,OAAOE,EAAW,aAAa,KAAKF,EAAK,OAAOE,EAAW,cAAc;AAEhG,WAAA;AAKR,MADmBF,EAAK,OAAOE,EAAW,aAAa,KAAKF,EAAK,OAAOE,EAAW,aAAa;AAExF,WAAA;AAIR,QAAMgB,IAAkBlB,EAAK,OAAOE,EAAW,WAAW;AAC1D,MAAIgB;AAgBI,WAfYA,EACjB,oBAAoBhB,EAAW,UAAU,EACzC,kBAAkBA,EAAW,iBAAiB,EAEd,IAAI,CAACiB,MAAa;AACnD,YAAMC,IAAaD,EAAS,oBAAoBjB,EAAW,UAAU,GAC/DmB,IAAYd,EAAgCY,CAAQ,GACpDG,IAAoBF,EAAW,qBAAqBlB,EAAW,aAAa;AAC3E,aAAA;AAAA,QACN,MAAM;AAAA,QACN,YAAYkB,EAAW,QAAQ;AAAA,QAC/B,OAAOR,EAAsBS,CAAS;AAAA,QACtC,UAAUA,EAAU,UAAU,WAAW,KAAK,CAAC,CAACC;AAAA,MACjD;AAAA,IAAA,CACA;AAKF,QAAMC,IAAoBvB,EAAK,OAAOE,EAAW,aAAa;AAC9D,MAAIqB;AACI,WAAAX,EAAsBW,EAAkB,eAAgB;AAKhE,MAD2BvB,EAAK,OAAOE,EAAW,wBAAwB,GAClD;AACvB,UAAMsB,IAAYzB,EAAuBC,EAAK,aAAA,CAAe;AACtD,WAAAyB,EAAmBD,EAAU,OAAOtB,EAAW,cAAc,EAAG,iBAAiBsB,CAAS;AAAA,EAAA;AAIlG,QAAME,IAAgB1B,EAAK,OAAOE,EAAW,SAAS;AACtD,MAAIwB;AACH,WAAOD,EAAmBC,EAAc,QAAQ,GAAG1B,CAAI;AAIxD,QAAM2B,IAAgB3B,EAAK,OAAOE,EAAW,SAAS;AACtD,MAAIyB;AACI,WAAAf,EAAsBe,EAAc,cAAe;AAI3D,QAAMC,IAAoB5B,EAAK,OAAOE,EAAW,aAAa;AAC9D,MAAI0B;AACI,WAAAhB,EAAsBgB,EAAkB,cAAe;AAI/D,QAAMC,IAAqB7B,EAAK,OAAOE,EAAW,cAAc;AAChE,MAAI2B;AACH,WAAOJ,EAAmBI,EAAmB,cAAc,GAAGA,CAAkB;AAIjF,QAAMC,IAAsB9B,EAAK,OAAOE,EAAW,eAAe;AAClE,MAAI4B;AACH,WAAOlB,EAAsBkB,EAAoB,gBAAgB,CAAC,CAAE;AAIrE,QAAMC,IAAmB/B,EAAK,OAAOE,EAAW,YAAY;AAC5D,MAAI6B;AACH,WAAOnB,EAAsBmB,EAAiB,gBAAgB,CAAC,CAAE;AAI5D,QAAAC,IAAWhC,EAAK,cAAc,EAAE,cAAc,MAAM,GAAG,EAAE,IAAI;AACnE,SAAAiC,EAAO,KAAK,IAAID,CAAQ,wBAAwBhC,EAAK,YAAa,CAAA,EAAE,GAC7D;AACR,GAEakC,IAA6B,CACzCC,MAEuBA,EAAkB,yBAAyBjC,EAAW,UAAU,EAChD,kBAAkBA,EAAW,kBAAkB,EAEnD,IAAI,CAACF,MAAS;AAC1C,QAAAoC,IAAiBpC,EAAK,cAAc,GACpCqC,KAAkB,MAAM;AAC7B,QAAID,EAAe,OAAOlC,EAAW,UAAU;AAC9C,aAAOkC,EAAe,QAAQ;AAE/B,QAAIA,EAAe,OAAOlC,EAAW,aAAa;AACjD,aAAOkC,EAAe,eAAe;AAEhC,UAAAJ,IAAWhC,EAAK,cAAc,EAAE,cAAc,MAAM,GAAG,EAAE,IAAI;AACnE,WAAAiC,EAAO,KAAK,IAAID,CAAQ,8BAA8BI,EAAe,QAAS,CAAA,EAAE,GACzE;AAAA,EAAA,GACL,GAEGhC,IAAsBJ,EAAK,aAAa,GACxCsC,IAAmBvC,EAAuBK,CAAmB;AAE5D,SAAA;AAAA,IACN,MAAM;AAAA,IACN,YAAYiC;AAAA,IACZ,OAAOE,EAA0BD,CAAgB;AAAA,IACjD,UAAUE,EAAgCF,CAAgB;AAAA,IAC1D,aAAaG,EAAgCH,GAAkB,aAAa;AAAA,IAC5E,cAAcG,EAAgCH,GAAkB,cAAc;AAAA,EAC/E;AAAA,CACA,KAEoB,CAAC,GAGjBI,IAAsB,CAAC1C,MAAwB;AACpD,QAAM2C,IAAiB3C,EAAK,OAAOE,EAAW,cAAc;AAC5D,SAAKyC,KAGcA,EAAe,cAAc,EACpB,UAAU,GAAG,QAAa,KAAA,IACtC,WAAW,KAAK,IAJxB;AAKT,GAEMC,IAAkB,CAAC5C,MAAqC;AAC7D,QAAM2C,IAAiB3C,EAAK,OAAOE,EAAW,cAAc,GACtD2C,IAAaF,EAAe,cAAc,GAC1C5B,IAAW8B,EAAW,UAAU,GAAG,QAAa,KAAA;AAEtD,MAAI9B,MAAa;AACT,WAAA;AAER,MAAIA,MAAa;AACT,WAAA;AAER,MAAIA,MAAa;AACT,WAAA;AAER,MAAIA,MAAa;AACT,WAAA;AAGR,MAAIA,MAAa,aAAa;AAE7B,UAAM+B,IADUH,EAAe,oBAAoBzC,EAAW,UAAU,GAAG,cAAc,GAC1D,OAAOA,EAAW,uBAAuB;AACxE,QAAI,CAAC4C;AACG,aAAA;AAER,UAAMC,IAAaD,EAAc,oBAAoB5C,EAAW,UAAU;AAC1E,WAAK6C,IAGcA,EAAW,kBAAkB7C,EAAW,kBAAkB,EAC3D,IAAI,CAAC8C,MAAS;AAC/B,YAAM5B,IAAa4B,EAAK,oBAAoB9C,EAAW,UAAU,EAAG,QAAQ,GACtEmB,IAAY2B,EAAK,aAAa;AAC7B,aAAA;AAAA,QACN,MAAM;AAAA,QACN,YAAA5B;AAAA,QACA,OAAOsB,EAAoBrB,CAAS,IACjCuB,EAAgBvB,CAAS,IACzBkB,EAA0BlB,CAAS;AAAA,QACtC,UAAU;AAAA,MACX;AAAA,IAAA,CACA,IAdO,CAAC;AAAA,EAcR;AAGF,MAAIN,MAAa,YAAY;AAC5B,UAAMkC,IAAUN,EAAe,oBAAoBzC,EAAW,UAAU,GAAG,cAAc;AACzF,QAAI+C;AAII,aAAA;AAAA,QACN;AAAA,UACC,MAAM;AAAA,UACN,OANmBP,EAAoBO,CAAO,IAC7CL,EAAgBK,CAAO,IACvBV,EAA0BU,CAAO;AAAA,UAKlC,UAAU;AAAA,QAAA;AAAA,MAEZ;AAID,UAAMC,IADiBP,EAAe,oBAAoBzC,EAAW,wBAAwB,GACxD,oBAAoBA,EAAW,cAAc;AAC9E,WAAAgD,KAAgBR,EAAoBQ,CAAY,IAC5C;AAAA,MACN;AAAA,QACC,MAAM;AAAA,QACN,OAAON,EAAgBM,CAAY;AAAA,QACnC,UAAU;AAAA,MAAA;AAAA,IAEZ,IAEM;AAAA,EAAA;AAGR,MAAInC,MAAa,WAAW;AACrB,UAAAoC,IAAWN,EAAW,iBAAiB;AACzC,QAAAM,EAAS,SAAS,GAAG;AAGxB,YAAMC,IAFWD,EAAS,CAAC,EACC,cAAc,EACK,IAAI,CAACH,OAAU;AAAA,QAC7D,MAAM;AAAA,QACN,OAAOvB,EAAmBuB,EAAK,kBAAkBL,CAAc,GAAGA,GAAgB,EAAE;AAAA,QACpF,UAAU;AAAA,MAAA,EACT;AACE,UAAAS,EAAO,WAAW;AACd,eAAAA,EAAO,CAAC,EAAE;AAEd,UAAAA,EAAO,SAAS;AACZ,eAAA;AAAA,UACN;AAAA,YACC,MAAM;AAAA,YACN,OAAOA;AAAA,YACP,UAAU;AAAA,UAAA;AAAA,QAEZ;AAAA,IACD;AAEM,WAAA;AAAA,EAAA;AAGR,MAAIrC,MAAa,eAAe;AACzB,UAAAsC,IAAsBV,EAC1B,oBAAoBzC,EAAW,wBAAwB,GACtD,oBAAoBA,EAAW,cAAc;AAC5C,WAAAmD,KAAuBX,EAAoBW,CAAmB,IAC1DT,EAAgBS,CAAmB,IAEpC;AAAA,EAAA;AAGF,QAAArB,IAAWhC,EAAK,cAAc,EAAE,cAAc,MAAM,GAAG,EAAE,IAAI;AACnE,SAAAiC,EAAO,KAAK,IAAID,CAAQ,uBAAuBjB,CAAQ,EAAE,GAClD;AACR,GAEawB,IAA4B,CAACD,MAAiD;AAEtF,MAAAI,EAAoBJ,CAAgB;AACvC,WAAOM,EAAgBN,CAAgB;AAIxC,QAAMgB,IAA8BhB,EAClC,UACA,EAAA,oBAAoBpC,EAAW,YAAY;AAC7C,MAAIoD,GAA6B;AAChC,UAAMC,IAAgBD,EAA4B,mBAAmBpD,EAAW,aAAa;AAC7F,WAAOQ,EAAsB6C,CAAa;AAAA,EAAA;AAI3C,QAAMC,IAAyBlB,EAAiB,UAAa,EAAA,oBAAoBpC,EAAW,aAAa;AACzG,MAAIsD;AACH,WAAO9C,EAAsB8C,CAAsB;AAIhD,MAAAlB,EAAiB,YAAa,kBAAkBpC,EAAW,UAAU,EAAE,UAAU,GAAG;AACjF,UAAAuD,IAAWnB,EACf,UAAU,EACV,oBAAoBpC,EAAW,UAAU,EACzC,cAAc;AAChB,WAAOU,EAAsB6C,CAAQ;AAAA,EAAA;AAItC,QAAMC,IAA0BpB,EAAiB,UAAa,EAAA,oBAAoBpC,EAAW,cAAc;AAC3G,MAAIwD,GAAyB;AAC5B,UAAMC,IAAyB5D;AAAA,MAC9B2D,EAAwB,oBAAoBxD,EAAW,UAAU,EAAG,cAAc;AAAA,IACnF,GAGMqB,IAAoBoC,EACxB,UACA,EAAA,oBAAoBzD,EAAW,aAAa;AAC9C,QAAIqB;AACH,aAAOE,EAAmBF,EAAkB,QAAA,GAAWA,GAAmB,CAAA,CAAE;AAG7E,UAAMqC,IAAaD,EACjB,UACA,EAAA,oBAAoBzD,EAAW,uBAAuB;AACxD,QAAI0D;AACH,aAAOrB,EAA0BqB,CAAU;AAO5C,QAJID,EAAuB,cAAczD,EAAW,kBAIhDyD,EAAuB,cAAczD,EAAW;AACnD,aAAOqC,EAA0BoB,CAAsB;AAGlD3B,UAAAA,IAAWM,EAAiB,cAAc,EAAE,cAAc,MAAM,GAAG,EAAE,IAAI;AAC/E,WAAAL,EAAO,KAAK,IAAID,CAAQ,uCAAuC2B,EAAuB,YAAa,CAAA,EAAE,GAC9F;AAAA,EAAA;AAOR,QAAME,IAH+BvB,EACnC,oBAAoBpC,EAAW,UAAU,EACzC,kBAAkBA,EAAW,kBAAkB,EACY,KAAK,CAAC8C,MAC3DA,EAAK,oBAAoB9C,EAAW,UAAU,GAAG,cAAc,OACtE;AACD,MAAI2D,GAAyB;AACtB,UAAAhB,IAAatC,EAAgCsD,CAAuB,EACxE,OAAO3D,EAAW,aAAa,EAC/B,cAAc;AACT,WAAAuB,EAAmBoB,GAAYgB,CAAuB;AAAA,EAAA;AAIxD,QAAAC,IAAiBxB,EACrB,oBAAoBpC,EAAW,UAAU,GACxC,oBAAoBA,EAAW,UAAU;AAC5C,MAAI4D,GAAgB;AACnB,UAAMC,IAA0BD,EAC9B,mBAAmB5D,EAAW,gBAAgB,EAC9C,cAAc,GACV8D,IAAmBF,EAAe,gBAAgBC,IAA0B,CAAC;AAC5E,WAAAnD,EAAsBoD,EAAiB,eAAgB;AAAA,EAAA;AAIzD,QAAAC,IAAmB3B,EAAiB,OAAOpC,EAAW,gBAAgB,IACzEoC,IACAA,EAAiB,UAAU,GAAG,OAAOpC,EAAW,mBAAmB,IAClEoC,EAAiB,aAAa,oBAAoBpC,EAAW,gBAAgB,IAC7E;AAEJ,MAAI+D,GAAkB;AACrB,UAAMC,IAAgBD,EAAiB,oBAAoB/D,EAAW,aAAa;AACnF,QAAIgE;AACH,aAAOxD,EAAsBwD,CAAa;AAAA,EAC3C;AAGK,QAAAlC,IAAWM,EAAiB,cAAc,EAAE,cAAc,MAAM,GAAG,EAAE,IAAI;AACxE,SAAAL,EAAA,KAAK,IAAID,CAAQ,4BAA4B,GAE7C;AACR,GAEaQ,IAAkC,CAACxC,MAAwB;AACnE,MAAA0C,EAAoB1C,CAAI;AAI3B,YAHuBA,EAAK,OAAOE,EAAW,cAAc,EAC1B,cAAc,EACpB,UAAU,GAAG,QAAa,KAAA,QACrC;AAMlB,QAAM2B,IAAqB7B,EAAK,OAAOE,EAAW,cAAc;AAChE,MAAI2B,GAAoB;AACvB,UAAMO,IAAiBP,EAAmB,oBAAoB3B,EAAW,UAAU;AAC/E,QAAAkC,GAAgB,QAAQ,MAAM;AAC1B,aAAA;AACG,QAAAA,GAAgB,QAAQ,MAAM;AACjC,aAAA;AAGR,UAAM+B,IAAiBtC,EAAmB,oBAAoB3B,EAAW,UAAU,GAC7EkE,IAAoBrE,EAAuBoE,EAAe,cAAA,CAAgB;AAChF,WAAO3B,EAAgC4B,CAAiB;AAAA,EAAA;AAMlD,SAHgBpE,EAAK,yBAAyBE,EAAW,UAAU,EACnC,kBAAkBA,EAAW,kBAAkB,EAE/D,KAAK,CAACF,MACLA,EAAK,yBAAyBE,EAAW,UAAU,EACpC,QAAQ,MAEvB,aACRK,EAAgCP,CAAI,EACrC,cAAcE,EAAW,cAEhC,EACP;AACF,GAEauC,IAAkC,CAC9C5B,GACAwD,MACY;AACR,MAAA3B,EAAoB7B,CAAe;AAC/B,WAAA;AAGF,QAAAb,IAAOD,EAAuBc,CAAe,GAE7CgB,IAAqB7B,EAAK,OAAOE,EAAW,cAAc;AAChE,MAAI2B,GAAoB;AACvB,UAAMyC,IAAczC,EAAmB,mBAAmB3B,EAAW,UAAU;AACxE,WAAAuC,EAAgC6B,GAAaD,CAAI;AAAA,EAAA;AAGzD,QAAMF,IAAiBnE,EAAK,OAAOE,EAAW,UAAU;AACxD,MAAIiE;AAEI,WADUA,EAAe,cAAc,IAAI,CAACI,MAAM9B,EAAgC8B,GAAGF,CAAI,CAAC,EACjF,KAAK,CAACG,MAAU,CAAC,CAACA,KAASA,MAAU,YAAY,KAAK;AAGvE,QAAMrC,IAAoBnC,EAAK,OAAOE,EAAW,uBAAuB;AACxE,MAAIiC,GAAmB;AAEtB,UAAMsC,IADSC,EAAyBvC,CAAiB,EAC9B,KAAK,CAACqC,MAAUA,EAAM,eAAeH,CAAI;AACpE,WAAKI,IAGD,MAAM,QAAQA,EAAY,KAAK,IAC3B,UAEDA,EAAY,SAAS,KALpB;AAAA,EAKoB;AAG7B,QAAME,IAAuB3E,EAAK,OAAOE,EAAW,gBAAgB;AACpE,MAAIyE;AAEF,WAAAA,EACE,eACA,QAAQ,CAACC,MAAMnC,EAAgCmC,GAAGP,CAAI,CAAC,EACvD,OAAO,CAACQ,MAAM,CAAC,CAACA,KAAKA,MAAM,YAAY,EAAE,CAAC,KAAK;AAInD,QAAM3D,IAAkBlB,EAAK,OAAOE,EAAW,WAAW;AAC1D,MAAIgB;AACH,WAAOuB,EAAgCvB,EAAgB,oBAAoBhB,EAAW,UAAU,GAAImE,CAAI;AAGzG,QAAMS,IAAwB9E,EAAK,OAAOE,EAAW,iBAAiB;AACtE,MAAI4E,KACgB9E,EAAK,yBAAyBE,EAAW,UAAU,EACvD,QAAQ,MAAMmE;AAI5B,WAHmB9D,EAAgCuE,CAAqB,EAAE;AAAA,MACzE5E,EAAW;AAAA,IACZ,EACkB,eAAe;AAI7B,QAAA8B,IAAWhC,EAAK,cAAc,EAAE,cAAc,MAAM,GAAG,EAAE,IAAI;AACnE,SAAAiC,EAAO,IAAI,IAAID,CAAQ,wCAAwChC,EAAK,YAAa,CAAA,EAAE,GAC5E;AACR,GAEM+E,IAAY,CAACC,MAAe;AAC3B,QAAAC,IAASD,EAAK,UAAU;AAC9B,MAAI,CAACA,EAAK,SAAS,KAAK,CAACC;AACjB,WAAA;AAEF,QAAAC,IAAOF,EAAK,iBAAiB;AACnC,SAAOC,EAAO,QAAc,MAAA,aAAaC,EAAK,WAAW;AAC1D,GAEazD,IAAqB,CACjC0D,GACAC,GACAC,IAAgB,CAAA,MACU;AAC1B,QAAMtE,IAAWoE,EAAc,eAAe,GAAG,QAAQ;AACzD,MAAIpE,KAAYC,EAAe,YAAc,EAAA,gBAAgBD,CAAQ;AAC7D,WAAA;AAAA,MACN;AAAA,QACC,MAAM;AAAA,QACN,OAAOA;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,IAEZ;AAGK,QAAAiE,IAAOD,EAAUI,CAAa,IAAIA,EAAc,iBAAiB,EAAE,CAAC,IAAIA;AAE9E,MAAIE,EAAM,KAAK,CAACC,MAAiBA,MAAiBN,CAAI;AAC9C,WAAA;AAGR,QAAMO,IAAWP,EAAK,cAChB/E,IAASH,EAAe,IAAIyF,CAAQ;AAC1C,MAAItF,MAAW;AACP,WAAAA;AAER,QAAMI,IAASmF,EAAuBR,GAAMI,GAAYC,CAAK;AAC9C,SAAAvF,EAAA,IAAIyF,GAAUlF,CAAM,GAC5BA;AACR,GAEMmF,IAAyB,CAACR,GAAYI,GAAkBC,MAAwC;AAC/F,QAAAI,IAAYJ,EAAM,OAAOL,CAAI;AAE/B,MAAAA,EAAK,QAAQ,MAAM;AACf,WAAA;AAGJ,MAAAA,EAAK;AACD,WAAA;AAGJ,MAAAA,EAAK;AACD,WAAA;AAGJ,MAAAA,EAAK;AACD,WAAA;AAGJ,MAAAA,EAAK;AACD,WAAA;AAGR,MAAIA,EAAK,UAAA,KAAeA,EAAK;AACrB,WAAA;AAGJ,MAAAA,EAAK;AACD,WAAA;AAAA,MACN;AAAA,QACC,MAAM;AAAA,QACN,OAAO,OAAOA,EAAK,iBAAkB;AAAA,QACrC,UAAU;AAAA,MAAA;AAAA,IAEZ;AAGG,MAAAA,EAAK;AACD,WAAA;AAAA,MACN;AAAA,QACC,MAAM;AAAA,QACN,OAAO,OAAOA,EAAK,iBAAkB;AAAA,QACrC,UAAU;AAAA,MAAA;AAAA,IAEZ;AAGD,MAAIA,EAAK,SAAA,KAAcA,EAAK;AACpB,WAAA;AAGJ,MAAAA,EAAK;AACD,WAAA;AAGJ,MAAAA,EAAK,QAAQ,MAAM;AACf,WAAA;AAGJ,MAAAA,EAAK;AACD,WAAA;AAAA,MACN;AAAA,QACC,MAAM;AAAA,QACN,OAAOA,EAAK,iBAAmB,EAAA,IAAI,CAACJ,OAAO;AAAA,UAC1C,MAAM;AAAA,UACN,OAAOnD,EAAmBmD,GAAGQ,GAAYK,CAAS;AAAA,UAClD,UAAU;AAAA,QAAA,EACT;AAAA,QACF,UAAU;AAAA,MAAA;AAAA,IAEZ;AAGG,MAAAT,EAAK;AACD,WAAA;AAAA,MACN;AAAA,QACC,MAAM;AAAA,QACN,OAAOvD,EAAmBuD,EAAK,oBAAoB,GAAII,GAAYK,CAAS;AAAA,QAC5E,UAAU;AAAA,MAAA;AAAA,IAEZ;AAKG,MAAAT,EAAK,YAAY;AACd,UAAAU,IAAmBV,EAAK,mBAAmB,GAE3CW,IADYX,EAAK,aAAa,GACP,KAAK,CAACY,MAASA,EAAK,SAAS;AAC1D,QAAID;AACI,aAAA;AAAA,QACN;AAAA,UACC,MAAM;AAAA,UACN,OAAOlE;AAAA,YACNkE,EAAU,yBAAyBD;AAAA,YACnCN;AAAA,YACAK;AAAA,UACD;AAAA,UACA,UAAU;AAAA,QAAA;AAAA,MAEZ;AAAA,EACD;AAGD,QAAMI,IAAiBb,EAAK,UAAU,GAAG,QAAQ,GAE3Cc,wBAAsB,IAAI;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACA;AAED,MAAId,EAAK,cAAca,KAAkBC,EAAgB,IAAID,CAAc;AACnE,WAAA;AAAA,MACN;AAAA,QACC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,UAAU;AAAA,MAAA;AAAA,IAEZ;AAGD,MAAIb,EAAK,cAAca,MAAmB;AAClC,WAAA;AAGR,MAAIb,EAAK,cAAca,MAAmB,OAAO;AAE1C,UAAAE,IADWf,EAAK,iBAAiB,EACZ,CAAC;AACrB,WAAA;AAAA,MACN;AAAA,QACC,MAAM;AAAA,QACN,OAAOe,IAAYtE,EAAmBsE,GAAWX,GAAYK,CAAS,IAAI;AAAA,QAC1E,UAAU;AAAA,MAAA;AAAA,IAEZ;AAAA,EAAA;AAGD,MAAIT,EAAK,cAAca,MAAmB,OAAO;AAE1C,UAAAG,IADWhB,EAAK,iBAAiB,EACV,CAAC;AACvB,WAAA;AAAA,MACN;AAAA,QACC,MAAM;AAAA,QACN,OAAOgB,IAAcvE,EAAmBuE,GAAaZ,GAAYK,CAAS,IAAI;AAAA,QAC9E,UAAU;AAAA,MAAA;AAAA,IAEZ;AAAA,EAAA;AAGD,MAAIT,EAAK,cAAcA,EAAK,cAAc,EAAE,WAAW,GAAG;AACzD,UAAMiB,IAAajB,EAAK,sBAAA,EAAwB,CAAC,KAAKA,EAAK,mBAAmB;AAC9E,QAAIiB;AACI,aAAA;AAAA,QACN;AAAA,UACC,MAAM;AAAA,UACN,OAAOxE,EAAmBwE,GAAYb,GAAYK,CAAS;AAAA,UAC3D,UAAU;AAAA,QAAA;AAAA,MAEZ;AAAA,EACD;AAGG,MAAAT,EAAK;AACR,WAAIa,MAAmB,UAAUb,EAAK,QAAA,MAAc,SAC5C,SAEDA,EACL,cAAA,EACA,IAAI,CAAChC,MAAS;AACd,YAAMkD,IAAmBlD,EAAK,oBAAA,KAAyBA,EAAK,kBAAkB,CAAC,GACzEmD,IAAQ1E,EAAmBuB,EAAK,kBAAkBoC,CAAU,GAAGA,GAAYK,CAAS;AAC1F,UAAI,CAACS;AACG,eAAA;AAAA,UACN,MAAM;AAAA,UACN,YAAYlD,EAAK,QAAQ;AAAA,UACzB,OAAAmD;AAAA,UACA,UAAU;AAAA,QACX;AAOD,UAAI,EAJHD,EAAiB,OAAOhG,EAAW,iBAAiB,KACpDgG,EAAiB,OAAOhG,EAAW,kBAAkB,KACrDgG,EAAiB,OAAOhG,EAAW,2BAA2B;AAGvD,eAAA;AAAA,UACN,MAAM;AAAA,UACN,YAAY8C,EAAK,QAAQ;AAAA,UACzB,OAAAmD;AAAA,UACA,UAAU;AAAA,QACX;AAGD,YAAMC,IAAapD,EAAK,kBAAkBoC,CAAU,EAAE,WAAW;AAE1D,aAAA;AAAA,QACN,MAAM;AAAA,QACN,YAAYpC,EAAK,QAAQ;AAAA,QACzB,OAAAmD;AAAA,QACA,UAAUC;AAAA,MACX;AAAA,IAAA,CACA,EACA,OAAO,CAACC,MAAQA,EAAI,UAAU,WAAW;AAGxC,MAAArB,EAAK,WAAW;AAOnB,UAAMsB,IANwCtB,EAAK,cAAgB,EAAA,IAAI,CAACA,OAAU;AAAA,MACjF,MAAM;AAAA,MACN,OAAOvD,EAAmBuD,GAAMI,GAAYK,CAAS;AAAA,MACrD,UAAU;AAAA,IAAA,EACT,EAEqC;AAAA,MACtC,CAACT,GAAMuB,GAAOC,MAAQ,CAACA,EAAI,KAAK,CAACC,GAAKC,MAAaD,EAAI,UAAUzB,EAAK,SAAS0B,IAAWH,CAAK;AAAA,IAChG,GACMI,IAAaL,EAAc,KAAK,CAACH,MAAUA,EAAM,UAAU,WAAW,GACtE/C,IAASkD,EAAc,OAAO,CAACH,MAAUA,EAAM,UAAU,WAAW;AACtE,WAAA/C,EAAO,WAAW,IACdA,EAAO,CAAC,EAAE,QAEX;AAAA,MACN;AAAA,QACC,MAAM;AAAA,QACN,OAAOA;AAAA,QACP,UAAUuD;AAAA,MAAA;AAAA,IAEZ;AAAA,EAAA;AAGG,MAAA3B,EAAK;AAKR,WAJiBA,EAAK,qBAAqB,EAEzC,IAAI,CAACvE,MAAUgB,EAAmBhB,GAAO2E,GAAYK,CAAS,CAAC,EAC/D,OAAO,CAACU,MAAU,OAAOA,KAAU,QAAQ,EACrB,OAAsB,CAACS,GAAOC,MAAY,CAAC,GAAGD,GAAO,GAAGC,CAAO,GAAG,EAAE;AAGvF,QAAA7E,IAAWoD,EAAW,cAAc,EAAE,cAAc,MAAM,GAAG,EAAE,IAAI;AACzE,SAAAnD,EAAO,KAAK,IAAID,CAAQ,6BAA6BgD,EAAK,QAAS,CAAA,EAAE,GAC9D;AACR,GAEM8B,IAAwB,CAAC9G,MAA8C;AAC5E,MAAIA,EAAK,OAAOE,EAAW,UAAU;AAC7B,WAAA4G,EAAsB/G,EAAuBC,CAAI,CAAC;AAC/C,MAAAA,EAAK,OAAOE,EAAW,aAAa;AAC9C,WAAOF,EAAK,gBAAgB;AAClB,MAAAA,EAAK,OAAOE,EAAW,sBAAsB;AAChD,WAAAF,EAAK,sBAAsB,IAAI,CAACS,MAAUqG,EAAsBrG,CAAK,CAAC;AACnE,MAAAT,EAAK,OAAOE,EAAW,wBAAwB;AAClD,WAAA4G,EAAsBvG,EAAgCP,CAAI,CAAC;AACxD,MAAAA,EAAK,OAAOE,EAAW,uBAAuB;AACxD,WAAOwE,EAAyB1E,CAAI;AAG/B,QAAAgC,IAAWhC,EAAK,cAAc,EAAE,cAAc,MAAM,GAAG,EAAE,IAAI;AACnE,SAAAiC,EAAO,IAAI,IAAID,CAAQ,gCAAgChC,EAAK,YAAa,CAAA,EAAE,GAEpE;AACR,GAEa+G,IAAsB,CAAC/G,MAA8B;AACjE,QAAM2C,IAAiB3C,EAAK,yBAAyBE,EAAW,cAAc;AAC1E,MAAA,CAACyC,EAAuB,QAAA;AAE5B,QAAMqE,IAAWrE,EAAe,aAAa,EAAE,CAAC;AAC5C,MAAA,CAACqE,EAAiB,QAAA;AAEhB,QAAAC,IAAUD,EAAS,QAAQ;AAC7B,SAAAC,EAAQ,oBACJA,EAAQ,gBAAgB,IAGzB;AACR,GAEavC,IAA2B,CAACvC,MACjBA,EAAkB,yBAAyBjC,EAAW,UAAU,EAChD,kBAAkBA,EAAW,kBAAkB,EAEnD,IAAI,CAACF,MAAS;AAE1C,QAAAqC,IADiBrC,EAAK,yBAAyBE,EAAW,UAAU,EACpC,QAAQ,GAExCE,IAAsBJ,EAAK,aAAa,GACxCkH,IAAanH,EAAuBK,CAAmB,GACvDoE,IAAQsC,EAAsBI,CAAU;AAEvC,SAAA;AAAA,IACN,YAAY7E;AAAA,IACZ,OAAAmC;AAAA,EACD;AAAA,CACA,KAEoB,CAAC;"}
1
+ {"version":3,"file":"nodeParsers.mjs","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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"}
@@ -11,6 +11,7 @@ export declare const TestCase: {
11
11
  readonly parsesZodQueryNumberArray: "parses-zod-query-number-array";
12
12
  readonly parsesZodQueryObjectArray: "parses-zod-query-object-array";
13
13
  readonly parsesZodQueryOptionalArray: "parses-zod-query-optional-array";
14
+ readonly parsesZodPipe: "parses-zod-pipe";
14
15
  readonly parsesReturnRecordStringUnknown: "parses-return-record-string-unknown";
15
16
  readonly parsesReturnObjectWithRecordProperty: "parses-return-object-with-record-property";
16
17
  readonly parsesBufferReturnedFromFunction: "parses-buffer-returned-from-function";
@@ -1 +1 @@
1
- {"version":3,"file":"TestCase.d.ts","sourceRoot":"","sources":["../../../../src/openapi/analyzerModule/test/TestCase.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BX,CAAA"}
1
+ {"version":3,"file":"TestCase.d.ts","sourceRoot":"","sources":["../../../../src/openapi/analyzerModule/test/TestCase.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BX,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare function setup(): void;
2
+ export declare function teardown(): void;
3
+ //# sourceMappingURL=workerGlobalSetup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerGlobalSetup.d.ts","sourceRoot":"","sources":["../../../../src/openapi/analyzerModule/test/workerGlobalSetup.ts"],"names":[],"mappings":"AASA,wBAAgB,KAAK,SASpB;AAED,wBAAgB,QAAQ,SAIvB"}
@@ -0,0 +1,2 @@
1
+ export declare const TEST_WORKER_PATH: string;
2
+ //# sourceMappingURL=workerPaths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerPaths.d.ts","sourceRoot":"","sources":["../../../src/openapi/analyzerModule/workerPaths.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,gBAAgB,QAA+D,CAAA"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("os"),h=require("worker_threads");class l{constructor(e){this.queue=[],this.pending=new Map;const t=Math.max(1,Math.min(o.cpus().length-1,8));this.workers=Array.from({length:t},()=>{const s=new h.Worker(e);return s.on("message",r=>{const i=this.pending.get(r.taskId);i&&(this.pending.delete(r.taskId),i(r)),this.idle.push(s),this.flush()}),s.on("error",r=>{for(const[i,n]of this.pending){n({taskId:i,error:String(r)}),this.pending.delete(i);break}this.idle.push(s),this.flush()}),s}),this.idle=[...this.workers]}run(e){return new Promise(t=>{if(this.idle.length>0){const s=this.idle.pop();this.pending.set(e.taskId,t),s.postMessage(e)}else this.queue.push({task:e,resolve:t})})}runAll(e){return Promise.all(e.map(t=>this.run(t)))}terminate(){this.workers.forEach(e=>e.terminate())}flush(){for(;this.queue.length>0&&this.idle.length>0;){const{task:e,resolve:t}=this.queue.shift(),s=this.idle.pop();this.pending.set(e.taskId,t),s.postMessage(e)}}}exports.WorkerPool=l;
2
+ //# sourceMappingURL=workerPool.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerPool.cjs","sources":["../../../src/openapi/analyzerModule/workerPool.ts"],"sourcesContent":["import os from 'os'\nimport { Worker } from 'worker_threads'\n\nimport { EndpointData } from '../types'\nimport { SectionTiming } from './parseEndpoint'\n\nexport type WorkerTask = {\n\ttaskId: string\n\ttsconfigPath: string\n\tsourceFilePath: string\n\trouterName: string\n\tendpointIndex: number\n}\n\nexport type WorkerResultSuccess = {\n\ttaskId: string\n\tendpoint: EndpointData\n\tsectionTimings: SectionTiming[]\n\ttiming: number\n}\n\nexport type WorkerResultError = {\n\ttaskId: string\n\terror: string\n}\n\nexport type WorkerResult = WorkerResultSuccess | WorkerResultError\n\nexport class WorkerPool {\n\tprivate workers: Worker[]\n\tprivate idle: Worker[]\n\tprivate queue: Array<{ task: WorkerTask; resolve: (r: WorkerResult) => void }> = []\n\tprivate pending = new Map<string, (r: WorkerResult) => void>()\n\n\tconstructor(workerUrl: URL) {\n\t\tconst size = Math.max(1, Math.min(os.cpus().length - 1, 8))\n\t\tthis.workers = Array.from({ length: size }, () => {\n\t\t\tconst worker = new Worker(workerUrl)\n\t\t\tworker.on('message', (result: WorkerResult) => {\n\t\t\t\tconst resolve = this.pending.get(result.taskId)\n\t\t\t\tif (resolve) {\n\t\t\t\t\tthis.pending.delete(result.taskId)\n\t\t\t\t\tresolve(result)\n\t\t\t\t}\n\t\t\t\tthis.idle.push(worker)\n\t\t\t\tthis.flush()\n\t\t\t})\n\t\t\tworker.on('error', (err) => {\n\t\t\t\t// Find any pending task for this worker and reject it\n\t\t\t\t// (worker crashed — shouldn't happen, but handle gracefully)\n\t\t\t\tfor (const [taskId, resolve] of this.pending) {\n\t\t\t\t\tresolve({ taskId, error: String(err) })\n\t\t\t\t\tthis.pending.delete(taskId)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tthis.idle.push(worker)\n\t\t\t\tthis.flush()\n\t\t\t})\n\t\t\treturn worker\n\t\t})\n\t\tthis.idle = [...this.workers]\n\t}\n\n\trun(task: WorkerTask): Promise<WorkerResult> {\n\t\treturn new Promise((resolve) => {\n\t\t\tif (this.idle.length > 0) {\n\t\t\t\tconst worker = this.idle.pop()!\n\t\t\t\tthis.pending.set(task.taskId, resolve)\n\t\t\t\tworker.postMessage(task)\n\t\t\t} else {\n\t\t\t\tthis.queue.push({ task, resolve })\n\t\t\t}\n\t\t})\n\t}\n\n\trunAll(tasks: WorkerTask[]): Promise<WorkerResult[]> {\n\t\treturn Promise.all(tasks.map((t) => this.run(t)))\n\t}\n\n\tterminate() {\n\t\tthis.workers.forEach((w) => w.terminate())\n\t}\n\n\tprivate flush() {\n\t\twhile (this.queue.length > 0 && this.idle.length > 0) {\n\t\t\tconst { task, resolve } = this.queue.shift()!\n\t\t\tconst worker = this.idle.pop()!\n\t\t\tthis.pending.set(task.taskId, resolve)\n\t\t\tworker.postMessage(task)\n\t\t}\n\t}\n}\n"],"names":["WorkerPool","workerUrl","size","os","worker","Worker","result","resolve","err","taskId","task","tasks","w"],"mappings":"kIA4BO,MAAMA,CAAW,CAMvB,YAAYC,EAAgB,CAH5B,KAAQ,MAAyE,CAAC,EAC1E,KAAA,YAAc,IAGrB,MAAMC,EAAO,KAAK,IAAI,EAAG,KAAK,IAAIC,EAAG,KAAA,EAAO,OAAS,EAAG,CAAC,CAAC,EAC1D,KAAK,QAAU,MAAM,KAAK,CAAE,OAAQD,CAAA,EAAQ,IAAM,CAC3C,MAAAE,EAAS,IAAIC,EAAA,OAAOJ,CAAS,EAC5B,OAAAG,EAAA,GAAG,UAAYE,GAAyB,CAC9C,MAAMC,EAAU,KAAK,QAAQ,IAAID,EAAO,MAAM,EAC1CC,IACE,KAAA,QAAQ,OAAOD,EAAO,MAAM,EACjCC,EAAQD,CAAM,GAEV,KAAA,KAAK,KAAKF,CAAM,EACrB,KAAK,MAAM,CAAA,CACX,EACMA,EAAA,GAAG,QAAUI,GAAQ,CAG3B,SAAW,CAACC,EAAQF,CAAO,IAAK,KAAK,QAAS,CAC7CA,EAAQ,CAAE,OAAAE,EAAQ,MAAO,OAAOD,CAAG,EAAG,EACjC,KAAA,QAAQ,OAAOC,CAAM,EAC1B,KAAA,CAEI,KAAA,KAAK,KAAKL,CAAM,EACrB,KAAK,MAAM,CAAA,CACX,EACMA,CAAA,CACP,EACD,KAAK,KAAO,CAAC,GAAG,KAAK,OAAO,CAAA,CAG7B,IAAIM,EAAyC,CACrC,OAAA,IAAI,QAASH,GAAY,CAC3B,GAAA,KAAK,KAAK,OAAS,EAAG,CACnB,MAAAH,EAAS,KAAK,KAAK,IAAI,EAC7B,KAAK,QAAQ,IAAIM,EAAK,OAAQH,CAAO,EACrCH,EAAO,YAAYM,CAAI,CAAA,MAEvB,KAAK,MAAM,KAAK,CAAE,KAAAA,EAAM,QAAAH,EAAS,CAClC,CACA,CAAA,CAGF,OAAOI,EAA8C,CAC7C,OAAA,QAAQ,IAAIA,EAAM,IAAK,GAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAA,CAGjD,WAAY,CACX,KAAK,QAAQ,QAASC,GAAMA,EAAE,WAAW,CAAA,CAGlC,OAAQ,CACf,KAAO,KAAK,MAAM,OAAS,GAAK,KAAK,KAAK,OAAS,GAAG,CACrD,KAAM,CAAE,KAAAF,EAAM,QAAAH,CAAA,EAAY,KAAK,MAAM,MAAM,EACrCH,EAAS,KAAK,KAAK,IAAI,EAC7B,KAAK,QAAQ,IAAIM,EAAK,OAAQH,CAAO,EACrCH,EAAO,YAAYM,CAAI,CAAA,CACxB,CAEF"}
@@ -0,0 +1,33 @@
1
+ import { EndpointData } from '../types';
2
+ import { SectionTiming } from './parseEndpoint';
3
+
4
+ export type WorkerTask = {
5
+ taskId: string;
6
+ tsconfigPath: string;
7
+ sourceFilePath: string;
8
+ routerName: string;
9
+ endpointIndex: number;
10
+ };
11
+ export type WorkerResultSuccess = {
12
+ taskId: string;
13
+ endpoint: EndpointData;
14
+ sectionTimings: SectionTiming[];
15
+ timing: number;
16
+ };
17
+ export type WorkerResultError = {
18
+ taskId: string;
19
+ error: string;
20
+ };
21
+ export type WorkerResult = WorkerResultSuccess | WorkerResultError;
22
+ export declare class WorkerPool {
23
+ private workers;
24
+ private idle;
25
+ private queue;
26
+ private pending;
27
+ constructor(workerUrl: URL);
28
+ run(task: WorkerTask): Promise<WorkerResult>;
29
+ runAll(tasks: WorkerTask[]): Promise<WorkerResult[]>;
30
+ terminate(): void;
31
+ private flush;
32
+ }
33
+ //# sourceMappingURL=workerPool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerPool.d.ts","sourceRoot":"","sources":["../../../src/openapi/analyzerModule/workerPool.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAE/C,MAAM,MAAM,UAAU,GAAG;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,YAAY,CAAA;IACtB,cAAc,EAAE,aAAa,EAAE,CAAA;IAC/B,MAAM,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,iBAAiB,CAAA;AAElE,qBAAa,UAAU;IACtB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,KAAK,CAAsE;IACnF,OAAO,CAAC,OAAO,CAA+C;gBAElD,SAAS,EAAE,GAAG;IA6B1B,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAY5C,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAIpD,SAAS;IAIT,OAAO,CAAC,KAAK;CAQb"}
@@ -0,0 +1,46 @@
1
+ import o from "os";
2
+ import { Worker as h } from "worker_threads";
3
+ class u {
4
+ constructor(e) {
5
+ this.queue = [], this.pending = /* @__PURE__ */ new Map();
6
+ const t = Math.max(1, Math.min(o.cpus().length - 1, 8));
7
+ this.workers = Array.from({ length: t }, () => {
8
+ const s = new h(e);
9
+ return s.on("message", (i) => {
10
+ const r = this.pending.get(i.taskId);
11
+ r && (this.pending.delete(i.taskId), r(i)), this.idle.push(s), this.flush();
12
+ }), s.on("error", (i) => {
13
+ for (const [r, n] of this.pending) {
14
+ n({ taskId: r, error: String(i) }), this.pending.delete(r);
15
+ break;
16
+ }
17
+ this.idle.push(s), this.flush();
18
+ }), s;
19
+ }), this.idle = [...this.workers];
20
+ }
21
+ run(e) {
22
+ return new Promise((t) => {
23
+ if (this.idle.length > 0) {
24
+ const s = this.idle.pop();
25
+ this.pending.set(e.taskId, t), s.postMessage(e);
26
+ } else
27
+ this.queue.push({ task: e, resolve: t });
28
+ });
29
+ }
30
+ runAll(e) {
31
+ return Promise.all(e.map((t) => this.run(t)));
32
+ }
33
+ terminate() {
34
+ this.workers.forEach((e) => e.terminate());
35
+ }
36
+ flush() {
37
+ for (; this.queue.length > 0 && this.idle.length > 0; ) {
38
+ const { task: e, resolve: t } = this.queue.shift(), s = this.idle.pop();
39
+ this.pending.set(e.taskId, t), s.postMessage(e);
40
+ }
41
+ }
42
+ }
43
+ export {
44
+ u as WorkerPool
45
+ };
46
+ //# sourceMappingURL=workerPool.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerPool.mjs","sources":["../../../src/openapi/analyzerModule/workerPool.ts"],"sourcesContent":["import os from 'os'\nimport { Worker } from 'worker_threads'\n\nimport { EndpointData } from '../types'\nimport { SectionTiming } from './parseEndpoint'\n\nexport type WorkerTask = {\n\ttaskId: string\n\ttsconfigPath: string\n\tsourceFilePath: string\n\trouterName: string\n\tendpointIndex: number\n}\n\nexport type WorkerResultSuccess = {\n\ttaskId: string\n\tendpoint: EndpointData\n\tsectionTimings: SectionTiming[]\n\ttiming: number\n}\n\nexport type WorkerResultError = {\n\ttaskId: string\n\terror: string\n}\n\nexport type WorkerResult = WorkerResultSuccess | WorkerResultError\n\nexport class WorkerPool {\n\tprivate workers: Worker[]\n\tprivate idle: Worker[]\n\tprivate queue: Array<{ task: WorkerTask; resolve: (r: WorkerResult) => void }> = []\n\tprivate pending = new Map<string, (r: WorkerResult) => void>()\n\n\tconstructor(workerUrl: URL) {\n\t\tconst size = Math.max(1, Math.min(os.cpus().length - 1, 8))\n\t\tthis.workers = Array.from({ length: size }, () => {\n\t\t\tconst worker = new Worker(workerUrl)\n\t\t\tworker.on('message', (result: WorkerResult) => {\n\t\t\t\tconst resolve = this.pending.get(result.taskId)\n\t\t\t\tif (resolve) {\n\t\t\t\t\tthis.pending.delete(result.taskId)\n\t\t\t\t\tresolve(result)\n\t\t\t\t}\n\t\t\t\tthis.idle.push(worker)\n\t\t\t\tthis.flush()\n\t\t\t})\n\t\t\tworker.on('error', (err) => {\n\t\t\t\t// Find any pending task for this worker and reject it\n\t\t\t\t// (worker crashed — shouldn't happen, but handle gracefully)\n\t\t\t\tfor (const [taskId, resolve] of this.pending) {\n\t\t\t\t\tresolve({ taskId, error: String(err) })\n\t\t\t\t\tthis.pending.delete(taskId)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tthis.idle.push(worker)\n\t\t\t\tthis.flush()\n\t\t\t})\n\t\t\treturn worker\n\t\t})\n\t\tthis.idle = [...this.workers]\n\t}\n\n\trun(task: WorkerTask): Promise<WorkerResult> {\n\t\treturn new Promise((resolve) => {\n\t\t\tif (this.idle.length > 0) {\n\t\t\t\tconst worker = this.idle.pop()!\n\t\t\t\tthis.pending.set(task.taskId, resolve)\n\t\t\t\tworker.postMessage(task)\n\t\t\t} else {\n\t\t\t\tthis.queue.push({ task, resolve })\n\t\t\t}\n\t\t})\n\t}\n\n\trunAll(tasks: WorkerTask[]): Promise<WorkerResult[]> {\n\t\treturn Promise.all(tasks.map((t) => this.run(t)))\n\t}\n\n\tterminate() {\n\t\tthis.workers.forEach((w) => w.terminate())\n\t}\n\n\tprivate flush() {\n\t\twhile (this.queue.length > 0 && this.idle.length > 0) {\n\t\t\tconst { task, resolve } = this.queue.shift()!\n\t\t\tconst worker = this.idle.pop()!\n\t\t\tthis.pending.set(task.taskId, resolve)\n\t\t\tworker.postMessage(task)\n\t\t}\n\t}\n}\n"],"names":["WorkerPool","workerUrl","size","os","worker","Worker","result","resolve","err","taskId","task","tasks","w"],"mappings":";;AA4BO,MAAMA,EAAW;AAAA,EAMvB,YAAYC,GAAgB;AAH5B,SAAQ,QAAyE,CAAC,GAC1E,KAAA,8BAAc,IAAuC;AAG5D,UAAMC,IAAO,KAAK,IAAI,GAAG,KAAK,IAAIC,EAAG,KAAA,EAAO,SAAS,GAAG,CAAC,CAAC;AAC1D,SAAK,UAAU,MAAM,KAAK,EAAE,QAAQD,EAAA,GAAQ,MAAM;AAC3C,YAAAE,IAAS,IAAIC,EAAOJ,CAAS;AAC5B,aAAAG,EAAA,GAAG,WAAW,CAACE,MAAyB;AAC9C,cAAMC,IAAU,KAAK,QAAQ,IAAID,EAAO,MAAM;AAC9C,QAAIC,MACE,KAAA,QAAQ,OAAOD,EAAO,MAAM,GACjCC,EAAQD,CAAM,IAEV,KAAA,KAAK,KAAKF,CAAM,GACrB,KAAK,MAAM;AAAA,MAAA,CACX,GACMA,EAAA,GAAG,SAAS,CAACI,MAAQ;AAG3B,mBAAW,CAACC,GAAQF,CAAO,KAAK,KAAK,SAAS;AAC7C,UAAAA,EAAQ,EAAE,QAAAE,GAAQ,OAAO,OAAOD,CAAG,GAAG,GACjC,KAAA,QAAQ,OAAOC,CAAM;AAC1B;AAAA,QAAA;AAEI,aAAA,KAAK,KAAKL,CAAM,GACrB,KAAK,MAAM;AAAA,MAAA,CACX,GACMA;AAAA,IAAA,CACP,GACD,KAAK,OAAO,CAAC,GAAG,KAAK,OAAO;AAAA,EAAA;AAAA,EAG7B,IAAIM,GAAyC;AACrC,WAAA,IAAI,QAAQ,CAACH,MAAY;AAC3B,UAAA,KAAK,KAAK,SAAS,GAAG;AACnB,cAAAH,IAAS,KAAK,KAAK,IAAI;AAC7B,aAAK,QAAQ,IAAIM,EAAK,QAAQH,CAAO,GACrCH,EAAO,YAAYM,CAAI;AAAA,MAAA;AAEvB,aAAK,MAAM,KAAK,EAAE,MAAAA,GAAM,SAAAH,GAAS;AAAA,IAClC,CACA;AAAA,EAAA;AAAA,EAGF,OAAOI,GAA8C;AAC7C,WAAA,QAAQ,IAAIA,EAAM,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC;AAAA,EAAA;AAAA,EAGjD,YAAY;AACX,SAAK,QAAQ,QAAQ,CAACC,MAAMA,EAAE,WAAW;AAAA,EAAA;AAAA,EAGlC,QAAQ;AACf,WAAO,KAAK,MAAM,SAAS,KAAK,KAAK,KAAK,SAAS,KAAG;AACrD,YAAM,EAAE,MAAAF,GAAM,SAAAH,EAAA,IAAY,KAAK,MAAM,MAAM,GACrCH,IAAS,KAAK,KAAK,IAAI;AAC7B,WAAK,QAAQ,IAAIM,EAAK,QAAQH,CAAO,GACrCH,EAAO,YAAYM,CAAI;AAAA,IAAA;AAAA,EACxB;AAEF;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moonflower",
3
- "version": "1.4.9",
3
+ "version": "1.5.0",
4
4
  "description": "",
5
5
  "author": "tenebrie",
6
6
  "license": "MIT",
@@ -1,4 +1,20 @@
1
+ import crypto from 'crypto'
2
+ import { existsSync } from 'fs'
1
3
  import * as path from 'path'
4
+ import { fileURLToPath } from 'url'
5
+
6
+ function resolveWorkerUrl(): URL {
7
+ const candidates = ['./analyzerWorker.mjs', './analyzerWorker.test.mjs']
8
+ for (const candidate of candidates) {
9
+ const url = new URL(candidate, import.meta.url)
10
+ if (existsSync(fileURLToPath(url))) {
11
+ return url
12
+ }
13
+ }
14
+ throw new Error(
15
+ 'analyzerWorker.mjs not found. Run yarn build, or run tests via yarn test (which compiles the worker first).',
16
+ )
17
+ }
2
18
  import { SourceFile, SyntaxKind } from 'ts-morph'
3
19
  import { Project } from 'ts-morph'
4
20
 
@@ -16,6 +32,7 @@ import { getValuesOfObjectLiteral, resolveEndpointPath } from './nodeParsers'
16
32
  import { parseEndpoint, SectionTiming } from './parseEndpoint'
17
33
  import { parseExposedModel, parseNamedExposedModels } from './parseExposedModels'
18
34
  import { SourceFileCache } from './sourceFileCache'
35
+ import { WorkerPool, WorkerResult, WorkerTask } from './workerPool'
19
36
 
20
37
  type Props = {
21
38
  logLevel?: Parameters<(typeof Logger)['setLevel']>[0]
@@ -40,14 +57,14 @@ type EndpointTiming = { method: string; path: string; timing: number; sectionTim
40
57
  * @param tsconfigPath Path to tsconfig file relative to project root
41
58
  * @param sourceFilePaths Array of router source files relative to project root
42
59
  */
43
- export const prepareOpenApiSpec = ({
60
+ export const prepareOpenApiSpec = async ({
44
61
  logLevel,
45
62
  tsconfigPath,
46
63
  sourceFilePaths,
47
64
  sourceFileDiscovery,
48
65
  incremental,
49
66
  profiling = 'stats',
50
- }: Props) => {
67
+ }: Props): Promise<void> => {
51
68
  const openApiManager = OpenApiManager.getInstance()
52
69
 
53
70
  if (openApiManager.isReady()) {
@@ -122,11 +139,12 @@ export const prepareOpenApiSpec = ({
122
139
  }
123
140
  return path.resolve(process.cwd(), 'node_modules', '.cache', 'moonflower')
124
141
  })()
125
- const endpoints = analyzeMultipleSourceFiles(filesToAnalyze, {
142
+ const endpoints = await analyzeMultipleSourceFiles(filesToAnalyze, {
126
143
  incremental: incremental !== false,
127
144
  cachePath,
128
145
  timestampCache: {},
129
146
  profiling,
147
+ tsconfigPath: path.resolve(tsconfigPath),
130
148
  })
131
149
 
132
150
  openApiManager.setStats({
@@ -154,19 +172,135 @@ export const prepareOpenApiSpec = ({
154
172
  openApiManager.markAsReady()
155
173
  }
156
174
 
157
- export const analyzeMultipleSourceFiles = (
175
+ export const analyzeMultipleSourceFiles = async (
158
176
  files: DiscoveredSourceFile[],
159
177
  config: {
160
178
  incremental: boolean
161
179
  cachePath: string
162
180
  timestampCache: TimestampCache
163
181
  profiling?: 'stats' | 'off' | 'debug'
182
+ tsconfigPath: string
164
183
  },
165
184
  filterEndpointPaths?: string[],
166
- ): EndpointData[] => {
185
+ ): Promise<EndpointData[]> => {
167
186
  const profiling = config.profiling ?? 'stats'
168
187
  const startTime = performance.now()
169
- const analyzedFiles = files.map((file) => analyzeSourceFileWithCache(file, config, filterEndpointPaths))
188
+
189
+ // Separate cached files from those needing analysis
190
+ type CachedFile = { endpoints: EndpointData[]; fileName: string; timing: 0; endpointTimings: [] }
191
+ type UncachedFile = { file: DiscoveredSourceFile; timestamp: number }
192
+
193
+ const cached: CachedFile[] = []
194
+ const uncached: UncachedFile[] = []
195
+
196
+ for (const file of files) {
197
+ const timestamp = getSourceFileTimestamp(file.sourceFile, config.timestampCache)
198
+ const hit = config.incremental
199
+ ? SourceFileCache.getCachedResults(file.sourceFile, timestamp, config.cachePath)
200
+ : null
201
+ if (hit) {
202
+ Logger.debug(`[${file.fileName}] Found cached results`)
203
+ cached.push({ endpoints: hit.endpoints, fileName: file.fileName, timing: 0, endpointTimings: [] })
204
+ } else {
205
+ uncached.push({ file, timestamp })
206
+ }
207
+ }
208
+
209
+ if (uncached.length === 0) {
210
+ if (profiling !== 'off') {
211
+ Logger.info(`Router analysis took ${Math.round(performance.now() - startTime)}ms`)
212
+ }
213
+ return cached.flatMap((f) => f.endpoints)
214
+ }
215
+
216
+ // Build one task per endpoint across all uncached files
217
+ const OPERATIONS = ['get', 'post', 'put', 'delete', 'del', 'patch']
218
+ const operationsPattern = OPERATIONS.join('|')
219
+
220
+ type FileTask = { task: WorkerTask; fileName: string }
221
+ const allTasks: FileTask[] = []
222
+
223
+ for (const { file } of uncached) {
224
+ for (const routerName of file.routers.named) {
225
+ const routerPattern = new RegExp(`${routerName}\\.(?:${operationsPattern})`)
226
+ let endpointIndex = 0
227
+ file.sourceFile.forEachChild((node) => {
228
+ const nodeText = node.getText()
229
+ if (routerPattern.test(nodeText)) {
230
+ if (
231
+ !filterEndpointPaths ||
232
+ filterEndpointPaths.some((p) => resolveEndpointPath(node)?.includes(p))
233
+ ) {
234
+ allTasks.push({
235
+ fileName: file.fileName,
236
+ task: {
237
+ taskId: crypto.randomUUID(),
238
+ tsconfigPath: config.tsconfigPath,
239
+ sourceFilePath: file.sourceFile.getFilePath(),
240
+ routerName,
241
+ endpointIndex,
242
+ },
243
+ })
244
+ }
245
+ endpointIndex++
246
+ }
247
+ })
248
+ }
249
+ }
250
+
251
+ // Dispatch all tasks to the worker pool
252
+ const pool = new WorkerPool(resolveWorkerUrl())
253
+
254
+ type EndpointTiming = { method: string; path: string; timing: number; sectionTimings: SectionTiming[] }
255
+ type FileResult = {
256
+ endpoints: EndpointData[]
257
+ fileName: string
258
+ timing: number
259
+ endpointTimings: EndpointTiming[]
260
+ }
261
+
262
+ let results: WorkerResult[]
263
+ try {
264
+ results = await pool.runAll(allTasks.map((ft) => ft.task))
265
+ } finally {
266
+ pool.terminate()
267
+ }
268
+
269
+ // Group results by file
270
+ const byFile = new Map<string, FileResult>()
271
+ for (const { file } of uncached) {
272
+ byFile.set(file.fileName, { endpoints: [], fileName: file.fileName, timing: 0, endpointTimings: [] })
273
+ }
274
+
275
+ for (let i = 0; i < results.length; i++) {
276
+ const result = results[i]
277
+ const fileName = allTasks[i].fileName
278
+ const fileResult = byFile.get(fileName)!
279
+
280
+ if ('error' in result) {
281
+ Logger.error(`[${fileName}] Worker error: ${result.error}`)
282
+ continue
283
+ }
284
+
285
+ fileResult.endpoints.push(result.endpoint)
286
+ fileResult.timing += result.timing
287
+ fileResult.endpointTimings.push({
288
+ method: result.endpoint.method,
289
+ path: result.endpoint.path,
290
+ timing: result.timing,
291
+ sectionTimings: result.sectionTimings,
292
+ })
293
+ }
294
+
295
+ // Write cache for each uncached file
296
+ for (const { file, timestamp } of uncached) {
297
+ const fileResult = byFile.get(file.fileName)!
298
+ if (fileResult.endpoints.length > 0) {
299
+ SourceFileCache.cacheResults(file.sourceFile, timestamp, config.cachePath, fileResult.endpoints)
300
+ }
301
+ }
302
+
303
+ const analyzedFiles = [...cached, ...Array.from(byFile.values())]
170
304
 
171
305
  if (profiling !== 'off') {
172
306
  Logger.info(`Router analysis took ${Math.round(performance.now() - startTime)}ms`)
@@ -174,7 +308,7 @@ export const analyzeMultipleSourceFiles = (
174
308
 
175
309
  if (profiling === 'stats') {
176
310
  analyzedFiles
177
- .map((f, index) => ({ fileName: files[index].fileName, timeTaken: f.timing }))
311
+ .map((f) => ({ fileName: f.fileName, timeTaken: f.timing }))
178
312
  .sort((a, b) => b.timeTaken - a.timeTaken)
179
313
  .filter((t) => t.timeTaken > 500)
180
314
  .forEach((t) => {
@@ -182,11 +316,7 @@ export const analyzeMultipleSourceFiles = (
182
316
  })
183
317
  } else if (profiling === 'debug') {
184
318
  analyzedFiles
185
- .map((f, index) => ({
186
- fileName: files[index].fileName,
187
- timeTaken: f.timing,
188
- endpointTimings: f.endpointTimings,
189
- }))
319
+ .map((f) => ({ fileName: f.fileName, timeTaken: f.timing, endpointTimings: f.endpointTimings }))
190
320
  .sort((a, b) => b.timeTaken - a.timeTaken)
191
321
  .forEach((t) => {
192
322
  Logger.info(`- [${t.fileName}] Took ${Math.round(t.timeTaken)}ms to analyze`)