UNPKG

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

81 lines 3.14 kB
const fixExtensionsPlugin = () => ({ name: "fixExtensionsPlugin", setup: (build) => { const isEsm = build.initialOptions.format === "esm"; const outExtension = build.initialOptions.outExtension?.[".js"] ?? ".js"; build.onEnd((result) => { if (result.errors.length > 0) { return; } for (const outputFile of result.outputFiles ?? []) { if (!outputFile.path.endsWith(outExtension)) { continue; } const fileContents = outputFile.text; const nextFileContents = modifyRelativeImports( fileContents, isEsm, outExtension ); outputFile.contents = Buffer.from(nextFileContents); } }); } }); const CJS_RELATIVE_IMPORT_EXP = /require\s*\(\s*["'](\..+?)["']\s*\)(;?)/g; const ESM_RELATIVE_IMPORT_EXP = /from\s*(["'])(\.[^"']+)\1([^;]*;?)/g; const hasJSExtensionRegex = /\.(?:js)$/i; const hasNonJSExtensionRegex = /\.(?:png|svg|css|scss|csv|tsv|xml|toml|ini|jpe?g|json|md|mdx|json|yaml|gif|webp|ico|mp4|webm|ogg|wav|mp3|m4a|aac|webm|woff2?|eot|ttf|otf|wasm)$/i; const modifyRelativeImports = (contents, isEsm, outExtension) => isEsm ? modifyEsmImports(contents, outExtension) : modifyCjsImports(contents, outExtension); const modifyEsmImports = (contents, outExtension) => { return contents.replace( ESM_RELATIVE_IMPORT_EXP, (_, quote, importPath, rest = "") => { if (importPath.endsWith(".") || importPath.endsWith("/")) { return `from ${quote}${importPath}/index${outExtension}${quote}${rest}`; } if (importPath.endsWith(outExtension)) { return `from ${quote}${importPath}${quote}${rest}`; } if (hasJSExtensionRegex.test(importPath) && outExtension !== ".js") { const updatedImportPath = importPath.replace( hasJSExtensionRegex, outExtension ); return `from ${quote}${updatedImportPath}${quote}${rest}`; } if (hasNonJSExtensionRegex.test(importPath)) { return `from ${quote}${importPath}${quote}${rest}`; } return `from ${quote}${importPath}${outExtension}${quote}${rest}`; } ); }; const modifyCjsImports = (contents, outExtension) => { return contents.replace( CJS_RELATIVE_IMPORT_EXP, (_, importPath, maybeSemicolon = "") => { if (importPath.endsWith(".") || importPath.endsWith("/")) { return `require('${importPath}/index${outExtension}')${maybeSemicolon}`; } if (hasJSExtensionRegex.test(importPath) && outExtension !== ".js") { const updatedImportPath = importPath.replace( hasJSExtensionRegex, outExtension ); return `require('${updatedImportPath}')${maybeSemicolon}`; } if (importPath.endsWith(outExtension)) { return `require('${importPath}')${maybeSemicolon}`; } if (hasNonJSExtensionRegex.test(importPath)) { return `require('${importPath}')${maybeSemicolon}`; } return `require('${importPath}${outExtension}')${maybeSemicolon}`; } ); }; export { fixExtensionsPlugin }; //# sourceMappingURL=fixExtensionsPlugin.mjs.map