@ 260924.1

240711.1 · 19600c0fe986a3d6649758627b4f414fa6286ccc

tools: add a linter for markdown lists (#892)

reading declarations

.github/workflows/linters.yml

new file mode 100644@@ -0,0 +1,40 @@+name: Linters++on:+  pull_request:+    types: [opened, synchronize, reopened, ready_for_review]+    paths:+      - README.md+      - Moderation-Policy.md+      - .github/workflows/linters.yml+  push:+    branches:+      - main+    paths:+      - README.md+      - Moderation-Policy.md+      - .github/workflows/linters.yml++concurrency:+  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}+  cancel-in-progress: false++permissions:+  contents: read++jobs:+  lint-md-lists:+    runs-on: ubuntu-latest+    strategy:+      fail-fast: false+      matrix:+        file:+          - README.md+          - Moderation-Policy.md+    steps:+      - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332  # v4.1.7+        with:+          persist-credentials: false+      - run: tools/lint-readme-lists.mjs "$FILE"+        env:+          FILE: ${{ matrix.file }}

Moderation-Policy.md

@@ -294,6 +294,7 @@ remove resigning team member from respective permissions and private access. <!-- referenced from the CoC page --> <a id="current-members"></a> ### Current Members of Moderation Team+ * [aduh95](https://github.com/aduh95) - **Antoine du Hamel** <<duhamelantoine1995@gmail.com>> (he/him) * [benjamingr](https://github.com/benjamingr) -@@ -309,16 +310,17 @@ remove resigning team member from respective permissions and private access.   ### Admins for Node.js Slack community+ * [alextes](https://github.com/alextes) - **Alexander Tesfamichael** &lt;alex.tesfamichael@gmail.com&gt; * [aredridel](https://github.com/aredridel) - **Aria Stewart** &lt;aredridel@dinhe.net&gt;-* [ljharb](https://github.com/ljharb) --**Jordan Harband** &lt;ljharb@gmail.com&gt;-* [jxm262](https://github.com/jxm262) --**Justin Maat** &lt;jxm262@gmail.com&gt; * [hackygolucky](https://github.com/hackygolucky) - **Tracy Hinds** &lt;tracyhinds@gmail.com&gt;+* [jxm262](https://github.com/jxm262) -+**Justin Maat** &lt;jxm262@gmail.com&gt;+* [ljharb](https://github.com/ljharb) -+**Jordan Harband** &lt;ljharb@gmail.com&gt;  ## Escalation of Issues 

README.md

@@ -29,8 +29,8 @@ action requiring consensus and voting will abide by the TSC process for that.  ### Contacts for assistance -- [@mhdawson](https://github.com/mhdawson) - **Michael Dawson**, TSC Chair - [@mcollina](https://github.com/mcollina) - **Matteo Collina**, TSC Vice Chair+- [@mhdawson](https://github.com/mhdawson) - **Michael Dawson**, TSC Chair  ### Admin members 

tools/lint-readme-lists.mjs

new file mode 100755@@ -0,0 +1,29 @@+#!/usr/bin/env node++// Validates the list in the markdown file passed as CLI argument are in the correct order.++import { open } from 'node:fs/promises';++const [,,markdownFile] = process.argv;++const readme = await open(markdownFile, 'r');++let currentList = null;+let previousGithubHandle;+let lineNumber = 0;++for await (const line of readme.readLines()) {+  lineNumber++;+  if (line.startsWith('##')) {+    currentList = line.slice(line.indexOf(' '));+    previousGithubHandle = null;+  } else if (currentList && (line.startsWith('- [') || line.startsWith('* ['))) {+    const currentGithubHandle = line.slice(3, line.indexOf(']')).toLowerCase();+    if (previousGithubHandle && previousGithubHandle >= currentGithubHandle) {+      throw new Error(`${currentGithubHandle} should be listed before ${previousGithubHandle} in the ${currentList} list (${markdownFile}:${lineNumber})`);+    }++    previousGithubHandle = currentGithubHandle;+  }+}+