vite-plugin-inline
Version:
Inline raw TypeScript code as a string
69 lines (63 loc) • 2.24 kB
JavaScript
;
const fs = require('node:fs');
const path = require('node:path');
const vite = require('vite');
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
const fs__default = /*#__PURE__*/_interopDefaultCompat(fs);
const path__default = /*#__PURE__*/_interopDefaultCompat(path);
function Inline() {
let config;
const inlines = /* @__PURE__ */ new Map();
return {
name: "vite-plugin-inline",
enforce: "pre",
configResolved(c) {
config = c;
},
async load(id) {
if (id.endsWith("?inline&raw") || id.endsWith("?raw&inline") || id.endsWith("?inline-ts")) {
const filename = id.slice(0, id.lastIndexOf("?"));
const ext = path__default.extname(filename).slice(1);
if (!["ts", "tsx", "mts", "js", "jsx", "mjs", "cjs"].includes(ext)) {
return;
}
const code = await fs__default.promises.readFile(filename, "utf-8");
this.addWatchFile(filename);
if (inlines.has(filename)) {
inlines.get(filename).add(id);
} else {
inlines.set(filename, /* @__PURE__ */ new Set([id]));
}
const result = await vite.transformWithEsbuild(code, filename, {
loader: ext === "ts" || ext === "mts" ? "ts" : ext === "tsx" ? "tsx" : ext === "jsx" ? "jsx" : "js",
minify: config.command === "serve" ? false : typeof config.build.minify === "boolean" ? config.build.minify : true,
target: config.build.target || void 0
});
return {
code: `export default ${JSON.stringify(result.code.trimEnd())}`,
map: null
};
}
},
handleHotUpdate({ file, server }) {
const related = inlines.get(file);
if (related && related.size > 0) {
let changed = false;
for (const id of related) {
const module = server.moduleGraph.getModuleById(id);
console.log(module);
if (module) {
server.moduleGraph.invalidateModule(module);
changed = true;
}
}
if (changed) {
server.ws.send({
type: "full-reload"
});
}
}
}
};
}
module.exports = Inline;