You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.0 KiB
66 lines
2.0 KiB
/* eslint-disable import/no-extraneous-dependencies */
|
|
import fs from 'fs'
|
|
import { resolve } from 'path'
|
|
import type { ResolvedConfig, PluginOption } from 'vite'
|
|
|
|
const fileRegex = /\.(css)$/
|
|
const injectCode = (code: string) =>
|
|
`function styleInject(css,ref){if(ref===void 0){ref={}}var insertAt=ref.insertAt;if(!css||typeof document==="undefined"){return}var head=document.head||document.getElementsByTagName("head")[0];var style=document.createElement("style");style.type="text/css";if(insertAt==="top"){if(head.firstChild){head.insertBefore(style,head.firstChild)}else{head.appendChild(style)}}else{head.appendChild(style)}if(style.styleSheet){style.styleSheet.cssText=css}else{style.appendChild(document.createTextNode(css))}};styleInject(\`${code}\`)`
|
|
const template = `console.warn("__INJECT__")`
|
|
|
|
let viteConfig: ResolvedConfig
|
|
const css: string[] = []
|
|
|
|
export default function libInjectCss(): PluginOption {
|
|
return {
|
|
name: 'lib-inject-css',
|
|
|
|
apply: 'build',
|
|
|
|
configResolved(resolvedConfig: ResolvedConfig) {
|
|
viteConfig = resolvedConfig
|
|
},
|
|
|
|
transform(code: string, id: string) {
|
|
if (fileRegex.test(id)) {
|
|
css.push(code)
|
|
return {
|
|
code: '',
|
|
}
|
|
}
|
|
if (
|
|
// @ts-ignore
|
|
id.includes(viteConfig.build.lib.entry)
|
|
) {
|
|
return {
|
|
code: `${code}
|
|
${template}`,
|
|
}
|
|
}
|
|
return null
|
|
},
|
|
|
|
async writeBundle(_: any, bundle: any) {
|
|
for (const file of Object.entries(bundle)) {
|
|
const { root } = viteConfig
|
|
const outDir: string = viteConfig.build.outDir || 'dist'
|
|
const fileName: string = file[0]
|
|
const filePath: string = resolve(root, outDir, fileName)
|
|
|
|
try {
|
|
let data: string = fs.readFileSync(filePath, {
|
|
encoding: 'utf8',
|
|
})
|
|
|
|
if (data.includes(template)) {
|
|
data = data.replace(template, injectCode(css.join('\n')))
|
|
}
|
|
|
|
fs.writeFileSync(filePath, data)
|
|
} catch (e) {
|
|
console.error(e)
|
|
}
|
|
}
|
|
},
|
|
}
|
|
}
|