@transcend-io/cli 8.37.0 → 8.37.2
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 +35 -19
- package/dist/{api-keys-eh_rPCV_.cjs → api-keys-Bvt2HbSv.cjs} +2 -2
- package/dist/{api-keys-eh_rPCV_.cjs.map → api-keys-Bvt2HbSv.cjs.map} +1 -1
- package/dist/{app-D0ewaGAn.cjs → app-CdWFyBYu.cjs} +18 -18
- package/dist/app-CdWFyBYu.cjs.map +1 -0
- package/dist/bin/bash-complete.cjs +1 -1
- package/dist/bin/cli.cjs +1 -1
- package/dist/bin/deprecated-command.cjs +1 -1
- package/dist/{code-scanning-BB6Ncuzh.cjs → code-scanning-BZzwKEfY.cjs} +2 -2
- package/dist/{code-scanning-BB6Ncuzh.cjs.map → code-scanning-BZzwKEfY.cjs.map} +1 -1
- package/dist/{command-BUkTNNIa.cjs → command-DNcjQs8y.cjs} +2 -2
- package/dist/{command-BUkTNNIa.cjs.map → command-DNcjQs8y.cjs.map} +1 -1
- package/dist/{consent-manager-Df8gw2Qh.cjs → consent-manager-oip5m3XC.cjs} +2 -2
- package/dist/{consent-manager-Df8gw2Qh.cjs.map → consent-manager-oip5m3XC.cjs.map} +1 -1
- package/dist/{constants-7qBywLgI.cjs → constants-K6pQQtc7.cjs} +2 -2
- package/dist/{constants-7qBywLgI.cjs.map → constants-K6pQQtc7.cjs.map} +1 -1
- package/dist/{cron-BhfbISdy.cjs → cron-lijiEqFA.cjs} +2 -2
- package/dist/{cron-BhfbISdy.cjs.map → cron-lijiEqFA.cjs.map} +1 -1
- package/dist/{data-inventory-D36n1YAJ.cjs → data-inventory-BKAQGjFN.cjs} +2 -2
- package/dist/{data-inventory-D36n1YAJ.cjs.map → data-inventory-BKAQGjFN.cjs.map} +1 -1
- package/dist/{dataFlowsToDataSilos-BLNhWeOw.cjs → dataFlowsToDataSilos-CnvG2jqy.cjs} +2 -2
- package/dist/{dataFlowsToDataSilos-BLNhWeOw.cjs.map → dataFlowsToDataSilos-CnvG2jqy.cjs.map} +1 -1
- package/dist/{impl-BNEgHNz7.cjs → impl-1-1sg4WF.cjs} +2 -2
- package/dist/{impl-BNEgHNz7.cjs.map → impl-1-1sg4WF.cjs.map} +1 -1
- package/dist/{impl-CdXk78ar.cjs → impl-57HOh2c3.cjs} +2 -2
- package/dist/{impl-CdXk78ar.cjs.map → impl-57HOh2c3.cjs.map} +1 -1
- package/dist/{impl-BC1mCUl1.cjs → impl-58WnFNmn.cjs} +2 -2
- package/dist/{impl-BC1mCUl1.cjs.map → impl-58WnFNmn.cjs.map} +1 -1
- package/dist/impl-B4OVz7FC.cjs +2 -0
- package/dist/impl-B4OVz7FC.cjs.map +1 -0
- package/dist/{impl-5AfPlpzA.cjs → impl-BFRrE04X.cjs} +2 -2
- package/dist/{impl-5AfPlpzA.cjs.map → impl-BFRrE04X.cjs.map} +1 -1
- package/dist/{impl-DxDGyjMI.cjs → impl-BSS_avMv.cjs} +2 -2
- package/dist/{impl-DxDGyjMI.cjs.map → impl-BSS_avMv.cjs.map} +1 -1
- package/dist/{impl-DEULjxRp.cjs → impl-BVmw0mE4.cjs} +2 -2
- package/dist/{impl-DEULjxRp.cjs.map → impl-BVmw0mE4.cjs.map} +1 -1
- package/dist/{impl-IQ7JOZxt.cjs → impl-Bf_hLViY.cjs} +2 -2
- package/dist/{impl-IQ7JOZxt.cjs.map → impl-Bf_hLViY.cjs.map} +1 -1
- package/dist/{impl-47WGWxyj.cjs → impl-BkEg-Nm6.cjs} +2 -2
- package/dist/{impl-47WGWxyj.cjs.map → impl-BkEg-Nm6.cjs.map} +1 -1
- package/dist/{impl-DDHduv-X.cjs → impl-Bmln6D88.cjs} +2 -2
- package/dist/{impl-DDHduv-X.cjs.map → impl-Bmln6D88.cjs.map} +1 -1
- package/dist/impl-BqIqzp40.cjs +2 -0
- package/dist/impl-BqIqzp40.cjs.map +1 -0
- package/dist/{impl-DVCUGrVY.cjs → impl-BszlCtcR.cjs} +2 -2
- package/dist/{impl-DVCUGrVY.cjs.map → impl-BszlCtcR.cjs.map} +1 -1
- package/dist/impl-BtuKKdl3.cjs +2 -0
- package/dist/impl-BtuKKdl3.cjs.map +1 -0
- package/dist/{impl-DI3lTLCy.cjs → impl-C2e4xVvX.cjs} +2 -2
- package/dist/{impl-DI3lTLCy.cjs.map → impl-C2e4xVvX.cjs.map} +1 -1
- package/dist/impl-C65nk0G8.cjs +2 -0
- package/dist/impl-C65nk0G8.cjs.map +1 -0
- package/dist/{impl-DHUnZ-Qx.cjs → impl-CCdxbRmg.cjs} +2 -2
- package/dist/{impl-DHUnZ-Qx.cjs.map → impl-CCdxbRmg.cjs.map} +1 -1
- package/dist/{impl-Dxgw6Xfk.cjs → impl-CMwmo2vR.cjs} +2 -2
- package/dist/{impl-Dxgw6Xfk.cjs.map → impl-CMwmo2vR.cjs.map} +1 -1
- package/dist/impl-Cb64HwGx.cjs +2 -0
- package/dist/impl-Cb64HwGx.cjs.map +1 -0
- package/dist/{impl-4NCrJ_Y6.cjs → impl-CdfA8kxo.cjs} +2 -2
- package/dist/{impl-4NCrJ_Y6.cjs.map → impl-CdfA8kxo.cjs.map} +1 -1
- package/dist/{impl-DlB56v12.cjs → impl-CkfOZzpI.cjs} +2 -2
- package/dist/{impl-DlB56v12.cjs.map → impl-CkfOZzpI.cjs.map} +1 -1
- package/dist/{impl-bgI-lF8x.cjs → impl-ClujxTb8.cjs} +2 -2
- package/dist/{impl-bgI-lF8x.cjs.map → impl-ClujxTb8.cjs.map} +1 -1
- package/dist/{impl-orpaJd8b.cjs → impl-D-IWtHQi.cjs} +2 -2
- package/dist/{impl-orpaJd8b.cjs.map → impl-D-IWtHQi.cjs.map} +1 -1
- package/dist/{impl-DQTfX_qq.cjs → impl-D9-ZQmJB.cjs} +2 -2
- package/dist/{impl-DQTfX_qq.cjs.map → impl-D9-ZQmJB.cjs.map} +1 -1
- package/dist/{impl-Du1Ty4JE.cjs → impl-DGel0ZLe.cjs} +2 -2
- package/dist/{impl-Du1Ty4JE.cjs.map → impl-DGel0ZLe.cjs.map} +1 -1
- package/dist/{impl-BPq8EyHn.cjs → impl-DL2j8g1C.cjs} +2 -2
- package/dist/{impl-BPq8EyHn.cjs.map → impl-DL2j8g1C.cjs.map} +1 -1
- package/dist/{impl-CkkD_smS.cjs → impl-DSNgFKP_.cjs} +2 -2
- package/dist/{impl-CkkD_smS.cjs.map → impl-DSNgFKP_.cjs.map} +1 -1
- package/dist/{impl-CfsKuglq.cjs → impl-DU85U1jO.cjs} +2 -2
- package/dist/{impl-CfsKuglq.cjs.map → impl-DU85U1jO.cjs.map} +1 -1
- package/dist/{impl-DS2IlxS3.cjs → impl-DV5f54rm.cjs} +2 -2
- package/dist/{impl-DS2IlxS3.cjs.map → impl-DV5f54rm.cjs.map} +1 -1
- package/dist/impl-DXKJH0AZ.cjs +2 -0
- package/dist/impl-DXKJH0AZ.cjs.map +1 -0
- package/dist/{impl-BfN9XMNM.cjs → impl-DbxzDk8h.cjs} +2 -2
- package/dist/{impl-BfN9XMNM.cjs.map → impl-DbxzDk8h.cjs.map} +1 -1
- package/dist/{impl-CVsXgVaf.cjs → impl-DhnCAbU-.cjs} +2 -2
- package/dist/{impl-CVsXgVaf.cjs.map → impl-DhnCAbU-.cjs.map} +1 -1
- package/dist/{impl-BxOeeF35.cjs → impl-Dj2fTDNO.cjs} +2 -2
- package/dist/{impl-BxOeeF35.cjs.map → impl-Dj2fTDNO.cjs.map} +1 -1
- package/dist/{impl-C1IjDv1N.cjs → impl-KAorCmlT.cjs} +2 -2
- package/dist/{impl-C1IjDv1N.cjs.map → impl-KAorCmlT.cjs.map} +1 -1
- package/dist/{impl-Bv2mYf1w.cjs → impl-LMp29vxd.cjs} +2 -2
- package/dist/{impl-Bv2mYf1w.cjs.map → impl-LMp29vxd.cjs.map} +1 -1
- package/dist/{impl-feFIqpBO.cjs → impl-MrsSr72p.cjs} +2 -2
- package/dist/{impl-feFIqpBO.cjs.map → impl-MrsSr72p.cjs.map} +1 -1
- package/dist/{impl-Boa1Uuzk.cjs → impl-SZp3iTUp.cjs} +2 -2
- package/dist/{impl-Boa1Uuzk.cjs.map → impl-SZp3iTUp.cjs.map} +1 -1
- package/dist/{impl-8Basu9U-.cjs → impl-W6jE_UV0.cjs} +2 -2
- package/dist/{impl-8Basu9U-.cjs.map → impl-W6jE_UV0.cjs.map} +1 -1
- package/dist/{impl-Cotrjytz.cjs → impl-XwC7A99P.cjs} +2 -2
- package/dist/{impl-Cotrjytz.cjs.map → impl-XwC7A99P.cjs.map} +1 -1
- package/dist/{impl-DKMxd5Wy.cjs → impl-ebVxRYAc.cjs} +2 -2
- package/dist/{impl-DKMxd5Wy.cjs.map → impl-ebVxRYAc.cjs.map} +1 -1
- package/dist/impl-k61p_VQY.cjs +2 -0
- package/dist/impl-k61p_VQY.cjs.map +1 -0
- package/dist/impl-kMebV10f.cjs +2 -0
- package/dist/impl-kMebV10f.cjs.map +1 -0
- package/dist/{impl--PmMYd1g.cjs → impl-oYFKp06U.cjs} +2 -2
- package/dist/{impl--PmMYd1g.cjs.map → impl-oYFKp06U.cjs.map} +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +74 -11
- package/dist/{manual-enrichment-CzRiIFev.cjs → manual-enrichment-C6h9gjY1.cjs} +2 -2
- package/dist/{manual-enrichment-CzRiIFev.cjs.map → manual-enrichment-C6h9gjY1.cjs.map} +1 -1
- package/dist/{pooling-BJAPXDiq.cjs → pooling-DLEGcLtt.cjs} +5 -5
- package/dist/pooling-DLEGcLtt.cjs.map +1 -0
- package/dist/{preference-management-DV6NIcXt.cjs → preference-management-B36PQuMK.cjs} +2 -2
- package/dist/{preference-management-DV6NIcXt.cjs.map → preference-management-B36PQuMK.cjs.map} +1 -1
- package/dist/{syncConfigurationToTranscend-Bd0ZTIm1.cjs → syncConfigurationToTranscend-DKliAJhK.cjs} +12 -6
- package/dist/syncConfigurationToTranscend-DKliAJhK.cjs.map +1 -0
- package/dist/{uploadConsents-XYRco1_L.cjs → uploadConsents-MtgCk8B0.cjs} +2 -2
- package/dist/{uploadConsents-XYRco1_L.cjs.map → uploadConsents-MtgCk8B0.cjs.map} +1 -1
- package/package.json +1 -1
- package/dist/app-D0ewaGAn.cjs.map +0 -1
- package/dist/impl--CgaKM4x.cjs +0 -2
- package/dist/impl--CgaKM4x.cjs.map +0 -1
- package/dist/impl-ByQI5s4b.cjs +0 -2
- package/dist/impl-ByQI5s4b.cjs.map +0 -1
- package/dist/impl-Crhm9eFe.cjs +0 -2
- package/dist/impl-Crhm9eFe.cjs.map +0 -1
- package/dist/impl-D2P_gDE8.cjs +0 -2
- package/dist/impl-D2P_gDE8.cjs.map +0 -1
- package/dist/impl-DNDs3FFG.cjs +0 -2
- package/dist/impl-DNDs3FFG.cjs.map +0 -1
- package/dist/impl-DZbi3AkB.cjs +0 -2
- package/dist/impl-DZbi3AkB.cjs.map +0 -1
- package/dist/impl-DcMkDhXY.cjs +0 -2
- package/dist/impl-DcMkDhXY.cjs.map +0 -1
- package/dist/impl-xUzH7vUF.cjs +0 -2
- package/dist/impl-xUzH7vUF.cjs.map +0 -1
- package/dist/pooling-BJAPXDiq.cjs.map +0 -1
- package/dist/syncConfigurationToTranscend-Bd0ZTIm1.cjs.map +0 -1
package/README.md
CHANGED
|
@@ -190,7 +190,7 @@ data-silos:
|
|
|
190
190
|
|
|
191
191
|
```txt
|
|
192
192
|
USAGE
|
|
193
|
-
transcend request approve (--auth value) (--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD) [--origins PRIVACY_CENTER|ADMIN_DASHBOARD|API|SHOPIFY] [--silentModeBefore value] [--createdAtBefore value] [--createdAtAfter value] [--transcendUrl value] [--concurrency value]
|
|
193
|
+
transcend request approve (--auth value) (--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD) [--origins PRIVACY_CENTER|ADMIN_DASHBOARD|API|SHOPIFY] [--silentModeBefore value] [--createdAtBefore value] [--createdAtAfter value] [--updatedAtBefore value] [--updatedAtAfter value] [--transcendUrl value] [--concurrency value]
|
|
194
194
|
transcend request approve --help
|
|
195
195
|
|
|
196
196
|
Bulk approve a set of privacy requests from the DSR Automation -> Incoming Requests tab.
|
|
@@ -202,6 +202,8 @@ FLAGS
|
|
|
202
202
|
[--silentModeBefore] Any requests made before this date should be marked as silent mode
|
|
203
203
|
[--createdAtBefore] Approve requests that were submitted before this time
|
|
204
204
|
[--createdAtAfter] Approve requests that were submitted after this time
|
|
205
|
+
[--updatedAtBefore] Approve requests that were last updated before this time
|
|
206
|
+
[--updatedAtAfter] Approve requests that were last updated after this time
|
|
205
207
|
[--transcendUrl] URL of the Transcend backend. Use https://api.us.transcend.io for US hosting [default = https://api.transcend.io]
|
|
206
208
|
[--concurrency] The concurrency to use when uploading requests in parallel [default = 50]
|
|
207
209
|
-h --help Print help information and exit
|
|
@@ -390,7 +392,7 @@ transcend request upload \
|
|
|
390
392
|
|
|
391
393
|
```txt
|
|
392
394
|
USAGE
|
|
393
|
-
transcend request download-files (--auth value) [--sombraAuth value] [--concurrency value] [--requestIds value]... [--statuses REQUEST_MADE|FAILED_VERIFICATION|ENRICHING|ON_HOLD|WAITING|COMPILING|APPROVING|DELAYED|COMPLETED|DOWNLOADABLE|VIEW_CATEGORIES|CANCELED|SECONDARY|SECONDARY_COMPLETED|SECONDARY_APPROVING|REVOKED] [--folderPath value] [--createdAtBefore value] [--createdAtAfter value] [--approveAfterDownload] [--transcendUrl value]
|
|
395
|
+
transcend request download-files (--auth value) [--sombraAuth value] [--concurrency value] [--requestIds value]... [--statuses REQUEST_MADE|FAILED_VERIFICATION|ENRICHING|ON_HOLD|WAITING|COMPILING|APPROVING|DELAYED|COMPLETED|DOWNLOADABLE|VIEW_CATEGORIES|CANCELED|SECONDARY|SECONDARY_COMPLETED|SECONDARY_APPROVING|REVOKED] [--folderPath value] [--createdAtBefore value] [--createdAtAfter value] [--updatedAtBefore value] [--updatedAtAfter value] [--approveAfterDownload] [--transcendUrl value]
|
|
394
396
|
transcend request download-files --help
|
|
395
397
|
|
|
396
398
|
Download the files associated with a Data Subject Access Request (DSAR) from DSR Automation -> Incoming Requests tab.
|
|
@@ -404,6 +406,8 @@ FLAGS
|
|
|
404
406
|
[--folderPath] The folder to download files to [default = ./dsr-files]
|
|
405
407
|
[--createdAtBefore] Download requests that were submitted before this time
|
|
406
408
|
[--createdAtAfter] Download requests that were submitted after this time
|
|
409
|
+
[--updatedAtBefore] Download requests that were last updated before this time
|
|
410
|
+
[--updatedAtAfter] Download requests that were last updated after this time
|
|
407
411
|
[--approveAfterDownload] If the request is in status=APPROVING, approve the request after its downloaded [default = false]
|
|
408
412
|
[--transcendUrl] URL of the Transcend backend. Use https://api.us.transcend.io for US hosting [default = https://api.transcend.io]
|
|
409
413
|
-h --help Print help information and exit
|
|
@@ -472,7 +476,7 @@ transcend request download-files \
|
|
|
472
476
|
|
|
473
477
|
```txt
|
|
474
478
|
USAGE
|
|
475
|
-
transcend request cancel (--auth value) (--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD) [--statuses REQUEST_MADE|FAILED_VERIFICATION|ENRICHING|ON_HOLD|WAITING|COMPILING|APPROVING|DELAYED|COMPLETED|DOWNLOADABLE|VIEW_CATEGORIES|CANCELED|SECONDARY|SECONDARY_COMPLETED|SECONDARY_APPROVING|REVOKED] [--requestIds value]... [--silentModeBefore value] [--createdAtBefore value] [--createdAtAfter value] [--cancellationTitle value] [--transcendUrl value] [--concurrency value]
|
|
479
|
+
transcend request cancel (--auth value) (--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD) [--statuses REQUEST_MADE|FAILED_VERIFICATION|ENRICHING|ON_HOLD|WAITING|COMPILING|APPROVING|DELAYED|COMPLETED|DOWNLOADABLE|VIEW_CATEGORIES|CANCELED|SECONDARY|SECONDARY_COMPLETED|SECONDARY_APPROVING|REVOKED] [--requestIds value]... [--silentModeBefore value] [--createdAtBefore value] [--createdAtAfter value] [--updatedAtBefore value] [--updatedAtAfter value] [--cancellationTitle value] [--transcendUrl value] [--concurrency value]
|
|
476
480
|
transcend request cancel --help
|
|
477
481
|
|
|
478
482
|
Bulk cancel a set of privacy requests from the DSR Automation -> Incoming Requests tab.
|
|
@@ -485,6 +489,8 @@ FLAGS
|
|
|
485
489
|
[--silentModeBefore] Any requests made before this date should be marked as silent mode for canceling to skip email sending
|
|
486
490
|
[--createdAtBefore] Cancel requests that were submitted before this time
|
|
487
491
|
[--createdAtAfter] Cancel requests that were submitted after this time
|
|
492
|
+
[--updatedAtBefore] Cancel requests that were last updated before this time
|
|
493
|
+
[--updatedAtAfter] Cancel requests that were last updated after this time
|
|
488
494
|
[--cancellationTitle] The title of the email template that should be sent to the requests upon cancelation [default = Request Canceled]
|
|
489
495
|
[--transcendUrl] URL of the Transcend backend. Use https://api.us.transcend.io for US hosting [default = https://api.transcend.io]
|
|
490
496
|
[--concurrency] The concurrency to use when uploading requests in parallel [default = 50]
|
|
@@ -556,7 +562,7 @@ transcend request cancel \
|
|
|
556
562
|
|
|
557
563
|
```txt
|
|
558
564
|
USAGE
|
|
559
|
-
transcend request restart (--auth value) (--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD) (--statuses REQUEST_MADE|FAILED_VERIFICATION|ENRICHING|ON_HOLD|WAITING|COMPILING|APPROVING|DELAYED|COMPLETED|DOWNLOADABLE|VIEW_CATEGORIES|CANCELED|SECONDARY|SECONDARY_COMPLETED|SECONDARY_APPROVING|REVOKED) [--transcendUrl value] [--requestReceiptFolder value] [--sombraAuth value] [--concurrency value] [--requestIds value]... [--emailIsVerified] [--createdAt value] [--silentModeBefore value] [--createdAtBefore value] [--createdAtAfter value] [--sendEmailReceipt] [--copyIdentifiers] [--skipWaitingPeriod]
|
|
565
|
+
transcend request restart (--auth value) (--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD) (--statuses REQUEST_MADE|FAILED_VERIFICATION|ENRICHING|ON_HOLD|WAITING|COMPILING|APPROVING|DELAYED|COMPLETED|DOWNLOADABLE|VIEW_CATEGORIES|CANCELED|SECONDARY|SECONDARY_COMPLETED|SECONDARY_APPROVING|REVOKED) [--transcendUrl value] [--requestReceiptFolder value] [--sombraAuth value] [--concurrency value] [--requestIds value]... [--emailIsVerified] [--createdAt value] [--silentModeBefore value] [--createdAtBefore value] [--createdAtAfter value] [--updatedAtBefore value] [--updatedAtAfter value] [--sendEmailReceipt] [--copyIdentifiers] [--skipWaitingPeriod]
|
|
560
566
|
transcend request restart --help
|
|
561
567
|
|
|
562
568
|
Bulk update a set of privacy requests based on a set of request filters.
|
|
@@ -575,6 +581,8 @@ FLAGS
|
|
|
575
581
|
[--silentModeBefore] Requests older than this date should be marked as silent mode
|
|
576
582
|
[--createdAtBefore] Restart requests that were submitted before this time
|
|
577
583
|
[--createdAtAfter] Restart requests that were submitted after this time
|
|
584
|
+
[--updatedAtBefore] Restart requests that were last updated before this time
|
|
585
|
+
[--updatedAtAfter] Restart requests that were last updated after this time
|
|
578
586
|
[--sendEmailReceipt] Send email receipts to the restarted requests [default = false]
|
|
579
587
|
[--copyIdentifiers] Copy over all enriched identifiers from the initial request [default = false]
|
|
580
588
|
[--skipWaitingPeriod] Skip queued state of request and go straight to compiling [default = false]
|
|
@@ -705,23 +713,25 @@ transcend request restart \
|
|
|
705
713
|
|
|
706
714
|
```txt
|
|
707
715
|
USAGE
|
|
708
|
-
transcend request notify-additional-time (--auth value) (--createdAtBefore value) [--createdAtAfter value] [--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD] [--daysLeft value] [--days value] [--requestIds value]... [--emailTemplate value] [--transcendUrl value] [--concurrency value]
|
|
716
|
+
transcend request notify-additional-time (--auth value) (--createdAtBefore value) [--createdAtAfter value] [--updatedAtBefore value] [--updatedAtAfter value] [--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD] [--daysLeft value] [--days value] [--requestIds value]... [--emailTemplate value] [--transcendUrl value] [--concurrency value]
|
|
709
717
|
transcend request notify-additional-time --help
|
|
710
718
|
|
|
711
719
|
Bulk notify a set of privacy requests from the DSR Automation -> Incoming Requests tab that more time is needed to complete the request. Note any request in silent mode will not be emailed.
|
|
712
720
|
|
|
713
721
|
FLAGS
|
|
714
|
-
--auth
|
|
715
|
-
--createdAtBefore
|
|
716
|
-
[--createdAtAfter]
|
|
717
|
-
[--
|
|
718
|
-
[--
|
|
719
|
-
[--
|
|
720
|
-
[--
|
|
721
|
-
[--
|
|
722
|
-
[--
|
|
723
|
-
[--
|
|
724
|
-
|
|
722
|
+
--auth The Transcend API key. Requires scopes: "View Incoming Requests", "Request Approval and Communication"
|
|
723
|
+
--createdAtBefore Notify requests that are open but submitted before this time
|
|
724
|
+
[--createdAtAfter] Notify requests that are open but submitted after this time
|
|
725
|
+
[--updatedAtBefore] Notify requests that were last updated before this time
|
|
726
|
+
[--updatedAtAfter] Notify requests that were last updated after this time
|
|
727
|
+
[--actions] The request actions to notify [AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD, separator = ,]
|
|
728
|
+
[--daysLeft] Only notify requests that have less than this number of days until they are considered expired [default = 10]
|
|
729
|
+
[--days] The number of days to adjust the expiration of the request to [default = 45]
|
|
730
|
+
[--requestIds]... Specify the specific request IDs to notify [separator = ,]
|
|
731
|
+
[--emailTemplate] The title of the email template that should be sent to the requests [default = Additional Time Needed]
|
|
732
|
+
[--transcendUrl] URL of the Transcend backend. Use https://api.us.transcend.io for US hosting [default = https://api.transcend.io]
|
|
733
|
+
[--concurrency] The concurrency to use when uploading requests in parallel [default = 50]
|
|
734
|
+
-h --help Print help information and exit
|
|
725
735
|
```
|
|
726
736
|
|
|
727
737
|
#### Examples
|
|
@@ -808,7 +818,7 @@ transcend request notify-additional-time \
|
|
|
808
818
|
|
|
809
819
|
```txt
|
|
810
820
|
USAGE
|
|
811
|
-
transcend request mark-silent (--auth value) (--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD) [--statuses REQUEST_MADE|FAILED_VERIFICATION|ENRICHING|ON_HOLD|WAITING|COMPILING|APPROVING|DELAYED|COMPLETED|DOWNLOADABLE|VIEW_CATEGORIES|CANCELED|SECONDARY|SECONDARY_COMPLETED|SECONDARY_APPROVING|REVOKED] [--requestIds value]... [--createdAtBefore value] [--createdAtAfter value] [--transcendUrl value] [--concurrency value]
|
|
821
|
+
transcend request mark-silent (--auth value) (--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD) [--statuses REQUEST_MADE|FAILED_VERIFICATION|ENRICHING|ON_HOLD|WAITING|COMPILING|APPROVING|DELAYED|COMPLETED|DOWNLOADABLE|VIEW_CATEGORIES|CANCELED|SECONDARY|SECONDARY_COMPLETED|SECONDARY_APPROVING|REVOKED] [--requestIds value]... [--createdAtBefore value] [--createdAtAfter value] [--updatedAtBefore value] [--updatedAtAfter value] [--transcendUrl value] [--concurrency value]
|
|
812
822
|
transcend request mark-silent --help
|
|
813
823
|
|
|
814
824
|
Bulk update a set of privacy requests from the DSR Automation -> Incoming Requests tab to be in silent mode.
|
|
@@ -820,6 +830,8 @@ FLAGS
|
|
|
820
830
|
[--requestIds]... Specify the specific request IDs to mark silent [separator = ,]
|
|
821
831
|
[--createdAtBefore] Mark silent requests that were submitted before this time
|
|
822
832
|
[--createdAtAfter] Mark silent requests that were submitted after this time
|
|
833
|
+
[--updatedAtBefore] Mark silent requests that were last updated before this time
|
|
834
|
+
[--updatedAtAfter] Mark silent requests that were last updated after this time
|
|
823
835
|
[--transcendUrl] URL of the Transcend backend. Use https://api.us.transcend.io for US hosting [default = https://api.transcend.io]
|
|
824
836
|
[--concurrency] The concurrency to use when uploading requests in parallel [default = 50]
|
|
825
837
|
-h --help Print help information and exit
|
|
@@ -878,7 +890,7 @@ transcend request mark-silent --auth="$TRANSCEND_API_KEY" --actions=ERASURE --co
|
|
|
878
890
|
|
|
879
891
|
```txt
|
|
880
892
|
USAGE
|
|
881
|
-
transcend request enricher-restart (--auth value) (--enricherId value) [--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD] [--requestEnricherStatuses QUEUED|WAITING|SKIPPED|ERROR|RESOLVED|ACTION_REQUIRED|REMOTE_PROCESSING|WAITING_ON_DEPENDENCIES|POLLING] [--transcendUrl value] [--concurrency value] [--requestIds value]... [--createdAtBefore value] [--createdAtAfter value]
|
|
893
|
+
transcend request enricher-restart (--auth value) (--enricherId value) [--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD] [--requestEnricherStatuses QUEUED|WAITING|SKIPPED|ERROR|RESOLVED|ACTION_REQUIRED|REMOTE_PROCESSING|WAITING_ON_DEPENDENCIES|POLLING] [--transcendUrl value] [--concurrency value] [--requestIds value]... [--createdAtBefore value] [--createdAtAfter value] [--updatedAtBefore value] [--updatedAtAfter value]
|
|
882
894
|
transcend request enricher-restart --help
|
|
883
895
|
|
|
884
896
|
Bulk restart a particular enricher across a series of DSRs.
|
|
@@ -896,6 +908,8 @@ FLAGS
|
|
|
896
908
|
[--requestIds]... Specify the specific request IDs to restart [separator = ,]
|
|
897
909
|
[--createdAtBefore] Restart requests that were submitted before this time
|
|
898
910
|
[--createdAtAfter] Restart requests that were submitted after this time
|
|
911
|
+
[--updatedAtBefore] Restart requests that were last updated before this time
|
|
912
|
+
[--updatedAtAfter] Restart requests that were last updated after this time
|
|
899
913
|
-h --help Print help information and exit
|
|
900
914
|
```
|
|
901
915
|
|
|
@@ -1000,7 +1014,7 @@ transcend request reject-unverified-identifiers \
|
|
|
1000
1014
|
|
|
1001
1015
|
```txt
|
|
1002
1016
|
USAGE
|
|
1003
|
-
transcend request export (--auth value) [--sombraAuth value] [--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD] [--statuses REQUEST_MADE|FAILED_VERIFICATION|ENRICHING|ON_HOLD|WAITING|COMPILING|APPROVING|DELAYED|COMPLETED|DOWNLOADABLE|VIEW_CATEGORIES|CANCELED|SECONDARY|SECONDARY_COMPLETED|SECONDARY_APPROVING|REVOKED] [--transcendUrl value] [--file value] [--concurrency value] [--skipRequestIdentifiers] [--createdAtBefore value] [--createdAtAfter value] [--showTests] [--pageLimit value]
|
|
1017
|
+
transcend request export (--auth value) [--sombraAuth value] [--actions AUTOMATED_DECISION_MAKING_OPT_OUT|USE_OF_SENSITIVE_INFORMATION_OPT_OUT|CONTACT_OPT_OUT|SALE_OPT_OUT|TRACKING_OPT_OUT|CUSTOM_OPT_OUT|AUTOMATED_DECISION_MAKING_OPT_IN|USE_OF_SENSITIVE_INFORMATION_OPT_IN|SALE_OPT_IN|TRACKING_OPT_IN|CONTACT_OPT_IN|CUSTOM_OPT_IN|ACCESS|ERASURE|RECTIFICATION|RESTRICTION|BUSINESS_PURPOSE|PLACE_ON_LEGAL_HOLD|REMOVE_FROM_LEGAL_HOLD] [--statuses REQUEST_MADE|FAILED_VERIFICATION|ENRICHING|ON_HOLD|WAITING|COMPILING|APPROVING|DELAYED|COMPLETED|DOWNLOADABLE|VIEW_CATEGORIES|CANCELED|SECONDARY|SECONDARY_COMPLETED|SECONDARY_APPROVING|REVOKED] [--transcendUrl value] [--file value] [--concurrency value] [--skipRequestIdentifiers] [--createdAtBefore value] [--createdAtAfter value] [--updatedAtBefore value] [--updatedAtAfter value] [--showTests] [--pageLimit value]
|
|
1004
1018
|
transcend request export --help
|
|
1005
1019
|
|
|
1006
1020
|
Export privacy requests and request identifiers to a CSV file.
|
|
@@ -1016,6 +1030,8 @@ FLAGS
|
|
|
1016
1030
|
[--skipRequestIdentifiers/--noSkipRequestIdentifiers] Skip exporting request identifiers
|
|
1017
1031
|
[--createdAtBefore] Pull requests that were submitted before this time
|
|
1018
1032
|
[--createdAtAfter] Pull requests that were submitted after this time
|
|
1033
|
+
[--updatedAtBefore] Pull requests that were last updated before this time
|
|
1034
|
+
[--updatedAtAfter] Pull requests that were last updated after this time
|
|
1019
1035
|
[--showTests/--noShowTests] Filter for test requests or production requests - when not provided, pulls both
|
|
1020
1036
|
[--pageLimit] The page limit to use when pulling in pages of requests [default = 100]
|
|
1021
1037
|
-h --help Print help information and exit
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./constants-
|
|
2
|
-
//# sourceMappingURL=api-keys-
|
|
1
|
+
const e=require(`./chunk-Bmb41Sf3.cjs`),t=require(`./constants-K6pQQtc7.cjs`),n=require(`./syncConfigurationToTranscend-DKliAJhK.cjs`),r=require(`./logger-DQwEYtSS.cjs`),i=require(`./codecs-Bvmb8o9R.cjs`);let a=require(`@transcend-io/type-utils`),o=require(`node:fs`),s=require(`node:path`),c=require(`colors`);c=e.t(c);let l=require(`io-ts`);l=e.t(l);async function u({email:e,password:i,scopes:a,apiKeyTitle:o,parentOrganizationId:s,deleteExistingApiKey:l=!0,createNewApiKey:u=!0,transcendUrl:d=t.a}){let f=await n.ni(d,{});r.t.info(c.default.magenta(`Logging in using email and password.`));let{roles:p,loginCookie:m}=await n.Hn(f,{email:e,password:i});r.t.info(c.default.green(`Successfully logged in and found ${p.length} role${p.length===1?``:`s`}!`));let h=s?p.filter(e=>e.organization.id===s||e.organization.parentOrganizationId===s):p;f.setHeaders({Cookie:m});let g=[],_=[];return r.t.info(c.default.magenta(`Generating API keys with title: ${o}, scopes: ${a.join(`,`)}.`)),await n.Es(h,async t=>{try{await n.Vn(f,{roleId:t.id,email:e}),r.t.info(c.default.magenta(`Checking if API key already exists in organization "${t.organization.name}" with title: "${o}".`));let[i]=await n.ar(f,[o]);if(i&&l)r.t.info(c.default.yellow(`Deleting existing API key in "${t.organization.name}" with title: "${o}".`)),await n.Bn(f,i.id),r.t.info(c.default.green(`Successfully deleted API key in "${t.organization.name}" with title: "${o}".`));else if(i)throw Error(`API key already exists with title: "${o}"`);if(u){r.t.info(c.default.magenta(`Creating API key in "${t.organization.name}" with title: "${o}".`));let{apiKey:e}=await n.zn(f,{title:o,scopes:a});g.push({organizationName:t.organization.name,organizationId:t.organization.id,apiKey:e}),r.t.info(c.default.green(`Successfully created API key in "${t.organization.name}" with title: "${o}".`))}else g.push({organizationName:t.organization.name,organizationId:t.organization.id,apiKey:``})}catch(e){r.t.error(c.default.red(`Failed to create API key in organization "${t.organization.name}"! - ${e.message}`)),_.push({organizationName:t.organization.name,organizationId:t.organization.id,error:e.message})}}),r.t.info(c.default.green(`Successfully created ${g.length} API key${g.length===1?``:`s`}`)),_.length>0&&r.t.error(c.default.red(`Failed to create ${_.length} API key${_.length===1?``:`s`}!`)),{errors:_,apiKeys:g}}function d(e){return e||(r.t.error(c.default.red(`A Transcend API key must be provided. You can specify using --auth=$TRANSCEND_API_KEY`)),process.exit(1)),(0,o.existsSync)(e)?(0,a.decodeCodec)(l.array(i.mt),(0,o.readFileSync)(e,`utf-8`)):e}function f(e,t,n=!1){if(!(0,o.existsSync)(e))return[];let r=(0,o.readdirSync)(e).filter(e=>t?t.filter(t=>e.endsWith(t)).length:!0).filter(e=>e.indexOf(`.`)>0);return n?r.map(e=>e.replace(/\.[^/.]+$/,``)):r}function p(e){return(0,o.readdirSync)(e).filter(t=>(0,o.statSync)((0,s.join)(e,t)).isDirectory())}Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return p}});
|
|
2
|
+
//# sourceMappingURL=api-keys-Bvt2HbSv.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-keys-eh_rPCV_.cjs","names":["DEFAULT_TRANSCEND_API","buildTranscendGraphQLClientGeneric","loginUser","mapSeries","assumeRole","fetchAllApiKeys","deleteApiKey","createApiKey","t","StoredApiKey"],"sources":["../src/lib/api-keys/generateCrossAccountApiKeys.ts","../src/lib/api-keys/validateTranscendAuth.ts","../src/lib/api-keys/listFiles.ts","../src/lib/api-keys/listDirectories.ts"],"sourcesContent":["import { mapSeries } from '../bluebird';\nimport {\n buildTranscendGraphQLClientGeneric,\n loginUser,\n createApiKey,\n fetchAllApiKeys,\n deleteApiKey,\n assumeRole,\n} from '../graphql';\nimport { ScopeName } from '@transcend-io/privacy-types';\nimport colors from 'colors';\nimport { StoredApiKey } from '../../codecs';\nimport { logger } from '../../logger';\nimport { DEFAULT_TRANSCEND_API } from '../../constants';\n\nexport interface ApiKeyGenerateError {\n /** Name of instance */\n organizationName: string;\n /** Error */\n error: string;\n /** Organization ID API key is for */\n organizationId: string;\n}\n\n/**\n * Generate API keys across multiple transcend accounts\n *\n * @param options - Options\n * @returns Number of API keys created\n */\nexport async function generateCrossAccountApiKeys({\n email,\n password,\n scopes,\n apiKeyTitle,\n parentOrganizationId,\n deleteExistingApiKey = true,\n createNewApiKey = true,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** Email address of user generating API keys */\n email: string;\n /** Password of user generating API keys */\n password: string;\n /** Filter for organizations that match this parent organization ID */\n parentOrganizationId?: string;\n /** Title of the API create to create */\n apiKeyTitle: string;\n /** Title of the API create to create */\n scopes: ScopeName[];\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** When true delete existing API keys with that title, if set to false an API key exists with that title, an error is thrown */\n deleteExistingApiKey?: boolean;\n /** When true, generate new API keys, otherwise only will delete past API keys */\n createNewApiKey?: boolean;\n}): Promise<{\n /** Successfully generated */\n apiKeys: StoredApiKey[];\n /** Error results */\n errors: ApiKeyGenerateError[];\n}> {\n // Create GraphQL client\n const client = await buildTranscendGraphQLClientGeneric(transcendUrl, {});\n\n // Login the user\n logger.info(colors.magenta('Logging in using email and password.'));\n const { roles, loginCookie } = await loginUser(client, { email, password });\n logger.info(\n colors.green(\n `Successfully logged in and found ${roles.length} role${\n roles.length === 1 ? '' : 's'\n }!`,\n ),\n );\n\n // Filter down by parentOrganizationId\n const filteredRoles = parentOrganizationId\n ? roles.filter(\n (role) =>\n role.organization.id === parentOrganizationId ||\n role.organization.parentOrganizationId === parentOrganizationId,\n )\n : roles;\n\n // Save cookie to call route subsequent times\n client.setHeaders({\n Cookie: loginCookie,\n });\n\n // Save the resulting API keys\n const results: StoredApiKey[] = [];\n const errors: ApiKeyGenerateError[] = [];\n\n // Generate API keys\n logger.info(\n colors.magenta(\n `Generating API keys with title: ${apiKeyTitle}, scopes: ${scopes.join(\n ',',\n )}.`,\n ),\n );\n\n // Map over each role\n await mapSeries(filteredRoles, async (role) => {\n try {\n // Log into the other instance\n await assumeRole(client, { roleId: role.id, email });\n\n // Grab API keys with that title\n logger.info(\n colors.magenta(\n `Checking if API key already exists in organization \"${role.organization.name}\" with title: \"${apiKeyTitle}\".`,\n ),\n );\n\n // Delete existing API key\n const [apiKeyWithTitle] = await fetchAllApiKeys(client, [apiKeyTitle]);\n if (apiKeyWithTitle && deleteExistingApiKey) {\n logger.info(\n colors.yellow(\n `Deleting existing API key in \"${role.organization.name}\" with title: \"${apiKeyTitle}\".`,\n ),\n );\n await deleteApiKey(client, apiKeyWithTitle.id);\n logger.info(\n colors.green(\n `Successfully deleted API key in \"${role.organization.name}\" with title: \"${apiKeyTitle}\".`,\n ),\n );\n } else if (apiKeyWithTitle) {\n // throw error if one exists but not configured to delete\n throw new Error(`API key already exists with title: \"${apiKeyTitle}\"`);\n }\n\n // Create the API key\n if (createNewApiKey) {\n logger.info(\n colors.magenta(\n `Creating API key in \"${role.organization.name}\" with title: \"${apiKeyTitle}\".`,\n ),\n );\n const { apiKey } = await createApiKey(client, {\n title: apiKeyTitle,\n scopes,\n });\n results.push({\n organizationName: role.organization.name,\n organizationId: role.organization.id,\n apiKey,\n });\n logger.info(\n colors.green(\n `Successfully created API key in \"${role.organization.name}\" with title: \"${apiKeyTitle}\".`,\n ),\n );\n } else {\n // Delete only\n results.push({\n organizationName: role.organization.name,\n organizationId: role.organization.id,\n apiKey: '',\n });\n }\n } catch (err) {\n logger.error(\n colors.red(\n `Failed to create API key in organization \"${role.organization.name}\"! - ${err.message}`,\n ),\n );\n errors.push({\n organizationName: role.organization.name,\n organizationId: role.organization.id,\n error: err.message,\n });\n }\n });\n logger.info(\n colors.green(\n `Successfully created ${results.length} API key${\n results.length === 1 ? '' : 's'\n }`,\n ),\n );\n\n if (errors.length > 0) {\n logger.error(\n colors.red(\n `Failed to create ${errors.length} API key${\n errors.length === 1 ? '' : 's'\n }!`,\n ),\n );\n }\n\n return { errors, apiKeys: results };\n}\n","import { decodeCodec } from '@transcend-io/type-utils';\nimport colors from 'colors';\nimport * as t from 'io-ts';\nimport { logger } from '../../logger';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { StoredApiKey } from '../../codecs';\n\n/**\n * Determine if the `--auth` parameter is an API key or a path to a JSON\n * file containing a list of API keys.\n *\n * @param auth - Raw auth parameter\n * @returns The API key or the list API keys\n */\nexport function validateTranscendAuth(auth: string): string | StoredApiKey[] {\n // Ensure auth is passed\n if (!auth) {\n logger.error(\n colors.red(\n 'A Transcend API key must be provided. You can specify using --auth=$TRANSCEND_API_KEY',\n ),\n );\n process.exit(1);\n }\n\n // Read from disk\n if (existsSync(auth)) {\n // validate that file is a list of API keys\n return decodeCodec(t.array(StoredApiKey), readFileSync(auth, 'utf-8'));\n }\n\n // Return as single API key\n return auth;\n}\n","import { existsSync, readdirSync } from 'node:fs';\n\n/**\n * List the files in a directory\n *\n * ```typescript\n * // The directory to search\n * const directory = '/User/test/transcend/my-app/app/containers';\n * // Returns ['test.js']\n * listFiles(directory);\n * ```\n *\n * @param directory - The directory to search\n * @param validExtensions - The list of valid extensions\n * @param removeExtensions - When true, remove the extensions from the listed files\n * @returns The list of files in the directory\n */\nexport function listFiles(\n directory: string,\n validExtensions?: string[],\n removeExtensions = false,\n): string[] {\n if (!existsSync(directory)) {\n return [];\n }\n\n const files = readdirSync(directory)\n .filter((fil) =>\n validExtensions\n ? validExtensions.filter((ext) => fil.endsWith(ext)).length\n : true,\n )\n .filter((fil) => fil.indexOf('.') > 0);\n\n return removeExtensions\n ? files.map((fil) => fil.replace(/\\.[^/.]+$/, ''))\n : files;\n}\n","import { readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * List the folders in a directory\n *\n * @param startDir - The base directory to list from\n * @returns The list of folders in that directory\n */\nexport function listDirectories(startDir: string): string[] {\n return readdirSync(startDir).filter((entryName) =>\n statSync(join(startDir, entryName)).isDirectory(),\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api-keys-Bvt2HbSv.cjs","names":["DEFAULT_TRANSCEND_API","buildTranscendGraphQLClientGeneric","loginUser","mapSeries","assumeRole","fetchAllApiKeys","deleteApiKey","createApiKey","t","StoredApiKey"],"sources":["../src/lib/api-keys/generateCrossAccountApiKeys.ts","../src/lib/api-keys/validateTranscendAuth.ts","../src/lib/api-keys/listFiles.ts","../src/lib/api-keys/listDirectories.ts"],"sourcesContent":["import { mapSeries } from '../bluebird';\nimport {\n buildTranscendGraphQLClientGeneric,\n loginUser,\n createApiKey,\n fetchAllApiKeys,\n deleteApiKey,\n assumeRole,\n} from '../graphql';\nimport { ScopeName } from '@transcend-io/privacy-types';\nimport colors from 'colors';\nimport { StoredApiKey } from '../../codecs';\nimport { logger } from '../../logger';\nimport { DEFAULT_TRANSCEND_API } from '../../constants';\n\nexport interface ApiKeyGenerateError {\n /** Name of instance */\n organizationName: string;\n /** Error */\n error: string;\n /** Organization ID API key is for */\n organizationId: string;\n}\n\n/**\n * Generate API keys across multiple transcend accounts\n *\n * @param options - Options\n * @returns Number of API keys created\n */\nexport async function generateCrossAccountApiKeys({\n email,\n password,\n scopes,\n apiKeyTitle,\n parentOrganizationId,\n deleteExistingApiKey = true,\n createNewApiKey = true,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** Email address of user generating API keys */\n email: string;\n /** Password of user generating API keys */\n password: string;\n /** Filter for organizations that match this parent organization ID */\n parentOrganizationId?: string;\n /** Title of the API create to create */\n apiKeyTitle: string;\n /** Title of the API create to create */\n scopes: ScopeName[];\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** When true delete existing API keys with that title, if set to false an API key exists with that title, an error is thrown */\n deleteExistingApiKey?: boolean;\n /** When true, generate new API keys, otherwise only will delete past API keys */\n createNewApiKey?: boolean;\n}): Promise<{\n /** Successfully generated */\n apiKeys: StoredApiKey[];\n /** Error results */\n errors: ApiKeyGenerateError[];\n}> {\n // Create GraphQL client\n const client = await buildTranscendGraphQLClientGeneric(transcendUrl, {});\n\n // Login the user\n logger.info(colors.magenta('Logging in using email and password.'));\n const { roles, loginCookie } = await loginUser(client, { email, password });\n logger.info(\n colors.green(\n `Successfully logged in and found ${roles.length} role${\n roles.length === 1 ? '' : 's'\n }!`,\n ),\n );\n\n // Filter down by parentOrganizationId\n const filteredRoles = parentOrganizationId\n ? roles.filter(\n (role) =>\n role.organization.id === parentOrganizationId ||\n role.organization.parentOrganizationId === parentOrganizationId,\n )\n : roles;\n\n // Save cookie to call route subsequent times\n client.setHeaders({\n Cookie: loginCookie,\n });\n\n // Save the resulting API keys\n const results: StoredApiKey[] = [];\n const errors: ApiKeyGenerateError[] = [];\n\n // Generate API keys\n logger.info(\n colors.magenta(\n `Generating API keys with title: ${apiKeyTitle}, scopes: ${scopes.join(\n ',',\n )}.`,\n ),\n );\n\n // Map over each role\n await mapSeries(filteredRoles, async (role) => {\n try {\n // Log into the other instance\n await assumeRole(client, { roleId: role.id, email });\n\n // Grab API keys with that title\n logger.info(\n colors.magenta(\n `Checking if API key already exists in organization \"${role.organization.name}\" with title: \"${apiKeyTitle}\".`,\n ),\n );\n\n // Delete existing API key\n const [apiKeyWithTitle] = await fetchAllApiKeys(client, [apiKeyTitle]);\n if (apiKeyWithTitle && deleteExistingApiKey) {\n logger.info(\n colors.yellow(\n `Deleting existing API key in \"${role.organization.name}\" with title: \"${apiKeyTitle}\".`,\n ),\n );\n await deleteApiKey(client, apiKeyWithTitle.id);\n logger.info(\n colors.green(\n `Successfully deleted API key in \"${role.organization.name}\" with title: \"${apiKeyTitle}\".`,\n ),\n );\n } else if (apiKeyWithTitle) {\n // throw error if one exists but not configured to delete\n throw new Error(`API key already exists with title: \"${apiKeyTitle}\"`);\n }\n\n // Create the API key\n if (createNewApiKey) {\n logger.info(\n colors.magenta(\n `Creating API key in \"${role.organization.name}\" with title: \"${apiKeyTitle}\".`,\n ),\n );\n const { apiKey } = await createApiKey(client, {\n title: apiKeyTitle,\n scopes,\n });\n results.push({\n organizationName: role.organization.name,\n organizationId: role.organization.id,\n apiKey,\n });\n logger.info(\n colors.green(\n `Successfully created API key in \"${role.organization.name}\" with title: \"${apiKeyTitle}\".`,\n ),\n );\n } else {\n // Delete only\n results.push({\n organizationName: role.organization.name,\n organizationId: role.organization.id,\n apiKey: '',\n });\n }\n } catch (err) {\n logger.error(\n colors.red(\n `Failed to create API key in organization \"${role.organization.name}\"! - ${err.message}`,\n ),\n );\n errors.push({\n organizationName: role.organization.name,\n organizationId: role.organization.id,\n error: err.message,\n });\n }\n });\n logger.info(\n colors.green(\n `Successfully created ${results.length} API key${\n results.length === 1 ? '' : 's'\n }`,\n ),\n );\n\n if (errors.length > 0) {\n logger.error(\n colors.red(\n `Failed to create ${errors.length} API key${\n errors.length === 1 ? '' : 's'\n }!`,\n ),\n );\n }\n\n return { errors, apiKeys: results };\n}\n","import { decodeCodec } from '@transcend-io/type-utils';\nimport colors from 'colors';\nimport * as t from 'io-ts';\nimport { logger } from '../../logger';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { StoredApiKey } from '../../codecs';\n\n/**\n * Determine if the `--auth` parameter is an API key or a path to a JSON\n * file containing a list of API keys.\n *\n * @param auth - Raw auth parameter\n * @returns The API key or the list API keys\n */\nexport function validateTranscendAuth(auth: string): string | StoredApiKey[] {\n // Ensure auth is passed\n if (!auth) {\n logger.error(\n colors.red(\n 'A Transcend API key must be provided. You can specify using --auth=$TRANSCEND_API_KEY',\n ),\n );\n process.exit(1);\n }\n\n // Read from disk\n if (existsSync(auth)) {\n // validate that file is a list of API keys\n return decodeCodec(t.array(StoredApiKey), readFileSync(auth, 'utf-8'));\n }\n\n // Return as single API key\n return auth;\n}\n","import { existsSync, readdirSync } from 'node:fs';\n\n/**\n * List the files in a directory\n *\n * ```typescript\n * // The directory to search\n * const directory = '/User/test/transcend/my-app/app/containers';\n * // Returns ['test.js']\n * listFiles(directory);\n * ```\n *\n * @param directory - The directory to search\n * @param validExtensions - The list of valid extensions\n * @param removeExtensions - When true, remove the extensions from the listed files\n * @returns The list of files in the directory\n */\nexport function listFiles(\n directory: string,\n validExtensions?: string[],\n removeExtensions = false,\n): string[] {\n if (!existsSync(directory)) {\n return [];\n }\n\n const files = readdirSync(directory)\n .filter((fil) =>\n validExtensions\n ? validExtensions.filter((ext) => fil.endsWith(ext)).length\n : true,\n )\n .filter((fil) => fil.indexOf('.') > 0);\n\n return removeExtensions\n ? files.map((fil) => fil.replace(/\\.[^/.]+$/, ''))\n : files;\n}\n","import { readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * List the folders in a directory\n *\n * @param startDir - The base directory to list from\n * @returns The list of folders in that directory\n */\nexport function listDirectories(startDir: string): string[] {\n return readdirSync(startDir).filter((entryName) =>\n statSync(join(startDir, entryName)).isDirectory(),\n );\n}\n"],"mappings":"gWA8BA,eAAsB,EAA4B,CAChD,QACA,WACA,SACA,cACA,uBACA,uBAAuB,GACvB,kBAAkB,GAClB,eAAeA,EAAAA,GAuBd,CAED,IAAM,EAAS,MAAMC,EAAAA,GAAmC,EAAc,EAAE,CAAC,CAGzE,EAAA,EAAO,KAAK,EAAA,QAAO,QAAQ,uCAAuC,CAAC,CACnE,GAAM,CAAE,QAAO,eAAgB,MAAMC,EAAAA,GAAU,EAAQ,CAAE,QAAO,WAAU,CAAC,CAC3E,EAAA,EAAO,KACL,EAAA,QAAO,MACL,oCAAoC,EAAM,OAAO,OAC/C,EAAM,SAAW,EAAI,GAAK,IAC3B,GACF,CACF,CAGD,IAAM,EAAgB,EAClB,EAAM,OACH,GACC,EAAK,aAAa,KAAO,GACzB,EAAK,aAAa,uBAAyB,EAC9C,CACD,EAGJ,EAAO,WAAW,CAChB,OAAQ,EACT,CAAC,CAGF,IAAM,EAA0B,EAAE,CAC5B,EAAgC,EAAE,CAuGxC,OApGA,EAAA,EAAO,KACL,EAAA,QAAO,QACL,mCAAmC,EAAY,YAAY,EAAO,KAChE,IACD,CAAC,GACH,CACF,CAGD,MAAMC,EAAAA,GAAU,EAAe,KAAO,IAAS,CAC7C,GAAI,CAEF,MAAMC,EAAAA,GAAW,EAAQ,CAAE,OAAQ,EAAK,GAAI,QAAO,CAAC,CAGpD,EAAA,EAAO,KACL,EAAA,QAAO,QACL,uDAAuD,EAAK,aAAa,KAAK,iBAAiB,EAAY,IAC5G,CACF,CAGD,GAAM,CAAC,GAAmB,MAAMC,EAAAA,GAAgB,EAAQ,CAAC,EAAY,CAAC,CACtE,GAAI,GAAmB,EACrB,EAAA,EAAO,KACL,EAAA,QAAO,OACL,iCAAiC,EAAK,aAAa,KAAK,iBAAiB,EAAY,IACtF,CACF,CACD,MAAMC,EAAAA,GAAa,EAAQ,EAAgB,GAAG,CAC9C,EAAA,EAAO,KACL,EAAA,QAAO,MACL,oCAAoC,EAAK,aAAa,KAAK,iBAAiB,EAAY,IACzF,CACF,SACQ,EAET,MAAU,MAAM,uCAAuC,EAAY,GAAG,CAIxE,GAAI,EAAiB,CACnB,EAAA,EAAO,KACL,EAAA,QAAO,QACL,wBAAwB,EAAK,aAAa,KAAK,iBAAiB,EAAY,IAC7E,CACF,CACD,GAAM,CAAE,UAAW,MAAMC,EAAAA,GAAa,EAAQ,CAC5C,MAAO,EACP,SACD,CAAC,CACF,EAAQ,KAAK,CACX,iBAAkB,EAAK,aAAa,KACpC,eAAgB,EAAK,aAAa,GAClC,SACD,CAAC,CACF,EAAA,EAAO,KACL,EAAA,QAAO,MACL,oCAAoC,EAAK,aAAa,KAAK,iBAAiB,EAAY,IACzF,CACF,MAGD,EAAQ,KAAK,CACX,iBAAkB,EAAK,aAAa,KACpC,eAAgB,EAAK,aAAa,GAClC,OAAQ,GACT,CAAC,OAEG,EAAK,CACZ,EAAA,EAAO,MACL,EAAA,QAAO,IACL,6CAA6C,EAAK,aAAa,KAAK,OAAO,EAAI,UAChF,CACF,CACD,EAAO,KAAK,CACV,iBAAkB,EAAK,aAAa,KACpC,eAAgB,EAAK,aAAa,GAClC,MAAO,EAAI,QACZ,CAAC,GAEJ,CACF,EAAA,EAAO,KACL,EAAA,QAAO,MACL,wBAAwB,EAAQ,OAAO,UACrC,EAAQ,SAAW,EAAI,GAAK,MAE/B,CACF,CAEG,EAAO,OAAS,GAClB,EAAA,EAAO,MACL,EAAA,QAAO,IACL,oBAAoB,EAAO,OAAO,UAChC,EAAO,SAAW,EAAI,GAAK,IAC5B,GACF,CACF,CAGI,CAAE,SAAQ,QAAS,EAAS,CCrLrC,SAAgB,EAAsB,EAAuC,CAkB3E,OAhBK,IACH,EAAA,EAAO,MACL,EAAA,QAAO,IACL,wFACD,CACF,CACD,QAAQ,KAAK,EAAE,GAIjB,EAAA,EAAA,YAAe,EAAK,EAElB,EAAA,EAAA,aAAmBC,EAAE,MAAMC,EAAAA,GAAa,EAAA,EAAA,EAAA,cAAe,EAAM,QAAQ,CAAC,CAIjE,ECfT,SAAgB,EACd,EACA,EACA,EAAmB,GACT,CACV,GAAI,EAAA,EAAA,EAAA,YAAY,EAAU,CACxB,MAAO,EAAE,CAGX,IAAM,GAAA,EAAA,EAAA,aAAoB,EAAU,CACjC,OAAQ,GACP,EACI,EAAgB,OAAQ,GAAQ,EAAI,SAAS,EAAI,CAAC,CAAC,OACnD,GACL,CACA,OAAQ,GAAQ,EAAI,QAAQ,IAAI,CAAG,EAAE,CAExC,OAAO,EACH,EAAM,IAAK,GAAQ,EAAI,QAAQ,YAAa,GAAG,CAAC,CAChD,EC3BN,SAAgB,EAAgB,EAA4B,CAC1D,OAAA,EAAA,EAAA,aAAmB,EAAS,CAAC,OAAQ,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,MACrB,EAAU,EAAU,CAAC,CAAC,aAAa,CAClD"}
|