{"version":3,"file":"signature_extraction.js","sourceRoot":"","sources":["../../../src/connect/wizard/signature_extraction.ts"],"names":[],"mappings":"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","sourcesContent":["import path from 'path'\nimport { Project, ScriptTarget, SourceFile, Symbol, ts } from 'ts-morph'\nimport { findTsConfigPath } from '../../common/tsconfig'\n\nconst DEFAULT_COMPONENT = 'DefaultComponent'\nconst REACT_INTERFACE_NAMES = ['HTMLAttributes', 'Attributes', 'AriaAttributes', 'DOMAttributes']\nconst IGNORE_REACT_PROPS = ['ref', 'key']\n\n/**\n * Initializing a ts-morph project can take time so lets cache it.\n * We are assuming the underlying project does not change during the course of the CLI run.\n */\nlet cachedTsMorphProject: Project\nexport function extractSignature({\n nameToFind,\n sourceFilePath,\n}: {\n nameToFind: string\n sourceFilePath: string\n}) {\n if (!cachedTsMorphProject) {\n const tsConfigFilePath = findTsConfigPath(path.dirname(sourceFilePath))\n const options = tsConfigFilePath\n ? { tsConfigFilePath }\n : {\n compilerOptions: {\n target: ScriptTarget.ESNext,\n module: ts.ModuleKind.CommonJS,\n jsx: ts.JsxEmit.React,\n esModuleInterop: true,\n skipLibCheck: true,\n lib: ['ES2021'],\n strict: true,\n rootDir: 'src',\n },\n }\n cachedTsMorphProject = new Project(options)\n }\n\n return extractSignatureFromProject({\n tsMorphProject: cachedTsMorphProject,\n sourceFilePath,\n nameToFind,\n })\n}\n\nexport function extractSignatureFromProject({\n tsMorphProject,\n sourceFilePath,\n nameToFind,\n}: {\n tsMorphProject: Project\n sourceFilePath: string\n nameToFind: string\n}) {\n tsMorphProject.addSourceFileAtPath(sourceFilePath)\n\n const signatureSourcePath = path.join(path.dirname(sourceFilePath), 'extracted_signature.ts')\n\n const signatureSourceFile = tsMorphProject.createSourceFile(signatureSourcePath)\n\n const filename = path.parse(sourceFilePath).name.split('.')[0]\n if (nameToFind === 'default') {\n signatureSourceFile.addImportDeclaration({\n defaultImport: DEFAULT_COMPONENT,\n moduleSpecifier: `./${filename}`,\n })\n } else {\n signatureSourceFile.addImportDeclaration({\n namedImports: [nameToFind],\n moduleSpecifier: `./${filename}`,\n })\n }\n\n /**\n * Flatten the component's props type by creating a virtual TS source file\n * and adding this type alias, which has the effect of flattening any inherited\n * types down to a single type, then extract the final type from this new type\n */\n signatureSourceFile.addTypeAlias({\n name: 'ExtractFinalType',\n typeParameters: ['T'],\n type: 'T extends infer R ? { [K in keyof R]: R[K] } : never',\n })\n\n const typeAlias = signatureSourceFile.addTypeAlias({\n name: '__FinalType',\n type: `ExtractFinalType>`,\n })\n\n let type = typeAlias.getType()\n\n // For simplicity, if top-level type is a union, use the first type\n if (type.isUnion()) {\n type = type.getUnionTypes()[0]\n }\n\n if (!type.isObject()) {\n tsMorphProject.removeSourceFile(signatureSourceFile)\n throw new Error('Props not an object: ' + type.getText())\n } else {\n const props = type.getProperties()\n\n const result: Record = {}\n\n for (const prop of props) {\n const propString = getPropString(tsMorphProject, prop, signatureSourceFile)\n if (propString) {\n result[prop.getName()] = propString\n }\n }\n\n tsMorphProject.removeSourceFile(signatureSourceFile)\n return result\n }\n}\n\nfunction getPropString(tsMorphProject: Project, prop: Symbol, sourceFile: SourceFile) {\n if (IGNORE_REACT_PROPS.includes(prop.getName())) {\n return null\n }\n\n const [declaration] = prop.getDeclarations()\n\n const parent = declaration.getParentOrThrow().compilerNode\n\n if (ts.isInterfaceDeclaration(parent)) {\n const parentInterfaceName = parent.name.getText()\n\n // Skip props that are inherited from React types\n if (REACT_INTERFACE_NAMES.includes(parentInterfaceName)) {\n return null\n }\n\n if (parent.heritageClauses && parent.heritageClauses[0].getText().includes('HTMLAttributes')) {\n // If interface extends HTMLAttributes, only allow props defined in interface\n // TODO will fail if extends multiple interfaces and prop defined in one of them - could recursively check\n if (!parent.members.some((m) => m.name?.getText() === prop.getName())) {\n return null\n }\n }\n }\n\n const compilerProp = prop.compilerSymbol\n\n const checker = tsMorphProject.getTypeChecker().compilerObject\n\n const propType = prop.getTypeAtLocation(sourceFile).compilerType\n let propTypeString = checker.typeToString(propType)\n\n if (propType.isUnion()) {\n // Get the types of the union\n const unionTypes = propType.types\n\n // Map each type to its string representation and join them with a |\n propTypeString = unionTypes.map((type) => checker.typeToString(type)).join(' | ')\n }\n\n return compilerProp.flags & ts.SymbolFlags.Optional\n ? `?${propTypeString.replace(/undefined \\| /g, '')}`\n : propTypeString\n}\n"]}