UNPKG

@zerollup/ts-transform-paths

Version:
1 lines 15.7 kB
{"version":3,"file":"index.mjs","sources":["../src/Types.ts","../src/ImportPathInternalResolver.ts","../src/createFixNode.ts","../src/importPathVisitor.ts","../src/transformPaths.ts"],"sourcesContent":["import ts from 'typescript'\n\nexport interface Config {\n /**\n Disable plugin path resolving for given paths keys\n @default undefined\n */\n exclude?: string[] | undefined\n\n /**\n * Disable path rewriting for generated d.ts\n *\n * @default false\n */\n disableForDeclarations?: boolean;\n\n /**\n * Try to load min.js and .js versions of each mapped import: for use ts without bundler\n * @default false\n */\n tryLoadJs?: boolean\n}\n\nexport const defaultConfig: Config = {}\n\ntype FileExists = Partial<Pick<ts.ModuleResolutionHost, 'fileExists'>>\n\nexport type EmitHost = FileExists\n\nexport type Program = ts.Program & FileExists\n\nexport type TransformationContext = ts.TransformationContext & {\n getEmitHost?: () => EmitHost\n}\n\ntype ExtractElement<T> = T extends Array<unknown> ? T[number] : T\n\nexport type CustomTransformer = {\n [Key in keyof ts.CustomTransformers]: ExtractElement<ts.CustomTransformers[Key]>\n}\n","import path from 'path'\nimport { ImportPathsResolver } from '@zerollup/ts-helpers'\nimport { Config, EmitHost, Program, TransformationContext } from './Types'\n\nconst fileExistsParts = ['.min.js', '.js'] as const\n\nconst tsParts = ['.ts', '.d.ts', '.tsx', '/index.ts', '/index.tsx', '/index.d.ts', ''] as const\n\nexport class ImportPathInternalResolver {\n protected resolver: ImportPathsResolver\n protected emitHost: EmitHost | undefined\n\n constructor(\n protected program: Program | undefined,\n transformationContext: TransformationContext,\n protected config: Config\n ) {\n const { paths, baseUrl } = transformationContext.getCompilerOptions()\n this.resolver = new ImportPathsResolver({\n paths,\n baseUrl,\n exclude: config.exclude,\n })\n this.emitHost = transformationContext.getEmitHost\n ? transformationContext.getEmitHost()\n : undefined\n }\n\n fileExists(file: string) {\n const { program, emitHost } = this\n if (program?.fileExists) return program.fileExists(file)\n if (emitHost?.fileExists) return emitHost.fileExists(file)\n\n return true\n }\n\n resolveImport(oldImport: string, currentDir: string): string | undefined {\n const config = this.config\n const newImports = this.resolver.getImportSuggestions(oldImport, currentDir)\n\n if (!newImports) return\n\n for (let newImport of newImports) {\n const newImportPath = path.join(currentDir, newImport)\n\n for (let part of tsParts) {\n if (this.fileExists(`${newImportPath}${part}`)) return newImport\n }\n\n if (config.tryLoadJs) {\n for (let ext of fileExistsParts) {\n if (this.fileExists(`${newImportPath}${ext}`))\n return `${newImport}${ext}`\n }\n }\n\n }\n }\n}\n","import ts from 'typescript'\n\nexport type FixNode = (fixNode: ts.Node, newImport: string) => ts.Node\n\nexport function createFixNode(sf: ts.SourceFile) {\n const posMap = new Map<string, number>()\n return function fixNode(fixNode: ts.Node, newImport: string): ts.Node {\n /**\n * This hack needed for properly d.ts paths rewrite.\n * moduleSpecifier value obtained by moduleSpecifier.pos from original source file text.\n * See emitExternalModuleSpecifier -> writeTextOfNode -> getTextOfNodeFromSourceText.\n *\n * We need to add new import path to the end of source file text and adjust moduleSpecifier.pos\n *\n * ts remove quoted string from output\n */\n const newStr = `\"${newImport}\"`\n let cachedPos = posMap.get(newImport)\n if (cachedPos === undefined) {\n cachedPos = sf.text.length\n posMap.set(newImport, cachedPos)\n sf.text += newStr\n sf.end += newStr.length\n }\n fixNode.pos = cachedPos\n fixNode.end = cachedPos + newStr.length\n\n return fixNode\n }\n}\n","import path from 'path'\nimport ts from 'typescript'\nimport { FixNode } from './createFixNode'\nimport { ImportPathInternalResolver } from './ImportPathInternalResolver'\n\nexport interface ImportPathVisitorContext {\n sf: ts.SourceFile\n fixNode?: FixNode | undefined\n resolver: ImportPathInternalResolver\n}\n\nfunction stripQuotes(quoted: string): string {\n if (quoted[0] !== '\"' && quoted[0] !== \"'\") return quoted\n return quoted.substring(1, quoted.length - 1)\n}\n\nexport function importPathVisitor(\n node: ts.Node,\n { fixNode, sf, resolver }: ImportPathVisitorContext\n): ts.Node | undefined {\n let importValue: string | undefined\n let nodeToFix: ts.Node | undefined\n\n // dynamic import or require()\n if (ts.isCallExpression(node)) {\n const expression = node.expression\n if (node.arguments.length === 0) return\n const arg = node.arguments[0]\n if (!ts.isStringLiteral(arg)) return\n if (\n // Can't call getText on after step\n expression.getText(sf) !== 'require' &&\n expression.kind !== ts.SyntaxKind.ImportKeyword\n )\n return\n importValue = stripQuotes(arg.getText(sf))\n nodeToFix = arg\n // import, export\n } else if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {\n if (!node.moduleSpecifier || !ts.isStringLiteral(node.moduleSpecifier))\n return\n // do not use getFullText() here, bug in watch mode, https://github.com/zerkalica/zerollup/issues/12\n importValue = node.moduleSpecifier.text\n nodeToFix = node.moduleSpecifier\n } else if (\n ts.isImportTypeNode(node) &&\n ts.isLiteralTypeNode(node.argument) &&\n ts.isStringLiteral(node.argument.literal)\n ) {\n importValue = node.argument.literal.text\n } else if (ts.isModuleDeclaration(node)) {\n if (!ts.isStringLiteral(node.name)) return\n importValue = node.name.text\n nodeToFix = node.name\n } else {\n return\n }\n\n const newImport = resolver.resolveImport(\n importValue,\n path.dirname(sf.fileName)\n )\n\n if (!newImport || newImport === importValue) return\n\n if (nodeToFix && fixNode) fixNode(nodeToFix, newImport)\n const newSpec = ts.createLiteral(newImport)\n\n let newNode: ts.Node | undefined\n\n if (ts.isImportTypeNode(node)) {\n newNode = ts.updateImportTypeNode(\n node,\n ts.createLiteralTypeNode(newSpec),\n node.qualifier,\n node.typeArguments,\n node.isTypeOf\n )\n newNode.flags = node.flags\n }\n\n if (ts.isImportDeclaration(node)) {\n newNode = ts.updateImportDeclaration(\n node,\n node.decorators,\n node.modifiers,\n node.importClause,\n newSpec\n )\n\n /**\n * Without this hack ts generates bad import of pure interface in output js,\n * this causes warning \"module has no exports\" in bundlers.\n *\n * index.ts\n * ```ts\n * import {Some} from './lib'\n * export const some: Some = { self: 'test' }\n * ```\n *\n * lib.ts\n * ```ts\n * export interface Some { self: string }\n * ```\n *\n * output: index.js\n * ```js\n * import { Some } from \"./some/lib\"\n * export const some = { self: 'test' }\n * ```\n */\n newNode.flags = node.flags\n }\n\n if (ts.isExportDeclaration(node)) {\n const exportNode = ts.updateExportDeclaration(\n node,\n node.decorators,\n node.modifiers,\n node.exportClause,\n newSpec\n )\n if (exportNode.flags !== node.flags) {\n /**\n * Additional hacks for exports. Without it ts throw exception, if flags changed in export node.\n */\n const ms = exportNode.moduleSpecifier\n const oms = node.moduleSpecifier\n if (ms && oms) {\n ms.pos = oms.pos\n ms.end = oms.end\n ms.parent = oms.parent\n }\n\n newNode = exportNode\n\n newNode.flags = node.flags\n }\n }\n\n if (ts.isCallExpression(node))\n newNode = ts.updateCall(node, node.expression, node.typeArguments, [\n newSpec,\n ])\n\n if (ts.isModuleDeclaration(node)) {\n newNode = ts.updateModuleDeclaration(\n node,\n node.decorators,\n node.modifiers,\n newSpec,\n node.body\n )\n }\n\n return newNode\n}\n","import ts from 'typescript'\nimport { createTraverseVisitor } from '@zerollup/ts-helpers'\nimport {\n Config,\n defaultConfig,\n TransformationContext,\n CustomTransformer,\n} from './Types'\nimport { ImportPathInternalResolver } from './ImportPathInternalResolver'\nimport { createFixNode } from './createFixNode'\nimport { importPathVisitor } from './importPathVisitor'\n\nexport function transformPaths(\n program?: ts.Program,\n configRaw: Config = defaultConfig\n) {\n const config = { ...defaultConfig, ...configRaw }\n\n function createTransformer(transformationContext: TransformationContext) {\n const resolver = new ImportPathInternalResolver(\n program,\n transformationContext,\n config\n )\n\n return function transformer(sf: ts.SourceFile) {\n return ts.visitNode(\n sf,\n createTraverseVisitor(\n importPathVisitor,\n {\n fixNode: config.disableForDeclarations\n ? undefined\n : createFixNode(sf),\n sf,\n resolver,\n },\n transformationContext\n )\n )\n }\n }\n\n const plugin: CustomTransformer = {\n before: createTransformer,\n afterDeclarations: config.disableForDeclarations\n ? undefined\n : (createTransformer as CustomTransformer['afterDeclarations']),\n }\n\n return plugin\n}\n"],"names":[],"mappings":"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"}