@fto-consult/common
Version:
Un ensemble de bibliothèques et d'utilistaires communs pour le développement d'applications javascript
97 lines (96 loc) • 4.46 kB
JavaScript
/***
génère le fichier jsconfig.json de vs code pour notemment spécifier les emplacements des alias et autres
*/
const {writeFile,JSONFileManager,extendObj,isNonNullString} = require("@fto-consult/node-utils");
const fs = require("fs");
const path = require("path");
/****
génière les alias dans le fichier jsconfig.json
@param {
projectRoot {string}, le projectRoot
compilerOptions {obj}, les options de compilerOptions,
alias | paths {object}, les alias de l'application
}
*/
module.exports = function generateJSONConfig(opts){
opts = Object.assign({},opts);
const alias = extendObj({},opts.alias,opts.paths);
const projectRoot = opts.projectRoot && typeof opts.projectRoot ==="string" && fs.existsSync(path.resolve(opts.projectRoot)) && path.resolve(opts.projectRoot) || process.cwd();
const jsconfigPath = path.resolve(projectRoot,"jsconfig.json");
if(!fs.existsSync(jsconfigPath)){
try {
writeFile(jsconfigPath,`{}`);
} catch(e){
console.log("generatingn jsconfig.json file on path",jsconfigPath);
}
}
if(!fs.existsSync(jsconfigPath)) {
console.log("unable to generate jsconfig.json on path "+jsconfigPath);
return;
}
const paths = {};
const JManager = JSONFileManager(jsconfigPath);
if(JManager.hasPackage){
const baseUrl = path.resolve(projectRoot);
let hasFoundAlias = false;
for(let i in alias){
const alia = alias[i];
const p = Array.isArray(alia) && alia.length && alia || isNonNullString(alia) && alia.split(",") || undefined;
let aliasIndex = String(i);
if(Array.isArray(p)){
const rAlias = [];
p.map((a)=>{
if(!isNonNullString(a)) return;
const aa = path.resolve(a);
if(!fs.existsSync(aa)) return;
const lstat = fs.lstatSync(aa);
let np = path.relative(baseUrl,aa).trim().split("\\").join("/");
if(lstat.isDirectory() && !lstat.isFile()){
np = np.trim().rtrim("/*").rtrim("/").rtrim("\\").trim();
const hasIndexJs = fs.existsSync(path.resolve(aa,"index.js"));
const hasIndexJsx = fs.existsSync(path.resolve(aa,"index.jsx"));
const hasIndexTs = fs.existsSync(path.resolve(aa,"index.ts"));
const hasIndexTsx = fs.existsSync(path.resolve(aa,"index.tsx"));
const hasIndexFile = hasIndexJs || hasIndexTs || hasIndexJsx || hasIndexTsx ;
aliasIndex = aliasIndex.rtrim("/*").rtrim("/").rtrim("\\");
if(hasIndexFile){
const indexF = hasIndexJs || hasIndexTs ? "index" : hasIndexJsx ? "index.jsx" : "index.tsx";
paths[aliasIndex] = !np ? [`./${indexF}`]:[`${np.rtrim("/")}/${indexF}`];
hasFoundAlias = true;
}
if(!np){
np = "./*"
} else if(!np.endsWith("/*")){
np+="/*";
}
aliasIndex = aliasIndex+"/*";
}
if(np){
rAlias.push(np);
}
});
if(rAlias.length){
paths[aliasIndex] = rAlias;
hasFoundAlias = true;
}
}
}
const excludeA = JManager.get("exclude");
const jEx = Array.isArray(excludeA)? excludeA : [];
["node_modules", "build", "dist","out","web-build"].map((a)=>{
if(!jEx.includes(a)){
jEx.push(a);
}
});
JManager.set("compilerOptions",extendObj(true,{},JManager.get("compilerOptions"),{
paths,
baseUrl : "./",
},opts.compilerOptions));
JManager.set("exclude",jEx);
JManager.persist();
if(!hasFoundAlias){
console.log("not valid alias to update in jsonconfig.json on path "+jsconfigPath);
}
console.log("jsconfig.json successfull created on path "+jsconfigPath);
}
}