Refactor the scripts to work as advertised

- Correct docs generation to always fetch its dependency
- Don't try to close a handle that's already been closed by other methods
- Allow the release script to actually be testable.
This commit is contained in:
Isiah Meadows 2019-08-17 15:22:35 -04:00
parent 30ad45caa1
commit 22e6d37a26
12 changed files with 483 additions and 241 deletions

View file

@ -1,7 +1,7 @@
#!/usr/bin/env node
"use strict"
const {promises} = require("fs")
const {promises: fs} = require("fs")
const path = require("path")
const {Glob} = require("glob")
const marked = require("marked")
@ -10,8 +10,6 @@ const babelParser = require("@babel/parser")
// Peer dependency on `request`
const request = require("request-promise-native")
require("./_command").exec(module, () => lint())
// lint rules
class LintRenderer extends marked.Renderer {
constructor(file) {
@ -61,7 +59,8 @@ class LintRenderer extends marked.Renderer {
}, (e) => {
if (e.statusCode === 404) {
this._emit(`broken external link: ${href}`)
} else {
}
else {
if (
e.error.code === "ERR_TLS_CERT_ALTNAME_INVALID" &&
href.startsWith("https://")
@ -75,11 +74,12 @@ class LintRenderer extends marked.Renderer {
httpError(e)
}
}))
} else {
}
else {
const exec = (/^([^#?]*\.md)(?:$|\?|#)/).exec(href)
if (exec != null) {
const resolved = path.resolve(this._dir, exec[1])
this._awaiting.push(promises.access(resolved).catch(() => {
this._awaiting.push(fs.access(resolved).catch(() => {
this._emit(`broken internal link: ${href}`)
}))
}
@ -100,7 +100,8 @@ class LintRenderer extends marked.Renderer {
allowUndeclaredExports: true,
plugins: ["dynamicImport"],
})
} catch (e) {
}
catch (e) {
this._error = e
}
}
@ -127,7 +128,8 @@ class LintRenderer extends marked.Renderer {
"Code block possibly missing `json` language tag",
this._block(),
)
} catch {
}
catch (_) {
// ignore
}
}
@ -157,7 +159,16 @@ class LintRenderer extends marked.Renderer {
}
}
function lint() {
exports.lintOne = lintOne
async function lintOne(file) {
const contents = await fs.readFile(file, "utf-8")
const renderer = new LintRenderer(file)
marked(contents, {renderer})
return Promise.all(renderer._awaiting)
}
exports.lintAll = lintAll
function lintAll() {
return new Promise((resolve, reject) => {
const glob = new Glob(path.resolve(__dirname, "../docs/**/*.md"), {
ignore: [
@ -170,15 +181,29 @@ function lint() {
const awaiting = []
glob.on("match", (file) => {
awaiting.push(promises.readFile(file, "utf-8").then((contents) => {
const renderer = new LintRenderer(file)
marked(contents, {renderer})
return Promise.all(renderer._awaiting)
}))
awaiting.push(lintOne(file))
})
glob.on("error", reject)
glob.on("end", () => resolve(Promise.all(awaiting)))
})
}
module.exports = lint
/* eslint-disable global-require */
if (require.main === module) {
require("./_command")({
exec: lintAll,
watch() {
require("chokidar")
.watch(path.resolve(__dirname, "../docs/**/*.md"), {
ignore: [
"**/change-log.md",
"**/migration-*.md",
"**/node_modules/**",
],
})
.on("add", lintOne)
.on("change", lintOne)
},
})
}