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 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);