buildThemes.ts

 1import * as fs from "fs"
 2import { tmpdir } from "os"
 3import * as path from "path"
 4import { colorSchemes, staffColorSchemes } from "./colorSchemes"
 5import app from "./styleTree/app"
 6import { ColorScheme } from "./themes/common/colorScheme"
 7import snakeCase from "./utils/snakeCase"
 8
 9const assetsDirectory = `${__dirname}/../../assets`
10const themeDirectory = `${assetsDirectory}/themes`
11const staffDirectory = `${themeDirectory}/staff`
12
13const tempDirectory = fs.mkdtempSync(path.join(tmpdir(), "build-themes"))
14
15// Clear existing themes
16function clearThemes(themeDirectory: string) {
17    if (!fs.existsSync(themeDirectory)) {
18        fs.mkdirSync(themeDirectory, { recursive: true })
19    } else {
20        for (const file of fs.readdirSync(themeDirectory)) {
21            if (file.endsWith(".json")) {
22                const name = file.replace(/\.json$/, "")
23                if (
24                    !colorSchemes.find(
25                        (colorScheme) => colorScheme.name === name
26                    )
27                ) {
28                    fs.unlinkSync(path.join(themeDirectory, file))
29                }
30            }
31        }
32    }
33}
34
35clearThemes(themeDirectory)
36clearThemes(staffDirectory)
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(staffColorSchemes, staffDirectory)