Move Mastodon theme handling to custom vite plugin (#34808)
Co-authored-by: Echo <ChaosExAnima@users.noreply.github.com>
This commit is contained in:
		
							
								
								
									
										58
									
								
								config/vite/plugin-mastodon-themes.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								config/vite/plugin-mastodon-themes.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,58 @@
 | 
			
		||||
/* This plugins handles Mastodon's theme system
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
import fs from 'node:fs/promises';
 | 
			
		||||
import path from 'node:path';
 | 
			
		||||
 | 
			
		||||
import yaml from 'js-yaml';
 | 
			
		||||
import type { Plugin } from 'vite';
 | 
			
		||||
 | 
			
		||||
export function MastodonThemes(): Plugin {
 | 
			
		||||
  return {
 | 
			
		||||
    name: 'mastodon-themes',
 | 
			
		||||
    async config(userConfig) {
 | 
			
		||||
      if (!userConfig.root || !userConfig.envDir) {
 | 
			
		||||
        throw new Error('Unknown project directory');
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const themesFile = path.resolve(userConfig.envDir, 'config/themes.yml');
 | 
			
		||||
      const entrypoints: Record<string, string> = {};
 | 
			
		||||
 | 
			
		||||
      // Get all files mentioned in the themes.yml file.
 | 
			
		||||
      const themesString = await fs.readFile(themesFile, 'utf8');
 | 
			
		||||
      const themes = yaml.load(themesString, {
 | 
			
		||||
        filename: 'themes.yml',
 | 
			
		||||
        schema: yaml.FAILSAFE_SCHEMA,
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      if (!themes || typeof themes !== 'object') {
 | 
			
		||||
        throw new Error('Invalid themes.yml file');
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      for (const themePath of Object.values(themes)) {
 | 
			
		||||
        if (
 | 
			
		||||
          typeof themePath !== 'string' ||
 | 
			
		||||
          themePath.split('.').length !== 2 || // Ensure it has exactly one period
 | 
			
		||||
          !themePath.endsWith('css')
 | 
			
		||||
        ) {
 | 
			
		||||
          console.warn(
 | 
			
		||||
            `Invalid theme path "${themePath}" in themes.yml, skipping`,
 | 
			
		||||
          );
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
        entrypoints[path.basename(themePath)] = path.resolve(
 | 
			
		||||
          userConfig.root,
 | 
			
		||||
          themePath,
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      return {
 | 
			
		||||
        build: {
 | 
			
		||||
          rollupOptions: {
 | 
			
		||||
            input: entrypoints,
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
      };
 | 
			
		||||
    },
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user