-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvite-plugin-inject-css.ts
55 lines (45 loc) · 1.87 KB
/
vite-plugin-inject-css.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import { Plugin } from 'vite'
const cssInjectionKeyword = '/* @vite-plugin-inject-css */'
export function vitePluginInjectCss(): Plugin {
let cssContent: string
return {
name: 'vite-plugin-inject-css',
// Use Vite's 'transform' hook during development
// transform(code, id) {
// this.warn(`id: ${id}`)
// if (id.includes('YourShadowDOMComponentFile')) {
// console.log(`Injecting CSS into ${id} during dev...`)
// // Use Vite's CSS loader to ensure we get the processed CSS
// const cssVirtualModule = `/src/style.css` // Path to your main Tailwind CSS entry file
// // Inject the processed CSS via dynamic import for dev
// return code.replace(
// '/* @inject-css */',
// `import('${cssVirtualModule}').then(module => {
// const style = document.createElement('style');
// style.textContent = module.default;
// shadowRoot.appendChild(style);
// });`,
// )
// }
// return code
// },
generateBundle(_, bundle) {
const cssFiles = Object.keys(bundle).filter((key) => key.endsWith('.css'))
// this.error(`cssFiles: ${cssFiles.join(',')}`)
if (!cssFiles.length) return
const cssFile = cssFiles[0]
const output = bundle[cssFile]
const cssContent =
'source' in output ? ((output as any).source as string) : ''
// Step 2: Locate the correct JS chunk and add our compiled CSS directly in there.
Object.values(bundle).forEach((chunk) => {
const isJSChunk =
chunk.type === 'chunk' && chunk.fileName.endsWith('.js')
if (!isJSChunk) return
const isChunkToInjectCss = chunk.code.includes(cssInjectionKeyword)
if (!isChunkToInjectCss) return
chunk.code = chunk.code.replace(cssInjectionKeyword, cssContent)
})
},
} satisfies Plugin
}