buildThemes.ts

 1import * as fs from "fs";
 2import * as path from "path";
 3import { tmpdir } from "os";
 4import app from "./styleTree/app";
 5import colorSchemes, {
 6  internalColorSchemes,
 7  experimentalColorSchemes,
 8} from "./colorSchemes";
 9import snakeCase from "./utils/snakeCase";
10import { ColorScheme } from "./themes/common/colorScheme";
11
12const themeDirectory = `${__dirname}/../../assets/themes`;
13const internalDirectory = `${themeDirectory}/internal`;
14const experimentsDirectory = `${themeDirectory}/experiments`;
15const tempDirectory = fs.mkdtempSync(path.join(tmpdir(), "build-themes"));
16
17// Clear existing themes
18function clearThemes(themeDirectory: string) {
19  for (const file of fs.readdirSync(themeDirectory)) {
20    if (file.endsWith(".json")) {
21      const name = file.replace(/\.json$/, "");
22      if (!colorSchemes.find((colorScheme) => colorScheme.name === name)) {
23        fs.unlinkSync(path.join(themeDirectory, file));
24      }
25    }
26  }
27}
28
29clearThemes(themeDirectory);
30clearThemes(internalDirectory);
31clearThemes(experimentsDirectory);
32
33function writeThemes(colorSchemes: ColorScheme[], outputDirectory: string) {
34  for (let colorScheme of colorSchemes) {
35    let styleTree = snakeCase(app(colorScheme));
36    let styleTreeJSON = JSON.stringify(styleTree, null, 2);
37    let tempPath = path.join(tempDirectory, `${colorScheme.name}.json`);
38    let outPath = path.join(outputDirectory, `${colorScheme.name}.json`);
39    fs.writeFileSync(tempPath, styleTreeJSON);
40    fs.renameSync(tempPath, outPath);
41    console.log(`- ${outPath} created`);
42  }
43}
44
45// Write new themes to theme directory
46writeThemes(colorSchemes, themeDirectory);
47writeThemes(internalColorSchemes, internalDirectory);
48writeThemes(experimentalColorSchemes, experimentsDirectory);