UNPKG

unbag

Version:

一个专门用来开发npm工具的包

148 lines 4.17 kB
import path, { AbsolutePath } from "./../../../../utils/path.mjs"; import { transformFileAsync } from "@babel/core"; import { createRequire } from "node:module"; import { mergeConfig } from "./../../../../utils/config.mjs"; import { useRoot } from "./../../../../utils/common.mjs"; import { defineTransformActionTask, TransformActionTaskOutFileType } from "../index.mjs"; const require2 = createRequire(import.meta.url); const DefaultTransformActionTaskAliasOptions = { paths: {}, pathResolver: params => { const { finalOptions, sourcePath, inputDir, filePath, finalUserConfig } = params; const { paths } = finalOptions; const rootPath = useRoot({ finalUserConfig }); const matched = Object.entries(paths).find(([key2]) => sourcePath.startsWith(`${key2}/`)); if (!matched) { return sourcePath; } const [key, value] = matched; const absoluteSourcePath = new AbsolutePath({ content: sourcePath.replace(`${key}/`, `${path.resolve(rootPath.content, value)}/`) }); const absoluteFilePath = filePath.toAbsolutePath({ rel: inputDir }); const absoluteFileDir = new AbsolutePath({ content: path.dirname(absoluteFilePath.content) }); const relativePath = absoluteSourcePath.toRelativePath({ rel: absoluteFileDir }); const relativePathContent = "./" + relativePath.content; return relativePathContent; }, fileResolvers: { ".js": async ({ filePath, inputDir, finalOptions, finalUserConfig }) => { const { pathResolver } = finalOptions; const absoluteFilePath = filePath.toAbsolutePath({ rel: inputDir }); const jsFile = await transformFileAsync(absoluteFilePath.content, { plugins: [[require2.resolve("babel-plugin-module-resolver"), { resolvePath: sourcePath => { return pathResolver({ sourcePath, finalOptions, finalUserConfig, inputDir, filePath }); } }]] }); return jsFile?.code || ""; }, ".ts": async ({ filePath, inputDir, finalOptions, finalUserConfig }) => { const { pathResolver } = finalOptions; const absoluteFilePath = filePath.toAbsolutePath({ rel: inputDir }); const jsFile = await transformFileAsync(absoluteFilePath.content, { plugins: [[require2.resolve("@babel/plugin-syntax-typescript")], [require2.resolve("babel-plugin-module-resolver"), { resolvePath: sourcePath => { return pathResolver({ sourcePath, finalOptions, finalUserConfig, inputDir, filePath }); } }]] }); return jsFile?.code || ""; } }, getFileResolver: ({ filePath, finalOptions }) => { const { fileResolvers } = finalOptions; const extName = path.extname(filePath.content); return fileResolvers[extName]; } }; const TransformActionTaskAlias = options => { const finalOptions = mergeConfig(DefaultTransformActionTaskAliasOptions, options || {}); return defineTransformActionTask(async params => { const { finalUserConfig, inputDir, filePaths } = params; return await Promise.all(filePaths.map(async filePath => { const resolver = await finalOptions.getFileResolver({ finalUserConfig, filePath, inputDir, finalOptions }); if (resolver) { return { from: filePath, to: filePath, type: TransformActionTaskOutFileType.Transformed, content: await resolver({ finalUserConfig, filePath, inputDir, finalOptions }), sourcemap: void 0 }; } return { from: filePath, to: filePath, type: TransformActionTaskOutFileType.Copy }; })); }); }; export { DefaultTransformActionTaskAliasOptions, TransformActionTaskAlias };