@homedev/objector 0.1.16 → 0.1.18

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