ec.fdk 0.9.2 → 0.9.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.
Files changed (3) hide show
  1. package/README.md +4 -0
  2. package/dist/cli.cjs +23 -20
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -220,6 +220,7 @@ ec.fdk <command> [options]
220
220
  | -------------- | ------------------------- | -------------- |
221
221
  | `login` | Login via browser (OIDC). Use `--password` for email/password prompt. | — |
222
222
  | `logout` | Logout and remove stored token | — |
223
+ | `whoami` | Show current logged-in user | — |
223
224
  | `resourceList` | List any resource type | `--resource`, `-f` for query params |
224
225
  | `resourceGet` | Get a single resource | `--resource`, `-f` for identifying params |
225
226
  | `resourceEdit` | Edit a single resource | `--resource`, `-f` for identifying params, `--data` |
@@ -299,6 +300,9 @@ ec.fdk login -e stage --password
299
300
  # Logout
300
301
  ec.fdk logout -e stage
301
302
 
303
+ # Show current user
304
+ ec.fdk whoami -e stage
305
+
302
306
  # List datamanagers
303
307
  ec.fdk dmList -e stage
304
308
 
package/dist/cli.cjs CHANGED
@@ -1,17 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";const de=require("node:util"),ue=require("node:module"),$=require("node:fs"),W=require("node:path"),le=require("node:os"),fe=require("node:readline"),L=require("node:crypto"),ge=require("node:http"),me=require("node:child_process");async function u(t,e={},n={}){const{token:r,rawRes:a}=e;r&&(n.headers={...n.headers||{},Authorization:`Bearer ${r}`});const o=await fetch(t,n);if(!o.ok){if(o.headers.get("content-type")?.includes("application/json")){const i=await o.json(),c=`${i.title}
3
3
  ${i.detail}
