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

105 lines 4.21 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var fixExtensionsPlugin_exports = {}; __export(fixExtensionsPlugin_exports, { fixExtensionsPlugin: () => fixExtensionsPlugin }); module.exports = __toCommonJS(fixExtensionsPlugin_exports); 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}`; } ); }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { fixExtensionsPlugin }); //# sourceMappingURL=fixExtensionsPlugin.cjs.map