#!/usr/bin/env node const { resolve } = require("path"); const fs = require("fs"); const { readdir, rename, unlink, readFile, writeFile, access } = fs.promises; const { promisify } = require("util"); const exec = promisify(require("child_process").exec); const vPrev = require("../assets/version.json").version; const vNext = require("../package.json").version; const ENC = "utf-8"; const FILES = [ "./jekyll-theme-pivoine.gemspec", "./_includes/body/scripts.html", "./_includes/body/footer.html", "./_includes/head/meta-static.html", "./_includes/head/links-static.html", "./_includes/head/styles-inline.html", "./_includes/head/styles-no-inline.html", "./_includes/header.txt", "./_layouts/compress.html", "./_js/lib/version.js", ].map((f) => resolve(f)); /** * @param {string} dir * @returns {Promise} * @see https://stackoverflow.com/a/45130990/870615 */ async function getFiles(dir) { const dirents = await readdir(dir, { withFileTypes: true }); const files = await Promise.all( dirents.map((dirent) => { const res = resolve(dir, dirent.name); return dirent.isDirectory() ? getFiles(res) : [res]; }), ); return Array.prototype.concat(...files); } (async function main() { try { const prev = vPrev.replace(/\./g, "\\."); const prevRegExp = new RegExp(prev, "g"); // const args = await Promise.all([ // getFiles("./hyde/_posts"), // getFiles("./pivoine/_posts"), // getFiles("./_projects"), // getFiles("./docs"), // ]); const args = []; const files = Array.prototype.concat.call(FILES, ...args); const pFiles = Promise.all( files .filter(([f]) => !f.startsWith(".")) .map((f) => [f, readFile(f, ENC)]) .map(async ([f, p]) => { const content = await p; // if (f.includes("CHANGELOG")) { // const pattern = new RegExp(`([^v])${prev}`, "g"); // return [f, content.replace(pattern, `$1${vNext}`)]; // } return [f, content.replace(prevRegExp, vNext)]; }) .map(async (p) => { const [f, content] = await p; return writeFile(f, content, ENC); }), ); const pUnlink = Promise.all( (await getFiles("./assets/js")) .filter((f) => f.match(/assets\/js\/(.*)pivoine-(.*)/i)) .map(unlink), ); const pJSCSS = rename( resolve(`./assets/css/pivoine-${vPrev}.css`), resolve(`./assets/css/pivoine-${vNext}.css`), ); await Promise.all([pUnlink, pFiles, pJSCSS]); await writeFile( "./assets/version.json", JSON.stringify({ version: vNext, prevVersion: vPrev }, null, 2), ); try { await access("../.scripts/version.js", fs.constants.X_OK); await exec("../.scripts/version.js"); } catch (e) { console.warn(e); } process.exit(0); } catch (e) { console.error(e); // eslint-disable-line process.exit(1); } })();