feat(ci): Ensure guide directory structure in CI

This commit is contained in:
Bouncey
2018-10-19 10:59:14 +01:00
committed by Stuart Taylor
parent e2157d0eea
commit 564012a7eb
3 changed files with 206 additions and 0 deletions

139
package-lock.json generated
View File

@ -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",

View File

@ -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"
}
}

View File

@ -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);
});