1import fs from "fs";
2import path from "path";
3import { ColorScheme, Meta } from "./themes/common/colorScheme";
4
5const colorSchemes: ColorScheme[] = [];
6export default colorSchemes;
7
8const schemeMeta: Meta[] = [];
9export { schemeMeta };
10
11const internalColorSchemes: ColorScheme[] = [];
12export { internalColorSchemes };
13
14const experimentalColorSchemes: ColorScheme[] = [];
15export { experimentalColorSchemes };
16
17const themes_directory = path.resolve(`${__dirname}/themes`);
18
19function for_all_color_schemes_in(themesPath: string, callback: (module: any, path: string) => void) {
20 for (const fileName of fs.readdirSync(themesPath)) {
21 if (fileName == "template.ts") continue;
22 const filePath = path.join(themesPath, fileName);
23
24 if (fs.statSync(filePath).isFile()) {
25 const colorScheme = require(filePath);
26 callback(colorScheme, path.basename(filePath));
27 }
28 }
29}
30
31function fillColorSchemes(themesPath: string, colorSchemes: ColorScheme[]) {
32 for_all_color_schemes_in(themesPath, (colorScheme, _path) => {
33 if (colorScheme.dark) colorSchemes.push(colorScheme.dark);
34 if (colorScheme.light) colorSchemes.push(colorScheme.light);
35 })
36}
37
38fillColorSchemes(themes_directory, colorSchemes);
39fillColorSchemes(
40 path.resolve(`${themes_directory}/internal`),
41 internalColorSchemes
42);
43fillColorSchemes(
44 path.resolve(`${themes_directory}/experiments`),
45 experimentalColorSchemes
46);
47
48function fillMeta(themesPath: string, meta: Meta[]) {
49 for_all_color_schemes_in(themesPath, (colorScheme, path) => {
50 if (colorScheme.meta) {
51 meta.push(colorScheme.meta)
52 } else {
53 throw Error(`Public theme ${path} must have a meta field`)
54 }
55 })
56}
57
58fillMeta(themes_directory, schemeMeta);