ec.fdk 0.9.5 → 0.9.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/cli.cjs +35 -30
- package/package.json +1 -1
- package/skill/SKILL.md +12 -0
package/README.md
CHANGED
|
@@ -222,6 +222,7 @@ ec.fdk <command> [options]
|
|
|
222
222
|
| `logout` | Logout and remove stored token | — |
|
|
223
223
|
| `whoami` | Show current logged-in user | — |
|
|
224
224
|
| `install-skill` | Install Claude Code skill | — (optional `--dir <path>`) |
|
|
225
|
+
| `update` | Self-update ec.fdk | — |
|
|
225
226
|
| `resourceList` | List any resource type | `--resource`, `-f` for query params |
|
|
226
227
|
| `resourceGet` | Get a single resource | `--resource`, `-f` for identifying params |
|
|
227
228
|
| `resourceEdit` | Edit a single resource | `--resource`, `-f` for identifying params, `--data` |
|
|
@@ -311,6 +312,9 @@ ec.fdk install-skill
|
|
|
311
312
|
# Install to custom directory
|
|
312
313
|
ec.fdk install-skill --dir ~/entrecode/.claude
|
|
313
314
|
|
|
315
|
+
# Self-update ec.fdk
|
|
316
|
+
ec.fdk update
|
|
317
|
+
|
|
314
318
|
# List datamanagers
|
|
315
319
|
ec.fdk dmList -e stage
|
|
316
320
|
|
package/dist/cli.cjs
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var he=Object.create;var
|
|
3
|
-
${
|
|
4
|
-
${s.verbose}`;throw new Error(c)}throw new Error(`unexpected fetch error: ${a.statusText}`)}if(o)return a;if(a.status===204)return;const i=await a.text();return i?JSON.parse(i):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(e,t="stage",n="datamanager"){const r=q[n];if(!r)throw new Error(`subdomain "${n}" not found. Try one of ${Object.keys(q).join(", ")}`);const o=r[t];if(!o)throw new Error(`env "${t}" not found. Try one of ${Object.keys(r[t]).join(", ")}`);return o+e}function h(e,t=!0){return Object.entries(e).sort((n,r)=>n[0].localeCompare(r[0])).map(([n,r])=>`${n}=${r}`).join("&")}function d(e){Object.entries(e).forEach(([t,n])=>{if(n===void 0)throw new Error(`expected ${t} to be set!`)})}const te={stage:"https://accounts.cachena.entrecode.de/",live:"https://accounts.entrecode.de/"};async function Ae(e){let{env:t,dmShortID:n,email:r,password:o}=e;d({env:t,dmShortID:n,email:r,password:o});const a=g(`api/${n}/_auth/login?clientID=rest`,t);return await l(a,{},{method:"POST",body:JSON.stringify({email:r,password:o}),headers:{"Content-Type":"application/json"}})}async function Se(e){let{env:t,email:n,password:r}=e;d({env:t,email:n,password:r});const o=`${te[t]}auth/login?clientID=rest`;return await l(o,{},{method:"POST",body:JSON.stringify({email:n,password:r}),headers:{"Content-Type":"application/json"}})}async function _e(e){let{dmShortID:t,env:n,token:r}=e;d({dmShortID:t,env:n,token:r});const o=g(`api/${t}/_auth/logout?clientID=rest&token=${r}`,n);return await l(o,{rawRes:!0},{method:"POST"})}async function qe(e){let{env:t,token:n}=e;d({env:t,token:n});const r=`${te[t]}auth/logout?clientID=rest`;return await l(r,{rawRes:!0,token:n},{method:"POST"})}function Oe({dmShortID:e}){return d({dmShortID:e}),e}function Ce({env:e}){return d({env:e}),e}let Ue=["created","creator","id","modified","private","_created","_creator","_embedded","_entryTitle","_id","_links","_modelTitle","_modelTitleField","_modified"];function ne(e){let t={};for(let n in e)Ue.includes(n)||(t[n]=e[n]);return t}function Le(e){return JSON.parse(JSON.stringify(e))}async function Me(e){let{env:t,dmShortID:n}=e;d({env:t,dmShortID:n});const r=g(`api/${n}`,t);return l(r,e)}async function re(e){let{env:t,dmShortID:n,model:r,options:o={}}=e;d({env:t,dmShortID:n,model:r}),o={size:50,page:1,_list:!0,...o};const a=h(o),i=g(`api/${n}/${r}?${a}`,t),{count:s,total:c,_embedded:u}=await l(i,e);let m=u?u[`${n}:${r}`]:[];return m=Array.isArray(m)?m:[m],{count:s,total:c,items:m}}function Re({env:e,dmShortID:t,model:n,entryID:r,token:o}){d({env:e,dmShortID:t,model:n,entryID:r});const a=h({_id:r}),i=g(`api/${t}/${n}?${a}`,e);return l(i,{token:o})}async function Pe({env:e,dmShortID:t,model:n,value:r,token:o}){d({env:e,dmShortID:t,model:n,value:r});const a=g(`api/${t}/${n}`,e);return await l(a,{token:o},{method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}})}async function oe({env:e,dmShortID:t,model:n,entryID:r,value:o,token:a,safePut:i=!1}){d({env:e,dmShortID:t,model:n,entryID:r,value:o});const s={"Content-Type":"application/json"};if(i){if(!("_modified"in o))throw new Error("expected _modified to be set!");s["If-Unmodified-Since"]=new Date(o._modified).toUTCString()}const c=g(`api/${t}/${n}?_id=${r}`,e);return o=Le(o),o=ne(o),await l(c,{token:a},{method:"PUT",headers:s,body:JSON.stringify(o)})}function ae({env:e,dmShortID:t,model:n,entryID:r,token:o}){d({env:e,dmShortID:t,model:n,entryID:r});const a=g(`api/${t}/${n}?_id=${r}`,e);return l(a,{token:o,rawRes:!0},{method:"DELETE",headers:{"Content-Type":"application/json"}})}async function Be(e,t){let{env:n,dmShortID:r,model:o,options:a={}}=e;d({env:n,dmShortID:r,model:o}),e.options={size:50,page:1,_list:!0,...a};let i=0,s,c=[];for(;s===void 0||i<s;){const u=await re(e);for(let m of u.items)c.push(await t(m));i+=u.items.length,s=u.total,e.options.page++}return c}async function Ge({env:e,dmShortID:t,model:n,withMetadata:r}){d({env:e,dmShortID:t,model:n});const o=g(`api/schema/${t}/${n}`,e),a=await l(o),i=a?.allOf?.[1];if(typeof i.properties!="object")throw new Error(`getSchema: ${o} returned unexpected format: ${JSON.stringify(a)}`);const{properties:s}=i,c=ne(s);for(let u in c){let m=c[u];if(m.required=i.required.includes(u),c[u]?.oneOf&&delete c[u]?.oneOf,m.title?.includes("<")&&m.title?.includes(">")){const y=m.title.split("<")[1].slice(0,-1),w=m.title.split("<")[0];m.type=w,y.includes(":")?m.resource=y.split(":")[1]:m.resource=y}else["asset","entry","assets","entries"].includes(m.title)?(m.type=m.title,m.resource=null):m.type=m.title;delete c[u].title}if(r){const u=s._modelTitle.title,m=s._modelTitleField.title;return{properties:c,meta:{modelTitleField:m,modelTitle:u}}}return c}function se(e){return Object.entries(e).map(([t,n])=>typeof n!="object"?{[t]:String(n)}:{...n.sort&&{sort:Array.isArray(n)?n.join(","):n},...n.search&&{[t+"~"]:n.search},...n.notNull&&{[t+"!"]:""},...n.null&&{[t]:""},...n.any&&{[t]:n.any.join(",")},...n.from&&{[t+"From"]:n.from},...n.to&&{[t+"To"]:n.to}}).reduce((t,n)=>({...t,...n}),{})}const Ne=se;function G(e){return e._links.collection.href.split("/").slice(-2)[0]}function ie(e){const t=e._links.collection.href.split("api/")[0];return Object.keys(q.datamanager).find(r=>q.datamanager[r]===t)}const ce=e=>{const t=G(e),n=ie(e),r=e._modelTitle,o=e.id;return{dmShortID:t,env:n,model:r,entryID:o}},xe=e=>ae(ce(e)),je=(e,t)=>oe({...ce(e),value:t});function Je(e,t){const n=G(t);return t._embedded[`${n}:${t._modelTitle}/${e}/asset`]}async function Fe({env:e,dmShortID:t,assetGroup:n,assetID:r,token:o}){d({env:e,dmShortID:t,assetGroup:n,assetID:r});const a=h({assetID:r}),i=g(`a/${t}/${n}?${a}`,e),{_embedded:s}=await l(i,{token:o});return s?s["ec:dm-asset"]:void 0}async function He(e){let{env:t,dmShortID:n,assetGroup:r,token:o,options:a={}}=e;d({env:t,dmShortID:n,assetGroup:r}),a={size:50,page:1,_list:!0,...a};const i=h(a),s=g(`a/${n}/${r}?${i}`,t),{count:c,total:u,_embedded:m}=await l(s,{token:o});let y=m?m["ec:dm-asset"]:[];return y=Array.isArray(y)?y:[y],{count:c,total:u,items:y}}async function ze({env:e,dmShortID:t,assetGroup:n,token:r,file:o,name:a,options:i}){d({env:e,dmShortID:t,assetGroup:n,file:o});const s=g(`a/${t}/${n}`,e),c=new FormData;return c.append("file",o,a),i&&Object.keys(i).forEach(m=>{c.append(m,i[m])}),(await l(s,{token:r},{method:"POST",body:c}))._embedded["ec:dm-asset"]}async function Ke({env:e,dmShortID:t,assetGroup:n,files:r,options:o}){d({env:e,dmShortID:t,assetGroup:n,files:r});const a=g(`a/${t}/${n}`,e),i=new FormData;r.forEach(c=>{i.append("file",c)}),o&&Object.keys(o).forEach(c=>{i.append(c,o[c])});const s=await l(a,{},{method:"POST",body:i});return Array.isArray(s._embedded["ec:dm-asset"])?s._embedded["ec:dm-asset"]:[s._embedded["ec:dm-asset"]]}async function Ve({env:e,dmShortID:t,assetGroup:n,assetID:r,token:o}){d({env:e,dmShortID:t,assetGroup:n,assetID:r});const a=g(`a/${t}/${n}/${r}`,e);await l(a,{token:o,rawRes:!0},{method:"DELETE"})}function Ye(e,t,n=!1){let r,o;return(n?e?.thumbnails:e?.fileVariants)?.forEach(i=>{const{resolution:{width:s,height:c}}=i,u=Math.abs(Math.max(s,c)-t);(!o||u<o)&&(o=u,r=i)}),r?.url??e?.file?.url??null}function We(e="stage",t,n,r,o=!1){const a=Math.max(r.file.resolution.width,r.file.resolution.height),i=n.filter(c=>c<a),s=`https://datamanager${e==="stage"?".cachena":""}.entrecode.de`;return o?i.map(c=>{const u=r.thumbnails.find(w=>c===w.dimension),m=`${s}/t/${t}/${r.assetID}/${c}`,y=u?u.url:m;return{size:c,url:y,generated:u}}):i.map(c=>{const u=r.fileVariants.find(w=>c===Math.max(w.resolution.width,w.resolution.height)),m=`${s}/f/${t}/${r.assetID}/${c}`,y=u?u.url:m;return{size:c,url:y,generated:u}})}const p={"Content-Type":"application/json"};async function Xe(e){let{env:t,dmID:n,token:r}=e;d({env:t,dmID:n});const o=g(`?dataManagerID=${n}`,t);return l(o,{token:r})}async function Qe(e){let{env:t,options:n={}}=e;d({env:t}),n={size:25,page:1,_list:!0,...n};const r=h(n),o=g(`?${r}`,t),{count:a,total:i,_embedded:s}=await l(o,e);let c=s?s["ec:datamanager"]:[];return c=Array.isArray(c)?c:[c],{count:a,total:i,items:c}}async function Ze(e){let{env:t,dmID:n,options:r={}}=e;d({env:t,dmID:n}),r={size:25,dataManagerID:n,page:1,_list:!0,...r};const o=h(r),a=g(`model?${o}`,t),{count:i,total:s,_embedded:c}=await l(a,e);let u=c?c["ec:model"]:[];return u=Array.isArray(u)?u:[u],{count:i,total:s,items:u}}async function et(e){let{env:t,resource:n,options:r={},subdomain:o="datamanager"}=e;d({env:t,subdomain:o,resource:n}),r={size:25,page:1,_list:!0,...r};const a=h(r),i=g(`${n}?${a}`,t,o),{count:s,total:c,_embedded:u}=await l(i,e);let m=u?u[Object.keys(u)[0]]:[];return m=Array.isArray(m)?m:[m],{count:s,total:c,items:m}}async function tt(e){let{env:t,resource:n,options:r={},subdomain:o="datamanager"}=e;d({env:t,subdomain:o,resource:n});const a=h(r),i=g(`${n}?${a}`,t,o);return l(i,e)}async function nt(e){let{env:t,resource:n,options:r={},subdomain:o="datamanager",value:a}=e;d({env:t,subdomain:o,resource:n,value:a});const i=h(r),s=g(`${n}?${i}`,t,o);return l(s,e,{method:"PUT",body:JSON.stringify(a),headers:p})}async function rt(e){let{env:t,resource:n,options:r={},subdomain:o="datamanager"}=e;d({env:t,subdomain:o,resource:n});const a=h(r),i=g(`${n}?${a}`,t,o);return l(i,{...e,rawRes:!0},{method:"DELETE",headers:p})}async function ot(e,t={}){let{env:n,route:r,options:o={},subdomain:a="datamanager"}=e;d({env:n,subdomain:a,route:r}),o={...o};const i=h(o),s=g(`${r}?${i}`,n,a);return l(s,e,t)}async function at(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const o=g("",t);return l(o,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function st(e){let{env:t,token:n,dmID:r,value:o}=e;d({env:t,dmID:r,value:o});const a=h({dataManagerID:r}),i=g(`?${a}`,t);return l(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function it(e){let{env:t,token:n,dmID:r}=e;d({env:t,dmID:r});const o=h({dataManagerID:r}),a=g(`?${o}`,t);return l(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function ct(e){let{env:t,token:n,dmID:r,value:o}=e;d({env:t,dmID:r,value:o});const a=h({dataManagerID:r}),i=g(`model?${a}`,t);return l(i,{token:n},{method:"POST",body:JSON.stringify(o),headers:p})}async function dt(e){let{env:t,token:n,dmID:r,modelID:o,value:a}=e;d({env:t,dmID:r,modelID:o,value:a});const i=h({dataManagerID:r,modelID:o}),s=g(`model?${i}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function ut(e){let{env:t,token:n,dmID:r,modelID:o}=e;d({env:t,dmID:r,modelID:o});const a=h({dataManagerID:r,modelID:o}),i=g(`model?${a}`,t);return l(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function lt(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const o=g("template",t);return l(o,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function ft(e){let{env:t,token:n,dmID:r,value:o}=e;d({env:t,dmID:r,value:o});const a=h({dataManagerID:r}),i=g(`assetgroup?${a}`,t);return l(i,{token:n},{method:"POST",body:JSON.stringify(o),headers:p})}async function gt(e){let{env:t,token:n,dmID:r,assetGroupID:o,value:a}=e;d({env:t,dmID:r,assetGroupID:o,value:a});const i=h({dataManagerID:r,assetGroupID:o}),s=g(`assetgroup?${i}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function mt(e){let{env:t,token:n,dmShortID:r,assetGroup:o,assetID:a,value:i}=e;d({env:t,dmShortID:r,assetGroup:o,assetID:a,value:i});const s=g(`a/${r}/${o}/${a}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(i),headers:p})}async function ht(e){let{env:t,token:n,dmID:r,clientID:o,value:a}=e;d({env:t,dmID:r,clientID:o,value:a});const i=h({dataManagerID:r,clientID:o}),s=g(`client?${i}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function pt(e){let{env:t,token:n,dmID:r,value:o}=e;d({env:t,dmID:r,value:o});const a=h({dataManagerID:r}),i=g(`role?${a}`,t);return l(i,{token:n},{method:"POST",body:JSON.stringify(o),headers:p})}async function yt(e){let{env:t,token:n,dmID:r,roleID:o,value:a}=e;d({env:t,dmID:r,roleID:o,value:a});const i=h({dataManagerID:r,roleID:o}),s=g(`role?${i}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function kt(e){let{env:t,token:n,dmID:r,roleID:o}=e;d({env:t,dmID:r,roleID:o});const a=h({dataManagerID:r,roleID:o}),i=g(`role?${a}`,t);return l(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function wt(e){let{env:t,token:n,dmID:r,accountID:o,value:a}=e;d({env:t,dmID:r,accountID:o,value:a});const i=h({dataManagerID:r,accountID:o}),s=g(`account?${i}`,t);return l(s,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function Dt(e){let{env:t,token:n,dmID:r,accountID:o}=e;d({env:t,dmID:r,accountID:o});const a=h({dataManagerID:r,accountID:o}),i=g(`account?${a}`,t);return l(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Tt(e){let{env:t,token:n,options:r={}}=e;d({env:t});const o=h(r),a=g(`stats?${o}`,t);return l(a,{token:n})}async function bt(e){let{env:t,token:n,options:r={}}=e;d({env:t});const o=h(r),a=g(`entries?${o}`,t,"dm-history");return l(a,{token:n})}async function $t(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const o=g("client",t,"accounts");return l(o,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function Et(e){let{env:t,token:n,clientID:r,value:o}=e;d({env:t,clientID:r,value:o});const a=h({clientID:r}),i=g(`client?${a}`,t,"accounts");return l(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function vt(e){let{env:t,token:n,clientID:r}=e;d({env:t,clientID:r});const o=h({clientID:r}),a=g(`client?${o}`,t,"accounts");return l(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function It(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const o=g("group",t,"accounts");return l(o,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function At(e){let{env:t,token:n,groupID:r,value:o}=e;d({env:t,groupID:r,value:o});const a=h({groupID:r}),i=g(`group?${a}`,t,"accounts");return l(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function St(e){let{env:t,token:n,groupID:r}=e;d({env:t,groupID:r});const o=h({groupID:r}),a=g(`group?${o}`,t,"accounts");return l(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function _t(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const o=g("invite",t,"accounts"),a=await l(o,{token:n},{method:"POST",body:JSON.stringify(r),headers:p});return a?._embedded?.["ec:invite"]??a}async function qt(e){let{env:t,token:n,inviteID:r,value:o}=e;d({env:t,inviteID:r,value:o});const a=h({invite:r}),i=g(`invite?${a}`,t,"accounts");return l(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function Ot(e){let{env:t,token:n,inviteID:r}=e;d({env:t,inviteID:r});const o=h({invite:r}),a=g(`invite?${o}`,t,"accounts");return l(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Ct(e){let{env:t,token:n,accountID:r,value:o}=e;d({env:t,accountID:r,value:o});const a=h({accountID:r}),i=g(`account?${a}`,t,"accounts");return l(i,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function Ut(e){let{env:t,token:n,accountID:r}=e;d({env:t,accountID:r});const o=h({accountID:r}),a=g(`account/tokens?${o}`,t,"accounts");let s=(await l(a,{token:n}))?._embedded?.["ec:account/token"]??[];return Array.isArray(s)?s:[s]}async function Lt(e){let{env:t,token:n,accountID:r}=e;d({env:t,accountID:r});const o=h({accountID:r}),a=g(`account/tokens?${o}`,t,"accounts");return l(a,{token:n},{method:"POST",headers:p})}async function Mt(e){let{env:t,token:n,accountID:r,accessTokenID:o}=e;d({env:t,accountID:r,accessTokenID:o});const a=h({accessTokenID:o,accountID:r}),i=g(`account/tokens?${a}`,t,"accounts");return l(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}const Rt=Object.freeze(Object.defineProperty({__proto__:null,assetList:He,createAccountClient:$t,createAsset:ze,createAssetGroup:ft,createAssets:Ke,createDatamanager:at,createEntry:Pe,createGroup:It,createInvite:_t,createModel:ct,createRole:pt,createTemplate:lt,createToken:Lt,deleteAccountClient:vt,deleteAsset:Ve,deleteDatamanager:it,deleteDmAccount:Dt,deleteEntry:ae,deleteEntryObject:xe,deleteGroup:St,deleteInvite:Ot,deleteModel:ut,deleteRole:kt,deleteToken:Mt,dmList:Qe,editAccount:Ct,editAccountClient:Et,editAsset:mt,editAssetGroup:gt,editDatamanager:st,editDmAccount:wt,editDmClient:ht,editEntry:oe,editEntryObject:je,editGroup:At,editInvite:qt,editModel:dt,editRole:yt,entryList:re,fileVariant:Ye,filterOptions:Ne,getAsset:Fe,getDatamanager:Xe,getEcAuthKey:Ce,getEntry:Re,getEntryAsset:Je,getEntryEnv:ie,getEntryShortID:G,getFileVariants:We,getHistory:bt,getPublicAuthKey:Oe,getSchema:Ge,getStats:Tt,listTokens:Ut,loginEc:Se,loginPublic:Ae,logoutEc:qe,logoutPublic:_e,mapEntries:Be,modelList:Ze,publicApi:Me,raw:ot,resourceDelete:rt,resourceEdit:nt,resourceGet:tt,resourceList:et,sdkOptions:se},Symbol.toStringTag,{value:"Module"})),{entryList:z,mapEntries:Pt,getEntry:Bt,getAsset:Gt,assetList:K,createAsset:Nt,createAssets:xt,deleteAsset:jt,createEntry:Jt,editEntry:V,deleteEntry:Ft,getSchema:Ht,loginPublic:zt,loginEc:Kt,logoutEc:Vt,logoutPublic:Yt,getEcAuthKey:b,getPublicAuthKey:I,dmList:Wt,modelList:Xt,publicApi:Qt,getDatamanager:Zt,resourceList:en,resourceGet:tn,resourceEdit:nn,resourceDelete:rn,raw:on,createDatamanager:an,editDatamanager:sn,deleteDatamanager:cn,createModel:dn,editModel:un,deleteModel:ln,createTemplate:fn,createAssetGroup:gn,editAssetGroup:mn,editAsset:hn,editDmClient:pn,createRole:yn,editRole:kn,deleteRole:wn,editDmAccount:Dn,deleteDmAccount:Tn,getStats:bn,getHistory:$n,createAccountClient:En,editAccountClient:vn,deleteAccountClient:In,createGroup:An,editGroup:Sn,deleteGroup:_n,createInvite:qn,editInvite:On,deleteInvite:Cn,editAccount:Un,listTokens:Ln,createToken:Mn,deleteToken:Rn}=Rt;function Y(e){if(!e||typeof e!="object")return e;const{_links:t,_embedded:n,...r}=e;return r}function Pn(e){return!e||typeof e!="object"?e:Array.isArray(e.items)?{...e,items:e.items.map(Y)}:Y(e)}class N{constructor(t={}){if(!t.storageAdapter){let n=new Map;t.storageAdapter={get:r=>n.get(r),set:(r,o)=>n.set(r,o),remove:r=>n.delete(r)}}this.config=t}set(t){return new N({...this.config,...t})}async entries(t={}){const n=await this.getBestToken();return z({...this.config,options:t,token:n})}async entryList(t){const n=await this.getBestToken();return z({...this.config,options:t,token:n}).then(r=>this.maybeClean(r))}async mapEntries(t,n={}){const r=await this.getBestToken();return Pt({...this.config,options:n,token:r},t)}async getEntry(t){const n=await this.getBestToken();return Bt({...this.config,entryID:t,token:n}).then(r=>this.maybeClean(r))}async editEntrySafe(t,n){const r=await this.getBestToken();return V({...this.config,entryID:t,token:r,value:n,safePut:!0}).then(o=>this.maybeClean(o))}async getSchema(){return Ht(this.config)}async assets(t){const n=await this.getBestToken();return K({...this.config,options:t,token:n})}async assetList(t){const n=await this.getBestToken();return K({...this.config,options:t,token:n})}async createAsset(t){const{file:n,name:r,options:o}=t,a=await this.getBestToken();return Nt({...this.config,file:n,name:r,options:o,token:a})}async createAssets(t){const{files:n,options:r}=t,o=await this.getBestToken();return xt({...this.config,files:n,options:r,token:o})}async deleteAsset(t){const n=await this.getBestToken();return jt({...this.config,token:n,assetID:t})}async getAsset(t){const n=await this.getBestToken();return Gt({...this.config,assetID:t,token:n})}async createEntry(t){const n=await this.getBestToken();return Jt({...this.config,token:n,value:t}).then(r=>this.maybeClean(r))}async editEntry(t,n){const r=await this.getBestToken();return V({...this.config,entryID:t,token:r,value:n}).then(o=>this.maybeClean(o))}async deleteEntry(t){const n=await this.getBestToken();return Ft({...this.config,token:n,entryID:t})}async resourceList(t){const n=await this.getBestToken();return en({...this.config,options:t,token:n})}async resourceGet(t){const n=await this.getBestToken();return tn({...this.config,options:t,token:n})}async resourceEdit(t,n){const r=await this.getBestToken();return nn({...this.config,options:t,token:r,value:n})}async resourceDelete(t){const n=await this.getBestToken();return rn({...this.config,options:t,token:n})}async raw(t,n){const r=await this.getBestToken();return on({...this.config,options:t,token:r},n)}async createDatamanager(t){const n=await this.getBestToken();return an({...this.config,token:n,value:t})}async editDatamanager(t,n){const r=await this.getBestToken();return sn({...this.config,token:r,dmID:t,value:n})}async deleteDatamanager(t){const n=await this.getBestToken();return cn({...this.config,token:n,dmID:t})}async createModel(t){const n=await this.getBestToken();return dn({...this.config,token:n,value:t})}async editModel(t,n){const r=await this.getBestToken();return un({...this.config,token:r,modelID:t,value:n})}async deleteModel(t){const n=await this.getBestToken();return ln({...this.config,token:n,modelID:t})}async createTemplate(t){const n=await this.getBestToken();return fn({...this.config,token:n,value:t})}async createAssetGroup(t){const n=await this.getBestToken();return gn({...this.config,token:n,value:t})}async editAssetGroup(t,n){const r=await this.getBestToken();return mn({...this.config,token:r,assetGroupID:t,value:n})}async editAsset(t,n){const r=await this.getBestToken();return hn({...this.config,token:r,assetID:t,value:n})}async editDmClient(t,n){const r=await this.getBestToken();return pn({...this.config,token:r,clientID:t,value:n})}async createRole(t){const n=await this.getBestToken();return yn({...this.config,token:n,value:t})}async editRole(t,n){const r=await this.getBestToken();return kn({...this.config,token:r,roleID:t,value:n})}async deleteRole(t){const n=await this.getBestToken();return wn({...this.config,token:n,roleID:t})}async editDmAccount(t,n){const r=await this.getBestToken();return Dn({...this.config,token:r,accountID:t,value:n})}async deleteDmAccount(t){const n=await this.getBestToken();return Tn({...this.config,token:n,accountID:t})}async getStats(t={}){const n=await this.getBestToken();return bn({...this.config,token:n,options:t})}async getHistory(t={}){const n=await this.getBestToken();return $n({...this.config,token:n,options:t})}async createAccountClient(t){const n=await this.getBestToken();return En({...this.config,token:n,value:t})}async editAccountClient(t,n){const r=await this.getBestToken();return vn({...this.config,token:r,clientID:t,value:n})}async deleteAccountClient(t){const n=await this.getBestToken();return In({...this.config,token:n,clientID:t})}async createGroup(t){const n=await this.getBestToken();return An({...this.config,token:n,value:t})}async editGroup(t,n){const r=await this.getBestToken();return Sn({...this.config,token:r,groupID:t,value:n})}async deleteGroup(t){const n=await this.getBestToken();return _n({...this.config,token:n,groupID:t})}async createInvite(t){const n=await this.getBestToken();return qn({...this.config,token:n,value:t})}async editInvite(t,n){const r=await this.getBestToken();return On({...this.config,token:r,inviteID:t,value:n})}async deleteInvite(t){const n=await this.getBestToken();return Cn({...this.config,token:n,inviteID:t})}async editAccount(t,n){const r=await this.getBestToken();return Un({...this.config,token:r,accountID:t,value:n})}async listTokens(t){const n=await this.getBestToken();return Ln({...this.config,token:n,accountID:t})}async createToken(t){const n=await this.getBestToken();return Mn({...this.config,token:n,accountID:t})}async deleteToken(t,n){const r=await this.getBestToken();return Rn({...this.config,token:r,accountID:t,accessTokenID:n})}storageAdapter(t){return this.set({storageAdapter:t})}removeToken(t){if(!this.config.storageAdapter)throw new Error("cannot removeToken: no storageAdapter defined!");const{remove:n}=this.config.storageAdapter;n(t)}getToken(t){if(!this.config.storageAdapter)throw new Error("cannot getAuth: no storageAdapter defined!");const{get:n}=this.config.storageAdapter;return n(t)}getPublicToken(){return this.config.token||this.getToken(I(this.config))}getEcToken(){return this.config.token||this.getToken(b(this.config))}setToken(t,n){if(!this.config.storageAdapter)throw new Error("cannot setEcToken: no storageAdapter defined!");return this.config.storageAdapter.set(t,n)}setEcToken(t){this.setToken(b(this.config),t)}removeEcToken(){this.removeToken(b(this.config))}setPublicToken(t){this.setToken(I(this.config),t)}loginEc(t){return Kt({...this.config,...t}).then(n=>this.setToken(b(this.config),n.token))}loginPublic(t){return zt({...this.config,...t}).then(n=>this.setToken(I(this.config),n.token))}logoutPublic(){const t=this.getPublicToken();return Yt({...this.config,token:t}).then(()=>this.removeToken(I(this.config)))}logoutEc(){const t=this.getEcToken();return Vt({...this.config,token:t}).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(t=!0){return this.set({_clean:t})}maybeClean(t){return this.config._clean?Pn(t):t}model(t){return this.set({model:t})}token(t){return this.set({token:t})}dmShortID(t){return this.set({dmShortID:t})}dm(t){return this.dmShortID(t)}dmID(t){return this.set({dmID:t})}assetGroup(t){return this.set({assetGroup:t})}assetgroup(t){return this.assetGroup(t)}subdomain(t){return this.set({subdomain:t})}resource(t){return this.set({resource:t})}route(t){return this.set({route:t})}publicApi(){return Qt(this.config)}async getDatamanager(t){const n=await this.getBestToken();return Zt({...this.config,dmID:t,token:n})}async dmList(t={}){const n=await this.getBestToken();return Wt({...this.config,options:t,token:n})}async modelList(t={}){const n=await this.getBestToken();return Xt({...this.config,options:t,token:n})}}const M=ee.join($e.homedir(),".ec-fdk"),R=ee.join(M,"auth.json");function L(){try{return E.existsSync(R)?JSON.parse(E.readFileSync(R,"utf-8")):{}}catch{return{}}}function W(e){E.existsSync(M)||E.mkdirSync(M,{recursive:!0,mode:448}),E.writeFileSync(R,JSON.stringify(e,null,2),{mode:384})}const $={get(e){return L()[e]},set(e,t){const n=L();n[e]=t,W(n)},remove(e){const t=L();delete t[e],W(t)}};function Bn(e){const t=Ee.createInterface({input:process.stdin,output:process.stderr});return new Promise(n=>{t.question(e,r=>{t.close(),n(r)})})}function Gn(e){return new Promise(t=>{process.stderr.write(e);const n=process.stdin;n.setRawMode(!0),n.resume(),n.setEncoding("utf-8");let r="";const o=a=>{for(const i of a){if(i===""&&(process.stderr.write(`
|
|
2
|
+
"use strict";var he=Object.create;var z=Object.defineProperty;var pe=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var ke=Object.getPrototypeOf,we=Object.prototype.hasOwnProperty;var De=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ye(t))!we.call(e,s)&&s!==n&&z(e,s,{get:()=>t[s],enumerable:!(r=pe(t,s))||r.enumerable});return e};var b=(e,t,n)=>(n=e!=null?he(ke(e)):{},De(t||!e||!e.__esModule?z(n,"default",{value:e,enumerable:!0}):n,e));const Te=require("node:util"),be=require("node:module"),v=require("node:fs"),te=require("node:path"),$e=require("node:os"),Ee=require("node:readline"),G=require("node:crypto"),ve=require("node:http"),Ie=require("node:child_process");async function f(e,t={},n={}){const{token:r,rawRes:s}=t;r&&(n.headers={...n.headers||{},Authorization:`Bearer ${r}`});const a=await fetch(e,n);if(!a.ok){if(a.headers.get("content-type")?.includes("application/json")){const o=await a.json(),c=`${o.title}
|
|
3
|
+
${o.detail}
|
|
4
|
+
${o.verbose}`;throw new Error(c)}throw new Error(`unexpected fetch error: ${a.statusText}`)}if(s)return a;if(a.status===204)return;const i=await a.text();return i?JSON.parse(i):void 0}const O={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 m(e,t="stage",n="datamanager"){const r=O[n];if(!r)throw new Error(`subdomain "${n}" not found. Try one of ${Object.keys(O).join(", ")}`);const s=r[t];if(!s)throw new Error(`env "${t}" not found. Try one of ${Object.keys(r[t]).join(", ")}`);return s+e}function h(e,t=!0){return Object.entries(e).sort((n,r)=>n[0].localeCompare(r[0])).map(([n,r])=>`${n}=${r}`).join("&")}function d(e){Object.entries(e).forEach(([t,n])=>{if(n===void 0)throw new Error(`expected ${t} to be set!`)})}const ne={stage:"https://accounts.cachena.entrecode.de/",live:"https://accounts.entrecode.de/"};async function Ae(e){let{env:t,dmShortID:n,email:r,password:s}=e;d({env:t,dmShortID:n,email:r,password:s});const a=m(`api/${n}/_auth/login?clientID=rest`,t);return await f(a,{},{method:"POST",body:JSON.stringify({email:r,password:s}),headers:{"Content-Type":"application/json"}})}async function Se(e){let{env:t,email:n,password:r}=e;d({env:t,email:n,password:r});const s=`${ne[t]}auth/login?clientID=rest`;return await f(s,{},{method:"POST",body:JSON.stringify({email:n,password:r}),headers:{"Content-Type":"application/json"}})}async function _e(e){let{dmShortID:t,env:n,token:r}=e;d({dmShortID:t,env:n,token:r});const s=m(`api/${t}/_auth/logout?clientID=rest&token=${r}`,n);return await f(s,{rawRes:!0},{method:"POST"})}async function qe(e){let{env:t,token:n}=e;d({env:t,token:n});const r=`${ne[t]}auth/logout?clientID=rest`;return await f(r,{rawRes:!0,token:n},{method:"POST"})}function Oe({dmShortID:e}){return d({dmShortID:e}),e}function Le({env:e}){return d({env:e}),e}let Ce=["created","creator","id","modified","private","_created","_creator","_embedded","_entryTitle","_id","_links","_modelTitle","_modelTitleField","_modified"];function re(e){let t={};for(let n in e)Ce.includes(n)||(t[n]=e[n]);return t}function Ue(e){return JSON.parse(JSON.stringify(e))}async function Me(e){let{env:t,dmShortID:n}=e;d({env:t,dmShortID:n});const r=m(`api/${n}`,t);return f(r,e)}async function se(e){let{env:t,dmShortID:n,model:r,options:s={}}=e;d({env:t,dmShortID:n,model:r}),s={size:50,page:1,_list:!0,...s};const a=h(s),i=m(`api/${n}/${r}?${a}`,t),{count:o,total:c,_embedded:u}=await f(i,e);let g=u?u[`${n}:${r}`]:[];return g=Array.isArray(g)?g:[g],{count:o,total:c,items:g}}function Re({env:e,dmShortID:t,model:n,entryID:r,token:s}){d({env:e,dmShortID:t,model:n,entryID:r});const a=h({_id:r}),i=m(`api/${t}/${n}?${a}`,e);return f(i,{token:s})}async function Pe({env:e,dmShortID:t,model:n,value:r,token:s}){d({env:e,dmShortID:t,model:n,value:r});const a=m(`api/${t}/${n}`,e);return await f(a,{token:s},{method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}})}async function ae({env:e,dmShortID:t,model:n,entryID:r,value:s,token:a,safePut:i=!1}){d({env:e,dmShortID:t,model:n,entryID:r,value:s});const o={"Content-Type":"application/json"};if(i){if(!("_modified"in s))throw new Error("expected _modified to be set!");o["If-Unmodified-Since"]=new Date(s._modified).toUTCString()}const c=m(`api/${t}/${n}?_id=${r}`,e);return s=Ue(s),s=re(s),await f(c,{token:a},{method:"PUT",headers:o,body:JSON.stringify(s)})}function oe({env:e,dmShortID:t,model:n,entryID:r,token:s}){d({env:e,dmShortID:t,model:n,entryID:r});const a=m(`api/${t}/${n}?_id=${r}`,e);return f(a,{token:s,rawRes:!0},{method:"DELETE",headers:{"Content-Type":"application/json"}})}async function Be(e,t){let{env:n,dmShortID:r,model:s,options:a={}}=e;d({env:n,dmShortID:r,model:s}),e.options={size:50,page:1,_list:!0,...a};let i=0,o,c=[];for(;o===void 0||i<o;){const u=await se(e);for(let g of u.items)c.push(await t(g));i+=u.items.length,o=u.total,e.options.page++}return c}async function Ge({env:e,dmShortID:t,model:n,withMetadata:r}){d({env:e,dmShortID:t,model:n});const s=m(`api/schema/${t}/${n}`,e),a=await f(s),i=a?.allOf?.[1];if(typeof i.properties!="object")throw new Error(`getSchema: ${s} returned unexpected format: ${JSON.stringify(a)}`);const{properties:o}=i,c=re(o);for(let u in c){let g=c[u];if(g.required=i.required.includes(u),c[u]?.oneOf&&delete c[u]?.oneOf,g.title?.includes("<")&&g.title?.includes(">")){const y=g.title.split("<")[1].slice(0,-1),w=g.title.split("<")[0];g.type=w,y.includes(":")?g.resource=y.split(":")[1]:g.resource=y}else["asset","entry","assets","entries"].includes(g.title)?(g.type=g.title,g.resource=null):g.type=g.title;delete c[u].title}if(r){const u=o._modelTitle.title,g=o._modelTitleField.title;return{properties:c,meta:{modelTitleField:g,modelTitle:u}}}return c}function ie(e){return Object.entries(e).map(([t,n])=>typeof n!="object"?{[t]:String(n)}:{...n.sort&&{sort:Array.isArray(n)?n.join(","):n},...n.search&&{[t+"~"]:n.search},...n.notNull&&{[t+"!"]:""},...n.null&&{[t]:""},...n.any&&{[t]:n.any.join(",")},...n.from&&{[t+"From"]:n.from},...n.to&&{[t+"To"]:n.to}}).reduce((t,n)=>({...t,...n}),{})}const Ne=ie;function N(e){return e._links.collection.href.split("/").slice(-2)[0]}function ce(e){const t=e._links.collection.href.split("api/")[0];return Object.keys(O.datamanager).find(r=>O.datamanager[r]===t)}const de=e=>{const t=N(e),n=ce(e),r=e._modelTitle,s=e.id;return{dmShortID:t,env:n,model:r,entryID:s}},xe=e=>oe(de(e)),je=(e,t)=>ae({...de(e),value:t});function Je(e,t){const n=N(t);return t._embedded[`${n}:${t._modelTitle}/${e}/asset`]}async function Fe({env:e,dmShortID:t,assetGroup:n,assetID:r,token:s}){d({env:e,dmShortID:t,assetGroup:n,assetID:r});const a=h({assetID:r}),i=m(`a/${t}/${n}?${a}`,e),{_embedded:o}=await f(i,{token:s});return o?o["ec:dm-asset"]:void 0}async function He(e){let{env:t,dmShortID:n,assetGroup:r,token:s,options:a={}}=e;d({env:t,dmShortID:n,assetGroup:r}),a={size:50,page:1,_list:!0,...a};const i=h(a),o=m(`a/${n}/${r}?${i}`,t),{count:c,total:u,_embedded:g}=await f(o,{token:s});let y=g?g["ec:dm-asset"]:[];return y=Array.isArray(y)?y:[y],{count:c,total:u,items:y}}async function ze({env:e,dmShortID:t,assetGroup:n,token:r,file:s,name:a,options:i}){d({env:e,dmShortID:t,assetGroup:n,file:s});const o=m(`a/${t}/${n}`,e),c=new FormData;return c.append("file",s,a),i&&Object.keys(i).forEach(g=>{c.append(g,i[g])}),(await f(o,{token:r},{method:"POST",body:c}))._embedded["ec:dm-asset"]}async function Ke({env:e,dmShortID:t,assetGroup:n,files:r,options:s}){d({env:e,dmShortID:t,assetGroup:n,files:r});const a=m(`a/${t}/${n}`,e),i=new FormData;r.forEach(c=>{i.append("file",c)}),s&&Object.keys(s).forEach(c=>{i.append(c,s[c])});const o=await f(a,{},{method:"POST",body:i});return Array.isArray(o._embedded["ec:dm-asset"])?o._embedded["ec:dm-asset"]:[o._embedded["ec:dm-asset"]]}async function Ve({env:e,dmShortID:t,assetGroup:n,assetID:r,token:s}){d({env:e,dmShortID:t,assetGroup:n,assetID:r});const a=m(`a/${t}/${n}/${r}`,e);await f(a,{token:s,rawRes:!0},{method:"DELETE"})}function Ye(e,t,n=!1){let r,s;return(n?e?.thumbnails:e?.fileVariants)?.forEach(i=>{const{resolution:{width:o,height:c}}=i,u=Math.abs(Math.max(o,c)-t);(!s||u<s)&&(s=u,r=i)}),r?.url??e?.file?.url??null}function We(e="stage",t,n,r,s=!1){const a=Math.max(r.file.resolution.width,r.file.resolution.height),i=n.filter(c=>c<a),o=`https://datamanager${e==="stage"?".cachena":""}.entrecode.de`;return s?i.map(c=>{const u=r.thumbnails.find(w=>c===w.dimension),g=`${o}/t/${t}/${r.assetID}/${c}`,y=u?u.url:g;return{size:c,url:y,generated:u}}):i.map(c=>{const u=r.fileVariants.find(w=>c===Math.max(w.resolution.width,w.resolution.height)),g=`${o}/f/${t}/${r.assetID}/${c}`,y=u?u.url:g;return{size:c,url:y,generated:u}})}const p={"Content-Type":"application/json"};async function Xe(e){let{env:t,dmID:n,token:r}=e;d({env:t,dmID:n});const s=m(`?dataManagerID=${n}`,t);return f(s,{token:r})}async function Qe(e){let{env:t,options:n={}}=e;d({env:t}),n={size:25,page:1,_list:!0,...n};const r=h(n),s=m(`?${r}`,t),{count:a,total:i,_embedded:o}=await f(s,e);let c=o?o["ec:datamanager"]:[];return c=Array.isArray(c)?c:[c],{count:a,total:i,items:c}}async function Ze(e){let{env:t,dmID:n,options:r={}}=e;d({env:t,dmID:n}),r={size:25,dataManagerID:n,page:1,_list:!0,...r};const s=h(r),a=m(`model?${s}`,t),{count:i,total:o,_embedded:c}=await f(a,e);let u=c?c["ec:model"]:[];return u=Array.isArray(u)?u:[u],{count:i,total:o,items:u}}async function et(e){let{env:t,resource:n,options:r={},subdomain:s="datamanager"}=e;d({env:t,subdomain:s,resource:n}),r={size:25,page:1,_list:!0,...r};const a=h(r),i=m(`${n}?${a}`,t,s),{count:o,total:c,_embedded:u}=await f(i,e);let g=u?u[Object.keys(u)[0]]:[];return g=Array.isArray(g)?g:[g],{count:o,total:c,items:g}}async function tt(e){let{env:t,resource:n,options:r={},subdomain:s="datamanager"}=e;d({env:t,subdomain:s,resource:n});const a=h(r),i=m(`${n}?${a}`,t,s);return f(i,e)}async function nt(e){let{env:t,resource:n,options:r={},subdomain:s="datamanager",value:a}=e;d({env:t,subdomain:s,resource:n,value:a});const i=h(r),o=m(`${n}?${i}`,t,s);return f(o,e,{method:"PUT",body:JSON.stringify(a),headers:p})}async function rt(e){let{env:t,resource:n,options:r={},subdomain:s="datamanager"}=e;d({env:t,subdomain:s,resource:n});const a=h(r),i=m(`${n}?${a}`,t,s);return f(i,{...e,rawRes:!0},{method:"DELETE",headers:p})}async function st(e,t={}){let{env:n,route:r,options:s={},subdomain:a="datamanager"}=e;d({env:n,subdomain:a,route:r}),s={...s};const i=h(s),o=m(`${r}?${i}`,n,a);return f(o,e,t)}async function at(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const s=m("",t);return f(s,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function ot(e){let{env:t,token:n,dmID:r,value:s}=e;d({env:t,dmID:r,value:s});const a=h({dataManagerID:r}),i=m(`?${a}`,t);return f(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function it(e){let{env:t,token:n,dmID:r}=e;d({env:t,dmID:r});const s=h({dataManagerID:r}),a=m(`?${s}`,t);return f(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function ct(e){let{env:t,token:n,dmID:r,value:s}=e;d({env:t,dmID:r,value:s});const a=h({dataManagerID:r}),i=m(`model?${a}`,t);return f(i,{token:n},{method:"POST",body:JSON.stringify(s),headers:p})}async function dt(e){let{env:t,token:n,dmID:r,modelID:s,value:a}=e;d({env:t,dmID:r,modelID:s,value:a});const i=h({dataManagerID:r,modelID:s}),o=m(`model?${i}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function ut(e){let{env:t,token:n,dmID:r,modelID:s}=e;d({env:t,dmID:r,modelID:s});const a=h({dataManagerID:r,modelID:s}),i=m(`model?${a}`,t);return f(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function lt(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const s=m("template",t);return f(s,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function ft(e){let{env:t,token:n,dmID:r,value:s}=e;d({env:t,dmID:r,value:s});const a=h({dataManagerID:r}),i=m(`assetgroup?${a}`,t);return f(i,{token:n},{method:"POST",body:JSON.stringify(s),headers:p})}async function gt(e){let{env:t,token:n,dmID:r,assetGroupID:s,value:a}=e;d({env:t,dmID:r,assetGroupID:s,value:a});const i=h({dataManagerID:r,assetGroupID:s}),o=m(`assetgroup?${i}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function mt(e){let{env:t,token:n,dmShortID:r,assetGroup:s,assetID:a,value:i}=e;d({env:t,dmShortID:r,assetGroup:s,assetID:a,value:i});const o=m(`a/${r}/${s}/${a}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(i),headers:p})}async function ht(e){let{env:t,token:n,dmID:r,clientID:s,value:a}=e;d({env:t,dmID:r,clientID:s,value:a});const i=h({dataManagerID:r,clientID:s}),o=m(`client?${i}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function pt(e){let{env:t,token:n,dmID:r,value:s}=e;d({env:t,dmID:r,value:s});const a=h({dataManagerID:r}),i=m(`role?${a}`,t);return f(i,{token:n},{method:"POST",body:JSON.stringify(s),headers:p})}async function yt(e){let{env:t,token:n,dmID:r,roleID:s,value:a}=e;d({env:t,dmID:r,roleID:s,value:a});const i=h({dataManagerID:r,roleID:s}),o=m(`role?${i}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function kt(e){let{env:t,token:n,dmID:r,roleID:s}=e;d({env:t,dmID:r,roleID:s});const a=h({dataManagerID:r,roleID:s}),i=m(`role?${a}`,t);return f(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function wt(e){let{env:t,token:n,dmID:r,accountID:s,value:a}=e;d({env:t,dmID:r,accountID:s,value:a});const i=h({dataManagerID:r,accountID:s}),o=m(`account?${i}`,t);return f(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function Dt(e){let{env:t,token:n,dmID:r,accountID:s}=e;d({env:t,dmID:r,accountID:s});const a=h({dataManagerID:r,accountID:s}),i=m(`account?${a}`,t);return f(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Tt(e){let{env:t,token:n,options:r={}}=e;d({env:t});const s=h(r),a=m(`stats?${s}`,t);return f(a,{token:n})}async function bt(e){let{env:t,token:n,options:r={}}=e;d({env:t});const s=h(r),a=m(`entries?${s}`,t,"dm-history");return f(a,{token:n})}async function $t(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const s=m("client",t,"accounts");return f(s,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function Et(e){let{env:t,token:n,clientID:r,value:s}=e;d({env:t,clientID:r,value:s});const a=h({clientID:r}),i=m(`client?${a}`,t,"accounts");return f(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function vt(e){let{env:t,token:n,clientID:r}=e;d({env:t,clientID:r});const s=h({clientID:r}),a=m(`client?${s}`,t,"accounts");return f(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function It(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const s=m("group",t,"accounts");return f(s,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function At(e){let{env:t,token:n,groupID:r,value:s}=e;d({env:t,groupID:r,value:s});const a=h({groupID:r}),i=m(`group?${a}`,t,"accounts");return f(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function St(e){let{env:t,token:n,groupID:r}=e;d({env:t,groupID:r});const s=h({groupID:r}),a=m(`group?${s}`,t,"accounts");return f(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function _t(e){let{env:t,token:n,value:r}=e;d({env:t,value:r});const s=m("invite",t,"accounts"),a=await f(s,{token:n},{method:"POST",body:JSON.stringify(r),headers:p});return a?._embedded?.["ec:invite"]??a}async function qt(e){let{env:t,token:n,inviteID:r,value:s}=e;d({env:t,inviteID:r,value:s});const a=h({invite:r}),i=m(`invite?${a}`,t,"accounts");return f(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function Ot(e){let{env:t,token:n,inviteID:r}=e;d({env:t,inviteID:r});const s=h({invite:r}),a=m(`invite?${s}`,t,"accounts");return f(a,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Lt(e){let{env:t,token:n,accountID:r,value:s}=e;d({env:t,accountID:r,value:s});const a=h({accountID:r}),i=m(`account?${a}`,t,"accounts");return f(i,{token:n},{method:"PUT",body:JSON.stringify(s),headers:p})}async function Ct(e){let{env:t,token:n,accountID:r}=e;d({env:t,accountID:r});const s=h({accountID:r}),a=m(`account/tokens?${s}`,t,"accounts");let o=(await f(a,{token:n}))?._embedded?.["ec:account/token"]??[];return Array.isArray(o)?o:[o]}async function Ut(e){let{env:t,token:n,accountID:r}=e;d({env:t,accountID:r});const s=h({accountID:r}),a=m(`account/tokens?${s}`,t,"accounts");return f(a,{token:n},{method:"POST",headers:p})}async function Mt(e){let{env:t,token:n,accountID:r,accessTokenID:s}=e;d({env:t,accountID:r,accessTokenID:s});const a=h({accessTokenID:s,accountID:r}),i=m(`account/tokens?${a}`,t,"accounts");return f(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}const Rt=Object.freeze(Object.defineProperty({__proto__:null,assetList:He,createAccountClient:$t,createAsset:ze,createAssetGroup:ft,createAssets:Ke,createDatamanager:at,createEntry:Pe,createGroup:It,createInvite:_t,createModel:ct,createRole:pt,createTemplate:lt,createToken:Ut,deleteAccountClient:vt,deleteAsset:Ve,deleteDatamanager:it,deleteDmAccount:Dt,deleteEntry:oe,deleteEntryObject:xe,deleteGroup:St,deleteInvite:Ot,deleteModel:ut,deleteRole:kt,deleteToken:Mt,dmList:Qe,editAccount:Lt,editAccountClient:Et,editAsset:mt,editAssetGroup:gt,editDatamanager:ot,editDmAccount:wt,editDmClient:ht,editEntry:ae,editEntryObject:je,editGroup:At,editInvite:qt,editModel:dt,editRole:yt,entryList:se,fileVariant:Ye,filterOptions:Ne,getAsset:Fe,getDatamanager:Xe,getEcAuthKey:Le,getEntry:Re,getEntryAsset:Je,getEntryEnv:ce,getEntryShortID:N,getFileVariants:We,getHistory:bt,getPublicAuthKey:Oe,getSchema:Ge,getStats:Tt,listTokens:Ct,loginEc:Se,loginPublic:Ae,logoutEc:qe,logoutPublic:_e,mapEntries:Be,modelList:Ze,publicApi:Me,raw:st,resourceDelete:rt,resourceEdit:nt,resourceGet:tt,resourceList:et,sdkOptions:ie},Symbol.toStringTag,{value:"Module"})),{entryList:K,mapEntries:Pt,getEntry:Bt,getAsset:Gt,assetList:V,createAsset:Nt,createAssets:xt,deleteAsset:jt,createEntry:Jt,editEntry:Y,deleteEntry:Ft,getSchema:Ht,loginPublic:zt,loginEc:Kt,logoutEc:Vt,logoutPublic:Yt,getEcAuthKey:E,getPublicAuthKey:A,dmList:Wt,modelList:Xt,publicApi:Qt,getDatamanager:Zt,resourceList:en,resourceGet:tn,resourceEdit:nn,resourceDelete:rn,raw:sn,createDatamanager:an,editDatamanager:on,deleteDatamanager:cn,createModel:dn,editModel:un,deleteModel:ln,createTemplate:fn,createAssetGroup:gn,editAssetGroup:mn,editAsset:hn,editDmClient:pn,createRole:yn,editRole:kn,deleteRole:wn,editDmAccount:Dn,deleteDmAccount:Tn,getStats:bn,getHistory:$n,createAccountClient:En,editAccountClient:vn,deleteAccountClient:In,createGroup:An,editGroup:Sn,deleteGroup:_n,createInvite:qn,editInvite:On,deleteInvite:Ln,editAccount:Cn,listTokens:Un,createToken:Mn,deleteToken:Rn}=Rt;function W(e){if(!e||typeof e!="object")return e;const{_links:t,_embedded:n,...r}=e;return r}function Pn(e){return!e||typeof e!="object"?e:Array.isArray(e.items)?{...e,items:e.items.map(W)}:W(e)}class x{constructor(t={}){if(!t.storageAdapter){let n=new Map;t.storageAdapter={get:r=>n.get(r),set:(r,s)=>n.set(r,s),remove:r=>n.delete(r)}}this.config=t}set(t){return new x({...this.config,...t})}async entries(t={}){const n=await this.getBestToken();return K({...this.config,options:t,token:n})}async entryList(t){const n=await this.getBestToken();return K({...this.config,options:t,token:n}).then(r=>this.maybeClean(r))}async mapEntries(t,n={}){const r=await this.getBestToken();return Pt({...this.config,options:n,token:r},t)}async getEntry(t){const n=await this.getBestToken();return Bt({...this.config,entryID:t,token:n}).then(r=>this.maybeClean(r))}async editEntrySafe(t,n){const r=await this.getBestToken();return Y({...this.config,entryID:t,token:r,value:n,safePut:!0}).then(s=>this.maybeClean(s))}async getSchema(){return Ht(this.config)}async assets(t){const n=await this.getBestToken();return V({...this.config,options:t,token:n})}async assetList(t){const n=await this.getBestToken();return V({...this.config,options:t,token:n})}async createAsset(t){const{file:n,name:r,options:s}=t,a=await this.getBestToken();return Nt({...this.config,file:n,name:r,options:s,token:a})}async createAssets(t){const{files:n,options:r}=t,s=await this.getBestToken();return xt({...this.config,files:n,options:r,token:s})}async deleteAsset(t){const n=await this.getBestToken();return jt({...this.config,token:n,assetID:t})}async getAsset(t){const n=await this.getBestToken();return Gt({...this.config,assetID:t,token:n})}async createEntry(t){const n=await this.getBestToken();return Jt({...this.config,token:n,value:t}).then(r=>this.maybeClean(r))}async editEntry(t,n){const r=await this.getBestToken();return Y({...this.config,entryID:t,token:r,value:n}).then(s=>this.maybeClean(s))}async deleteEntry(t){const n=await this.getBestToken();return Ft({...this.config,token:n,entryID:t})}async resourceList(t){const n=await this.getBestToken();return en({...this.config,options:t,token:n})}async resourceGet(t){const n=await this.getBestToken();return tn({...this.config,options:t,token:n})}async resourceEdit(t,n){const r=await this.getBestToken();return nn({...this.config,options:t,token:r,value:n})}async resourceDelete(t){const n=await this.getBestToken();return rn({...this.config,options:t,token:n})}async raw(t,n){const r=await this.getBestToken();return sn({...this.config,options:t,token:r},n)}async createDatamanager(t){const n=await this.getBestToken();return an({...this.config,token:n,value:t})}async editDatamanager(t,n){const r=await this.getBestToken();return on({...this.config,token:r,dmID:t,value:n})}async deleteDatamanager(t){const n=await this.getBestToken();return cn({...this.config,token:n,dmID:t})}async createModel(t){const n=await this.getBestToken();return dn({...this.config,token:n,value:t})}async editModel(t,n){const r=await this.getBestToken();return un({...this.config,token:r,modelID:t,value:n})}async deleteModel(t){const n=await this.getBestToken();return ln({...this.config,token:n,modelID:t})}async createTemplate(t){const n=await this.getBestToken();return fn({...this.config,token:n,value:t})}async createAssetGroup(t){const n=await this.getBestToken();return gn({...this.config,token:n,value:t})}async editAssetGroup(t,n){const r=await this.getBestToken();return mn({...this.config,token:r,assetGroupID:t,value:n})}async editAsset(t,n){const r=await this.getBestToken();return hn({...this.config,token:r,assetID:t,value:n})}async editDmClient(t,n){const r=await this.getBestToken();return pn({...this.config,token:r,clientID:t,value:n})}async createRole(t){const n=await this.getBestToken();return yn({...this.config,token:n,value:t})}async editRole(t,n){const r=await this.getBestToken();return kn({...this.config,token:r,roleID:t,value:n})}async deleteRole(t){const n=await this.getBestToken();return wn({...this.config,token:n,roleID:t})}async editDmAccount(t,n){const r=await this.getBestToken();return Dn({...this.config,token:r,accountID:t,value:n})}async deleteDmAccount(t){const n=await this.getBestToken();return Tn({...this.config,token:n,accountID:t})}async getStats(t={}){const n=await this.getBestToken();return bn({...this.config,token:n,options:t})}async getHistory(t={}){const n=await this.getBestToken();return $n({...this.config,token:n,options:t})}async createAccountClient(t){const n=await this.getBestToken();return En({...this.config,token:n,value:t})}async editAccountClient(t,n){const r=await this.getBestToken();return vn({...this.config,token:r,clientID:t,value:n})}async deleteAccountClient(t){const n=await this.getBestToken();return In({...this.config,token:n,clientID:t})}async createGroup(t){const n=await this.getBestToken();return An({...this.config,token:n,value:t})}async editGroup(t,n){const r=await this.getBestToken();return Sn({...this.config,token:r,groupID:t,value:n})}async deleteGroup(t){const n=await this.getBestToken();return _n({...this.config,token:n,groupID:t})}async createInvite(t){const n=await this.getBestToken();return qn({...this.config,token:n,value:t})}async editInvite(t,n){const r=await this.getBestToken();return On({...this.config,token:r,inviteID:t,value:n})}async deleteInvite(t){const n=await this.getBestToken();return Ln({...this.config,token:n,inviteID:t})}async editAccount(t,n){const r=await this.getBestToken();return Cn({...this.config,token:r,accountID:t,value:n})}async listTokens(t){const n=await this.getBestToken();return Un({...this.config,token:n,accountID:t})}async createToken(t){const n=await this.getBestToken();return Mn({...this.config,token:n,accountID:t})}async deleteToken(t,n){const r=await this.getBestToken();return Rn({...this.config,token:r,accountID:t,accessTokenID:n})}storageAdapter(t){return this.set({storageAdapter:t})}removeToken(t){if(!this.config.storageAdapter)throw new Error("cannot removeToken: no storageAdapter defined!");const{remove:n}=this.config.storageAdapter;n(t)}getToken(t){if(!this.config.storageAdapter)throw new Error("cannot getAuth: no storageAdapter defined!");const{get:n}=this.config.storageAdapter;return n(t)}getPublicToken(){return this.config.token||this.getToken(A(this.config))}getEcToken(){return this.config.token||this.getToken(E(this.config))}setToken(t,n){if(!this.config.storageAdapter)throw new Error("cannot setEcToken: no storageAdapter defined!");return this.config.storageAdapter.set(t,n)}setEcToken(t){this.setToken(E(this.config),t)}removeEcToken(){this.removeToken(E(this.config))}setPublicToken(t){this.setToken(A(this.config),t)}loginEc(t){return Kt({...this.config,...t}).then(n=>this.setToken(E(this.config),n.token))}loginPublic(t){return zt({...this.config,...t}).then(n=>this.setToken(A(this.config),n.token))}logoutPublic(){const t=this.getPublicToken();return Yt({...this.config,token:t}).then(()=>this.removeToken(A(this.config)))}logoutEc(){const t=this.getEcToken();return Vt({...this.config,token:t}).then(()=>this.removeToken(E(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(t=!0){return this.set({_clean:t})}maybeClean(t){return this.config._clean?Pn(t):t}model(t){return this.set({model:t})}token(t){return this.set({token:t})}dmShortID(t){return this.set({dmShortID:t})}dm(t){return this.dmShortID(t)}dmID(t){return this.set({dmID:t})}assetGroup(t){return this.set({assetGroup:t})}assetgroup(t){return this.assetGroup(t)}subdomain(t){return this.set({subdomain:t})}resource(t){return this.set({resource:t})}route(t){return this.set({route:t})}publicApi(){return Qt(this.config)}async getDatamanager(t){const n=await this.getBestToken();return Zt({...this.config,dmID:t,token:n})}async dmList(t={}){const n=await this.getBestToken();return Wt({...this.config,options:t,token:n})}async modelList(t={}){const n=await this.getBestToken();return Xt({...this.config,options:t,token:n})}}const M=te.join($e.homedir(),".ec-fdk"),R=te.join(M,"auth.json");function U(){try{return v.existsSync(R)?JSON.parse(v.readFileSync(R,"utf-8")):{}}catch{return{}}}function X(e){v.existsSync(M)||v.mkdirSync(M,{recursive:!0,mode:448}),v.writeFileSync(R,JSON.stringify(e,null,2),{mode:384})}const T={get(e){return U()[e]},set(e,t){const n=U();n[e]=t,X(n)},remove(e){const t=U();delete t[e],X(t)}};function Bn(e){const t=Ee.createInterface({input:process.stdin,output:process.stderr});return new Promise(n=>{t.question(e,r=>{t.close(),n(r)})})}function Gn(e){return new Promise(t=>{process.stderr.write(e);const n=process.stdin;n.setRawMode(!0),n.resume(),n.setEncoding("utf-8");let r="";const s=a=>{for(const i of a){if(i===""&&(process.stderr.write(`
|
|
5
5
|
`),process.exit(130)),i==="\r"||i===`
|
|
6
|
-
`){n.setRawMode(!1),n.pause(),n.removeListener("data",
|
|
7
|
-
`),t(r);return}if(i===""||i==="\b"){r.length>0&&(r=r.slice(0,-1),process.stderr.write("\b \b"));continue}r+=i,process.stderr.write("*")}};n.on("data",
|
|
8
|
-
<div style="text-align:center"><h1>Login successful</h1><p>You can close this tab.</p></div></body></html>`,
|
|
9
|
-
<div style="text-align:center"><h1>Login failed</h1><p>${e}</p></div></body></html>`;async function Hn(e,t){const{tokenEndpoint:n}=
|
|
10
|
-
`),Jn(y)}),c.on("error",y=>{
|
|
6
|
+
`){n.setRawMode(!1),n.pause(),n.removeListener("data",s),process.stderr.write(`
|
|
7
|
+
`),t(r);return}if(i===""||i==="\b"){r.length>0&&(r=r.slice(0,-1),process.stderr.write("\b \b"));continue}r+=i,process.stderr.write("*")}};n.on("data",s)})}const ue={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"}},P="ec-fdk-cli",Q="http://localhost:19836/callback",Nn=12e4;function j(e){return e.toString("base64url")}function xn(){return j(G.randomBytes(32))}function jn(e){return j(G.createHash("sha256").update(e).digest())}function Jn(e){const t=process.platform==="darwin"?"open":process.platform==="win32"?"start":"xdg-open";Ie.exec(`${t} ${JSON.stringify(e)}`)}const Fn=`<!DOCTYPE html><html><body style="font-family:system-ui;display:flex;justify-content:center;align-items:center;height:100vh;margin:0">
|
|
8
|
+
<div style="text-align:center"><h1>Login successful</h1><p>You can close this tab.</p></div></body></html>`,S=e=>`<!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>${e}</p></div></body></html>`;async function Hn(e,t){const{tokenEndpoint:n}=ue[e],r=await fetch(n,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",client_id:P,refresh_token:t})});if(!r.ok){const a=await r.text();throw new Error(`Token refresh failed: ${r.status} ${a}`)}const s=await r.json();if(!s.access_token)throw new Error("No access_token in refresh response");return{access_token:s.access_token,refresh_token:s.refresh_token}}function zn(e){const{authEndpoint:t,tokenEndpoint:n}=ue[e],r=xn(),s=jn(r),a=j(G.randomBytes(16));return new Promise((i,o)=>{const c=ve.createServer(async(y,w)=>{if(!y.url?.startsWith("/callback")){w.writeHead(404),w.end();return}const $=new URL(y.url,"http://localhost").searchParams,J=$.get("code"),ge=$.get("state"),C=$.get("error");if(C){w.writeHead(200,{"Content-Type":"text/html"}),w.end(S($.get("error_description")||C)),g(),o(new Error($.get("error_description")||C));return}if(ge!==a){w.writeHead(200,{"Content-Type":"text/html"}),w.end(S("State mismatch")),g(),o(new Error("State mismatch — possible CSRF attack"));return}if(!J){w.writeHead(200,{"Content-Type":"text/html"}),w.end(S("No authorization code received")),g(),o(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:P,redirect_uri:Q,code:J,code_verifier:r})});if(!D.ok){const me=await D.text();throw new Error(`Token exchange failed: ${D.status} ${me}`)}const F=await D.json(),H=F.access_token;if(!H)throw new Error("No access_token in token response");w.writeHead(200,{"Content-Type":"text/html"}),w.end(Fn),g(),i({access_token:H,refresh_token:F.refresh_token})}catch(D){w.writeHead(200,{"Content-Type":"text/html"}),w.end(S(D.message)),g(),o(D)}}),u=setTimeout(()=>{g(),o(new Error("Login timed out after 2 minutes"))},Nn);function g(){clearTimeout(u),c.close()}c.listen(19836,()=>{const y=`${t}?`+new URLSearchParams({client_id:P,redirect_uri:Q,response_type:"code",scope:"openid offline_access",state:a,code_challenge:s,code_challenge_method:"S256"}).toString();process.stderr.write(`Opening browser for login...
|
|
10
|
+
`),Jn(y)}),c.on("error",y=>{g(),o(new Error(`Could not start local server: ${y.message}`))})})}const B=be.createRequire(typeof document>"u"?require("url").pathToFileURL(__filename).href:document.currentScript&&document.currentScript.src||new URL("cli.cjs",document.baseURI).href),{version:Kn}=B("../package.json"),Vn=`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
15
|
whoami Show current logged-in user
|
|
16
16
|
install-skill Install Claude Code skill (default: ~/.claude/skills, or --dir <path>)
|
|
17
|
+
update Self-update ec.fdk and re-install skill
|
|
17
18
|
|
|
18
19
|
Entry commands (require --dm, --model):
|
|
19
20
|
entryList List entries
|
|
@@ -103,39 +104,43 @@ Options:
|
|
|
103
104
|
-s, --size <n> Page size for list
|
|
104
105
|
-p, --page <n> Page number for list
|
|
105
106
|
--sort <field> Sort field for list
|
|
107
|
+
--fields <f1,f2> Only return specific fields (comma-separated)
|
|
106
108
|
-f, --filter <k=v> Filter for list (repeatable, e.g. -f title~=hello -f ageFrom=5)
|
|
109
|
+
Use -f "field=" for null, -f "field!=" for not null
|
|
107
110
|
--raw Include _links and _embedded in output
|
|
108
111
|
--md Output entries as readable markdown
|
|
109
112
|
-v, --version Show version
|
|
110
113
|
--password Use email/password login instead of browser
|
|
111
|
-
-h, --help Show help`;function
|
|
112
|
-
`),process.exit(2)}function Yn(){return new Promise(e=>{let t="";process.stdin.setEncoding("utf-8"),process.stdin.on("data",n=>t+=n),process.stdin.on("end",()=>e(t))})}async function k(e){if(e)try{return JSON.parse(e)}catch{
|
|
113
|
-
${
|
|
114
|
+
-h, --help Show help`;function _(e){return Object.fromEntries(e.map(t=>{const n=t.indexOf("=");return n===-1&&l(`Invalid filter: "${t}" (expected key=value)`),[t.slice(0,n),t.slice(n+1)]}))}function l(e){process.stderr.write(`Error: ${e}
|
|
115
|
+
`),process.exit(2)}function Yn(){return new Promise(e=>{let t="";process.stdin.setEncoding("utf-8"),process.stdin.on("data",n=>t+=n),process.stdin.on("end",()=>e(t))})}async function k(e){if(e)try{return JSON.parse(e)}catch{l("--data must be valid JSON")}if(!process.stdin.isTTY){const t=await Yn();t.trim()||l("No data provided via stdin");try{return JSON.parse(t)}catch{l("Stdin must be valid JSON")}}l("Provide --data or pipe JSON via stdin")}function I(e){if(!e||typeof e!="object")return e;const{_links:t,_embedded:n,...r}=e;return r}function q(e){return!e||typeof e!="object"?e:Array.isArray(e.items)?{...e,items:e.items.map(I)}:I(e)}const Z=40;function ee(e){return e.length>Z?e.slice(0,Z-2)+"..":e}function le(e){return e==null?"":ee(typeof e=="object"?JSON.stringify(e):String(e))}function fe(e){return Object.keys(e).filter(t=>!t.startsWith("_"))}function L(e,t){return"| "+e.map((n,r)=>n.padEnd(t[r])).join(" | ")+" |"}function Wn(e){const t=fe(e),n=t.map(u=>le(e[u])),r=Math.max(5,...t.map(u=>u.length)),s=Math.max(5,...n.map(u=>u.length)),a=[r,s],i=L(["Field","Value"],a),o="| "+a.map(u=>"-".repeat(u)).join(" | ")+" |",c=t.map((u,g)=>L([u,n[g]],a));return`${i}
|
|
116
|
+
${o}
|
|
114
117
|
${c.join(`
|
|
115
|
-
`)}`}function Xn(e){if(!e.items.length)return"No entries found.";const t=fe(e.items[0]),n=e.items.map(
|
|
118
|
+
`)}`}function Xn(e){if(!e.items.length)return"No entries found.";const t=fe(e.items[0]),n=e.items.map(o=>t.map(c=>le(o[c]))),r=t.map((o,c)=>Math.max(o.length,...n.map(u=>u[c].length))),s=L(t,r),a="| "+r.map(o=>"-".repeat(o)).join(" | ")+" |",i=n.map(o=>L(o,r));return`${s}
|
|
116
119
|
${a}
|
|
117
120
|
${i.join(`
|
|
118
121
|
`)}
|
|
119
122
|
|
|
120
|
-
${e.items.length} of ${e.total} entries`}async function Qn(){const{values:e,positionals:t}=Te.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},dir:{type:"string"},version:{type:"boolean",short:"v"},help:{type:"boolean",short:"h"}}});e.version&&(console.log(Kn),process.exit(0)),(e.help||t.length===0)&&(console.log(Vn),process.exit(0));const n=t[0],r=e.env;r!=="stage"&&r!=="live"&&
|
|
123
|
+
${e.items.length} of ${e.total} entries`}async function Qn(){const{values:e,positionals:t}=Te.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:[]},fields:{type:"string"},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},dir:{type:"string"},version:{type:"boolean",short:"v"},help:{type:"boolean",short:"h"}}});e.version&&(console.log(Kn),process.exit(0)),(e.help||t.length===0)&&(console.log(Vn),process.exit(0));const n=t[0],r=e.env;r!=="stage"&&r!=="live"&&l('--env must be "stage" or "live"');const s=new x({env:r,storageAdapter:T});if(n!=="login"&&n!=="logout"){const a=s.getEcToken(),i=T.get(`${r}_refresh`);if(a&&i)try{const o=JSON.parse(Buffer.from(a.split(".")[1],"base64url").toString());if(o.exp&&o.exp*1e3<Date.now()){const c=await Hn(r,i);s.setEcToken(c.access_token),c.refresh_token&&T.set(`${r}_refresh`,c.refresh_token)}}catch{}}if(n==="login"){try{if(e.password){const a=await Bn("Email: "),i=await Gn("Password: ");await s.loginEc({email:a,password:i})}else{const a=await zn(r);s.setEcToken(a.access_token),a.refresh_token&&T.set(`${r}_refresh`,a.refresh_token)}process.stderr.write(`Logged in to ${r} successfully.
|
|
121
124
|
`)}catch(a){process.stderr.write(`Login failed: ${a.message}
|
|
122
|
-
`),process.exit(1)}return}if(n==="whoami"){const a=
|
|
123
|
-
`),process.exit(1));try{const i=JSON.parse(Buffer.from(a.split(".")[1],"base64url").toString()),
|
|
124
|
-
`)}catch{
|
|
125
|
-
`);return}if(n==="
|
|
126
|
-
`);
|
|
127
|
-
`)
|
|
128
|
-
`);return}
|
|
129
|
-
`);return}
|
|
130
|
-
`);return}case"
|
|
131
|
-
`);return}case"
|
|
132
|
-
`);return}case"
|
|
133
|
-
`);return}case"
|
|
134
|
-
`);return}case"
|
|
135
|
-
`);return}case"
|
|
136
|
-
`);return}case"
|
|
137
|
-
`);return}
|
|
138
|
-
`);return}
|
|
125
|
+
`),process.exit(1)}return}if(n==="whoami"){const a=s.getEcToken();a||(process.stderr.write(`Not logged in to ${r}.
|
|
126
|
+
`),process.exit(1));try{const i=JSON.parse(Buffer.from(a.split(".")[1],"base64url").toString()),o={env:r};i.email&&(o.email=i.email),i.sub&&(o.accountID=i.sub),i.iss&&(o.issuer=i.iss),i.exp&&(o.expires=new Date(i.exp*1e3).toISOString()),process.stdout.write(JSON.stringify(o,null,2)+`
|
|
127
|
+
`)}catch{l("Could not decode token")}return}if(n==="install-skill"){const{mkdirSync:a,copyFileSync:i}=await import("node:fs"),{join:o,resolve:c}=await import("node:path"),{homedir:u}=await import("node:os"),g=e.dir?c(e.dir):o(u(),".claude"),y=o(g,"skills","ec-fdk"),w=B.resolve("../skill/SKILL.md");a(y,{recursive:!0}),i(w,o(y,"SKILL.md")),T.set("skill_path",y),process.stderr.write(`Installed skill to ${y}/SKILL.md
|
|
128
|
+
`);return}if(n==="update"){const{execSync:a}=await import("node:child_process");process.stderr.write(`Updating ec.fdk...
|
|
129
|
+
`);try{a("npm i -g ec.fdk@latest",{stdio:"inherit"})}catch{l("Failed to update ec.fdk")}const i=T.get("skill_path");if(i){const{mkdirSync:o,copyFileSync:c}=await import("node:fs"),{join:u}=await import("node:path"),g=B.resolve("../skill/SKILL.md");o(i,{recursive:!0}),c(g,u(i,"SKILL.md")),process.stderr.write(`Updated skill at ${i}/SKILL.md
|
|
130
|
+
`)}return}if(n==="logout"){try{s.hasEcToken()&&await s.logoutEc()}catch{}s.removeEcToken(),T.remove(`${r}_refresh`),process.stderr.write(`Logged out of ${r}.
|
|
131
|
+
`);return}try{let a;const i=()=>{const o={..._(e.filter)};return e.size&&(o.size=Number(e.size)),e.page&&(o.page=Number(e.page)),e.sort&&(o.sort=[e.sort]),e.fields&&(o._fields=e.fields),o};switch(n){case"dmList":{a=await s.dmList(i()),e.raw||(a=q(a));break}case"modelList":{e.id||l("--id (datamanager UUID) is required for modelList"),a=await s.dmID(e.id).modelList(i()),e.raw||(a=q(a));break}case"getDatamanager":{e.id||l("--id (datamanager UUID) is required for getDatamanager"),a=await s.getDatamanager(e.id),e.raw||(a=q(a));break}case"resourceList":{e.resource||l("--resource is required for resourceList");let o=s.resource(e.resource);e.subdomain&&(o=o.subdomain(e.subdomain)),a=await o.resourceList(i()),e.raw||(a=q(a));break}case"resourceGet":{e.resource||l("--resource is required for resourceGet");let o=s.resource(e.resource);e.subdomain&&(o=o.subdomain(e.subdomain)),a=await o.resourceGet(_(e.filter)),e.raw||(a=I(a));break}case"resourceEdit":{e.resource||l("--resource is required for resourceEdit");let o=s.resource(e.resource);e.subdomain&&(o=o.subdomain(e.subdomain));const c=await k(e.data);if(a=await o.resourceEdit(_(e.filter),c),!a){process.stderr.write(`Resource updated.
|
|
132
|
+
`);return}e.raw||(a=I(a));break}case"resourceDelete":{e.resource||l("--resource is required for resourceDelete");let o=s.resource(e.resource);e.subdomain&&(o=o.subdomain(e.subdomain)),await o.resourceDelete(_(e.filter)),process.stderr.write(`Resource deleted.
|
|
133
|
+
`);return}case"getStats":{a=await s.getStats(i());break}case"getHistory":{a=await s.getHistory(i());break}case"entryList":case"getEntry":case"createEntry":case"editEntry":case"deleteEntry":case"getSchema":{e.dm||l("--dm is required"),e.model||l("--model is required");const o=s.dm(e.dm).model(e.model).clean(!e.raw);switch(n){case"entryList":{a=await o.entryList(i());break}case"getEntry":{e.id||l("--id is required for getEntry"),a=await o.getEntry(e.id);break}case"createEntry":{const c=await k(e.data);a=await o.createEntry(c);break}case"editEntry":{e.id||l("--id is required for editEntry");const c=await k(e.data);a=await o.editEntry(e.id,c);break}case"deleteEntry":{e.id||l("--id is required for deleteEntry"),await o.deleteEntry(e.id),process.stderr.write(`Entry deleted.
|
|
134
|
+
`);return}case"getSchema":{a=await o.getSchema();break}}break}case"createDatamanager":{const o=await k(e.data);a=await s.createDatamanager(o);break}case"editDatamanager":{e.id||l("--id (datamanager UUID) is required for editDatamanager");const o=await k(e.data);a=await s.editDatamanager(e.id,o);break}case"deleteDatamanager":{e.id||l("--id (datamanager UUID) is required for deleteDatamanager"),await s.deleteDatamanager(e.id),process.stderr.write(`Datamanager deleted.
|
|
135
|
+
`);return}case"createModel":{e.id||l("--id (datamanager UUID) is required for createModel");const o=await k(e.data);a=await s.dmID(e.id).createModel(o);break}case"editModel":{e.id||l("--id (datamanager UUID) is required for editModel"),e.rid||l("--rid (model ID) is required for editModel");const o=await k(e.data);a=await s.dmID(e.id).editModel(e.rid,o);break}case"deleteModel":{e.id||l("--id (datamanager UUID) is required for deleteModel"),e.rid||l("--rid (model ID) is required for deleteModel"),await s.dmID(e.id).deleteModel(e.rid),process.stderr.write(`Model deleted.
|
|
136
|
+
`);return}case"createTemplate":{const o=await k(e.data);a=await s.createTemplate(o);break}case"createAssetGroup":{e.id||l("--id (datamanager UUID) is required for createAssetGroup");const o=await k(e.data);a=await s.dmID(e.id).createAssetGroup(o);break}case"editAssetGroup":{e.id||l("--id (datamanager UUID) is required for editAssetGroup"),e.rid||l("--rid (asset group ID) is required for editAssetGroup");const o=await k(e.data);a=await s.dmID(e.id).editAssetGroup(e.rid,o);break}case"editAsset":{e.dm||l("--dm (short ID) is required for editAsset"),e.assetgroup||l("--assetgroup is required for editAsset"),e.rid||l("--rid (asset ID) is required for editAsset");const o=await k(e.data);a=await s.dm(e.dm).assetGroup(e.assetgroup).editAsset(e.rid,o);break}case"editDmClient":{e.id||l("--id (datamanager UUID) is required for editDmClient"),e.rid||l("--rid (client ID) is required for editDmClient");const o=await k(e.data);a=await s.dmID(e.id).editDmClient(e.rid,o);break}case"createRole":{e.id||l("--id (datamanager UUID) is required for createRole");const o=await k(e.data);a=await s.dmID(e.id).createRole(o);break}case"editRole":{e.id||l("--id (datamanager UUID) is required for editRole"),e.rid||l("--rid (role ID) is required for editRole");const o=await k(e.data);a=await s.dmID(e.id).editRole(e.rid,o);break}case"deleteRole":{e.id||l("--id (datamanager UUID) is required for deleteRole"),e.rid||l("--rid (role ID) is required for deleteRole"),await s.dmID(e.id).deleteRole(e.rid),process.stderr.write(`Role deleted.
|
|
137
|
+
`);return}case"editDmAccount":{e.id||l("--id (datamanager UUID) is required for editDmAccount"),e["account-id"]||l("--account-id is required for editDmAccount");const o=await k(e.data);a=await s.dmID(e.id).editDmAccount(e["account-id"],o);break}case"deleteDmAccount":{e.id||l("--id (datamanager UUID) is required for deleteDmAccount"),e["account-id"]||l("--account-id is required for deleteDmAccount"),await s.dmID(e.id).deleteDmAccount(e["account-id"]),process.stderr.write(`DM account deleted.
|
|
138
|
+
`);return}case"createAccountClient":{const o=await k(e.data);a=await s.createAccountClient(o);break}case"editAccountClient":{e.rid||l("--rid (client ID) is required for editAccountClient");const o=await k(e.data);a=await s.editAccountClient(e.rid,o);break}case"deleteAccountClient":{e.rid||l("--rid (client ID) is required for deleteAccountClient"),await s.deleteAccountClient(e.rid),process.stderr.write(`Account client deleted.
|
|
139
|
+
`);return}case"createGroup":{const o=await k(e.data);a=await s.createGroup(o);break}case"editGroup":{e.rid||l("--rid (group ID) is required for editGroup");const o=await k(e.data);a=await s.editGroup(e.rid,o);break}case"deleteGroup":{e.rid||l("--rid (group ID) is required for deleteGroup"),await s.deleteGroup(e.rid),process.stderr.write(`Group deleted.
|
|
140
|
+
`);return}case"createInvite":{const o=await k(e.data);a=await s.createInvite(o);break}case"editInvite":{e.rid||l("--rid (invite ID) is required for editInvite");const o=await k(e.data);a=await s.editInvite(e.rid,o);break}case"deleteInvite":{e.rid||l("--rid (invite ID) is required for deleteInvite"),await s.deleteInvite(e.rid),process.stderr.write(`Invite deleted.
|
|
141
|
+
`);return}case"editAccount":{e["account-id"]||l("--account-id is required for editAccount");const o=await k(e.data);if(a=await s.editAccount(e["account-id"],o),!a){process.stderr.write(`Account updated.
|
|
142
|
+
`);return}break}case"listTokens":{e["account-id"]||l("--account-id is required for listTokens");const o=await s.listTokens(e["account-id"]);a=e.raw?o:o.map(I);break}case"createToken":{e["account-id"]||l("--account-id is required for createToken"),a=await s.createToken(e["account-id"]);break}case"deleteToken":{e["account-id"]||l("--account-id is required for deleteToken"),e.rid||l("--rid (access token ID) is required for deleteToken"),await s.deleteToken(e["account-id"],e.rid),process.stderr.write(`Token deleted.
|
|
143
|
+
`);return}default:l(`Unknown command: ${n}`)}e.md&&a&&typeof a=="object"?Array.isArray(a.items)?process.stdout.write(Xn(a)+`
|
|
139
144
|
`):process.stdout.write(Wn(a)+`
|
|
140
145
|
`):process.stdout.write(JSON.stringify(a,null,2)+`
|
|
141
146
|
`)}catch(a){process.stderr.write(`${a.message}
|
package/package.json
CHANGED
package/skill/SKILL.md
CHANGED
|
@@ -19,6 +19,13 @@ ec.fdk entryList -d <shortID> -m <model> --sort=-_created -s 1
|
|
|
19
19
|
# List entries with filters
|
|
20
20
|
ec.fdk entryList -d <shortID> -m <model> -f name~=chocolate -f createdFrom=2024-01-01
|
|
21
21
|
|
|
22
|
+
# List entries with only specific fields (reduces response size)
|
|
23
|
+
ec.fdk entryList -d <shortID> -m <model> --fields name,created,id
|
|
24
|
+
|
|
25
|
+
# Filter for null / not null
|
|
26
|
+
ec.fdk entryList -d <shortID> -m <model> -f "photo=" # photo is null/empty
|
|
27
|
+
ec.fdk entryList -d <shortID> -m <model> -f "photo!=" # photo is not null/empty
|
|
28
|
+
|
|
22
29
|
# Get a single entry
|
|
23
30
|
ec.fdk getEntry -d <shortID> -m <model> -i <entryID>
|
|
24
31
|
|
|
@@ -213,6 +220,7 @@ ec.fdk deleteToken --account-id <accountID> --rid <tokenID>
|
|
|
213
220
|
| `logout` | — |
|
|
214
221
|
| `whoami` | — |
|
|
215
222
|
| `install-skill` | — (optional `--dir <path>`) |
|
|
223
|
+
| `update` | — |
|
|
216
224
|
|
|
217
225
|
## Options
|
|
218
226
|
|
|
@@ -231,6 +239,7 @@ ec.fdk deleteToken --account-id <accountID> --rid <tokenID>
|
|
|
231
239
|
| `-s, --size` | Page size |
|
|
232
240
|
| `-p, --page` | Page number |
|
|
233
241
|
| `--sort` | Sort field (system fields: `_created`, `_modified`) |
|
|
242
|
+
| `--fields` | Only return specific fields (comma-separated) |
|
|
234
243
|
| `-f, --filter` | Repeatable filter (`key=value`) |
|
|
235
244
|
| `--password` | Use email/password login instead of browser OIDC |
|
|
236
245
|
| `--dir` | Target directory for `install-skill` (default: `~/.claude`) |
|
|
@@ -245,6 +254,8 @@ Filters map to entrecode filter query params:
|
|
|
245
254
|
- `From` — greater than / after: `-f createdFrom=2024-01-01`
|
|
246
255
|
- `To` — less than / before: `-f createdTo=2025-01-01`
|
|
247
256
|
- (none) — exact match: `-f title=HO`
|
|
257
|
+
- `=` (empty value) — is null/empty: `-f "photo="`
|
|
258
|
+
- `!=` (empty value) — is not null/empty: `-f "photo!="`
|
|
248
259
|
|
|
249
260
|
## Common Mistakes
|
|
250
261
|
|
|
@@ -285,6 +296,7 @@ When the user asks to "open" a resource, output the full editor URL. Use `open <
|
|
|
285
296
|
|
|
286
297
|
## Notes
|
|
287
298
|
|
|
299
|
+
- Prefer `--fields` over filtering fields with `jq` — `--fields` reduces the response on the server side
|
|
288
300
|
- Status/error messages go to stderr, data goes to stdout — piping always works cleanly
|
|
289
301
|
- `editDatamanager`, `editAccountClient`, and `editInvite` are full PUT operations — pass the complete resource
|
|
290
302
|
- `--data` accepts JSON via flag or stdin pipe (e.g. `echo '{}' | ec.fdk createEntry ...`)
|