ec.fdk 0.8.6 → 0.8.8

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 CHANGED
@@ -105,31 +105,147 @@ ec.fdk <command> [options]
105
105
 
106
106
  ### Commands
107
107
 
108
- | Command | Description |
109
- | ------------- | ---------------------------------------------- |
110
- | `login` | Login with ec credentials (interactive prompt) |
111
- | `entryList` | List entries |
112
- | `getEntry` | Get a single entry |
113
- | `createEntry` | Create an entry |
114
- | `editEntry` | Edit an entry |
115
- | `deleteEntry` | Delete an entry |
116
- | `getSchema` | Get model schema |
108
+ #### Entry commands (require `--dm`, `--model`)
109
+
110
+ | Command | Description | Required flags |
111
+ | ------------- | ---------------- | ----------------- |
112
+ | `entryList` | List entries | `--dm`, `--model` |
113
+ | `getEntry` | Get a single entry | `--dm`, `--model`, `--id` |
114
+ | `createEntry` | Create an entry | `--dm`, `--model`, `--data` |
115
+ | `editEntry` | Edit an entry | `--dm`, `--model`, `--id`, `--data` |
116
+ | `deleteEntry` | Delete an entry | `--dm`, `--model`, `--id` |
117
+ | `getSchema` | Get model schema | `--dm`, `--model` |
118
+
119
+ #### Admin list commands
120
+
121
+ | Command | Description | Required flags |
122
+ | ---------------- | ------------------------- | -------------- |
123
+ | `login` | Login with ec credentials | — |
124
+ | `dmList` | List datamanagers | — |
125
+ | `modelList` | List models | `--id` (DM UUID) |
126
+ | `getDatamanager` | Get a datamanager | `--id` (DM UUID) |
127
+ | `resourceList` | List resources | `--resource`, optional `--subdomain` |
128
+ | `getStats` | Get datamanager stats | — |
129
+ | `getHistory` | Get dm-history entries | — |
130
+
131
+ #### Datamanager CRUD
132
+
133
+ | Command | Description | Required flags |
134
+ | ------------------- | -------------------- | -------------- |
135
+ | `createDatamanager` | Create a datamanager | `--data` |
136
+ | `editDatamanager` | Edit a datamanager | `--id`, `--data` |
137
+ | `deleteDatamanager` | Delete a datamanager | `--id` |
138
+
139
+ #### Model CRUD (`--id` = DM UUID)
140
+
141
+ | Command | Description | Required flags |
142
+ | ------------- | -------------- | -------------- |
143
+ | `createModel` | Create a model | `--id`, `--data` |
144
+ | `editModel` | Edit a model | `--id`, `--rid`, `--data` |
145
+ | `deleteModel` | Delete a model | `--id`, `--rid` |
146
+
147
+ #### Template CRUD
148
+
149
+ | Command | Description | Required flags |
150
+ | ---------------- | ----------------- | -------------- |
151
+ | `createTemplate` | Create a template | `--data` |
152
+ | `editTemplate` | Edit a template | `--rid`, `--data` |
153
+ | `deleteTemplate` | Delete a template | `--rid` |
154
+
155
+ #### Asset Group (`--id` = DM UUID)
156
+
157
+ | Command | Description | Required flags |
158
+ | ------------------ | --------------------- | -------------- |
159
+ | `createAssetGroup` | Create an asset group | `--id`, `--data` |
160
+ | `editAssetGroup` | Edit an asset group | `--id`, `--rid`, `--data` |
161
+
162
+ #### Asset metadata
163
+
164
+ | Command | Description | Required flags |
165
+ | ----------- | -------------------- | -------------- |
166
+ | `editAsset` | Edit asset metadata | `--dm`, `--assetgroup`, `--rid`, `--data` |
167
+
168
+ #### DM Client (`--id` = DM UUID)
169
+
170
+ | Command | Description | Required flags |
171
+ | -------------- | ---------------- | -------------- |
172
+ | `editDmClient` | Edit a DM client | `--id`, `--rid`, `--data` |
173
+
174
+ #### Role CRUD (`--id` = DM UUID)
175
+
176
+ | Command | Description | Required flags |
177
+ | ------------ | ------------- | -------------- |
178
+ | `createRole` | Create a role | `--id`, `--data` |
179
+ | `editRole` | Edit a role | `--id`, `--rid`, `--data` |
180
+ | `deleteRole` | Delete a role | `--id`, `--rid` |
181
+
182
+ #### DM Account (`--id` = DM UUID)
183
+
184
+ | Command | Description | Required flags |
185
+ | ----------------- | ------------------ | -------------- |
186
+ | `editDmAccount` | Edit a DM account | `--id`, `--account-id`, `--data` |
187
+ | `deleteDmAccount` | Delete a DM account | `--id`, `--account-id` |
188
+
189
+ #### Account Client
190
+
191
+ | Command | Description | Required flags |
192
+ | --------------------- | ----------------------- | -------------- |
193
+ | `createAccountClient` | Create an account client | `--data` |
194
+ | `editAccountClient` | Edit an account client | `--rid`, `--data` |
195
+ | `deleteAccountClient` | Delete an account client | `--rid` |
196
+
197
+ #### Group
198
+
199
+ | Command | Description | Required flags |
200
+ | ------------- | -------------- | -------------- |
201
+ | `createGroup` | Create a group | `--data` |
202
+ | `editGroup` | Edit a group | `--rid`, `--data` |
203
+ | `deleteGroup` | Delete a group | `--rid` |
204
+
205
+ #### Invite
206
+
207
+ | Command | Description | Required flags |
208
+ | -------------- | --------------- | -------------- |
209
+ | `createInvite` | Create an invite | `--data` |
210
+ | `editInvite` | Edit an invite | `--rid`, `--data` |
211
+ | `deleteInvite` | Delete an invite | `--rid` |
212
+
213
+ #### Account
214
+
215
+ | Command | Description | Required flags |
216
+ | ------------- | -------------- | -------------- |
217
+ | `editAccount` | Edit an account | `--account-id`, `--data` |
218
+
219
+ #### Tokens
220
+
221
+ | Command | Description | Required flags |
222
+ | ------------- | -------------- | -------------- |
223
+ | `listTokens` | List tokens | `--account-id` |
224
+ | `createToken` | Create a token | `--account-id` |
225
+ | `deleteToken` | Delete a token | `--account-id`, `--rid` |
117
226
 
118
227
  ### Options
119
228
 
120
- | Option | Description |
121
- | -------------------- | ------------------------------------------------- |
122
- | `-e, --env <env>` | Environment: `stage` \| `live` (default: `stage`) |
123
- | `-d, --dm <shortID>` | DataManager short ID |
124
- | `-m, --model <name>` | Model name |
125
- | `-i, --id <id>` | Entry ID (for get/edit/delete) |
126
- | `--data <json>` | JSON data (for create/edit) |
127
- | `-s, --size <n>` | Page size for list |
128
- | `-p, --page <n>` | Page number for list |
129
- | `--sort <field>` | Sort field for list |
130
- | `--raw` | Include `_links` and `_embedded` in output |
131
- | `--md` | Output entries as readable markdown table |
132
- | `-h, --help` | Show help |
229
+ | Option | Description |
230
+ | ----------------------- | ------------------------------------------------- |
231
+ | `-e, --env <env>` | Environment: `stage` \| `live` (default: `stage`) |
232
+ | `-d, --dm <shortID>` | DataManager short ID |
233
+ | `-m, --model <name>` | Model name |
234
+ | `-i, --id <id>` | Entry ID or DataManager UUID (context-dependent) |
235
+ | `--rid <id>` | Resource ID (model, template, role, client, asset group, invite, etc.) |
236
+ | `--account-id <id>` | Account ID |
237
+ | `--assetgroup <name>` | Asset group name (for `editAsset`) |
238
+ | `--resource <name>` | Resource name (for `resourceList`) |
239
+ | `--subdomain <name>` | Subdomain override (for `resourceList`) |
240
+ | `--data <json>` | JSON data (for create/edit, or pipe via stdin) |
241
+ | `-s, --size <n>` | Page size for list |
242
+ | `-p, --page <n>` | Page number for list |
243
+ | `--sort <field>` | Sort field for list |
244
+ | `-f, --filter <k=v>` | Filter for list (repeatable) |
245
+ | `--raw` | Include `_links` and `_embedded` in output |
246
+ | `--md` | Output entries as readable markdown table |
247
+ | `-v, --version` | Show version |
248
+ | `-h, --help` | Show help |
133
249
 
134
250
  ### Examples
135
251
 
@@ -137,6 +253,18 @@ ec.fdk <command> [options]
137
253
  # Login to stage (stores token in ~/.ec-fdk/auth.json)
138
254
  ec.fdk login -e stage
139
255
 
256
+ # List datamanagers
257
+ ec.fdk dmList -e stage
258
+
259
+ # Get a single datamanager
260
+ ec.fdk getDatamanager -e stage --id 73538731-4ac3-4a1a-b3b5-e31d09e94d42
261
+
262
+ # List models of a datamanager
263
+ ec.fdk modelList -e stage --id 73538731-4ac3-4a1a-b3b5-e31d09e94d42
264
+
265
+ # Filter models by title
266
+ ec.fdk modelList --id 73538731-4ac3-4a1a-b3b5-e31d09e94d42 -f title~=muffin
267
+
140
268
  # List entries
141
269
  ec.fdk entryList -d 83cc6374 -m muffin
142
270
 
@@ -161,10 +289,108 @@ ec.fdk deleteEntry -d 83cc6374 -m muffin -i fZctZXIeRJ
161
289
  # Get model schema
162
290
  ec.fdk getSchema -d 83cc6374 -m muffin
163
291
 
