@homedev/objector 0.1.6 → 0.1.7

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