unix-permissions
Version:
Swiss Army knife for Unix permissions
92 lines (64 loc) • 1.8 kB
JavaScript
import{CATEGORIES,CATEGORY_PERMISSIONS}from"../../constants.js";
import{joinCategories}from"./join.js";
export const serialize=(nodes)=>{
if(nodes.length===0){
return DEFAULT_SERIALIZE
}
const perm=CATEGORIES.map((category)=>
pickCategoryNodes({category,nodes})
).
flatMap(serializePart).
flatMap(joinCategories).
map(stringifyPart).
join(",");
return perm
};
const DEFAULT_SERIALIZE="a+";
const pickCategoryNodes=({category,nodes})=>{
const nodesA=nodes.filter((node)=>node.category===category);
return{category,nodes:nodesA}
};
const serializePart=({category,nodes})=>{
if(nodes.length===0){
return[]
}
if(shouldUseEqual({category,nodes})){
return serializeEqualPart({category,nodes})
}
return serializeAddParts({category,nodes})
};
const shouldUseEqual=({category,nodes})=>
CATEGORY_PERMISSIONS[category].every((permission)=>
containsPermission({nodes,permission})
);
const containsPermission=({nodes,permission})=>
nodes.some((node)=>node.permission===permission);
const serializeEqualPart=({category,nodes})=>{
const permissions=nodes.map(serializeEqualPerm).join("");
return[{category,operator:OPERATORS.EQUAL,permissions}]
};
const serializeEqualPerm=({add,permission})=>{
if(!add){
return""
}
return permission
};
const serializeAddParts=({category,nodes})=>
Object.keys(OPERATORS).
map((add)=>seralizeAddPart({category,nodes,add})).
filter(Boolean);
const seralizeAddPart=({category,nodes,add})=>{
const nodesA=nodes.filter((node)=>String(node.add)===add);
if(nodesA.length===0){
return""
}
const permissions=nodesA.map(({permission})=>permission).join("");
return{category,operator:OPERATORS[add],permissions}
};
const stringifyPart=({category,operator,permissions})=>
`${category}${operator}${permissions}`;
const OPERATORS={
true:"+",
false:"-",
EQUAL:"="
};