@homedev/objector 0.1.10 → 0.1.11
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.
- package/dist/index.js +2 -2
- package/dist/objector.d.ts +6 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import p from"path";import X from"fs/promises";import H from"path";import v from"yaml";var n=async(O)=>{try{return await X.access(O,X.constants.R_OK),!0}catch{return!1}},I=async(O,F)=>{let r=await(async()=>{let $=[""];if(!H.isAbsolute(O)&&F?.dirs)$.push(...F.dirs);for(let M of $){let P=H.join(M,O);if(await n(P))return H.resolve(P)}throw new Error(`File not found: "${O}"`)})(),w=await X.readFile(r),C=H.dirname(r),E={"[.](yml|yaml)$":v.parse,"[.]json$":JSON.parse,...F?.parsers},j=Object.entries(E).find(($)=>r.match($[0]));if(!j)throw new Error(`Unhandled file type: ${O}`);return{content:j[1](w.toString()),fullPath:r,folderPath:C}};var K=async(O,F)=>{for(let T of O){let r=F?.root?p.join(F.root,T):T,w=await I(r,F?.loadOptions);if(F?.loaded)await F.loaded(w)}};var J=(O,F,T)=>{for(let r of Object.keys(F)){if(O[r]===void 0)continue;let w=F[r],C=O[r];if(typeof C!==typeof w||Array.isArray(C)!==Array.isArray(w)){let j=T?.mismatch?.(r,C,w,O,F);if(j!==void 0){F[r]=j;continue}throw new Error(`Type mismatch: ${r}`)}let E=T?.mode?.(r,C,w,O,F)??"merge";switch(E){case"source":F[r]=C;continue;case"target":continue;case"skip":delete F[r],delete O[r];continue;case"merge":break;default:throw new Error(`Unknown merge mode: ${E}`)}if(typeof C==="object")if(Array.isArray(C))w.push(...C);else{if(T?.navigate?.(r,C,w,O,F)===!1)continue;J(C,w,T)}else{if(C===w)continue;let j=T?.conflict?.(r,C,w,O,F);F[r]=j===void 0?w:j}}for(let r of Object.keys(O))if(F[r]===void 0)F[r]=O[r]};var z;((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"})(z||={});class U{action;by;constructor(O,F){this.action=O;this.by=F}static ReplaceParent(O){return new U(4,O)}static ReplaceItem(O){return new U(3,O)}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 Q=async(O,F)=>{let T=async(w)=>{let C=w.key===null,E=C?{action:0}:await F(w);if(w.value&&typeof w.value==="object"&&E.action==0){if(!C)w.path.push(w.key);if(await r(w),!C)w.path.pop()}return E},r=async(w)=>{for(let[C,E]of Object.entries(w.value)){let j=await T({key:C,value:E,path:w.path,parent:w.value});switch(j.action){case 4:if(!w.key)throw new Error("Cannot replace root");w.parent[w.key]=j.by;return;case 3:w.value[C]=j.by;break;case 5:delete w.parent[w.key];return;case 1:return}}};await T({key:null,value:O,path:[],parent:null})};var f=(O,F,T="(",r=")")=>{let w=0,C="",E=[];for(let j of O){if(C+=j,j===T)w++;if(j===r)w--;if(w===0&&j===F)E.push(C.slice(0,-1)),C=""}if(C)E.push(C);return E},A=(O)=>{let F=/(?:\s*"([^"]*)"\s*|([^",]+))(?:,)?|(,)/g,T=[],r;while((r=F.exec(O))!==null)T.push(r[1]??r[2]?.trim()??"");return T};var S=(O,F,T,r)=>{if(O.startsWith("{")){let w=O.substring(1,O.length-1);return Z(F,w,T).toString()}return r?O:void 0},u=(O,F,T,r)=>{let w=S(F,T,r);if(w)return Z(O,w,r);let C=/^\[([^=\]]*)([=]*)([^\]]*)\]$/.exec(F);if(C){let[j,B,$,M]=C,P=S(B.trim(),T,r,!0),W=S(M.trim(),T,r,!0);if(Array.isArray(O))switch($){case"==":case"=":return O.find((_)=>_[P]==W)}}let E=/^([^[\]]*)\[([^\]]*)]/.exec(F);if(E)return O[E[1]][E[2]];return O[F]},Z=(O,F,T)=>{let r=void 0,w=void 0;F??="";let C=(M)=>M?.endsWith("?")?[M.substring(0,M.length-1),!0]:[M,!1],E=(M,P)=>{let[W,_]=C(P.pop());if(W){let Y=u(M,W,O,T);if(Y===void 0){if(_)return;throw new Error(`Unknown path element: "${W}" in "${F}"`)}return r=M,w=W,E(Y,P)}if(T?.set&&w)r[w]=T?.set;return M},j=f(F,T?.separator??".","{","}"),B=j.length>0&&j[j.length-1].startsWith("?=")?j.pop()?.substring(2):void 0;j.reverse();let $=E(O,j);if($===void 0)return B;return $};var L=(O,F)=>{let T=/^(?<path>[^@>]*)?(?:@(?<from>[^>]*))?$/.exec(O)?.groups;if(!T)throw new Error(`Invalid reference: "${O}"`);let{from:r,path:w}=T;if(!r)return Z(F.root,w);if(F.async===!1){if(!F.load)throw new Error("No load function defined");return Z(F.load(r),w)}else return(F.load??I)(r).then((C)=>Z(C,w))};var D=async(O,F,T,r)=>{let w,C=[],E=F;if(!r.sources)return U.Explore();if(E=E.replaceAll(r.sourcesMatcher??/\$\((?<key>[^:()]+)(?::(?<arg>(?:(?:"[^"]*"|[^",()]*),?)*))?\)/g,(j,...B)=>{if(w)return j;let $=(_)=>{if(_ instanceof Promise)return`ð[${C.push(_)}]ñ`;if(typeof _==="object")return w=_,j;return _??""},M=B[B.length-1],P=r.sources[M.key];if(M.arg===void 0)return $(L(M.key,{root:T,load:r?.load}));if(P===void 0)throw new Error(`Unhandled source type: ${M.key}`);let W=A(M.arg).map((_)=>_.startsWith("{")?L(_.substring(1,_.length-1),{root:T}):_);return $(P({groups:M,args:W,path:O,value:E,root:T,key:M.key,options:r}))}),w)E=await w;else if(C.length){let j=await Promise.all(C);E=j.find((B)=>typeof B==="object")??E.replaceAll(/\xf0\[(\d+)]\xf1/g,(B,$)=>j[+$-1])}if(E===null)return U.DeleteParent();if(E===F)return U.Explore();if(E instanceof U)return E;if(typeof E==="string"){let j=await D(O,E,T,r);if(j.action!==0)return j}return U.ReplaceItem(E)};var g=async(O,F,T,r)=>{if(O.key.startsWith("$"))return U.NoExplore();if(!r.keys)return;let w=(r?.keysMatcher??/^\.(?<key>.*)/).exec(O.key)?.groups;if(w){let C=r.keys[w.key];if(C!==void 0){let E=typeof C==="object"?C:{},j=typeof C==="function"?C:C.fn;if(typeof O.value==="string"){let M=await D(F,O.value,T,r);if(M.by)O.value=M.by}else await b(O.value,{...r,filters:[...r.filters??[],...E.filters??[]]});let B={args:[O.value],groups:w,path:F,value:O.value,root:T,parent:O.parent,key:O.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 b=async(O,F)=>Q(O,async(T)=>{let r=[...T.path,T.key].join(".");if(F.filters?.length&&F.filters.some((w)=>w.test(r)))return U.NoExplore();return await g(T,r,{...O,...F.root},F)??(typeof T.value==="string"?D(r,T.value,{...O,...F.root},F):U.Explore())});var YF=async(O,F)=>{let T=[];return await Q(O,(r)=>{if(F([...r.path,r.key].join("."),r.value))T.push(r.value);return U.Explore()}),T};var R=(O,F="name")=>Object.entries(O).map(([T,r])=>({[F]:T,...r})),zF=(O,F="name")=>Object.fromEntries(O.map((T)=>[T[F],T])),V=(O,F="name")=>Object.fromEntries(O.map((T)=>{let{[F]:r,...w}=T;return[r,w]}));import G from"fs/promises";import N from"path";import s from"yaml";import q from"path";var y=(O)=>{return{load:async(F)=>{for(let{file:T,alias:r}of Array.isArray(F.value)?F.value:[F.value]){if(!T)throw new Error("File reference required");await O.load(T,r??T,F.file&&q.dirname(F.file))}delete F.parent[F.key]},include:(F)=>O.load(F.value,void 0,F.file&&q.dirname(F.file)),from:async(F)=>{let T=await L(F.value,{root:F.root,load:(r)=>O.load(r,void 0,F.file&&q.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 r of Array.isArray(F.value)?F.value:[F.value])T.push(...await L(r,{root:F.root,load:(w)=>O.load(w,void 0,F.file&&q.dirname(F.file))}));return T.filter((r)=>r!==void 0)},extends:async(F)=>{for(let T of Array.isArray(F.value)?F.value:[F.value])O.merge(await L(T,{root:F.root,load:(r)=>O.load(r,void 0,F.file&&q.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],U.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=($)=>L($,{root:F.root,load:(M)=>O.load(M,void 0,F.file&&q.dirname(F.file))}),r=()=>{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},C=async($)=>{let M=F.value.select;if(M===void 0)return $;if(typeof M!=="string"){let P=JSON.parse(JSON.stringify(M));return await b(P,{...F.options,root:{...F.root,result:$}}),P}return await L(M,{root:{...F.root,result:$}})},E=await w(),j=await r();if(!Array.isArray(E))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=O.mergeAll([j,...Array.isArray(F.value.extend.model)?F.value.extend.model:[F.value.extend.model]]);let B=[];for(let $=0;$<E.length;$++){let M=JSON.parse(JSON.stringify(j));if(await b(M,{...F.options,root:{...F.root,item:E[$],this:M,index:$}}),F.value.extend?.result)M=O.mergeAll([M,...Array.isArray(F.value.extend?.result)?F.value.extend.result:[Array.isArray(F.value.extend?.result)]]);B.push(await C(M))}return B}}}};import i from"fs/promises";var k=(O)=>O.replace(/((?:[_ ]+)\w|^\w)/g,(F,T)=>T.toUpperCase()).replace(/_/g,""),l=(O)=>k(O).replace(/((?:[ ]+\w)|^\w)/g,(F,T)=>T.toLowerCase()),m=(O,F)=>O.replace(/([a-z])([A-Z])/g,`$1${F}$2`).replace(/\s+/g,F),d=(O,F)=>{switch(F){case"upper":return O.toUpperCase();case"lower":return O.toLowerCase()}},h=(O)=>{return{include:(F)=>O.load(F.args[0],F.args[1]),file:(F)=>i.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(""),substring:(F)=>F.args[0].substring(+F.args[1],+F.args[2]),lower:(F)=>F.args[0].toLowerCase(),upper:(F)=>F.args[0].toUpperCase(),pascal:(F)=>k(F.args[0]),camel:(F)=>l(F.args[0]),snake:(F)=>d(m(F.args[0],"_"),F.args[1]),kebab:(F)=>d(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[T,r,w]=F.args,C=L(T,{root:F.root,load:(E)=>O.load(E)});if(!Array.isArray(C))throw new Error("Object is not a list");if(r?.length)C=C.map((E)=>L(r,{root:{...F.root,...E},load:(j)=>O.load(j)}));return C.join(w?.replace("\\n",`
|
|
2
|
-
`))},list:(
|
|
1
|
+
import l from"path";import P from"fs/promises";import X from"path";import p from"yaml";var u=async(F)=>{try{return await P.access(F,P.constants.R_OK),!0}catch{return!1}},I=async(F,w)=>{let O=await(async()=>{let $=[""];if(!X.isAbsolute(F)&&w?.dirs)$.push(...w.dirs);for(let M of $){let q=X.join(M,F);if(await u(q))return X.resolve(q)}throw new Error(`File not found: "${F}"`)})(),T=await P.readFile(O),C=X.dirname(O),E={"[.](yml|yaml)$":p.parse,"[.]json$":JSON.parse,...w?.parsers},j=Object.entries(E).find(($)=>O.match($[0]));if(!j)throw new Error(`Unhandled file type: ${F}`);return{content:j[1](T.toString()),fullPath:O,folderPath:C}};var z=async(F,w)=>{for(let r of F){let O=w?.root?l.join(w.root,r):r,T=await I(O,w?.loadOptions);if(w?.loaded)await w.loaded(T)}};var S=(F,w,r)=>{for(let O of Object.keys(w)){if(F[O]===void 0)continue;let T=w[O],C=F[O];if(typeof C!==typeof T||Array.isArray(C)!==Array.isArray(T)){let j=r?.mismatch?.(O,C,T,F,w);if(j!==void 0){w[O]=j;continue}throw new Error(`Type mismatch: ${O}`)}let E=r?.mode?.(O,C,T,F,w)??"merge";switch(E){case"source":w[O]=C;continue;case"target":continue;case"skip":delete w[O],delete F[O];continue;case"merge":break;default:throw new Error(`Unknown merge mode: ${E}`)}if(typeof C==="object")if(Array.isArray(C))T.push(...C);else{if(r?.navigate?.(O,C,T,F,w)===!1)continue;S(C,T,r)}else{if(C===T)continue;let j=r?.conflict?.(O,C,T,F,w);w[O]=j===void 0?T:j}}for(let O of Object.keys(F))if(w[O]===void 0)w[O]=F[O]};var K;((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"})(K||={});class U{action;by;constructor(F,w){this.action=F;this.by=w}static ReplaceParent(F){return new U(4,F)}static ReplaceItem(F){return new U(3,F)}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(F,w)=>{let r=async(T)=>{let C=T.key===null,E=C?{action:0}:await w(T);if(T.value&&typeof T.value==="object"&&E.action==0){if(!C)T.path.push(T.key);if(await O(T),!C)T.path.pop()}return E},O=async(T)=>{for(let[C,E]of Object.entries(T.value)){let j=await r({key:C,value:E,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[C]=j.by;break;case 5:delete T.parent[T.key];return;case 1:return}}};await r({key:null,value:F,path:[],parent:null})};var A=(F,w,r="(",O=")")=>{let T=0,C="",E=[];for(let j of F){if(C+=j,j===r)T++;if(j===O)T--;if(T===0&&j===w)E.push(C.slice(0,-1)),C=""}if(C)E.push(C);return E},g=(F)=>{let w=/(?:\s*"([^"]*)"\s*|([^",]+))(?:,)?|(,)/g,r=[],O;while((O=w.exec(F))!==null)r.push({value:O[1]??O[2]?.trim()??"",quoted:O[1]!==void 0});return r};var f=(F,w,r,O)=>{if(F.startsWith("{")){let T=F.substring(1,F.length-1);return Z(w,T,r).toString()}return O?F:void 0},i=(F,w,r,O)=>{let T=f(w,r,O);if(T)return Z(F,T,O);let C=/^\[([^=\]]*)([=]*)([^\]]*)\]$/.exec(w);if(C){let[j,b,$,M]=C,q=f(b.trim(),r,O,!0),L=f(M.trim(),r,O,!0);if(Array.isArray(F))switch($){case"==":case"=":return F.find((G)=>G[q]==L)}}let E=/^([^[\]]*)\[([^\]]*)]/.exec(w);if(E)return F[E[1]][E[2]];return F[w]},Z=(F,w,r)=>{let O=void 0,T=void 0;w??="";let C=(M)=>M?.endsWith("?")?[M.substring(0,M.length-1),!0]:[M,!1],E=(M,q)=>{let[L,G]=C(q.pop());if(L){let H=i(M,L,F,r);if(H===void 0){if(G||r?.defaultValue!==void 0)return;throw new Error(`Unknown path element: "${L}" in "${w}"`)}return O=M,T=L,E(H,q)}if(r?.set&&T)O[T]=r?.set;return M},j=A(w,r?.separator??".","{","}"),b=j.length>0&&j[j.length-1].startsWith("?=")?j.pop()?.substring(2):void 0;j.reverse();let $=E(F,j);if($===void 0)return b??r?.defaultValue;return $};var B=(F,w)=>{let r=/^(?<path>[^@>]*)?(?:@(?<from>[^>]*))?$/.exec(F)?.groups;if(!r)throw new Error(`Invalid reference: "${F}"`);let{from:O,path:T}=r;if(!O)return Z(w.root,T,{defaultValue:w?.defaultValue});if(w.async===!1){if(!w.load)throw new Error("No load function defined");return Z(w.load(O),T,{defaultValue:w?.defaultValue})}else return(w.load??I)(O).then((C)=>Z(C,T))};var J=async(F,w,r,O)=>{let T,C=[],E=w;if(!O.sources)return U.Explore();if(E=E.replaceAll(O.sourcesMatcher??/\$\((?<key>[^:()]+)(?::(?<arg>(?:(?:"[^"]*"|[^",()]*),?)*))?\)/g,(j,...b)=>{if(T)return j;let $=(_)=>{if(_ instanceof Promise)return`ð[${C.push(_)}]ñ`;if(typeof _==="object")return T=_,j;return _??""},M=b[b.length-1],q=O.sources[M.key];if(M.arg===void 0)return $(B(M.key,{root:r,load:O?.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:r}));return $(L({groups:M,args:v,rawArgs:H,path:F,value:E,root:r,key:M.key,options:O}))}),T)E=await T;else if(C.length){let j=await Promise.all(C);E=j.find((b)=>typeof b==="object")??E.replaceAll(/\xf0\[(\d+)]\xf1/g,(b,$)=>j[+$-1])}if(E===null)return U.DeleteParent();if(E===w)return U.Explore();if(E instanceof U)return E;if(typeof E==="string"){let j=await J(F,E,r,O);if(j.action!==0)return j}return U.ReplaceItem(E)};var V=async(F,w,r,O)=>{if(F.key.startsWith("$"))return U.NoExplore();if(!O.keys)return;let T=(O?.keysMatcher??/^\.(?<key>.*)/).exec(F.key)?.groups;if(T){let C=O.keys[T.key];if(C!==void 0){let E=typeof C==="object"?C:{},j=typeof C==="function"?C:C.fn;if(typeof F.value==="string"){let M=await J(w,F.value,r,O);if(M.by)F.value=M.by}else await W(F.value,{...O,filters:[...O.filters??[],...E.filters??[]]});let b={args:[F.value],rawArgs:[],groups:T,path:w,value:F.value,root:r,parent:F.parent,key:F.key,file:O?.file,options:O},$=await j(b);if($ instanceof U)return $;if($===null)return U.DeleteParent();if($===void 0)return U.Explore();return U.ReplaceParent($)}}};var W=async(F,w)=>Y(F,async(r)=>{let O=[...r.path,r.key].join(".");if(w.filters?.length&&w.filters.some((T)=>T.test(O)))return U.NoExplore();return await V(r,O,{...F,...w.root},w)??(typeof r.value==="string"?J(O,r.value,{...F,...w.root},w):U.Explore())});var zw=async(F,w)=>{let r=[];return await Y(F,(O)=>{if(w([...O.path,O.key].join("."),O.value))r.push(O.value);return U.Explore()}),r};var y=(F,w="name")=>Object.entries(F).map(([r,O])=>({[w]:r,...O})),Aw=(F,w="name")=>Object.fromEntries(F.map((r)=>[r[w],r])),R=(F,w="name")=>Object.fromEntries(F.map((r)=>{let{[w]:O,...T}=r;return[O,T]}));import Q from"fs/promises";import n from"path";import o from"yaml";import D from"path";var d=(F)=>{return{load:async(w)=>{for(let{file:r,alias:O}of Array.isArray(w.value)?w.value:[w.value]){if(!r)throw new Error("File reference required");await F.load(r,O??r,w.file&&D.dirname(w.file))}delete w.parent[w.key]},include:(w)=>F.load(w.value,void 0,w.file&&D.dirname(w.file)),from:async(w)=>{let r=await B(w.value,{root:w.root,load:(O)=>F.load(O,void 0,w.file&&D.dirname(w.file))});if(w.parent.content){if(Array.isArray(w.parent.content)&&Array.isArray(r))return[...r,...w.parent.content];return F.merge(r,w.parent.content),w.parent.content}return r},concat:async(w)=>{let r=[];for(let O of Array.isArray(w.value)?w.value:[w.value])r.push(...await B(O,{root:w.root,load:(T)=>F.load(T,void 0,w.file&&D.dirname(w.file))}));return r.filter((O)=>O!==void 0)},extends:async(w)=>{for(let r of Array.isArray(w.value)?w.value:[w.value])F.merge(await B(r,{root:w.root,load:(O)=>F.load(O,void 0,w.file&&D.dirname(w.file))}),w.parent);delete w.parent[w.key]},alias:(w)=>{F.alias(w.value,w.parent),delete w.parent[w.key]},if:(w)=>{if(!w.value)return null;delete w.parent[w.key]},skip:(w)=>{return delete w.parent[w.key],U.SkipSiblings()},output:(w)=>{delete w.parent[w.key];for(let r of Array.isArray(w.value)?w.value:[w.value])if(typeof r==="string")F.output({name:r,value:w.parent});else F.output({...r,value:r.value??w.parent})},each:{filters:[/select|model/],fn:async(w)=>{delete w.parent[w.key];let r=($)=>B($,{root:w.root,load:(M)=>F.load(M,void 0,w.file&&D.dirname(w.file))}),O=()=>{if(typeof w.value==="string"||!w.value.model)return w.parent;if(typeof w.value.model==="string")return r(w.value.model);return w.value.model},T=()=>{if(typeof w.value==="string")return r(w.value);if(Array.isArray(w.value))return w.value;if(typeof w.value.from==="string")return r(w.value.from);return w.value.from},C=async($)=>{let M=w.value.select;if(M===void 0)return $;if(typeof M!=="string"){let q=JSON.parse(JSON.stringify(M));return await W(q,{...w.options,root:{...w.root,result:$}}),q}return await B(M,{root:{...w.root,result:$}})},E=await T(),j=await O();if(!Array.isArray(E))throw new Error('Key "each" requires a source list');if(j===void 0)throw new Error('Key "each" must define a model');if(w.value.extend?.model)j=F.mergeAll([j,...Array.isArray(w.value.extend.model)?w.value.extend.model:[w.value.extend.model]]);let b=[];for(let $=0;$<E.length;$++){let M=JSON.parse(JSON.stringify(j));if(await W(M,{...w.options,root:{...w.root,item:E[$],this:M,index:$}}),w.value.extend?.result)M=F.mergeAll([M,...Array.isArray(w.value.extend?.result)?w.value.extend.result:[Array.isArray(w.value.extend?.result)]]);b.push(await C(M))}return b}}}};import a from"fs/promises";var h=(F)=>F.replace(/((?:[_ ]+)\w|^\w)/g,(w,r)=>r.toUpperCase()).replace(/_/g,""),s=(F)=>h(F).replace(/((?:[ ]+\w)|^\w)/g,(w,r)=>r.toLowerCase()),m=(F,w)=>F.replace(/([a-z])([A-Z])/g,`$1${w}$2`).replace(/\s+/g,w),k=(F,w)=>{switch(w){case"upper":return F.toUpperCase();case"lower":return F.toLowerCase()}},N=(F)=>{return{include:async(w)=>await F.load(w.args[0],w.args[1]),file:async(w)=>await a.readFile(w.args[0]).then((r)=>r.toString()),env:(w)=>process.env[w.args[0]],len:(w)=>w.args[0].length,reverse:(w)=>w.args[0].split("").reverse().join(""),substring:(w)=>w.args[0].substring(+w.args[1],+w.args[2]),concat:(w)=>w.args.join(""),lower:(w)=>w.args[0].toLowerCase(),upper:(w)=>w.args[0].toUpperCase(),pascal:(w)=>h(w.args[0]),camel:(w)=>s(w.args[0]),snake:(w)=>k(m(w.args[0],"_"),w.args[1]),kebab:(w)=>k(m(w.args[0],"-"),w.args[1]),encode:(w)=>Buffer.from(w.args[0]).toString(w.args[1]??"base64"),decode:(w)=>Buffer.from(w.args[0],w.args[1]??"base64").toString(),uuid:(w)=>crypto.randomUUID(),join:(w)=>{let[r,O,T]=w.args,C=B(r,{root:w.root,load:(E)=>F.load(E)});if(!Array.isArray(C))throw new Error("Object is not a list");if(O?.length)C=C.map((E)=>B(O,{root:{...w.root,...E},load:(j)=>F.load(j)}));return C.join(T?.replace("\\n",`
|
|
2
|
+
`))},list:async(w)=>y(await B(w.args[0],{root:w.root,load:(r)=>F.load(r)}),w.args[1]),object:async(w)=>R(await B(w.args[0],{root:w.root,load:(r)=>F.load(r)}),w.args[1]),default:{processArgs:!1,fn:async(w)=>{let r=w.rawArgs[1]?.value?w.rawArgs[1].quoted?w.rawArgs[1].value:await B(w.rawArgs[1].value,{root:w.root,load:(O)=>F.load(O)}):"";return await B(w.rawArgs[0].value,{root:w.root,load:(O)=>F.load(O),defaultValue:r})}}}};class x{options={load:{dirs:[]},merge:{},include:{},fields:{},includeKey:"includes",mergeKey:".merge",outputs:[]};cache={};includeDirectory(...F){return this.options.load.dirs??=[],this.options.load.dirs.push(...F),this}keys(F){return this.options.fields.keys={...this.options.fields.keys,...F},this}sources(F){return this.options.fields.sources={...this.options.fields.sources,...F},this}variables(F){return this.options.variables={...this.options.variables,...F},this}output(F){return this.options.outputs??=[],this.options.outputs.push(F),this}defaultProcessors(){return this.sources(N(this)).keys(d(this))}alias(F,w){return this.cache[F]=w,this}getAlias(F){return this.cache[F]}getOutputs(){return this.options.outputs??[]}use(F){return F(this),this}filter(F){return this.options.fields.filters??=[],this.options.fields.filters?.push(F),this}async load(F,w,r){if(w&&this.cache[w])return this.cache[w];if(this.cache[F])return this.cache[F];let O=r?[r]:[];this.options.load.dirs&&O.push(...this.options.load.dirs);let T=await I(F,{...this.options.load,dirs:O});if(!T.content)return null;if(w)this.cache[w]=T.content;if(this.options.includeKey&&T.content[this.options.includeKey])await z(T.content[this.options.includeKey],{root:T.folderPath,loaded:(C)=>{if(this.options.mergeKey&&C.content)S(C.content,T.content,{mode:(E,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:(C)=>this.load(C)}),T.content}merge(F,w){S(F,w,{mode:(r,O,T)=>T[this.options.mergeKey],...this.options.merge})}mergeAll(F){let w={};for(let r of F.toReversed())this.merge(r,w);return w}async writeOutputs(F){if(F?.targetDirectory&&F?.removeFirst)try{await Q.rm(F?.targetDirectory,{recursive:!0,force:!0})}catch(w){throw new Error(`Failed to clean the output directory: ${w.message}`)}for(let w of this.getOutputs()){let r=n.join(F?.targetDirectory??".",w.name),O=n.dirname(r);if(F?.writing?.(w)===!1)continue;try{await Q.mkdir(O,{recursive:!0})}catch(T){throw new Error(`Failed to create target directory "${O}" for output "${r}": ${T.message}`)}try{switch(w.type){case"yaml":await Q.writeFile(r,o.stringify(w.value));break;case"json":await Q.writeFile(r,JSON.stringify(w.value));break;default:await Q.writeFile(r,w.value.toString())}}catch(T){throw new Error(`Failed to write output "${r}": ${T.message}`)}}}}export{Aw 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,zw as find,x as Objector,U as NavigateResult,K as NavigateAction};
|
package/dist/objector.d.ts
CHANGED
|
@@ -11,6 +11,10 @@ export declare interface FieldContext {
|
|
|
11
11
|
value: any;
|
|
12
12
|
key: string;
|
|
13
13
|
args: string[];
|
|
14
|
+
rawArgs: {
|
|
15
|
+
value: string;
|
|
16
|
+
quoted: boolean;
|
|
17
|
+
}[];
|
|
14
18
|
groups: Record<string, string>;
|
|
15
19
|
path: string;
|
|
16
20
|
root: any;
|
|
@@ -26,6 +30,7 @@ export declare type FieldProcessorMap = Record<string, FieldProcessorFunc | Fiel
|
|
|
26
30
|
export declare interface FieldProcessorOptions {
|
|
27
31
|
fn: FieldProcessorFunc;
|
|
28
32
|
filters?: RegExp[];
|
|
33
|
+
processArgs?: boolean;
|
|
29
34
|
}
|
|
30
35
|
|
|
31
36
|
/**
|
|
@@ -193,6 +198,7 @@ export declare const select: (at: string, options: {
|
|
|
193
198
|
root?: any;
|
|
194
199
|
load?: (from: string) => Promise<any>;
|
|
195
200
|
async?: boolean;
|
|
201
|
+
defaultValue?: any;
|
|
196
202
|
}) => any;
|
|
197
203
|
|
|
198
204
|
export declare const toList: <T>(from: any, key?: string) => T[];
|