Mocked tests and remove ncc compilation (#32)

* Mocked tests and remove ncc compilation
* Update workflow.yml
* Update Dockerfile
This commit is contained in:
Simon Lecoq
2020-12-30 00:49:01 +01:00
committed by GitHub
parent 03bede5482
commit b4d0e85148
22 changed files with 6534 additions and 1263 deletions

View File

@@ -2,20 +2,13 @@
import fs from "fs"
import path from "path"
import url from "url"
import ncc from "@vercel/ncc"
import minify from "babel-minify"
import colors from "colors"
import ejs from "ejs"
//Initialization
const __dirname = path.join(path.dirname(url.fileURLToPath(import.meta.url)), "..")
const __action = path.join(__dirname, "action")
const __workflows = path.join(__dirname, ".github/workflows")
const __utils = path.join(__dirname, "utils")
const __src = path.join(__dirname, "src")
const __plugins = path.join(__src, "plugins")
const __templates = path.join(__src, "templates")
const __queries = path.join(__src, "queries")
process.on("unhandledRejection", error => { throw error })
colors.enable()
@@ -61,116 +54,6 @@
}
//Workflow
{
//Build
const code = await ejs.renderFile(path.join(__utils, "workflow.yml"), {
releases:["master"],
templates:(await fs.promises.readdir(__templates)).filter(name => !/.*[.]mjs$/.test(name)).filter(name => !["repository"].includes(name)).sort(),
testcase(context = {}) {
return [`with:`, ...Object.entries({
token:"${{ secrets.METRICS_TOKEN }}",
dryrun:true,
repositories:0,
template:"${{ matrix.template }}",
base:"",
plugins_errors_fatal:true,
...context
}).map(([key, value]) => `${" ".repeat(5)}${key}: ${
typeof value === "boolean" ? (value ? "yes" : "no") :
typeof value === "string" ? (!value ? `""` : value) :
value
}`)].join("\n")
},
}, {async:true})
console.log(`Generated workflow`.grey)
//Save build
if (actions.includes("build")) {
fs.promises.writeFile(path.join(__workflows, "workflow.yml"), code)
console.log(`Generated workflow saved to ${path.join(__workflows, "dist/index.js")}`.green)
}
//Check build
if (actions.includes("check")) {
const status = `${await fs.promises.readFile(path.join(__workflows, "workflow.yml"))}` === code
if (status)
console.log(`Workflow is up-to-date`.grey)
else {
console.log(`Workflow is outdated`.red)
errors.push(`Workflow is outdated, run "npm run build" to fix it`)
}
}
}
//Action
{
//Build
let {code} = await ncc(`${__action}/index.mjs`, {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}/image.svg`,
`${__templates}/${name}/style.css`,
`${__templates}/${name}/fonts.css`,
].map(file => fs.existsSync(path.resolve(file)) ? file : file.replace(`${__templates}/${name}/`, `${__templates}/classic/`))
const [image, style, fonts] = await Promise.all(files.map(async file => `${await fs.promises.readFile(path.resolve(file))}`))
assets[name] = {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 queries includes
{
const assets = {}
const queries = (await fs.promises.readdir(__queries)).sort()
for (const query of queries) {
const name = query.replace(/[.]graphql$/, "")
assets[`_${name}`] = `${await fs.promises.readFile(path.resolve(`${__queries}/${query}`))}`
console.log(`Prepared query ${name}`.grey)
}
code = code.replace(/<#queries>/g, Buffer.from(JSON.stringify(assets)).toString("base64"))
console.log(`Included ${queries.length} queries 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)
}
//Minify
code = minify(code).code
console.log(`Minified code`.grey)
if (!code)
throw new Error(`Failed to minify code`)
//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`)
}
}
}
//Throw on errors
if (errors.length)
throw new Error(`${errors.length} errors occured :\n${errors.map(error => ` - ${error}`).join("\n")}`)

View File

@@ -1,167 +0,0 @@
name: Build
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup
uses: actions/setup-node@v1
with:
node-version: 15.x
- name: Install
run: npm ci
- name: Build
run: npm run build
- name: Test
run: npm test
analyze:
runs-on: ubuntu-latest
needs: <%- JSON.stringify(releases.map(release => `test-${release}`)) %>
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup
uses: github/codeql-action/init@v1
with:
languages: javascript
config-file: ./.github/config/codeql.yml
- name: Analyze
uses: github/codeql-action/analyze@v1
# Tests cases below are auto generated through `npm run build`
# Edit utils/workflow.yml instead if you need to update workflow
<% for (const release of releases) { %>
test-<%- release %>:
needs: build
runs-on: ubuntu-latest
strategy:
matrix:
template: <%- JSON.stringify(templates) %>
steps:
- name: ${{ matrix.template }} > Base
uses: lowlighter/metrics@<%- release %>
<%- testcase({
base: "header, activity, community, repositories, metadata",
}) %>
- name: ${{ matrix.template }} > Plugin > PageSpeed
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_pagespeed: true,
plugin_pagespeed_token: "${{ secrets.PAGESPEED_TOKEN }}",
plugin_pagespeed_detailed: true,
plugin_pagespeed_screenshot: true,
}) %>
- name: ${{ matrix.template }} > Plugin > Music (playlist - apple)
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_music: true,
plugin_music_playlist: "${{ secrets.MUSIC_PLAYLIST_APPLE }}",
}) %>
- name: ${{ matrix.template }} > Plugin > Music (playlist - spotify)
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_music: true,
plugin_music_playlist: "${{ secrets.MUSIC_PLAYLIST_SPOTIFY }}",
}) %>
- name: ${{ matrix.template }} > Plugin > Music (recent - spotify)
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_music: true,
plugin_music_provider: "spotify",
plugin_music_token: "${{ secrets.SPOTIFY_TOKENS }}",
}) %>
- name: ${{ matrix.template }} > Plugin > Posts (dev.to)
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_posts: true,
plugin_posts_source: "dev.to",
}) %>
- name: ${{ matrix.template }} > Plugin > Isocalendar
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_isocalendar: true,
plugin_isocalendar_duration: "full-year",
}) %>
- name: ${{ matrix.template }} > Plugin > Habits
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_habits: true,
plugin_habits_from: 5,
plugin_habits_charts: true,
}) %>
- name: ${{ matrix.template }} > Plugin > Languages
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_languages: true,
}) %>
- name: ${{ matrix.template }} > Plugin > Follow-up
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_followup: true,
}) %>
- name: ${{ matrix.template }} > Plugin > Lines and Traffic
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_lines: true,
plugin_traffic: true,
}) %>
- name: ${{ matrix.template }} > Plugin > Gists
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_gists: true,
}) %>
- name: ${{ matrix.template }} > Plugin > Topics (starred)
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_topics: true,
plugin_topics_mode: "starred",
plugin_topics_sort: "random",
}) %>
- name: ${{ matrix.template }} > Plugin > Topics (mastered)
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_topics: true,
plugin_topics_mode: "mastered",
plugin_topics_sort: "stars",
}) %>
- name: ${{ matrix.template }} > Plugin > Projects
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_projects: true,
plugin_projects_repositories: "lowlighter/metrics/projects/1",
plugin_projects_limit: 2,
}) %>
- name: ${{ matrix.template }} > Plugin > Tweets
uses: lowlighter/metrics@<%- release %>
<%- testcase({
plugin_tweets: true,
plugin_tweets_limit: 2,
plugin_tweets_token: "${{ secrets.TWITTER_TOKEN }}",
}) %>
<% } -%>