292
+ # Filter entries (repeatable -f for arbitrary query params)
293
+ ec.fdk entryList -d 83cc6374 -m muffin -f name~=chocolate
294
+ ec.fdk entryList -d 83cc6374 -m muffin -f amazement_factorFrom=5 -f amazement_factorTo=10
295
+ ec.fdk entryList -d 83cc6374 -m muffin -f createdFrom=2024-01-01
296
+
297
+ # Filter datamanagers
298
+ ec.fdk dmList -f title~=ec-admin
299
+
164
300
  # Pipe into jq
165
301
  ec.fdk entryList -d 83cc6374 -m muffin | jq '.items | length'
166
302
  ```
167
303
 
304
+ ### Admin examples
305
+
306
+ ```sh
307
+ # Get datamanager stats
308
+ ec.fdk getStats
309
+
310
+ # Get dm-history entries
311
+ ec.fdk getHistory -s 10
312
+
313
+ # List templates
314
+ ec.fdk resourceList --resource template -s 5
315
+
316
+ # List resources with custom subdomain
317
+ ec.fdk resourceList --resource client --subdomain accounts
318
+
319
+ # Create a datamanager
320
+ ec.fdk createDatamanager --data '{"title":"My DM","config":{}}'
321
+
322
+ # Edit a datamanager
323
+ ec.fdk editDatamanager --id <DM-UUID> --data '{"title":"New Title"}'
324
+
325
+ # Delete a datamanager
326
+ ec.fdk deleteDatamanager --id <DM-UUID>
327
+
328
+ # Create a model
329
+ ec.fdk createModel --id <DM-UUID> --data '{"title":"article","fields":[...]}'
330
+
331
+ # Edit a model
332
+ ec.fdk editModel --id <DM-UUID> --rid <MODEL-ID> --data '{"title":"renamed"}'
333
+
334
+ # Delete a model
335
+ ec.fdk deleteModel --id <DM-UUID> --rid <MODEL-ID>
336
+
337
+ # Create/edit/delete templates
338
+ ec.fdk createTemplate --data '{"name":"My Template"}'
339
+ ec.fdk editTemplate --rid <TEMPLATE-ID> --data '{"name":"Renamed"}'
340
+ ec.fdk deleteTemplate --rid <TEMPLATE-ID>
341
+
342
+ # Asset group management
343
+ ec.fdk createAssetGroup --id <DM-UUID> --data '{"assetGroupID":"photos"}'
344
+ ec.fdk editAssetGroup --id <DM-UUID> --rid <ASSETGROUP-ID> --data '{"public":true}'
345
+
346
+ # Edit asset metadata
347
+ ec.fdk editAsset --dm 83cc6374 --assetgroup photos --rid <ASSET-ID> --data '{"title":"sunset"}'
348
+
349
+ # Edit a DM client
350
+ ec.fdk editDmClient --id <DM-UUID> --rid <CLIENT-ID> --data '{"callbackURL":"..."}'
351
+
352
+ # Role management
353
+ ec.fdk createRole --id <DM-UUID> --data '{"name":"editor"}'
354
+ ec.fdk editRole --id <DM-UUID> --rid <ROLE-ID> --data '{"name":"admin"}'
355
+ ec.fdk deleteRole --id <DM-UUID> --rid <ROLE-ID>
356
+
357
+ # DM account management
358
+ ec.fdk editDmAccount --id <DM-UUID> --account-id <ACCOUNT-ID> --data '{"email":"new@example.com"}'
359
+ ec.fdk deleteDmAccount --id <DM-UUID> --account-id <ACCOUNT-ID>
360
+
361
+ # Account client management
362
+ ec.fdk createAccountClient --data '{"clientID":"my-client","callbackURL":"..."}'
363
+ ec.fdk editAccountClient --rid <CLIENT-ID> --data '{"callbackURL":"..."}'
364
+ ec.fdk deleteAccountClient --rid <CLIENT-ID>
365
+
366
+ # Group management
367
+ ec.fdk createGroup --data '{"name":"devs"}'
368
+ ec.fdk editGroup --rid <GROUP-ID> --data '{"name":"developers"}'
369
+ ec.fdk deleteGroup --rid <GROUP-ID>
370
+
371
+ # Invite management
372
+ ec.fdk createInvite --data '{"email":"user@example.com"}'
373
+ ec.fdk editInvite --rid <INVITE-ID> --data '{"permissions":["dm-read"]}'
374
+ ec.fdk deleteInvite --rid <INVITE-ID>
375
+
376
+ # Account management
377
+ ec.fdk editAccount --account-id <ACCOUNT-ID> --data '{"email":"updated@example.com"}'
378
+
379
+ # Token management
380
+ ec.fdk listTokens --account-id <ACCOUNT-ID>
381
+ ec.fdk createToken --account-id <ACCOUNT-ID>
382
+ ec.fdk deleteToken --account-id <ACCOUNT-ID> --rid <TOKEN-ID>
383
+ ```
384
+
385
+ The `-f` flag maps directly to [entrecode filter query params](https://doc.entrecode.de/api-basics/#filtering). Common filter suffixes:
386
+
387
+ | Suffix | Meaning | Example |
388
+ | ---------- | -------------------- | ------------------------------ |
389
+ | `~` | Search (contains) | `-f name~=chocolate` |
390
+ | `From` | Greater than / after | `-f createdFrom=2024-01-01` |
391
+ | `To` | Less than / before | `-f createdTo=2025-01-01` |
392
+ | (none) | Exact match | `-f amazement_factor=10` |
393
+
168
394
  Status/error messages go to stderr, data goes to stdout — so piping always works cleanly.
169
395
 
170
396
  ## migration from ec.sdk
@@ -289,8 +515,9 @@ api.assetGroup(group).getAsset(img);
289
515
 
290
516
  ## Publish
291
517
 
292
- 0. `cd packages/ec.fdk`
293
- 1. bump version in `packages/ec.fdk/package.json`
294
- 2. run `npm run docs` to regenerate docs folder
295
- 3. commit + push
296
- 4. run `pnpm publish`
518
+ ```sh
519
+ cd packages/ec.fdk
520
+ ./publish.sh
521
+ ```
522
+
523
+ The script prompts for a new version, regenerates docs, commits, pushes, and publishes to npm.
package/dist/cli.cjs CHANGED
@@ -1,45 +1,128 @@
1
1
  #!/usr/bin/env node
2
- "use strict";const G=require("node:util"),w=require("node:fs"),x=require("node:path"),H=require("node:os"),W=require("node:readline");async function h(n,t={},e={}){const{token:s,rawRes:r}=t;s&&(e.headers={...e.headers||{},Authorization:`Bearer ${s}`});const i=await fetch(n,e);if(!i.ok){if(i.headers.get("content-type")?.includes("application/json")){const o=await i.json(),a=`${o.title}
2
+ "use strict";const X=require("node:util"),Y=require("node:module"),D=require("node:fs"),G=require("node:path"),Q=require("node:os"),Z=require("node:readline");async function u(t,e={},n={}){const{token:r,rawRes:a}=e;r&&(n.headers={...n.headers||{},Authorization:`Bearer ${r}`});const i=await fetch(t,n);if(!i.ok){if(i.headers.get("content-type")?.includes("application/json")){const o=await i.json(),s=`${o.title}
3
3
  ${o.detail}
4
- ${o.verbose}`;throw new Error(a)}throw new Error(`unexpected fetch error: ${i.statusText}`)}return r?i:await i.json()}const k={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 f(n,t="stage",e="datamanager"){const s=k[e];if(!s)throw new Error(`subdomain "${e}" not found. Try one of ${Object.keys(k).join(", ")}`);const r=s[t];if(!r)throw new Error(`env "${t}" not found. Try one of ${Object.keys(s[t]).join(", ")}`);return r+n}function m(n,t=!0){return Object.entries(n).sort((e,s)=>e[0].localeCompare(s[0])).map(([e,s])=>`${e}=${s}`).join("&")}function l(n){Object.entries(n).forEach(([t,e])=>{if(e===void 0)throw new Error(`expected ${t} to be set!`)})}const J={stage:"https://accounts.cachena.entrecode.de/",live:"https://accounts.entrecode.de/"};async function X(n){let{env:t,dmShortID:e,email:s,password:r}=n;l({env:t,dmShortID:e,email:s,password:r});const i=f(`api/${e}/_auth/login?clientID=rest`,t);return await h(i,{},{method:"POST",body:JSON.stringify({email:s,password:r}),headers:{"Content-Type":"application/json"}})}async function Y(n){let{env:t,email:e,password:s}=n;l({env:t,email:e,password:s});const r=`${J[t]}auth/login?clientID=rest`;return await h(r,{},{method:"POST",body:JSON.stringify({email:e,password:s}),headers:{"Content-Type":"application/json"}})}async function Q(n){let{dmShortID:t,env:e,token:s}=n;l({dmShortID:t,env:e,token:s});const r=f(`api/${t}/_auth/logout?clientID=rest&token=${s}`,e);return await h(r,{rawRes:!0},{method:"POST"})}async function Z(n){let{env:t,token:e}=n;l({env:t,token:e});const s=`${J[t]}auth/logout?clientID=rest`;return await h(s,{rawRes:!0,token:e},{method:"POST"})}function tt({dmShortID:n}){return l({dmShortID:n}),n}function et({env:n}){return l({env:n}),n}let nt=["created","creator","id","modified","private","_created","_creator","_embedded","_entryTitle","_id","_links","_modelTitle","_modelTitleField","_modified"];function M(n){let t={};for(let e in n)nt.includes(e)||(t[e]=n[e]);return t}function st(n){return JSON.parse(JSON.stringify(n))}async function rt(n){let{env:t,dmShortID:e}=n;l({env:t,dmShortID:e});const s=f(`api/${e}`,t);return h(s,n)}async function C(n){let{env:t,dmShortID:e,model:s,options:r={}}=n;l({env:t,dmShortID:e,model:s}),r={size:50,page:1,_list:!0,...r};const i=m(r),o=f(`api/${e}/${s}?${i}`,t),{count:a,total:c,_embedded:d}=await h(o,n);let u=d?d[`${e}:${s}`]:[];return u=Array.isArray(u)?u:[u],{count:a,total:c,items:u}}function it({env:n,dmShortID:t,model:e,entryID:s,token:r}){l({env:n,dmShortID:t,model:e,entryID:s});const i=m({_id:s}),o=f(`api/${t}/${e}?${i}`,n);return h(o,{token:r})}async function ot({env:n,dmShortID:t,model:e,value:s,token:r}){l({env:n,dmShortID:t,model:e,value:s});const i=f(`api/${t}/${e}`,n);return await h(i,{token:r},{method:"POST",body:JSON.stringify(s),headers:{"Content-Type":"application/json"}})}async function I({env:n,dmShortID:t,model:e,entryID:s,value:r,token:i,safePut:o=!1}){l({env:n,dmShortID:t,model:e,entryID:s,value:r});const a={"Content-Type":"application/json"};if(o){if(!("_modified"in r))throw new Error("expected _modified to be set!");a["If-Unmodified-Since"]=new Date(r._modified).toUTCString()}const c=f(`api/${t}/${e}?_id=${s}`,n);return r=st(r),r=M(r),await h(c,{token:i},{method:"PUT",headers:a,body:JSON.stringify(r)})}function F({env:n,dmShortID:t,model:e,entryID:s,token:r}){l({env:n,dmShortID:t,model:e,entryID:s});const i=f(`api/${t}/${e}?_id=${s}`,n);return h(i,{token:r,rawRes:!0},{method:"DELETE",headers:{"Content-Type":"application/json"}})}async function at(n,t){let{env:e,dmShortID:s,model:r,options:i={}}=n;l({env:e,dmShortID:s,model:r}),n.options={size:50,page:1,_list:!0,...i};let o=0,a,c=[];for(;a===void 0||o<a;){const d=await C(n);for(let u of d.items)c.push(await t(u));o+=d.items.length,a=d.total,n.options.page++}return c}async function ct({env:n,dmShortID:t,model:e,withMetadata:s}){l({env:n,dmShortID:t,model:e});const r=f(`api/schema/${t}/${e}`,n),i=await h(r),o=i?.allOf?.[1];if(typeof o.properties!="object")throw new Error(`getSchema: ${r} returned unexpected format: ${JSON.stringify(i)}`);const{properties:a}=o,c=M(a);for(let d in c){let u=c[d];if(u.required=o.required.includes(d),c[d]?.oneOf&&delete c[d]?.oneOf,u.title?.includes("<")&&u.title?.includes(">")){const g=u.title.split("<")[1].slice(0,-1),y=u.title.split("<")[0];u.type=y,g.includes(":")?u.resource=g.split(":")[1]:u.resource=g}else["asset","entry","assets","entries"].includes(u.title)?(u.type=u.title,u.resource=null):u.type=u.title;delete c[d].title}if(s){const d=a._modelTitle.title,u=a._modelTitleField.title;return{properties:c,meta:{modelTitleField:u,modelTitle:d}}}return c}function z(n){return Object.entries(n).map(([t,e])=>typeof e!="object"?{[t]:String(e)}:{...e.sort&&{sort:Array.isArray(e)?e.join(","):e},...e.search&&{[t+"~"]:e.search},...e.notNull&&{[t+"!"]:""},...e.null&&{[t]:""},...e.any&&{[t]:e.any.join(",")},...e.from&&{[t+"From"]:e.from},...e.to&&{[t+"To"]:e.to}}).reduce((t,e)=>({...t,...e}),{})}const dt=z;function _(n){return n._links.collection.href.split("/").slice(-2)[0]}function R(n){const t=n._links.collection.href.split("api/")[0];return Object.keys(k.datamanager).find(s=>k.datamanager[s]===t)}const U=n=>{const t=_(n),e=R(n),s=n._modelTitle,r=n.id;return{dmShortID:t,env:e,model:s,entryID:r}},ut=n=>F(U(n)),lt=(n,t)=>I({...U(n),value:t});function ht(n,t){const e=_(t);return t._embedded[`${e}:${t._modelTitle}/${n}/asset`]}async function ft({env:n,dmShortID:t,assetGroup:e,assetID:s,token:r}){l({env:n,dmShortID:t,assetGroup:e,assetID:s});const i=m({assetID:s}),o=f(`a/${t}/${e}?${i}`,n),{_embedded:a}=await h(o,{token:r});return a?a["ec:dm-asset"]:void 0}async function gt(n){let{env:t,dmShortID:e,assetGroup:s,token:r,options:i={}}=n;l({env:t,dmShortID:e,assetGroup:s}),i={size:50,page:1,_list:!0,...i};const o=m(i),a=f(`a/${e}/${s}?${o}`,t),{count:c,total:d,_embedded:u}=await h(a,{token:r});let g=u?u["ec:dm-asset"]:[];return g=Array.isArray(g)?g:[g],{count:c,total:d,items:g}}async function pt({env:n,dmShortID:t,assetGroup:e,token:s,file:r,name:i,options:o}){l({env:n,dmShortID:t,assetGroup:e,file:r});const a=f(`a/${t}/${e}`,n),c=new FormData;return c.append("file",r,i),o&&Object.keys(o).forEach(u=>{c.append(u,o[u])}),(await h(a,{token:s},{method:"POST",body:c}))._embedded["ec:dm-asset"]}async function mt({env:n,dmShortID:t,assetGroup:e,files:s,options:r}){l({env:n,dmShortID:t,assetGroup:e,files:s});const i=f(`a/${t}/${e}`,n),o=new FormData;s.forEach(c=>{o.append("file",c)}),r&&Object.keys(r).forEach(c=>{o.append(c,r[c])});const a=await h(i,{},{method:"POST",body:o});return Array.isArray(a._embedded["ec:dm-asset"])?a._embedded["ec:dm-asset"]:[a._embedded["ec:dm-asset"]]}async function yt({env:n,dmShortID:t,assetGroup:e,assetID:s,token:r}){l({env:n,dmShortID:t,assetGroup:e,assetID:s});const i=f(`a/${t}/${e}/${s}`,n);await h(i,{token:r,rawRes:!0},{method:"DELETE"})}function wt(n,t,e=!1){let s,r;return(e?n?.thumbnails:n?.fileVariants)?.forEach(o=>{const{resolution:{width:a,height:c}}=o,d=Math.abs(Math.max(a,c)-t);(!r||d<r)&&(r=d,s=o)}),s?.url??n?.file?.url??null}function $t(n="stage",t,e,s,r=!1){const i=Math.max(s.file.resolution.width,s.file.resolution.height),o=e.filter(c=>c<i),a=`https://datamanager${n==="stage"?".cachena":""}.entrecode.de`;return r?o.map(c=>{const d=s.thumbnails.find(y=>c===y.dimension),u=`${a}/t/${t}/${s.assetID}/${c}`,g=d?d.url:u;return{size:c,url:g,generated:d}}):o.map(c=>{const d=s.fileVariants.find(y=>c===Math.max(y.resolution.width,y.resolution.height)),u=`${a}/f/${t}/${s.assetID}/${c}`,g=d?d.url:u;return{size:c,url:g,generated:d}})}async function bt(n){let{env:t,dmID:e,token:s}=n;l({env:t,dmID:e});const r=f(`?dataManagerID=${e}`,t);return h(r,{token:s})}async function kt(n){let{env:t,options:e={}}=n;l({env:t}),e={size:25,page:1,_list:!0,...e};const s=m(e),r=f(`?${s}`,t),{count:i,total:o,_embedded:a}=await h(r,n);let c=a?a["ec:datamanager"]:[];return c=Array.isArray(c)?c:[c],{count:i,total:o,items:c}}async function Et(n){let{env:t,dmID:e,options:s={}}=n;l({env:t,dmID:e}),s={size:25,dataManagerID:e,page:1,_list:!0,...s};const r=m(s),i=f(`model?${r}`,t),{count:o,total:a,_embedded:c}=await h(i,n);let d=c?c["ec:model"]:[];return d=Array.isArray(d)?d:[d],{count:o,total:a,items:d}}async function Tt(n){let{env:t,resource:e,options:s={},subdomain:r="datamanager"}=n;l({env:t,subdomain:r,resource:e}),s={size:25,page:1,_list:!0,...s};const i=m(s),o=f(`${e}?${i}`,t,r),{count:a,total:c,_embedded:d}=await h(o,n);let u=d?d[Object.keys(d)[0]]:[];return u=Array.isArray(u)?u:[u],{count:a,total:c,items:u}}async function At(n,t={}){let{env:e,route:s,options:r={},subdomain:i="datamanager"}=n;l({env:e,subdomain:i,route:s}),r={...r};const o=m(r),a=f(`${s}?${o}`,e,i);return h(a,n,t)}const St=Object.freeze(Object.defineProperty({__proto__:null,assetList:gt,createAsset:pt,createAssets:mt,createEntry:ot,deleteAsset:yt,deleteEntry:F,deleteEntryObject:ut,dmList:kt,editEntry:I,editEntryObject:lt,entryList:C,fileVariant:wt,filterOptions:dt,getAsset:ft,getDatamanager:bt,getEcAuthKey:et,getEntry:it,getEntryAsset:ht,getEntryEnv:R,getEntryShortID:_,getFileVariants:$t,getPublicAuthKey:tt,getSchema:ct,loginEc:Y,loginPublic:X,logoutEc:Z,logoutPublic:Q,mapEntries:at,modelList:Et,publicApi:rt,raw:At,resourceList:Tt,sdkOptions:z},Symbol.toStringTag,{value:"Module"})),{entryList:j,mapEntries:_t,getEntry:Ot,getAsset:jt,assetList:v,createAsset:vt,createAssets:Pt,deleteAsset:Lt,createEntry:Dt,editEntry:P,deleteEntry:qt,getSchema:Nt,loginPublic:Bt,loginEc:xt,logoutEc:Jt,logoutPublic:Mt,getEcAuthKey:$,getPublicAuthKey:b,dmList:Ct,modelList:It,publicApi:Ft,getDatamanager:zt,resourceList:Rt,raw:Ut}=St;function L(n){if(!n||typeof n!="object")return n;const{_links:t,_embedded:e,...s}=n;return s}function Kt(n){return!n||typeof n!="object"?n:Array.isArray(n.items)?{...n,items:n.items.map(L)}:L(n)}class O{constructor(t={}){if(!t.storageAdapter){let e=new Map;t.storageAdapter={get:s=>e.get(s),set:(s,r)=>e.set(s,r),remove:s=>e.delete(s)}}this.config=t}set(t){return new O({...this.config,...t})}async entries(t={}){const e=await this.getBestToken();return j({...this.config,options:t,token:e})}async entryList(t){const e=await this.getBestToken();return j({...this.config,options:t,token:e}).then(s=>this.maybeClean(s))}async mapEntries(t,e={}){const s=await this.getBestToken();return _t({...this.config,options:e,token:s},t)}async getEntry(t){const e=await this.getBestToken();return Ot({...this.config,entryID:t,token:e}).then(s=>this.maybeClean(s))}async editEntrySafe(t,e){const s=await this.getBestToken();return P({...this.config,entryID:t,token:s,value:e,safePut:!0}).then(r=>this.maybeClean(r))}async getSchema(){return Nt(this.config)}async assets(t){const e=await this.getBestToken();return v({...this.config,options:t,token:e})}async assetList(t){const e=await this.getBestToken();return v({...this.config,options:t,token:e})}async createAsset(t){const{file:e,name:s,options:r}=t,i=await this.getBestToken();return vt({...this.config,file:e,name:s,options:r,token:i})}async createAssets(t){const{files:e,options:s}=t,r=await this.getBestToken();return Pt({...this.config,files:e,options:s,token:r})}async deleteAsset(t){const e=await this.getBestToken();return Lt({...this.config,token:e,assetID:t})}async getAsset(t){const e=await this.getBestToken();return jt({...this.config,assetID:t,token:e})}async createEntry(t){const e=await this.getBestToken();return Dt({...this.config,token:e,value:t}).then(s=>this.maybeClean(s))}async editEntry(t,e){const s=await this.getBestToken();return P({...this.config,entryID:t,token:s,value:e}).then(r=>this.maybeClean(r))}async deleteEntry(t){const e=await this.getBestToken();return qt({...this.config,token:e,entryID:t})}async resourceList(t){const e=await this.getBestToken();return Rt({...this.config,options:t,token:e})}async raw(t,e){const s=await this.getBestToken();return Ut({...this.config,options:t,token:s},e)}storageAdapter(t){return this.set({storageAdapter:t})}removeToken(t){if(!this.config.storageAdapter)throw new Error("cannot removeToken: no storageAdapter defined!");const{remove:e}=this.config.storageAdapter;e(t)}getToken(t){if(!this.config.storageAdapter)throw new Error("cannot getAuth: no storageAdapter defined!");const{get:e}=this.config.storageAdapter;return e(t)}getPublicToken(){return this.config.token||this.getToken(b(this.config))}getEcToken(){return this.config.token||this.getToken($(this.config))}setToken(t,e){if(!this.config.storageAdapter)throw new Error("cannot setEcToken: no storageAdapter defined!");return this.config.storageAdapter.set(t,e)}setEcToken(t){this.setToken($(this.config),t)}setPublicToken(t){this.setToken(b(this.config),t)}loginEc(t){return xt({...this.config,...t}).then(e=>this.setToken($(this.config),e.token))}loginPublic(t){return Bt({...this.config,...t}).then(e=>this.setToken(b(this.config),e.token))}logoutPublic(){const t=this.getPublicToken();return Mt({...this.config,token:t}).then(()=>this.removeToken(b(this.config)))}logoutEc(){const t=this.getEcToken();return Jt({...this.config,token:t}).then(()=>this.removeToken($(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?Kt(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 Ft(this.config)}async getDatamanager(t){const e=await this.getBestToken();return zt({...this.config,dmID:t,token:e})}async dmList(t={}){const e=await this.getBestToken();return Ct({...this.config,options:t,token:e})}async modelList(t={}){const e=await this.getBestToken();return It({...this.config,options:t,token:e})}}const A=x.join(H.homedir(),".ec-fdk"),S=x.join(A,"auth.json");function T(){try{return w.existsSync(S)?JSON.parse(w.readFileSync(S,"utf-8")):{}}catch{return{}}}function D(n){w.existsSync(A)||w.mkdirSync(A,{recursive:!0,mode:448}),w.writeFileSync(S,JSON.stringify(n,null,2),{mode:384})}const Vt={get(n){return T()[n]},set(n,t){const e=T();e[n]=t,D(e)},remove(n){const t=T();delete t[n],D(t)}};function Gt(n){const t=W.createInterface({input:process.stdin,output:process.stderr});return new Promise(e=>{t.question(n,s=>{t.close(),e(s)})})}function Ht(n){return new Promise(t=>{process.stderr.write(n);const e=process.stdin;e.setRawMode(!0),e.resume(),e.setEncoding("utf-8");let s="";const r=i=>{if(i===""&&(process.stderr.write(`
4
+ ${o.verbose}`;throw new Error(s)}throw new Error(`unexpected fetch error: ${i.statusText}`)}return a?i:await i.json()}const A={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=A[n];if(!r)throw new Error(`subdomain "${n}" not found. Try one of ${Object.keys(A).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 j={stage:"https://accounts.cachena.entrecode.de/",live:"https://accounts.entrecode.de/"};async function ee(t){let{env:e,dmShortID:n,email:r,password:a}=t;d({env:e,dmShortID:n,email:r,password:a});const i=g(`api/${n}/_auth/login?clientID=rest`,e);return await u(i,{},{method:"POST",body:JSON.stringify({email:r,password:a}),headers:{"Content-Type":"application/json"}})}async function te(t){let{env:e,email:n,password:r}=t;d({env:e,email:n,password:r});const a=`${j[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 ne(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 re(t){let{env:e,token:n}=t;d({env:e,token:n});const r=`${j[e]}auth/logout?clientID=rest`;return await u(r,{rawRes:!0,token:n},{method:"POST"})}function ae({dmShortID:t}){return d({dmShortID:t}),t}function ie({env:t}){return d({env:t}),t}let se=["created","creator","id","modified","private","_created","_creator","_embedded","_entryTitle","_id","_links","_modelTitle","_modelTitleField","_modified"];function N(t){let e={};for(let n in t)se.includes(n)||(e[n]=t[n]);return e}function oe(t){return JSON.parse(JSON.stringify(t))}async function ce(t){let{env:e,dmShortID:n}=t;d({env:e,dmShortID:n});const r=g(`api/${n}`,e);return u(r,t)}async function J(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 i=h(a),o=g(`api/${n}/${r}?${i}`,e),{count:s,total:c,_embedded:m}=await u(o,t);let f=m?m[`${n}:${r}`]:[];return f=Array.isArray(f)?f:[f],{count:s,total:c,items:f}}function de({env:t,dmShortID:e,model:n,entryID:r,token:a}){d({env:t,dmShortID:e,model:n,entryID:r});const i=h({_id:r}),o=g(`api/${e}/${n}?${i}`,t);return u(o,{token:a})}async function ue({env:t,dmShortID:e,model:n,value:r,token:a}){d({env:t,dmShortID:e,model:n,value:r});const i=g(`api/${e}/${n}`,t);return await u(i,{token:a},{method:"POST",body:JSON.stringify(r),headers:{"Content-Type":"application/json"}})}async function x({env:t,dmShortID:e,model:n,entryID:r,value:a,token:i,safePut:o=!1}){d({env:t,dmShortID:e,model:n,entryID:r,value:a});const s={"Content-Type":"application/json"};if(o){if(!("_modified"in a))throw new Error("expected _modified to be set!");s["If-Unmodified-Since"]=new Date(a._modified).toUTCString()}const c=g(`api/${e}/${n}?_id=${r}`,t);return a=oe(a),a=N(a),await u(c,{token:i},{method:"PUT",headers:s,body:JSON.stringify(a)})}function F({env:t,dmShortID:e,model:n,entryID:r,token:a}){d({env:t,dmShortID:e,model:n,entryID:r});const i=g(`api/${e}/${n}?_id=${r}`,t);return u(i,{token:a,rawRes:!0},{method:"DELETE",headers:{"Content-Type":"application/json"}})}async function le(t,e){let{env:n,dmShortID:r,model:a,options:i={}}=t;d({env:n,dmShortID:r,model:a}),t.options={size:50,page:1,_list:!0,...i};let o=0,s,c=[];for(;s===void 0||o<s;){const m=await J(t);for(let f of m.items)c.push(await e(f));o+=m.items.length,s=m.total,t.options.page++}return c}async function ge({env:t,dmShortID:e,model:n,withMetadata:r}){d({env:t,dmShortID:e,model:n});const a=g(`api/schema/${e}/${n}`,t),i=await u(a),o=i?.allOf?.[1];if(typeof o.properties!="object")throw new Error(`getSchema: ${a} returned unexpected format: ${JSON.stringify(i)}`);const{properties:s}=o,c=N(s);for(let m in c){let f=c[m];if(f.required=o.required.includes(m),c[m]?.oneOf&&delete c[m]?.oneOf,f.title?.includes("<")&&f.title?.includes(">")){const k=f.title.split("<")[1].slice(0,-1),w=f.title.split("<")[0];f.type=w,k.includes(":")?f.resource=k.split(":")[1]:f.resource=k}else["asset","entry","assets","entries"].includes(f.title)?(f.type=f.title,f.resource=null):f.type=f.title;delete c[m].title}if(r){const m=s._modelTitle.title,f=s._modelTitleField.title;return{properties:c,meta:{modelTitleField:f,modelTitle:m}}}return c}function z(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 me=z;function q(t){return t._links.collection.href.split("/").slice(-2)[0]}function H(t){const e=t._links.collection.href.split("api/")[0];return Object.keys(A.datamanager).find(r=>A.datamanager[r]===e)}const K=t=>{const e=q(t),n=H(t),r=t._modelTitle,a=t.id;return{dmShortID:e,env:n,model:r,entryID:a}},fe=t=>F(K(t)),he=(t,e)=>x({...K(t),value:e});function pe(t,e){const n=q(e);return e._embedded[`${n}:${e._modelTitle}/${t}/asset`]}async function ye({env:t,dmShortID:e,assetGroup:n,assetID:r,token:a}){d({env:t,dmShortID:e,assetGroup:n,assetID:r});const i=h({assetID:r}),o=g(`a/${e}/${n}?${i}`,t),{_embedded:s}=await u(o,{token:a});return s?s["ec:dm-asset"]:void 0}async function ke(t){let{env:e,dmShortID:n,assetGroup:r,token:a,options:i={}}=t;d({env:e,dmShortID:n,assetGroup:r}),i={size:50,page:1,_list:!0,...i};const o=h(i),s=g(`a/${n}/${r}?${o}`,e),{count:c,total:m,_embedded:f}=await u(s,{token:a});let k=f?f["ec:dm-asset"]:[];return k=Array.isArray(k)?k:[k],{count:c,total:m,items:k}}async function we({env:t,dmShortID:e,assetGroup:n,token:r,file:a,name:i,options:o}){d({env:t,dmShortID:e,assetGroup:n,file:a});const s=g(`a/${e}/${n}`,t),c=new FormData;return c.append("file",a,i),o&&Object.keys(o).forEach(f=>{c.append(f,o[f])}),(await u(s,{token:r},{method:"POST",body:c}))._embedded["ec:dm-asset"]}async function De({env:t,dmShortID:e,assetGroup:n,files:r,options:a}){d({env:t,dmShortID:e,assetGroup:n,files:r});const i=g(`a/${e}/${n}`,t),o=new FormData;r.forEach(c=>{o.append("file",c)}),a&&Object.keys(a).forEach(c=>{o.append(c,a[c])});const s=await u(i,{},{method:"POST",body:o});return Array.isArray(s._embedded["ec:dm-asset"])?s._embedded["ec:dm-asset"]:[s._embedded["ec:dm-asset"]]}async function Te({env:t,dmShortID:e,assetGroup:n,assetID:r,token:a}){d({env:t,dmShortID:e,assetGroup:n,assetID:r});const i=g(`a/${e}/${n}/${r}`,t);await u(i,{token:a,rawRes:!0},{method:"DELETE"})}function $e(t,e,n=!1){let r,a;return(n?t?.thumbnails:t?.fileVariants)?.forEach(o=>{const{resolution:{width:s,height:c}}=o,m=Math.abs(Math.max(s,c)-e);(!a||m<a)&&(a=m,r=o)}),r?.url??t?.file?.url??null}function be(t="stage",e,n,r,a=!1){const i=Math.max(r.file.resolution.width,r.file.resolution.height),o=n.filter(c=>c<i),s=`https://datamanager${t==="stage"?".cachena":""}.entrecode.de`;return a?o.map(c=>{const m=r.thumbnails.find(w=>c===w.dimension),f=`${s}/t/${e}/${r.assetID}/${c}`,k=m?m.url:f;return{size:c,url:k,generated:m}}):o.map(c=>{const m=r.fileVariants.find(w=>c===Math.max(w.resolution.width,w.resolution.height)),f=`${s}/f/${e}/${r.assetID}/${c}`,k=m?m.url:f;return{size:c,url:k,generated:m}})}const p={"Content-Type":"application/json"};async function Ae(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 Ie(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:i,total:o,_embedded:s}=await u(a,t);let c=s?s["ec:datamanager"]:[];return c=Array.isArray(c)?c:[c],{count:i,total:o,items:c}}async function Ee(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),i=g(`model?${a}`,e),{count:o,total:s,_embedded:c}=await u(i,t);let m=c?c["ec:model"]:[];return m=Array.isArray(m)?m:[m],{count:o,total:s,items:m}}async function ve(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 i=h(r),o=g(`${n}?${i}`,e,a),{count:s,total:c,_embedded:m}=await u(o,t);let f=m?m[Object.keys(m)[0]]:[];return f=Array.isArray(f)?f:[f],{count:s,total:c,items:f}}async function Se(t,e={}){let{env:n,route:r,options:a={},subdomain:i="datamanager"}=t;d({env:n,subdomain:i,route:r}),a={...a};const o=h(a),s=g(`${r}?${o}`,n,i);return u(s,t,e)}async function qe(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 Oe(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const i=h({dataManagerID:r}),o=g(`?${i}`,e);return u(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function Ue(t){let{env:e,token:n,dmID:r}=t;d({env:e,dmID:r});const a=h({dataManagerID:r}),i=g(`?${a}`,e);return u(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Me(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const i=h({dataManagerID:r}),o=g(`model?${i}`,e);return u(o,{token:n},{method:"POST",body:JSON.stringify(a),headers:p})}async function Ce(t){let{env:e,token:n,dmID:r,modelID:a,value:i}=t;d({env:e,dmID:r,modelID:a,value:i});const o=h({dataManagerID:r,modelID:a}),s=g(`model?${o}`,e);return u(s,{token:n},{method:"PUT",body:JSON.stringify(i),headers:p})}async function Le(t){let{env:e,token:n,dmID:r,modelID:a}=t;d({env:e,dmID:r,modelID:a});const i=h({dataManagerID:r,modelID:a}),o=g(`model?${i}`,e);return u(o,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function _e(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 Pe(t){let{env:e,token:n,templateID:r,value:a}=t;d({env:e,templateID:r,value:a});const i=h({templateID:r}),o=g(`template?${i}`,e);return u(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function Re(t){let{env:e,token:n,templateID:r}=t;d({env:e,templateID:r});const a=h({templateID:r}),i=g(`template?${a}`,e);return u(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Be(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const i=h({dataManagerID:r}),o=g(`assetgroup?${i}`,e);return u(o,{token:n},{method:"POST",body:JSON.stringify(a),headers:p})}async function Ge(t){let{env:e,token:n,dmID:r,assetGroupID:a,value:i}=t;d({env:e,dmID:r,assetGroupID:a,value:i});const o=h({dataManagerID:r,assetGroupID:a}),s=g(`assetgroup?${o}`,e);return u(s,{token:n},{method:"PUT",body:JSON.stringify(i),headers:p})}async function je(t){let{env:e,token:n,dmShortID:r,assetGroup:a,assetID:i,value:o}=t;d({env:e,dmShortID:r,assetGroup:a,assetID:i,value:o});const s=g(`a/${r}/${a}/${i}`,e);return u(s,{token:n},{method:"PUT",body:JSON.stringify(o),headers:p})}async function Ne(t){let{env:e,token:n,dmID:r,clientID:a,value:i}=t;d({env:e,dmID:r,clientID:a,value:i});const o=h({dataManagerID:r,clientID:a}),s=g(`client?${o}`,e);return u(s,{token:n},{method:"PUT",body:JSON.stringify(i),headers:p})}async function Je(t){let{env:e,token:n,dmID:r,value:a}=t;d({env:e,dmID:r,value:a});const i=h({dataManagerID:r}),o=g(`role?${i}`,e);return u(o,{token:n},{method:"POST",body:JSON.stringify(a),headers:p})}async function xe(t){let{env:e,token:n,dmID:r,roleID:a,value:i}=t;d({env:e,dmID:r,roleID:a,value:i});const o=h({dataManagerID:r,roleID:a}),s=g(`role?${o}`,e);return u(s,{token:n},{method:"PUT",body:JSON.stringify(i),headers:p})}async function Fe(t){let{env:e,token:n,dmID:r,roleID:a}=t;d({env:e,dmID:r,roleID:a});const i=h({dataManagerID:r,roleID:a}),o=g(`role?${i}`,e);return u(o,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function ze(t){let{env:e,token:n,dmID:r,accountID:a,value:i}=t;d({env:e,dmID:r,accountID:a,value:i});const o=h({dataManagerID:r,accountID:a}),s=g(`account?${o}`,e);return u(s,{token:n},{method:"PUT",body:JSON.stringify(i),headers:p})}async function He(t){let{env:e,token:n,dmID:r,accountID:a}=t;d({env:e,dmID:r,accountID:a});const i=h({dataManagerID:r,accountID:a}),o=g(`account?${i}`,e);return u(o,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Ke(t){let{env:e,token:n,options:r={}}=t;d({env:e});const a=h(r),i=g(`stats?${a}`,e);return u(i,{token:n})}async function Ve(t){let{env:e,token:n,options:r={}}=t;d({env:e});const a=h(r),i=g(`entries?${a}`,e,"dm-history");return u(i,{token:n})}async function We(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 Xe(t){let{env:e,token:n,clientID:r,value:a}=t;d({env:e,clientID:r,value:a});const i=h({clientID:r}),o=g(`client?${i}`,e,"accounts");return u(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function Ye(t){let{env:e,token:n,clientID:r}=t;d({env:e,clientID:r});const a=h({clientID:r}),i=g(`client?${a}`,e,"accounts");return u(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function Qe(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 Ze(t){let{env:e,token:n,groupID:r,value:a}=t;d({env:e,groupID:r,value:a});const i=h({groupID:r}),o=g(`group?${i}`,e,"accounts");return u(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function et(t){let{env:e,token:n,groupID:r}=t;d({env:e,groupID:r});const a=h({groupID:r}),i=g(`group?${a}`,e,"accounts");return u(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function tt(t){let{env:e,token:n,value:r}=t;d({env:e,value:r});const a=g("invite",e,"accounts");return u(a,{token:n},{method:"POST",body:JSON.stringify(r),headers:p})}async function nt(t){let{env:e,token:n,inviteID:r,value:a}=t;d({env:e,inviteID:r,value:a});const i=h({inviteID:r}),o=g(`invite?${i}`,e,"accounts");return u(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function rt(t){let{env:e,token:n,inviteID:r}=t;d({env:e,inviteID:r});const a=h({inviteID:r}),i=g(`invite?${a}`,e,"accounts");return u(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}async function at(t){let{env:e,token:n,accountID:r,value:a}=t;d({env:e,accountID:r,value:a});const i=h({accountID:r}),o=g(`account?${i}`,e,"accounts");return u(o,{token:n},{method:"PUT",body:JSON.stringify(a),headers:p})}async function it(t){let{env:e,token:n,accountID:r}=t;d({env:e,accountID:r});const a=g(`account/${r}/tokens`,e,"accounts");return u(a,{token:n})}async function st(t){let{env:e,token:n,accountID:r}=t;d({env:e,accountID:r});const a=g(`account/${r}/tokens`,e,"accounts");return u(a,{token:n},{method:"POST",headers:p})}async function ot(t){let{env:e,token:n,accountID:r,accessTokenID:a}=t;d({env:e,accountID:r,accessTokenID:a});const i=g(`account/${r}/tokens/${a}`,e,"accounts");return u(i,{token:n,rawRes:!0},{method:"DELETE",headers:p})}const ct=Object.freeze(Object.defineProperty({__proto__:null,assetList:ke,createAccountClient:We,createAsset:we,createAssetGroup:Be,createAssets:De,createDatamanager:qe,createEntry:ue,createGroup:Qe,createInvite:tt,createModel:Me,createRole:Je,createTemplate:_e,createToken:st,deleteAccountClient:Ye,deleteAsset:Te,deleteDatamanager:Ue,deleteDmAccount:He,deleteEntry:F,deleteEntryObject:fe,deleteGroup:et,deleteInvite:rt,deleteModel:Le,deleteRole:Fe,deleteTemplate:Re,deleteToken:ot,dmList:Ie,editAccount:at,editAccountClient:Xe,editAsset:je,editAssetGroup:Ge,editDatamanager:Oe,editDmAccount:ze,editDmClient:Ne,editEntry:x,editEntryObject:he,editGroup:Ze,editInvite:nt,editModel:Ce,editRole:xe,editTemplate:Pe,entryList:J,fileVariant:$e,filterOptions:me,getAsset:ye,getDatamanager:Ae,getEcAuthKey:ie,getEntry:de,getEntryAsset:pe,getEntryEnv:H,getEntryShortID:q,getFileVariants:be,getHistory:Ve,getPublicAuthKey:ae,getSchema:ge,getStats:Ke,listTokens:it,loginEc:te,loginPublic:ee,logoutEc:re,logoutPublic:ne,mapEntries:le,modelList:Ee,publicApi:ce,raw:Se,resourceList:ve,sdkOptions:z},Symbol.toStringTag,{value:"Module"})),{entryList:U,mapEntries:dt,getEntry:ut,getAsset:lt,assetList:M,createAsset:gt,createAssets:mt,deleteAsset:ft,createEntry:ht,editEntry:C,deleteEntry:pt,getSchema:yt,loginPublic:kt,loginEc:wt,logoutEc:Dt,logoutPublic:Tt,getEcAuthKey:T,getPublicAuthKey:$,dmList:$t,modelList:bt,publicApi:At,getDatamanager:It,resourceList:Et,raw:vt,createDatamanager:St,editDatamanager:qt,deleteDatamanager:Ot,createModel:Ut,editModel:Mt,deleteModel:Ct,createTemplate:Lt,editTemplate:_t,deleteTemplate:Pt,createAssetGroup:Rt,editAssetGroup:Bt,editAsset:Gt,editDmClient:jt,createRole:Nt,editRole:Jt,deleteRole:xt,editDmAccount:Ft,deleteDmAccount:zt,getStats:Ht,getHistory:Kt,createAccountClient:Vt,editAccountClient:Wt,deleteAccountClient:Xt,createGroup:Yt,editGroup:Qt,deleteGroup:Zt,createInvite:en,editInvite:tn,deleteInvite:nn,editAccount:rn,listTokens:an,createToken:sn,deleteToken:on}=ct;function L(t){if(!t||typeof t!="object")return t;const{_links:e,_embedded:n,...r}=t;return r}function cn(t){return!t||typeof t!="object"?t:Array.isArray(t.items)?{...t,items:t.items.map(L)}:L(t)}class O{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 O({...this.config,...e})}async entries(e={}){const n=await this.getBestToken();return U({...this.config,options:e,token:n})}async entryList(e){const n=await this.getBestToken();return U({...this.config,options:e,token:n}).then(r=>this.maybeClean(r))}async mapEntries(e,n={}){const r=await this.getBestToken();return dt({...this.config,options:n,token:r},e)}async getEntry(e){const n=await this.getBestToken();return ut({...this.config,entryID:e,token:n}).then(r=>this.maybeClean(r))}async editEntrySafe(e,n){const r=await this.getBestToken();return C({...this.config,entryID:e,token:r,value:n,safePut:!0}).then(a=>this.maybeClean(a))}async getSchema(){return yt(this.config)}async assets(e){const n=await this.getBestToken();return M({...this.config,options:e,token:n})}async assetList(e){const n=await this.getBestToken();return M({...this.config,options:e,token:n})}async createAsset(e){const{file:n,name:r,options:a}=e,i=await this.getBestToken();return gt({...this.config,file:n,name:r,options:a,token:i})}async createAssets(e){const{files:n,options:r}=e,a=await this.getBestToken();return mt({...this.config,files:n,options:r,token:a})}async deleteAsset(e){const n=await this.getBestToken();return ft({...this.config,token:n,assetID:e})}async getAsset(e){const n=await this.getBestToken();return lt({...this.config,assetID:e,token:n})}async createEntry(e){const n=await this.getBestToken();return ht({...this.config,token:n,value:e}).then(r=>this.maybeClean(r))}async editEntry(e,n){const r=await this.getBestToken();return C({...this.config,entryID:e,token:r,value:n}).then(a=>this.maybeClean(a))}async deleteEntry(e){const n=await this.getBestToken();return pt({...this.config,token:n,entryID:e})}async resourceList(e){const n=await this.getBestToken();return Et({...this.config,options:e,token:n})}async raw(e,n){const r=await this.getBestToken();return vt({...this.config,options:e,token:r},n)}async createDatamanager(e){const n=await this.getBestToken();return St({...this.config,token:n,value:e})}async editDatamanager(e,n){const r=await this.getBestToken();return qt({...this.config,token:r,dmID:e,value:n})}async deleteDatamanager(e){const n=await this.getBestToken();return Ot({...this.config,token:n,dmID:e})}async createModel(e){const n=await this.getBestToken();return Ut({...this.config,token:n,value:e})}async editModel(e,n){const r=await this.getBestToken();return Mt({...this.config,token:r,modelID:e,value:n})}async deleteModel(e){const n=await this.getBestToken();return Ct({...this.config,token:n,modelID:e})}async createTemplate(e){const n=await this.getBestToken();return Lt({...this.config,token:n,value:e})}async editTemplate(e,n){const r=await this.getBestToken();return _t({...this.config,token:r,templateID:e,value:n})}async deleteTemplate(e){const n=await this.getBestToken();return Pt({...this.config,token:n,templateID:e})}async createAssetGroup(e){const n=await this.getBestToken();return Rt({...this.config,token:n,value:e})}async editAssetGroup(e,n){const r=await this.getBestToken();return Bt({...this.config,token:r,assetGroupID:e,value:n})}async editAsset(e,n){const r=await this.getBestToken();return Gt({...this.config,token:r,assetID:e,value:n})}async editDmClient(e,n){const r=await this.getBestToken();return jt({...this.config,token:r,clientID:e,value:n})}async createRole(e){const n=await this.getBestToken();return Nt({...this.config,token:n,value:e})}async editRole(e,n){const r=await this.getBestToken();return Jt({...this.config,token:r,roleID:e,value:n})}async deleteRole(e){const n=await this.getBestToken();return xt({...this.config,token:n,roleID:e})}async editDmAccount(e,n){const r=await this.getBestToken();return Ft({...this.config,token:r,accountID:e,value:n})}async deleteDmAccount(e){const n=await this.getBestToken();return zt({...this.config,token:n,accountID:e})}async getStats(e={}){const n=await this.getBestToken();return Ht({...this.config,token:n,options:e})}async getHistory(e={}){const n=await this.getBestToken();return Kt({...this.config,token:n,options:e})}async createAccountClient(e){const n=await this.getBestToken();return Vt({...this.config,token:n,value:e})}async editAccountClient(e,n){const r=await this.getBestToken();return Wt({...this.config,token:r,clientID:e,value:n})}async deleteAccountClient(e){const n=await this.getBestToken();return Xt({...this.config,token:n,clientID:e})}async createGroup(e){const n=await this.getBestToken();return Yt({...this.config,token:n,value:e})}async editGroup(e,n){const r=await this.getBestToken();return Qt({...this.config,token:r,groupID:e,value:n})}async deleteGroup(e){const n=await this.getBestToken();return Zt({...this.config,token:n,groupID:e})}async createInvite(e){const n=await this.getBestToken();return en({...this.config,token:n,value:e})}async editInvite(e,n){const r=await this.getBestToken();return tn({...this.config,token:r,inviteID:e,value:n})}async deleteInvite(e){const n=await this.getBestToken();return nn({...this.config,token:n,inviteID:e})}async editAccount(e,n){const r=await this.getBestToken();return rn({...this.config,token:r,accountID:e,value:n})}async listTokens(e){const n=await this.getBestToken();return an({...this.config,token:n,accountID:e})}async createToken(e){const n=await this.getBestToken();return sn({...this.config,token:n,accountID:e})}async deleteToken(e,n){const r=await this.getBestToken();return on({...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($(this.config))}getEcToken(){return this.config.token||this.getToken(T(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(T(this.config),e)}setPublicToken(e){this.setToken($(this.config),e)}loginEc(e){return wt({...this.config,...e}).then(n=>this.setToken(T(this.config),n.token))}loginPublic(e){return kt({...this.config,...e}).then(n=>this.setToken($(this.config),n.token))}logoutPublic(){const e=this.getPublicToken();return Tt({...this.config,token:e}).then(()=>this.removeToken($(this.config)))}logoutEc(){const e=this.getEcToken();return Dt({...this.config,token:e}).then(()=>this.removeToken(T(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?cn(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 At(this.config)}async getDatamanager(e){const n=await this.getBestToken();return It({...this.config,dmID:e,token:n})}async dmList(e={}){const n=await this.getBestToken();return $t({...this.config,options:e,token:n})}async modelList(e={}){const n=await this.getBestToken();return bt({...this.config,options:e,token:n})}}const v=G.join(Q.homedir(),".ec-fdk"),S=G.join(v,"auth.json");function E(){try{return D.existsSync(S)?JSON.parse(D.readFileSync(S,"utf-8")):{}}catch{return{}}}function _(t){D.existsSync(v)||D.mkdirSync(v,{recursive:!0,mode:448}),D.writeFileSync(S,JSON.stringify(t,null,2),{mode:384})}const dn={get(t){return E()[t]},set(t,e){const n=E();n[t]=e,_(n)},remove(t){const e=E();delete e[t],_(e)}};function un(t){const e=Z.createInterface({input:process.stdin,output:process.stderr});return new Promise(n=>{e.question(t,r=>{e.close(),n(r)})})}function ln(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=i=>{if(i===""&&(process.stderr.write(`
5
5
  `),process.exit(130)),i==="\r"||i===`
6
- `){e.setRawMode(!1),e.pause(),e.removeListener("data",r),process.stderr.write(`
7
- `),t(s);return}if(i===""||i==="\b"){s.length>0&&(s=s.slice(0,-1),process.stderr.write("\b \b"));return}s+=i,process.stderr.write("*")};e.on("data",r)})}const Wt=`ec.fdk <command> [options]
6
+ `){n.setRawMode(!1),n.pause(),n.removeListener("data",a),process.stderr.write(`
7
+ `),e(r);return}if(i===""||i==="\b"){r.length>0&&(r=r.slice(0,-1),process.stderr.write("\b \b"));return}r+=i,process.stderr.write("*")};n.on("data",a)})}const gn=Y.createRequire(typeof document>"u"?require("url").pathToFileURL(__filename).href:document.currentScript&&document.currentScript.src||new URL("cli.cjs",document.baseURI).href),{version:mn}=gn("../package.json"),fn=`ec.fdk <command> [options]
8
8
 
9
9
  Commands:
10
10
  login Login with ec credentials (interactive prompt)
11
- entryList List entries
12
- getEntry Get a single entry
13
- createEntry Create an entry
14
- editEntry Edit an entry
15
- deleteEntry Delete an entry
16
- getSchema Get model schema
11
+
12
+ Entry commands (require --dm, --model):
13
+ entryList List entries
14
+ getEntry Get a single entry (--id)
15
+ createEntry Create an entry (--data)
16
+ editEntry Edit an entry (--id, --data)
17
+ deleteEntry Delete an entry (--id)
18
+ getSchema Get model schema
19
+
20
+ Admin list commands:
21
+ dmList List datamanagers
22
+ modelList List models (--id = DM UUID)
23
+ getDatamanager Get a datamanager (--id = DM UUID)
24
+ resourceList List resources (--resource, optional --subdomain)
25
+ getStats Get datamanager stats
26
+ getHistory Get dm-history entries
27
+
28
+ Datamanager CRUD:
29
+ createDatamanager Create a datamanager (--data)
30
+ editDatamanager Edit a datamanager (--id, --data)
31
+ deleteDatamanager Delete a datamanager (--id)
32
+
33
+ Model CRUD (--id = DM UUID):
34
+ createModel Create a model (--data)
35
+ editModel Edit a model (--rid, --data)
36
+ deleteModel Delete a model (--rid)
37
+
38
+ Template CRUD:
39
+ createTemplate Create a template (--data)
40
+ editTemplate Edit a template (--rid, --data)
41
+ deleteTemplate Delete a template (--rid)
42
+
43
+ Asset Group (--id = DM UUID):
44
+ createAssetGroup Create an asset group (--data)
45
+ editAssetGroup Edit an asset group (--rid, --data)
46
+
47
+ Asset metadata:
48
+ editAsset Edit asset metadata (--dm, --assetgroup, --rid, --data)
49
+
50
+ DM Client (--id = DM UUID):
51
+ editDmClient Edit a DM client (--rid, --data)
52
+
53
+ Role CRUD (--id = DM UUID):
54
+ createRole Create a role (--data)
55
+ editRole Edit a role (--rid, --data)
56
+ deleteRole Delete a role (--rid)
57
+
58
+ DM Account (--id = DM UUID):
59
+ editDmAccount Edit a DM account (--account-id, --data)
60
+ deleteDmAccount Delete a DM account (--account-id)
61
+
62
+ Account Client:
63
+ createAccountClient Create an account client (--data)
64
+ editAccountClient Edit an account client (--rid, --data)
65
+ deleteAccountClient Delete an account client (--rid)
66
+
67
+ Group:
68
+ createGroup Create a group (--data)
69
+ editGroup Edit a group (--rid, --data)
70
+ deleteGroup Delete a group (--rid)
71
+
72
+ Invite:
73
+ createInvite Create an invite (--data)
74
+ editInvite Edit an invite (--rid, --data)
75
+ deleteInvite Delete an invite (--rid)
76
+
77
+ Account:
78
+ editAccount Edit an account (--account-id, --data)
79
+
80
+ Tokens:
81
+ listTokens List tokens (--account-id)
82
+ createToken Create a token (--account-id)
83
+ deleteToken Delete a token (--account-id, --rid)
17
84
 
18
85
  Options:
19
86
  -e, --env <env> Environment: stage|live (default: stage)
20
87
  -d, --dm <shortID> DataManager short ID
21
88
  -m, --model <name> Model name
22
- -i, --id <entryID> Entry ID (for get/edit/delete)
89
+ -i, --id <id> Entry ID or DataManager UUID (context-dependent)
90
+ --rid <id> Resource ID (model, template, role, client, asset group, etc.)
91
+ --account-id <id> Account ID
92
+ --assetgroup <name> Asset group name (for editAsset)
93
+ --resource <name> Resource name (for resourceList)
94
+ --subdomain <name> Subdomain override (for resourceList)
23
95
  --data <json> JSON data (for create/edit, or pipe via stdin)
24
96
  -s, --size <n> Page size for list
25
97
  -p, --page <n> Page number for list
26
98
  --sort <field> Sort field for list
99
+ -f, --filter <k=v> Filter for list (repeatable, e.g. -f title~=hello -f ageFrom=5)
27
100
  --raw Include _links and _embedded in output
28
101
  --md Output entries as readable markdown
29
- -h, --help Show help`;function p(n){process.stderr.write(`Error: ${n}
30
- `),process.exit(2)}function Xt(){return new Promise(n=>{let t="";process.stdin.setEncoding("utf-8"),process.stdin.on("data",e=>t+=e),process.stdin.on("end",()=>n(t))})}async function q(n){if(n)try{return JSON.parse(n)}catch{p("--data must be valid JSON")}if(!process.stdin.isTTY){const t=await Xt();t.trim()||p("No data provided via stdin");try{return JSON.parse(t)}catch{p("Stdin must be valid JSON")}}p("Provide --data or pipe JSON via stdin")}const N=40;function B(n){return n.length>N?n.slice(0,N-2)+"..":n}function K(n){return n==null?"":B(typeof n=="object"?JSON.stringify(n):String(n))}function V(n){return Object.keys(n).filter(t=>!t.startsWith("_"))}function E(n,t){return"| "+n.map((e,s)=>e.padEnd(t[s])).join(" | ")+" |"}function Yt(n){const t=V(n),e=t.map(d=>K(n[d])),s=Math.max(5,...t.map(d=>d.length)),r=Math.max(5,...e.map(d=>d.length)),i=[s,r],o=E(["Field","Value"],i),a="| "+i.map(d=>"-".repeat(d)).join(" | ")+" |",c=t.map((d,u)=>E([d,e[u]],i));return`${o}
31
- ${a}
102
+ -v, --version Show version
103
+ -h, --help Show help`;function hn(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}
104
+ `),process.exit(2)}function pn(){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 pn();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 P(t){if(!t||typeof t!="object")return t;const{_links:e,_embedded:n,...r}=t;return r}function b(t){return!t||typeof t!="object"?t:Array.isArray(t.items)?{...t,items:t.items.map(P)}:P(t)}const R=40;function B(t){return t.length>R?t.slice(0,R-2)+"..":t}function V(t){return t==null?"":B(typeof t=="object"?JSON.stringify(t):String(t))}function W(t){return Object.keys(t).filter(e=>!e.startsWith("_"))}function I(t,e){return"| "+t.map((n,r)=>n.padEnd(e[r])).join(" | ")+" |"}function yn(t){const e=W(t),n=e.map(m=>V(t[m])),r=Math.max(5,...e.map(m=>m.length)),a=Math.max(5,...n.map(m=>m.length)),i=[r,a],o=I(["Field","Value"],i),s="| "+i.map(m=>"-".repeat(m)).join(" | ")+" |",c=e.map((m,f)=>I([m,n[f]],i));return`${o}
105
+ ${s}
32
106
  ${c.join(`
33
- `)}`}function Qt(n){if(!n.items.length)return"No entries found.";const t=V(n.items[0]),e=n.items.map(a=>t.map(c=>K(a[c]))),s=t.map((a,c)=>Math.max(a.length,...e.map(d=>d[c].length))),r=E(t,s),i="| "+s.map(a=>"-".repeat(a)).join(" | ")+" |",o=e.map(a=>E(a,s));return`${r}
107
+ `)}`}function kn(t){if(!t.items.length)return"No entries found.";const e=W(t.items[0]),n=t.items.map(s=>e.map(c=>V(s[c]))),r=e.map((s,c)=>Math.max(s.length,...n.map(m=>m[c].length))),a=I(e,r),i="| "+r.map(s=>"-".repeat(s)).join(" | ")+" |",o=n.map(s=>I(s,r));return`${a}
34
108
  ${i}
35
109
  ${o.join(`
36
110
  `)}
37
111
 
38
- ${n.items.length} of ${n.total} entries`}async function Zt(){const{values:n,positionals:t}=G.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"},raw:{type:"boolean",default:!1},md:{type:"boolean",default:!1},help:{type:"boolean",short:"h"}}});(n.help||t.length===0)&&(console.log(Wt),process.exit(0));const e=t[0],s=n.env;s!=="stage"&&s!=="live"&&p('--env must be "stage" or "live"');const r=new O({env:s,storageAdapter:Vt});if(e==="login"){const o=await Gt("Email: "),a=await Ht("Password: ");try{await r.loginEc({email:o,password:a}),process.stderr.write(`Logged in to ${s} successfully.
39
- `)}catch(c){process.stderr.write(`Login failed: ${c.message}
40
- `),process.exit(1)}return}n.dm||p("--dm is required"),n.model,n.model||p("--model is required");const i=r.dm(n.dm).model(n.model).clean(!n.raw);try{let o;switch(e){case"entryList":{const a={};n.size&&(a.size=Number(n.size)),n.page&&(a.page=Number(n.page)),n.sort&&(a.sort=[n.sort]),o=await i.entryList(a);break}case"getEntry":{n.id||p("--id is required for getEntry"),o=await i.getEntry(n.id);break}case"createEntry":{const a=await q(n.data);o=await i.createEntry(a);break}case"editEntry":{n.id||p("--id is required for editEntry");const a=await q(n.data);o=await i.editEntry(n.id,a);break}case"deleteEntry":{n.id||p("--id is required for deleteEntry"),await i.deleteEntry(n.id),process.stderr.write(`Entry deleted.
41
- `);return}case"getSchema":{o=await i.getSchema();break}default:p(`Unknown command: ${e}`)}n.md&&o&&typeof o=="object"?Array.isArray(o.items)?process.stdout.write(Qt(o)+`
42
- `):process.stdout.write(Yt(o)+`
43
- `):process.stdout.write(JSON.stringify(o,null,2)+`
44
- `)}catch(o){process.stderr.write(`${o.message}
45
- `),process.exit(1)}}Zt();
112
+ ${t.items.length} of ${t.total} entries`}async function wn(){const{values:t,positionals:e}=X.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},version:{type:"boolean",short:"v"},help:{type:"boolean",short:"h"}}});t.version&&(console.log(mn),process.exit(0)),(t.help||e.length===0)&&(console.log(fn),process.exit(0));const n=e[0],r=t.env;r!=="stage"&&r!=="live"&&l('--env must be "stage" or "live"');const a=new O({env:r,storageAdapter:dn});if(n==="login"){const i=await un("Email: "),o=await ln("Password: ");try{await a.loginEc({email:i,password:o}),process.stderr.write(`Logged in to ${r} successfully.
113
+ `)}catch(s){process.stderr.write(`Login failed: ${s.message}
114
+ `),process.exit(1)}return}try{let i;const o=()=>{const s={...hn(t.filter)};return t.size&&(s.size=Number(t.size)),t.page&&(s.page=Number(t.page)),t.sort&&(s.sort=[t.sort]),s};switch(n){case"dmList":{i=await a.dmList(o()),t.raw||(i=b(i));break}case"modelList":{t.id||l("--id (datamanager UUID) is required for modelList"),i=await a.dmID(t.id).modelList(o()),t.raw||(i=b(i));break}case"getDatamanager":{t.id||l("--id (datamanager UUID) is required for getDatamanager"),i=await a.getDatamanager(t.id),t.raw||(i=b(i));break}case"resourceList":{t.resource||l("--resource is required for resourceList");let s=a.resource(t.resource);t.subdomain&&(s=s.subdomain(t.subdomain)),i=await s.resourceList(o()),t.raw||(i=b(i));break}case"getStats":{i=await a.getStats(o());break}case"getHistory":{i=await a.getHistory(o());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 s=a.dm(t.dm).model(t.model).clean(!t.raw);switch(n){case"entryList":{i=await s.entryList(o());break}case"getEntry":{t.id||l("--id is required for getEntry"),i=await s.getEntry(t.id);break}case"createEntry":{const c=await y(t.data);i=await s.createEntry(c);break}case"editEntry":{t.id||l("--id is required for editEntry");const c=await y(t.data);i=await s.editEntry(t.id,c);break}case"deleteEntry":{t.id||l("--id is required for deleteEntry"),await s.deleteEntry(t.id),process.stderr.write(`Entry deleted.
115
+ `);return}case"getSchema":{i=await s.getSchema();break}}break}case"createDatamanager":{const s=await y(t.data);i=await a.createDatamanager(s);break}case"editDatamanager":{t.id||l("--id (datamanager UUID) is required for editDatamanager");const s=await y(t.data);i=await a.editDatamanager(t.id,s);break}case"deleteDatamanager":{t.id||l("--id (datamanager UUID) is required for deleteDatamanager"),await a.deleteDatamanager(t.id),process.stderr.write(`Datamanager deleted.
116
+ `);return}case"createModel":{t.id||l("--id (datamanager UUID) is required for createModel");const s=await y(t.data);i=await a.dmID(t.id).createModel(s);break}case"editModel":{t.id||l("--id (datamanager UUID) is required for editModel"),t.rid||l("--rid (model ID) is required for editModel");const s=await y(t.data);i=await a.dmID(t.id).editModel(t.rid,s);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.
117
+ `);return}case"createTemplate":{const s=await y(t.data);i=await a.createTemplate(s);break}case"editTemplate":{t.rid||l("--rid (template ID) is required for editTemplate");const s=await y(t.data);i=await a.editTemplate(t.rid,s);break}case"deleteTemplate":{t.rid||l("--rid (template ID) is required for deleteTemplate"),await a.deleteTemplate(t.rid),process.stderr.write(`Template deleted.
118
+ `);return}case"createAssetGroup":{t.id||l("--id (datamanager UUID) is required for createAssetGroup");const s=await y(t.data);i=await a.dmID(t.id).createAssetGroup(s);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 s=await y(t.data);i=await a.dmID(t.id).editAssetGroup(t.rid,s);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 s=await y(t.data);i=await a.dm(t.dm).assetGroup(t.assetgroup).editAsset(t.rid,s);break}case"editDmClient":{t.id||l("--id (datamanager UUID) is required for editDmClient"),t.rid||l("--rid (client ID) is required for editDmClient");const s=await y(t.data);i=await a.dmID(t.id).editDmClient(t.rid,s);break}case"createRole":{t.id||l("--id (datamanager UUID) is required for createRole");const s=await y(t.data);i=await a.dmID(t.id).createRole(s);break}case"editRole":{t.id||l("--id (datamanager UUID) is required for editRole"),t.rid||l("--rid (role ID) is required for editRole");const s=await y(t.data);i=await a.dmID(t.id).editRole(t.rid,s);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.
119
+ `);return}case"editDmAccount":{t.id||l("--id (datamanager UUID) is required for editDmAccount"),t["account-id"]||l("--account-id is required for editDmAccount");const s=await y(t.data);i=await a.dmID(t.id).editDmAccount(t["account-id"],s);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.
120
+ `);return}case"createAccountClient":{const s=await y(t.data);i=await a.createAccountClient(s);break}case"editAccountClient":{t.rid||l("--rid (client ID) is required for editAccountClient");const s=await y(t.data);i=await a.editAccountClient(t.rid,s);break}case"deleteAccountClient":{t.rid||l("--rid (client ID) is required for deleteAccountClient"),await a.deleteAccountClient(t.rid),process.stderr.write(`Account client deleted.
121
+ `);return}case"createGroup":{const s=await y(t.data);i=await a.createGroup(s);break}case"editGroup":{t.rid||l("--rid (group ID) is required for editGroup");const s=await y(t.data);i=await a.editGroup(t.rid,s);break}case"deleteGroup":{t.rid||l("--rid (group ID) is required for deleteGroup"),await a.deleteGroup(t.rid),process.stderr.write(`Group deleted.
122
+ `);return}case"createInvite":{const s=await y(t.data);i=await a.createInvite(s);break}case"editInvite":{t.rid||l("--rid (invite ID) is required for editInvite");const s=await y(t.data);i=await a.editInvite(t.rid,s);break}case"deleteInvite":{t.rid||l("--rid (invite ID) is required for deleteInvite"),await a.deleteInvite(t.rid),process.stderr.write(`Invite deleted.
123
+ `);return}case"editAccount":{t["account-id"]||l("--account-id is required for editAccount");const s=await y(t.data);i=await a.editAccount(t["account-id"],s);break}case"listTokens":{t["account-id"]||l("--account-id is required for listTokens"),i=await a.listTokens(t["account-id"]);break}case"createToken":{t["account-id"]||l("--account-id is required for createToken"),i=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.
124
+ `);return}default:l(`Unknown command: ${n}`)}t.md&&i&&typeof i=="object"?Array.isArray(i.items)?process.stdout.write(kn(i)+`
125
+ `):process.stdout.write(yn(i)+`
126
+ `):process.stdout.write(JSON.stringify(i,null,2)+`
127
+ `)}catch(i){process.stderr.write(`${i.message}
128
+ `),process.exit(1)}}wn();