-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.js
More file actions
124 lines (108 loc) · 3.51 KB
/
Copy pathutils.js
File metadata and controls
124 lines (108 loc) · 3.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
"use strict";
/**
* @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 };