4
- ${i.verbose}`;throw new Error(c)}throw new Error(`unexpected fetch error: ${o.statusText}`)}if(a)return o;if(o.status===204)return;const s=await o.text();return s?JSON.parse(s):void 0}const q={datamanager:{live:"https://datamanager.entrecode.de/",stage:"https://datamanager.cachena.entrecode.de/"},accounts:{live:"https://accounts.entrecode.de/",stage:"https://accounts.cachena.entrecode.de/"},appserver:{live:"https://appserver.entrecode.de/",stage:"https://appserver.cachena.entrecode.de/"},"dm-history":{live:"https://dm-history.entrecode.de/",stage:"https://dm-history.cachena.entrecode.de/"}};function g(t,e="stage",n="datamanager"){const r=q[n];if(!r)throw new Error(`subdomain "${n}" not found. Try one of ${Object.keys(q).join(", ")}`);const a=r[e];if(!a)throw new Error(`env "${e}" not found. Try one of ${Object.keys(r[e]).join(", ")}`);return a+t}function h(t,e=!0){return Object.entries(t).sort((n,r)=>n[0].localeCompare(r[0])).map(([n,r])=>`${n}=${r}`).join("&")}function d(t){Object.entries(t).forEach(([e,n])=>{if(n===void 0)throw new Error(`expected ${e} to be set!`)})}const X={stage:"https://accounts.cachena.entrecode.de/",live:"https://accounts.entrecode.de/"};async function he(t){let{env:e,dmShortID:n,email:r,password:a}=t;d({env:e,dmShortID:n,email:r,password:a});const o=g(`api/${n}/_auth/login?clientID=rest`,e);return await u(o,{},{method:"POST",body:JSON.stringify({email:r,password:a}),headers:{"Content-Type":"application/json"}})}async function pe(t){let{env:e,email:n,password:r}=t;d({env:e,email:n,password:r});const a=`${X[e]}auth/login?clientID=rest`;return await u(a,{},{method:"POST",body:JSON.stringify({email:n,password:r}),headers:{"Content-Type":"application/json"}})}async function ye(t){let{dmShortID:e,env:n,token:r}=t;d({dmShortID:e,env:n,token:r});const a=g(`api/${e}/_auth/logout?clientID=rest&token=${r}`,n);return await u(a,{rawRes:!0},{method:"POST"})}async function we(t){let{env:e,token:n}=t;d({env:e,token:n});const r=`${X[e]}auth/logout?clientID=rest`;return await u(r,{rawRes:!0,token:n},{method:"POST"})}function ke({dmShortID:t}){return d({dmShortID:t}),t}function De({env:t}){return d({env:t}),t}let Te=["created","creator","id","modified","private","_created","_creator","_embedded","_entryTitle","_id","_links","_modelTitle","_modelTitleField","_modified"];function Q(t){let e={};for(let n in t)Te.includes(n)||(e[n]=t[n]);return e}function be(t){return JSON.parse(JSON.stringify(t))}async function $e(t){let{env:e,dmShortID:n}=t;d({env:e,dmShortID:n});const r=g(`api/${n}`,e);return u(r,t)}async function Z(t){let{env:e,dmShortID:n,model:r,options:a={}}=t;d({env:e,dmShortID:n,model:r}),a={size:50,page:1,_list:!0,...a};const o=h(a),s=g(`api/${n}/${r}?${o}`,e),{count:i,total:c,_embedded:l}=await u(s,t);let m=l?l[`${n}:${r}`]:[];return m=Array.isArray(m)?m:[m],{count:i,total:c,items:m}}function Ee({env:t,dmShortID:e,model:n,entryID:r,token:a}){d({env:t,dmShortID:e,model:n,entryID:r});const o=h({_id:r}),s=g(`api/${e}/${n}?${o}`,t);return u(s,{token:a})}async function ve({env:t,dmShortID:e,model:n,value:r,token:a}){d({env:t,dmShortID:e,model:n,value:r});const o=g(`api/${e}/${n}`,t);return await u(o,{token:a},{method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}})}async function ee({env:t,dmShortID:e,model:n,entryID:r,value:a,token:o,safePut:s=!1}){d({env:t,dmShortID:e,model:n,entryID:r,value:a});const i={"Content-Type":"application/json"};if(s){if(!("_modified"in a))throw new Error("expected _modified to be set!");i["If-Unmodified-Since"]=new Date(a._modified).toUTCString()}const c=g(`api/${e}/${n}?_id=${r}`,t);return a=be(a),a=Q(a),await u(c,{token:o},{method:"PUT",headers:i,body:JSON.stringify(a)})}function te({env:t,dmShortID:e,model:n,entryID:r,token:a}){d({env:t,dmShortID:e,model:n,entryID:r});const o=g(`api/${e}/${n}?_id=${r}`,t);return u(o,{token:a,rawRes:!0},{method:"DELETE",headers:{"Content-Type":"application/json"}})}async function Ae(t,e){let{env:n,dmShortID:r,model:a,options:o={}}=t;d({env:n,dmShortID:r,model:a}),t.options={size:50,page:1,_list:!0,...o};let s=0,i,c=[];for(;i===void 0||s<i;){const l=await Z(t);for(let m of l.items)c.push(await e(m));s+=l.items.length,i=l.total,t.options.page++}return c}async function Ie({env:t,dmShortID:e,model:n,withMetadata:r}){d({env:t,dmShortID:e,model:n});const a=g(`api/schema/${e}/${n}`,t),o=await u(a),s=o?.allOf?.[1];if(typeof s.properties!="object")throw new Error(`getSchema: ${a} returned unexpected format: ${JSON.stringify(o)}`);const{properties:i}=s,c=Q(i);for(let l in c){let m=c[l];if(m.required=s.required.includes(l),c[l]?.oneOf&&delete c[l]?.oneOf,m.title?.includes("<")&&m.title?.includes(">")){const w=m.title.split("<")[1].slice(0,-1),k=m.title.split("<")[0];m.type=k,w.includes(":")?m.resource=w.split(":")[1]:m.resource=w}else["asset","entry","assets","entries"].includes(m.title)?(m.type=m.title,m.resource=null):m.type=m.title;delete c[l].title}if(r){const l=i._modelTitle.title,m=i._modelTitleField.title;return{properties:c,meta:{modelTitleField:m,modelTitle:l}}}return c}function ne(t){return Object.entries(t).map(([e,n])=>typeof n!="object"?{[e]:String(n)}:{...n.sort&&{sort:Array.isArray(n)?n.join(","):n},...n.search&&{[e+"~"]:n.search},...n.notNull&&{[e+"!"]:""},...n.null&&{[e]:""},...n.any&&{[e]:n.any.join(",")},...n.from&&{[e+"From"]:n.from},...n.to&&{[e+"To"]:n.to}}).reduce((e,n)=>({...e,...n}),{})}const Se=ne;function R(t){return t._links.collection.href.split("/").slice(-2)[0]}function re(t){const e=t._links.collection.href.split("api/")[0];return Object.keys(q.datamanager).find(r=>q.datamanager[r]===e)}const ae=t=>{const e=R(t),n=re(t),r=t._modelTitle,a=t.id;return{dmShortID:e,env:n,model:r,entryID:a}},qe=t=>te(ae(t)),Oe=(t,e)=>ee({...ae(t),value:e});function _e(t,e){const n=R(e);return e._embedded[`${n}:${e._modelTitle}/${t}/asset`]}async function Ce({env:t,dmShortID:e,assetGroup:n,assetID:r,token:a}){d({env:t,dmShortID:e,assetGroup:n,assetID:r});const o=h({assetID:r}),s=g(`a/${e}/${n}?${o}`,t),{_embedded:i}=await u(s,{token:a});return i?i["ec:dm-asset"]:void 0}async function Ue(t){let{env:e,dmShortID:n,assetGroup:r,token:a,options:o={}}=t;d({env:e,dmShortID:n,assetGroup:r}),o={size:50,page:1,_list:!0,...o};const s=h(o),i=g(`a/${n}/${r}?${s}`,e),{count:c,total:l,_embedded:m}=await u(i,{token:a});let w=m?m["ec:dm-asset"]:[];return w=Array.isArray(w)?w:[w],{count:c,total:l,items:w}}async function Me({env:t,dmShortID:e,assetGroup:n,token:r,file:a,name:o,options:s}){d({env:t,dmShortID:e,assetGroup:n,file:a});const i=g(`a/${e}/${n}`,t),c=new FormData;return c.append("file",a,o),s&&Object.keys(s).forEach(m=>{c.append(m,s[m])}),(await u(i,{token:r},{method:"POST",body:c}))._embedded["ec:dm-asset"]}async function Le({env:t,dmShortID:e,assetGroup:n,files:r,options:a}){d({env:t,dmShortID:e,assetGroup:n,files:r});const o=g(`a/${e}/${n}`,t),s=new FormData;r.forEach(c=>{s.append("file",c)}),a&&Object.keys(a).forEach(c=>{s.append(c,a[c])});const i=await u(o,{},{method:"POST",body:s});return Array.isArray(i._embedded["ec:dm-asset"])?i._embedded["ec:dm-asset"]:[i._embedded["ec:dm-asset"]]}async function Re({env:t,dmShortID:e,assetGroup:n,assetID:r,token:a}){d({env:t,dmShortID:e,assetGroup:n,assetID:r});const o=g(`a/${e}/${n}/${r}`,t);await u(o,{token:a,rawRes:!0},{method:"DELETE"})}function Pe(t,e,n=!1){let r,a;return(n?t?.thumbnails:t?.fileVariants)?.forEach(s=>{const{resolution:{width:i,height:c}}=s,l=Math.abs(Math.max(i,c)-e);(!a||l<a)&&(a=l,r=s)}),r?.url??t?.file?.url??null}function Ge(t="stage",e,n,r,a=!1){const o=Math.max(r.file.resolution.width,r.file.resolution.height),s=n.filter(c=>c<o),i=`https://datamanager${t==="stage"?".cachena":""}.entrecode.de`;return a?s.map(c=>{const l=r.thumbnails.find(k=>c===k.dimension),m=`${i}/t/${e}/${r.assetID}/${c}`,w=l?l.url:m;return{size:c,url:w,generated:l}}):s.map(c=>{const l=r.fileVariants.find(k=>c===Math.max(k.resolution.width,k.resolution.height)),m=`${i}/f/${e}/${r.assetID}/${c}`,w=l?l.url:m;return{size:c,url:w,generated:l}})}const p={"Content-Type":"application/json"};async function Be(t){let{env:e,dmID:n,token:r}=t;d({env:e,dmID:n});const a=g(`?dataManagerID=${n}`,e);return u(a,{token:r})}async function Ne(t){let{env:e,options:n={}}=t;d({env:e}),n={size:25,page:1,_list:!0,...n};const r=h(n),a=g(`?${r}`,e),{count:o,total:s,_embedded:i}=await u(a,t);let c=i?i["ec:datamanager"]:[];return c=Array.isArray(c)?c:[c],{count:o,total:s,items:c}}async function je(t){let{env:e,dmID:n,options:r={}}=t;d({env:e,dmID:n}),r={size:25,dataManagerID:n,page:1,_list:!0,...r};const a=h(r),o=g(`model?${a}`,e),{count:s,total:i,_embedded:c}=await u(o,t);let l=c?c["ec:model"]:[];return l=Array.isArray(l)?l:[l],{count:s,total:i,items:l}}async function xe(t){let{env:e,resource:n,options:r={},subdomain:a="datamanager"}=t;d({env:e,subdomain:a,resource:n}),r={size:25,page:1,_list:!0,...r};const o=h(r),s=g(`${n}?${o}`,e,a),{count:i,total:c,_embedded:l}=await u(s,t);let m=l?l[Object.keys(l)[0]]:[];return m=Array.isArray(m)?m:[m],{count:i,total:c,items:m}}async function Je(t){let{env:e,resource:n,options:r={},subdomain:a="datamanager"}=t;d({env:e,subdomain:a,resource:n});const o=h(r),s=g(`${n}?${o}`,e,a);return u(s,t)}async function Fe(t){let{env:e,resource:n,options:r={},subdomain:a="datamanager",value:o}=t;d({env:e,subdomain:a,resource:n,value:o});const s=h(r),i=g(`${n}?${s}`,e,a);return u(i,t,{method:"PUT",body:JSON.stringify(o),headers:p})}async function He(t){let{env:e,resource:n,options:r={},subdomain:a="datamanager"}=t;d({env:e,subdomain:a,resource:n});const o=h(r),s=g(`${n}?${o}`,e,a);return u(s,{...t,rawRes:!0},{method:"DELETE",headers:p})}async function ze(t,e={}){let{env:n,route:r,options:a={},subdomain:o="datamanager"}=t;d({env:n,subdomain:o,route:r}),a={...a};const s=h(a),i=g(`${r}?${s}`,n,o);return u(i,t,e)}async function Ke(t){let{env:e,token:n,value:r}=t;d({env:e,value:r});const a=g("",e);return u(a,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function Ve(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const o=h({dataManagerID:r}),s=g(`?${o}`,e);return u(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function Ye(t){let{env:e,token:n,dmID:r}=t;d({env:e,dmID:r});const a=h({dataManagerID:r}),o=g(`?${a}`,e);return u(o,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function We(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const o=h({dataManagerID:r}),s=g(`model?${o}`,e);return u(s,{token:n},{method:"POST",body:JSON.stringify(a),headers:p})}async function Xe(t){let{env:e,token:n,dmID:r,modelID:a,value:o}=t;d({env:e,dmID:r,modelID:a,value:o});const s=h({dataManagerID:r,modelID:a}),i=g(`model?${s}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function Qe(t){let{env:e,token:n,dmID:r,modelID:a}=t;d({env:e,dmID:r,modelID:a});const o=h({dataManagerID:r,modelID:a}),s=g(`model?${o}`,e);return u(s,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Ze(t){let{env:e,token:n,value:r}=t;d({env:e,value:r});const a=g("template",e);return u(a,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function et(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const o=h({dataManagerID:r}),s=g(`assetgroup?${o}`,e);return u(s,{token:n},{method:"POST",body:JSON.stringify(a),headers:p})}async function tt(t){let{env:e,token:n,dmID:r,assetGroupID:a,value:o}=t;d({env:e,dmID:r,assetGroupID:a,value:o});const s=h({dataManagerID:r,assetGroupID:a}),i=g(`assetgroup?${s}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function nt(t){let{env:e,token:n,dmShortID:r,assetGroup:a,assetID:o,value:s}=t;d({env:e,dmShortID:r,assetGroup:a,assetID:o,value:s});const i=g(`a/${r}/${a}/${o}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function rt(t){let{env:e,token:n,dmID:r,clientID:a,value:o}=t;d({env:e,dmID:r,clientID:a,value:o});const s=h({dataManagerID:r,clientID:a}),i=g(`client?${s}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function at(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const o=h({dataManagerID:r}),s=g(`role?${o}`,e);return u(s,{token:n},{method:"POST",body:JSON.stringify(a),headers:p})}async function ot(t){let{env:e,token:n,dmID:r,roleID:a,value:o}=t;d({env:e,dmID:r,roleID:a,value:o});const s=h({dataManagerID:r,roleID:a}),i=g(`role?${s}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function it(t){let{env:e,token:n,dmID:r,roleID:a}=t;d({env:e,dmID:r,roleID:a});const o=h({dataManagerID:r,roleID:a}),s=g(`role?${o}`,e);return u(s,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function st(t){let{env:e,token:n,dmID:r,accountID:a,value:o}=t;d({env:e,dmID:r,accountID:a,value:o});const s=h({dataManagerID:r,accountID:a}),i=g(`account?${s}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function ct(t){let{env:e,token:n,dmID:r,accountID:a}=t;d({env:e,dmID:r,accountID:a});const o=h({dataManagerID:r,accountID:a}),s=g(`account?${o}`,e);return u(s,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function dt(t){let{env:e,token:n,options:r={}}=t;d({env:e});const a=h(r),o=g(`stats?${a}`,e);return u(o,{token:n})}async function ut(t){let{env:e,token:n,options:r={}}=t;d({env:e});const a=h(r),o=g(`entries?${a}`,e,"dm-history");return u(o,{token:n})}async function lt(t){let{env:e,token:n,value:r}=t;d({env:e,value:r});const a=g("client",e,"accounts");return u(a,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function ft(t){let{env:e,token:n,clientID:r,value:a}=t;d({env:e,clientID:r,value:a});const o=h({clientID:r}),s=g(`client?${o}`,e,"accounts");return u(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function gt(t){let{env:e,token:n,clientID:r}=t;d({env:e,clientID:r});const a=h({clientID:r}),o=g(`client?${a}`,e,"accounts");return u(o,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function mt(t){let{env:e,token:n,value:r}=t;d({env:e,value:r});const a=g("group",e,"accounts");return u(a,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function ht(t){let{env:e,token:n,groupID:r,value:a}=t;d({env:e,groupID:r,value:a});const o=h({groupID:r}),s=g(`group?${o}`,e,"accounts");return u(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function pt(t){let{env:e,token:n,groupID:r}=t;d({env:e,groupID:r});const a=h({groupID:r}),o=g(`group?${a}`,e,"accounts");return u(o,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function yt(t){let{env:e,token:n,value:r}=t;d({env:e,value:r});const a=g("invite",e,"accounts"),o=await u(a,{token:n},{method:"POST",body:JSON.stringify(r),headers:p});return o?._embedded?.["ec:invite"]??o}async function wt(t){let{env:e,token:n,inviteID:r,value:a}=t;d({env:e,inviteID:r,value:a});const o=h({invite:r}),s=g(`invite?${o}`,e,"accounts");return u(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function kt(t){let{env:e,token:n,inviteID:r}=t;d({env:e,inviteID:r});const a=h({invite:r}),o=g(`invite?${a}`,e,"accounts");return u(o,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Dt(t){let{env:e,token:n,accountID:r,value:a}=t;d({env:e,accountID:r,value:a});const o=h({accountID:r}),s=g(`account?${o}`,e,"accounts");return u(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function Tt(t){let{env:e,token:n,accountID:r}=t;d({env:e,accountID:r});const a=h({accountID:r}),o=g(`account/tokens?${a}`,e,"accounts");let i=(await u(o,{token:n}))?._embedded?.["ec:account/token"]??[];return Array.isArray(i)?i:[i]}async function bt(t){let{env:e,token:n,accountID:r}=t;d({env:e,accountID:r});const a=h({accountID:r}),o=g(`account/tokens?${a}`,e,"accounts");return u(o,{token:n},{method:"POST",headers:p})}async function $t(t){let{env:e,token:n,accountID:r,accessTokenID:a}=t;d({env:e,accountID:r,accessTokenID:a});const o=h({accessTokenID:a,accountID:r}),s=g(`account/tokens?${o}`,e,"accounts");return u(s,{token:n,rawRes:!0},{method:"DELETE",headers:p})}const Et=Object.freeze(Object.defineProperty({__proto__:null,assetList:Ue,createAccountClient:lt,createAsset:Me,createAssetGroup:et,createAssets:Le,createDatamanager:Ke,createEntry:ve,createGroup:mt,createInvite:yt,createModel:We,createRole:at,createTemplate:Ze,createToken:bt,deleteAccountClient:gt,deleteAsset:Re,deleteDatamanager:Ye,deleteDmAccount:ct,deleteEntry:te,deleteEntryObject:qe,deleteGroup:pt,deleteInvite:kt,deleteModel:Qe,deleteRole:it,deleteToken:$t,dmList:Ne,editAccount:Dt,editAccountClient:ft,editAsset:nt,editAssetGroup:tt,editDatamanager:Ve,editDmAccount:st,editDmClient:rt,editEntry:ee,editEntryObject:Oe,editGroup:ht,editInvite:wt,editModel:Xe,editRole:ot,entryList:Z,fileVariant:Pe,filterOptions:Se,getAsset:Ce,getDatamanager:Be,getEcAuthKey:De,getEntry:Ee,getEntryAsset:_e,getEntryEnv:re,getEntryShortID:R,getFileVariants:Ge,getHistory:ut,getPublicAuthKey:ke,getSchema:Ie,getStats:dt,listTokens:Tt,loginEc:pe,loginPublic:he,logoutEc:we,logoutPublic:ye,mapEntries:Ae,modelList:je,publicApi:$e,raw:ze,resourceDelete:He,resourceEdit:Fe,resourceGet:Je,resourceList:xe,sdkOptions:ne},Symbol.toStringTag,{value:"Module"})),{entryList:j,mapEntries:vt,getEntry:At,getAsset:It,assetList:x,createAsset:St,createAssets:qt,deleteAsset:Ot,createEntry:_t,editEntry:J,deleteEntry:Ct,getSchema:Ut,loginPublic:Mt,loginEc:Lt,logoutEc:Rt,logoutPublic:Pt,getEcAuthKey:b,getPublicAuthKey:v,dmList:Gt,modelList:Bt,publicApi:Nt,getDatamanager:jt,resourceList:xt,resourceGet:Jt,resourceEdit:Ft,resourceDelete:Ht,raw:zt,createDatamanager:Kt,editDatamanager:Vt,deleteDatamanager:Yt,createModel:Wt,editModel:Xt,deleteModel:Qt,createTemplate:Zt,createAssetGroup:en,editAssetGroup:tn,editAsset:nn,editDmClient:rn,createRole:an,editRole:on,deleteRole:sn,editDmAccount:cn,deleteDmAccount:dn,getStats:un,getHistory:ln,createAccountClient:fn,editAccountClient:gn,deleteAccountClient:mn,createGroup:hn,editGroup:pn,deleteGroup:yn,createInvite:wn,editInvite:kn,deleteInvite:Dn,editAccount:Tn,listTokens:bn,createToken:$n,deleteToken:En}=Et;function F(t){if(!t||typeof t!="object")return t;const{_links:e,_embedded:n,...r}=t;return r}function vn(t){return!t||typeof t!="object"?t:Array.isArray(t.items)?{...t,items:t.items.map(F)}:F(t)}class P{constructor(e={}){if(!e.storageAdapter){let n=new Map;e.storageAdapter={get:r=>n.get(r),set:(r,a)=>n.set(r,a),remove:r=>n.delete(r)}}this.config=e}set(e){return new P({...this.config,...e})}async entries(e={}){const n=await this.getBestToken();return j({...this.config,options:e,token:n})}async entryList(e){const n=await this.getBestToken();return j({...this.config,options:e,token:n}).then(r=>this.maybeClean(r))}async mapEntries(e,n={}){const r=await this.getBestToken();return vt({...this.config,options:n,token:r},e)}async getEntry(e){const n=await this.getBestToken();return At({...this.config,entryID:e,token:n}).then(r=>this.maybeClean(r))}async editEntrySafe(e,n){const r=await this.getBestToken();return J({...this.config,entryID:e,token:r,value:n,safePut:!0}).then(a=>this.maybeClean(a))}async getSchema(){return Ut(this.config)}async assets(e){const n=await this.getBestToken();return x({...this.config,options:e,token:n})}async assetList(e){const n=await this.getBestToken();return x({...this.config,options:e,token:n})}async createAsset(e){const{file:n,name:r,options:a}=e,o=await this.getBestToken();return St({...this.config,file:n,name:r,options:a,token:o})}async createAssets(e){const{files:n,options:r}=e,a=await this.getBestToken();return qt({...this.config,files:n,options:r,token:a})}async deleteAsset(e){const n=await this.getBestToken();return Ot({...this.config,token:n,assetID:e})}async getAsset(e){const n=await this.getBestToken();return It({...this.config,assetID:e,token:n})}async createEntry(e){const n=await this.getBestToken();return _t({...this.config,token:n,value:e}).then(r=>this.maybeClean(r))}async editEntry(e,n){const r=await this.getBestToken();return J({...this.config,entryID:e,token:r,value:n}).then(a=>this.maybeClean(a))}async deleteEntry(e){const n=await this.getBestToken();return Ct({...this.config,token:n,entryID:e})}async resourceList(e){const n=await this.getBestToken();return xt({...this.config,options:e,token:n})}async resourceGet(e){const n=await this.getBestToken();return Jt({...this.config,options:e,token:n})}async resourceEdit(e,n){const r=await this.getBestToken();return Ft({...this.config,options:e,token:r,value:n})}async resourceDelete(e){const n=await this.getBestToken();return Ht({...this.config,options:e,token:n})}async raw(e,n){const r=await this.getBestToken();return zt({...this.config,options:e,token:r},n)}async createDatamanager(e){const n=await this.getBestToken();return Kt({...this.config,token:n,value:e})}async editDatamanager(e,n){const r=await this.getBestToken();return Vt({...this.config,token:r,dmID:e,value:n})}async deleteDatamanager(e){const n=await this.getBestToken();return Yt({...this.config,token:n,dmID:e})}async createModel(e){const n=await this.getBestToken();return Wt({...this.config,token:n,value:e})}async editModel(e,n){const r=await this.getBestToken();return Xt({...this.config,token:r,modelID:e,value:n})}async deleteModel(e){const n=await this.getBestToken();return Qt({...this.config,token:n,modelID:e})}async createTemplate(e){const n=await this.getBestToken();return Zt({...this.config,token:n,value:e})}async createAssetGroup(e){const n=await this.getBestToken();return en({...this.config,token:n,value:e})}async editAssetGroup(e,n){const r=await this.getBestToken();return tn({...this.config,token:r,assetGroupID:e,value:n})}async editAsset(e,n){const r=await this.getBestToken();return nn({...this.config,token:r,assetID:e,value:n})}async editDmClient(e,n){const r=await this.getBestToken();return rn({...this.config,token:r,clientID:e,value:n})}async createRole(e){const n=await this.getBestToken();return an({...this.config,token:n,value:e})}async editRole(e,n){const r=await this.getBestToken();return on({...this.config,token:r,roleID:e,value:n})}async deleteRole(e){const n=await this.getBestToken();return sn({...this.config,token:n,roleID:e})}async editDmAccount(e,n){const r=await this.getBestToken();return cn({...this.config,token:r,accountID:e,value:n})}async deleteDmAccount(e){const n=await this.getBestToken();return dn({...this.config,token:n,accountID:e})}async getStats(e={}){const n=await this.getBestToken();return un({...this.config,token:n,options:e})}async getHistory(e={}){const n=await this.getBestToken();return ln({...this.config,token:n,options:e})}async createAccountClient(e){const n=await this.getBestToken();return fn({...this.config,token:n,value:e})}async editAccountClient(e,n){const r=await this.getBestToken();return gn({...this.config,token:r,clientID:e,value:n})}async deleteAccountClient(e){const n=await this.getBestToken();return mn({...this.config,token:n,clientID:e})}async createGroup(e){const n=await this.getBestToken();return hn({...this.config,token:n,value:e})}async editGroup(e,n){const r=await this.getBestToken();return pn({...this.config,token:r,groupID:e,value:n})}async deleteGroup(e){const n=await this.getBestToken();return yn({...this.config,token:n,groupID:e})}async createInvite(e){const n=await this.getBestToken();return wn({...this.config,token:n,value:e})}async editInvite(e,n){const r=await this.getBestToken();return kn({...this.config,token:r,inviteID:e,value:n})}async deleteInvite(e){const n=await this.getBestToken();return Dn({...this.config,token:n,inviteID:e})}async editAccount(e,n){const r=await this.getBestToken();return Tn({...this.config,token:r,accountID:e,value:n})}async listTokens(e){const n=await this.getBestToken();return bn({...this.config,token:n,accountID:e})}async createToken(e){const n=await this.getBestToken();return $n({...this.config,token:n,accountID:e})}async deleteToken(e,n){const r=await this.getBestToken();return En({...this.config,token:r,accountID:e,accessTokenID:n})}storageAdapter(e){return this.set({storageAdapter:e})}removeToken(e){if(!this.config.storageAdapter)throw new Error("cannot removeToken: no storageAdapter defined!");const{remove:n}=this.config.storageAdapter;n(e)}getToken(e){if(!this.config.storageAdapter)throw new Error("cannot getAuth: no storageAdapter defined!");const{get:n}=this.config.storageAdapter;return n(e)}getPublicToken(){return this.config.token||this.getToken(v(this.config))}getEcToken(){return this.config.token||this.getToken(b(this.config))}setToken(e,n){if(!this.config.storageAdapter)throw new Error("cannot setEcToken: no storageAdapter defined!");return this.config.storageAdapter.set(e,n)}setEcToken(e){this.setToken(b(this.config),e)}removeEcToken(){this.removeToken(b(this.config))}setPublicToken(e){this.setToken(v(this.config),e)}loginEc(e){return Lt({...this.config,...e}).then(n=>this.setToken(b(this.config),n.token))}loginPublic(e){return Mt({...this.config,...e}).then(n=>this.setToken(v(this.config),n.token))}logoutPublic(){const e=this.getPublicToken();return Pt({...this.config,token:e}).then(()=>this.removeToken(v(this.config)))}logoutEc(){const e=this.getEcToken();return Rt({...this.config,token:e}).then(()=>this.removeToken(b(this.config)))}hasPublicToken(){return!!this.getPublicToken()}hasEcToken(){return!!this.getEcToken()}hasAnyToken(){return!!this.getEcToken()||!!this.getPublicToken()}getBestToken(){try{return this.getEcToken()||this.getPublicToken()}catch{return}}clean(e=!0){return this.set({_clean:e})}maybeClean(e){return this.config._clean?vn(e):e}model(e){return this.set({model:e})}token(e){return this.set({token:e})}dmShortID(e){return this.set({dmShortID:e})}dm(e){return this.dmShortID(e)}dmID(e){return this.set({dmID:e})}assetGroup(e){return this.set({assetGroup:e})}assetgroup(e){return this.assetGroup(e)}subdomain(e){return this.set({subdomain:e})}resource(e){return this.set({resource:e})}route(e){return this.set({route:e})}publicApi(){return Nt(this.config)}async getDatamanager(e){const n=await this.getBestToken();return jt({...this.config,dmID:e,token:n})}async dmList(e={}){const n=await this.getBestToken();return Gt({...this.config,options:e,token:n})}async modelList(e={}){const n=await this.getBestToken();return Bt({...this.config,options:e,token:n})}}const U=W.join(le.homedir(),".ec-fdk"),M=W.join(U,"auth.json");function C(){try{return $.existsSync(M)?JSON.parse($.readFileSync(M,"utf-8")):{}}catch{return{}}}function H(t){$.existsSync(U)||$.mkdirSync(U,{recursive:!0,mode:448}),$.writeFileSync(M,JSON.stringify(t,null,2),{mode:384})}const An={get(t){return C()[t]},set(t,e){const n=C();n[t]=e,H(n)},remove(t){const e=C();delete e[t],H(e)}};function In(t){const e=fe.createInterface({input:process.stdin,output:process.stderr});return new Promise(n=>{e.question(t,r=>{e.close(),n(r)})})}function Sn(t){return new Promise(e=>{process.stderr.write(t);const n=process.stdin;n.setRawMode(!0),n.resume(),n.setEncoding("utf-8");let r="";const a=o=>{for(const s of o){if(s===""&&(process.stderr.write(`
4
+ ${i.verbose}`;throw new Error(c)}throw new Error(`unexpected fetch error: ${o.statusText}`)}if(a)return o;if(o.status===204)return;const s=await o.text();return s?JSON.parse(s):void 0}const q={datamanager:{live:"https://datamanager.entrecode.de/",stage:"https://datamanager.cachena.entrecode.de/"},accounts:{live:"https://accounts.entrecode.de/",stage:"https://accounts.cachena.entrecode.de/"},appserver:{live:"https://appserver.entrecode.de/",stage:"https://appserver.cachena.entrecode.de/"},"dm-history":{live:"https://dm-history.entrecode.de/",stage:"https://dm-history.cachena.entrecode.de/"}};function g(t,e="stage",n="datamanager"){const r=q[n];if(!r)throw new Error(`subdomain "${n}" not found. Try one of ${Object.keys(q).join(", ")}`);const a=r[e];if(!a)throw new Error(`env "${e}" not found. Try one of ${Object.keys(r[e]).join(", ")}`);return a+t}function h(t,e=!0){return Object.entries(t).sort((n,r)=>n[0].localeCompare(r[0])).map(([n,r])=>`${n}=${r}`).join("&")}function d(t){Object.entries(t).forEach(([e,n])=>{if(n===void 0)throw new Error(`expected ${e} to be set!`)})}const X={stage:"https://accounts.cachena.entrecode.de/",live:"https://accounts.entrecode.de/"};async function he(t){let{env:e,dmShortID:n,email:r,password:a}=t;d({env:e,dmShortID:n,email:r,password:a});const o=g(`api/${n}/_auth/login?clientID=rest`,e);return await u(o,{},{method:"POST",body:JSON.stringify({email:r,password:a}),headers:{"Content-Type":"application/json"}})}async function pe(t){let{env:e,email:n,password:r}=t;d({env:e,email:n,password:r});const a=`${X[e]}auth/login?clientID=rest`;return await u(a,{},{method:"POST",body:JSON.stringify({email:n,password:r}),headers:{"Content-Type":"application/json"}})}async function ye(t){let{dmShortID:e,env:n,token:r}=t;d({dmShortID:e,env:n,token:r});const a=g(`api/${e}/_auth/logout?clientID=rest&token=${r}`,n);return await u(a,{rawRes:!0},{method:"POST"})}async function we(t){let{env:e,token:n}=t;d({env:e,token:n});const r=`${X[e]}auth/logout?clientID=rest`;return await u(r,{rawRes:!0,token:n},{method:"POST"})}function ke({dmShortID:t}){return d({dmShortID:t}),t}function De({env:t}){return d({env:t}),t}let Te=["created","creator","id","modified","private","_created","_creator","_embedded","_entryTitle","_id","_links","_modelTitle","_modelTitleField","_modified"];function Q(t){let e={};for(let n in t)Te.includes(n)||(e[n]=t[n]);return e}function be(t){return JSON.parse(JSON.stringify(t))}async function $e(t){let{env:e,dmShortID:n}=t;d({env:e,dmShortID:n});const r=g(`api/${n}`,e);return u(r,t)}async function Z(t){let{env:e,dmShortID:n,model:r,options:a={}}=t;d({env:e,dmShortID:n,model:r}),a={size:50,page:1,_list:!0,...a};const o=h(a),s=g(`api/${n}/${r}?${o}`,e),{count:i,total:c,_embedded:f}=await u(s,t);let m=f?f[`${n}:${r}`]:[];return m=Array.isArray(m)?m:[m],{count:i,total:c,items:m}}function Ee({env:t,dmShortID:e,model:n,entryID:r,token:a}){d({env:t,dmShortID:e,model:n,entryID:r});const o=h({_id:r}),s=g(`api/${e}/${n}?${o}`,t);return u(s,{token:a})}async function ve({env:t,dmShortID:e,model:n,value:r,token:a}){d({env:t,dmShortID:e,model:n,value:r});const o=g(`api/${e}/${n}`,t);return await u(o,{token:a},{method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}})}async function ee({env:t,dmShortID:e,model:n,entryID:r,value:a,token:o,safePut:s=!1}){d({env:t,dmShortID:e,model:n,entryID:r,value:a});const i={"Content-Type":"application/json"};if(s){if(!("_modified"in a))throw new Error("expected _modified to be set!");i["If-Unmodified-Since"]=new Date(a._modified).toUTCString()}const c=g(`api/${e}/${n}?_id=${r}`,t);return a=be(a),a=Q(a),await u(c,{token:o},{method:"PUT",headers:i,body:JSON.stringify(a)})}function te({env:t,dmShortID:e,model:n,entryID:r,token:a}){d({env:t,dmShortID:e,model:n,entryID:r});const o=g(`api/${e}/${n}?_id=${r}`,t);return u(o,{token:a,rawRes:!0},{method:"DELETE",headers:{"Content-Type":"application/json"}})}async function Ae(t,e){let{env:n,dmShortID:r,model:a,options:o={}}=t;d({env:n,dmShortID:r,model:a}),t.options={size:50,page:1,_list:!0,...o};let s=0,i,c=[];for(;i===void 0||s<i;){const f=await Z(t);for(let m of f.items)c.push(await e(m));s+=f.items.length,i=f.total,t.options.page++}return c}async function Ie({env:t,dmShortID:e,model:n,withMetadata:r}){d({env:t,dmShortID:e,model:n});const a=g(`api/schema/${e}/${n}`,t),o=await u(a),s=o?.allOf?.[1];if(typeof s.properties!="object")throw new Error(`getSchema: ${a} returned unexpected format: ${JSON.stringify(o)}`);const{properties:i}=s,c=Q(i);for(let f in c){let m=c[f];if(m.required=s.required.includes(f),c[f]?.oneOf&&delete c[f]?.oneOf,m.title?.includes("<")&&m.title?.includes(">")){const w=m.title.split("<")[1].slice(0,-1),k=m.title.split("<")[0];m.type=k,w.includes(":")?m.resource=w.split(":")[1]:m.resource=w}else["asset","entry","assets","entries"].includes(m.title)?(m.type=m.title,m.resource=null):m.type=m.title;delete c[f].title}if(r){const f=i._modelTitle.title,m=i._modelTitleField.title;return{properties:c,meta:{modelTitleField:m,modelTitle:f}}}return c}function ne(t){return Object.entries(t).map(([e,n])=>typeof n!="object"?{[e]:String(n)}:{...n.sort&&{sort:Array.isArray(n)?n.join(","):n},...n.search&&{[e+"~"]:n.search},...n.notNull&&{[e+"!"]:""},...n.null&&{[e]:""},...n.any&&{[e]:n.any.join(",")},...n.from&&{[e+"From"]:n.from},...n.to&&{[e+"To"]:n.to}}).reduce((e,n)=>({...e,...n}),{})}const Se=ne;function R(t){return t._links.collection.href.split("/").slice(-2)[0]}function re(t){const e=t._links.collection.href.split("api/")[0];return Object.keys(q.datamanager).find(r=>q.datamanager[r]===e)}const ae=t=>{const e=R(t),n=re(t),r=t._modelTitle,a=t.id;return{dmShortID:e,env:n,model:r,entryID:a}},qe=t=>te(ae(t)),Oe=(t,e)=>ee({...ae(t),value:e});function _e(t,e){const n=R(e);return e._embedded[`${n}:${e._modelTitle}/${t}/asset`]}async function Ce({env:t,dmShortID:e,assetGroup:n,assetID:r,token:a}){d({env:t,dmShortID:e,assetGroup:n,assetID:r});const o=h({assetID:r}),s=g(`a/${e}/${n}?${o}`,t),{_embedded:i}=await u(s,{token:a});return i?i["ec:dm-asset"]:void 0}async function Ue(t){let{env:e,dmShortID:n,assetGroup:r,token:a,options:o={}}=t;d({env:e,dmShortID:n,assetGroup:r}),o={size:50,page:1,_list:!0,...o};const s=h(o),i=g(`a/${n}/${r}?${s}`,e),{count:c,total:f,_embedded:m}=await u(i,{token:a});let w=m?m["ec:dm-asset"]:[];return w=Array.isArray(w)?w:[w],{count:c,total:f,items:w}}async function Me({env:t,dmShortID:e,assetGroup:n,token:r,file:a,name:o,options:s}){d({env:t,dmShortID:e,assetGroup:n,file:a});const i=g(`a/${e}/${n}`,t),c=new FormData;return c.append("file",a,o),s&&Object.keys(s).forEach(m=>{c.append(m,s[m])}),(await u(i,{token:r},{method:"POST",body:c}))._embedded["ec:dm-asset"]}async function Le({env:t,dmShortID:e,assetGroup:n,files:r,options:a}){d({env:t,dmShortID:e,assetGroup:n,files:r});const o=g(`a/${e}/${n}`,t),s=new FormData;r.forEach(c=>{s.append("file",c)}),a&&Object.keys(a).forEach(c=>{s.append(c,a[c])});const i=await u(o,{},{method:"POST",body:s});return Array.isArray(i._embedded["ec:dm-asset"])?i._embedded["ec:dm-asset"]:[i._embedded["ec:dm-asset"]]}async function Re({env:t,dmShortID:e,assetGroup:n,assetID:r,token:a}){d({env:t,dmShortID:e,assetGroup:n,assetID:r});const o=g(`a/${e}/${n}/${r}`,t);await u(o,{token:a,rawRes:!0},{method:"DELETE"})}function Pe(t,e,n=!1){let r,a;return(n?t?.thumbnails:t?.fileVariants)?.forEach(s=>{const{resolution:{width:i,height:c}}=s,f=Math.abs(Math.max(i,c)-e);(!a||f<a)&&(a=f,r=s)}),r?.url??t?.file?.url??null}function Ge(t="stage",e,n,r,a=!1){const o=Math.max(r.file.resolution.width,r.file.resolution.height),s=n.filter(c=>c<o),i=`https://datamanager${t==="stage"?".cachena":""}.entrecode.de`;return a?s.map(c=>{const f=r.thumbnails.find(k=>c===k.dimension),m=`${i}/t/${e}/${r.assetID}/${c}`,w=f?f.url:m;return{size:c,url:w,generated:f}}):s.map(c=>{const f=r.fileVariants.find(k=>c===Math.max(k.resolution.width,k.resolution.height)),m=`${i}/f/${e}/${r.assetID}/${c}`,w=f?f.url:m;return{size:c,url:w,generated:f}})}const p={"Content-Type":"application/json"};async function Be(t){let{env:e,dmID:n,token:r}=t;d({env:e,dmID:n});const a=g(`?dataManagerID=${n}`,e);return u(a,{token:r})}async function Ne(t){let{env:e,options:n={}}=t;d({env:e}),n={size:25,page:1,_list:!0,...n};const r=h(n),a=g(`?${r}`,e),{count:o,total:s,_embedded:i}=await u(a,t);let c=i?i["ec:datamanager"]:[];return c=Array.isArray(c)?c:[c],{count:o,total:s,items:c}}async function je(t){let{env:e,dmID:n,options:r={}}=t;d({env:e,dmID:n}),r={size:25,dataManagerID:n,page:1,_list:!0,...r};const a=h(r),o=g(`model?${a}`,e),{count:s,total:i,_embedded:c}=await u(o,t);let f=c?c["ec:model"]:[];return f=Array.isArray(f)?f:[f],{count:s,total:i,items:f}}async function xe(t){let{env:e,resource:n,options:r={},subdomain:a="datamanager"}=t;d({env:e,subdomain:a,resource:n}),r={size:25,page:1,_list:!0,...r};const o=h(r),s=g(`${n}?${o}`,e,a),{count:i,total:c,_embedded:f}=await u(s,t);let m=f?f[Object.keys(f)[0]]:[];return m=Array.isArray(m)?m:[m],{count:i,total:c,items:m}}async function Je(t){let{env:e,resource:n,options:r={},subdomain:a="datamanager"}=t;d({env:e,subdomain:a,resource:n});const o=h(r),s=g(`${n}?${o}`,e,a);return u(s,t)}async function Fe(t){let{env:e,resource:n,options:r={},subdomain:a="datamanager",value:o}=t;d({env:e,subdomain:a,resource:n,value:o});const s=h(r),i=g(`${n}?${s}`,e,a);return u(i,t,{method:"PUT",body:JSON.stringify(o),headers:p})}async function He(t){let{env:e,resource:n,options:r={},subdomain:a="datamanager"}=t;d({env:e,subdomain:a,resource:n});const o=h(r),s=g(`${n}?${o}`,e,a);return u(s,{...t,rawRes:!0},{method:"DELETE",headers:p})}async function ze(t,e={}){let{env:n,route:r,options:a={},subdomain:o="datamanager"}=t;d({env:n,subdomain:o,route:r}),a={...a};const s=h(a),i=g(`${r}?${s}`,n,o);return u(i,t,e)}async function Ke(t){let{env:e,token:n,value:r}=t;d({env:e,value:r});const a=g("",e);return u(a,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function Ve(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const o=h({dataManagerID:r}),s=g(`?${o}`,e);return u(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function Ye(t){let{env:e,token:n,dmID:r}=t;d({env:e,dmID:r});const a=h({dataManagerID:r}),o=g(`?${a}`,e);return u(o,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function We(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const o=h({dataManagerID:r}),s=g(`model?${o}`,e);return u(s,{token:n},{method:"POST",body:JSON.stringify(a),headers:p})}async function Xe(t){let{env:e,token:n,dmID:r,modelID:a,value:o}=t;d({env:e,dmID:r,modelID:a,value:o});const s=h({dataManagerID:r,modelID:a}),i=g(`model?${s}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function Qe(t){let{env:e,token:n,dmID:r,modelID:a}=t;d({env:e,dmID:r,modelID:a});const o=h({dataManagerID:r,modelID:a}),s=g(`model?${o}`,e);return u(s,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Ze(t){let{env:e,token:n,value:r}=t;d({env:e,value:r});const a=g("template",e);return u(a,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function et(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const o=h({dataManagerID:r}),s=g(`assetgroup?${o}`,e);return u(s,{token:n},{method:"POST",body:JSON.stringify(a),headers:p})}async function tt(t){let{env:e,token:n,dmID:r,assetGroupID:a,value:o}=t;d({env:e,dmID:r,assetGroupID:a,value:o});const s=h({dataManagerID:r,assetGroupID:a}),i=g(`assetgroup?${s}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function nt(t){let{env:e,token:n,dmShortID:r,assetGroup:a,assetID:o,value:s}=t;d({env:e,dmShortID:r,assetGroup:a,assetID:o,value:s});const i=g(`a/${r}/${a}/${o}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function rt(t){let{env:e,token:n,dmID:r,clientID:a,value:o}=t;d({env:e,dmID:r,clientID:a,value:o});const s=h({dataManagerID:r,clientID:a}),i=g(`client?${s}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function at(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const o=h({dataManagerID:r}),s=g(`role?${o}`,e);return u(s,{token:n},{method:"POST",body:JSON.stringify(a),headers:p})}async function ot(t){let{env:e,token:n,dmID:r,roleID:a,value:o}=t;d({env:e,dmID:r,roleID:a,value:o});const s=h({dataManagerID:r,roleID:a}),i=g(`role?${s}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function it(t){let{env:e,token:n,dmID:r,roleID:a}=t;d({env:e,dmID:r,roleID:a});const o=h({dataManagerID:r,roleID:a}),s=g(`role?${o}`,e);return u(s,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function st(t){let{env:e,token:n,dmID:r,accountID:a,value:o}=t;d({env:e,dmID:r,accountID:a,value:o});const s=h({dataManagerID:r,accountID:a}),i=g(`account?${s}`,e);return u(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function ct(t){let{env:e,token:n,dmID:r,accountID:a}=t;d({env:e,dmID:r,accountID:a});const o=h({dataManagerID:r,accountID:a}),s=g(`account?${o}`,e);return u(s,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function dt(t){let{env:e,token:n,options:r={}}=t;d({env:e});const a=h(r),o=g(`stats?${a}`,e);return u(o,{token:n})}async function ut(t){let{env:e,token:n,options:r={}}=t;d({env:e});const a=h(r),o=g(`entries?${a}`,e,"dm-history");return u(o,{token:n})}async function lt(t){let{env:e,token:n,value:r}=t;d({env:e,value:r});const a=g("client",e,"accounts");return u(a,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function ft(t){let{env:e,token:n,clientID:r,value:a}=t;d({env:e,clientID:r,value:a});const o=h({clientID:r}),s=g(`client?${o}`,e,"accounts");return u(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function gt(t){let{env:e,token:n,clientID:r}=t;d({env:e,clientID:r});const a=h({clientID:r}),o=g(`client?${a}`,e,"accounts");return u(o,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function mt(t){let{env:e,token:n,value:r}=t;d({env:e,value:r});const a=g("group",e,"accounts");return u(a,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function ht(t){let{env:e,token:n,groupID:r,value:a}=t;d({env:e,groupID:r,value:a});const o=h({groupID:r}),s=g(`group?${o}`,e,"accounts");return u(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function pt(t){let{env:e,token:n,groupID:r}=t;d({env:e,groupID:r});const a=h({groupID:r}),o=g(`group?${a}`,e,"accounts");return u(o,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function yt(t){let{env:e,token:n,value:r}=t;d({env:e,value:r});const a=g("invite",e,"accounts"),o=await u(a,{token:n},{method:"POST",body:JSON.stringify(r),headers:p});return o?._embedded?.["ec:invite"]??o}async function wt(t){let{env:e,token:n,inviteID:r,value:a}=t;d({env:e,inviteID:r,value:a});const o=h({invite:r}),s=g(`invite?${o}`,e,"accounts");return u(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function kt(t){let{env:e,token:n,inviteID:r}=t;d({env:e,inviteID:r});const a=h({invite:r}),o=g(`invite?${a}`,e,"accounts");return u(o,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Dt(t){let{env:e,token:n,accountID:r,value:a}=t;d({env:e,accountID:r,value:a});const o=h({accountID:r}),s=g(`account?${o}`,e,"accounts");return u(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function Tt(t){let{env:e,token:n,accountID:r}=t;d({env:e,accountID:r});const a=h({accountID:r}),o=g(`account/tokens?${a}`,e,"accounts");let i=(await u(o,{token:n}))?._embedded?.["ec:account/token"]??[];return Array.isArray(i)?i:[i]}async function bt(t){let{env:e,token:n,accountID:r}=t;d({env:e,accountID:r});const a=h({accountID:r}),o=g(`account/tokens?${a}`,e,"accounts");return u(o,{token:n},{method:"POST",headers:p})}async function $t(t){let{env:e,token:n,accountID:r,accessTokenID:a}=t;d({env:e,accountID:r,accessTokenID:a});const o=h({accessTokenID:a,accountID:r}),s=g(`account/tokens?${o}`,e,"accounts");return u(s,{token:n,rawRes:!0},{method:"DELETE",headers:p})}const Et=Object.freeze(Object.defineProperty({__proto__:null,assetList:Ue,createAccountClient:lt,createAsset:Me,createAssetGroup:et,createAssets:Le,createDatamanager:Ke,createEntry:ve,createGroup:mt,createInvite:yt,createModel:We,createRole:at,createTemplate:Ze,createToken:bt,deleteAccountClient:gt,deleteAsset:Re,deleteDatamanager:Ye,deleteDmAccount:ct,deleteEntry:te,deleteEntryObject:qe,deleteGroup:pt,deleteInvite:kt,deleteModel:Qe,deleteRole:it,deleteToken:$t,dmList:Ne,editAccount:Dt,editAccountClient:ft,editAsset:nt,editAssetGroup:tt,editDatamanager:Ve,editDmAccount:st,editDmClient:rt,editEntry:ee,editEntryObject:Oe,editGroup:ht,editInvite:wt,editModel:Xe,editRole:ot,entryList:Z,fileVariant:Pe,filterOptions:Se,getAsset:Ce,getDatamanager:Be,getEcAuthKey:De,getEntry:Ee,getEntryAsset:_e,getEntryEnv:re,getEntryShortID:R,getFileVariants:Ge,getHistory:ut,getPublicAuthKey:ke,getSchema:Ie,getStats:dt,listTokens:Tt,loginEc:pe,loginPublic:he,logoutEc:we,logoutPublic:ye,mapEntries:Ae,modelList:je,publicApi:$e,raw:ze,resourceDelete:He,resourceEdit:Fe,resourceGet:Je,resourceList:xe,sdkOptions:ne},Symbol.toStringTag,{value:"Module"})),{entryList:j,mapEntries:vt,getEntry:At,getAsset:It,assetList:x,createAsset:St,createAssets:qt,deleteAsset:Ot,createEntry:_t,editEntry:J,deleteEntry:Ct,getSchema:Ut,loginPublic:Mt,loginEc:Lt,logoutEc:Rt,logoutPublic:Pt,getEcAuthKey:b,getPublicAuthKey:v,dmList:Gt,modelList:Bt,publicApi:Nt,getDatamanager:jt,resourceList:xt,resourceGet:Jt,resourceEdit:Ft,resourceDelete:Ht,raw:zt,createDatamanager:Kt,editDatamanager:Vt,deleteDatamanager:Yt,createModel:Wt,editModel:Xt,deleteModel:Qt,createTemplate:Zt,createAssetGroup:en,editAssetGroup:tn,editAsset:nn,editDmClient:rn,createRole:an,editRole:on,deleteRole:sn,editDmAccount:cn,deleteDmAccount:dn,getStats:un,getHistory:ln,createAccountClient:fn,editAccountClient:gn,deleteAccountClient:mn,createGroup:hn,editGroup:pn,deleteGroup:yn,createInvite:wn,editInvite:kn,deleteInvite:Dn,editAccount:Tn,listTokens:bn,createToken:$n,deleteToken:En}=Et;function F(t){if(!t||typeof t!="object")return t;const{_links:e,_embedded:n,...r}=t;return r}function vn(t){return!t||typeof t!="object"?t:Array.isArray(t.items)?{...t,items:t.items.map(F)}:F(t)}class P{constructor(e={}){if(!e.storageAdapter){let n=new Map;e.storageAdapter={get:r=>n.get(r),set:(r,a)=>n.set(r,a),remove:r=>n.delete(r)}}this.config=e}set(e){return new P({...this.config,...e})}async entries(e={}){const n=await this.getBestToken();return j({...this.config,options:e,token:n})}async entryList(e){const n=await this.getBestToken();return j({...this.config,options:e,token:n}).then(r=>this.maybeClean(r))}async mapEntries(e,n={}){const r=await this.getBestToken();return vt({...this.config,options:n,token:r},e)}async getEntry(e){const n=await this.getBestToken();return At({...this.config,entryID:e,token:n}).then(r=>this.maybeClean(r))}async editEntrySafe(e,n){const r=await this.getBestToken();return J({...this.config,entryID:e,token:r,value:n,safePut:!0}).then(a=>this.maybeClean(a))}async getSchema(){return Ut(this.config)}async assets(e){const n=await this.getBestToken();return x({...this.config,options:e,token:n})}async assetList(e){const n=await this.getBestToken();return x({...this.config,options:e,token:n})}async createAsset(e){const{file:n,name:r,options:a}=e,o=await this.getBestToken();return St({...this.config,file:n,name:r,options:a,token:o})}async createAssets(e){const{files:n,options:r}=e,a=await this.getBestToken();return qt({...this.config,files:n,options:r,token:a})}async deleteAsset(e){const n=await this.getBestToken();return Ot({...this.config,token:n,assetID:e})}async getAsset(e){const n=await this.getBestToken();return It({...this.config,assetID:e,token:n})}async createEntry(e){const n=await this.getBestToken();return _t({...this.config,token:n,value:e}).then(r=>this.maybeClean(r))}async editEntry(e,n){const r=await this.getBestToken();return J({...this.config,entryID:e,token:r,value:n}).then(a=>this.maybeClean(a))}async deleteEntry(e){const n=await this.getBestToken();return Ct({...this.config,token:n,entryID:e})}async resourceList(e){const n=await this.getBestToken();return xt({...this.config,options:e,token:n})}async resourceGet(e){const n=await this.getBestToken();return Jt({...this.config,options:e,token:n})}async resourceEdit(e,n){const r=await this.getBestToken();return Ft({...this.config,options:e,token:r,value:n})}async resourceDelete(e){const n=await this.getBestToken();return Ht({...this.config,options:e,token:n})}async raw(e,n){const r=await this.getBestToken();return zt({...this.config,options:e,token:r},n)}async createDatamanager(e){const n=await this.getBestToken();return Kt({...this.config,token:n,value:e})}async editDatamanager(e,n){const r=await this.getBestToken();return Vt({...this.config,token:r,dmID:e,value:n})}async deleteDatamanager(e){const n=await this.getBestToken();return Yt({...this.config,token:n,dmID:e})}async createModel(e){const n=await this.getBestToken();return Wt({...this.config,token:n,value:e})}async editModel(e,n){const r=await this.getBestToken();return Xt({...this.config,token:r,modelID:e,value:n})}async deleteModel(e){const n=await this.getBestToken();return Qt({...this.config,token:n,modelID:e})}async createTemplate(e){const n=await this.getBestToken();return Zt({...this.config,token:n,value:e})}async createAssetGroup(e){const n=await this.getBestToken();return en({...this.config,token:n,value:e})}async editAssetGroup(e,n){const r=await this.getBestToken();return tn({...this.config,token:r,assetGroupID:e,value:n})}async editAsset(e,n){const r=await this.getBestToken();return nn({...this.config,token:r,assetID:e,value:n})}async editDmClient(e,n){const r=await this.getBestToken();return rn({...this.config,token:r,clientID:e,value:n})}async createRole(e){const n=await this.getBestToken();return an({...this.config,token:n,value:e})}async editRole(e,n){const r=await this.getBestToken();return on({...this.config,token:r,roleID:e,value:n})}async deleteRole(e){const n=await this.getBestToken();return sn({...this.config,token:n,roleID:e})}async editDmAccount(e,n){const r=await this.getBestToken();return cn({...this.config,token:r,accountID:e,value:n})}async deleteDmAccount(e){const n=await this.getBestToken();return dn({...this.config,token:n,accountID:e})}async getStats(e={}){const n=await this.getBestToken();return un({...this.config,token:n,options:e})}async getHistory(e={}){const n=await this.getBestToken();return ln({...this.config,token:n,options:e})}async createAccountClient(e){const n=await this.getBestToken();return fn({...this.config,token:n,value:e})}async editAccountClient(e,n){const r=await this.getBestToken();return gn({...this.config,token:r,clientID:e,value:n})}async deleteAccountClient(e){const n=await this.getBestToken();return mn({...this.config,token:n,clientID:e})}async createGroup(e){const n=await this.getBestToken();return hn({...this.config,token:n,value:e})}async editGroup(e,n){const r=await this.getBestToken();return pn({...this.config,token:r,groupID:e,value:n})}async deleteGroup(e){const n=await this.getBestToken();return yn({...this.config,token:n,groupID:e})}async createInvite(e){const n=await this.getBestToken();return wn({...this.config,token:n,value:e})}async editInvite(e,n){const r=await this.getBestToken();return kn({...this.config,token:r,inviteID:e,value:n})}async deleteInvite(e){const n=await this.getBestToken();return Dn({...this.config,token:n,inviteID:e})}async editAccount(e,n){const r=await this.getBestToken();return Tn({...this.config,token:r,accountID:e,value:n})}async listTokens(e){const n=await this.getBestToken();return bn({...this.config,token:n,accountID:e})}async createToken(e){const n=await this.getBestToken();return $n({...this.config,token:n,accountID:e})}async deleteToken(e,n){const r=await this.getBestToken();return En({...this.config,token:r,accountID:e,accessTokenID:n})}storageAdapter(e){return this.set({storageAdapter:e})}removeToken(e){if(!this.config.storageAdapter)throw new Error("cannot removeToken: no storageAdapter defined!");const{remove:n}=this.config.storageAdapter;n(e)}getToken(e){if(!this.config.storageAdapter)throw new Error("cannot getAuth: no storageAdapter defined!");const{get:n}=this.config.storageAdapter;return n(e)}getPublicToken(){return this.config.token||this.getToken(v(this.config))}getEcToken(){return this.config.token||this.getToken(b(this.config))}setToken(e,n){if(!this.config.storageAdapter)throw new Error("cannot setEcToken: no storageAdapter defined!");return this.config.storageAdapter.set(e,n)}setEcToken(e){this.setToken(b(this.config),e)}removeEcToken(){this.removeToken(b(this.config))}setPublicToken(e){this.setToken(v(this.config),e)}loginEc(e){return Lt({...this.config,...e}).then(n=>this.setToken(b(this.config),n.token))}loginPublic(e){return Mt({...this.config,...e}).then(n=>this.setToken(v(this.config),n.token))}logoutPublic(){const e=this.getPublicToken();return Pt({...this.config,token:e}).then(()=>this.removeToken(v(this.config)))}logoutEc(){const e=this.getEcToken();return Rt({...this.config,token:e}).then(()=>this.removeToken(b(this.config)))}hasPublicToken(){return!!this.getPublicToken()}hasEcToken(){return!!this.getEcToken()}hasAnyToken(){return!!this.getEcToken()||!!this.getPublicToken()}getBestToken(){try{return this.getEcToken()||this.getPublicToken()}catch{return}}clean(e=!0){return this.set({_clean:e})}maybeClean(e){return this.config._clean?vn(e):e}model(e){return this.set({model:e})}token(e){return this.set({token:e})}dmShortID(e){return this.set({dmShortID:e})}dm(e){return this.dmShortID(e)}dmID(e){return this.set({dmID:e})}assetGroup(e){return this.set({assetGroup:e})}assetgroup(e){return this.assetGroup(e)}subdomain(e){return this.set({subdomain:e})}resource(e){return this.set({resource:e})}route(e){return this.set({route:e})}publicApi(){return Nt(this.config)}async getDatamanager(e){const n=await this.getBestToken();return jt({...this.config,dmID:e,token:n})}async dmList(e={}){const n=await this.getBestToken();return Gt({...this.config,options:e,token:n})}async modelList(e={}){const n=await this.getBestToken();return Bt({...this.config,options:e,token:n})}}const U=W.join(le.homedir(),".ec-fdk"),M=W.join(U,"auth.json");function C(){try{return $.existsSync(M)?JSON.parse($.readFileSync(M,"utf-8")):{}}catch{return{}}}function H(t){$.existsSync(U)||$.mkdirSync(U,{recursive:!0,mode:448}),$.writeFileSync(M,JSON.stringify(t,null,2),{mode:384})}const An={get(t){return C()[t]},set(t,e){const n=C();n[t]=e,H(n)},remove(t){const e=C();delete e[t],H(e)}};function In(t){const e=fe.createInterface({input:process.stdin,output:process.stderr});return new Promise(n=>{e.question(t,r=>{e.close(),n(r)})})}function Sn(t){return new Promise(e=>{process.stderr.write(t);const n=process.stdin;n.setRawMode(!0),n.resume(),n.setEncoding("utf-8");let r="";const a=o=>{for(const s of o){if(s===""&&(process.stderr.write(`
5
5
  `),process.exit(130)),s==="\r"||s===`
