@homedev/objector 0.1.2 → 0.1.3
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 +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import h from"path";import P from"fs/promises";import Q from"path";import g from"yaml";var r=async(O)=>{try{return await P.access(O,P.constants.R_OK),!0}catch{return!1}},q=async(O,F)=>{let C=await(async()=>{let _=[""];if(!Q.isAbsolute(O)&&F?.dirs)_.push(...F.dirs);for(let $ of _){let B=Q.join($,O);if(await r(B))return Q.resolve(B)}throw new Error(`File not found: "${O}"`)})(),E=await P.readFile(C),M=Q.dirname(C),w={"[.](yml|yaml)$":g.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 R=async(O,F)=>{for(let T of O){let C=F?.root?h.join(F.root,T):T,E=await q(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 A;((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"})(A||={});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 X=async(O,F)=>{let T=async(E)=>{for(let[M,w]of Object.entries(E.value)){let U=await C({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 1:return;case 5:delete E.parent[E.key];return}}},C=async(E)=>{let M=E.key?await F(E):{action:0};if(M.action===0){if(E.value&&typeof E.value==="object"){if(E.key)E.path.push(E.key);if(await T(E),E.key)E.path.pop()}}return M};await C({key:null,value:O,path:[],parent:null})};import v from"yaml";var Y=(O,F="name")=>Object.entries(O).map(([T,C])=>({[F]:T,...C})),EF=(O,F="name")=>Object.fromEntries(O.map((T)=>[T[F],T])),f=(O,F="name")=>Object.fromEntries(O.map((T)=>{let{[F]:C,...E}=T;return[C,E]}));var V=(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};var p=(O,F,T,C)=>{if(F.startsWith("{")){let w=F.substring(1,F.length-1),U=W(T,w,C).toString();return W(O,U,C)}let E=/^\[([^=\]]*)([=]*)([^\]]*)\]$/.exec(F);if(E){let[w,U,j,_]=E;if(Array.isArray(O))switch(j){case"==":case"=":return O.find(($)=>$[U.trim()]==_.trim())}}let M=/^([^[\]]*)\[([^\]]*)]/.exec(F);if(M)return O[M[1]][M[2]];return O[F]},W=(O,F,T)=>{let C=void 0,E=void 0;F??="";let M=($)=>$?.endsWith("?")?[$.substring(0,$.length-1),!0]:[$,!1],w=($,B)=>{let[Z,J]=M(B.pop());if(Z){let K=p($,Z,O,T);if(K===void 0){if(J)return;throw new Error(`Unknown path element: "${Z}" in "${F}"`)}return C=$,E=Z,w(K,B)}if(T?.set&&E)C[E]=T?.set;return $},U=V(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 Y(_,T?.key);case"object":return f(_,T?.key);case"json":return JSON.stringify(_);case"yaml":return v.stringify(_);case"join":{let $=Array.isArray(_)?_:Y(_),[,B,Z]=T?.key?.match(/([^|]*)?(?:\|(.*))?/)??[];return $.map((J)=>B?J[B]:J).join(Z?.replaceAll("\\n",`
|
|
2
2
|
`)??`
|
|
3
|
-
`)}default:return _}};var L=async(O,F,T,C)=>{let E,M=[],w=F;if(!C.sources)return;let U=(j)=>{let _=C.sources[j.key];if(_===void 0)return W(T,j.key);else{if(j.arg&&j.arg[0]==="{")j.arg=W(T,j.arg.substr(1,j.arg.length-2));return _({groups:j,arg:j.arg,path:O,value:w,root:T,key:j.key,options:C})}};if(w=w.replaceAll(C.sourcesMatcher??/\$\((?<key>[^:)]*)(?::(?<arg>[^)]*))?\)/g,(j,..._)=>{if(E)return j;let $=U(_[_.length-1]);if($ instanceof Promise)return`ð[${M.push($)}]ñ`;if(typeof $==="object")return E=$,j;return $??""}),E)w=await E;else if(M.length){let j=await Promise.all(M);w=j.find((_)=>typeof _==="object")??w.replaceAll(/\xf0\[(\d+)]\xf1/g,(_,$)=>j[+$-1])}if(w===null)return b.DeleteParent();if(w===F)return b.Explore();if(w instanceof b)return w;return b.ReplaceItem(w)};var y=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 L(F,O.value,T,C);if($.by)O.value=$.by}else await I(O.value,{...C,filters:[...C.filters??[],...w.filters??[]]});let j={arg: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 I=async(O,F)=>X(O,async(T)=>{let C=[...T.path,T.key].join(".");if(F.filters?.length&&F.filters.some((M)=>M.test(C)))return b.SkipSiblings();let E=async(M)=>{let w=await L(C,M,{...O,...F.root},F);if(w.action===3&&typeof w.by==="string"){let U=await E(w.by);if(U.by)return U}return w};return await y(T,C,{...O,...F.root},F)??(typeof T.value==="string"?await E(T.value):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 W(F.root,E,{format:M,key:w});if(F.async===!1){if(!F.load)throw new Error("No load function defined");return W(F.load(C),E,{format:M,key:w})}else return(F.load??q)(C).then((U)=>W(U,E,{format:M,key:w}))};var KF=async(O,F)=>{let T=[];return await X(O,(C)=>{if(F([...C.path,C.key].join("."),C.value))T.push(C.value);return b.Explore()}),T};import H from"fs/promises";import N from"path";import l from"yaml";import z 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&&z.dirname(F.file))}delete F.parent[F.key]},include:(F)=>O.load(F.value,void 0,F.file&&z.dirname(F.file)),from:async(F)=>{let T=await D(F.value,{root:F.root,load:(C)=>O.load(C,void 0,F.file&&z.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&&z.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&&z.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&&z.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 B=JSON.parse(JSON.stringify($));return await I(B,{...F.options,root:{...F.root,result:_}}),B}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(
|
|
3
|
+
`)}default:return _}};var L=async(O,F,T,C)=>{let E,M=[],w=F;if(!C.sources)return;let U=(j)=>{let _=C.sources[j.key];if(_===void 0)return W(T,j.key);else{if(j.arg&&j.arg[0]==="{")j.arg=W(T,j.arg.substr(1,j.arg.length-2));return _({groups:j,arg:j.arg,path:O,value:w,root:T,key:j.key,options:C})}};if(w=w.replaceAll(C.sourcesMatcher??/\$\((?<key>[^:)]*)(?::(?<arg>[^)]*))?\)/g,(j,..._)=>{if(E)return j;let $=U(_[_.length-1]);if($ instanceof Promise)return`ð[${M.push($)}]ñ`;if(typeof $==="object")return E=$,j;return $??""}),E)w=await E;else if(M.length){let j=await Promise.all(M);w=j.find((_)=>typeof _==="object")??w.replaceAll(/\xf0\[(\d+)]\xf1/g,(_,$)=>j[+$-1])}if(w===null)return b.DeleteParent();if(w===F)return b.Explore();if(w instanceof b)return w;return b.ReplaceItem(w)};var y=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 L(F,O.value,T,C);if($.by)O.value=$.by}else await I(O.value,{...C,filters:[...C.filters??[],...w.filters??[]]});let j={arg: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 I=async(O,F)=>X(O,async(T)=>{let C=[...T.path,T.key].join(".");if(F.filters?.length&&F.filters.some((M)=>M.test(C)))return b.SkipSiblings();let E=async(M)=>{let w=await L(C,M,{...O,...F.root},F);if(w.action===3&&typeof w.by==="string"){let U=await E(w.by);if(U.by)return U}return w};return await y(T,C,{...O,...F.root},F)??(typeof T.value==="string"?await E(T.value):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 W(F.root,E,{format:M,key:w});if(F.async===!1){if(!F.load)throw new Error("No load function defined");return W(F.load(C),E,{format:M,key:w})}else return(F.load??q)(C).then((U)=>W(U,E,{format:M,key:w}))};var KF=async(O,F)=>{let T=[];return await X(O,(C)=>{if(F([...C.path,C.key].join("."),C.value))T.push(C.value);return b.Explore()}),T};import H from"fs/promises";import N from"path";import l from"yaml";import z 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&&z.dirname(F.file))}delete F.parent[F.key]},include:(F)=>O.load(F.value,void 0,F.file&&z.dirname(F.file)),from:async(F)=>{let T=await D(F.value,{root:F.root,load:(C)=>O.load(C,void 0,F.file&&z.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&&z.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&&z.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&&z.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 B=JSON.parse(JSON.stringify($));return await I(B,{...F.options,root:{...F.root,result:_}}),B}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 I($,{...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 n from"fs/promises";var m=(O)=>O.replace(/((?:[_ ]+)\w|^\w)/g,(F,T)=>T.toUpperCase()).replace(/_/g,""),u=(O)=>m(O).replace(/((?:[ ]+\w)|^\w)/g,(F,T)=>T.toLowerCase()),G=(O,F)=>O.replace(/([a-z])([A-Z])/g,`$1${F}$2`).replace(/\s+/g,F),d=(O)=>{return{ref:(F)=>D(F.arg,{root:F.root,load:(T)=>O.load(T)}),include:(F)=>O.load(F.arg),file:(F)=>n.readFile(F.arg).then((T)=>T.toString()),env:(F)=>process.env[F.arg],len:(F)=>F.arg.length,reverse:(F)=>F.arg.split("").reverse().join(""),lower:(F)=>F.arg.toLowerCase(),upper:(F)=>F.arg.toUpperCase(),pascal:(F)=>m(F.arg),camel:(F)=>u(F.arg),snake:(F)=>G(F.arg,"_"),snakeu:(F)=>G(F.arg,"_").toUpperCase(),snakel:(F)=>G(F.arg,"_").toLowerCase(),kebab:(F)=>G(F.arg,"-"),kebabu:(F)=>G(F.arg,"-").toUpperCase(),kebabl:(F)=>G(F.arg,"-").toLowerCase(),encode64:(F)=>Buffer.from(F.arg).toString("base64"),decode64:(F)=>Buffer.from(F.arg,"base64").toString(),uuid:(F)=>crypto.randomUUID()}};class i{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??[]}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 q(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 R(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 I(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 H.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 H.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 H.writeFile(T,l.stringify(F.value));break;case"json":await H.writeFile(T,JSON.stringify(F.value));break;default:await H.writeFile(T,F.value.toString())}}catch(E){throw new Error(`Failed to write output "${T}": ${E.message}`)}}}}export{EF as toObjectWithKey,f as toObject,Y as toList,D as select,R as processIncludes,I as processFields,X as navigate,S as merge,q as load,KF as find,i as Objector,b as NavigateResult,A as NavigateAction};
|