Files

96 lines
3.1 KiB
TypeScript
Executable File

import type { PluginOption } from 'vite'
import boxen from 'boxen'
import picocolors from 'picocolors'
import banner from 'vite-plugin-banner'
export interface CopyrightOptions {
edition?: string
website?: string
}
function resolveOptions(options: CopyrightOptions = {}) {
return {
edition: options.edition ?? '基础版',
website: options.website ?? 'https://fantastic-admin.hurui.me',
}
}
function createBannerPlugin(options: CopyrightOptions = {}): PluginOption {
const { website } = resolveOptions(options)
return banner(`
/**
* 由 Fantastic-admin 提供技术支持
* Powered by Fantastic-admin
* ${website}
*/
`)
}
function createTerminalInfoPlugin(options: CopyrightOptions = {}): PluginOption {
const { edition, website } = resolveOptions(options)
return {
name: 'vite-plugin-terminal-info',
apply: 'serve',
async buildStart() {
const { bold, green, magenta, bgGreen, underline } = picocolors
// eslint-disable-next-line no-console
console.log(
boxen(
`${bold(green(`由 ${bgGreen('Fantastic-admin')} 驱动`))}\n\n${underline(website)}\n\n当前使用:${magenta(edition)}`,
{
padding: 1,
margin: 1,
borderStyle: 'double',
textAlignment: 'center',
},
),
)
},
}
}
function createSystemCopyrightPlugin(options: CopyrightOptions = {}): PluginOption {
const { website } = resolveOptions(options)
const fontFamily = 'font-family: "JetBrains Mono", "SF Mono", "Cascadia Code", Menlo, Consolas, "Liberation Mono", monospace;'
const mainStyle = `${fontFamily} font-size: 14px; font-weight: 700; padding: 6px 8px; color: #35495e; background: #42b883;`
const subStyle = `${fontFamily} font-size: 14px; font-weight: 400; padding: 6px 8px; color: #fff; background: #35495e;`
const iconStyle = `${fontFamily} font-size: 14px; font-weight: 500; padding: 6px 4px 6px 8px; color: #d7f0ff; background: #1d5b85;`
const linkStyle = `${fontFamily} font-size: 14px; font-weight: 500; letter-spacing: 0.2px; padding: 6px 8px 6px 4px; color: #d7f0ff; background: #1d5b85; text-decoration: underline; text-underline-offset: 2px;`
return {
name: 'vite-plugin-system-copyright',
apply: 'build',
transform(code, id) {
if (!/src\/main\.ts$/.test(id)) {
return
}
return {
code: `
/* eslint-disable no-console */
if ((navigator.language).toLowerCase() === 'zh-cn') {
console.info('%c由%cFantastic-admin%c驱动%c👉%c${website}', ${JSON.stringify(subStyle)}, ${JSON.stringify(mainStyle)}, ${JSON.stringify(subStyle)}, ${JSON.stringify(iconStyle)}, ${JSON.stringify(linkStyle)})
}
else {
console.info('%cPowered by %cFantastic-admin%c%c👉%c${website}', ${JSON.stringify(subStyle)}, ${JSON.stringify(mainStyle)}, ${JSON.stringify(subStyle)}, ${JSON.stringify(iconStyle)}, ${JSON.stringify(linkStyle)})
}
${code}
`,
map: null,
}
},
}
}
export function createCopyrightPlugins(options: CopyrightOptions = {}): PluginOption[] {
return [
createBannerPlugin(options),
createTerminalInfoPlugin(options),
createSystemCopyrightPlugin(options),
]
}