6
6
  `){n.setRawMode(!1),n.pause(),n.removeListener("data",a),process.stderr.write(`
7
7
  `),e(r);return}if(s===""||s==="\b"){r.length>0&&(r=r.slice(0,-1),process.stderr.write("\b \b"));continue}r+=s,process.stderr.write("*")}};n.on("data",a)})}const qn={stage:{authEndpoint:"https://login.cachena.entrecode.de/oidc/auth",tokenEndpoint:"https://login.cachena.entrecode.de/oidc/token"},live:{authEndpoint:"https://login.entrecode.de/oidc/auth",tokenEndpoint:"https://login.entrecode.de/oidc/token"}},z="ec-fdk-cli",K="http://localhost:19836/callback",On=12e4;function G(t){return t.toString("base64url")}function _n(){return G(L.randomBytes(32))}function Cn(t){return G(L.createHash("sha256").update(t).digest())}function Un(t){const e=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";me.exec(`${e} ${JSON.stringify(t)}`)}const Mn=`<!DOCTYPE html><html><body style="font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0">
8
8
  <div style="text-align:center"><h1>Login successful</h1><p>You can close this tab.</p></div></body></html>`,A=t=>`<!DOCTYPE html><html><body style="font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0">
9
- <div style="text-align:center"><h1>Login failed</h1><p>${t}</p></div></body></html>`;function Ln(t){const{authEndpoint:e,tokenEndpoint:n}=qn[t],r=_n(),a=Cn(r),o=G(L.randomBytes(16));return new Promise((s,i)=>{const c=ge.createServer(async(w,k)=>{if(!w.url?.startsWith("/callback")){k.writeHead(404),k.end();return}const T=new URL(w.url,"http://localhost").searchParams,B=T.get("code"),se=T.get("state"),_=T.get("error");if(_){k.writeHead(200,{"Content-Type":"text/html"}),k.end(A(T.get("error_description")||_)),m(),i(new Error(T.get("error_description")||_));return}if(se!==o){k.writeHead(200,{"Content-Type":"text/html"}),k.end(A("State mismatch")),m(),i(new Error("State mismatch — possible CSRF attack"));return}if(!B){k.writeHead(200,{"Content-Type":"text/html"}),k.end(A("No authorization code received")),m(),i(new Error("No authorization code received"));return}try{const D=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",client_id:z,redirect_uri:K,code:B,code_verifier:r})});if(!D.ok){const ce=await D.text();throw new Error(`Token exchange failed: ${D.status} ${ce}`)}const N=(await D.json()).access_token;if(!N)throw new Error("No access_token in token response");k.writeHead(200,{"Content-Type":"text/html"}),k.end(Mn),m(),s(N)}catch(D){k.writeHead(200,{"Content-Type":"text/html"}),k.end(A(D.message)),m(),i(D)}}),l=setTimeout(()=>{m(),i(new Error("Login timed out after 2 minutes"))},On);function m(){clearTimeout(l),c.close()}c.listen(19836,()=>{const w=`${e}?`+new URLSearchParams({client_id:z,redirect_uri:K,response_type:"code",scope:"openid",state:o,code_challenge:a,code_challenge_method:"S256"}).toString();process.stderr.write(`Opening browser for login...
9
+ <div style="text-align:center"><h1>Login failed</h1><p>${t}</p></div></body></html>`;function Ln(t){const{authEndpoint:e,tokenEndpoint:n}=qn[t],r=_n(),a=Cn(r),o=G(L.randomBytes(16));return new Promise((s,i)=>{const c=ge.createServer(async(w,k)=>{if(!w.url?.startsWith("/callback")){k.writeHead(404),k.end();return}const T=new URL(w.url,"http://localhost").searchParams,B=T.get("code"),se=T.get("state"),_=T.get("error");if(_){k.writeHead(200,{"Content-Type":"text/html"}),k.end(A(T.get("error_description")||_)),m(),i(new Error(T.get("error_description")||_));return}if(se!==o){k.writeHead(200,{"Content-Type":"text/html"}),k.end(A("State mismatch")),m(),i(new Error("State mismatch — possible CSRF attack"));return}if(!B){k.writeHead(200,{"Content-Type":"text/html"}),k.end(A("No authorization code received")),m(),i(new Error("No authorization code received"));return}try{const D=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"authorization_code",client_id:z,redirect_uri:K,code:B,code_verifier:r})});if(!D.ok){const ce=await D.text();throw new Error(`Token exchange failed: ${D.status} ${ce}`)}const N=(await D.json()).access_token;if(!N)throw new Error("No access_token in token response");k.writeHead(200,{"Content-Type":"text/html"}),k.end(Mn),m(),s(N)}catch(D){k.writeHead(200,{"Content-Type":"text/html"}),k.end(A(D.message)),m(),i(D)}}),f=setTimeout(()=>{m(),i(new Error("Login timed out after 2 minutes"))},On);function m(){clearTimeout(f),c.close()}c.listen(19836,()=>{const w=`${e}?`+new URLSearchParams({client_id:z,redirect_uri:K,response_type:"code",scope:"openid",state:o,code_challenge:a,code_challenge_method:"S256"}).toString();process.stderr.write(`Opening browser for login...
10
10
  `),Un(w)}),c.on("error",w=>{m(),i(new Error(`Could not start local server: ${w.message}`))})})}const Rn=ue.createRequire(typeof document>"u"?require("url").pathToFileURL(__filename).href:document.currentScript&&document.currentScript.src||new URL("cli.cjs",document.baseURI).href),{version:Pn}=Rn("../package.json"),Gn=`ec.fdk <command> [options]
