UNPKG

vitepress-plugin-announcement

Version:
66 lines (65 loc) 2.01 kB
// 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 };