* docs(docs): add map checker script * feat(docs): map checker discards shared files * docs(core): fix orphan files and documentation links * feat(repo): add documentation map checks before push
94 lines
2.5 KiB
TypeScript
94 lines
2.5 KiB
TypeScript
import * as chalk from 'chalk';
|
||
import * as fs from 'fs';
|
||
import * as shell from 'shelljs';
|
||
|
||
const { green, red } = chalk.default;
|
||
const basePath = 'docs';
|
||
const sharedFilesPattern = 'shared/cli';
|
||
|
||
const readmePathList: string[] = shell
|
||
.ls(`${basePath}/**/*.md`)
|
||
.map((path: string) => path.split(basePath)[1])
|
||
.map((path: string) => path.slice(1, -3)) // Removing first `/` and `.md`
|
||
.filter((path: string) => !path.startsWith(sharedFilesPattern));
|
||
|
||
function pathExtractor(
|
||
pathList: string[] = [],
|
||
item: any,
|
||
currentPath: string = ''
|
||
): string[] {
|
||
currentPath = currentPath ? [currentPath, item.id].join('/') : item.id;
|
||
if (item.itemList) {
|
||
return item.itemList
|
||
.map((i: any) => pathExtractor(pathList, i, currentPath))
|
||
.flat();
|
||
}
|
||
if (item.file) {
|
||
pathList.push(item.file);
|
||
return pathList;
|
||
}
|
||
pathList.push(currentPath);
|
||
return pathList;
|
||
}
|
||
|
||
const mapPathList: string[] = JSON.parse(
|
||
fs.readFileSync(`${basePath}/map.json`, { encoding: 'utf8' })
|
||
)
|
||
.map((file: any) => pathExtractor([], file, ''))
|
||
.flat()
|
||
.filter(
|
||
// Removing duplicates
|
||
(item: string, index: number, array: string[]) =>
|
||
array.indexOf(item) === index
|
||
)
|
||
.filter((item: string) => item.split('/').length > 1); // Removing "category" paths (not linked to a file)
|
||
|
||
const readmeMissList = readmePathList.filter((x) => !mapPathList.includes(x));
|
||
const mapMissList = mapPathList.filter((x) => !readmePathList.includes(x));
|
||
|
||
let scriptError = false;
|
||
|
||
if (!!readmeMissList.length) {
|
||
console.error(
|
||
red("\n⚠️ Documentation files and 'map.json' file are out of sync!\n")
|
||
);
|
||
console.log(readmeMissList.map((x) => x.concat('.md')).join('\n'));
|
||
console.error(
|
||
red(
|
||
`\nSome documentation files exist without any reference in \'map.json\', make sure to add an entry.`
|
||
)
|
||
);
|
||
scriptError = true;
|
||
} else {
|
||
console.log(
|
||
green("Markdown files are in sync with 'map.json', everything is good 👍")
|
||
);
|
||
}
|
||
|
||
if (!!mapMissList.length) {
|
||
console.error(
|
||
red(
|
||
"\n⚠️ The 'map.json' file and the documentation files are out of sync!\n"
|
||
)
|
||
);
|
||
console.log(mapMissList.map((x) => x.concat('.md')).join('\n'));
|
||
console.error(
|
||
red(
|
||
`\nThe \'map.json\' file is linking documenation files that do not exist.`
|
||
)
|
||
);
|
||
scriptError = true;
|
||
} else {
|
||
console.log(
|
||
green(
|
||
"The 'map.json' file and the documentation files are in sync, everything is good 👍"
|
||
)
|
||
);
|
||
}
|
||
|
||
if (scriptError) {
|
||
process.exit(1);
|
||
} else {
|
||
process.exit(0);
|
||
}
|