Write theme files atomically

Max Brunsfeld created

Change summary

styles/src/buildThemes.ts | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)

Detailed changes

styles/src/buildThemes.ts 🔗

@@ -1,23 +1,27 @@
 import * as fs from "fs";
 import * as path from "path";
+import { tmpdir } from 'os';
 import app from "./styleTree/app";
 import themes from "./themes";
 import snakeCase from "./utils/snakeCase";
 
 const themeDirectory = `${__dirname}/../../assets/themes/`;
+const tempDirectory = fs.mkdtempSync(path.join(tmpdir(), 'build-themes'));
 
 // Clear existing themes
 for (const file of fs.readdirSync(themeDirectory)) {
-  fs.unlinkSync(path.join(themeDirectory, file));
+  if (file.endsWith('.json')) {
+    fs.unlinkSync(path.join(themeDirectory, file));
+  }
 }
 
 // Write new themes to theme directory
 for (let theme of themes) {
   let styleTree = snakeCase(app(theme));
   let styleTreeJSON = JSON.stringify(styleTree, null, 2);
-  let outPath = path.resolve(
-    `${__dirname}/../../assets/themes/${theme.name}.json`
-  );
-  fs.writeFileSync(outPath, styleTreeJSON);
+  let tempPath = path.join(tempDirectory, `${theme.name}.json`);
+  let outPath = path.join(themeDirectory, `${theme.name}.json`);
+  fs.writeFileSync(tempPath, styleTreeJSON);
+  fs.renameSync(tempPath, outPath);
   console.log(`- ${outPath} created`);
 }