@homedev/objector 0.1.12 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +3 -2
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,2 +1,3 @@
1
- import l from"path";import P from"fs/promises";import X from"path";import p from"yaml";var u=async(w)=>{try{return await P.access(w,P.constants.R_OK),!0}catch{return!1}},I=async(w,F)=>{let r=await(async()=>{let $=[""];if(!X.isAbsolute(w)&&F?.dirs)$.push(...F.dirs);for(let M of $){let q=X.join(M,w);if(await u(q))return X.resolve(q)}throw new Error(`File not found: "${w}"`)})(),T=await P.readFile(r),E=X.dirname(r),C={"[.](yml|yaml)$":p.parse,"[.]json$":JSON.parse,...F?.parsers},j=Object.entries(C).find(($)=>r.match($[0]));if(!j)throw new Error(`Unhandled file type: ${w}`);return{content:j[1](T.toString()),fullPath:r,folderPath:E}};var z=async(w,F)=>{for(let O of w){let r=F?.root?l.join(F.root,O):O,T=await I(r,F?.loadOptions);if(F?.loaded)await F.loaded(T)}};var S=(w,F,O)=>{for(let r of Object.keys(F)){if(w[r]===void 0)continue;let T=F[r],E=w[r];if(typeof E!==typeof T||Array.isArray(E)!==Array.isArray(T)){let j=O?.mismatch?.(r,E,T,w,F);if(j!==void 0){F[r]=j;continue}throw new Error(`Type mismatch: ${r}`)}let C=O?.mode?.(r,E,T,w,F)??"merge";switch(C){case"source":F[r]=E;continue;case"target":continue;case"skip":delete F[r],delete w[r];continue;case"merge":break;default:throw new Error(`Unknown merge mode: ${C}`)}if(typeof E==="object")if(Array.isArray(E))T.push(...E);else{if(O?.navigate?.(r,E,T,w,F)===!1)continue;S(E,T,O)}else{if(E===T)continue;let j=O?.conflict?.(r,E,T,w,F);F[r]=j===void 0?T:j}}for(let r of Object.keys(w))if(F[r]===void 0)F[r]=w[r]};var K;((C)=>{C[C.Explore=0]="Explore";C[C.SkipSiblings=1]="SkipSiblings";C[C.NoExplore=2]="NoExplore";C[C.ReplaceItem=3]="ReplaceItem";C[C.ReplaceParent=4]="ReplaceParent";C[C.DeleteParent=5]="DeleteParent"})(K||={});class U{action;by;constructor(w,F){this.action=w;this.by=F}static ReplaceParent(w){return new U(4,w)}static ReplaceItem(w){return new U(3,w)}static SkipSiblings(){return new U(1)}static Explore(){return new U(0)}static NoExplore(){return new U(2)}static DeleteParent(){return new U(5)}}var Y=async(w,F)=>{let O=async(T)=>{let E=T.key===null,C=E?{action:0}:await F(T);if(T.value&&typeof T.value==="object"&&C.action==0){if(!E)T.path.push(T.key);if(await r(T),!E)T.path.pop()}return C},r=async(T)=>{for(let[E,C]of Object.entries(T.value)){let j=await O({key:E,value:C,path:T.path,parent:T.value});switch(j.action){case 4:if(!T.key)throw new Error("Cannot replace root");T.parent[T.key]=j.by;return;case 3:T.value[E]=j.by;break;case 5:delete T.parent[T.key];return;case 1:return}}};await O({key:null,value:w,path:[],parent:null})};var A=(w,F,O="(",r=")")=>{let T=0,E="",C=[];for(let j of w){if(E+=j,j===O)T++;if(j===r)T--;if(T===0&&j===F)C.push(E.slice(0,-1)),E=""}if(E)C.push(E);return C},g=(w)=>{let F=/(?:\s*"([^"]*)"\s*|([^",]+))(?:,)?|(,)/g,O=[],r;while((r=F.exec(w))!==null)O.push({value:r[1]??r[2]?.trim()??"",quoted:r[1]!==void 0});return O};var f=(w,F,O,r)=>{if(w.startsWith("{")){let T=w.substring(1,w.length-1);return Z(F,T,O).toString()}return r?w:void 0},i=(w,F,O,r)=>{let T=f(F,O,r);if(T)return Z(w,T,r);let E=/^\[([^=\]]*)([=]*)([^\]]*)\]$/.exec(F);if(E){let[j,b,$,M]=E,q=f(b.trim(),O,r,!0),L=f(M.trim(),O,r,!0);if(Array.isArray(w))switch($){case"==":case"=":return w.find((G)=>G[q]==L)}}let C=/^([^[\]]*)\[([^\]]*)]/.exec(F);if(C)return w[C[1]][C[2]];return w[F]},Z=(w,F,O)=>{let r=void 0,T=void 0;F??="";let E=(M)=>M?.endsWith("?")?[M.substring(0,M.length-1),!0]:[M,!1],C=(M,q)=>{let[L,G]=E(q.pop());if(L){let H=i(M,L,w,O);if(H===void 0){if(G||O?.defaultValue!==void 0)return;throw new Error(`Unknown path element: "${L}" in "${F}"`)}return r=M,T=L,C(H,q)}if(O?.set&&T)r[T]=O?.set;return M},j=A(F,O?.separator??".","{","}"),b=j.length>0&&j[j.length-1].startsWith("?=")?j.pop()?.substring(2):void 0;j.reverse();let $=C(w,j);if($===void 0)return b??O?.defaultValue;return $};var B=(w,F)=>{let O=/^(?<path>[^@>]*)?(?:@(?<from>[^>]*))?$/.exec(w)?.groups;if(!O)throw new Error(`Invalid reference: "${w}"`);let{from:r,path:T}=O;if(!r)return Z(F.root,T,{defaultValue:F?.defaultValue});if(F.async===!1){if(!F.load)throw new Error("No load function defined");return Z(F.load(r),T,{defaultValue:F?.defaultValue})}else return(F.load??I)(r).then((E)=>Z(E,T))};var J=async(w,F,O,r)=>{let T,E=[],C=F;if(!r.sources)return U.Explore();if(C=C.replaceAll(r.sourcesMatcher??/\$\((?<key>[^:()]+)(?::(?<arg>(?:(?:"[^"]*"|[^",()]*),?)*))?\)/g,(j,...b)=>{if(T)return j;let $=(_)=>{if(_ instanceof Promise)return`ð[${E.push(_)}]ñ`;if(typeof _==="object")return T=_,j;return _??""},M=b[b.length-1],q=r.sources[M.key];if(M.arg===void 0)return $(B(M.key,{root:O,load:r?.load}));if(q===void 0)throw new Error(`Unhandled source type: ${M.key}`);let[L,G]="fn"in q?[q.fn,q]:[q,{}],H=g(M.arg),v=G.processArgs===!1?[]:H.map((_)=>_.quoted?_.value:B(_.value,{root:O}));return $(L({groups:M,args:v,rawArgs:H,path:w,value:C,root:O,key:M.key,options:r}))}),T)C=await T;else if(E.length){let j=await Promise.all(E);C=j.find((b)=>typeof b==="object")??C.replaceAll(/\xf0\[(\d+)]\xf1/g,(b,$)=>j[+$-1])}if(C===null)return U.DeleteParent();if(C===F)return U.Explore();if(C instanceof U)return C;if(typeof C==="string"){let j=await J(w,C,O,r);if(j.action!==0)return j}return U.ReplaceItem(C)};var V=async(w,F,O,r)=>{if(w.key.startsWith("$"))return U.NoExplore();if(!r.keys)return;let T=(r?.keysMatcher??/^\.(?<key>.*)/).exec(w.key)?.groups;if(T){let E=r.keys[T.key];if(E!==void 0){let C=typeof E==="object"?E:{},j=typeof E==="function"?E:E.fn;if(typeof w.value==="string"){let M=await J(F,w.value,O,r);if(M.by)w.value=M.by}else await W(w.value,{...r,filters:[...r.filters??[],...C.filters??[]]});let b={args:[w.value],rawArgs:[],groups:T,path:F,value:w.value,root:O,parent:w.parent,key:w.key,file:r?.file,options:r},$=await j(b);if($ instanceof U)return $;if($===null)return U.DeleteParent();if($===void 0)return U.Explore();return U.ReplaceParent($)}}};var W=async(w,F)=>Y(w,async(O)=>{let r=[...O.path,O.key].join(".");if(F.filters?.length&&F.filters.some((T)=>T.test(r)))return U.NoExplore();return await V(O,r,{...w,...F.root},F)??(typeof O.value==="string"?J(r,O.value,{...w,...F.root},F):U.Explore())});var zF=async(w,F)=>{let O=[];return await Y(w,(r)=>{if(F([...r.path,r.key].join("."),r.value))O.push(r.value);return U.Explore()}),O};var y=(w,F="name")=>Object.entries(w).map(([O,r])=>({[F]:O,...r})),AF=(w,F="name")=>Object.fromEntries(w.map((O)=>[O[F],O])),R=(w,F="name")=>Object.fromEntries(w.map((O)=>{let{[F]:r,...T}=O;return[r,T]}));import Q from"fs/promises";import n from"path";import o from"yaml";import D from"path";var d=(w)=>{return{load:async(F)=>{for(let{file:O,alias:r}of Array.isArray(F.value)?F.value:[F.value]){if(!O)throw new Error("File reference required");await w.load(O,r??O,F.file&&D.dirname(F.file))}delete F.parent[F.key]},include:(F)=>w.load(F.value,void 0,F.file&&D.dirname(F.file)),from:async(F)=>{let O=await B(F.value,{root:F.root,load:(r)=>w.load(r,void 0,F.file&&D.dirname(F.file))});if(F.parent.content){if(Array.isArray(F.parent.content)&&Array.isArray(O))return[...O,...F.parent.content];return w.merge(O,F.parent.content),F.parent.content}return O},concat:async(F)=>{let O=[];for(let r of Array.isArray(F.value)?F.value:[F.value])O.push(...await B(r,{root:F.root,load:(T)=>w.load(T,void 0,F.file&&D.dirname(F.file))}));return O.filter((r)=>r!==void 0)},extends:async(F)=>{for(let O of Array.isArray(F.value)?F.value:[F.value])w.merge(await B(O,{root:F.root,load:(r)=>w.load(r,void 0,F.file&&D.dirname(F.file))}),F.parent);delete F.parent[F.key]},alias:(F)=>{w.alias(F.value,F.parent),delete F.parent[F.key]},if:(F)=>{if(!F.value)return null;delete F.parent[F.key]},skip:(F)=>{return delete F.parent[F.key],U.SkipSiblings()},output:(F)=>{delete F.parent[F.key];for(let O of Array.isArray(F.value)?F.value:[F.value])if(typeof O==="string")w.output({name:O,value:F.parent});else w.output({...O,value:O.value??F.parent})},each:{filters:[/select|model/],fn:async(F)=>{delete F.parent[F.key];let O=($)=>B($,{root:F.root,load:(M)=>w.load(M,void 0,F.file&&D.dirname(F.file))}),r=()=>{if(typeof F.value==="string"||!F.value.model)return F.parent;if(typeof F.value.model==="string")return O(F.value.model);return F.value.model},T=()=>{if(typeof F.value==="string")return O(F.value);if(Array.isArray(F.value))return F.value;if(typeof F.value.from==="string")return O(F.value.from);return F.value.from},E=async($)=>{let M=F.value.select;if(M===void 0)return $;if(typeof M!=="string"){let q=JSON.parse(JSON.stringify(M));return await W(q,{...F.options,root:{...F.root,result:$}}),q}return await B(M,{root:{...F.root,result:$}})},C=await T(),j=await r();if(!Array.isArray(C))throw new Error('Key "each" requires a source list');if(j===void 0)throw new Error('Key "each" must define a model');if(F.value.extend?.model)j=w.mergeAll([j,...Array.isArray(F.value.extend.model)?F.value.extend.model:[F.value.extend.model]]);let b=[];for(let $=0;$<C.length;$++){let M=JSON.parse(JSON.stringify(j));if(await W(M,{...F.options,root:{...F.root,item:C[$],this:M,index:$}}),F.value.extend?.result)M=w.mergeAll([M,...Array.isArray(F.value.extend?.result)?F.value.extend.result:[Array.isArray(F.value.extend?.result)]]);b.push(await E(M))}return b}}}};import a from"fs/promises";var h=(w)=>w.replace(/((?:[_ ]+)\w|^\w)/g,(F,O)=>O.toUpperCase()).replace(/_/g,""),s=(w)=>h(w).replace(/((?:[ ]+\w)|^\w)/g,(F,O)=>O.toLowerCase()),m=(w,F)=>w.replace(/([a-z])([A-Z])/g,`$1${F}$2`).replace(/\s+/g,F),k=(w,F)=>{switch(F){case"upper":return w.toUpperCase();case"lower":return w.toLowerCase()}},N=(w)=>{return{include:async(F)=>await w.load(F.args[0],F.args[1]),file:async(F)=>await a.readFile(F.args[0]).then((O)=>O.toString()),env:(F)=>process.env[F.args[0]],len:(F)=>F.args[0].length,reverse:(F)=>F.args[0].split("").reverse().join(""),substring:(F)=>F.args[0].substring(+F.args[1],+F.args[2]),concat:(F)=>F.args.join(""),lower:(F)=>F.args[0].toLowerCase(),upper:(F)=>F.args[0].toUpperCase(),pascal:(F)=>h(F.args[0]),camel:(F)=>s(F.args[0]),snake:(F)=>k(m(F.args[0],"_"),F.args[1]),kebab:(F)=>k(m(F.args[0],"-"),F.args[1]),encode:(F)=>Buffer.from(F.args[0]).toString(F.args[1]??"base64"),decode:(F)=>Buffer.from(F.args[0],F.args[1]??"base64").toString(),uuid:(F)=>crypto.randomUUID(),join:(F)=>{let[O,r,T]=F.args,E=O;if(!Array.isArray(E))throw new Error(`[${F.path}] Object is not a list`);if(r?.length)E=E.map((C)=>B(r,{root:{...F.root,...C},load:(j)=>w.load(j)}));return E.join(T?.replace("\\n",`
2
- `))},list:(F)=>y(F.args[0],F.args[1]),object:(F)=>R(F.args[0],F.args[1]),default:{processArgs:!1,fn:async(F)=>{let O=F.rawArgs[1]?.value?F.rawArgs[1].quoted?F.rawArgs[1].value:await B(F.rawArgs[1].value,{root:F.root,load:(r)=>w.load(r)}):"";return await B(F.rawArgs[0].value,{root:F.root,load:(r)=>w.load(r),defaultValue:O})}}}};class x{options={load:{dirs:[]},merge:{},include:{},fields:{},includeKey:"includes",mergeKey:".merge",outputs:[]};cache={};includeDirectory(...w){return this.options.load.dirs??=[],this.options.load.dirs.push(...w),this}keys(w){return this.options.fields.keys={...this.options.fields.keys,...w},this}sources(w){return this.options.fields.sources={...this.options.fields.sources,...w},this}variables(w){return this.options.variables={...this.options.variables,...w},this}output(w){return this.options.outputs??=[],this.options.outputs.push(w),this}defaultProcessors(){return this.sources(N(this)).keys(d(this))}alias(w,F){return this.cache[w]=F,this}getAlias(w){return this.cache[w]}getOutputs(){return this.options.outputs??[]}use(w){return w(this),this}filter(w){return this.options.fields.filters??=[],this.options.fields.filters?.push(w),this}async load(w,F,O){if(F&&this.cache[F])return this.cache[F];if(this.cache[w])return this.cache[w];let r=O?[O]:[];this.options.load.dirs&&r.push(...this.options.load.dirs);let T=await I(w,{...this.options.load,dirs:r});if(!T.content)return null;if(F)this.cache[F]=T.content;if(this.options.includeKey&&T.content[this.options.includeKey])await z(T.content[this.options.includeKey],{root:T.folderPath,loaded:(E)=>{if(this.options.mergeKey&&E.content)S(E.content,T.content,{mode:(C,j,b)=>b[this.options.mergeKey],...this.options.merge})},loadOptions:this.options.load,...this.options.include}),delete T.content[this.options.includeKey];return await W(T.content,{...this.options.fields,file:T.fullPath,root:{...this.options.fields.root,...this.options.variables},load:(E)=>this.load(E)}),T.content}merge(w,F){S(w,F,{mode:(O,r,T)=>T[this.options.mergeKey],...this.options.merge})}mergeAll(w){let F={};for(let O of w.toReversed())this.merge(O,F);return F}async writeOutputs(w){if(w?.targetDirectory&&w?.removeFirst)try{await Q.rm(w?.targetDirectory,{recursive:!0,force:!0})}catch(F){throw new Error(`Failed to clean the output directory: ${F.message}`)}for(let F of this.getOutputs()){let O=n.join(w?.targetDirectory??".",F.name),r=n.dirname(O);if(w?.writing?.(F)===!1)continue;try{await Q.mkdir(r,{recursive:!0})}catch(T){throw new Error(`Failed to create target directory "${r}" for output "${O}": ${T.message}`)}try{switch(F.type){case"yaml":await Q.writeFile(O,o.stringify(F.value));break;case"json":await Q.writeFile(O,JSON.stringify(F.value));break;default:await Q.writeFile(O,F.value.toString())}}catch(T){throw new Error(`Failed to write output "${O}": ${T.message}`)}}}}export{AF as toObjectWithKey,R as toObject,y as toList,B as select,z as processIncludes,W as processFields,Y as navigate,S as merge,I as load,zF as find,x as Objector,U as NavigateResult,K as NavigateAction};
1
+ import l from"path";import f from"fs/promises";import X from"path";import p from"yaml";var u=async(w)=>{try{return await f.access(w,f.constants.R_OK),!0}catch{return!1}},I=async(w,F)=>{let r=await(async()=>{let $=[""];if(!X.isAbsolute(w)&&F?.dirs)$.push(...F.dirs);for(let M of $){let q=X.join(M,w);if(await u(q))return X.resolve(q)}throw new Error(`File not found: "${w}"`)})(),T=await f.readFile(r),E=X.dirname(r),C={"[.](yml|yaml)$":p.parse,"[.]json$":JSON.parse,...F?.parsers},j=Object.entries(C).find(($)=>r.match($[0]));if(!j)throw new Error(`Unhandled file type: ${w}`);return{content:j[1](T.toString()),fullPath:r,folderPath:E}};var K=async(w,F)=>{for(let O of w){let r=F?.root?l.join(F.root,O):O,T=await I(r,F?.loadOptions);if(F?.loaded)await F.loaded(T)}};var S=(w,F,O)=>{for(let r of Object.keys(F)){if(w[r]===void 0)continue;let T=F[r],E=w[r];if(typeof E!==typeof T||Array.isArray(E)!==Array.isArray(T)){let j=O?.mismatch?.(r,E,T,w,F);if(j!==void 0){F[r]=j;continue}throw new Error(`Type mismatch: ${r}`)}let C=O?.mode?.(r,E,T,w,F)??"merge";switch(C){case"source":F[r]=E;continue;case"target":continue;case"skip":delete F[r],delete w[r];continue;case"merge":break;default:throw new Error(`Unknown merge mode: ${C}`)}if(typeof E==="object")if(Array.isArray(E))T.push(...E);else{if(O?.navigate?.(r,E,T,w,F)===!1)continue;S(E,T,O)}else{if(E===T)continue;let j=O?.conflict?.(r,E,T,w,F);F[r]=j===void 0?T:j}}for(let r of Object.keys(w))if(F[r]===void 0)F[r]=w[r]};var A;((C)=>{C[C.Explore=0]="Explore";C[C.SkipSiblings=1]="SkipSiblings";C[C.NoExplore=2]="NoExplore";C[C.ReplaceItem=3]="ReplaceItem";C[C.ReplaceParent=4]="ReplaceParent";C[C.DeleteParent=5]="DeleteParent"})(A||={});class U{action;by;constructor(w,F){this.action=w;this.by=F}static ReplaceParent(w){return new U(4,w)}static ReplaceItem(w){return new U(3,w)}static SkipSiblings(){return new U(1)}static Explore(){return new U(0)}static NoExplore(){return new U(2)}static DeleteParent(){return new U(5)}}var Y=async(w,F)=>{let O=async(T)=>{let E=T.key===null,C=E?{action:0}:await F(T);if(T.value&&typeof T.value==="object"&&C.action==0){if(!E)T.path.push(T.key);if(await r(T),!E)T.path.pop()}return C},r=async(T)=>{for(let[E,C]of Object.entries(T.value)){let j=await O({key:E,value:C,path:T.path,parent:T.value});switch(j.action){case 4:if(!T.key)throw new Error("Cannot replace root");T.parent[T.key]=j.by;return;case 3:T.value[E]=j.by;break;case 5:delete T.parent[T.key];return;case 1:return}}};await O({key:null,value:w,path:[],parent:null})};var g=(w,F,O="(",r=")")=>{let T=0,E="",C=[];for(let j of w){if(E+=j,j===O)T++;if(j===r)T--;if(T===0&&j===F)C.push(E.slice(0,-1)),E=""}if(E)C.push(E);return C},z=(w)=>{let F=/(?:\s*(?:"([^"]*)"|'([^']*)')\s*|([^"',]+))(?:,)?|(,)/g,O=[],r;while((r=F.exec(w))!==null){let T=r[1]??r[2];O.push({value:T??r[3]?.trim()??"",quoted:T!==void 0})}return O};var P=(w,F,O,r)=>{if(w.startsWith("{")){let T=w.substring(1,w.length-1);return Q(F,T,O).toString()}return r?w:void 0},i=(w,F,O,r)=>{let T=P(F,O,r);if(T)return Q(w,T,r);let E=/^\[([^=\]]*)([=]*)([^\]]*)\]$/.exec(F);if(E){let[j,b,$,M]=E,q=P(b.trim(),O,r,!0),L=P(M.trim(),O,r,!0);if(Array.isArray(w))switch($){case"==":case"=":return w.find((D)=>D[q]==L)}}let C=/^([^[\]]*)\[([^\]]*)]/.exec(F);if(C)return w[C[1]][C[2]];return w[F]},Q=(w,F,O)=>{let r=void 0,T=void 0;F??="";let E=(M)=>M?.endsWith("?")?[M.substring(0,M.length-1),!0]:[M,!1],C=(M,q)=>{let[L,D]=E(q.pop());if(L){let G=i(M,L,w,O);if(G===void 0){if(D||O?.defaultValue!==void 0)return;throw new Error(`Unknown path element: "${L}" in "${F}"`)}return r=M,T=L,C(G,q)}if(O?.set&&T)r[T]=O?.set;return M},j=g(F,O?.separator??".","{","}"),b=j.length>0&&j[j.length-1].startsWith("?=")?j.pop()?.substring(2):void 0;j.reverse();let $=C(w,j);if($===void 0)return b??O?.defaultValue;return $};var B=(w,F)=>{let O=/^(?<path>[^@>]*)?(?:@(?<from>[^>]*))?$/.exec(w)?.groups;if(!O)throw new Error(`Invalid reference: "${w}"`);let{from:r,path:T}=O;if(!r)return Q(F.root,T,{defaultValue:F?.defaultValue});if(F.async===!1){if(!F.load)throw new Error("No load function defined");return Q(F.load(r),T,{defaultValue:F?.defaultValue})}else return(F.load??I)(r).then((E)=>Q(E,T))};var H=async(w,F,O,r)=>{let T,E=[],C=F;if(!r.sources)return U.Explore();if(C=C.replaceAll(r.sourcesMatcher??/\$\((?<key>[^:()]+)(?::(?<arg>(?:(?:"[^"]*"|[^",()]*),?)*))?\)/g,(j,...b)=>{if(T)return j;let $=(_)=>{if(_ instanceof Promise)return`ð[${E.push(_)}]ñ`;if(typeof _==="object")return T=_,j;return _??""},M=b[b.length-1],q=r.sources[M.key];if(M.arg===void 0)return $(B(M.key,{root:O,load:r?.load}));if(q===void 0)throw new Error(`Unhandled source type: ${M.key}`);let[L,D]="fn"in q?[q.fn,q]:[q,{}],G=z(M.arg),v=D.processArgs===!1?[]:G.map((_)=>{if(_.quoted)return _.value;return _.value.startsWith("@")?_.value.substring(1):B(_.value,{root:O})});return $(L({groups:M,args:v,rawArgs:G,path:w,value:C,root:O,key:M.key,options:r}))}),T)C=await T;else if(E.length){let j=await Promise.all(E);C=j.find((b)=>typeof b==="object")??C.replaceAll(/\xf0\[(\d+)]\xf1/g,(b,$)=>j[+$-1])}if(C===null)return U.DeleteParent();if(C===F)return U.Explore();if(C instanceof U)return C;if(typeof C==="string"){let j=await H(w,C,O,r);if(j.action!==0)return j}return U.ReplaceItem(C)};var V=async(w,F,O,r)=>{if(w.key.startsWith("$"))return U.NoExplore();if(!r.keys)return;let T=(r?.keysMatcher??/^\.(?<key>.*)/).exec(w.key)?.groups;if(T){let E=r.keys[T.key];if(E!==void 0){let C=typeof E==="object"?E:{},j=typeof E==="function"?E:E.fn;if(typeof w.value==="string"){let M=await H(F,w.value,O,r);if(M.by)w.value=M.by}else await W(w.value,{...r,filters:[...r.filters??[],...C.filters??[]]});let b={args:[w.value],rawArgs:[],groups:T,path:F,value:w.value,root:O,parent:w.parent,key:w.key,file:r?.file,options:r},$=await j(b);if($ instanceof U)return $;if($===null)return U.DeleteParent();if($===void 0)return U.Explore();return U.ReplaceParent($)}}};var W=async(w,F)=>Y(w,async(O)=>{let r=[...O.path,O.key].join(".");if(F.filters?.length&&F.filters.some((T)=>T.test(r)))return U.NoExplore();try{return await V(O,r,{...w,...F.root},F)??(typeof O.value==="string"?await H(r,O.value,{...w,...F.root},F):U.Explore())}catch(T){throw new Error(`${T.message}
2
+ in ${F.file??""}(${r}) `)}});var KF=async(w,F)=>{let O=[];return await Y(w,(r)=>{if(F([...r.path,r.key].join("."),r.value))O.push(r.value);return U.Explore()}),O};var y=(w,F="name")=>Object.entries(w).map(([O,r])=>({[F]:O,...r})),gF=(w,F="name")=>Object.fromEntries(w.map((O)=>[O[F],O])),R=(w,F="name")=>Object.fromEntries(w.map((O)=>{let{[F]:r,...T}=O;return[r,T]}));import J from"fs/promises";import n from"path";import o from"yaml";import Z from"path";var d=(w)=>{return{load:async(F)=>{for(let{file:O,alias:r}of Array.isArray(F.value)?F.value:[F.value]){if(!O)throw new Error("File reference required");await w.load(O,r??O,F.file&&Z.dirname(F.file))}delete F.parent[F.key]},include:(F)=>w.load(F.value,void 0,F.file&&Z.dirname(F.file)),from:async(F)=>{let O=await B(F.value,{root:F.root,load:(r)=>w.load(r,void 0,F.file&&Z.dirname(F.file))});if(F.parent.content){if(Array.isArray(F.parent.content)&&Array.isArray(O))return[...O,...F.parent.content];return w.merge(O,F.parent.content),F.parent.content}return O},concat:async(F)=>{let O=[];for(let r of Array.isArray(F.value)?F.value:[F.value])O.push(...await B(r,{root:F.root,load:(T)=>w.load(T,void 0,F.file&&Z.dirname(F.file))}));return O.filter((r)=>r!==void 0)},extends:async(F)=>{for(let O of Array.isArray(F.value)?F.value:[F.value])w.merge(await B(O,{root:F.root,load:(r)=>w.load(r,void 0,F.file&&Z.dirname(F.file))}),F.parent);delete F.parent[F.key]},alias:(F)=>{w.alias(F.value,F.parent),delete F.parent[F.key]},if:(F)=>{if(!F.value)return null;delete F.parent[F.key]},skip:(F)=>{return delete F.parent[F.key],U.SkipSiblings()},output:(F)=>{delete F.parent[F.key];for(let O of Array.isArray(F.value)?F.value:[F.value])if(typeof O==="string")w.output({name:O,value:F.parent});else w.output({...O,value:O.value??F.parent})},each:{filters:[/select|model/],fn:async(F)=>{delete F.parent[F.key];let O=($)=>B($,{root:F.root,load:(M)=>w.load(M,void 0,F.file&&Z.dirname(F.file))}),r=()=>{if(typeof F.value==="string"||!F.value.model)return F.parent;if(typeof F.value.model==="string")return O(F.value.model);return F.value.model},T=()=>{if(typeof F.value==="string")return O(F.value);if(Array.isArray(F.value))return F.value;if(typeof F.value.from==="string")return O(F.value.from);return F.value.from},E=async($)=>{let M=F.value.select;if(M===void 0)return $;if(typeof M!=="string"){let q=JSON.parse(JSON.stringify(M));return await W(q,{...F.options,root:{...F.root,result:$}}),q}return await B(M,{root:{...F.root,result:$}})},C=await T(),j=await r();if(!Array.isArray(C))throw new Error('Key "each" requires a source list');if(j===void 0)throw new Error('Key "each" must define a model');if(F.value.extend?.model)j=w.mergeAll([j,...Array.isArray(F.value.extend.model)?F.value.extend.model:[F.value.extend.model]]);let b=[];for(let $=0;$<C.length;$++){let M=JSON.parse(JSON.stringify(j));if(await W(M,{...F.options,root:{...F.root,item:C[$],this:M,index:$}}),F.value.extend?.result)M=w.mergeAll([M,...Array.isArray(F.value.extend?.result)?F.value.extend.result:[Array.isArray(F.value.extend?.result)]]);b.push(await E(M))}return b}}}};import a from"fs/promises";var h=(w)=>w.replace(/((?:[_ ]+)\w|^\w)/g,(F,O)=>O.toUpperCase()).replace(/_/g,""),s=(w)=>h(w).replace(/((?:[ ]+\w)|^\w)/g,(F,O)=>O.toLowerCase()),m=(w,F)=>w.replace(/([a-z])([A-Z])/g,`$1${F}$2`).replace(/\s+/g,F),k=(w,F)=>{switch(F){case"upper":return w.toUpperCase();case"lower":return w.toLowerCase();default:return w}},N=(w)=>{return{include:async(F)=>await w.load(F.args[0],F.args[1]),file:async(F)=>await a.readFile(F.args[0]).then((O)=>O.toString()),env:(F)=>process.env[F.args[0]],len:(F)=>F.args[0].length,reverse:(F)=>F.args[0].split("").reverse().join(""),substring:(F)=>F.args[0].substring(+F.args[1],+F.args[2]),concat:(F)=>F.args.join(""),lower:(F)=>F.args[0].toLowerCase(),upper:(F)=>F.args[0].toUpperCase(),pascal:(F)=>h(F.args[0]),camel:(F)=>s(F.args[0]),snake:(F)=>k(m(F.args[0],"_"),F.args[1]),kebab:(F)=>k(m(F.args[0],"-"),F.args[1]),encode:(F)=>Buffer.from(F.args[0]).toString(F.args[1]??"base64"),decode:(F)=>Buffer.from(F.args[0],F.args[1]??"base64").toString(),uuid:(F)=>crypto.randomUUID(),join:(F)=>{let[O,r,T]=F.args,E=O;if(!Array.isArray(E))throw new Error("Object is not a list");if(r?.length)E=E.map((C)=>B(r,{root:{...F.root,...C},load:(j)=>w.load(j)}));return E.join(T?.replace("\\n",`
3
+ `))},list:(F)=>y(F.args[0],F.args[1]),object:(F)=>R(F.args[0],F.args[1]),default:{processArgs:!1,fn:async(F)=>{let O=F.rawArgs[1]?.value?F.rawArgs[1].quoted?F.rawArgs[1].value:await B(F.rawArgs[1].value,{root:F.root,load:(r)=>w.load(r)}):"";return await B(F.rawArgs[0].value,{root:F.root,load:(r)=>w.load(r),defaultValue:O})}}}};class x{options={load:{dirs:[]},merge:{},include:{},fields:{},includeKey:"includes",mergeKey:".merge",outputs:[]};cache={};includeDirectory(...w){return this.options.load.dirs??=[],this.options.load.dirs.push(...w),this}keys(w){return this.options.fields.keys={...this.options.fields.keys,...w},this}sources(w){return this.options.fields.sources={...this.options.fields.sources,...w},this}variables(w){return this.options.variables={...this.options.variables,...w},this}output(w){return this.options.outputs??=[],this.options.outputs.push(w),this}defaultProcessors(){return this.sources(N(this)).keys(d(this))}alias(w,F){return this.cache[w]=F,this}getAlias(w){return this.cache[w]}getOutputs(){return this.options.outputs??[]}use(w){return w(this),this}filter(w){return this.options.fields.filters??=[],this.options.fields.filters?.push(w),this}async load(w,F,O){if(F&&this.cache[F])return this.cache[F];if(this.cache[w])return this.cache[w];let r=O?[O]:[];this.options.load.dirs&&r.push(...this.options.load.dirs);let T=await I(w,{...this.options.load,dirs:r});if(!T.content)return null;if(F)this.cache[F]=T.content;if(this.options.includeKey&&T.content[this.options.includeKey])await K(T.content[this.options.includeKey],{root:T.folderPath,loaded:(E)=>{if(this.options.mergeKey&&E.content)S(E.content,T.content,{mode:(C,j,b)=>b[this.options.mergeKey],...this.options.merge})},loadOptions:this.options.load,...this.options.include}),delete T.content[this.options.includeKey];return await W(T.content,{...this.options.fields,file:T.fullPath,root:{...this.options.fields.root,...this.options.variables},load:(E)=>this.load(E)}),T.content}merge(w,F){S(w,F,{mode:(O,r,T)=>T[this.options.mergeKey],...this.options.merge})}mergeAll(w){let F={};for(let O of w.toReversed())this.merge(O,F);return F}async writeOutputs(w){if(w?.targetDirectory&&w?.removeFirst)try{await J.rm(w?.targetDirectory,{recursive:!0,force:!0})}catch(F){throw new Error(`Failed to clean the output directory: ${F.message}`)}for(let F of this.getOutputs()){let O=n.join(w?.targetDirectory??".",F.name),r=n.dirname(O);if(w?.writing?.(F)===!1)continue;try{await J.mkdir(r,{recursive:!0})}catch(T){throw new Error(`Failed to create target directory "${r}" for output "${O}": ${T.message}`)}try{switch(F.type){case"yaml":await J.writeFile(O,o.stringify(F.value));break;case"json":await J.writeFile(O,JSON.stringify(F.value));break;default:await J.writeFile(O,F.value.toString())}}catch(T){throw new Error(`Failed to write output "${O}": ${T.message}`)}}}}export{gF as toObjectWithKey,R as toObject,y as toList,B as select,K as processIncludes,W as processFields,Y as navigate,S as merge,I as load,KF as find,x as Objector,U as NavigateResult,A as NavigateAction};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@homedev/objector",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "object extensions for YAML/JSON",
5
5
  "author": "julzor",
6
6
  "license": "ISC",