buildThemes.ts

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