@transcend-io/cli 10.20.0 → 10.21.0
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 +2 -0
- package/dist/{app-CwIs_xeP.mjs → app-D29TqW_A.mjs} +17 -17
- package/dist/{app-CwIs_xeP.mjs.map → app-D29TqW_A.mjs.map} +1 -1
- package/dist/{approvePrivacyRequests-BsNtrVwv.mjs → approvePrivacyRequests-BjjUp-hw.mjs} +2 -2
- package/dist/{approvePrivacyRequests-BsNtrVwv.mjs.map → approvePrivacyRequests-BjjUp-hw.mjs.map} +1 -1
- package/dist/bin/bash-complete.mjs +1 -1
- package/dist/bin/cli.mjs +1 -1
- package/dist/bin/deprecated-command.mjs +1 -1
- package/dist/{buildExamples-FGTunLac.mjs → buildExamples-2xaj8FoK.mjs} +2 -2
- package/dist/{buildExamples-FGTunLac.mjs.map → buildExamples-2xaj8FoK.mjs.map} +1 -1
- package/dist/{buildXdiSyncEndpoint-DPo9Sw3F.mjs → buildXdiSyncEndpoint-ozQ3T4Hj.mjs} +2 -2
- package/dist/{buildXdiSyncEndpoint-DPo9Sw3F.mjs.map → buildXdiSyncEndpoint-ozQ3T4Hj.mjs.map} +1 -1
- package/dist/{bulkRestartRequests-iE9g9WBz.mjs → bulkRestartRequests-c29oH5GC.mjs} +2 -2
- package/dist/{bulkRestartRequests-iE9g9WBz.mjs.map → bulkRestartRequests-c29oH5GC.mjs.map} +1 -1
- package/dist/{bulkRetryEnrichers-DDA5OvCM.mjs → bulkRetryEnrichers-i3oFHWx-.mjs} +2 -2
- package/dist/{bulkRetryEnrichers-DDA5OvCM.mjs.map → bulkRetryEnrichers-i3oFHWx-.mjs.map} +1 -1
- package/dist/{cancelPrivacyRequests-SWJzauUB.mjs → cancelPrivacyRequests-B4IzmRWC.mjs} +2 -2
- package/dist/{cancelPrivacyRequests-SWJzauUB.mjs.map → cancelPrivacyRequests-B4IzmRWC.mjs.map} +1 -1
- package/dist/codecs-CbOFsh1R.mjs +2 -0
- package/dist/codecs-CbOFsh1R.mjs.map +1 -0
- package/dist/{command-Cr4p5WG-.mjs → command-DOo9vOei.mjs} +2 -2
- package/dist/{command-Cr4p5WG-.mjs.map → command-DOo9vOei.mjs.map} +1 -1
- package/dist/{constants-Cb9QI4yq.mjs → constants-BesTSxZW.mjs} +2 -2
- package/dist/{constants-Cb9QI4yq.mjs.map → constants-BesTSxZW.mjs.map} +1 -1
- package/dist/{createExtraKeyHandler-BfTP-FYM.mjs → createExtraKeyHandler-JtWqC00U.mjs} +2 -2
- package/dist/{createExtraKeyHandler-BfTP-FYM.mjs.map → createExtraKeyHandler-JtWqC00U.mjs.map} +1 -1
- package/dist/{downloadPrivacyRequestFiles-V9ITIuDi.mjs → downloadPrivacyRequestFiles-CIxwRWnH.mjs} +2 -2
- package/dist/{downloadPrivacyRequestFiles-V9ITIuDi.mjs.map → downloadPrivacyRequestFiles-CIxwRWnH.mjs.map} +1 -1
- package/dist/{generateCrossAccountApiKeys-BjbmV5iK.mjs → generateCrossAccountApiKeys-qw686-vX.mjs} +2 -2
- package/dist/{generateCrossAccountApiKeys-BjbmV5iK.mjs.map → generateCrossAccountApiKeys-qw686-vX.mjs.map} +1 -1
- package/dist/{impl-DXmqDQqu2.mjs → impl-2wy1Bi1C2.mjs} +2 -2
- package/dist/{impl-DXmqDQqu2.mjs.map → impl-2wy1Bi1C2.mjs.map} +1 -1
- package/dist/{impl-459Az7fC2.mjs → impl-B4MaLZAd2.mjs} +2 -2
- package/dist/{impl-459Az7fC2.mjs.map → impl-B4MaLZAd2.mjs.map} +1 -1
- package/dist/{impl-CvNWIETy.mjs → impl-BDPtNJLp.mjs} +2 -2
- package/dist/{impl-CvNWIETy.mjs.map → impl-BDPtNJLp.mjs.map} +1 -1
- package/dist/{impl-BTP9SQTC.mjs → impl-BHibMDBv.mjs} +2 -2
- package/dist/{impl-BTP9SQTC.mjs.map → impl-BHibMDBv.mjs.map} +1 -1
- package/dist/{impl-BZMvZ-H5.mjs → impl-BV9t4j6E.mjs} +2 -2
- package/dist/{impl-BZMvZ-H5.mjs.map → impl-BV9t4j6E.mjs.map} +1 -1
- package/dist/{impl-tCrd3m6C.mjs → impl-BaDKnY6X.mjs} +2 -2
- package/dist/{impl-tCrd3m6C.mjs.map → impl-BaDKnY6X.mjs.map} +1 -1
- package/dist/{impl-DI1UENx5.mjs → impl-BcHxVhtN.mjs} +2 -2
- package/dist/{impl-DI1UENx5.mjs.map → impl-BcHxVhtN.mjs.map} +1 -1
- package/dist/{impl-qexLI_cv.mjs → impl-Bhd63d2E.mjs} +2 -2
- package/dist/{impl-qexLI_cv.mjs.map → impl-Bhd63d2E.mjs.map} +1 -1
- package/dist/{impl-DWRMbSmy.mjs → impl-C5jWisyQ.mjs} +2 -2
- package/dist/{impl-DWRMbSmy.mjs.map → impl-C5jWisyQ.mjs.map} +1 -1
- package/dist/{impl-CNKuWYpL2.mjs → impl-C6wTDCex2.mjs} +2 -2
- package/dist/{impl-CNKuWYpL2.mjs.map → impl-C6wTDCex2.mjs.map} +1 -1
- package/dist/{impl-BAAcCu2K.mjs → impl-CK9A4BvD.mjs} +2 -2
- package/dist/{impl-BAAcCu2K.mjs.map → impl-CK9A4BvD.mjs.map} +1 -1
- package/dist/{impl-4k456kRN.mjs → impl-CSMzpKv5.mjs} +2 -2
- package/dist/{impl-4k456kRN.mjs.map → impl-CSMzpKv5.mjs.map} +1 -1
- package/dist/{impl-7Nr7gpgv2.mjs → impl-CW6TFAzt2.mjs} +2 -2
- package/dist/{impl-7Nr7gpgv2.mjs.map → impl-CW6TFAzt2.mjs.map} +1 -1
- package/dist/{impl-BCPzfDOr.mjs → impl-CWd25f8p.mjs} +2 -2
- package/dist/{impl-BCPzfDOr.mjs.map → impl-CWd25f8p.mjs.map} +1 -1
- package/dist/{impl-CgIZUWGW.mjs → impl-CZfS7Ydy.mjs} +2 -2
- package/dist/{impl-CgIZUWGW.mjs.map → impl-CZfS7Ydy.mjs.map} +1 -1
- package/dist/{impl-DpkSquYY.mjs → impl-ChV4laNE.mjs} +2 -2
- package/dist/{impl-DpkSquYY.mjs.map → impl-ChV4laNE.mjs.map} +1 -1
- package/dist/{impl-C9ycytEX.mjs → impl-CiDSQd1n.mjs} +2 -2
- package/dist/{impl-C9ycytEX.mjs.map → impl-CiDSQd1n.mjs.map} +1 -1
- package/dist/{impl-CS4W0xxJ2.mjs → impl-CrVGqakz2.mjs} +2 -2
- package/dist/{impl-CS4W0xxJ2.mjs.map → impl-CrVGqakz2.mjs.map} +1 -1
- package/dist/{impl-nkCz_WoZ.mjs → impl-CrpWDfKW.mjs} +2 -2
- package/dist/{impl-nkCz_WoZ.mjs.map → impl-CrpWDfKW.mjs.map} +1 -1
- package/dist/{impl-CfRJByur.mjs → impl-CwOPj70B.mjs} +2 -2
- package/dist/{impl-CfRJByur.mjs.map → impl-CwOPj70B.mjs.map} +1 -1
- package/dist/{impl-lMY6fT6G.mjs → impl-D2KU3B7g.mjs} +2 -2
- package/dist/{impl-lMY6fT6G.mjs.map → impl-D2KU3B7g.mjs.map} +1 -1
- package/dist/{impl-k-AQAHRI2.mjs → impl-D2LX8clq2.mjs} +2 -2
- package/dist/{impl-k-AQAHRI2.mjs.map → impl-D2LX8clq2.mjs.map} +1 -1
- package/dist/{impl-DzR3gsYc.mjs → impl-DBV_D1ii.mjs} +2 -2
- package/dist/{impl-DzR3gsYc.mjs.map → impl-DBV_D1ii.mjs.map} +1 -1
- package/dist/{impl-j0JKrcEn.mjs → impl-DE9OHpyc.mjs} +2 -2
- package/dist/{impl-j0JKrcEn.mjs.map → impl-DE9OHpyc.mjs.map} +1 -1
- package/dist/{impl-umKPtZJS2.mjs → impl-DF374hZ52.mjs} +2 -2
- package/dist/{impl-umKPtZJS2.mjs.map → impl-DF374hZ52.mjs.map} +1 -1
- package/dist/{impl-Bjdv9HmT2.mjs → impl-DFZBjY6J2.mjs} +2 -2
- package/dist/{impl-Bjdv9HmT2.mjs.map → impl-DFZBjY6J2.mjs.map} +1 -1
- package/dist/{impl-BHZVyoUU.mjs → impl-DH049g3W.mjs} +2 -2
- package/dist/{impl-BHZVyoUU.mjs.map → impl-DH049g3W.mjs.map} +1 -1
- package/dist/{impl-BaJGA--D.mjs → impl-DI5BZJRL.mjs} +2 -2
- package/dist/{impl-BaJGA--D.mjs.map → impl-DI5BZJRL.mjs.map} +1 -1
- package/dist/{impl-BtYepbPW.mjs → impl-DMQEmlVb.mjs} +2 -2
- package/dist/{impl-BtYepbPW.mjs.map → impl-DMQEmlVb.mjs.map} +1 -1
- package/dist/{impl-B7_rAfK4.mjs → impl-DNwwq1Nh.mjs} +2 -2
- package/dist/{impl-B7_rAfK4.mjs.map → impl-DNwwq1Nh.mjs.map} +1 -1
- package/dist/{impl-DJAJ3NgX2.mjs → impl-DUI3qGsC2.mjs} +2 -2
- package/dist/{impl-DJAJ3NgX2.mjs.map → impl-DUI3qGsC2.mjs.map} +1 -1
- package/dist/{impl-7dSd5RHY2.mjs → impl-DWvfhn-62.mjs} +2 -2
- package/dist/{impl-7dSd5RHY2.mjs.map → impl-DWvfhn-62.mjs.map} +1 -1
- package/dist/{impl-CS5GsbS4.mjs → impl-Dl7w91bL.mjs} +2 -2
- package/dist/{impl-CS5GsbS4.mjs.map → impl-Dl7w91bL.mjs.map} +1 -1
- package/dist/{impl-BY4R2tG1.mjs → impl-JxprJNni.mjs} +2 -2
- package/dist/{impl-BY4R2tG1.mjs.map → impl-JxprJNni.mjs.map} +1 -1
- package/dist/{impl-vg65GYUd.mjs → impl-hY30kWpN.mjs} +2 -2
- package/dist/{impl-vg65GYUd.mjs.map → impl-hY30kWpN.mjs.map} +1 -1
- package/dist/{impl-Cs9AHT0v.mjs → impl-u1q93_tK.mjs} +2 -2
- package/dist/{impl-Cs9AHT0v.mjs.map → impl-u1q93_tK.mjs.map} +1 -1
- package/dist/{impl-q_vV3NSd.mjs → impl-v1WWFSFZ.mjs} +2 -2
- package/dist/{impl-q_vV3NSd.mjs.map → impl-v1WWFSFZ.mjs.map} +1 -1
- package/dist/{impl-CP2Musou.mjs → impl-zECFyZrU.mjs} +2 -2
- package/dist/{impl-CP2Musou.mjs.map → impl-zECFyZrU.mjs.map} +1 -1
- package/dist/index.d.mts +86 -8
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{markRequestDataSiloIdsCompleted-aUZLQ4vH.mjs → markRequestDataSiloIdsCompleted-C7R1YENn.mjs} +2 -2
- package/dist/{markRequestDataSiloIdsCompleted-aUZLQ4vH.mjs.map → markRequestDataSiloIdsCompleted-C7R1YENn.mjs.map} +1 -1
- package/dist/{markSilentPrivacyRequests-DSymICv1.mjs → markSilentPrivacyRequests-D9swsyuo.mjs} +2 -2
- package/dist/{markSilentPrivacyRequests-DSymICv1.mjs.map → markSilentPrivacyRequests-D9swsyuo.mjs.map} +1 -1
- package/dist/{notifyPrivacyRequestsAdditionalTime-C9YqK6WF.mjs → notifyPrivacyRequestsAdditionalTime-CpDSAOaZ.mjs} +2 -2
- package/dist/{notifyPrivacyRequestsAdditionalTime-C9YqK6WF.mjs.map → notifyPrivacyRequestsAdditionalTime-CpDSAOaZ.mjs.map} +1 -1
- package/dist/{parseVariablesFromString-C2SbrKX5.mjs → parseVariablesFromString-CHcigVIK.mjs} +3 -3
- package/dist/parseVariablesFromString-CHcigVIK.mjs.map +1 -0
- package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-Ckh-dpAa.mjs → pullChunkedCustomSiloOutstandingIdentifiers-nJdP5Lhb.mjs} +2 -2
- package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-Ckh-dpAa.mjs.map → pullChunkedCustomSiloOutstandingIdentifiers-nJdP5Lhb.mjs.map} +1 -1
- package/dist/{pullManualEnrichmentIdentifiersToCsv-gzP-wpef.mjs → pullManualEnrichmentIdentifiersToCsv-CvS65fmI.mjs} +2 -2
- package/dist/{pullManualEnrichmentIdentifiersToCsv-gzP-wpef.mjs.map → pullManualEnrichmentIdentifiersToCsv-CvS65fmI.mjs.map} +1 -1
- package/dist/{pullTranscendConfiguration-B8mxJCi7.mjs → pullTranscendConfiguration-Cdg8JEii.mjs} +2 -2
- package/dist/pullTranscendConfiguration-Cdg8JEii.mjs.map +1 -0
- package/dist/{pushCronIdentifiersFromCsv-7M24AbQL.mjs → pushCronIdentifiersFromCsv-BEPg03aD.mjs} +2 -2
- package/dist/{pushCronIdentifiersFromCsv-7M24AbQL.mjs.map → pushCronIdentifiersFromCsv-BEPg03aD.mjs.map} +1 -1
- package/dist/{pushManualEnrichmentIdentifiersFromCsv-Bjr1td2N.mjs → pushManualEnrichmentIdentifiersFromCsv-B0jKrYOZ.mjs} +2 -2
- package/dist/{pushManualEnrichmentIdentifiersFromCsv-Bjr1td2N.mjs.map → pushManualEnrichmentIdentifiersFromCsv-B0jKrYOZ.mjs.map} +1 -1
- package/dist/{readTranscendYaml-BiOgzaYR.mjs → readTranscendYaml-D-k8P4v1.mjs} +2 -2
- package/dist/{readTranscendYaml-BiOgzaYR.mjs.map → readTranscendYaml-D-k8P4v1.mjs.map} +1 -1
- package/dist/{removeUnverifiedRequestIdentifiers-OZ7bu7Ru.mjs → removeUnverifiedRequestIdentifiers-BIchFbPB.mjs} +2 -2
- package/dist/{removeUnverifiedRequestIdentifiers-OZ7bu7Ru.mjs.map → removeUnverifiedRequestIdentifiers-BIchFbPB.mjs.map} +1 -1
- package/dist/{retryRequestDataSilos-CBQVt1KQ.mjs → retryRequestDataSilos-DUfHyF_U.mjs} +2 -2
- package/dist/{retryRequestDataSilos-CBQVt1KQ.mjs.map → retryRequestDataSilos-DUfHyF_U.mjs.map} +1 -1
- package/dist/{skipPreflightJobs-Bv4Aq4A8.mjs → skipPreflightJobs-DaFjvih9.mjs} +2 -2
- package/dist/{skipPreflightJobs-Bv4Aq4A8.mjs.map → skipPreflightJobs-DaFjvih9.mjs.map} +1 -1
- package/dist/{skipRequestDataSilos-ad1-O-VR.mjs → skipRequestDataSilos-DYE2aYYS.mjs} +2 -2
- package/dist/{skipRequestDataSilos-ad1-O-VR.mjs.map → skipRequestDataSilos-DYE2aYYS.mjs.map} +1 -1
- package/dist/{streamPrivacyRequestsToCsv-Dp2Zyy5x.mjs → streamPrivacyRequestsToCsv-DakIlTv0.mjs} +2 -2
- package/dist/{streamPrivacyRequestsToCsv-Dp2Zyy5x.mjs.map → streamPrivacyRequestsToCsv-DakIlTv0.mjs.map} +1 -1
- package/dist/{updateConsentManagerVersionToLatest-BplmLTDD.mjs → updateConsentManagerVersionToLatest-BzAN1bBC.mjs} +2 -2
- package/dist/{updateConsentManagerVersionToLatest-BplmLTDD.mjs.map → updateConsentManagerVersionToLatest-BzAN1bBC.mjs.map} +1 -1
- package/dist/{uploadConsents-zl9yaBjX.mjs → uploadConsents-CAAkg4cf.mjs} +2 -2
- package/dist/{uploadConsents-zl9yaBjX.mjs.map → uploadConsents-CAAkg4cf.mjs.map} +1 -1
- package/dist/{uploadCookiesFromCsv-B8Ast_0y.mjs → uploadCookiesFromCsv-DP3LBhMG.mjs} +2 -2
- package/dist/{uploadCookiesFromCsv-B8Ast_0y.mjs.map → uploadCookiesFromCsv-DP3LBhMG.mjs.map} +1 -1
- package/dist/{uploadDataFlowsFromCsv-DY_dmUdU.mjs → uploadDataFlowsFromCsv-C--ho0_f.mjs} +2 -2
- package/dist/{uploadDataFlowsFromCsv-DY_dmUdU.mjs.map → uploadDataFlowsFromCsv-C--ho0_f.mjs.map} +1 -1
- package/dist/{uploadPrivacyRequestsFromCsv-CzZCVwFV.mjs → uploadPrivacyRequestsFromCsv-CLklOZOl.mjs} +2 -2
- package/dist/{uploadPrivacyRequestsFromCsv-CzZCVwFV.mjs.map → uploadPrivacyRequestsFromCsv-CLklOZOl.mjs.map} +1 -1
- package/dist/{validateTranscendAuth-B_EFnL1A.mjs → validateTranscendAuth-CIPn35zS.mjs} +2 -2
- package/dist/{validateTranscendAuth-B_EFnL1A.mjs.map → validateTranscendAuth-CIPn35zS.mjs.map} +1 -1
- package/package.json +4 -4
- package/dist/codecs-CfHvcMSL.mjs +0 -2
- package/dist/codecs-CfHvcMSL.mjs.map +0 -1
- package/dist/parseVariablesFromString-C2SbrKX5.mjs.map +0 -1
- package/dist/pullTranscendConfiguration-B8mxJCi7.mjs.map +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e}from"./constants-
|
|
2
|
-
//# sourceMappingURL=approvePrivacyRequests-
|
|
1
|
+
import{a as e}from"./constants-BesTSxZW.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{o as n,t as r}from"./request-C4gYxn1p.mjs";import{r as i}from"./fetchAllRequests-BCHpCeFo.mjs";import{RequestStatus as a}from"@transcend-io/privacy-types";import o from"colors";import{buildTranscendGraphQLClient as s,makeGraphQLRequest as c}from"@transcend-io/sdk";import{map as l}from"@transcend-io/utils";import u from"cli-progress";async function d({requestActions:d,requestOrigins:f,auth:p,silentModeBefore:m,createdAtAfter:h,createdAtBefore:g,updatedAtBefore:_,updatedAtAfter:v,concurrency:y=50,transcendUrl:b=e}){let x=s(b,p),S=new Date().getTime(),C=new u.SingleBar({},u.Presets.shades_classic),w=await i(x,{actions:d,statuses:[a.Approving],createdAtAfter:h,createdAtBefore:g,updatedAtBefore:_,updatedAtAfter:v,origins:f});t.info(o.magenta(`Approving "${w.length}" requests.`));let T=0,E=0;C.start(w.length,0),await l(w,async e=>{m&&new Date(m)>new Date(e.createdAt)&&await c(x,n,{variables:{input:{id:e.id,isSilent:!0}},logger:t});try{await c(x,r,{variables:{input:{requestId:e.id}},logger:t})}catch(e){e.message.includes(`Request must be in an approving state,`)&&(E+=1)}T+=1,C.update(T)},{concurrency:y}),C.stop();let D=new Date().getTime()-S;return E>0&&t.info(o.yellow(`${E} requests were skipped.`)),t.info(o.green(`Successfully approved ${T} requests in "${D/1e3}" seconds!`)),w.length}export{d as t};
|
|
2
|
+
//# sourceMappingURL=approvePrivacyRequests-BjjUp-hw.mjs.map
|
package/dist/{approvePrivacyRequests-BsNtrVwv.mjs.map → approvePrivacyRequests-BjjUp-hw.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"approvePrivacyRequests-
|
|
1
|
+
{"version":3,"file":"approvePrivacyRequests-BjjUp-hw.mjs","names":[],"sources":["../src/lib/requests/approvePrivacyRequests.ts"],"sourcesContent":["import { RequestAction, RequestOrigin, RequestStatus } from '@transcend-io/privacy-types';\nimport { buildTranscendGraphQLClient, makeGraphQLRequest } from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport {\n UPDATE_PRIVACY_REQUEST,\n fetchAllRequests,\n APPROVE_PRIVACY_REQUEST,\n} from '../graphql/index.js';\n\n/**\n * Approve a set of privacy requests\n *\n * @param options - Options\n * @returns The number of requests approved\n */\nexport async function approvePrivacyRequests({\n requestActions,\n requestOrigins,\n auth,\n silentModeBefore,\n createdAtAfter,\n createdAtBefore,\n updatedAtBefore,\n updatedAtAfter,\n concurrency = 50,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** The request actions that should be restarted */\n requestActions: RequestAction[];\n /** The request origins that should be restarted */\n requestOrigins?: RequestOrigin[];\n /** Transcend API key authentication */\n auth: string;\n /** Concurrency limit for approving */\n concurrency?: number;\n /** Mark these requests as silent mode if they were created before this date */\n silentModeBefore?: Date;\n /** Filter for requests created before this date */\n createdAtBefore?: Date;\n /** Filter for requests created after this date */\n createdAtAfter?: Date;\n /** Filter for requests updated before this date */\n updatedAtBefore?: Date;\n /** Filter for requests updated after this date */\n updatedAtAfter?: Date;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<number> {\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Pull in the requests\n const allRequests = await fetchAllRequests(client, {\n actions: requestActions,\n statuses: [RequestStatus.Approving],\n createdAtAfter,\n createdAtBefore,\n updatedAtBefore,\n updatedAtAfter,\n origins: requestOrigins,\n });\n\n // Notify Transcend\n logger.info(colors.magenta(`Approving \"${allRequests.length}\" requests.`));\n\n let total = 0;\n let skipped = 0;\n progressBar.start(allRequests.length, 0);\n await map(\n allRequests,\n async (requestToApprove) => {\n // update request to silent mode if silentModeBefore is defined\n // and the request was created before silentModeBefore\n if (silentModeBefore && new Date(silentModeBefore) > new Date(requestToApprove.createdAt)) {\n await makeGraphQLRequest(client, UPDATE_PRIVACY_REQUEST, {\n variables: {\n input: {\n id: requestToApprove.id,\n isSilent: true,\n },\n },\n logger,\n });\n }\n\n try {\n // approve the request\n await makeGraphQLRequest(client, APPROVE_PRIVACY_REQUEST, {\n variables: { input: { requestId: requestToApprove.id } },\n logger,\n });\n } catch (err) {\n if (err.message.includes('Request must be in an approving state,')) {\n skipped += 1;\n }\n }\n\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n if (skipped > 0) {\n logger.info(colors.yellow(`${skipped} requests were skipped.`));\n }\n logger.info(\n colors.green(`Successfully approved ${total} requests in \"${totalTime / 1000}\" seconds!`),\n );\n return allRequests.length;\n}\n"],"mappings":"waAoBA,eAAsB,EAAuB,CAC3C,iBACA,iBACA,OACA,mBACA,iBACA,kBACA,kBACA,iBACA,cAAc,GACd,eAAe,GAsBG,CAElB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAG/E,EAAc,MAAM,EAAiB,EAAQ,CACjD,QAAS,EACT,SAAU,CAAC,EAAc,UAAU,CACnC,iBACA,kBACA,kBACA,iBACA,QAAS,EACV,CAAC,CAGF,EAAO,KAAK,EAAO,QAAQ,cAAc,EAAY,OAAO,aAAa,CAAC,CAE1E,IAAI,EAAQ,EACR,EAAU,EACd,EAAY,MAAM,EAAY,OAAQ,EAAE,CACxC,MAAM,EACJ,EACA,KAAO,IAAqB,CAGtB,GAAoB,IAAI,KAAK,EAAiB,CAAG,IAAI,KAAK,EAAiB,UAAU,EACvF,MAAM,EAAmB,EAAQ,EAAwB,CACvD,UAAW,CACT,MAAO,CACL,GAAI,EAAiB,GACrB,SAAU,GACX,CACF,CACD,SACD,CAAC,CAGJ,GAAI,CAEF,MAAM,EAAmB,EAAQ,EAAyB,CACxD,UAAW,CAAE,MAAO,CAAE,UAAW,EAAiB,GAAI,CAAE,CACxD,SACD,CAAC,OACK,EAAK,CACR,EAAI,QAAQ,SAAS,yCAAyC,GAChE,GAAW,GAIf,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAOvB,OANI,EAAU,GACZ,EAAO,KAAK,EAAO,OAAO,GAAG,EAAQ,yBAAyB,CAAC,CAEjE,EAAO,KACL,EAAO,MAAM,yBAAyB,EAAM,gBAAgB,EAAY,IAAK,YAAY,CAC1F,CACM,EAAY"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{t as e}from"../app-
|
|
2
|
+
import{t as e}from"../app-D29TqW_A.mjs";import{t}from"../context-CdSyuBlf.mjs";import{proposeCompletions as n}from"@stricli/core";async function r(){let r=process.argv.slice(3);process.env.COMP_LINE?.endsWith(` `)&&r.push(``),await n(e,r,t(process));try{for(let{completion:i}of await n(e,r,t(process)))process.stdout.write(`${i}\n`)}catch{}}r();export{};
|
|
3
3
|
//# sourceMappingURL=bash-complete.mjs.map
|
package/dist/bin/cli.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{t as e}from"../app-
|
|
2
|
+
import{t as e}from"../app-D29TqW_A.mjs";import{t}from"../context-CdSyuBlf.mjs";import{run as n}from"@stricli/core";async function r(){await n(e,process.argv.slice(2),t(process))}r();export{};
|
|
3
3
|
//# sourceMappingURL=cli.mjs.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{t as e}from"../app-
|
|
2
|
+
import{t as e}from"../app-D29TqW_A.mjs";import{t}from"../logger-B-LXIf3U.mjs";import{generateHelpTextForAllCommands as n}from"@stricli/core";const r={"tr-build-xdi-sync-endpoint":[`consent`,`build-xdi-sync-endpoint`],"tr-consent-manager-service-json-to-yml":[`inventory`,`consent-manager-service-json-to-yml`],"tr-consent-managers-to-business-entities":[`inventory`,`consent-managers-to-business-entities`],"tr-cron-mark-identifiers-completed":[`request`,`cron`,`mark-identifiers-completed`],"tr-cron-pull-identifiers":[`request`,`cron`,`pull-identifiers`],"tr-derive-data-silos-from-data-flows":[`inventory`,`derive-data-silos-from-data-flows`],"tr-derive-data-silos-from-data-flows-cross-instance":[`inventory`,`derive-data-silos-from-data-flows-cross-instance`],"tr-discover-silos":[`inventory`,`discover-silos`],"tr-generate-api-keys":[`admin`,`generate-api-keys`],"tr-manual-enrichment-pull-identifiers":[`request`,`preflight`,`pull-identifiers`],"tr-manual-enrichment-push-identifiers":[`request`,`preflight`,`push-identifiers`],"tr-mark-request-data-silos-completed":[`request`,`system`,`mark-request-data-silos-completed`],"tr-pull":[`inventory`,`pull`],"tr-pull-consent-metrics":[`consent`,`pull-consent-metrics`],"tr-pull-consent-preferences":[`consent`,`pull-consent-preferences`],"tr-pull-datapoints":[`inventory`,`pull-datapoints`],"tr-pull-pull-unstructured-discovery-files":[`inventory`,`pull-unstructured-discovery-files`],"tr-push":[`inventory`,`push`],"tr-request-approve":[`request`,`approve`],"tr-request-cancel":[`request`,`cancel`],"tr-request-download-files":[`request`,`download-files`],"tr-request-enricher-restart":[`request`,`enricher-restart`],"tr-request-export":[`request`,`export`],"tr-request-mark-silent":[`request`,`mark-silent`],"tr-request-notify-additional-time":[`request`,`notify-additional-time`],"tr-request-reject-unverified-identifiers":[`request`,`reject-unverified-identifiers`],"tr-request-restart":[`request`,`restart`],"tr-request-upload":[`request`,`upload`],"tr-retry-request-data-silos":[`request`,`system`,`retry-request-data-silos`],"tr-scan-packages":[`inventory`,`scan-packages`],"tr-skip-preflight-jobs":[`request`,`skip-preflight-jobs`],"tr-skip-request-data-silos":[`request`,`system`,`skip-request-data-silos`],"tr-sync-ot":[`migration`,`sync-ot`],"tr-update-consent-manager":[`consent`,`update-consent-manager`],"tr-upload-consent-preferences":[`consent`,`upload-consent-preferences`],"tr-upload-cookies-from-csv":[`consent`,`upload-cookies-from-csv`],"tr-upload-data-flows-from-csv":[`consent`,`upload-data-flows-from-csv`],"tr-upload-preferences":[`consent`,`upload-preferences`]};function i(t){return n(e).find(n=>n[0]===`${e.config.name} ${t.join(` `)}`)?.[1]}function a(n){t.log(`[DEPRECATION NOTICE]`);let a=r[n];if(!a){let n=Object.entries(r).map(([t,n])=>`\`${t}\` -> \`${e.config.name} ${n.join(` `)}\``).join(`
|
|
3
3
|
`);t.log(`This command is deprecated as of v7.0.0. Here is a list of new commands, mapped to their legacy command names:
|
|
4
4
|
${n}`);return}t.log(`\`${n}\` is deprecated as of v7.0.0.\nUse \`${e.config.name} ${a.join(` `)}\` instead.\n`);let o=i(a);if(!o)throw Error(`Failed to get help text for command: \`${a.join(` `)}\``);t.log(o)}function o(){let e=process.argv.at(-1)?.split(`/`).pop()?.trim();if(e)a(e);else throw Error(`Deprecated command`);process.exit(1)}o();export{};
|
|
5
5
|
//# sourceMappingURL=deprecated-command.mjs.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{m as e}from"./constants-
|
|
2
|
-
//# sourceMappingURL=buildExamples-
|
|
1
|
+
import{m as e}from"./constants-BesTSxZW.mjs";function t(t,n,i){let a=t.join(` `),o=r(n),{forceSingleLine:s=!1,argsIndent:c=2}=i??{};return o.length===0?`${e} ${a}`:`${e} ${`transcend ${a} ${o.join(` `)}`.length<=117&&!s?`${a} ${o.join(` `)}`:`${a} \\\n${` `.repeat(c)}${o.join(` \\\n${` `.repeat(c)}`)}`}`}function n(e,t=0){if(typeof e==`boolean`)return e?`true`:`false`;if(typeof e==`number`)return e.toString();if(e instanceof Date)return e.toISOString();if(Array.isArray(e)&&t===0){let r=e.map(e=>n(e,t+1));return r.every(e=>e.startsWith(`$`)||e.includes(` `))?`"${r.join(`,`)}"`:r.join(`,`)}if(typeof e==`string`)return t===1?e.startsWith(`$`)?`$\{${e.slice(1)}}`:e:e.startsWith(`$`)||e.includes(` `)?`"${e}"`:e;throw Error(`Unsupported value type: ${typeof e}`)}function r(e,t=0){return Object.entries(e).map(([e,r])=>typeof r==`boolean`&&r?`--${e}`:`--${e}=${n(r,t)}`)}export{t};
|
|
2
|
+
//# sourceMappingURL=buildExamples-2xaj8FoK.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildExamples-
|
|
1
|
+
{"version":3,"file":"buildExamples-2xaj8FoK.mjs","names":[],"sources":["../src/lib/docgen/buildExamples.ts"],"sourcesContent":["import { name } from '../../constants.js';\n\nexport interface Example<Flags> {\n /** A description of the example */\n description: string;\n /** The flag arguments to the command */\n flags: Partial<Flags>;\n}\n\n/**\n * Builds a string of examples for the CLI\n *\n * @param commandPath - The path to the command to run, omitting the `transcend` command name, e.g., `['consent', 'upload-preferences']`\n * @param examples - The examples to build\n * @returns A string of examples for the CLI\n */\nexport function buildExamples<Flags = never>(\n commandPath: string[],\n examples: NoInfer<Example<Flags>>[],\n): string {\n return examples\n .map((example) => {\n const exampleCommand = buildExampleCommand<Flags>(commandPath, example.flags);\n return `**${example.description}**\\n\\n\\`\\`\\`sh\\n${exampleCommand}\\n\\`\\`\\``;\n })\n .join('\\n\\n');\n}\n\n/**\n * Builds a command string for an example\n *\n * @param commandPath - The path to the command to run, omitting the `transcend` command name, e.g., `['consent', 'upload-preferences']`\n * @param flags - The flags to build the command with\n * @param options - The options for the command\n * @returns A command string for the example\n */\nexport function buildExampleCommand<Flags = never>(\n commandPath: string[],\n flags: NoInfer<Partial<Flags>>,\n options?: {\n /** If true, the command will be forced to a single line */\n forceSingleLine?: boolean;\n /** If true, the command will be indented */\n argsIndent?: number;\n },\n): string {\n const command = commandPath.join(' ');\n const flagList = getFlagList(flags);\n const { forceSingleLine = false, argsIndent = 2 } = options ?? {};\n\n if (flagList.length === 0) {\n return `${name} ${command}`;\n }\n\n // Break the command into multiple lines if it's too long\n const exampleCommand =\n `${name} ${command} ${flagList.join(' ')}`.length <= 117 && !forceSingleLine\n ? `${command} ${flagList.join(' ')}`\n : `${command} \\\\\\n${' '.repeat(argsIndent)}${flagList.join(\n ` \\\\\\n${' '.repeat(argsIndent)}`,\n )}`;\n\n // Add `transcend` before command name\n return `${name} ${exampleCommand}`;\n}\n\n/**\n * Formats a flag value to the bash string for an example command\n *\n * @param value - The value to format\n * @param depth - The depth of the recursion\n * @returns The formatted value\n */\nfunction formatFlagValue(value: unknown, depth = 0): string {\n if (typeof value === 'boolean') {\n return value ? 'true' : 'false';\n }\n\n if (typeof value === 'number') {\n return value.toString();\n }\n\n if (value instanceof Date) {\n return value.toISOString();\n }\n\n if (Array.isArray(value) && depth === 0) {\n const values = value.map((v) => formatFlagValue(v, depth + 1));\n if (values.every((x) => x.startsWith('$') || x.includes(' '))) {\n return `\"${values.join(',')}\"`;\n }\n return values.join(',');\n }\n\n if (typeof value === 'string') {\n // If we're operating on list elements\n if (depth === 1) {\n if (value.startsWith('$')) {\n return `$\\{${value.slice(1)}}`;\n }\n return value;\n }\n\n // Escape strings that start with $ or contain spaces or special characters\n return value.startsWith('$') || value.includes(' ') ? `\"${value}\"` : value;\n }\n\n throw new Error(`Unsupported value type: ${typeof value}`);\n}\n\n/**\n * Builds a list of flags formatted for an example command\n *\n * @param flags - The flags to build the command with\n * @param depth - The depth of the recursion\n * @returns A list of flags for the example command\n */\nexport function getFlagList<Flags = never>(flags: Partial<Flags>, depth = 0): string[] {\n return Object.entries(flags).map(([flag, value]) => {\n if (typeof value === 'boolean' && value) {\n // For true booleans, just pass the flag alone\n return `--${flag}`;\n }\n\n const formattedValue = formatFlagValue(value, depth);\n\n return `--${flag}=${formattedValue}`;\n });\n}\n"],"mappings":"6CAoCA,SAAgB,EACd,EACA,EACA,EAMQ,CACR,IAAM,EAAU,EAAY,KAAK,IAAI,CAC/B,EAAW,EAAY,EAAM,CAC7B,CAAE,kBAAkB,GAAO,aAAa,GAAM,GAAW,EAAE,CAejE,OAbI,EAAS,SAAW,EACf,GAAG,EAAK,GAAG,IAYb,GAAG,EAAK,GAPb,aAAW,EAAQ,GAAG,EAAS,KAAK,IAAI,GAAG,QAAU,KAAO,CAAC,EACzD,GAAG,EAAQ,GAAG,EAAS,KAAK,IAAI,GAChC,GAAG,EAAQ,OAAO,IAAI,OAAO,EAAW,GAAG,EAAS,KAClD,QAAQ,IAAI,OAAO,EAAW,GAC/B,KAaT,SAAS,EAAgB,EAAgB,EAAQ,EAAW,CAC1D,GAAI,OAAO,GAAU,UACnB,OAAO,EAAQ,OAAS,QAG1B,GAAI,OAAO,GAAU,SACnB,OAAO,EAAM,UAAU,CAGzB,GAAI,aAAiB,KACnB,OAAO,EAAM,aAAa,CAG5B,GAAI,MAAM,QAAQ,EAAM,EAAI,IAAU,EAAG,CACvC,IAAM,EAAS,EAAM,IAAK,GAAM,EAAgB,EAAG,EAAQ,EAAE,CAAC,CAI9D,OAHI,EAAO,MAAO,GAAM,EAAE,WAAW,IAAI,EAAI,EAAE,SAAS,IAAI,CAAC,CACpD,IAAI,EAAO,KAAK,IAAI,CAAC,GAEvB,EAAO,KAAK,IAAI,CAGzB,GAAI,OAAO,GAAU,SAUnB,OARI,IAAU,EACR,EAAM,WAAW,IAAI,CAChB,MAAM,EAAM,MAAM,EAAE,CAAC,GAEvB,EAIF,EAAM,WAAW,IAAI,EAAI,EAAM,SAAS,IAAI,CAAG,IAAI,EAAM,GAAK,EAGvE,MAAU,MAAM,2BAA2B,OAAO,IAAQ,CAU5D,SAAgB,EAA2B,EAAuB,EAAQ,EAAa,CACrF,OAAO,OAAO,QAAQ,EAAM,CAAC,KAAK,CAAC,EAAM,KACnC,OAAO,GAAU,WAAa,EAEzB,KAAK,IAKP,KAAK,EAAK,GAFM,EAAgB,EAAO,EAEZ,GAClC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e}from"./constants-
|
|
1
|
+
import{a as e}from"./constants-BesTSxZW.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{difference as n}from"lodash-es";import r from"colors";import{buildTranscendGraphQLClient as i,fetchConsentManager as a}from"@transcend-io/sdk";import{map as o}from"@transcend-io/utils";const s=e=>new URL(`https://${e}`).hostname.split(`.`).slice(-2).join(`.`),c=/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;async function l(l,{xdiLocation:u,transcendUrl:d=e,removeIpAddresses:f=!0,domainBlockList:p=[`localhost`],xdiAllowedCommands:m=`ConsentManager:Sync`}){let h=await o(Array.isArray(l)?l:[{apiKey:l,organizationId:``,organizationName:``}],async e=>(t.info(r.magenta(`Pulling consent metadata for organization - ${e.organizationName}`)),await a(i(d,e.apiKey),{logger:t})),{concurrency:5}),g={};return h.forEach(e=>{let t=e.partition?.partition||e.bundleURL.split(`/`).reverse()[1];g[t]||(g[t]=[]);let r=n(e.configuration.domains.filter(e=>!f||!c.test(e)).map(e=>s(e)),p);g[t]=[...new Set([...g[t]||[],...r])]}),{html:`
|
|
2
2
|
<!DOCTYPE html>
|
|
3
3
|
<script
|
|
4
4
|
src="${u}"
|
|
@@ -6,4 +6,4 @@ data-sync-groups='${JSON.stringify(g,null,2)}'
|
|
|
6
6
|
data-xdi-commands="${m}"
|
|
7
7
|
><\/script>
|
|
8
8
|
`,syncGroups:g}}export{l as n,s as r,c as t};
|
|
9
|
-
//# sourceMappingURL=buildXdiSyncEndpoint-
|
|
9
|
+
//# sourceMappingURL=buildXdiSyncEndpoint-ozQ3T4Hj.mjs.map
|
package/dist/{buildXdiSyncEndpoint-DPo9Sw3F.mjs.map → buildXdiSyncEndpoint-ozQ3T4Hj.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildXdiSyncEndpoint-
|
|
1
|
+
{"version":3,"file":"buildXdiSyncEndpoint-ozQ3T4Hj.mjs","names":[],"sources":["../src/lib/consent-manager/domainToHost.ts","../src/lib/consent-manager/buildXdiSyncEndpoint.ts"],"sourcesContent":["/**\n * Convert a domain to host\n *\n * @param domain - e.g. test.acme.com\n * @returns Host acme.com\n */\nexport const domainToHost = (domain: string): string =>\n new URL(`https://${domain}`).hostname.split('.').slice(-2).join('.');\n","import { buildTranscendGraphQLClient, fetchConsentManager } from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport colors from 'colors';\nimport { difference } from 'lodash-es';\n\nimport { StoredApiKey } from '../../codecs.js';\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { domainToHost } from './domainToHost.js';\n\n/**\n * Sync group configuration mapping\n * e.g.\n * {\n * \"abdb5e78-0d69-4554-a3bd-84b72ca3b3d9\": [\n * \"test.com\"\n * ],\n * \"f6b3ba87-c9df-444f-b420-6fac49e35910\": [\n * \"blue.com\"\n * ]\n * }\n */\nexport type XdiSyncGroups = { [k in string]: string[] };\n\n/** Regular expression for IP addresses - remove these from sync endpoint */\nexport const IP_ADDRESS_REGEX =\n // eslint-disable-next-line max-len\n /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;\n\n/**\n * Build the sync endpoint definition for a set of Transcend accounts\n *\n * @param apiKeys - The API keys that will be used to pull down configurations for\n * @param options - Options\n * @returns The XDI configuration\n */\nexport async function buildXdiSyncEndpoint(\n apiKeys: string | StoredApiKey[],\n {\n xdiLocation,\n transcendUrl = DEFAULT_TRANSCEND_API,\n removeIpAddresses = true,\n domainBlockList = ['localhost'],\n xdiAllowedCommands = 'ConsentManager:Sync',\n }: {\n /** The file location where the XDI file is hosted */\n xdiLocation: string;\n /** URL of Transcend API */\n transcendUrl?: string;\n /** When true, remove IP addresses (defaults to true) */\n removeIpAddresses?: boolean;\n /** Block list of domains to omit from sync endpoint - includes `localhost` by default */\n domainBlockList?: string[];\n /** Allows XDI commands */\n xdiAllowedCommands?: string;\n },\n): Promise<{\n /** Sync group configurations */\n syncGroups: XdiSyncGroups;\n /** The HTML string */\n html: string;\n}> {\n // Convert API keys to list\n const apiKeysAsList = Array.isArray(apiKeys)\n ? apiKeys\n : [{ apiKey: apiKeys, organizationId: '', organizationName: '' }];\n\n // Fetch configuration for each account\n const consentManagers = await map(\n apiKeysAsList,\n async (apiKey) => {\n logger.info(\n colors.magenta(`Pulling consent metadata for organization - ${apiKey.organizationName}`),\n );\n\n // Create a GraphQL client\n const client = buildTranscendGraphQLClient(transcendUrl, apiKey.apiKey);\n\n // Grab consent manager\n const consentManager = await fetchConsentManager(client, { logger });\n return consentManager;\n },\n { concurrency: 5 },\n );\n\n // construct the sync groups\n const syncGroups: XdiSyncGroups = {};\n consentManagers.forEach((consentManager) => {\n // grab the partition key\n const partitionKey =\n // take explicit key first\n consentManager.partition?.partition ||\n // fallback to bundle ID\n consentManager.bundleURL.split('/').reverse()[1];\n\n // Ensure that partition exists in the sync groups\n if (!syncGroups[partitionKey]) {\n syncGroups[partitionKey] = [];\n }\n\n // Map domain list to a host list\n const hosts = difference(\n consentManager.configuration.domains\n .filter(\n // ignore IP addresses\n (domain) => !removeIpAddresses || !IP_ADDRESS_REGEX.test(domain),\n )\n .map((domain) => domainToHost(domain)),\n // ignore block list\n domainBlockList,\n );\n // merge existing sync group with hosts for this consent manager\n syncGroups[partitionKey] = [...new Set([...(syncGroups[partitionKey] || []), ...hosts])];\n });\n\n // Construct the HTML\n const syncEndpointHtml = `\n<!DOCTYPE html>\n<script\nsrc=\"${xdiLocation}\"\ndata-sync-groups='${JSON.stringify(syncGroups, null, 2)}'\ndata-xdi-commands=\"${xdiAllowedCommands}\"\n></script>\n`;\n\n return {\n html: syncEndpointHtml,\n syncGroups,\n };\n}\n"],"mappings":"kRAMA,MAAa,EAAgB,GAC3B,IAAI,IAAI,WAAW,IAAS,CAAC,SAAS,MAAM,IAAI,CAAC,MAAM,GAAG,CAAC,KAAK,IAAI,CCkBzD,EAEX,mKASF,eAAsB,EACpB,EACA,CACE,cACA,eAAe,EACf,oBAAoB,GACpB,kBAAkB,CAAC,YAAY,CAC/B,qBAAqB,uBAkBtB,CAOD,IAAM,EAAkB,MAAM,EALR,MAAM,QAAQ,EAAQ,CACxC,EACA,CAAC,CAAE,OAAQ,EAAS,eAAgB,GAAI,iBAAkB,GAAI,CAAC,CAKjE,KAAO,KACL,EAAO,KACL,EAAO,QAAQ,+CAA+C,EAAO,mBAAmB,CACzF,CAOM,MADsB,EAHd,EAA4B,EAAc,EAAO,OAGT,CAAE,CAAE,SAAQ,CAAC,EAGtE,CAAE,YAAa,EAAG,CACnB,CAGK,EAA4B,EAAE,CAuCpC,OAtCA,EAAgB,QAAS,GAAmB,CAE1C,IAAM,EAEJ,EAAe,WAAW,WAE1B,EAAe,UAAU,MAAM,IAAI,CAAC,SAAS,CAAC,GAG3C,EAAW,KACd,EAAW,GAAgB,EAAE,EAI/B,IAAM,EAAQ,EACZ,EAAe,cAAc,QAC1B,OAEE,GAAW,CAAC,GAAqB,CAAC,EAAiB,KAAK,EAAO,CACjE,CACA,IAAK,GAAW,EAAa,EAAO,CAAC,CAExC,EACD,CAED,EAAW,GAAgB,CAAC,GAAG,IAAI,IAAI,CAAC,GAAI,EAAW,IAAiB,EAAE,CAAG,GAAG,EAAM,CAAC,CAAC,EACxF,CAYK,CACL,KAAM;;;OAPH,EAAY;oBACC,KAAK,UAAU,EAAY,KAAM,EAAE,CAAC;qBACnC,EAAmB;;EAMpC,aACD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e}from"./constants-
|
|
2
|
-
//# sourceMappingURL=bulkRestartRequests-
|
|
1
|
+
import{a as e}from"./constants-BesTSxZW.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{s as n,u as r}from"./constants-KYaYveEQ.mjs";import{r as i}from"./fetchAllRequests-BCHpCeFo.mjs";import{n as a,t as o}from"./extractClientError-CaF_Kj-f.mjs";import{IdentifierType as s}from"@transcend-io/privacy-types";import{difference as c,groupBy as l}from"lodash-es";import{apply as u,decodeCodec as d}from"@transcend-io/type-utils";import{join as f,resolve as p}from"node:path";import m from"colors";import*as h from"io-ts";import{buildTranscendGraphQLClient as g,createSombraGotInstance as _,fetchAllRequestIdentifiers as v,validateSombraVersion as y}from"@transcend-io/sdk";import{map as b}from"@transcend-io/utils";import x from"cli-progress";import{PersistedState as S}from"@transcend-io/persisted-state";async function C(e,t,{sendEmailReceipt:r=!1,skipWaitingPeriod:i=!1,emailIsVerified:o=!0,requestIdentifiers:c=[],restartIdentifierStrategy:f}={}){let p=await e.post(`v1/data-subject-request`,{json:{type:t.type,subject:{coreIdentifier:t.coreIdentifier,email:t.email,emailIsVerified:o,...c.length>0?{attestedExtraIdentifiers:u(l(c.filter(e=>!(e.name===`email`&&e.value===t.email)&&!n.includes(e.name)).map(e=>({...e,type:Object.values(s).includes(e.name)?e.name:s.Custom})),`type`),(e,t)=>e.map(({name:e,value:n})=>({...t===s.Custom?{name:e}:{},value:n})))}:{}},requestId:t.id,subjectType:t.subjectType,isSilent:t.isSilent,isTest:t.isTest,locale:t.locale,skipWaitingPeriod:i,createdAt:t.createdAt,details:`Restarted by Transcend cli: "tr-request-restart" - ${t.details}`,skipSendingReceipt:!r,...f?{restartIdentifierStrategy:f}:{}}}).json(),{request:m}=d(h.type({request:a}),p);return m}const w=h.intersection([r,h.type({error:h.string})]),T=h.type({restartedRequests:h.array(r),failingRequests:h.array(w)});async function E({requestReceiptFolder:n,auth:r,sombraAuth:a,requestActions:s,requestStatuses:l,createdAtBefore:u,createdAtAfter:d,updatedAtBefore:h,updatedAtAfter:w,transcendUrl:E=e,requestIds:D=[],createdAt:O=new Date,silentModeBefore:k,sendEmailReceipt:A=!1,emailIsVerified:j=!0,copyIdentifiers:M=!1,restartIdentifierStrategy:N,skipWaitingPeriod:P=!1,concurrency:F=20}){let I=new Date().getTime(),L=new x.SingleBar({},x.Presets.shades_classic),R=f(n,`tr-request-restart-${new Date().toISOString().replace(/:/g,`-`)}.json`),z=new S(R,T,{restartedRequests:[],failingRequests:[]}),B=await _(E,r,{logger:t,sombraApiKey:a,sombraUrl:process.env.SOMBRA_URL}),V=g(E,r),H=(await i(V,{requestIds:D,actions:s,statuses:l,createdAtBefore:u,createdAtAfter:d,updatedAtBefore:h,updatedAtAfter:w})).filter(e=>new Date(e.createdAt)<O);if(t.info(`Found ${H.length} requests to restart`),M&&t.info(`copyIdentifiers detected - All Identifiers will be copied.`),N&&t.info(`restartIdentifierStrategy detected - Using "${N}" strategy.`),A&&t.info(`sendEmailReceipt detected - Email receipts will be sent.`),P&&t.info(`skipWaitingPeriod detected - Waiting period will be skipped.`),D.length>0&&D.length!==H.length){let e=c(D,H.map(({id:e})=>e));e.length>0&&(t.error(m.red(`Failed to find the following requests by ID: ${e.join(`,`)}.`)),process.exit(1))}M&&await y(V,{logger:t});let U=0;L.start(H.length,0),await b(H,async(e,n)=>{try{let r=M?await v(V,B,{filterBy:{requestId:e.id},skipSombraCheck:!0,logger:t}):[],i=await C(B,{...e,isSilent:k&&new Date(e.createdAt)<k?!0:e.isSilent},{requestIdentifiers:r,skipWaitingPeriod:P,sendEmailReceipt:A,emailIsVerified:j,restartIdentifierStrategy:N}),a=z.getValue(`restartedRequests`);a.push({id:i.id,link:i.link,rowIndex:n,coreIdentifier:i.coreIdentifier,attemptedAt:new Date().toISOString()}),await z.setValue(a,`restartedRequests`)}catch(t){let r=`${t.message} - ${JSON.stringify(t.response?.body,null,2)}`,i=o(r),a=z.getValue(`failingRequests`);a.push({id:e.id,link:e.link,rowIndex:n,coreIdentifier:e.coreIdentifier,attemptedAt:new Date().toISOString(),error:i||r}),await z.setValue(a,`failingRequests`)}U+=1,L.update(U)},{concurrency:F}),L.stop();let W=new Date().getTime()-I;t.info(m.green(`Completed restarting of requests in "${W/1e3}" seconds.`)),z.getValue(`failingRequests`).length>0&&(t.error(m.red(`Encountered "${z.getValue(`failingRequests`).length}" errors. See "${p(R)}" to review the error messages and inputs.`)),process.exit(1))}export{C as n,E as t};
|
|
2
|
+
//# sourceMappingURL=bulkRestartRequests-c29oH5GC.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulkRestartRequests-iE9g9WBz.mjs","names":[],"sources":["../src/lib/requests/restartPrivacyRequest.ts","../src/lib/requests/bulkRestartRequests.ts"],"sourcesContent":["import { IdentifierType, RestartIdentifierStrategy } from '@transcend-io/privacy-types';\nimport type { RequestIdentifier } from '@transcend-io/sdk';\nimport { apply, decodeCodec } from '@transcend-io/type-utils';\nimport type { Got } from 'got';\nimport * as t from 'io-ts';\nimport { groupBy } from 'lodash-es';\n\nimport type { PrivacyRequest } from '../graphql/index.js';\nimport { IDENTIFIER_BLOCK_LIST } from './constants.js';\nimport { PrivacyRequestResponse } from './submitPrivacyRequest.js';\n\n/**\n * Restart a privacy request to the Transcend API\n *\n * @param sombra - Sombra instance configured to make requests\n * @param request - Request to restart\n * @param input - Request input\n * @returns Successfully submitted request\n */\nexport async function restartPrivacyRequest(\n sombra: Got,\n request: PrivacyRequest,\n {\n sendEmailReceipt = false,\n skipWaitingPeriod = false,\n emailIsVerified = true,\n requestIdentifiers = [],\n restartIdentifierStrategy,\n }: {\n /** List of request identifiers to include */\n requestIdentifiers?: RequestIdentifier[];\n /** When true, send an email receipt to data subject */\n sendEmailReceipt?: boolean;\n /** Whether the email is verified */\n emailIsVerified?: boolean;\n /** Whether to skip waiting period */\n skipWaitingPeriod?: boolean;\n /** How request identifiers should be handled when restarting */\n restartIdentifierStrategy?: RestartIdentifierStrategy;\n } = {},\n): Promise<PrivacyRequestResponse> {\n // Make the GraphQL request\n const response = await sombra\n .post('v1/data-subject-request', {\n json: {\n type: request.type,\n subject: {\n coreIdentifier: request.coreIdentifier,\n email: request.email,\n emailIsVerified,\n ...(requestIdentifiers.length > 0\n ? {\n attestedExtraIdentifiers: apply(\n groupBy(\n requestIdentifiers\n .filter(\n (ri) =>\n // these are already submitted above\n !(ri.name === 'email' && ri.value === request.email) &&\n !IDENTIFIER_BLOCK_LIST.includes(ri.name),\n )\n .map((ri) => ({\n ...ri,\n type: Object.values(IdentifierType).includes(\n ri.name as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n )\n ? ri.name\n : IdentifierType.Custom,\n })),\n 'type',\n ),\n (values, type) =>\n values.map(({ name, value }) => ({\n ...(type === IdentifierType.Custom ? { name } : {}),\n value,\n })),\n ),\n }\n : {}),\n },\n requestId: request.id,\n subjectType: request.subjectType,\n isSilent: request.isSilent,\n isTest: request.isTest,\n locale: request.locale,\n skipWaitingPeriod,\n createdAt: request.createdAt,\n details: `Restarted by Transcend cli: \"tr-request-restart\" - ${request.details}`,\n skipSendingReceipt: !sendEmailReceipt,\n ...(restartIdentifierStrategy ? { restartIdentifierStrategy } : {}),\n },\n })\n .json();\n\n const { request: requestResponse } = decodeCodec(\n t.type({\n request: PrivacyRequestResponse,\n }),\n response,\n );\n return requestResponse;\n}\n","import { join, resolve } from 'node:path';\n\nimport { PersistedState } from '@transcend-io/persisted-state';\nimport {\n RequestAction,\n RequestStatus,\n RestartIdentifierStrategy,\n} from '@transcend-io/privacy-types';\nimport {\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n fetchAllRequestIdentifiers,\n validateSombraVersion,\n} from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\nimport * as t from 'io-ts';\nimport { difference } from 'lodash-es';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { fetchAllRequests } from '../graphql/index.js';\nimport { SuccessfulRequest } from './constants.js';\nimport { extractClientError } from './extractClientError.js';\nimport { restartPrivacyRequest } from './restartPrivacyRequest.js';\n\n/** Minimal state we need to keep a list of requests */\nconst ErrorRequest = t.intersection([\n SuccessfulRequest,\n t.type({\n error: t.string,\n }),\n]);\n\n/** Type override */\ntype ErrorRequest = t.TypeOf<typeof ErrorRequest>;\n\n/** Persist this data between runs of the script */\nconst CachedRequestState = t.type({\n restartedRequests: t.array(SuccessfulRequest),\n failingRequests: t.array(ErrorRequest),\n});\n\n/**\n * Upload a set of privacy requests from CSV\n *\n * @param options - Options\n */\nexport async function bulkRestartRequests({\n requestReceiptFolder,\n auth,\n sombraAuth,\n requestActions,\n requestStatuses,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n transcendUrl = DEFAULT_TRANSCEND_API,\n requestIds = [],\n createdAt = new Date(),\n silentModeBefore,\n sendEmailReceipt = false,\n emailIsVerified = true,\n copyIdentifiers = false,\n restartIdentifierStrategy,\n skipWaitingPeriod = false,\n concurrency = 20,\n}: {\n /** Actions to filter for */\n requestActions: RequestAction[];\n /** Statues to filter for */\n requestStatuses: RequestStatus[];\n /** File where request receipts are stored */\n requestReceiptFolder: string;\n /** Transcend API key authentication */\n auth: string;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** Request IDs to filter for */\n requestIds?: string[];\n /** Whether to re-verify the email when restarting the request */\n emailIsVerified?: boolean;\n /** Filter for requests that were submitted before this date */\n createdAt?: Date;\n /** Requests that have been open for this length of time should be marked as silent mode */\n silentModeBefore?: Date;\n /** Send an email receipt to the restarted requests */\n sendEmailReceipt?: boolean;\n /** Copy over all identifiers rather than restarting the request only with the core identifier */\n copyIdentifiers?: boolean;\n /** How request identifiers should be handled when restarting */\n restartIdentifierStrategy?: RestartIdentifierStrategy;\n /** Skip the waiting period when restarting requests */\n skipWaitingPeriod?: boolean;\n /** Filter for requests created before this date */\n createdAtBefore?: Date;\n /** Filter for requests created after this date */\n createdAtAfter?: Date;\n /** Filter for requests updated before this date */\n updatedAtBefore?: Date;\n /** Filter for requests updated after this date */\n updatedAtAfter?: Date;\n /** Concurrency to upload requests at */\n concurrency?: number;\n}): Promise<void> {\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Create a new state file to store the requests from this run.\n // `toISOString()` contains colons (e.g. 2026-07-06T04:33:12.345Z) which are\n // illegal characters in Windows filenames, so strip them out to keep the\n // auto-generated receipt filename cross-platform.\n const cacheFile = join(\n requestReceiptFolder,\n `tr-request-restart-${new Date().toISOString().replace(/:/g, '-')}.json`,\n );\n const state = new PersistedState(cacheFile, CachedRequestState, {\n restartedRequests: [],\n failingRequests: [],\n });\n\n // Create sombra instance to communicate with\n const sombra = await createSombraGotInstance(transcendUrl, auth, {\n logger,\n sombraApiKey: sombraAuth,\n sombraUrl: process.env.SOMBRA_URL,\n });\n\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n const allRequests = await fetchAllRequests(client, {\n requestIds,\n actions: requestActions,\n statuses: requestStatuses,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n });\n const requests = allRequests.filter((request) => new Date(request.createdAt) < createdAt);\n logger.info(`Found ${requests.length} requests to restart`);\n\n if (copyIdentifiers) {\n logger.info('copyIdentifiers detected - All Identifiers will be copied.');\n }\n if (restartIdentifierStrategy) {\n logger.info(\n `restartIdentifierStrategy detected - Using \"${restartIdentifierStrategy}\" strategy.`,\n );\n }\n if (sendEmailReceipt) {\n logger.info('sendEmailReceipt detected - Email receipts will be sent.');\n }\n if (skipWaitingPeriod) {\n logger.info('skipWaitingPeriod detected - Waiting period will be skipped.');\n }\n\n // Validate request IDs\n if (requestIds.length > 0 && requestIds.length !== requests.length) {\n const missingRequests = difference(\n requestIds,\n requests.map(({ id }) => id),\n );\n if (missingRequests.length > 0) {\n logger.error(\n colors.red(`Failed to find the following requests by ID: ${missingRequests.join(',')}.`),\n );\n process.exit(1);\n }\n }\n\n if (copyIdentifiers) {\n await validateSombraVersion(client, { logger });\n }\n\n // Map over the requests\n let total = 0;\n progressBar.start(requests.length, 0);\n await map(\n requests,\n async (request, ind) => {\n try {\n // Pull the request identifiers\n const requestIdentifiers = copyIdentifiers\n ? await fetchAllRequestIdentifiers(client, sombra, {\n filterBy: { requestId: request.id },\n skipSombraCheck: true,\n logger,\n })\n : [];\n\n // Make the GraphQL request to restart the request\n const requestResponse = await restartPrivacyRequest(\n sombra,\n {\n ...request,\n // override silent mode\n isSilent:\n !!silentModeBefore && new Date(request.createdAt) < silentModeBefore\n ? true\n : request.isSilent,\n },\n {\n requestIdentifiers,\n skipWaitingPeriod,\n sendEmailReceipt,\n emailIsVerified,\n restartIdentifierStrategy,\n },\n );\n\n // Cache successful upload\n const restartedRequests = state.getValue('restartedRequests');\n restartedRequests.push({\n id: requestResponse.id,\n link: requestResponse.link,\n rowIndex: ind,\n coreIdentifier: requestResponse.coreIdentifier,\n attemptedAt: new Date().toISOString(),\n });\n await state.setValue(restartedRequests, 'restartedRequests');\n } catch (err) {\n const msg = `${err.message} - ${JSON.stringify(err.response?.body, null, 2)}`;\n const clientError = extractClientError(msg);\n\n const failingRequests = state.getValue('failingRequests');\n failingRequests.push({\n id: request.id,\n link: request.link,\n rowIndex: ind,\n coreIdentifier: request.coreIdentifier,\n attemptedAt: new Date().toISOString(),\n error: clientError || msg,\n });\n await state.setValue(failingRequests, 'failingRequests');\n }\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n // Log completion time\n logger.info(colors.green(`Completed restarting of requests in \"${totalTime / 1000}\" seconds.`));\n\n // Log errors\n if (state.getValue('failingRequests').length > 0) {\n logger.error(\n colors.red(\n `Encountered \"${state.getValue('failingRequests').length}\" errors. ` +\n `See \"${resolve(cacheFile)}\" to review the error messages and inputs.`,\n ),\n );\n process.exit(1);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bulkRestartRequests-c29oH5GC.mjs","names":[],"sources":["../src/lib/requests/restartPrivacyRequest.ts","../src/lib/requests/bulkRestartRequests.ts"],"sourcesContent":["import { IdentifierType, RestartIdentifierStrategy } from '@transcend-io/privacy-types';\nimport type { RequestIdentifier } from '@transcend-io/sdk';\nimport { apply, decodeCodec } from '@transcend-io/type-utils';\nimport type { Got } from 'got';\nimport * as t from 'io-ts';\nimport { groupBy } from 'lodash-es';\n\nimport type { PrivacyRequest } from '../graphql/index.js';\nimport { IDENTIFIER_BLOCK_LIST } from './constants.js';\nimport { PrivacyRequestResponse } from './submitPrivacyRequest.js';\n\n/**\n * Restart a privacy request to the Transcend API\n *\n * @param sombra - Sombra instance configured to make requests\n * @param request - Request to restart\n * @param input - Request input\n * @returns Successfully submitted request\n */\nexport async function restartPrivacyRequest(\n sombra: Got,\n request: PrivacyRequest,\n {\n sendEmailReceipt = false,\n skipWaitingPeriod = false,\n emailIsVerified = true,\n requestIdentifiers = [],\n restartIdentifierStrategy,\n }: {\n /** List of request identifiers to include */\n requestIdentifiers?: RequestIdentifier[];\n /** When true, send an email receipt to data subject */\n sendEmailReceipt?: boolean;\n /** Whether the email is verified */\n emailIsVerified?: boolean;\n /** Whether to skip waiting period */\n skipWaitingPeriod?: boolean;\n /** How request identifiers should be handled when restarting */\n restartIdentifierStrategy?: RestartIdentifierStrategy;\n } = {},\n): Promise<PrivacyRequestResponse> {\n // Make the GraphQL request\n const response = await sombra\n .post('v1/data-subject-request', {\n json: {\n type: request.type,\n subject: {\n coreIdentifier: request.coreIdentifier,\n email: request.email,\n emailIsVerified,\n ...(requestIdentifiers.length > 0\n ? {\n attestedExtraIdentifiers: apply(\n groupBy(\n requestIdentifiers\n .filter(\n (ri) =>\n // these are already submitted above\n !(ri.name === 'email' && ri.value === request.email) &&\n !IDENTIFIER_BLOCK_LIST.includes(ri.name),\n )\n .map((ri) => ({\n ...ri,\n type: Object.values(IdentifierType).includes(\n ri.name as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n )\n ? ri.name\n : IdentifierType.Custom,\n })),\n 'type',\n ),\n (values, type) =>\n values.map(({ name, value }) => ({\n ...(type === IdentifierType.Custom ? { name } : {}),\n value,\n })),\n ),\n }\n : {}),\n },\n requestId: request.id,\n subjectType: request.subjectType,\n isSilent: request.isSilent,\n isTest: request.isTest,\n locale: request.locale,\n skipWaitingPeriod,\n createdAt: request.createdAt,\n details: `Restarted by Transcend cli: \"tr-request-restart\" - ${request.details}`,\n skipSendingReceipt: !sendEmailReceipt,\n ...(restartIdentifierStrategy ? { restartIdentifierStrategy } : {}),\n },\n })\n .json();\n\n const { request: requestResponse } = decodeCodec(\n t.type({\n request: PrivacyRequestResponse,\n }),\n response,\n );\n return requestResponse;\n}\n","import { join, resolve } from 'node:path';\n\nimport { PersistedState } from '@transcend-io/persisted-state';\nimport {\n RequestAction,\n RequestStatus,\n RestartIdentifierStrategy,\n} from '@transcend-io/privacy-types';\nimport {\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n fetchAllRequestIdentifiers,\n validateSombraVersion,\n} from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\nimport * as t from 'io-ts';\nimport { difference } from 'lodash-es';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { fetchAllRequests } from '../graphql/index.js';\nimport { SuccessfulRequest } from './constants.js';\nimport { extractClientError } from './extractClientError.js';\nimport { restartPrivacyRequest } from './restartPrivacyRequest.js';\n\n/** Minimal state we need to keep a list of requests */\nconst ErrorRequest = t.intersection([\n SuccessfulRequest,\n t.type({\n error: t.string,\n }),\n]);\n\n/** Type override */\ntype ErrorRequest = t.TypeOf<typeof ErrorRequest>;\n\n/** Persist this data between runs of the script */\nconst CachedRequestState = t.type({\n restartedRequests: t.array(SuccessfulRequest),\n failingRequests: t.array(ErrorRequest),\n});\n\n/**\n * Upload a set of privacy requests from CSV\n *\n * @param options - Options\n */\nexport async function bulkRestartRequests({\n requestReceiptFolder,\n auth,\n sombraAuth,\n requestActions,\n requestStatuses,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n transcendUrl = DEFAULT_TRANSCEND_API,\n requestIds = [],\n createdAt = new Date(),\n silentModeBefore,\n sendEmailReceipt = false,\n emailIsVerified = true,\n copyIdentifiers = false,\n restartIdentifierStrategy,\n skipWaitingPeriod = false,\n concurrency = 20,\n}: {\n /** Actions to filter for */\n requestActions: RequestAction[];\n /** Statues to filter for */\n requestStatuses: RequestStatus[];\n /** File where request receipts are stored */\n requestReceiptFolder: string;\n /** Transcend API key authentication */\n auth: string;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** Request IDs to filter for */\n requestIds?: string[];\n /** Whether to re-verify the email when restarting the request */\n emailIsVerified?: boolean;\n /** Filter for requests that were submitted before this date */\n createdAt?: Date;\n /** Requests that have been open for this length of time should be marked as silent mode */\n silentModeBefore?: Date;\n /** Send an email receipt to the restarted requests */\n sendEmailReceipt?: boolean;\n /** Copy over all identifiers rather than restarting the request only with the core identifier */\n copyIdentifiers?: boolean;\n /** How request identifiers should be handled when restarting */\n restartIdentifierStrategy?: RestartIdentifierStrategy;\n /** Skip the waiting period when restarting requests */\n skipWaitingPeriod?: boolean;\n /** Filter for requests created before this date */\n createdAtBefore?: Date;\n /** Filter for requests created after this date */\n createdAtAfter?: Date;\n /** Filter for requests updated before this date */\n updatedAtBefore?: Date;\n /** Filter for requests updated after this date */\n updatedAtAfter?: Date;\n /** Concurrency to upload requests at */\n concurrency?: number;\n}): Promise<void> {\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Create a new state file to store the requests from this run.\n // `toISOString()` contains colons (e.g. 2026-07-06T04:33:12.345Z) which are\n // illegal characters in Windows filenames, so strip them out to keep the\n // auto-generated receipt filename cross-platform.\n const cacheFile = join(\n requestReceiptFolder,\n `tr-request-restart-${new Date().toISOString().replace(/:/g, '-')}.json`,\n );\n const state = new PersistedState(cacheFile, CachedRequestState, {\n restartedRequests: [],\n failingRequests: [],\n });\n\n // Create sombra instance to communicate with\n const sombra = await createSombraGotInstance(transcendUrl, auth, {\n logger,\n sombraApiKey: sombraAuth,\n sombraUrl: process.env.SOMBRA_URL,\n });\n\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n const allRequests = await fetchAllRequests(client, {\n requestIds,\n actions: requestActions,\n statuses: requestStatuses,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n });\n const requests = allRequests.filter((request) => new Date(request.createdAt) < createdAt);\n logger.info(`Found ${requests.length} requests to restart`);\n\n if (copyIdentifiers) {\n logger.info('copyIdentifiers detected - All Identifiers will be copied.');\n }\n if (restartIdentifierStrategy) {\n logger.info(\n `restartIdentifierStrategy detected - Using \"${restartIdentifierStrategy}\" strategy.`,\n );\n }\n if (sendEmailReceipt) {\n logger.info('sendEmailReceipt detected - Email receipts will be sent.');\n }\n if (skipWaitingPeriod) {\n logger.info('skipWaitingPeriod detected - Waiting period will be skipped.');\n }\n\n // Validate request IDs\n if (requestIds.length > 0 && requestIds.length !== requests.length) {\n const missingRequests = difference(\n requestIds,\n requests.map(({ id }) => id),\n );\n if (missingRequests.length > 0) {\n logger.error(\n colors.red(`Failed to find the following requests by ID: ${missingRequests.join(',')}.`),\n );\n process.exit(1);\n }\n }\n\n if (copyIdentifiers) {\n await validateSombraVersion(client, { logger });\n }\n\n // Map over the requests\n let total = 0;\n progressBar.start(requests.length, 0);\n await map(\n requests,\n async (request, ind) => {\n try {\n // Pull the request identifiers\n const requestIdentifiers = copyIdentifiers\n ? await fetchAllRequestIdentifiers(client, sombra, {\n filterBy: { requestId: request.id },\n skipSombraCheck: true,\n logger,\n })\n : [];\n\n // Make the GraphQL request to restart the request\n const requestResponse = await restartPrivacyRequest(\n sombra,\n {\n ...request,\n // override silent mode\n isSilent:\n !!silentModeBefore && new Date(request.createdAt) < silentModeBefore\n ? true\n : request.isSilent,\n },\n {\n requestIdentifiers,\n skipWaitingPeriod,\n sendEmailReceipt,\n emailIsVerified,\n restartIdentifierStrategy,\n },\n );\n\n // Cache successful upload\n const restartedRequests = state.getValue('restartedRequests');\n restartedRequests.push({\n id: requestResponse.id,\n link: requestResponse.link,\n rowIndex: ind,\n coreIdentifier: requestResponse.coreIdentifier,\n attemptedAt: new Date().toISOString(),\n });\n await state.setValue(restartedRequests, 'restartedRequests');\n } catch (err) {\n const msg = `${err.message} - ${JSON.stringify(err.response?.body, null, 2)}`;\n const clientError = extractClientError(msg);\n\n const failingRequests = state.getValue('failingRequests');\n failingRequests.push({\n id: request.id,\n link: request.link,\n rowIndex: ind,\n coreIdentifier: request.coreIdentifier,\n attemptedAt: new Date().toISOString(),\n error: clientError || msg,\n });\n await state.setValue(failingRequests, 'failingRequests');\n }\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n // Log completion time\n logger.info(colors.green(`Completed restarting of requests in \"${totalTime / 1000}\" seconds.`));\n\n // Log errors\n if (state.getValue('failingRequests').length > 0) {\n logger.error(\n colors.red(\n `Encountered \"${state.getValue('failingRequests').length}\" errors. ` +\n `See \"${resolve(cacheFile)}\" to review the error messages and inputs.`,\n ),\n );\n process.exit(1);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e}from"./constants-
|
|
2
|
-
//# sourceMappingURL=bulkRetryEnrichers-
|
|
1
|
+
import{a as e}from"./constants-BesTSxZW.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{r as n}from"./fetchAllRequests-BCHpCeFo.mjs";import{RequestEnricherStatus as r,RequestStatus as i}from"@transcend-io/privacy-types";import{difference as a}from"lodash-es";import o from"colors";import{buildTranscendGraphQLClient as s,fetchAllRequestEnrichers as c,retryRequestEnricher as l}from"@transcend-io/sdk";import{map as u}from"@transcend-io/utils";import d from"cli-progress";async function f({auth:f,requestActions:p=[],createdAtBefore:m,createdAtAfter:h,updatedAtBefore:g,updatedAtAfter:_,transcendUrl:v=e,requestEnricherStatuses:y=Object.values(r),requestIds:b=[],enricherId:x,concurrency:S=20}){let C=new Date().getTime(),w=new d.SingleBar({},d.Presets.shades_classic),T=s(v,f);t.info(o.magenta(`Fetching requests to restart...`));let E=await n(T,{actions:p,statuses:[i.Enriching],createdAtBefore:m,createdAtAfter:h,updatedAtBefore:g,updatedAtAfter:_,requestIds:b}),D=0;if(b.length>0&&b.length!==E.length){let e=a(b,E.map(({id:e})=>e));e.length>0&&(t.error(o.red(`Failed to find the following requests by ID: ${e.join(`,`)}.`)),process.exit(1))}let O=0;w.start(E.length,0),await u(E,async e=>{await u((await c(T,{filterBy:{requestId:e.id},logger:t})).filter(e=>e.enricher.id===x&&y.includes(e.status)),async e=>{await l(T,{id:e.id,logger:t}),D+=1}),O+=1,w.update(O)},{concurrency:S}),w.stop();let k=new Date().getTime()-C;t.info(o.green(`Completed restarting of ${E.length} requests and ${D} enrichers in "${k/1e3}" seconds.`))}export{f as t};
|
|
2
|
+
//# sourceMappingURL=bulkRetryEnrichers-i3oFHWx-.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bulkRetryEnrichers-
|
|
1
|
+
{"version":3,"file":"bulkRetryEnrichers-i3oFHWx-.mjs","names":[],"sources":["../src/lib/requests/bulkRetryEnrichers.ts"],"sourcesContent":["import { RequestAction, RequestEnricherStatus, RequestStatus } from '@transcend-io/privacy-types';\nimport {\n buildTranscendGraphQLClient,\n fetchAllRequestEnrichers,\n retryRequestEnricher,\n} from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\nimport { difference } from 'lodash-es';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { fetchAllRequests } from '../graphql/index.js';\n\n/**\n * Restart a bunch of request enrichers\n *\n * @param options - Options\n */\nexport async function bulkRetryEnrichers({\n auth,\n requestActions = [],\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n transcendUrl = DEFAULT_TRANSCEND_API,\n requestEnricherStatuses = Object.values(RequestEnricherStatus),\n requestIds = [],\n enricherId,\n concurrency = 20,\n}: {\n /** Actions to filter for */\n requestActions?: RequestAction[];\n /** Request enricher statuses to restart - defaults to all statuses */\n requestEnricherStatuses?: RequestEnricherStatus[];\n /** Transcend API key authentication */\n auth: string;\n /** The ID of the enricher to restart */\n enricherId: string;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Request IDs to filter for */\n requestIds?: string[];\n /** Filter for requests created before this date */\n createdAtBefore?: Date;\n /** Filter for requests created after this date */\n createdAtAfter?: Date;\n /** Filter for requests updated before this date */\n updatedAtBefore?: Date;\n /** Filter for requests updated after this date */\n updatedAtAfter?: Date;\n /** Concurrency to upload requests at */\n concurrency?: number;\n}): Promise<void> {\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n logger.info(colors.magenta('Fetching requests to restart...'));\n\n const requests = await fetchAllRequests(client, {\n actions: requestActions,\n statuses: [RequestStatus.Enriching],\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n requestIds,\n });\n\n let totalRestarted = 0;\n\n // Validate request IDs\n if (requestIds.length > 0 && requestIds.length !== requests.length) {\n const missingRequests = difference(\n requestIds,\n requests.map(({ id }) => id),\n );\n if (missingRequests.length > 0) {\n logger.error(\n colors.red(`Failed to find the following requests by ID: ${missingRequests.join(',')}.`),\n );\n process.exit(1);\n }\n }\n\n // Map over the requests\n let total = 0;\n progressBar.start(requests.length, 0);\n await map(\n requests,\n async (request) => {\n // Pull the request identifiers\n const requestEnrichers = await fetchAllRequestEnrichers(client, {\n filterBy: { requestId: request.id },\n logger,\n });\n const requestEnrichersToRestart = requestEnrichers.filter(\n (requestEnricher) =>\n requestEnricher.enricher.id === enricherId &&\n requestEnricherStatuses.includes(requestEnricher.status),\n );\n await map(requestEnrichersToRestart, async (requestEnricher) => {\n await retryRequestEnricher(client, { id: requestEnricher.id, logger });\n totalRestarted += 1;\n });\n\n // Cache successful upload\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n // Log completion time\n logger.info(\n colors.green(\n `Completed restarting of ${requests.length} requests and ${totalRestarted} enrichers in \"${\n totalTime / 1000\n }\" seconds.`,\n ),\n );\n}\n"],"mappings":"wdAoBA,eAAsB,EAAmB,CACvC,OACA,iBAAiB,EAAE,CACnB,kBACA,iBACA,kBACA,iBACA,eAAe,EACf,0BAA0B,OAAO,OAAO,EAAsB,CAC9D,aAAa,EAAE,CACf,aACA,cAAc,IAwBE,CAEhB,IAAM,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAG/E,EAAS,EAA4B,EAAc,EAAK,CAE9D,EAAO,KAAK,EAAO,QAAQ,kCAAkC,CAAC,CAE9D,IAAM,EAAW,MAAM,EAAiB,EAAQ,CAC9C,QAAS,EACT,SAAU,CAAC,EAAc,UAAU,CACnC,kBACA,iBACA,kBACA,iBACA,aACD,CAAC,CAEE,EAAiB,EAGrB,GAAI,EAAW,OAAS,GAAK,EAAW,SAAW,EAAS,OAAQ,CAClE,IAAM,EAAkB,EACtB,EACA,EAAS,KAAK,CAAE,QAAS,EAAG,CAC7B,CACG,EAAgB,OAAS,IAC3B,EAAO,MACL,EAAO,IAAI,gDAAgD,EAAgB,KAAK,IAAI,CAAC,GAAG,CACzF,CACD,QAAQ,KAAK,EAAE,EAKnB,IAAI,EAAQ,EACZ,EAAY,MAAM,EAAS,OAAQ,EAAE,CACrC,MAAM,EACJ,EACA,KAAO,IAAY,CAWjB,MAAM,GAL4B,MAJH,EAAyB,EAAQ,CAC9D,SAAU,CAAE,UAAW,EAAQ,GAAI,CACnC,SACD,CAAC,EACiD,OAChD,GACC,EAAgB,SAAS,KAAO,GAChC,EAAwB,SAAS,EAAgB,OAAO,CAEzB,CAAE,KAAO,IAAoB,CAC9D,MAAM,EAAqB,EAAQ,CAAE,GAAI,EAAgB,GAAI,SAAQ,CAAC,CACtE,GAAkB,GAClB,CAGF,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAGvB,EAAO,KACL,EAAO,MACL,2BAA2B,EAAS,OAAO,gBAAgB,EAAe,iBACxE,EAAY,IACb,YACF,CACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e}from"./constants-
|
|
2
|
-
//# sourceMappingURL=cancelPrivacyRequests-
|
|
1
|
+
import{a as e}from"./constants-BesTSxZW.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{n,o as r}from"./request-C4gYxn1p.mjs";import{r as i}from"./fetchAllRequests-BCHpCeFo.mjs";import{RequestStatus as a}from"@transcend-io/privacy-types";import o from"colors";import{buildTranscendGraphQLClient as s,fetchAllTemplates as c,makeGraphQLRequest as l}from"@transcend-io/sdk";import{map as u}from"@transcend-io/utils";import d from"cli-progress";async function f({requestActions:f,cancellationTitle:p,auth:m,requestIds:h,silentModeBefore:g,createdAtBefore:_,createdAtAfter:v,updatedAtBefore:y,updatedAtAfter:b,statuses:x=[a.Compiling,a.RequestMade,a.Delayed,a.Approving,a.Secondary,a.Enriching,a.Waiting,a.SecondaryApproving],concurrency:S=50,transcendUrl:C=e}){let w=s(C,m),T=new Date().getTime(),E=new d.SingleBar({},d.Presets.shades_classic),D;if(p){let e=(await c(w,{logger:t,filterBy:{title:p}})).find(e=>e.title===p);if(!e)throw Error(`Failed to find a template with title: "${p}"`);D=e}let O=await i(w,{actions:f,createdAtBefore:_,createdAtAfter:v,updatedAtBefore:y,updatedAtAfter:b,statuses:x,requestIds:h});t.info(o.magenta(`Canceling "${O.length}" requests${D?` Using template: ${D.title}`:``}.`));let k=0;E.start(O.length,0),await u(O,async e=>{g&&new Date(g)>new Date(e.createdAt)&&await l(w,r,{variables:{input:{id:e.id,isSilent:!0}},logger:t}),await l(w,n,{variables:{input:{requestId:e.id,...D?{subject:`Re: ${D.subject.defaultMessage}`,template:D.template.defaultMessage}:{}}},logger:t}),k+=1,E.update(k)},{concurrency:S}),E.stop();let A=new Date().getTime()-T;return t.info(o.green(`Successfully canceled ${k} requests in "${A/1e3}" seconds!`)),O.length}export{f as t};
|
|
2
|
+
//# sourceMappingURL=cancelPrivacyRequests-B4IzmRWC.mjs.map
|
package/dist/{cancelPrivacyRequests-SWJzauUB.mjs.map → cancelPrivacyRequests-B4IzmRWC.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cancelPrivacyRequests-
|
|
1
|
+
{"version":3,"file":"cancelPrivacyRequests-B4IzmRWC.mjs","names":[],"sources":["../src/lib/requests/cancelPrivacyRequests.ts"],"sourcesContent":["import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\nimport {\n buildTranscendGraphQLClient,\n fetchAllTemplates,\n makeGraphQLRequest,\n type Template,\n} from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport {\n UPDATE_PRIVACY_REQUEST,\n fetchAllRequests,\n CANCEL_PRIVACY_REQUEST,\n} from '../graphql/index.js';\n\n/**\n * Cancel a set of privacy requests\n *\n * @param options - Options\n * @returns The number of requests canceled\n */\nexport async function cancelPrivacyRequests({\n requestActions,\n cancellationTitle,\n auth,\n requestIds,\n silentModeBefore,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n statuses = [\n RequestStatus.Compiling,\n RequestStatus.RequestMade,\n RequestStatus.Delayed,\n RequestStatus.Approving,\n RequestStatus.Secondary,\n RequestStatus.Enriching,\n RequestStatus.Waiting,\n RequestStatus.SecondaryApproving,\n ],\n concurrency = 50,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** The request actions that should be restarted */\n requestActions: RequestAction[];\n /** Transcend API key authentication */\n auth: string;\n /** Concurrency limit for approving */\n concurrency?: number;\n /** The request statuses to cancel */\n statuses?: RequestStatus[];\n /** The set of privacy requests to cancel */\n requestIds?: string[];\n /** Mark these requests as silent mode if they were created before this date */\n silentModeBefore?: Date;\n /** Filter for requests created before this date */\n createdAtBefore?: Date;\n /** Filter for requests created after this date */\n createdAtAfter?: Date;\n /** Filter for requests updated before this date */\n updatedAtBefore?: Date;\n /** Filter for requests updated after this date */\n updatedAtAfter?: Date;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** The email template to use when canceling the requests */\n cancellationTitle?: string;\n}): Promise<number> {\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Grab the template with that title\n let cancelationTemplate: Template | undefined;\n if (cancellationTitle) {\n const matchingTemplates = await fetchAllTemplates(client, {\n logger,\n filterBy: { title: cancellationTitle },\n });\n const exactTitleMatch = matchingTemplates.find(\n (template) => template.title === cancellationTitle,\n );\n if (!exactTitleMatch) {\n throw new Error(`Failed to find a template with title: \"${cancellationTitle}\"`);\n }\n cancelationTemplate = exactTitleMatch;\n }\n\n // Pull in the requests\n const allRequests = await fetchAllRequests(client, {\n actions: requestActions,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n statuses,\n requestIds,\n });\n\n // Notify Transcend\n logger.info(\n colors.magenta(\n `Canceling \"${allRequests.length}\" requests${\n cancelationTemplate ? ` Using template: ${cancelationTemplate.title}` : ''\n }.`,\n ),\n );\n\n let total = 0;\n progressBar.start(allRequests.length, 0);\n await map(\n allRequests,\n async (requestToCancel) => {\n // update request to silent mode if silentModeBefore is defined\n // and the request was created before silentModeBefore\n if (silentModeBefore && new Date(silentModeBefore) > new Date(requestToCancel.createdAt)) {\n await makeGraphQLRequest(client, UPDATE_PRIVACY_REQUEST, {\n variables: {\n input: {\n id: requestToCancel.id,\n isSilent: true,\n },\n },\n logger,\n });\n }\n\n // cancel the request\n await makeGraphQLRequest(client, CANCEL_PRIVACY_REQUEST, {\n variables: {\n input: {\n requestId: requestToCancel.id,\n ...(cancelationTemplate\n ? {\n subject: `Re: ${cancelationTemplate.subject.defaultMessage}`,\n template: cancelationTemplate.template.defaultMessage,\n }\n : {}),\n },\n },\n logger,\n });\n\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(\n colors.green(`Successfully canceled ${total} requests in \"${totalTime / 1000}\" seconds!`),\n );\n return allRequests.length;\n}\n"],"mappings":"0bAyBA,eAAsB,EAAsB,CAC1C,iBACA,oBACA,OACA,aACA,mBACA,kBACA,iBACA,kBACA,iBACA,WAAW,CACT,EAAc,UACd,EAAc,YACd,EAAc,QACd,EAAc,UACd,EAAc,UACd,EAAc,UACd,EAAc,QACd,EAAc,mBACf,CACD,cAAc,GACd,eAAe,GA0BG,CAElB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAGjF,EACJ,GAAI,EAAmB,CAKrB,IAAM,GAAkB,MAJQ,EAAkB,EAAQ,CACxD,SACA,SAAU,CAAE,MAAO,EAAmB,CACvC,CAAC,EACwC,KACvC,GAAa,EAAS,QAAU,EAClC,CACD,GAAI,CAAC,EACH,MAAU,MAAM,0CAA0C,EAAkB,GAAG,CAEjF,EAAsB,EAIxB,IAAM,EAAc,MAAM,EAAiB,EAAQ,CACjD,QAAS,EACT,kBACA,iBACA,kBACA,iBACA,WACA,aACD,CAAC,CAGF,EAAO,KACL,EAAO,QACL,cAAc,EAAY,OAAO,YAC/B,EAAsB,oBAAoB,EAAoB,QAAU,GACzE,GACF,CACF,CAED,IAAI,EAAQ,EACZ,EAAY,MAAM,EAAY,OAAQ,EAAE,CACxC,MAAM,EACJ,EACA,KAAO,IAAoB,CAGrB,GAAoB,IAAI,KAAK,EAAiB,CAAG,IAAI,KAAK,EAAgB,UAAU,EACtF,MAAM,EAAmB,EAAQ,EAAwB,CACvD,UAAW,CACT,MAAO,CACL,GAAI,EAAgB,GACpB,SAAU,GACX,CACF,CACD,SACD,CAAC,CAIJ,MAAM,EAAmB,EAAQ,EAAwB,CACvD,UAAW,CACT,MAAO,CACL,UAAW,EAAgB,GAC3B,GAAI,EACA,CACE,QAAS,OAAO,EAAoB,QAAQ,iBAC5C,SAAU,EAAoB,SAAS,eACxC,CACD,EAAE,CACP,CACF,CACD,SACD,CAAC,CAEF,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAKvB,OAHA,EAAO,KACL,EAAO,MAAM,yBAAyB,EAAM,gBAAgB,EAAY,IAAK,YAAY,CAC1F,CACM,EAAY"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,i as t}from"./enums-D53y231X.mjs";import{ActionItemCode as ee,ActionItemPriorityOverride as te,AssessmentFormStatus as ne,AssessmentFormTemplateSource as re,AssessmentFormTemplateStatus as ie,AssessmentQuestionSubType as ae,AssessmentQuestionType as oe,AssessmentSyncColumn as se,AssessmentSyncModel as ce,AssessmentsDisplayLogicAction as le,AttributeKeyType as ue,AttributeSupportedResourceType as n,BrowserTimeZone as de,CodePackageType as r,CollectDataSubjectRegions as fe,ComparisonOperator as pe,ConfigurableColorPaletteColor as me,ConsentBundleType as he,ConsentPrecedenceOption as ge,ConsentThemeInput as _e,ConsentTrackerStatus as i,ConsentVariantInput as ve,Controllership as ye,DataCategoryType as a,DataFlowScope as o,DataProtectionImpactAssessmentStatus as be,DefaultConsentOption as xe,EnricherType as Se,IsoCountryCode as s,IsoCountrySubdivisionCode as c,LargeLanguageModelClient as Ce,LogicOperator as we,PreferenceStoreAuthLevel as Te,PreferenceTopicType as Ee,PreflightRequestStatus as De,PrivacyCenterComponentStyles as Oe,PrivacyCenterFooterLayout as ke,PrivacyCenterTextStyles as Ae,ProcessingPurpose as l,PromptAVendorEmailCompletionLinkType as je,PromptAVendorEmailSendType as Me,PromptFilePurpose as Ne,RegionDetectionMethod as Pe,RegionsOperator as Fe,RequestAction as u,RequestActionObjectResolver as d,RetentionScheduleOperation as Ie,RetentionScheduleType as Le,RetentionType as Re,ScopeName as ze,SignedIabAgreementOption as Be,SubDataPointDataSubCategoryGuessStatus as Ve,TelemetryPartitionStrategy as He,TranscendProduct as Ue,UnknownRequestPolicy as f,UnstructuredSubDataPointRecommendationStatus as We,WorkflowConfigType as Ge,WorkflowConfigVisibility as Ke}from"@transcend-io/privacy-types";import{applyEnum as p,valuesOf as m}from"@transcend-io/type-utils";import{BrowserLanguage as qe,InitialViewState as Je,OnConsentExpiry as Ye,UserPrivacySignalEnum as Xe}from"@transcend-io/airgap.js-types";import{LOCALE_KEY as h}from"@transcend-io/internationalization";import*as g from"io-ts";const _=({TEnabledRoutes:e})=>g.type({enabledRoutes:e}),v=({TRouteName:t})=>g.type({routeName:t,enabledPolicies:g.array(m(e))}),y=g.type({title:g.string}),b=g.intersection([g.type({name:g.string,value:g.string}),g.partial({isSecret:g.boolean})]),x=g.type({title:g.string}),S=g.intersection([g.type({name:g.string,description:g.string}),g.partial({"sso-department":g.string,"sso-group":g.string,"sso-title":g.string,"parent-team-name":g.string,users:g.array(g.string),scopes:g.array(m(ze))})]),C=g.intersection([g.type({title:g.string,"output-identifiers":g.array(g.string)}),g.partial({description:g.string,url:g.string,type:m(Se),"input-identifier":g.string,testRegex:g.string,lookerQueryTitle:g.string,expirationDuration:g.number,transitionRequestStatus:m(De),phoneNumbers:g.array(g.string),regionList:g.array(m({...s,...c})),"data-subjects":g.array(g.string),headers:g.array(b),"privacy-actions":g.array(m(u))})]),w=g.intersection([g.type({purpose:m(l)}),g.partial({name:g.string})]),T=g.intersection([g.type({category:m(a)}),g.partial({name:g.string})]),E=g.intersection([g.type({category:T,status:m(Ve),confidence:g.number}),g.partial({classifierVersion:g.number})]),Ze=g.intersection([g.type({category:T,status:m(We),confidence:g.number}),g.partial({classifierVersion:g.number})]),D=g.intersection([g.type({name:g.string}),g.partial({description:g.string,color:g.string})]),O=g.intersection([g.type({name:g.string,type:m(ue)}),g.partial({description:g.string,resources:g.array(m(n)),values:g.array(D)})]),k=g.type({key:g.string,values:g.array(g.string)}),A=g.intersection([g.type({name:g.string,instructions:g.string,agentId:g.string,codeInterpreterEnabled:g.boolean,retrievalEnabled:g.boolean,"large-language-model":g.type({name:g.string,client:m(Ce)})}),g.partial({description:g.string,prompt:g.string,owners:g.array(g.string),teams:g.array(g.string),"agent-functions":g.array(g.string),"agent-files":g.array(g.string)})]),j=g.type({name:g.string,description:g.string,parameters:g.string}),M=g.intersection([g.type({name:g.string,fileId:g.string,size:g.number,purpose:m(Ne)}),g.partial({description:g.string})]),N=g.intersection([g.type({title:g.string}),g.partial({description:g.string,dataProcessingAgreementLink:g.string,contactName:g.string,contactPhone:g.string,address:g.string,headquarterCountry:m(s),headquarterSubDivision:m(c),websiteUrl:g.string,businessEntity:g.string,owners:g.array(g.string),teams:g.array(g.string),attributes:g.array(k)})]),P=g.intersection([g.type({name:g.string,category:m(a)}),g.partial({description:g.string,regex:g.string,owners:g.array(g.string),teams:g.array(g.string),attributes:g.array(k)})]),F=g.intersection([g.type({name:g.string,purpose:m(l)}),g.partial({description:g.string,owners:g.array(g.string),teams:g.array(g.string),attributes:g.array(k)})]),I=g.type({title:g.string,content:g.string}),L=g.type({title:g.string,content:g.string}),R=g.type({title:g.string,description:g.string,prompts:g.array(g.string)}),z=g.intersection([g.type({key:g.string}),g.partial({title:g.string,description:g.union([g.string,g.null]),purposes:g.array(w),categories:g.array(T),"guessed-categories":g.array(E),"access-request-visibility-enabled":g.boolean,"erasure-request-redaction-enabled":g.boolean,attributes:g.array(k)})]),B=g.intersection([g.type({key:g.string}),g.partial({path:g.array(g.string),title:g.string,description:g.string,"data-collection-tag":g.string,"privacy-action-queries":g.partial(p(d,()=>g.string)),"privacy-actions":g.array(m(d)),fields:g.array(z),owners:g.array(g.string),teams:g.array(g.string)})]),V=g.partial({"notify-email-address":g.string,"send-frequency":g.number,"send-type":m(Me),"include-identifiers-attachment":g.boolean,"completion-link-type":m(je),"manual-work-retry-frequency":g.string}),H=g.intersection([g.type({title:g.string}),g.partial({description:g.string,address:g.string,headquarterCountry:m(s),headquarterSubDivision:m(c),dataProtectionOfficerName:g.string,dataProtectionOfficerEmail:g.string,attributes:g.array(k),owners:g.array(g.string),teams:g.array(g.string)})]),U=g.partial({country:m(s),countrySubDivision:m(c)}),Qe=g.intersection([g.type({title:g.string}),g.partial({description:g.string,securityMeasureDetails:g.string,controllerships:g.array(m(ye)),storageRegions:g.array(U),transferRegions:g.array(U),retentionType:m(Re),retentionPeriod:g.number,dataProtectionImpactAssessmentLink:g.string,dataProtectionImpactAssessmentStatus:m(be),attributes:g.array(k),dataSiloTitles:g.array(g.string),dataSubjectTypes:g.array(g.string),teamNames:g.array(g.string),ownerEmails:g.array(g.string),processingSubPurposes:g.array(w),dataSubCategories:g.array(T),saaSCategories:g.array(g.string)})]),$e=g.intersection([g.type({name:g.string,codePackageType:m(r)}),g.partial({description:g.string,repositoryUrl:g.string,catalogIntegrationName:g.string,documentationLinks:g.array(g.string),ownerEmails:g.array(g.string),teamNames:g.array(g.string)})]),W=g.intersection([g.type({name:g.string}),g.partial({version:g.string,isDevDependency:g.boolean})]),et=g.intersection([g.type({name:g.string,type:m(r),relativePath:g.string,repositoryName:g.string}),g.partial({description:g.string,softwareDevelopmentKits:g.array(W),teamNames:g.array(g.string),ownerEmails:g.array(g.string)})]),tt=g.intersection([g.type({name:g.string,url:g.string}),g.partial({description:g.string,teamNames:g.array(g.string),ownerEmails:g.array(g.string)})]),G=g.intersection([g.type({type:g.string}),g.partial({active:g.boolean,title:g.string,adminDashboardDefaultSilentMode:g.boolean,actions:g.array(m(u))})]),K=g.intersection([g.type({type:m(u)}),g.partial({skipSecondaryIfNoFiles:g.boolean,skipDownloadableStep:g.boolean,requiresReview:g.boolean,waitingPeriod:g.number,regionDetectionMethod:m(Pe),regionList:g.array(m({...s,...c})),regionBlockList:g.array(m({...s,...c}))})]),q=g.intersection([g.type({name:g.string,type:g.string}),g.partial({regex:g.string,selectOptions:g.array(g.string),privacyCenterVisibility:g.array(m(u)),dataSubjects:g.array(g.string),isRequiredInForm:g.boolean,placeholder:g.string,displayTitle:g.string,displayDescription:g.string,displayOrder:g.number,isUniqueOnPreferenceStore:g.boolean})]),nt=g.intersection([g.type({value:g.string,type:m(o)}),g.partial({description:g.string,trackingPurposes:g.array(g.string),service:g.string,status:m(i),owners:g.array(g.string),teams:g.array(g.string),attributes:g.array(k)})]),rt=g.intersection([g.type({name:g.string}),g.partial({isRegex:g.boolean,description:g.string,trackingPurposes:g.array(g.string),service:g.string,status:m(i),owners:g.array(g.string),teams:g.array(g.string),attributes:g.array(k)})]),it=g.intersection([g.type({name:g.string}),g.partial({displayName:g.string,regions:g.array(U),onConsentExpiry:m(Ye),consentExpiry:g.number,operator:m(Fe),displayPriority:g.number,viewState:m(Je),purposes:g.array(g.type({trackingType:g.string})),optedOutPurposes:g.array(g.type({trackingType:g.string})),browserLanguages:g.array(m(qe)),browserTimeZones:g.array(m(de)),consentUiVariantSlug:g.string})]),at=g.intersection([g.type({name:g.string}),g.partial({partition:g.string})]),ot=g.partial({version:g.string,bundleUrls:g.record(m(he),g.string),domains:g.array(g.string),partition:g.string,consentPrecedence:m(ge),unknownRequestPolicy:m(f),unknownCookiePolicy:m(f),syncEndpoint:g.string,telemetryPartitioning:m(He),signedIabAgreement:m(Be),experiences:g.array(it),theme:g.partial({primaryColor:g.string,fontColor:g.string,privacyPolicy:g.string,prompt:g.number}),syncGroups:g.string,consentVariants:g.array(ve),consentThemes:g.array(_e)}),st=g.partial({isDisabled:g.boolean,showPrivacyRequestButton:g.boolean,showPolicies:g.boolean,showTrackingTechnologies:g.boolean,showCookies:g.boolean,showDataFlows:g.boolean,showConsentManager:g.boolean,showManageYourPrivacy:g.boolean,showMarketingPreferences:g.boolean,locales:g.array(m(h)),defaultLocale:m(h),preferBrowserDefaultLocale:g.boolean,supportEmail:g.string,replyToEmail:g.string,useNoReplyEmailAddress:g.boolean,useCustomEmailDomain:g.boolean,transformAccessReportJsonToCsv:g.boolean,home:g.string,expandSideMenuByDefault:g.boolean,workflowsCustomFieldsRequired:g.boolean,displayedChildOrganizationUris:g.array(g.string),footerLayout:m(ke),footerLinks:g.array(g.intersection([g.type({title:g.string}),g.partial({url:g.string,iconOnly:g.boolean})])),theme:g.partial({colors:g.partial(p(me,()=>g.string)),componentStyles:Oe,textStyles:Ae})}),ct=g.intersection([g.type({title:g.string}),g.partial({effectiveOn:g.string,disableEffectiveOn:g.boolean,content:g.string,disabledLocales:g.array(m(h))})]),lt=g.intersection([g.type({id:g.string}),g.partial({targetReactIntlId:g.string,description:g.string,defaultMessage:g.string,translations:g.partial(p(h,()=>g.string))})]),ut=g.intersection([g.type({title:g.string,integrationName:g.string}),g.partial({"outer-type":g.string,description:g.string,url:g.string,"api-key-title":g.string,"sombra-id":g.string,headers:g.array(b),"data-subjects":g.array(g.string),"identity-keys":g.array(g.string),"deletion-dependencies":g.array(g.string),owners:g.array(g.string),teams:g.array(g.string),disabled:g.boolean,datapoints:g.array(B),"email-settings":V,country:m(s),countrySubDivision:m(c),attributes:g.array(k),businessEntityTitles:g.array(g.string)})]),dt=g.intersection([g.type({title:g.string,productLine:m(Ue)}),g.partial({description:g.string,hidden:g.boolean})]),ft=g.intersection([g.type({title:g.string,type:m(ee),collections:g.array(g.string)}),g.partial({priority:m(te),customerExperienceActionItemId:g.string,dueDate:g.string,resolved:g.boolean,notes:g.string,link:g.string,users:g.array(g.string),teams:g.array(g.string),attributes:g.array(k)})]),J=g.intersection([g.type({"depends-on-question-reference-id":g.string,"comparison-operator":m(pe)}),g.partial({"comparison-operands":g.array(g.string)})]),pt=g.recursion(`AssessmentNestedRuleInput`,e=>g.intersection([g.type({"logic-operator":m(we)}),g.partial({rules:g.array(J),"nested-rules":g.array(e)})])),mt=g.intersection([g.type({action:m(le)}),g.partial({rule:J,"nested-rule":pt})]),ht=g.partial({"risk-level":g.string,"risk-matrix-column":g.string,"risk-matrix-row":g.string}),gt=g.intersection([g.type({"comparison-operands":g.array(g.string),"comparison-operator":m(pe)}),g.partial({"risk-level":g.string,"risk-matrix-column":g.string,"risk-matrix-row":g.string})]),_t=g.type({value:g.string}),vt=g.intersection([g.type({title:g.string,type:m(oe)}),g.partial({"sub-type":m(ae),placeholder:g.string,description:g.string,"is-required":g.boolean,"reference-id":g.string,"display-logic":mt,"risk-logic":g.array(gt),"risk-categories":g.array(g.string),"risk-framework":g.string,"answer-options":g.array(_t),"selected-answers":g.array(g.string),"allowed-mime-types":g.array(g.string),"allow-select-other":g.boolean,"sync-model":m(ce),"sync-column":m(se),"attribute-key":g.string,"require-risk-evaluation":g.boolean,"require-risk-matrix-evaluation":g.boolean})]),Y=g.intersection([g.type({title:g.string,questions:g.array(vt)}),g.partial({assignees:g.array(g.string),"external-assignees":g.array(g.string),status:g.string,"is-reviewed":g.boolean})]),X=g.type({type:m(Le),"duration-days":g.number,operand:m(Ie)}),yt=g.intersection([g.type({title:g.string}),g.partial({sections:g.array(Y),description:g.string,status:m(ie),source:m(re),creator:g.string,locked:g.boolean,"parent-id":g.string,archived:g.boolean,"created-at":g.string,"attribute-keys":g.array(g.string),"retention-schedule":X,templates:g.array(g.string)})]),Z=g.type({title:g.string,type:m(n)}),bt=g.intersection([g.type({title:g.string,group:g.string}),g.partial({sections:g.array(Y),creator:g.string,description:g.string,status:m(ne),assignees:g.array(g.string),"external-assignees":g.array(g.string),reviewers:g.array(g.string),locked:g.boolean,archived:g.boolean,external:g.boolean,"title-is-internal":g.boolean,"due-date":g.string,"created-at":g.string,"assigned-at":g.string,"submitted-at":g.string,"approved-at":g.string,"rejected-at":g.string,resources:g.array(Z),rows:g.array(Z),"retention-schedule":X,attributes:g.array(k)})]),Q=g.type({title:g.string,slug:g.string}),xt=g.intersection([g.type({type:m(Ee),title:g.string,description:g.string,slug:g.string}),g.partial({color:g.string,"default-configuration":g.string,"show-in-privacy-center":g.boolean,options:g.array(Q)})]),St=g.intersection([g.type({trackingType:g.string,title:g.string,name:g.string}),g.partial({description:g.string,"is-active":g.boolean,configurable:g.boolean,"display-order":g.number,"show-in-privacy-center":g.boolean,"show-in-consent-manager":g.boolean,"preference-topics":g.array(xt),"auth-level":m(Te),"opt-out-signals":g.array(m(Xe)),"default-consent":m(xe)})]),Ct=g.intersection([g.type({title:g.string,"action-type":m(u)}),g.partial({"internal-name":g.string,subtitle:g.string,description:g.string,"data-subject-type":g.string,visibility:m(Ke),type:m(Ge),"collect-data-subject-regions":m(fe),"region-list":g.array(m({...s,...c})),"expiry-time":g.array(g.type({region:m({default:`default`,...s,...c}),value:g.number})),"attribute-keys":g.array(g.string)})]),wt=g.intersection([g.type({resourceId:g.string,plugin:g.string,suggestedCatalog:g.string,containsSensitiveData:g.string,status:g.string}),g.partial({country:m(s),countrySubDivision:m(c),plaintextContext:g.string,title:g.union([g.string,g.null])})]),Tt=g.partial({"action-items":g.array(ft),"action-item-collections":g.array(dt),"api-keys":g.array(x),teams:g.array(S),templates:g.array(y),enrichers:g.array(C),attributes:g.array(O),"business-entities":g.array(H),vendors:g.array(N),"data-categories":g.array(P),"processing-purposes":g.array(F),"data-subjects":g.array(G),actions:g.array(K),identifiers:g.array(q),"data-silos":g.array(ut),"data-flows":g.array(nt),cookies:g.array(rt),"consent-manager":ot,prompts:g.array(I),"prompt-partials":g.array(L),"prompt-groups":g.array(R),agents:g.array(A),"agent-functions":g.array(j),"agent-files":g.array(M),"privacy-center":st,policies:g.array(ct),messages:g.array(lt),partitions:g.array(at),"assessment-templates":g.array(yt),assessments:g.array(bt),"processing-activities":g.array(Qe),purposes:g.array(St),"system-discovery":g.array(wt),"workflow-configs":g.array(Ct),"preference-options":g.array(Q)}),Et=g.type({organizationName:g.string,apiKey:g.string,organizationId:g.string}),Dt=g.intersection([g.type({"Connections Made To":g.string,Type:m(o),Purpose:g.string}),g.partial({Service:g.string,Notes:g.string,Owners:g.string,Teams:g.string,Status:m(i)}),g.record(g.string,g.string)]),Ot=g.intersection([g.type({Name:g.string,Purpose:g.string}),g.partial({Service:g.string,Notes:g.string,Owners:g.string,Teams:g.string,Status:m(i)}),g.record(g.string,g.string)]),kt=g.type({title:g.string,description:g.string,cookies:g.array(g.type({name:g.string,trackingPurposes:g.array(g.string)})),dataFlows:g.array(g.type({value:g.string,type:m(o),trackingPurposes:g.array(g.string)}))}),At=m(e),jt=v({TRouteName:m(t)});m(t);const Mt=g.array(jt),$=_({TEnabledRoutes:Mt}),Nt=g.partial({enabledIntegrations:g.partial({openAI:$})}),Pt=g.partial({promptRunName:g.string,promptId:g.string,promptTitle:g.string,promptGroupId:g.string,promptGroupTitle:g.string,runByEmployeeEmail:g.string,applicationId:g.string,applicationName:g.string,codePackageName:g.string,repositoryName:g.string,applicationUserCoreIdentifier:g.string,applicationUserName:g.string,slackMessageTs:g.string,slackTeamId:g.string,slackChannelId:g.string,slackChannelName:g.string}),Ft=g.intersection([g.type({title:g.string}),g.partial({value:g.string})]),It=g.type({columns:g.array(Ft)}),Lt=g.partial({rows:g.array(It),json:g.string});export{ct as $,Ot as A,B,W as C,xt as D,kt as E,Ze as F,lt as G,z as H,Dt as I,$ as J,jt as K,nt as L,E as M,P as N,Q as O,T as P,Pt as Q,ut as R,et as S,_ as St,ot as T,q as U,C as V,Lt as W,Nt as X,at as Y,At as Z,yt as _,Tt as _t,j as a,R as at,D as b,Ct as bt,_t as c,U as ct,pt as d,gt as dt,st as et,Z as f,wt as ft,vt as g,y as gt,Y as h,S as ht,M as i,V as it,rt as j,St as k,mt as l,tt as lt,J as m,Et as mt,dt as n,F as nt,A as o,I as ot,X as p,$e as pt,Mt as q,ft as r,w as rt,x as s,L as st,K as t,Qe as tt,bt as u,ht as ut,O as v,N as vt,it as w,H as x,v as xt,k as y,b as yt,G as z};
|
|
2
|
+
//# sourceMappingURL=codecs-CbOFsh1R.mjs.map
|