unbag
Version:
一个专门用来开发npm工具的包
148 lines • 4.17 kB
JavaScript
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 };