vite.vendor-styles-components.ts 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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 TS 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/ and prepend // @ts-nocheck in prebuilt TS files
  34. const prebuiltFiles = fs.globSync('src/**/*.vendor-styles.prebuilt.ts', {
  35. cwd: __dirname,
  36. });
  37. for (const file of prebuiltFiles) {
  38. const filePath = path.resolve(__dirname, file);
  39. let content = fs.readFileSync(filePath, 'utf-8');
  40. if (content.includes('/assets/')) {
  41. content = content.replaceAll('/assets/', '/static/fonts/');
  42. }
  43. if (!content.startsWith('// @ts-nocheck')) {
  44. content = `// @ts-nocheck\n${content}`;
  45. }
  46. fs.writeFileSync(filePath, content);
  47. }
  48. },
  49. };
  50. }
  51. export default defineConfig({
  52. publicDir: false,
  53. plugins: [moveAssetsToPublic()],
  54. build: {
  55. outDir: 'src',
  56. emptyOutDir: false,
  57. rollupOptions: {
  58. input: entries,
  59. output: {
  60. format: 'es',
  61. entryFileNames: '[name].ts',
  62. },
  63. },
  64. },
  65. });