Add linting for README

pull/51/head
Kyle Carberry 2 years ago
parent 5aac3fe9f9
commit 68ef2970b8

Binary file not shown.

@ -1,13 +1,19 @@
import { readFile, readdir, stat } from "fs/promises"; import { readFile, readdir, stat } from "fs/promises";
import * as path from "path"; import * as path from "path";
import * as marked from "marked"; import * as marked from "marked";
import grayMatter from "gray-matter";
const files = await readdir(".", { withFileTypes: true }); const files = await readdir(".", { withFileTypes: true });
const dirs = files.filter( const dirs = files.filter(
(f) => f.isDirectory() && !f.name.startsWith(".") && f.name !== "node_modules" (f) => f.isDirectory() && !f.name.startsWith(".") && f.name !== "node_modules"
); );
let badExit = false let badExit = false;
const error = (...data: any[]) => {
console.error(...data);
badExit = true;
}
// Ensures that each README has the proper format. // Ensures that each README has the proper format.
// Exits with 0 if all is good! // Exits with 0 if all is good!
@ -20,6 +26,34 @@ for (const dir of dirs) {
throw new Error(`Missing README.md in ${dir.name}`); throw new Error(`Missing README.md in ${dir.name}`);
} }
const content = await readFile(readme, "utf8"); const content = await readFile(readme, "utf8");
const matter = grayMatter(content);
const data = matter.data as {
display_name?: string;
description?: string;
icon?: string;
maintainer_github?: string;
partner_github?: string;
verified?: boolean;
tags?: string[];
};
if (!data.display_name) {
error(dir.name, "missing display_name");
}
if (!data.description) {
error(dir.name, "missing description");
}
if (!data.icon) {
error(dir.name, "missing icon");
}
if (!data.maintainer_github) {
error(dir.name, "missing maintainer_github");
}
try {
await stat(path.join(".", dir.name, data.icon));
} catch (ex) {
error(dir.name, "icon does not exist", data.icon);
}
const tokens = marked.lexer(content); const tokens = marked.lexer(content);
// Ensure there is an h1 and some text, then a code block // Ensure there is an h1 and some text, then a code block
@ -45,17 +79,17 @@ for (const dir of dirs) {
} }
} }
if (!h1) { if (!h1) {
console.error(dir.name, "missing h1") error(dir.name, "missing h1");
} }
if (!paragraph) { if (!paragraph) {
console.error(dir.name, "missing paragraph after h1") error(dir.name, "missing paragraph after h1");
} }
if (!code) { if (!code) {
console.error(dir.name, "missing example code block after paragraph") error(dir.name, "missing example code block after paragraph");
} }
badExit = true badExit = true;
} }
if (badExit) { if (badExit) {
process.exit(1) process.exit(1);
} }

@ -8,6 +8,7 @@
}, },
"devDependencies": { "devDependencies": {
"bun-types": "^1.0.3", "bun-types": "^1.0.3",
"gray-matter": "^4.0.3",
"marked": "^9.0.3" "marked": "^9.0.3"
}, },
"peerDependencies": { "peerDependencies": {

@ -2,6 +2,7 @@
"compilerOptions": { "compilerOptions": {
"target": "esnext", "target": "esnext",
"module": "esnext", "module": "esnext",
"allowSyntheticDefaultImports": true,
"moduleResolution": "nodenext", "moduleResolution": "nodenext",
"types": ["bun-types"] "types": ["bun-types"]
} }

Loading…
Cancel
Save