fix-lib-css.mjs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { readdir, readFile, stat, writeFile } from 'node:fs/promises'
  2. import { join, resolve } from 'node:path'
  3. const distDir = resolve(process.cwd(), 'dist')
  4. const files = []
  5. async function collectFiles(dir) {
  6. const entries = await readdir(dir)
  7. for (const entry of entries) {
  8. const filePath = join(dir, entry)
  9. const fileStat = await stat(filePath)
  10. if (fileStat.isDirectory()) {
  11. await collectFiles(filePath)
  12. continue
  13. }
  14. files.push(filePath)
  15. }
  16. }
  17. await collectFiles(distDir)
  18. const cssAssets = []
  19. for (const filePath of files) {
  20. if (!filePath.endsWith('.css')) {
  21. continue
  22. }
  23. const source = await readFile(filePath, 'utf8')
  24. if (source.trim().length > 0) {
  25. cssAssets.push({ filePath, source })
  26. }
  27. }
  28. if (!cssAssets.length) {
  29. process.exit(0)
  30. }
  31. cssAssets.sort((a, b) => b.source.length - a.source.length)
  32. const cssAsset = cssAssets[0]
  33. const cssDataUrl = `data:text/css;base64,${Buffer.from(cssAsset.source).toString('base64')}`
  34. for (const filePath of files) {
  35. if (!/\.(mjs|js)$/.test(filePath)) {
  36. continue
  37. }
  38. const source = await readFile(filePath, 'utf8')
  39. let rewritten = source
  40. const cssHref = JSON.stringify(cssDataUrl)
  41. rewritten = rewritten.replace(
  42. /const\s+([A-Za-z_$][\w$]*)\s*=\s*"data:text\/css;base64,[^"]*";/,
  43. (_match, varName) => `const ${varName} = ${cssHref};`
  44. )
  45. rewritten = rewritten.replace(
  46. /new URL\("style\.css", import\.meta\.url\)\.href/g,
  47. cssHref
  48. )
  49. rewritten = rewritten.replace(
  50. /new URL\("\.\/file-viewer3\.css", import\.meta\.url\)\.href/g,
  51. cssHref
  52. )
  53. if (rewritten !== source) {
  54. await writeFile(filePath, rewritten, 'utf8')
  55. }
  56. }