vitepress-plugin-announcement
Version:
vitepress plugin, Announcement, 公告窗口
66 lines (65 loc) • 2.01 kB
JavaScript
// src/index.ts
import path from "node:path";
import { fileURLToPath } from "node:url";
import { stringify } from "javascript-stringify";
function isESM() {
return typeof __filename === "undefined" || typeof __dirname === "undefined";
}
function getDirname() {
return isESM() ? path.dirname(fileURLToPath(import.meta.url)) : __dirname;
}
var componentName = "Announcement";
var componentFile = `${componentName}.vue`;
var aliasComponentFile = `${getDirname()}/components/${componentFile}`;
var virtualModuleId = "virtual:announcement-options";
var resolvedVirtualModuleId = `\0${virtualModuleId}`;
function AnnouncementPlugin(options) {
const componentOptions = {
clientOnly: false,
duration: 0,
mobileMinify: false,
reopen: true,
twinkle: false,
...options
};
const pluginOps = {
name: "vitepress-plugin-announcement",
enforce: "pre",
config: () => {
return {
resolve: {
alias: {
[`./${componentFile}`]: aliasComponentFile
}
}
};
},
transform(code, id) {
if (id.endsWith("vitepress/dist/client/theme-default/Layout.vue")) {
const slotPosition = '<slot name="layout-top" />';
let transformResult = code.replace(slotPosition, `${slotPosition}<Announcement/>`);
if (componentOptions.clientOnly) {
transformResult = transformResult.replace("<Announcement/>", "<ClientOnly><Announcement/></ClientOnly>");
}
const setupPosition = '<script setup lang="ts">';
transformResult = transformResult.replace(setupPosition, `${setupPosition}
import Announcement from './Announcement.vue'`);
return transformResult;
}
},
resolveId(id) {
if (id === virtualModuleId) {
return resolvedVirtualModuleId;
}
},
load(id) {
if (id === resolvedVirtualModuleId) {
return `export default ${stringify(componentOptions)}`;
}
}
};
return pluginOps;
}
export {
AnnouncementPlugin
};