@tomjs/vite-plugin-monaco-editor
Version:
vite plugin for monaco-editor, inject scripts for index.html
136 lines (132 loc) • 4.8 kB
JavaScript
// src/index.ts
import path from "path";
import fs from "fs-extra";
import { parse as htmlParser } from "node-html-parser";
// src/constants.ts
var PLUGIN_NAME = "tomjs:monaco";
// src/utils.ts
function urlConcat(...urls) {
return urls.map((s) => (s || "").trim()).filter((s) => s).join("/").replace(/\/+/g, "/").replace(/:\//, "://");
}
// src/index.ts
var urlTypeMap = {
npmmirror: "https://registry.npmmirror.com/monaco-editor/{version}/files",
unpkg: "https://unpkg.com/monaco-editor@{version}",
jsdelivr: "https://cdn.jsdelivr.net/npm/monaco-editor@{version}"
};
function getPkgVersion() {
const pwd = process.cwd();
const modulePath = path.join(pwd, "node_modules/monaco-editor");
const pkgFile = path.join(modulePath, "package.json");
if (!fs.existsSync(pkgFile)) {
return;
}
const pkg = JSON.parse(fs.readFileSync(pkgFile, "utf-8"));
return pkg.version;
}
function getHtmlRoot(html) {
const root = htmlParser(html);
const title = root.querySelector("title");
if (!title) {
const head = root.querySelector("head");
if (!head) {
root == null ? void 0 : root.insertAdjacentHTML("beforeend", "<head></head>");
}
head == null ? void 0 : head.insertAdjacentHTML("beforeend", "<title></title>");
}
return { root, title };
}
function getInjectHtml(urlPrefix) {
return (
/* html*/
`
<link rel="stylesheet" data-name="vs/editor/editor.main" href="${urlPrefix}/editor/editor.main.css"/>
<script>var require = { paths: { vs: "${urlPrefix}" } };</script>
<script src="${urlPrefix}/loader.js"></script>
<script src="${urlPrefix}/editor/editor.main.nls.js"></script>
<script src="${urlPrefix}/editor/editor.main.js"></script>`
);
}
function preHandleOptions(options) {
const { local, ...opts } = Object.assign({}, options);
const serveOpts = Object.assign({}, opts.serve);
opts.serve = serveOpts;
let localOpts;
if (local === true) {
localOpts = { copy: true };
} else if (typeof local === "object") {
localOpts = local;
}
return Object.assign(opts, { local: localOpts });
}
function useMonacoEditorPlugin(options) {
const opts = preHandleOptions(options);
const serveOpts = opts.serve;
const localOpts = opts.local;
let cdUrl;
return [
{
name: PLUGIN_NAME,
apply: "serve",
configResolved(config) {
serveOpts.base = (serveOpts == null ? void 0 : serveOpts.base) || config.base || "/";
},
transformIndexHtml(html) {
const { root, title } = getHtmlRoot(html);
const urlPrefix = urlConcat(serveOpts.base, `node_modules/monaco-editor/dev/vs`);
title == null ? void 0 : title.insertAdjacentHTML("afterend", getInjectHtml(urlPrefix));
return root.toString();
}
},
{
name: PLUGIN_NAME,
apply: "build",
configResolved(config) {
console.log(config.base);
if (localOpts) {
localOpts.base ||= config.base;
localOpts.outDir ||= config.build.outDir;
localOpts.copy ??= true;
localOpts.path ||= "npm/monaco-editor@{version}";
localOpts.path = localOpts.path.replace(/{version}/g, getPkgVersion());
opts.local = localOpts;
} else {
let { type, url } = opts;
if (!type || !["npmmirror", "jsdelivr", "unpkg", "custom"].includes(type)) {
type = new Intl.NumberFormat().resolvedOptions().locale === "zh-CN" ? "npmmirror" : "jsdelivr";
}
if (["npmmirror", "jsdelivr", "unpkg"].includes(type)) {
url = urlTypeMap[type];
} else if (!url) {
throw new Error("When the type parameter is custom, the url parameter is required.");
}
cdUrl = url.replace(/{version}/g, getPkgVersion());
}
},
transformIndexHtml(html) {
const { root, title } = getHtmlRoot(html);
const urlPrefix = cdUrl || urlConcat((localOpts == null ? void 0 : localOpts.base) || "/", (localOpts == null ? void 0 : localOpts.path) || "");
title == null ? void 0 : title.insertAdjacentHTML("afterend", getInjectHtml(urlConcat(urlPrefix, "/min/vs")));
return root.toString();
},
closeBundle() {
if (!(localOpts == null ? void 0 : localOpts.copy)) {
return;
}
const outDir = localOpts.outDir || "dist";
const outPath = path.join(process.cwd(), outDir);
if (!fs.existsSync(outPath)) {
fs.mkdirpSync(outPath);
}
const srcFolder = path.join(process.cwd(), "node_modules/monaco-editor/min");
const destFolder = path.join(outPath, localOpts.path, "min");
fs.copySync(srcFolder, destFolder);
}
}
];
}
var src_default = useMonacoEditorPlugin;
export {
src_default as default,
useMonacoEditorPlugin
};