@slimio/psp
Version:
Analyze compliance with the structural policy of a SlimIO project
125 lines (108 loc) • 3.59 kB
JavaScript
;
/**
* @namespace Utils
*/
// Require Node.js Dependencies
const { readdir, readFile, stat } = require("fs").promises;
const { join, extname } = require("path");
// Require Third-party Dependencies
const parser = require("file-ignore-parser");
const { green, red } = require("kleur");
// Require Internal Dependencies
const requiredElem = require("../src/requiredElems.json");
// CONSTANTS
const EXCLUDE_DIRS = new Set(requiredElem.EXCLUDE_DIRS);
const TPL_DIR = join(__dirname, "..", "template");
const FILES_TRANSFORM = new Map([
[".editorconfig", "editorconfig.txt"],
[".gitignore", "gitignore.txt"],
[".npmignore", "npmignore.txt"]
]);
/**
* @async
* @generator
* @function getJavascriptFiles
* @memberof Utils
* @param {!string} dir root directory
* @returns {AsyncIterableIterator<string>}
*/
async function* getJavascriptFiles(dir) {
const files = await readdir(dir);
const tDirs = [];
// Check js file main directory
for (const file of files) {
if (extname(file) === ".js") {
yield join(dir, file);
continue;
}
if (EXCLUDE_DIRS.has(file)) {
continue;
}
tDirs.push(file);
}
// Check js files in all main directory folders
for (const name of tDirs) {
const st = await stat(join(dir, name));
if (st.isDirectory()) {
yield* getJavascriptFiles(join(dir, name));
}
}
}
/**
* @async
* @function listContentFile
* @description Parse files and generate an array
* @param {!string} fileName File name parsed
* @param {Set<string>} [setObj] If local file doesn't exist (Example, README.md)
* @param {object} options options
* @param {string} [options.type="package"] project type
* @param {string} [options.CWD] CWD
* @returns {Promise<Array<string>|null>}
*/
async function listContentFile(fileName, setObj, options = Object.create(null)) {
const { type = "package", CWD = process.cwd() } = options;
const list = [];
let userFile = await readFile(join(CWD, fileName));
let localFile = setObj;
let missing = false;
let key = "includes";
if (typeof setObj === "undefined") {
localFile = await parser(join(TPL_DIR, FILES_TRANSFORM.get(fileName) || fileName));
if (fileName === ".gitignore" && type === "napi") {
localFile.add("build/");
localFile.add("prebuilds/");
localFile.add(".vscode/");
localFile.add(".exe");
localFile.add(".obj");
}
else if (fileName === ".npmignore" && type === "napi") {
localFile.add("build/");
localFile.add(".vscode/");
localFile.add("*.exe");
localFile.add("*.obj");
}
userFile = await parser(join(CWD, fileName));
key = "has";
}
for (const line of localFile) {
if (!userFile[key](line)) {
list.push(green(line));
missing = true;
continue;
}
list.push(red(line));
}
return missing ? list : null;
}
/**
* @function readFileLocal
* @description Read the file given in argument
* @param {!string} fileName file name of the main function
* @returns {Promise<string>} utf8 String of the file given in argument
*/
function readFileLocal(fileName) {
const originalName = FILES_TRANSFORM.get(fileName) || fileName;
const filePath = join(TPL_DIR, originalName);
return readFile(filePath, { encoding: "utf8" });
}
module.exports = { getJavascriptFiles, readFileLocal, listContentFile };