Skip to content

Commit

Permalink
feat: add linting (#51)
Browse files Browse the repository at this point in the history
Co-authored-by: Muhammad Atif Ali <[email protected]>
  • Loading branch information
kylecarbs and matifali authored Sep 27, 2023
1 parent e066fb7 commit 0516c1b
Show file tree
Hide file tree
Showing 6 changed files with 110 additions and 6 deletions.
7 changes: 5 additions & 2 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,14 @@ jobs:
with:
bun-version: latest
- run: bun test
fmt:
pretty:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: oven-sh/setup-bun@v1
with:
bun-version: latest
- run: bun fmt:ci
- name: Format
run: bun fmt:ci
- name: Lint
run: bun install && bun lint
4 changes: 2 additions & 2 deletions .sample/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,14 @@ tags: [helper]

<!-- Describes what this module does -->

<!-- Add a screencast or screenshot here put them in .images directory -->

```hcl
module "MODULE_NAME" {
source = "https://registry.coder.com/modules/MODULE_NAME"
}
```

<!-- Add a screencast or screenshot here put them in .images directory -->

## Examples

### Example 1
Expand Down
Binary file modified bun.lockb
Binary file not shown.
96 changes: 96 additions & 0 deletions lint.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
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;

// error reports an error to the console and sets badExit to true
// so that the process will exit with a non-zero exit code.
const error = (...data: any[]) => {
console.error(...data);
badExit = true;
}

// Ensures that each README has the proper format.
// Exits with 0 if all is good!
for (const dir of dirs) {
const readme = path.join(dir.name, "README.md");
// Ensure exists
try {
await stat(readme);
} catch (ex) {
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

let h1 = false;
let code = false;
let paragraph = false;

for (const token of tokens) {
if (token.type === "heading" && token.depth === 1) {
h1 = true;
continue;
}
if (h1 && token.type === "heading") {
break;
}
if (token.type === "paragraph") {
paragraph = true;
continue;
}
if (token.type === "code") {
code = true;
continue;
}
}
if (!h1) {
error(dir.name, "missing h1");
}
if (!paragraph) {
error(dir.name, "missing paragraph after h1");
}
if (!code) {
error(dir.name, "missing example code block after paragraph");
}
}

if (badExit) {
process.exit(1);
}
7 changes: 5 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@
"scripts": {
"test": "bun test",
"fmt": "bun x prettier -w **/*.ts **/*.md *.md && terraform fmt **/*.tf",
"fmt:ci": "bun x prettier --check **/*.ts **/*.md *.md && terraform fmt -check **/*.tf"
"fmt:ci": "bun x prettier --check **/*.ts **/*.md *.md && terraform fmt -check **/*.tf",
"lint": "bun run lint.ts"
},
"devDependencies": {
"bun-types": "^1.0.3"
"bun-types": "^1.0.3",
"gray-matter": "^4.0.3",
"marked": "^9.0.3"
},
"peerDependencies": {
"typescript": "^5.0.0"
Expand Down
2 changes: 2 additions & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"allowSyntheticDefaultImports": true,
"moduleResolution": "nodenext",
"types": ["bun-types"]
}
}

0 comments on commit 0516c1b

Please sign in to comment.