colorSchemes.ts

 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 staffColorSchemes: ColorScheme[] = [];
12export { staffColorSchemes };
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}/staff`),
41  staffColorSchemes
42);
43
44function fillMeta(themesPath: string, meta: Meta[]) {
45  for_all_color_schemes_in(themesPath, (colorScheme, path) => {
46    if (colorScheme.meta) {
47      meta.push(colorScheme.meta)
48    } else {
49      throw Error(`Public theme ${path} must have a meta field`)
50    }
51  })
52}
53
54fillMeta(themes_directory, schemeMeta);