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 +254 -27
- package/dist/cli.cjs +106 -23
- package/dist/index.cjs +3 -3
- package/dist/index.mjs +1299 -479
- package/dist/lib/admin.d.ts +129 -5
- package/dist/lib/admin.d.ts.map +1 -1
- package/dist/lib/admin.test.d.ts +2 -0
- package/dist/lib/admin.test.d.ts.map +1 -0
- package/dist/lib/api.d.ts +165 -0
- package/dist/lib/api.d.ts.map +1 -1
- package/dist/types.d.ts +137 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +6 -5
- package/publish.sh +30 -0
- package/vitest.config.ts +10 -0
package/README.md
CHANGED
|
@@ -105,31 +105,147 @@ ec.fdk <command> [options]
|
|
|
105
105
|
|
|
106
106
|
### Commands
|
|
107
107
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
|
111
|
-
|
|
|
112
|
-
| `
|
|
113
|
-
| `
|
|
114
|
-
| `
|
|
115
|
-
| `
|
|
116
|
-
| `
|
|
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
|
|
121
|
-
|
|
|
122
|
-
| `-e, --env <env>`
|
|
123
|
-
| `-d, --dm <shortID>`
|
|
124
|
-
| `-m, --model <name>`
|
|
125
|
-
| `-i, --id <id>`
|
|
126
|
-
| `--
|
|
127
|
-
|
|
|
128
|
-
|
|
|
129
|
-
| `--
|
|
130
|
-
| `--
|
|
131
|
-
| `--
|
|
132
|
-
| `-
|
|
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
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
|
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
|
-
`){
|
|
7
|
-
`),
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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 <
|
|
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
|
-
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
|
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
|
-
${
|
|
39
|
-
`)}catch(
|
|
40
|
-
`),process.exit(1)}return}n.
|
|
41
|
-
`);return}case"getSchema":{
|
|
42
|
-
`):process.
|
|
43
|
-
`):
|
|
44
|
-
`)}
|
|
45
|
-
`),
|
|
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();
|