comptime.ts
Version:
<div align="center"> <img src="https://raw.githubusercontent.com/feathers-studio/comptime.ts/master/docs/comptime.ts.svg" alt="Hyperactive"> </div>
38 lines • 1.6 kB
JavaScript
import { createFilter } from "vite";
import MagicString from "magic-string";
import { getComptimeReplacements } from "./comptime.js";
import { readFile } from "node:fs/promises";
export async function comptime(opts) {
const filter = createFilter(opts?.include, opts?.exclude);
let resolver;
let replacements;
return {
name: "vite-plugin-comptime",
async buildStart() {
resolver = (specifier, importer) => this.resolve(specifier, importer).then(res => res?.id);
replacements = await getComptimeReplacements({ ...opts, resolver, filter });
},
async load(id) {
const replacement = replacements[id];
if (!replacement)
return null;
const mod = await readFile(id, "utf-8");
const s = new MagicString(mod);
for (const r of replacement) {
s.overwrite(r.start, r.end, r.replacement);
}
return { code: s.toString(), map: s.generateMap() };
},
async handleHotUpdate({ modules, file }) {
if (!filter(file))
return;
// find new replacements for *only* the affected file
const newReplacements = await getComptimeReplacements({ ...opts, resolver, filter: id => id === file });
// TODO: maybe diff the replacements to avoid unnecessary updates
Object.assign(replacements, newReplacements);
// fault all modules that depend on the affected file
return modules;
},
};
}
//# sourceMappingURL=vite.js.map