vite.vendor-styles-components.ts 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import fs from 'node:fs';
  2. import path from 'node:path';
  3. import type { Plugin } from 'vite';
  4. import { defineConfig } from 'vite';
  5. // Collect all src/**/*.vendor-styles.ts as entry points
  6. const entries = fs
  7. .globSync('src/**/*.vendor-styles.ts', { cwd: __dirname })
  8. .reduce(
  9. (acc, file) => {
  10. const name = file
  11. .replace(/^src\//, '')
  12. .replace(/\.vendor-styles\.ts$/, '.vendor-styles.prebuilt');
  13. acc[name] = path.resolve(__dirname, file);
  14. return acc;
  15. },
  16. {} as Record<string, string>,
  17. );
  18. // Move emitted font assets from src/assets/ to public/static/fonts/
  19. // and rewrite URL references in prebuilt JS files
  20. function moveAssetsToPublic(): Plugin {
  21. return {
  22. name: 'move-assets-to-public',
  23. closeBundle() {
  24. const srcDir = path.resolve(__dirname, 'src/assets');
  25. const destDir = path.resolve(__dirname, 'public/static/fonts');
  26. if (!fs.existsSync(srcDir)) return;
  27. // Move font files
  28. fs.mkdirSync(destDir, { recursive: true });
  29. for (const file of fs.readdirSync(srcDir)) {
  30. fs.renameSync(path.join(srcDir, file), path.join(destDir, file));
  31. }
  32. fs.rmdirSync(srcDir);
  33. // Rewrite /assets/ -> /static/fonts/ in prebuilt JS files
  34. const prebuiltFiles = fs.globSync('src/**/*.vendor-styles.prebuilt.js', {
  35. cwd: __dirname,
  36. });
  37. for (const file of prebuiltFiles) {
  38. const filePath = path.resolve(__dirname, file);
  39. const content = fs.readFileSync(filePath, 'utf-8');
  40. if (content.includes('/assets/')) {
  41. fs.writeFileSync(
  42. filePath,
  43. content.replaceAll('/assets/', '/static/fonts/'),
  44. );
  45. }
  46. }
  47. },
  48. };
  49. }
  50. export default defineConfig({
  51. publicDir: false,
  52. plugins: [moveAssetsToPublic()],
  53. build: {
  54. outDir: 'src',
  55. emptyOutDir: false,
  56. rollupOptions: {
  57. input: entries,
  58. output: {
  59. format: 'es',
  60. entryFileNames: '[name].js',
  61. },
  62. },
  63. },
  64. });