From 564012a7ebb3555ae65e3d17d5dc52585fc77545 Mon Sep 17 00:00:00 2001 From: Bouncey Date: Fri, 19 Oct 2018 10:59:14 +0100 Subject: [PATCH] feat(ci): Ensure guide directory structure in CI --- package-lock.json | 139 +++++++++++++++++++ package.json | 2 + tools/scripts/ci/ensure-guide-page-naming.js | 65 +++++++++ 3 files changed, 206 insertions(+) create mode 100644 tools/scripts/ci/ensure-guide-page-naming.js diff --git a/package-lock.json b/package-lock.json index d2ceac1a2d..6ca32cd98c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2752,6 +2752,12 @@ "stream-shift": "^1.0.0" } }, + "each-limit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/each-limit/-/each-limit-1.0.0.tgz", + "integrity": "sha1-OAFACDNnqK9kKZvKwV/dWxqXcZY=", + "dev": true + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -3123,6 +3129,12 @@ "through": "^2.3.8" } }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, "exec-sh": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", @@ -6727,6 +6739,18 @@ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, + "lodash.isobject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz", + "integrity": "sha1-PI+41bW/S/kK4G4U8qUwpO2TXh0=", + "dev": true + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha1-I+89lTVWUgOmbO/VuDD4SJEa+0g=", + "dev": true + }, "lodash.sortby": { "version": "4.7.0", "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", @@ -8332,6 +8356,108 @@ "once": "^1.3.0" } }, + "readdirp-walk": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/readdirp-walk/-/readdirp-walk-1.6.0.tgz", + "integrity": "sha1-B1ZfV6uTqWfW3mRPRmPAE1b1oLo=", + "dev": true, + "requires": { + "eventemitter3": "^1.1.1", + "micromatch": "^2.3.5", + "walk-filtered": "^0.8.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + } + } + }, "realpath-native": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.2.tgz", @@ -9800,6 +9926,19 @@ "browser-process-hrtime": "^0.1.2" } }, + "walk-filtered": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/walk-filtered/-/walk-filtered-0.8.0.tgz", + "integrity": "sha1-RsMaJG7HTO9QwOtLSxVjvHYaAKU=", + "dev": true, + "requires": { + "each-limit": "^1.0.0", + "graceful-fs": "^4.1.2", + "lodash.isobject": "^3.0.2", + "lodash.isundefined": "^3.0.1", + "object-assign": "^4.0.1" + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", diff --git a/package.json b/package.json index ab92047330..e0cc5c179f 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "test-ci": "npm test", "test:client": "cd ./client && npm test && cd ../", "test:curriculum": "echo 'Warning: TODO - Define Testing.'", + "test:guide:directorys": "node ./tools/scripts/ci/ensure-guide-page-naming.js", "test:server": "echo 'Warning: TODO - Define Testing.'", "test:tools": "jest ./tools", "start-develop": "node ./tools/scripts/start-develop.js" @@ -25,6 +26,7 @@ "jest": "^23.6.0", "lerna": "^3.4.0", "npm-run-all": "^4.1.3", + "readdirp-walk": "^1.6.0", "tree-kill": "^1.2.0" } } diff --git a/tools/scripts/ci/ensure-guide-page-naming.js b/tools/scripts/ci/ensure-guide-page-naming.js new file mode 100644 index 0000000000..e5da41d710 --- /dev/null +++ b/tools/scripts/ci/ensure-guide-page-naming.js @@ -0,0 +1,65 @@ +const path = require('path'); +const fs = require('fs'); +const readdirp = require('readdirp-walk'); + +const guideRoot = path.resolve(__dirname, '../../../guide'); + +const allowedLangDirNames = [ + 'arabic', + 'chinese', + 'english', + 'portuguese', + 'russian', + 'spanish' +]; + +function checkDirName(dirName, fullPath) { + if (dirName.replace(/(\s|\_)/, '') !== dirName) { + const newDirName = dirName.replace(/\s/g, '-'); + fs.renameSync(fullPath, fullPath.replace(dirName, newDirName)); + // throw new Error( + // `Invalid character found in a folder named '${dirName}', please use '-' for spaces + // ${fullPath} + // ` + // ); + return; + } + if (dirName.toLowerCase() !== dirName) { + const newPath = fullPath.replace(dirName, dirName.toLowerCase()); + console.log(`renaming ${dirName} to ${dirName.toLowerCase()}`); + fs.renameSync(fullPath, newPath); + } +} + +function checkFileName(fileName, fullPath) { + if (fileName !== 'index.md') { + throw new Error( + `${fileName} is not a valid file name, please use 'index.md' + ${fullPath} + ` + ); + } +} + +function checkFile(file) { + const { stat, depth, name, fullPath } = file; + if (depth === 1) { + if (stat.isFile()) { + throw new Error(`${name} is not valid in the ${guideRoot} directory`); + } + if (!allowedLangDirNames.includes(name)) { + throw new Error(`${name} should not be in the ${guideRoot} directory`); + } + } + if (stat.isDirectory()) { + return checkDirName(name, fullPath); + } + return checkFileName(name, fullPath); +} + +readdirp({ root: guideRoot }) + .on('data', checkFile) + .on('end', () => { + /* eslint-disable no-process-exit */ + process.exit(0); + });