UNPKG

@wroud/vite-plugin-asset-resolver

Version:

A Vite plugin for custom asset resolution, mapping 'dist' to 'src' directories and resolving files like SVG, images, and other resources. Supports multiple directory aliases and file extensions for flexible module resolution.

54 lines 2.49 kB
import path from "path"; import { DEFAULT_DIST, DEFAULT_SRC, KNOWN_ASSET_TYPES } from "./constants.js"; export { DEFAULT_DIST, DEFAULT_SRC, KNOWN_ASSET_TYPES }; export function assetResolverPlugin(options) { // Ensure options are provided with default values const { dist = DEFAULT_DIST, src = DEFAULT_SRC, extensions = KNOWN_ASSET_TYPES, } = options || {}; // Remove leading dots and escape extensions for regex const escapedExtensions = extensions.map((ext) => ext.replace(/^\./, "").replace(/[.*+?^${}()|[\]\\]/g, "\\$&")); const extensionsPattern = escapedExtensions.join("|"); // Build the dynamic regex const regex = new RegExp(`^\\.{1,2}\\/.*\\.(${extensionsPattern})(\\?.*)?$`); return [ { name: "asset-resolver-plugin", enforce: "post", resolveId: { order: "post", async handler(source, importer, options) { if (!importer || !regex.test(source)) { return; } // Attempt default resolution const resolved = await this.resolve(source, importer, options); if (resolved) { return resolved; } const pathParts = importer.split(path.posix.sep); let distIndex = -1; for (let i = pathParts.length - 1; i >= 0; i--) { if (dist.includes(pathParts[i])) { distIndex = i; break; } } if (distIndex !== -1) { for (const srcAlias of src) { pathParts[distIndex] = srcAlias; let adjustedImporter = path.posix.join(...pathParts); if (importer.startsWith("/")) { adjustedImporter = "/" + adjustedImporter; } const resolvedId = await this.resolve(source, adjustedImporter, options); if (resolvedId) { return resolvedId; } } } throw new Error(`Failed to resolve ${source} from ${importer}`); }, }, }, ]; } //# sourceMappingURL=plugin.js.map