Skip to content

Commit

Permalink
Update build and tests
Browse files Browse the repository at this point in the history
  • Loading branch information
lowlighter committed Nov 6, 2020
1 parent 21f2fa7 commit 8d1b29b
Show file tree
Hide file tree
Showing 6 changed files with 115 additions and 44 deletions.
5 changes: 5 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
2 changes: 2 additions & 0 deletions src/plugins/index.mjs
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
2 changes: 2 additions & 0 deletions src/templates/index.mjs
Original file line number Diff line number Diff line change
@@ -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"
Expand Down
16 changes: 5 additions & 11 deletions tests/metrics.mjs
Original file line number Diff line number Diff line change
@@ -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 */
Expand All @@ -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)
}
133 changes: 100 additions & 33 deletions utils/build.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
})

//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}
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`)
}
}

}
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)

//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`)
}
}
}

//Code
return code
//
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)
}

0 comments on commit 8d1b29b

Please sign in to comment.