11
11
 
12
12
  Commands:
13
13
  login Login via browser (OIDC). Use --password for email/password prompt.
14
14
  logout Logout and remove stored token
15
+ whoami Show current logged-in user
15
16
 
16
17
  Entry commands (require --dm, --model):
17
18
  entryList List entries
@@ -106,31 +107,33 @@ Options:
106
107
  --md Output entries as readable markdown
107
108
  -v, --version Show version
108
109
  --password Use email/password login instead of browser
109
- -h, --help Show help`;function I(t){return Object.fromEntries(t.map(e=>{const n=e.indexOf("=");return n===-1&&f(`Invalid filter: "${e}" (expected key=value)`),[e.slice(0,n),e.slice(n+1)]}))}function f(t){process.stderr.write(`Error: ${t}
110
- `),process.exit(2)}function Bn(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf-8"),process.stdin.on("data",n=>e+=n),process.stdin.on("end",()=>t(e))})}async function y(t){if(t)try{return JSON.parse(t)}catch{f("--data must be valid JSON")}if(!process.stdin.isTTY){const e=await Bn();e.trim()||f("No data provided via stdin");try{return JSON.parse(e)}catch{f("Stdin must be valid JSON")}}f("Provide --data or pipe JSON via stdin")}function E(t){if(!t||typeof t!="object")return t;const{_links:e,_embedded:n,...r}=t;return r}function S(t){return!t||typeof t!="object"?t:Array.isArray(t.items)?{...t,items:t.items.map(E)}:E(t)}const V=40;function Y(t){return t.length>V?t.slice(0,V-2)+"..":t}function oe(t){return t==null?"":Y(typeof t=="object"?JSON.stringify(t):String(t))}function ie(t){return Object.keys(t).filter(e=>!e.startsWith("_"))}function O(t,e){return"| "+t.map((n,r)=>n.padEnd(e[r])).join(" | ")+" |"}function Nn(t){const e=ie(t),n=e.map(l=>oe(t[l])),r=Math.max(5,...e.map(l=>l.length)),a=Math.max(5,...n.map(l=>l.length)),o=[r,a],s=O(["Field","Value"],o),i="| "+o.map(l=>"-".repeat(l)).join(" | ")+" |",c=e.map((l,m)=>O([l,n[m]],o));return`${s}
110
+ -h, --help Show help`;function I(t){return Object.fromEntries(t.map(e=>{const n=e.indexOf("=");return n===-1&&l(`Invalid filter: "${e}" (expected key=value)`),[e.slice(0,n),e.slice(n+1)]}))}function l(t){process.stderr.write(`Error: ${t}
111
+ `),process.exit(2)}function Bn(){return new Promise(t=>{let e="";process.stdin.setEncoding("utf-8"),process.stdin.on("data",n=>e+=n),process.stdin.on("end",()=>t(e))})}async function y(t){if(t)try{return JSON.parse(t)}catch{l("--data must be valid JSON")}if(!process.stdin.isTTY){const e=await Bn();e.trim()||l("No data provided via stdin");try{return JSON.parse(e)}catch{l("Stdin must be valid JSON")}}l("Provide --data or pipe JSON via stdin")}function E(t){if(!t||typeof t!="object")return t;const{_links:e,_embedded:n,...r}=t;return r}function S(t){return!t||typeof t!="object"?t:Array.isArray(t.items)?{...t,items:t.items.map(E)}:E(t)}const V=40;function Y(t){return t.length>V?t.slice(0,V-2)+"..":t}function oe(t){return t==null?"":Y(typeof t=="object"?JSON.stringify(t):String(t))}function ie(t){return Object.keys(t).filter(e=>!e.startsWith("_"))}function O(t,e){return"| "+t.map((n,r)=>n.padEnd(e[r])).join(" | ")+" |"}function Nn(t){const e=ie(t),n=e.map(f=>oe(t[f])),r=Math.max(5,...e.map(f=>f.length)),a=Math.max(5,...n.map(f=>f.length)),o=[r,a],s=O(["Field","Value"],o),i="| "+o.map(f=>"-".repeat(f)).join(" | ")+" |",c=e.map((f,m)=>O([f,n[m]],o));return`${s}
111
112
  ${i}
