From 8d1b29b711dfda8c293e8f7dd3b31e74818501f0 Mon Sep 17 00:00:00 2001 From: lowlighter <22963968+lowlighter@users.noreply.github.com> Date: Fri, 6 Nov 2020 19:59:44 +0100 Subject: [PATCH] Update build and tests --- package-lock.json | 5 ++ package.json | 1 + src/plugins/index.mjs | 2 + src/templates/index.mjs | 2 + tests/metrics.mjs | 16 ++--- utils/build.mjs | 131 ++++++++++++++++++++++++++++++---------- 6 files changed, 114 insertions(+), 43 deletions(-) diff --git a/package-lock.json b/package-lock.json index ed962321..31289215 100644 --- a/package-lock.json +++ b/package-lock.json @@ -405,6 +405,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", diff --git a/package.json b/package.json index aa61679a..60d0d61d 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@octokit/graphql": "^4.5.7", "@octokit/rest": "^18.0.9", "axios": "^0.21.0", + "colors": "^1.4.0", "compression": "^1.7.4", "ejs": "^3.1.5", "express": "^4.17.1", diff --git a/src/plugins/index.mjs b/src/plugins/index.mjs index 03dcbb6b..534b6b74 100644 --- a/src/plugins/index.mjs +++ b/src/plugins/index.mjs @@ -1,3 +1,5 @@ +/* This file is generated automatically with "npm run build" */ + //Imports import followup from "./followup/index.mjs" import habits from "./habits/index.mjs" diff --git a/src/templates/index.mjs b/src/templates/index.mjs index b455f820..d2d630b3 100644 --- a/src/templates/index.mjs +++ b/src/templates/index.mjs @@ -1,3 +1,5 @@ +/* This file is generated automatically with "npm run build" */ + //Imports import classic from "./classic/template.mjs" import terminal from "./terminal/template.mjs" diff --git a/tests/metrics.mjs b/tests/metrics.mjs index 27a7ab13..ce052c1c 100644 --- a/tests/metrics.mjs +++ b/tests/metrics.mjs @@ -1,11 +1,8 @@ //Imports - import path from "path" - import fs from "fs" import build from "../utils/build.mjs" - import url from "url" + import colors from "colors" //Initialization - const __dirname = path.join(path.dirname(url.fileURLToPath(import.meta.url)), "..", "action") process.on("unhandledRejection", error => { throw error }) /** Test function */ @@ -16,17 +13,14 @@ /** Build test */ test.build = async function () { - //Ensure that action has been rebuild - console.log("### Checking that code has been rebuild") - const action = `${await fs.promises.readFile(`${__dirname}/dist/index.js`)}` - const code = await build() - if (action !== code) - throw new Error(`GitHub Action has not been rebuild. Run "npm run build" to solve this issue`) + //Ensure that code has been rebuild + console.log("TEST : build".cyan) + await build({actions:["check"]}) } //Main if (/metrics.mjs/.test(process.argv[1])) { //Test await test() - console.log("Test success !") + console.log("Test success !".green) } diff --git a/utils/build.mjs b/utils/build.mjs index d8285bd4..26ab404c 100644 --- a/utils/build.mjs +++ b/utils/build.mjs @@ -3,49 +3,116 @@ import path from "path" import url from "url" import ncc from "@vercel/ncc" + import colors from "colors" //Initialization - const __dirname = path.join(path.dirname(url.fileURLToPath(import.meta.url)), "..", "action") + const __dirname = path.join(path.dirname(url.fileURLToPath(import.meta.url)), "..") + const __action = path.join(__dirname, "action") + const __src = path.join(__dirname, "src") + const __plugins = path.join(__src, "plugins") + const __templates = path.join(__src, "templates") process.on("unhandledRejection", error => { throw error }) /** Build function */ - export default async function build() { - //Build code - let {code} = await ncc(`${__dirname}/index.mjs`, { - minify:true, - sourceMap:false, - sourceMapRegister:false, - }) + export default async function build({actions = ["build"]} = {}) { + //Initialization + const errors = [] + + //Indexes + for (const {name, source, entry} of [{name:"plugins", source:__plugins, entry:"index.mjs"}, {name:"templates", source:__templates, entry:"template.mjs"}]) { + + //Build + const files = (await fs.promises.readdir(source)).filter(name => !/.*[.]mjs$/.test(name)).sort() + const code = [ + `/* This file is generated automatically with "npm run build" */`, + ``, + `//Imports`, + ...files.map(name => ` import ${name} from "./${name}/${entry}"`), + ``, + `//Exports`, + ` export default {`, + ...files.map(name => ` ${name},`), + ` }` + ].join("\n") + console.log(`Generated index for ${name}`.grey) + + //Save build + if (actions.includes("build")) { + fs.promises.writeFile(path.join(source, "index.mjs"), code) + console.log(`Generated index for ${name} saved to ${path.join(source, "index.mjs")}`.green) + } + + //Check build + if (actions.includes("check")) { + const status = `${await fs.promises.readFile(path.join(source, "index.mjs"))}` === code + if (status) + console.log(`Index ${name} is up-to-date`.grey) + else { + console.log(`Index ${name} is outdated`.red) + errors.push(`Index ${name} is outdated, run "npm run build" to fix it`) + } + } - //Perform assets includes - const assets = {} - const templates = path.join(__dirname, "..", "src/templates") - for (const name of await fs.promises.readdir(templates)) { - if (/.*[.]mjs$/.test(name)) - continue - console.log(`Including template ${name}`) - const files = [ - `${templates}/${name}/query.graphql`, - `${templates}/${name}/image.svg`, - `${templates}/${name}/style.css`, - `${templates}/${name}/fonts.css`, - ] - const [query, image, style, fonts] = await Promise.all(files.map(async file => `${await fs.promises.readFile(path.resolve(file))}`)) - assets[name] = {query, image, style, fonts} } - code = code.replace(/<#assets>/g, Buffer.from(JSON.stringify(assets)).toString("base64")) - //Perform version include - const version = JSON.parse(await fs.promises.readFile(path.join(__dirname, "..", "package.json"))).version - code = code.replace(/<#version>/g, version) + //Action + { + //Build + let {code} = await ncc(`${__action}/index.mjs`, { + minify:true, + sourceMap:false, + sourceMapRegister:false, + }) + console.log(`Generated action`.grey) - //Code - return code + //Perform assets includes + const assets = {} + const templates = (await fs.promises.readdir(__templates)).filter(name => !/.*[.]mjs$/.test(name)).sort() + for (const name of templates) { + const files = [ + `${__templates}/${name}/query.graphql`, + `${__templates}/${name}/image.svg`, + `${__templates}/${name}/style.css`, + `${__templates}/${name}/fonts.css`, + ] + const [query, image, style, fonts] = await Promise.all(files.map(async file => `${await fs.promises.readFile(path.resolve(file))}`)) + assets[name] = {query, image, style, fonts} + console.log(`Prepared template ${name}`.grey) + } + code = code.replace(/<#assets>/g, Buffer.from(JSON.stringify(assets)).toString("base64")) + console.log(`Included ${templates.length} templates to generated action`.grey) + + //Perform version include + const version = JSON.parse(await fs.promises.readFile(path.join(__dirname, "package.json"))).version + code = code.replace(/<#version>/g, version) + console.log(`Included version number (${version}) to generated action`.grey) + + //Save build + if (actions.includes("build")) { + fs.promises.writeFile(path.join(__action, "dist/index.js"), code) + console.log(`Generated action saved to ${path.join(__action, "dist/index.js")}`.green) + } + + //Check build + if (actions.includes("check")) { + const status = `${await fs.promises.readFile(path.join(__action, "dist/index.js"))}` === code + if (status) + console.log(`Action is up-to-date`.grey) + else { + console.log(`Action is outdated`.red) + errors.push(`Action is outdated, run "npm run build" to fix it`) + } + } + } + + // + if (errors.length) + throw new Error(`${errors.length} errors occured :\n${errors.map(error => ` - ${error}`).join("\n")}`) } //Main if (/build.mjs/.test(process.argv[1])) { - //Save build - await fs.promises.writeFile(`${__dirname}/dist/index.js`, await build()) - console.log("Build success !") + //Build + await build() + console.log("Build success !".green) } \ No newline at end of file