rollup-plugin-static-import
Version:
Rollup plugin for copying imported files without modifying. It's basically a copy plugin with the added functionality of marking imported assets as external.
71 lines (70 loc) • 2.33 kB
JavaScript
import fs from "node:fs";
import path from "node:path";
import glob from "glob";
import { createFilter } from "@rollup/pluginutils";
var makePathAbsolute = function(p, rootPath) {
if (path.isAbsolute(p)) {
return p;
}
return path.join(rootPath, p);
};
var staticImport = function(options) {
var pluginOptions = Object.assign({}, {
include: [],
exclude: [],
projectRoot: process.cwd(),
baseDir: "src"
}, options);
var projectRoot = pluginOptions.projectRoot;
var absoluteIncludes = pluginOptions.include.map(function(p) {
return makePathAbsolute(p, projectRoot);
});
var absoluteExcludes = pluginOptions.exclude.map(function(p) {
return makePathAbsolute(p, projectRoot);
});
var filter = createFilter(absoluteIncludes, absoluteExcludes, {
resolve: false
});
var baseDir = makePathAbsolute(pluginOptions.baseDir, projectRoot);
var self = {
name: "static-import",
resolveId: function(source, importer) {
var id = makePathAbsolute(path.join(path.dirname(importer || "./"), source), projectRoot);
if (!filter(id)) {
return;
}
// mark import external if it matches filters
return {
id: source,
external: true
};
},
buildStart: function buildStart() {
var _this = this;
// emit matching files and add them to watch list at the start of build
absoluteIncludes.flatMap(function(inc) {
return glob.sync(inc);
}).forEach(function(id) {
_this.emitFile({
type: "asset",
source: fs.readFileSync(id),
fileName: path.relative(baseDir, id)
});
_this.addWatchFile(id);
});
},
watchChange: function watchChange(id) {
if (!filter(id)) {
return;
}
// emit file if changed file matches filters
this.emitFile({
type: "asset",
source: fs.readFileSync(id),
fileName: path.relative(baseDir, id)
});
}
};
return self;
};
export default staticImport;