vite-plugin-no-bundle
Version:
Use Vite for building without the bundling part.
87 lines (86 loc) • 2.59 kB
JavaScript
// 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
};