UNPKG

vite-plugin-no-bundle

Version:
87 lines (86 loc) 2.59 kB
// src/index.ts import { createRequire } from "module"; import path from "path"; import fs from "fs"; import micromatch from "micromatch"; import fg from "fast-glob"; var require2 = createRequire(import.meta.url); function plugin(config) { const preserveModulesRoot = config?.root ?? "src"; let root; const isInternal = (file) => config?.internal ? micromatch.isMatch(file, config.internal) : false; const isCopyTarget = (file) => config?.copy ? micromatch.isMatch(file, config.copy) : false; const isNodeModule = (id) => { if (id.startsWith(".") || path.isAbsolute(id)) { return id.includes("/node_modules/"); } try { require2.resolve(id, { paths: [root] }); return true; } catch (e) { return false; } }; return { name: "no-bundle", enforce: "pre", apply: "build", config(userConfig) { const { entry, fileName = "[name]" } = userConfig.build?.lib || {}; if (!entry) throw new Error('Required field "build.lib.entry" could not be found'); return { build: { lib: { entry, fileName }, rollupOptions: { output: { preserveModules: true, preserveModulesRoot } } } }; }, configResolved(resolvedConfig) { root = resolvedConfig.root; }, async buildStart() { if (config?.copy) { const cwd = preserveModulesRoot ? path.join(root, preserveModulesRoot) : root; const files = await fg(config.copy, { cwd }); files.forEach((file) => { this.emitFile({ type: "asset", source: fs.readFileSync(path.join(cwd, file)), fileName: file }); }); } }, async resolveId(source, importer, options) { const [id] = source.split("?"); if (options.isEntry) return null; if (!importer) return null; if (isInternal(id)) return null; if (isNodeModule(id)) return { id, external: true }; const absolutePath = path.isAbsolute(id) ? path.join(root, id) : path.join(path.dirname(importer), id); const relativePath = path.relative(root, absolutePath); if (isCopyTarget(relativePath)) { return { // Enforce relative path to avoid issues with preserveModulesRoot id: path.isAbsolute(id) ? path.relative(path.dirname(importer), absolutePath) : id, external: true, moduleSideEffects: true }; } return null; } }; } export { plugin as default };