112
113
  ${c.join(`
113
- `)}`}function jn(t){if(!t.items.length)return"No entries found.";const e=ie(t.items[0]),n=t.items.map(i=>e.map(c=>oe(i[c]))),r=e.map((i,c)=>Math.max(i.length,...n.map(l=>l[c].length))),a=O(e,r),o="| "+r.map(i=>"-".repeat(i)).join(" | ")+" |",s=n.map(i=>O(i,r));return`${a}
114
+ `)}`}function jn(t){if(!t.items.length)return"No entries found.";const e=ie(t.items[0]),n=t.items.map(i=>e.map(c=>oe(i[c]))),r=e.map((i,c)=>Math.max(i.length,...n.map(f=>f[c].length))),a=O(e,r),o="| "+r.map(i=>"-".repeat(i)).join(" | ")+" |",s=n.map(i=>O(i,r));return`${a}
114
115
  ${o}
115
116
  ${s.join(`
116
117
  `)}
117
118
 
118
- ${t.items.length} of ${t.total} entries`}async function xn(){const{values:t,positionals:e}=de.parseArgs({allowPositionals:!0,options:{env:{type:"string",short:"e",default:"stage"},dm:{type:"string",short:"d"},model:{type:"string",short:"m"},id:{type:"string",short:"i"},data:{type:"string"},size:{type:"string",short:"s"},page:{type:"string",short:"p"},sort:{type:"string"},filter:{type:"string",short:"f",multiple:!0,default:[]},rid:{type:"string"},"account-id":{type:"string"},assetgroup:{type:"string"},resource:{type:"string"},subdomain:{type:"string"},raw:{type:"boolean",default:!1},md:{type:"boolean",default:!1},password:{type:"boolean",default:!1},version:{type:"boolean",short:"v"},help:{type:"boolean",short:"h"}}});t.version&&(console.log(Pn),process.exit(0)),(t.help||e.length===0)&&(console.log(Gn),process.exit(0));const n=e[0],r=t.env;r!=="stage"&&r!=="live"&&f('--env must be "stage" or "live"');const a=new P({env:r,storageAdapter:An});if(n==="login"){try{if(t.password){const o=await In("Email: "),s=await Sn("Password: ");await a.loginEc({email:o,password:s})}else{const o=await Ln(r);a.setEcToken(o)}process.stderr.write(`Logged in to ${r} successfully.
119
+ ${t.items.length} of ${t.total} entries`}async function xn(){const{values:t,positionals:e}=de.parseArgs({allowPositionals:!0,options:{env:{type:"string",short:"e",default:"stage"},dm:{type:"string",short:"d"},model:{type:"string",short:"m"},id:{type:"string",short:"i"},data:{type:"string"},size:{type:"string",short:"s"},page:{type:"string",short:"p"},sort:{type:"string"},filter:{type:"string",short:"f",multiple:!0,default:[]},rid:{type:"string"},"account-id":{type:"string"},assetgroup:{type:"string"},resource:{type:"string"},subdomain:{type:"string"},raw:{type:"boolean",default:!1},md:{type:"boolean",default:!1},password:{type:"boolean",default:!1},version:{type:"boolean",short:"v"},help:{type:"boolean",short:"h"}}});t.version&&(console.log(Pn),process.exit(0)),(t.help||e.length===0)&&(console.log(Gn),process.exit(0));const n=e[0],r=t.env;r!=="stage"&&r!=="live"&&l('--env must be "stage" or "live"');const a=new P({env:r,storageAdapter:An});if(n==="login"){try{if(t.password){const o=await In("Email: "),s=await Sn("Password: ");await a.loginEc({email:o,password:s})}else{const o=await Ln(r);a.setEcToken(o)}process.stderr.write(`Logged in to ${r} successfully.
119
120
  `)}catch(o){process.stderr.write(`Login failed: ${o.message}
120
- `),process.exit(1)}return}if(n==="logout"){try{a.hasEcToken()&&await a.logoutEc()}catch{}a.removeEcToken(),process.stderr.write(`Logged out of ${r}.
121
- `);return}try{let o;const s=()=>{const i={...I(t.filter)};return t.size&&(i.size=Number(t.size)),t.page&&(i.page=Number(t.page)),t.sort&&(i.sort=[t.sort]),i};switch(n){case"dmList":{o=await a.dmList(s()),t.raw||(o=S(o));break}case"modelList":{t.id||f("--id (datamanager UUID) is required for modelList"),o=await a.dmID(t.id).modelList(s()),t.raw||(o=S(o));break}case"getDatamanager":{t.id||f("--id (datamanager UUID) is required for getDatamanager"),o=await a.getDatamanager(t.id),t.raw||(o=S(o));break}case"resourceList":{t.resource||f("--resource is required for resourceList");let i=a.resource(t.resource);t.subdomain&&(i=i.subdomain(t.subdomain)),o=await i.resourceList(s()),t.raw||(o=S(o));break}case"resourceGet":{t.resource||f("--resource is required for resourceGet");let i=a.resource(t.resource);t.subdomain&&(i=i.subdomain(t.subdomain)),o=await i.resourceGet(I(t.filter)),t.raw||(o=E(o));break}case"resourceEdit":{t.resource||f("--resource is required for resourceEdit");let i=a.resource(t.resource);t.subdomain&&(i=i.subdomain(t.subdomain));const c=await y(t.data);if(o=await i.resourceEdit(I(t.filter),c),!o){process.stderr.write(`Resource updated.
122
- `);return}t.raw||(o=E(o));break}case"resourceDelete":{t.resource||f("--resource is required for resourceDelete");let i=a.resource(t.resource);t.subdomain&&(i=i.subdomain(t.subdomain)),await i.resourceDelete(I(t.filter)),process.stderr.write(`Resource deleted.
123
- `);return}case"getStats":{o=await a.getStats(s());break}case"getHistory":{o=await a.getHistory(s());break}case"entryList":case"getEntry":case"createEntry":case"editEntry":case"deleteEntry":case"getSchema":{t.dm||f("--dm is required"),t.model||f("--model is required");const i=a.dm(t.dm).model(t.model).clean(!t.raw);switch(n){case"entryList":{o=await i.entryList(s());break}case"getEntry":{t.id||f("--id is required for getEntry"),o=await i.getEntry(t.id);break}case"createEntry":{const c=await y(t.data);o=await i.createEntry(c);break}case"editEntry":{t.id||f("--id is required for editEntry");const c=await y(t.data);o=await i.editEntry(t.id,c);break}case"deleteEntry":{t.id||f("--id is required for deleteEntry"),await i.deleteEntry(t.id),process.stderr.write(`Entry deleted.
124
- `);return}case"getSchema":{o=await i.getSchema();break}}break}case"createDatamanager":{const i=await y(t.data);o=await a.createDatamanager(i);break}case"editDatamanager":{t.id||f("--id (datamanager UUID) is required for editDatamanager");const i=await y(t.data);o=await a.editDatamanager(t.id,i);break}case"deleteDatamanager":{t.id||f("--id (datamanager UUID) is required for deleteDatamanager"),await a.deleteDatamanager(t.id),process.stderr.write(`Datamanager deleted.
125
- `);return}case"createModel":{t.id||f("--id (datamanager UUID) is required for createModel");const i=await y(t.data);o=await a.dmID(t.id).createModel(i);break}case"editModel":{t.id||f("--id (datamanager UUID) is required for editModel"),t.rid||f("--rid (model ID) is required for editModel");const i=await y(t.data);o=await a.dmID(t.id).editModel(t.rid,i);break}case"deleteModel":{t.id||f("--id (datamanager UUID) is required for deleteModel"),t.rid||f("--rid (model ID) is required for deleteModel"),await a.dmID(t.id).deleteModel(t.rid),process.stderr.write(`Model deleted.
126
- `);return}case"createTemplate":{const i=await y(t.data);o=await a.createTemplate(i);break}case"createAssetGroup":{t.id||f("--id (datamanager UUID) is required for createAssetGroup");const i=await y(t.data);o=await a.dmID(t.id).createAssetGroup(i);break}case"editAssetGroup":{t.id||f("--id (datamanager UUID) is required for editAssetGroup"),t.rid||f("--rid (asset group ID) is required for editAssetGroup");const i=await y(t.data);o=await a.dmID(t.id).editAssetGroup(t.rid,i);break}case"editAsset":{t.dm||f("--dm (short ID) is required for editAsset"),t.assetgroup||f("--assetgroup is required for editAsset"),t.rid||f("--rid (asset ID) is required for editAsset");const i=await y(t.data);o=await a.dm(t.dm).assetGroup(t.assetgroup).editAsset(t.rid,i);break}case"editDmClient":{t.id||f("--id (datamanager UUID) is required for editDmClient"),t.rid||f("--rid (client ID) is required for editDmClient");const i=await y(t.data);o=await a.dmID(t.id).editDmClient(t.rid,i);break}case"createRole":{t.id||f("--id (datamanager UUID) is required for createRole");const i=await y(t.data);o=await a.dmID(t.id).createRole(i);break}case"editRole":{t.id||f("--id (datamanager UUID) is required for editRole"),t.rid||f("--rid (role ID) is required for editRole");const i=await y(t.data);o=await a.dmID(t.id).editRole(t.rid,i);break}case"deleteRole":{t.id||f("--id (datamanager UUID) is required for deleteRole"),t.rid||f("--rid (role ID) is required for deleteRole"),await a.dmID(t.id).deleteRole(t.rid),process.stderr.write(`Role deleted.
127
- `);return}case"editDmAccount":{t.id||f("--id (datamanager UUID) is required for editDmAccount"),t["account-id"]||f("--account-id is required for editDmAccount");const i=await y(t.data);o=await a.dmID(t.id).editDmAccount(t["account-id"],i);break}case"deleteDmAccount":{t.id||f("--id (datamanager UUID) is required for deleteDmAccount"),t["account-id"]||f("--account-id is required for deleteDmAccount"),await a.dmID(t.id).deleteDmAccount(t["account-id"]),process.stderr.write(`DM account deleted.
128
- `);return}case"createAccountClient":{const i=await y(t.data);o=await a.createAccountClient(i);break}case"editAccountClient":{t.rid||f("--rid (client ID) is required for editAccountClient");const i=await y(t.data);o=await a.editAccountClient(t.rid,i);break}case"deleteAccountClient":{t.rid||f("--rid (client ID) is required for deleteAccountClient"),await a.deleteAccountClient(t.rid),process.stderr.write(`Account client deleted.
129
- `);return}case"createGroup":{const i=await y(t.data);o=await a.createGroup(i);break}case"editGroup":{t.rid||f("--rid (group ID) is required for editGroup");const i=await y(t.data);o=await a.editGroup(t.rid,i);break}case"deleteGroup":{t.rid||f("--rid (group ID) is required for deleteGroup"),await a.deleteGroup(t.rid),process.stderr.write(`Group deleted.
130
- `);return}case"createInvite":{const i=await y(t.data);o=await a.createInvite(i);break}case"editInvite":{t.rid||f("--rid (invite ID) is required for editInvite");const i=await y(t.data);o=await a.editInvite(t.rid,i);break}case"deleteInvite":{t.rid||f("--rid (invite ID) is required for deleteInvite"),await a.deleteInvite(t.rid),process.stderr.write(`Invite deleted.
131
- `);return}case"editAccount":{t["account-id"]||f("--account-id is required for editAccount");const i=await y(t.data);if(o=await a.editAccount(t["account-id"],i),!o){process.stderr.write(`Account updated.
132
- `);return}break}case"listTokens":{t["account-id"]||f("--account-id is required for listTokens");const i=await a.listTokens(t["account-id"]);o=t.raw?i:i.map(E);break}case"createToken":{t["account-id"]||f("--account-id is required for createToken"),o=await a.createToken(t["account-id"]);break}case"deleteToken":{t["account-id"]||f("--account-id is required for deleteToken"),t.rid||f("--rid (access token ID) is required for deleteToken"),await a.deleteToken(t["account-id"],t.rid),process.stderr.write(`Token deleted.
133
- `);return}default:f(`Unknown command: ${n}`)}t.md&&o&&typeof o=="object"?Array.isArray(o.items)?process.stdout.write(jn(o)+`
121
+ `),process.exit(1)}return}if(n==="whoami"){const o=a.getEcToken();o||(process.stderr.write(`Not logged in to ${r}.
122
+ `),process.exit(1));try{const s=JSON.parse(Buffer.from(o.split(".")[1],"base64url").toString()),i={env:r};s.email&&(i.email=s.email),s.sub&&(i.accountID=s.sub),s.iss&&(i.issuer=s.iss),s.exp&&(i.expires=new Date(s.exp*1e3).toISOString()),process.stdout.write(JSON.stringify(i,null,2)+`
123
+ `)}catch{l("Could not decode token")}return}if(n==="logout"){try{a.hasEcToken()&&await a.logoutEc()}catch{}a.removeEcToken(),process.stderr.write(`Logged out of ${r}.
124
+ `);return}try{let o;const s=()=>{const i={...I(t.filter)};return t.size&&(i.size=Number(t.size)),t.page&&(i.page=Number(t.page)),t.sort&&(i.sort=[t.sort]),i};switch(n){case"dmList":{o=await a.dmList(s()),t.raw||(o=S(o));break}case"modelList":{t.id||l("--id (datamanager UUID) is required for modelList"),o=await a.dmID(t.id).modelList(s()),t.raw||(o=S(o));break}case"getDatamanager":{t.id||l("--id (datamanager UUID) is required for getDatamanager"),o=await a.getDatamanager(t.id),t.raw||(o=S(o));break}case"resourceList":{t.resource||l("--resource is required for resourceList");let i=a.resource(t.resource);t.subdomain&&(i=i.subdomain(t.subdomain)),o=await i.resourceList(s()),t.raw||(o=S(o));break}case"resourceGet":{t.resource||l("--resource is required for resourceGet");let i=a.resource(t.resource);t.subdomain&&(i=i.subdomain(t.subdomain)),o=await i.resourceGet(I(t.filter)),t.raw||(o=E(o));break}case"resourceEdit":{t.resource||l("--resource is required for resourceEdit");let i=a.resource(t.resource);t.subdomain&&(i=i.subdomain(t.subdomain));const c=await y(t.data);if(o=await i.resourceEdit(I(t.filter),c),!o){process.stderr.write(`Resource updated.
125
+ `);return}t.raw||(o=E(o));break}case"resourceDelete":{t.resource||l("--resource is required for resourceDelete");let i=a.resource(t.resource);t.subdomain&&(i=i.subdomain(t.subdomain)),await i.resourceDelete(I(t.filter)),process.stderr.write(`Resource deleted.
126
+ `);return}case"getStats":{o=await a.getStats(s());break}case"getHistory":{o=await a.getHistory(s());break}case"entryList":case"getEntry":case"createEntry":case"editEntry":case"deleteEntry":case"getSchema":{t.dm||l("--dm is required"),t.model||l("--model is required");const i=a.dm(t.dm).model(t.model).clean(!t.raw);switch(n){case"entryList":{o=await i.entryList(s());break}case"getEntry":{t.id||l("--id is required for getEntry"),o=await i.getEntry(t.id);break}case"createEntry":{const c=await y(t.data);o=await i.createEntry(c);break}case"editEntry":{t.id||l("--id is required for editEntry");const c=await y(t.data);o=await i.editEntry(t.id,c);break}case"deleteEntry":{t.id||l("--id is required for deleteEntry"),await i.deleteEntry(t.id),process.stderr.write(`Entry deleted.
127
+ `);return}case"getSchema":{o=await i.getSchema();break}}break}case"createDatamanager":{const i=await y(t.data);o=await a.createDatamanager(i);break}case"editDatamanager":{t.id||l("--id (datamanager UUID) is required for editDatamanager");const i=await y(t.data);o=await a.editDatamanager(t.id,i);break}case"deleteDatamanager":{t.id||l("--id (datamanager UUID) is required for deleteDatamanager"),await a.deleteDatamanager(t.id),process.stderr.write(`Datamanager deleted.
128
+ `);return}case"createModel":{t.id||l("--id (datamanager UUID) is required for createModel");const i=await y(t.data);o=await a.dmID(t.id).createModel(i);break}case"editModel":{t.id||l("--id (datamanager UUID) is required for editModel"),t.rid||l("--rid (model ID) is required for editModel");const i=await y(t.data);o=await a.dmID(t.id).editModel(t.rid,i);break}case"deleteModel":{t.id||l("--id (datamanager UUID) is required for deleteModel"),t.rid||l("--rid (model ID) is required for deleteModel"),await a.dmID(t.id).deleteModel(t.rid),process.stderr.write(`Model deleted.
129
+ `);return}case"createTemplate":{const i=await y(t.data);o=await a.createTemplate(i);break}case"createAssetGroup":{t.id||l("--id (datamanager UUID) is required for createAssetGroup");const i=await y(t.data);o=await a.dmID(t.id).createAssetGroup(i);break}case"editAssetGroup":{t.id||l("--id (datamanager UUID) is required for editAssetGroup"),t.rid||l("--rid (asset group ID) is required for editAssetGroup");const i=await y(t.data);o=await a.dmID(t.id).editAssetGroup(t.rid,i);break}case"editAsset":{t.dm||l("--dm (short ID) is required for editAsset"),t.assetgroup||l("--assetgroup is required for editAsset"),t.rid||l("--rid (asset ID) is required for editAsset");const i=await y(t.data);o=await a.dm(t.dm).assetGroup(t.assetgroup).editAsset(t.rid,i);break}case"editDmClient":{t.id||l("--id (datamanager UUID) is required for editDmClient"),t.rid||l("--rid (client ID) is required for editDmClient");const i=await y(t.data);o=await a.dmID(t.id).editDmClient(t.rid,i);break}case"createRole":{t.id||l("--id (datamanager UUID) is required for createRole");const i=await y(t.data);o=await a.dmID(t.id).createRole(i);break}case"editRole":{t.id||l("--id (datamanager UUID) is required for editRole"),t.rid||l("--rid (role ID) is required for editRole");const i=await y(t.data);o=await a.dmID(t.id).editRole(t.rid,i);break}case"deleteRole":{t.id||l("--id (datamanager UUID) is required for deleteRole"),t.rid||l("--rid (role ID) is required for deleteRole"),await a.dmID(t.id).deleteRole(t.rid),process.stderr.write(`Role deleted.
130
+ `);return}case"editDmAccount":{t.id||l("--id (datamanager UUID) is required for editDmAccount"),t["account-id"]||l("--account-id is required for editDmAccount");const i=await y(t.data);o=await a.dmID(t.id).editDmAccount(t["account-id"],i);break}case"deleteDmAccount":{t.id||l("--id (datamanager UUID) is required for deleteDmAccount"),t["account-id"]||l("--account-id is required for deleteDmAccount"),await a.dmID(t.id).deleteDmAccount(t["account-id"]),process.stderr.write(`DM account deleted.
131
+ `);return}case"createAccountClient":{const i=await y(t.data);o=await a.createAccountClient(i);break}case"editAccountClient":{t.rid||l("--rid (client ID) is required for editAccountClient");const i=await y(t.data);o=await a.editAccountClient(t.rid,i);break}case"deleteAccountClient":{t.rid||l("--rid (client ID) is required for deleteAccountClient"),await a.deleteAccountClient(t.rid),process.stderr.write(`Account client deleted.
132
+ `);return}case"createGroup":{const i=await y(t.data);o=await a.createGroup(i);break}case"editGroup":{t.rid||l("--rid (group ID) is required for editGroup");const i=await y(t.data);o=await a.editGroup(t.rid,i);break}case"deleteGroup":{t.rid||l("--rid (group ID) is required for deleteGroup"),await a.deleteGroup(t.rid),process.stderr.write(`Group deleted.
133
+ `);return}case"createInvite":{const i=await y(t.data);o=await a.createInvite(i);break}case"editInvite":{t.rid||l("--rid (invite ID) is required for editInvite");const i=await y(t.data);o=await a.editInvite(t.rid,i);break}case"deleteInvite":{t.rid||l("--rid (invite ID) is required for deleteInvite"),await a.deleteInvite(t.rid),process.stderr.write(`Invite deleted.
134
+ `);return}case"editAccount":{t["account-id"]||l("--account-id is required for editAccount");const i=await y(t.data);if(o=await a.editAccount(t["account-id"],i),!o){process.stderr.write(`Account updated.
135
+ `);return}break}case"listTokens":{t["account-id"]||l("--account-id is required for listTokens");const i=await a.listTokens(t["account-id"]);o=t.raw?i:i.map(E);break}case"createToken":{t["account-id"]||l("--account-id is required for createToken"),o=await a.createToken(t["account-id"]);break}case"deleteToken":{t["account-id"]||l("--account-id is required for deleteToken"),t.rid||l("--rid (access token ID) is required for deleteToken"),await a.deleteToken(t["account-id"],t.rid),process.stderr.write(`Token deleted.
136
+ `);return}default:l(`Unknown command: ${n}`)}t.md&&o&&typeof o=="object"?Array.isArray(o.items)?process.stdout.write(jn(o)+`
134
137
  `):process.stdout.write(Nn(o)+`
135
138
  `):process.stdout.write(JSON.stringify(o,null,2)+`
136
139
  `)}catch(o){process.stderr.write(`${o.message}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ec.fdk",
3
- "version": "0.9.2",
3
+ "version": "0.9.3",
4
4
  "description": "ec frontend sdk",
5
5
  "main": "dist/index.cjs",
6
6
  "bin": {