diff --git a/bun.lockb b/bun.lockb index 8a29fd7..0d30fe9 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/lint.ts b/lint.ts index 235cf35..76a52af 100644 --- a/lint.ts +++ b/lint.ts @@ -1,13 +1,19 @@ import { readFile, readdir, stat } from "fs/promises"; import * as path from "path"; import * as marked from "marked"; +import grayMatter from "gray-matter"; const files = await readdir(".", { withFileTypes: true }); const dirs = files.filter( (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. // 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}`); } 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); // Ensure there is an h1 and some text, then a code block @@ -45,17 +79,17 @@ for (const dir of dirs) { } } if (!h1) { - console.error(dir.name, "missing h1") + error(dir.name, "missing h1"); } if (!paragraph) { - console.error(dir.name, "missing paragraph after h1") + error(dir.name, "missing paragraph after h1"); } 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) { - process.exit(1) + process.exit(1); } diff --git a/package.json b/package.json index 9dacc26..c9d3a81 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ }, "devDependencies": { "bun-types": "^1.0.3", + "gray-matter": "^4.0.3", "marked": "^9.0.3" }, "peerDependencies": { diff --git a/tsconfig.json b/tsconfig.json index dfa1fff..e7b89cd 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,6 +2,7 @@ "compilerOptions": { "target": "esnext", "module": "esnext", + "allowSyntheticDefaultImports": true, "moduleResolution": "nodenext", "types": ["bun-types"] }