From 5a26426f23c7be4a9e1ae0815b15a242e78f2268 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sat, 17 Dec 2022 23:15:23 +1100 Subject: [PATCH] ci: Add CI check for Parse Server options definitions (#7955) --- .github/workflows/ci.yml | 21 +++++++++++++++++++++ ci/definitionsCheck.js | 39 +++++++++++++++++++++++++++++++++++++++ package-lock.json | 6 ++++++ package.json | 2 ++ 4 files changed, 68 insertions(+) create mode 100644 ci/definitionsCheck.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab4545a1..e9743974 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,6 +70,27 @@ jobs: - name: Install dependencies run: npm ci - run: npm run lint + check-definitions: + name: Check Definitions + timeout-minutes: 5 + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.NODE_VERSION }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - name: Cache Node.js modules + uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ matrix.NODE_VERSION }}-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node-${{ matrix.NODE_VERSION }}- + - name: Install dependencies + run: npm ci + - name: CI Definitions Check + run: npm run ci:definitionsCheck check-circular: name: Circular Dependencies timeout-minutes: 5 diff --git a/ci/definitionsCheck.js b/ci/definitionsCheck.js new file mode 100644 index 00000000..735d9c0b --- /dev/null +++ b/ci/definitionsCheck.js @@ -0,0 +1,39 @@ +const fs = require('fs').promises; +const { exec } = require('child_process'); +const core = require('@actions/core'); +const { nextTick } = require('process'); +const { AbortController } = require("node-abort-controller"); +(async () => { + const [currentDefinitions, currentDocs] = await Promise.all([ + fs.readFile('./src/Options/Definitions.js', 'utf8'), + fs.readFile('./src/Options/docs.js', 'utf8'), + ]); + exec('npm run definitions'); + const ac = new AbortController(); + const { signal } = ac; + const watcher = fs.watch('./src/Options/docs.js', {signal}); + let i = 0; + // eslint-disable-next-line + for await (const _ of watcher) { + i++; + if (i === 3) { + ac.abort(); + break; + } + } + await new Promise(resolve => nextTick(resolve)); + const [newDefinitions, newDocs] = await Promise.all([ + fs.readFile('./src/Options/Definitions.js', 'utf8'), + fs.readFile('./src/Options/docs.js', 'utf8'), + ]); + if (currentDefinitions !== newDefinitions || currentDocs !== newDocs) { + console.error( + '\x1b[31m%s\x1b[0m', + 'Definitions files cannot be updated manually. Please update src/Options/index.js then run `npm run definitions` to generate definitions.' + ); + core.error('Definitions files cannot be updated manually. Please update src/Options/index.js then run `npm run definitions` to generate definitions.'); + process.exit(1); + } else { + process.exit(0); + } +})(); diff --git a/package-lock.json b/package-lock.json index 25e28fb4..b3696399 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10272,6 +10272,12 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-abort-controller": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.0.1.tgz", + "integrity": "sha512-/ujIVxthRs+7q6hsdjHMaj8hRG9NuWmwrz+JdRwZ14jdFoKSkm+vDsCbF9PLpnSqjaWQJuTmVtcWHNLr+vrOFw==", + "dev": true + }, "node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", diff --git a/package.json b/package.json index 780da0e9..7ceb02a8 100644 --- a/package.json +++ b/package.json @@ -99,6 +99,7 @@ "mongodb-runner": "4.8.1", "mongodb-version-list": "1.0.0", "node-fetch": "3.2.10", + "node-abort-controller": "3.0.1", "nyc": "15.1.0", "prettier": "2.0.5", "semantic-release": "17.4.6", @@ -107,6 +108,7 @@ "scripts": { "ci:check": "node ./ci/ciCheck.js", "ci:checkNodeEngine": "node ./ci/nodeEngineCheck.js", + "ci:definitionsCheck": "node ./ci/definitionsCheck.js", "definitions": "node ./resources/buildConfigDefinitions.js && prettier --write 'src/Options/*.js'", "docs": "jsdoc -c ./jsdoc-conf.json", "lint": "flow && eslint --cache ./",