esbuild-fix-imports-plugin
Version:
An ESBuild plugin that fixes import paths by applying fixAliasPlugin, fixFolderImportsPlugin, and fixExtensionsPlugin. It ensures correct file extensions, resolves path aliases, and fixes directory imports in your build output when using 'tsup' with 'bund
73 lines • 2.44 kB
JavaScript
import { dirname, resolve } from "path";
const fixFolderImportsPlugin = () => ({
name: "fixFolderImportsPlugin",
setup(build) {
const outExtension = build.initialOptions.outExtension?.[".js"] ?? ".js";
build.onEnd((result) => {
if (result.errors.length > 0) {
return;
}
const allJsOutputs = new Set(
(result.outputFiles ?? []).filter((f) => f.path.endsWith(outExtension)).map((f) => f.path)
);
for (const outputFile of result.outputFiles ?? []) {
if (!outputFile.path.endsWith(outExtension)) {
continue;
}
const fileContents = outputFile.text;
const filePath = outputFile.path;
const nextFileContents = modifyFolderImports(
fileContents,
filePath,
outExtension,
allJsOutputs
);
if (nextFileContents !== fileContents) {
outputFile.contents = Buffer.from(nextFileContents, "utf-8");
}
}
});
}
});
const ESM_RELATIVE_IMPORT_EXP = /from\s*['"](\..+?)['"]/g;
const CJS_RELATIVE_IMPORT_EXP = /require\s*\(\s*['"](\..+?)['"]\s*\)/g;
const hasExtensionRegex = /\.[^./\\]+$/;
const modifyFolderImports = (contents, filePath, outExtension, allJsOutputs) => {
contents = contents.replace(ESM_RELATIVE_IMPORT_EXP, (match, importPath) => {
const newPath = replaceFolderImport(
importPath,
filePath,
outExtension,
allJsOutputs
);
return match.replace(importPath, newPath);
});
contents = contents.replace(CJS_RELATIVE_IMPORT_EXP, (match, importPath) => {
const newPath = replaceFolderImport(
importPath,
filePath,
outExtension,
allJsOutputs
);
return match.replace(importPath, newPath);
});
return contents;
};
const replaceFolderImport = (importPath, filePath, outExtension, allJsOutputs) => {
if (importPath.endsWith("/") || importPath.endsWith(".") || hasExtensionRegex.test(importPath)) {
return importPath;
}
const currentDir = dirname(filePath);
const candidateFile = resolve(currentDir, importPath) + outExtension;
const candidateIndex = resolve(currentDir, importPath, "index") + outExtension;
if (allJsOutputs.has(candidateFile)) {
return importPath;
} else if (allJsOutputs.has(candidateIndex)) {
return importPath + "/index";
}
return importPath;
};
export {
fixFolderImportsPlugin
};
//# sourceMappingURL=fixFolderImportsPlugin.mjs.map