nas/config/vite/plugin-mastodon-themes.ts
Claire 0372344d33
Move Mastodon theme handling to custom vite plugin (#34808)
Co-authored-by: Echo <ChaosExAnima@users.noreply.github.com>
2025-05-27 08:50:48 +00:00

58 lines
1.5 KiB
TypeScript

/* 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,
},
},
};
},
};
}