@transcend-io/cli 10.0.0 → 10.0.1
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/dist/{app-By_zDIkK.mjs → app-BfTrk2nc.mjs} +19 -19
- package/dist/{app-By_zDIkK.mjs.map → app-BfTrk2nc.mjs.map} +1 -1
- package/dist/{approvePrivacyRequests-1cguqGqq.mjs → approvePrivacyRequests-CWGZR2N6.mjs} +2 -2
- package/dist/{approvePrivacyRequests-1cguqGqq.mjs.map → approvePrivacyRequests-CWGZR2N6.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/{buildXdiSyncEndpoint-BMaMHO7Z.mjs → buildXdiSyncEndpoint-Cb-pvpak.mjs} +2 -2
- package/dist/{buildXdiSyncEndpoint-BMaMHO7Z.mjs.map → buildXdiSyncEndpoint-Cb-pvpak.mjs.map} +1 -1
- package/dist/{bulkRestartRequests-DEPSHov-.mjs → bulkRestartRequests-CKF_xpN0.mjs} +2 -2
- package/dist/{bulkRestartRequests-DEPSHov-.mjs.map → bulkRestartRequests-CKF_xpN0.mjs.map} +1 -1
- package/dist/{bulkRetryEnrichers-BLkcFKXC.mjs → bulkRetryEnrichers-B-Szmin-.mjs} +2 -2
- package/dist/{bulkRetryEnrichers-BLkcFKXC.mjs.map → bulkRetryEnrichers-B-Szmin-.mjs.map} +1 -1
- package/dist/{cancelPrivacyRequests-C8MZQvsq.mjs → cancelPrivacyRequests-DNiL13E_.mjs} +2 -2
- package/dist/{cancelPrivacyRequests-C8MZQvsq.mjs.map → cancelPrivacyRequests-DNiL13E_.mjs.map} +1 -1
- package/dist/{command-BUnCUxva.mjs → command-BXxoAjFo.mjs} +2 -2
- package/dist/{command-BUnCUxva.mjs.map → command-BXxoAjFo.mjs.map} +1 -1
- package/dist/{createExtraKeyHandler-C_0EVj10.mjs → createExtraKeyHandler-tubeaEjA.mjs} +2 -2
- package/dist/createExtraKeyHandler-tubeaEjA.mjs.map +1 -0
- package/dist/{createPreferenceAccessTokens-6WLr6z-l.mjs → createPreferenceAccessTokens-DqmFctn3.mjs} +2 -2
- package/dist/{createPreferenceAccessTokens-6WLr6z-l.mjs.map → createPreferenceAccessTokens-DqmFctn3.mjs.map} +1 -1
- package/dist/{createSombraGotInstance-CahOgD6V.mjs → createSombraGotInstance-D1Il9zUE.mjs} +2 -2
- package/dist/{createSombraGotInstance-CahOgD6V.mjs.map → createSombraGotInstance-D1Il9zUE.mjs.map} +1 -1
- package/dist/{downloadPrivacyRequestFiles-B2yduagB.mjs → downloadPrivacyRequestFiles-DlpgxqHF.mjs} +2 -2
- package/dist/{downloadPrivacyRequestFiles-B2yduagB.mjs.map → downloadPrivacyRequestFiles-DlpgxqHF.mjs.map} +1 -1
- package/dist/{fetchAllActions-C0l3wjQV.mjs → fetchAllActions-BJsPdnxy.mjs} +2 -2
- package/dist/{fetchAllActions-C0l3wjQV.mjs.map → fetchAllActions-BJsPdnxy.mjs.map} +1 -1
- package/dist/{fetchAllDataFlows-AQ9j_NRa.mjs → fetchAllDataFlows-D248lO6_.mjs} +2 -2
- package/dist/{fetchAllDataFlows-AQ9j_NRa.mjs.map → fetchAllDataFlows-D248lO6_.mjs.map} +1 -1
- package/dist/{fetchAllPreferenceTopics-Bn9PG-rO.mjs → fetchAllPreferenceTopics-ForE9GpZ.mjs} +2 -2
- package/dist/{fetchAllPreferenceTopics-Bn9PG-rO.mjs.map → fetchAllPreferenceTopics-ForE9GpZ.mjs.map} +1 -1
- package/dist/{fetchAllPurposes-CykSkZRY.mjs → fetchAllPurposes-ZdkO2fMp.mjs} +2 -2
- package/dist/{fetchAllPurposes-CykSkZRY.mjs.map → fetchAllPurposes-ZdkO2fMp.mjs.map} +1 -1
- package/dist/fetchAllPurposesAndPreferences-DD6OyA5t.mjs +2 -0
- package/dist/{fetchAllPurposesAndPreferences-Dog6N9L2.mjs.map → fetchAllPurposesAndPreferences-DD6OyA5t.mjs.map} +1 -1
- package/dist/{fetchAllRequestEnrichers-q34mRuE5.mjs → fetchAllRequestEnrichers-CK-kk5eg.mjs} +2 -2
- package/dist/{fetchAllRequestEnrichers-q34mRuE5.mjs.map → fetchAllRequestEnrichers-CK-kk5eg.mjs.map} +1 -1
- package/dist/{fetchAllRequestIdentifiers-YP-geTV4.mjs → fetchAllRequestIdentifiers-DrFFOt0m.mjs} +2 -2
- package/dist/{fetchAllRequestIdentifiers-YP-geTV4.mjs.map → fetchAllRequestIdentifiers-DrFFOt0m.mjs.map} +1 -1
- package/dist/{fetchAllRequests-DEPTEUbi.mjs → fetchAllRequests-DNQQsY4s.mjs} +2 -2
- package/dist/{fetchAllRequests-DEPTEUbi.mjs.map → fetchAllRequests-DNQQsY4s.mjs.map} +1 -1
- package/dist/{fetchApiKeys-DkBco7W0.mjs → fetchApiKeys-DjOr44xA.mjs} +2 -2
- package/dist/{fetchApiKeys-DkBco7W0.mjs.map → fetchApiKeys-DjOr44xA.mjs.map} +1 -1
- package/dist/{fetchCatalogs-CBk871k6.mjs → fetchCatalogs-BM4FCbcS.mjs} +2 -2
- package/dist/{fetchCatalogs-CBk871k6.mjs.map → fetchCatalogs-BM4FCbcS.mjs.map} +1 -1
- package/dist/{fetchConsentManagerId-DHDA5Py9.mjs → fetchConsentManagerId-CFkg3-RS.mjs} +2 -2
- package/dist/{fetchConsentManagerId-DHDA5Py9.mjs.map → fetchConsentManagerId-CFkg3-RS.mjs.map} +1 -1
- package/dist/{fetchIdentifiers-DjqjUnaw.mjs → fetchIdentifiers-pjQV4vUg.mjs} +2 -2
- package/dist/{fetchIdentifiers-DjqjUnaw.mjs.map → fetchIdentifiers-pjQV4vUg.mjs.map} +1 -1
- package/dist/{fetchRequestDataSilo-CF6XOTQ-.mjs → fetchRequestDataSilo-P4yA7Lyc.mjs} +2 -2
- package/dist/{fetchRequestDataSilo-CF6XOTQ-.mjs.map → fetchRequestDataSilo-P4yA7Lyc.mjs.map} +1 -1
- package/dist/{fetchRequestFilesForRequest-DrHGOdih.mjs → fetchRequestFilesForRequest-BbxrEKFK.mjs} +2 -2
- package/dist/{fetchRequestFilesForRequest-DrHGOdih.mjs.map → fetchRequestFilesForRequest-BbxrEKFK.mjs.map} +1 -1
- package/dist/{generateCrossAccountApiKeys-F11uqpc5.mjs → generateCrossAccountApiKeys-Bxc_dzMG.mjs} +2 -2
- package/dist/{generateCrossAccountApiKeys-F11uqpc5.mjs.map → generateCrossAccountApiKeys-Bxc_dzMG.mjs.map} +1 -1
- package/dist/{impl-0ooudQ_J2.mjs → impl-4ltdSmpl2.mjs} +2 -2
- package/dist/{impl-0ooudQ_J2.mjs.map → impl-4ltdSmpl2.mjs.map} +1 -1
- package/dist/{impl-BzupMfJi.mjs → impl-B19fH75P.mjs} +2 -2
- package/dist/{impl-BzupMfJi.mjs.map → impl-B19fH75P.mjs.map} +1 -1
- package/dist/{impl-CdoTu8TH.mjs → impl-BBMjv5YQ.mjs} +2 -2
- package/dist/{impl-CdoTu8TH.mjs.map → impl-BBMjv5YQ.mjs.map} +1 -1
- package/dist/{impl-Cwj9LeEI.mjs → impl-BKH3QRLi.mjs} +2 -2
- package/dist/{impl-Cwj9LeEI.mjs.map → impl-BKH3QRLi.mjs.map} +1 -1
- package/dist/{impl-KV3yZaHz2.mjs → impl-BOUm7wly2.mjs} +2 -2
- package/dist/{impl-KV3yZaHz2.mjs.map → impl-BOUm7wly2.mjs.map} +1 -1
- package/dist/{impl-r8tHyAHB.mjs → impl-BUC4ZelU.mjs} +2 -2
- package/dist/{impl-r8tHyAHB.mjs.map → impl-BUC4ZelU.mjs.map} +1 -1
- package/dist/{impl-dEQtD5uE.mjs → impl-BhTCp0kg.mjs} +2 -2
- package/dist/{impl-dEQtD5uE.mjs.map → impl-BhTCp0kg.mjs.map} +1 -1
- package/dist/{impl-f4UPMoS_2.mjs → impl-BlHU1bbJ2.mjs} +2 -2
- package/dist/{impl-f4UPMoS_2.mjs.map → impl-BlHU1bbJ2.mjs.map} +1 -1
- package/dist/{impl-CXK-D84c.mjs → impl-BwjguKHC.mjs} +2 -2
- package/dist/{impl-CXK-D84c.mjs.map → impl-BwjguKHC.mjs.map} +1 -1
- package/dist/{impl-VHp2K2bg.mjs → impl-C2o0eDzJ.mjs} +2 -2
- package/dist/{impl-VHp2K2bg.mjs.map → impl-C2o0eDzJ.mjs.map} +1 -1
- package/dist/{impl-2FbPcOv_2.mjs → impl-C8HKnjw82.mjs} +2 -2
- package/dist/{impl-2FbPcOv_2.mjs.map → impl-C8HKnjw82.mjs.map} +1 -1
- package/dist/{impl-CMX0qQr_2.mjs → impl-CCUsnhoW2.mjs} +2 -2
- package/dist/{impl-CMX0qQr_2.mjs.map → impl-CCUsnhoW2.mjs.map} +1 -1
- package/dist/{impl-B8iVBYdg.mjs → impl-CCc-wXqD.mjs} +2 -2
- package/dist/{impl-B8iVBYdg.mjs.map → impl-CCc-wXqD.mjs.map} +1 -1
- package/dist/{impl-ArGeiHuz.mjs → impl-CMmyv1cl.mjs} +2 -2
- package/dist/{impl-ArGeiHuz.mjs.map → impl-CMmyv1cl.mjs.map} +1 -1
- package/dist/{impl-1U4QBT_L.mjs → impl-CNez1OAw.mjs} +2 -2
- package/dist/impl-CNez1OAw.mjs.map +1 -0
- package/dist/{impl-DZnSlfwn2.mjs → impl-CNykdy3e2.mjs} +2 -2
- package/dist/{impl-DZnSlfwn2.mjs.map → impl-CNykdy3e2.mjs.map} +1 -1
- package/dist/{impl--Lmj1RHh2.mjs → impl-CSChmq_t2.mjs} +2 -2
- package/dist/{impl--Lmj1RHh2.mjs.map → impl-CSChmq_t2.mjs.map} +1 -1
- package/dist/{impl-dlRlTYAQ.mjs → impl-Ce9K4OCp.mjs} +2 -2
- package/dist/{impl-dlRlTYAQ.mjs.map → impl-Ce9K4OCp.mjs.map} +1 -1
- package/dist/{impl-CoLIqiH-2.mjs → impl-ChCqHkOc2.mjs} +2 -2
- package/dist/{impl-CoLIqiH-2.mjs.map → impl-ChCqHkOc2.mjs.map} +1 -1
- package/dist/{impl-DXWN22xV.mjs → impl-CqEwwWeD.mjs} +2 -2
- package/dist/{impl-DXWN22xV.mjs.map → impl-CqEwwWeD.mjs.map} +1 -1
- package/dist/{impl-CeLfAnyA2.mjs → impl-CqXFyvgV2.mjs} +2 -2
- package/dist/{impl-CeLfAnyA2.mjs.map → impl-CqXFyvgV2.mjs.map} +1 -1
- package/dist/{impl-ph0q6K3i.mjs → impl-CxLSJk2P.mjs} +2 -2
- package/dist/{impl-ph0q6K3i.mjs.map → impl-CxLSJk2P.mjs.map} +1 -1
- package/dist/{impl-DhIyASha.mjs → impl-CzU9WTiW.mjs} +2 -2
- package/dist/{impl-DhIyASha.mjs.map → impl-CzU9WTiW.mjs.map} +1 -1
- package/dist/{impl-BpUksm1b2.mjs → impl-D9NjIwEi2.mjs} +2 -2
- package/dist/{impl-BpUksm1b2.mjs.map → impl-D9NjIwEi2.mjs.map} +1 -1
- package/dist/{impl-BkyC7nnu.mjs → impl-DEWXA_QC.mjs} +2 -2
- package/dist/{impl-BkyC7nnu.mjs.map → impl-DEWXA_QC.mjs.map} +1 -1
- package/dist/{impl-DgyjJ8RY2.mjs → impl-DGiPB5Vq2.mjs} +2 -2
- package/dist/{impl-DgyjJ8RY2.mjs.map → impl-DGiPB5Vq2.mjs.map} +1 -1
- package/dist/{impl-CyJBbyuF.mjs → impl-DGuwD_qz.mjs} +2 -2
- package/dist/{impl-CyJBbyuF.mjs.map → impl-DGuwD_qz.mjs.map} +1 -1
- package/dist/{impl-D6nwGrO8.mjs → impl-DGzvE8aJ.mjs} +2 -2
- package/dist/{impl-D6nwGrO8.mjs.map → impl-DGzvE8aJ.mjs.map} +1 -1
- package/dist/{impl-Bc8Es_bT.mjs → impl-DTp9OQIZ.mjs} +2 -2
- package/dist/{impl-Bc8Es_bT.mjs.map → impl-DTp9OQIZ.mjs.map} +1 -1
- package/dist/{impl-DGRuk3AB.mjs → impl-DhscnXSw.mjs} +2 -2
- package/dist/{impl-DGRuk3AB.mjs.map → impl-DhscnXSw.mjs.map} +1 -1
- package/dist/{impl-BWjBYTQZ.mjs → impl-Dk7MdX-1.mjs} +2 -2
- package/dist/{impl-BWjBYTQZ.mjs.map → impl-Dk7MdX-1.mjs.map} +1 -1
- package/dist/{impl-Dny1LX9A.mjs → impl-DsNPvet4.mjs} +2 -2
- package/dist/{impl-Dny1LX9A.mjs.map → impl-DsNPvet4.mjs.map} +1 -1
- package/dist/{impl-DcC8_dCy.mjs → impl-DxUFb0vv.mjs} +2 -2
- package/dist/{impl-DcC8_dCy.mjs.map → impl-DxUFb0vv.mjs.map} +1 -1
- package/dist/{impl-y1I9Muyc2.mjs → impl-JThkrXiI2.mjs} +2 -2
- package/dist/{impl-y1I9Muyc2.mjs.map → impl-JThkrXiI2.mjs.map} +1 -1
- package/dist/{impl-Cq_RqK0_2.mjs → impl-KDuBh4bu2.mjs} +2 -2
- package/dist/{impl-Cq_RqK0_2.mjs.map → impl-KDuBh4bu2.mjs.map} +1 -1
- package/dist/{impl-C05tQHSq.mjs → impl-MpkLBntW.mjs} +2 -2
- package/dist/{impl-C05tQHSq.mjs.map → impl-MpkLBntW.mjs.map} +1 -1
- package/dist/{impl-Zr8uLP_n.mjs → impl-P_NDC3cX.mjs} +2 -2
- package/dist/{impl-Zr8uLP_n.mjs.map → impl-P_NDC3cX.mjs.map} +1 -1
- package/dist/{impl-D-ldjJzl2.mjs → impl-c7rUQYDc2.mjs} +2 -2
- package/dist/{impl-D-ldjJzl2.mjs.map → impl-c7rUQYDc2.mjs.map} +1 -1
- package/dist/{impl-G1brwI4o.mjs → impl-fqOKTw5J.mjs} +2 -2
- package/dist/{impl-G1brwI4o.mjs.map → impl-fqOKTw5J.mjs.map} +1 -1
- package/dist/{impl-Dfc_yQML2.mjs → impl-oiBTZqQS2.mjs} +2 -2
- package/dist/{impl-Dfc_yQML2.mjs.map → impl-oiBTZqQS2.mjs.map} +1 -1
- package/dist/{impl-CWHnw3oX.mjs → impl-tbGnvKFm.mjs} +2 -2
- package/dist/{impl-CWHnw3oX.mjs.map → impl-tbGnvKFm.mjs.map} +1 -1
- package/dist/index.d.mts +3397 -3397
- package/dist/index.mjs +1 -1
- package/dist/{makeGraphQLRequest-G078PsEL.mjs → makeGraphQLRequest-Cq26A_Lq.mjs} +2 -2
- package/dist/{makeGraphQLRequest-G078PsEL.mjs.map → makeGraphQLRequest-Cq26A_Lq.mjs.map} +1 -1
- package/dist/{markRequestDataSiloIdsCompleted-DmAz-R0M.mjs → markRequestDataSiloIdsCompleted-DzqJ5MNY.mjs} +2 -2
- package/dist/{markRequestDataSiloIdsCompleted-DmAz-R0M.mjs.map → markRequestDataSiloIdsCompleted-DzqJ5MNY.mjs.map} +1 -1
- package/dist/{markSilentPrivacyRequests-s7_aBROE.mjs → markSilentPrivacyRequests-BKQUu6Ep.mjs} +2 -2
- package/dist/{markSilentPrivacyRequests-s7_aBROE.mjs.map → markSilentPrivacyRequests-BKQUu6Ep.mjs.map} +1 -1
- package/dist/{mergeTranscendInputs-C64BJsse.mjs → mergeTranscendInputs-DGC4xUGu.mjs} +2 -2
- package/dist/{mergeTranscendInputs-C64BJsse.mjs.map → mergeTranscendInputs-DGC4xUGu.mjs.map} +1 -1
- package/dist/{notifyPrivacyRequestsAdditionalTime-BvXIXZYu.mjs → notifyPrivacyRequestsAdditionalTime-TEHAJe4C.mjs} +2 -2
- package/dist/{notifyPrivacyRequestsAdditionalTime-BvXIXZYu.mjs.map → notifyPrivacyRequestsAdditionalTime-TEHAJe4C.mjs.map} +1 -1
- package/dist/package-C4J38oR1.mjs +2 -0
- package/dist/package-C4J38oR1.mjs.map +1 -0
- package/dist/{pullAllDatapoints-DiMWp8a7.mjs → pullAllDatapoints-Cntwuzw7.mjs} +2 -2
- package/dist/{pullAllDatapoints-DiMWp8a7.mjs.map → pullAllDatapoints-Cntwuzw7.mjs.map} +1 -1
- package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-DgWgggQt.mjs → pullChunkedCustomSiloOutstandingIdentifiers-BT-GZpT1.mjs} +2 -2
- package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-DgWgggQt.mjs.map → pullChunkedCustomSiloOutstandingIdentifiers-BT-GZpT1.mjs.map} +1 -1
- package/dist/{pullConsentManagerMetrics-pFRPXTHJ.mjs → pullConsentManagerMetrics-FnhPEszu.mjs} +2 -2
- package/dist/{pullConsentManagerMetrics-pFRPXTHJ.mjs.map → pullConsentManagerMetrics-FnhPEszu.mjs.map} +1 -1
- package/dist/{pullManualEnrichmentIdentifiersToCsv-DA_4rIzW.mjs → pullManualEnrichmentIdentifiersToCsv-B_4REnga.mjs} +2 -2
- package/dist/{pullManualEnrichmentIdentifiersToCsv-DA_4rIzW.mjs.map → pullManualEnrichmentIdentifiersToCsv-B_4REnga.mjs.map} +1 -1
- package/dist/{pullTranscendConfiguration-D2cYlu6V.mjs → pullTranscendConfiguration-CqsgEf9A.mjs} +2 -2
- package/dist/{pullTranscendConfiguration-D2cYlu6V.mjs.map → pullTranscendConfiguration-CqsgEf9A.mjs.map} +1 -1
- package/dist/{pullUnstructuredSubDataPointRecommendations-C4aVhH-W.mjs → pullUnstructuredSubDataPointRecommendations-DZd2q6S2.mjs} +2 -2
- package/dist/{pullUnstructuredSubDataPointRecommendations-C4aVhH-W.mjs.map → pullUnstructuredSubDataPointRecommendations-DZd2q6S2.mjs.map} +1 -1
- package/dist/{pushCronIdentifiersFromCsv-C34TB9tG.mjs → pushCronIdentifiersFromCsv-D2saGR5i.mjs} +2 -2
- package/dist/{pushCronIdentifiersFromCsv-C34TB9tG.mjs.map → pushCronIdentifiersFromCsv-D2saGR5i.mjs.map} +1 -1
- package/dist/{pushManualEnrichmentIdentifiersFromCsv-CGS9E3Ft.mjs → pushManualEnrichmentIdentifiersFromCsv-DOvAzMyt.mjs} +2 -2
- package/dist/{pushManualEnrichmentIdentifiersFromCsv-CGS9E3Ft.mjs.map → pushManualEnrichmentIdentifiersFromCsv-DOvAzMyt.mjs.map} +1 -1
- package/dist/{removeUnverifiedRequestIdentifiers-pGGOFbfE.mjs → removeUnverifiedRequestIdentifiers-ChlwRmhd.mjs} +2 -2
- package/dist/{removeUnverifiedRequestIdentifiers-pGGOFbfE.mjs.map → removeUnverifiedRequestIdentifiers-ChlwRmhd.mjs.map} +1 -1
- package/dist/{retryRequestDataSilos-DXwN5uPw.mjs → retryRequestDataSilos-DnwXA1YZ.mjs} +2 -2
- package/dist/{retryRequestDataSilos-DXwN5uPw.mjs.map → retryRequestDataSilos-DnwXA1YZ.mjs.map} +1 -1
- package/dist/{skipPreflightJobs-BNQhuPZ8.mjs → skipPreflightJobs-jK5lNlmv.mjs} +2 -2
- package/dist/{skipPreflightJobs-BNQhuPZ8.mjs.map → skipPreflightJobs-jK5lNlmv.mjs.map} +1 -1
- package/dist/{skipRequestDataSilos-C39ji4lO.mjs → skipRequestDataSilos-DQGroOos.mjs} +2 -2
- package/dist/{skipRequestDataSilos-C39ji4lO.mjs.map → skipRequestDataSilos-DQGroOos.mjs.map} +1 -1
- package/dist/{streamPrivacyRequestsToCsv-C8lquiyd.mjs → streamPrivacyRequestsToCsv-BK07Bm-T.mjs} +2 -2
- package/dist/{streamPrivacyRequestsToCsv-C8lquiyd.mjs.map → streamPrivacyRequestsToCsv-BK07Bm-T.mjs.map} +1 -1
- package/dist/{syncCodePackages-BHgjfXCI.mjs → syncCodePackages-F-97FNjo.mjs} +2 -2
- package/dist/{syncCodePackages-BHgjfXCI.mjs.map → syncCodePackages-F-97FNjo.mjs.map} +1 -1
- package/dist/{syncCookies-CiLtxDFf.mjs → syncCookies-BxY36BeJ.mjs} +2 -2
- package/dist/{syncCookies-CiLtxDFf.mjs.map → syncCookies-BxY36BeJ.mjs.map} +1 -1
- package/dist/{syncDataFlows-DmBUs3G_.mjs → syncDataFlows-Cx5LZCen.mjs} +2 -2
- package/dist/{syncDataFlows-DmBUs3G_.mjs.map → syncDataFlows-Cx5LZCen.mjs.map} +1 -1
- package/dist/{syncTemplates-BNu1_dmW.mjs → syncTemplates-BrH7Yr0V.mjs} +2 -2
- package/dist/{syncTemplates-BNu1_dmW.mjs.map → syncTemplates-BrH7Yr0V.mjs.map} +1 -1
- package/dist/{updateConsentManagerVersionToLatest-BBMN94Hs.mjs → updateConsentManagerVersionToLatest-C221vAAw.mjs} +2 -2
- package/dist/{updateConsentManagerVersionToLatest-BBMN94Hs.mjs.map → updateConsentManagerVersionToLatest-C221vAAw.mjs.map} +1 -1
- package/dist/{uploadCookiesFromCsv-BKZx_E_2.mjs → uploadCookiesFromCsv-roHWekOP.mjs} +2 -2
- package/dist/{uploadCookiesFromCsv-BKZx_E_2.mjs.map → uploadCookiesFromCsv-roHWekOP.mjs.map} +1 -1
- package/dist/{uploadDataFlowsFromCsv-CJFVLvCJ.mjs → uploadDataFlowsFromCsv-DcTbrsv2.mjs} +2 -2
- package/dist/{uploadDataFlowsFromCsv-CJFVLvCJ.mjs.map → uploadDataFlowsFromCsv-DcTbrsv2.mjs.map} +1 -1
- package/dist/{uploadPrivacyRequestsFromCsv-BmP1JluQ.mjs → uploadPrivacyRequestsFromCsv-BUGTS-pY.mjs} +2 -2
- package/dist/{uploadPrivacyRequestsFromCsv-BmP1JluQ.mjs.map → uploadPrivacyRequestsFromCsv-BUGTS-pY.mjs.map} +1 -1
- package/dist/{uploadSiloDiscoveryResults-XpDp2u35.mjs → uploadSiloDiscoveryResults-D2fK92WR.mjs} +2 -2
- package/dist/{uploadSiloDiscoveryResults-XpDp2u35.mjs.map → uploadSiloDiscoveryResults-D2fK92WR.mjs.map} +1 -1
- package/dist/{withPreferenceRetry-Cb5S310L.mjs → withPreferenceRetry-xLMZyTq9.mjs} +2 -2
- package/dist/{withPreferenceRetry-Cb5S310L.mjs.map → withPreferenceRetry-xLMZyTq9.mjs.map} +1 -1
- package/package.json +7 -7
- package/dist/createExtraKeyHandler-C_0EVj10.mjs.map +0 -1
- package/dist/fetchAllPurposesAndPreferences-Dog6N9L2.mjs +0 -2
- package/dist/impl-1U4QBT_L.mjs.map +0 -1
- package/dist/package-BjNQxHlz.mjs +0 -2
- package/dist/package-BjNQxHlz.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncCodePackages-BHgjfXCI.mjs","names":["PAGE_SIZE","PAGE_SIZE","CHUNK_SIZE","CHUNK_SIZE"],"sources":["../src/lib/graphql/gqls/repository.ts","../src/lib/graphql/gqls/softwareDevelopmentKit.ts","../src/lib/graphql/gqls/codePackage.ts","../src/lib/graphql/fetchAllCodePackages.ts","../src/lib/graphql/fetchAllRepositories.ts","../src/lib/graphql/syncRepositories.ts","../src/lib/graphql/fetchAllSoftwareDevelopmentKits.ts","../src/lib/graphql/syncSoftwareDevelopmentKits.ts","../src/lib/graphql/syncCodePackages.ts"],"sourcesContent":["import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\nexport const REPOSITORIES = gql`\n query TranscendCliRepositories($first: Int!, $offset: Int!, $input: RepositoryFiltersInput) {\n repositories(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]\n ) {\n nodes {\n id\n name\n description\n url\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const UPDATE_REPOSITORIES = gql`\n mutation TranscendCliUpdateRepositories($input: UpdateRepositoriesInput!) {\n updateRepositories(input: $input) {\n clientMutationId\n repositories {\n id\n name\n url\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const CREATE_REPOSITORY = gql`\n mutation TranscendCliCreateRepository($input: CreateRepositoryInput!) {\n createRepository(input: $input) {\n clientMutationId\n repository {\n id\n name\n url\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\nexport const SOFTWARE_DEVELOPMENT_KITS = gql`\n query TranscendCliSoftwareDevelopmentKits(\n $first: Int!\n $offset: Int!\n $input: SoftwareDevelopmentKitFiltersInput\n ) {\n softwareDevelopmentKits(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]\n ) {\n nodes {\n id\n name\n description\n codePackageType\n documentationLinks\n repositoryUrl\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const UPDATE_SOFTWARE_DEVELOPMENT_KITS = gql`\n mutation TranscendCliUpdateSoftwareDevelopmentKits($input: UpdateSoftwareDevelopmentKitsInput!) {\n updateSoftwareDevelopmentKits(input: $input) {\n clientMutationId\n softwareDevelopmentKits {\n id\n name\n description\n codePackageType\n documentationLinks\n repositoryUrl\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const CREATE_SOFTWARE_DEVELOPMENT_KIT = gql`\n mutation TranscendCliCreateSoftwareDevelopmentKit($input: CreateSoftwareDevelopmentKitInput!) {\n createSoftwareDevelopmentKit(input: $input) {\n clientMutationId\n softwareDevelopmentKit {\n id\n name\n description\n codePackageType\n documentationLinks\n repositoryUrl\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\nexport const CODE_PACKAGES = gql`\n query TranscendCliCodePackages($first: Int!, $offset: Int!, $input: CodePackageFiltersInput) {\n codePackages(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]\n ) {\n nodes {\n id\n name\n description\n type\n relativePath\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n repository {\n id\n name\n }\n dataSilo {\n id\n title\n type\n }\n }\n }\n }\n`;\n\nexport const UPDATE_CODE_PACKAGES = gql`\n mutation TranscendCliUpdateCodePackages($input: UpdateCodePackagesInput!) {\n updateCodePackages(input: $input) {\n clientMutationId\n codePackages {\n id\n name\n description\n type\n relativePath\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n repository {\n id\n name\n }\n dataSilo {\n id\n title\n type\n }\n }\n }\n }\n`;\n\nexport const CREATE_CODE_PACKAGE = gql`\n mutation TranscendCliCreateCodePackage($input: CreateCodePackageInput!) {\n createCodePackage(input: $input) {\n clientMutationId\n codePackage {\n id\n name\n description\n type\n relativePath\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n repository {\n id\n name\n }\n dataSilo {\n id\n title\n type\n }\n }\n }\n }\n`;\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport { GraphQLClient } from 'graphql-request';\n\nimport { CODE_PACKAGES } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nexport interface CodePackage {\n /** ID of code package */\n id: string;\n /** Name of code package */\n name: string;\n /** Description of code package */\n description: string;\n /** Type of code package */\n type: CodePackageType;\n /** Relative path to code package in repository */\n relativePath: string;\n /** The teams that manage the code package */\n teams: {\n /** ID of team */\n id: string;\n /** Name of team */\n name: string;\n }[];\n /** The users that manage the code package */\n owners: {\n /** ID of user */\n id: string;\n /** Email of user */\n email: string;\n }[];\n /** The repository where the code package belongs */\n repository: {\n /** ID of repository */\n id: string;\n /** Name of repository */\n name: string;\n };\n /** The data silo that the code package relates to */\n dataSilo?: {\n /** ID of repository */\n id: string;\n /** Title of repository */\n title: string;\n /** Type of data silo */\n type: string;\n };\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all code packages in the organization\n *\n * @param client - GraphQL client\n * @returns All code packages in the organization\n */\nexport async function fetchAllCodePackages(client: GraphQLClient): Promise<CodePackage[]> {\n const codePackages: CodePackage[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n codePackages: { nodes },\n } = await makeGraphQLRequest<{\n /** Code packages */\n codePackages: {\n /** List */\n nodes: CodePackage[];\n };\n }>(client, CODE_PACKAGES, {\n first: PAGE_SIZE,\n offset,\n });\n codePackages.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return codePackages.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { GraphQLClient } from 'graphql-request';\n\nimport { REPOSITORIES } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nexport interface Repository {\n /** ID of repository */\n id: string;\n /** Name of repository */\n name: string;\n /** Description of repository */\n description: string;\n /** URL of repo */\n url: string;\n /** The teams that manage the repository */\n teams: {\n /** ID of team */\n id: string;\n /** Name of team */\n name: string;\n }[];\n /** The users that manage the repository */\n owners: {\n /** ID of user */\n id: string;\n /** Email of user */\n email: string;\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all repositories in the organization\n *\n * @param client - GraphQL client\n * @returns All repositories in the organization\n */\nexport async function fetchAllRepositories(client: GraphQLClient): Promise<Repository[]> {\n const repositories: Repository[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n repositories: { nodes },\n } = await makeGraphQLRequest<{\n /** Repositories */\n repositories: {\n /** List */\n nodes: Repository[];\n };\n }>(client, REPOSITORIES, {\n first: PAGE_SIZE,\n offset,\n });\n repositories.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return repositories.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk, keyBy } from 'lodash-es';\n\nimport { RepositoryInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries, map } from '../bluebird.js';\nimport { fetchAllRepositories, Repository } from './fetchAllRepositories.js';\nimport { UPDATE_REPOSITORIES, CREATE_REPOSITORY } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nconst CHUNK_SIZE = 100;\n\n/**\n * Create a new repository\n *\n * @param client - GraphQL client\n * @param input - Repository input\n * @returns Created repository\n */\nexport async function createRepository(\n client: GraphQLClient,\n input: {\n /** Title of repository */\n name: string;\n /** Description of the repository */\n description?: string;\n /** Github repository */\n url: string;\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n },\n): Promise<Repository> {\n const {\n createRepository: { repository },\n } = await makeGraphQLRequest<{\n /** createRepository mutation */\n createRepository: {\n /** Software development kit */\n repository: Repository;\n };\n }>(client, CREATE_REPOSITORY, {\n input,\n });\n logger.info(colors.green(`Successfully created repository \"${input.name}\"!`));\n return repository;\n}\n\n/**\n * Update an existing repository\n *\n * @param client - GraphQL client\n * @param inputs - Repository input\n * @returns Updated repositories\n */\nexport async function updateRepositories(\n client: GraphQLClient,\n inputs: {\n /** ID of repository */\n id: string;\n /** Title of repository */\n name?: string;\n /** Description of the repository */\n description?: string;\n /** Github repository */\n url?: string;\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n }[],\n): Promise<Repository[]> {\n const {\n updateRepositories: { repositories },\n } = await makeGraphQLRequest<{\n /** updateRepositories mutation */\n updateRepositories: {\n /** Software development kit */\n repositories: Repository[];\n };\n }>(client, UPDATE_REPOSITORIES, {\n input: {\n repositories: inputs,\n },\n });\n logger.info(colors.green(`Successfully updated ${inputs.length} repositories!`));\n return repositories;\n}\n\n/**\n * Sync the repositories\n *\n * @param client - GraphQL client\n * @param repositories - Repositories\n * @param concurrency - Concurrency\n * @returns The repositories that were upserted and whether the sync was successful\n */\nexport async function syncRepositories(\n client: GraphQLClient,\n repositories: RepositoryInput[],\n concurrency = 20,\n): Promise<{\n /** The repositories that were upserted */\n repositories: Repository[];\n /** If successful */\n success: boolean;\n}> {\n let encounteredError = false;\n const repos: Repository[] = [];\n\n // Index existing repositories\n const existing = await fetchAllRepositories(client);\n const repositoryByName = keyBy(existing, 'name');\n\n // Determine which repositories are new vs existing\n const mapRepositoriesToExisting = repositories.map((repoInput) => [\n repoInput,\n repositoryByName[repoInput.name]?.id,\n ]);\n\n // Create the new repositories\n const newRepositories = mapRepositoriesToExisting\n .filter(([, existing]) => !existing)\n .map(([repoInput]) => repoInput as RepositoryInput);\n try {\n logger.info(colors.magenta(`Creating \"${newRepositories.length}\" new repositories...`));\n await map(\n newRepositories,\n async (repo) => {\n const newRepo = await createRepository(client, repo);\n repos.push(newRepo);\n },\n {\n concurrency,\n },\n );\n logger.info(colors.green(`Successfully synced ${newRepositories.length} repositories!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create repositories! - ${err.message}`));\n }\n\n // Update existing repositories\n const existingRepositories = mapRepositoriesToExisting.filter(\n (x): x is [RepositoryInput, string] => !!x[1],\n );\n const chunks = chunk(existingRepositories, CHUNK_SIZE);\n logger.info(colors.magenta(`Updating \"${existingRepositories.length}\" repositories...`));\n\n await mapSeries(chunks, async (chunk) => {\n try {\n const updatedRepos = await updateRepositories(\n client,\n chunk.map(([input, id]) => ({\n ...input,\n id,\n })),\n );\n repos.push(...updatedRepos);\n logger.info(\n colors.green(`Successfully updated \"${existingRepositories.length}\" repositories!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to update repositories! - ${err.message}`));\n }\n\n logger.info(colors.green(`Synced \"${repositories.length}\" repositories!`));\n });\n\n // Return true upon success\n return {\n repositories: repos,\n success: !encounteredError,\n };\n}\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport { GraphQLClient } from 'graphql-request';\n\nimport { SOFTWARE_DEVELOPMENT_KITS } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nexport interface SoftwareDevelopmentKit {\n /** ID of software development kit */\n id: string;\n /** Name of software development kit */\n name: string;\n /** Description of software development kit */\n description: string;\n /** Type of software development kit */\n codePackageType: CodePackageType;\n /** Related documentation */\n documentationLinks: string[];\n /** Link to git repository */\n repositoryUrl?: string;\n /** The teams that manage the software development kit */\n teams: {\n /** ID of team */\n id: string;\n /** Name of team */\n name: string;\n }[];\n /** The users that manage the software development kit */\n owners: {\n /** ID of user */\n id: string;\n /** Email of user */\n email: string;\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all software development kits in the organization\n *\n * @param client - GraphQL client\n * @returns All software development kits in the organization\n */\nexport async function fetchAllSoftwareDevelopmentKits(\n client: GraphQLClient,\n): Promise<SoftwareDevelopmentKit[]> {\n const softwareDevelopmentKits: SoftwareDevelopmentKit[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n softwareDevelopmentKits: { nodes },\n } = await makeGraphQLRequest<{\n /** Software development kits */\n softwareDevelopmentKits: {\n /** List */\n nodes: SoftwareDevelopmentKit[];\n };\n }>(client, SOFTWARE_DEVELOPMENT_KITS, {\n first: PAGE_SIZE,\n offset,\n });\n softwareDevelopmentKits.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return softwareDevelopmentKits.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk, keyBy } from 'lodash-es';\n\nimport { SoftwareDevelopmentKitInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries, map } from '../bluebird.js';\nimport {\n fetchAllSoftwareDevelopmentKits,\n SoftwareDevelopmentKit,\n} from './fetchAllSoftwareDevelopmentKits.js';\nimport { UPDATE_SOFTWARE_DEVELOPMENT_KITS, CREATE_SOFTWARE_DEVELOPMENT_KIT } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nconst CHUNK_SIZE = 100;\n\n/**\n * Create a new software development kit\n *\n * @param client - GraphQL client\n * @param input - Software development kit input\n * @returns Created software development kit\n */\nexport async function createSoftwareDevelopmentKit(\n client: GraphQLClient,\n input: {\n /** Title of software development kit */\n name: string;\n /** Code package type */\n codePackageType: CodePackageType;\n /** Description of the SDK */\n description?: string;\n /** Github repository */\n repositoryUrl?: string;\n /** Integration name */\n catalogIntegrationName?: string;\n /** Doc links */\n documentationLinks?: string[];\n /** Code package IDs */\n codePackageIds?: string[];\n /** Code package names */\n codePackageNames?: string[];\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n },\n): Promise<SoftwareDevelopmentKit> {\n const {\n createSoftwareDevelopmentKit: { softwareDevelopmentKit },\n } = await makeGraphQLRequest<{\n /** createSoftwareDevelopmentKit mutation */\n createSoftwareDevelopmentKit: {\n /** Software development kit */\n softwareDevelopmentKit: SoftwareDevelopmentKit;\n };\n }>(client, CREATE_SOFTWARE_DEVELOPMENT_KIT, {\n input,\n });\n logger.info(colors.green(`Successfully created software development kit \"${input.name}\"!`));\n return softwareDevelopmentKit;\n}\n\n/**\n * Update an existing software development kit\n *\n * @param client - GraphQL client\n * @param inputs - Software development kit input\n * @returns Updated software development kits\n */\nexport async function updateSoftwareDevelopmentKits(\n client: GraphQLClient,\n inputs: {\n /** ID of software development kit */\n id: string;\n /** Title of software development kit */\n name?: string;\n /** Description of the SDK */\n description?: string;\n /** Github repository */\n repositoryUrl?: string;\n /** Integration name */\n catalogIntegrationName?: string;\n /** Doc links */\n documentationLinks?: string[];\n /** Code package IDs */\n codePackageIds?: string[];\n /** Code package names */\n codePackageNames?: string[];\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n }[],\n): Promise<SoftwareDevelopmentKit[]> {\n const {\n updateSoftwareDevelopmentKits: { softwareDevelopmentKits },\n } = await makeGraphQLRequest<{\n /** updateSoftwareDevelopmentKits mutation */\n updateSoftwareDevelopmentKits: {\n /** Software development kit */\n softwareDevelopmentKits: SoftwareDevelopmentKit[];\n };\n }>(client, UPDATE_SOFTWARE_DEVELOPMENT_KITS, {\n input: {\n softwareDevelopmentKits: inputs,\n },\n });\n logger.info(colors.green(`Successfully updated ${inputs.length} software development kits!`));\n return softwareDevelopmentKits;\n}\n\n/**\n * Sync the software development kits\n *\n * @param client - GraphQL client\n * @param softwareDevelopmentKits - Software development kits\n * @param concurrency - Concurrency\n * @returns The software development kits that were upserted and whether the sync was successful\n */\nexport async function syncSoftwareDevelopmentKits(\n client: GraphQLClient,\n softwareDevelopmentKits: SoftwareDevelopmentKitInput[],\n concurrency = 20,\n): Promise<{\n /** The SDKs that were upserted */\n softwareDevelopmentKits: SoftwareDevelopmentKit[];\n /** If successful */\n success: boolean;\n}> {\n let encounteredError = false;\n const sdks: SoftwareDevelopmentKit[] = [];\n logger.info(colors.magenta('Syncing software development kits...'));\n\n // Index existing software development kits\n const existing = await fetchAllSoftwareDevelopmentKits(client);\n const softwareDevelopmentKitByTitle = keyBy(existing, ({ name, codePackageType }) =>\n JSON.stringify({ name, codePackageType }),\n );\n\n // Determine which software development kits are new vs existing\n const mapSoftwareDevelopmentKitsToExisting = softwareDevelopmentKits.map((sdkInput) => [\n sdkInput,\n softwareDevelopmentKitByTitle[\n JSON.stringify({\n name: sdkInput.name,\n codePackageType: sdkInput.codePackageType,\n })\n ]?.id,\n ]);\n\n // Create the new software development kits\n const newSoftwareDevelopmentKits = mapSoftwareDevelopmentKitsToExisting\n .filter(([, existing]) => !existing)\n .map(([sdkInput]) => sdkInput as SoftwareDevelopmentKitInput);\n try {\n logger.info(\n colors.magenta(\n `Creating \"${newSoftwareDevelopmentKits.length}\" new software development kits...`,\n ),\n );\n await map(\n newSoftwareDevelopmentKits,\n async (sdk) => {\n const newSdk = await createSoftwareDevelopmentKit(client, sdk);\n sdks.push(newSdk);\n },\n {\n concurrency,\n },\n );\n logger.info(\n colors.green(\n `Successfully synced ${newSoftwareDevelopmentKits.length} software development kits!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create software development kits! - ${err.message}`));\n }\n\n // Update existing software development kits\n const existingSoftwareDevelopmentKits = mapSoftwareDevelopmentKitsToExisting.filter(\n (x): x is [SoftwareDevelopmentKitInput, string] => !!x[1],\n );\n const chunks = chunk(existingSoftwareDevelopmentKits, CHUNK_SIZE);\n logger.info(\n colors.magenta(\n `Updating \"${existingSoftwareDevelopmentKits.length}\" software development kits...`,\n ),\n );\n\n await mapSeries(chunks, async (chunk) => {\n try {\n const updatedSdks = await updateSoftwareDevelopmentKits(\n client,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n chunk.map(([{ codePackageType, ...input }, id]) => ({\n ...input,\n id,\n })),\n );\n sdks.push(...updatedSdks);\n logger.info(\n colors.green(\n `Successfully updated \"${existingSoftwareDevelopmentKits.length}\" software development kits!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to update software development kits! - ${err.message}`));\n }\n\n logger.info(\n colors.green(`Synced \"${softwareDevelopmentKits.length}\" software development kits!`),\n );\n });\n\n // Return true upon success\n return {\n softwareDevelopmentKits: sdks,\n success: !encounteredError,\n };\n}\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk, uniq, keyBy, uniqBy } from 'lodash-es';\n\nimport { CodePackageInput, RepositoryInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { map, mapSeries } from '../bluebird.js';\nimport { CodePackage, fetchAllCodePackages } from './fetchAllCodePackages.js';\nimport { CREATE_CODE_PACKAGE, UPDATE_CODE_PACKAGES } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\nimport { syncRepositories } from './syncRepositories.js';\nimport { syncSoftwareDevelopmentKits } from './syncSoftwareDevelopmentKits.js';\n\nconst CHUNK_SIZE = 100;\n\nconst LOOKUP_SPLIT_KEY = '%%%%';\n\n/**\n * Create a new code package\n *\n * @param client - GraphQL client\n * @param input - Code package input\n * @returns Code package ID\n */\nexport async function createCodePackage(\n client: GraphQLClient,\n input: {\n /** Name of package */\n name: string;\n /** Description of package */\n description?: string;\n /** Type of package */\n type: CodePackageType;\n /** Relative path to package */\n relativePath: string;\n /** Repository ID */\n repositoryId?: string;\n /** Name of repository */\n repositoryName?: string;\n /** IDs of SDKs */\n softwareDevelopmentKitIds?: string[];\n /** IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** IDs of teams */\n teamIds?: string[];\n /** Names of teams */\n teamNames?: string[];\n },\n): Promise<CodePackage> {\n const {\n createCodePackage: { codePackage },\n } = await makeGraphQLRequest<{\n /** createCodePackage mutation */\n createCodePackage: {\n /** Code package */\n codePackage: CodePackage;\n };\n }>(client, CREATE_CODE_PACKAGE, {\n input,\n });\n logger.info(colors.green(`Successfully created code package \"${input.name}\"!`));\n return codePackage;\n}\n\n/**\n * Update an existing code package\n *\n * @param client - GraphQL client\n * @param inputs - Code package input\n * @returns Code packages that were updated\n */\nexport async function updateCodePackages(\n client: GraphQLClient,\n inputs: {\n /** ID of code package */\n id: string;\n /** Name of package */\n name: string;\n /** Description of package */\n description?: string;\n /** Type of package */\n type: CodePackageType;\n /** Relative path to package */\n relativePath: string;\n /** Repository ID */\n repositoryId?: string;\n /** Name of repository */\n repositoryName?: string;\n /** IDs of SDKs */\n softwareDevelopmentKitIds?: string[];\n /** IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** IDs of teams */\n teamIds?: string[];\n /** Names of teams */\n teamNames?: string[];\n }[],\n): Promise<CodePackage[]> {\n const {\n updateCodePackages: { codePackages },\n } = await makeGraphQLRequest<{\n /** updateCodePackages mutation */\n updateCodePackages: {\n /** Code packages */\n codePackages: CodePackage[];\n };\n }>(client, UPDATE_CODE_PACKAGES, {\n input: {\n codePackages: inputs,\n },\n });\n logger.info(colors.green(`Successfully updated ${inputs.length} code packages!`));\n return codePackages;\n}\n\n/**\n * Uploads silo discovery results for Transcend to classify\n *\n * @param client - GraphQL Client\n * @param codePackages - Packages to upload\n * @param concurrency - How many concurrent requests to make\n * @returns True if successful, false if any updates failed, or an error occurs\n */\nexport async function syncCodePackages(\n client: GraphQLClient,\n codePackages: CodePackageInput[],\n concurrency = 20,\n): Promise<boolean> {\n let encounteredError = false;\n const [existingCodePackages, { softwareDevelopmentKits: existingSoftwareDevelopmentKits }] =\n await Promise.all([\n // fetch all code packages\n fetchAllCodePackages(client),\n // make sure all SDKs exist\n syncSoftwareDevelopmentKits(\n client,\n uniqBy(\n codePackages\n .map(({ type, softwareDevelopmentKits = [] }) =>\n softwareDevelopmentKits.map(({ name }) => ({\n name,\n codePackageType: type,\n })),\n )\n .flat(),\n ({ name, codePackageType }) => `${name}${LOOKUP_SPLIT_KEY}${codePackageType}`,\n ),\n concurrency,\n ),\n // make sure all Repositories exist\n syncRepositories(\n client,\n uniqBy(codePackages, 'repositoryName').map(\n ({ repositoryName }) =>\n ({\n name: repositoryName,\n url: `https://github.com/${repositoryName}`,\n }) as RepositoryInput,\n ),\n ),\n ]);\n\n const softwareDevelopmentKitLookup = keyBy(\n existingSoftwareDevelopmentKits,\n ({ name, codePackageType }) => `${name}${LOOKUP_SPLIT_KEY}${codePackageType}`,\n );\n const codePackagesLookup = keyBy(\n existingCodePackages,\n ({ name, type }) => `${name}${LOOKUP_SPLIT_KEY}${type}`,\n );\n\n // Determine which codePackages are new vs existing\n const mapCodePackagesToExisting = codePackages.map((codePackageInput) => [\n codePackageInput,\n codePackagesLookup[`${codePackageInput.name}${LOOKUP_SPLIT_KEY}${codePackageInput.type}`]?.id,\n ]);\n\n // Create the new codePackages\n const newCodePackages = mapCodePackagesToExisting\n .filter(([, existing]) => !existing)\n .map(([codePackageInput]) => codePackageInput as CodePackageInput);\n try {\n logger.info(colors.magenta(`Creating \"${newCodePackages.length}\" new code packages...`));\n await map(\n newCodePackages,\n async ({ softwareDevelopmentKits, ...codePackage }) => {\n await createCodePackage(client, {\n ...codePackage,\n ...(softwareDevelopmentKits\n ? {\n softwareDevelopmentKitIds: uniq(\n softwareDevelopmentKits.map(({ name }) => {\n const sdk =\n softwareDevelopmentKitLookup[`${name}${LOOKUP_SPLIT_KEY}${codePackage.type}`];\n if (!sdk) {\n throw new Error(`Failed to find SDK with name: \"${name}\"`);\n }\n return sdk.id;\n }),\n ),\n }\n : {}),\n });\n },\n {\n concurrency,\n },\n );\n logger.info(colors.green(`Successfully synced ${newCodePackages.length} code packages!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create code packages! - ${err.message}`));\n }\n\n // Update existing codePackages\n const existingCodePackageInputs = mapCodePackagesToExisting.filter(\n (x): x is [CodePackageInput, string] => !!x[1],\n );\n logger.info(colors.magenta(`Updating \"${existingCodePackageInputs.length}\" code packages...`));\n const chunks = chunk(existingCodePackageInputs, CHUNK_SIZE);\n\n await mapSeries(chunks, async (chunk) => {\n try {\n await updateCodePackages(\n client,\n chunk.map(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ([{ softwareDevelopmentKits, repositoryName, ...input }, id]) => ({\n ...input,\n ...(softwareDevelopmentKits\n ? {\n softwareDevelopmentKitIds: uniq(\n softwareDevelopmentKits.map(({ name }) => {\n const sdk =\n softwareDevelopmentKitLookup[`${name}${LOOKUP_SPLIT_KEY}${input.type}`];\n if (!sdk) {\n throw new Error(`Failed to find SDK with name: \"${name}\"`);\n }\n return sdk.id;\n }),\n ),\n }\n : {}),\n id,\n }),\n ),\n );\n logger.info(colors.green(`Successfully updated \"${chunk.length}\" code packages!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to update code packages! - ${err.message}`));\n }\n });\n\n logger.info(colors.green(`Synced \"${codePackages.length}\" code packages!`));\n return !encounteredError;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"syncCodePackages-F-97FNjo.mjs","names":["PAGE_SIZE","PAGE_SIZE","CHUNK_SIZE","CHUNK_SIZE"],"sources":["../src/lib/graphql/gqls/repository.ts","../src/lib/graphql/gqls/softwareDevelopmentKit.ts","../src/lib/graphql/gqls/codePackage.ts","../src/lib/graphql/fetchAllCodePackages.ts","../src/lib/graphql/fetchAllRepositories.ts","../src/lib/graphql/syncRepositories.ts","../src/lib/graphql/fetchAllSoftwareDevelopmentKits.ts","../src/lib/graphql/syncSoftwareDevelopmentKits.ts","../src/lib/graphql/syncCodePackages.ts"],"sourcesContent":["import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\nexport const REPOSITORIES = gql`\n query TranscendCliRepositories($first: Int!, $offset: Int!, $input: RepositoryFiltersInput) {\n repositories(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]\n ) {\n nodes {\n id\n name\n description\n url\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const UPDATE_REPOSITORIES = gql`\n mutation TranscendCliUpdateRepositories($input: UpdateRepositoriesInput!) {\n updateRepositories(input: $input) {\n clientMutationId\n repositories {\n id\n name\n url\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const CREATE_REPOSITORY = gql`\n mutation TranscendCliCreateRepository($input: CreateRepositoryInput!) {\n createRepository(input: $input) {\n clientMutationId\n repository {\n id\n name\n url\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\nexport const SOFTWARE_DEVELOPMENT_KITS = gql`\n query TranscendCliSoftwareDevelopmentKits(\n $first: Int!\n $offset: Int!\n $input: SoftwareDevelopmentKitFiltersInput\n ) {\n softwareDevelopmentKits(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]\n ) {\n nodes {\n id\n name\n description\n codePackageType\n documentationLinks\n repositoryUrl\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const UPDATE_SOFTWARE_DEVELOPMENT_KITS = gql`\n mutation TranscendCliUpdateSoftwareDevelopmentKits($input: UpdateSoftwareDevelopmentKitsInput!) {\n updateSoftwareDevelopmentKits(input: $input) {\n clientMutationId\n softwareDevelopmentKits {\n id\n name\n description\n codePackageType\n documentationLinks\n repositoryUrl\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const CREATE_SOFTWARE_DEVELOPMENT_KIT = gql`\n mutation TranscendCliCreateSoftwareDevelopmentKit($input: CreateSoftwareDevelopmentKitInput!) {\n createSoftwareDevelopmentKit(input: $input) {\n clientMutationId\n softwareDevelopmentKit {\n id\n name\n description\n codePackageType\n documentationLinks\n repositoryUrl\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\nexport const CODE_PACKAGES = gql`\n query TranscendCliCodePackages($first: Int!, $offset: Int!, $input: CodePackageFiltersInput) {\n codePackages(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]\n ) {\n nodes {\n id\n name\n description\n type\n relativePath\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n repository {\n id\n name\n }\n dataSilo {\n id\n title\n type\n }\n }\n }\n }\n`;\n\nexport const UPDATE_CODE_PACKAGES = gql`\n mutation TranscendCliUpdateCodePackages($input: UpdateCodePackagesInput!) {\n updateCodePackages(input: $input) {\n clientMutationId\n codePackages {\n id\n name\n description\n type\n relativePath\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n repository {\n id\n name\n }\n dataSilo {\n id\n title\n type\n }\n }\n }\n }\n`;\n\nexport const CREATE_CODE_PACKAGE = gql`\n mutation TranscendCliCreateCodePackage($input: CreateCodePackageInput!) {\n createCodePackage(input: $input) {\n clientMutationId\n codePackage {\n id\n name\n description\n type\n relativePath\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n repository {\n id\n name\n }\n dataSilo {\n id\n title\n type\n }\n }\n }\n }\n`;\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport { GraphQLClient } from 'graphql-request';\n\nimport { CODE_PACKAGES } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nexport interface CodePackage {\n /** ID of code package */\n id: string;\n /** Name of code package */\n name: string;\n /** Description of code package */\n description: string;\n /** Type of code package */\n type: CodePackageType;\n /** Relative path to code package in repository */\n relativePath: string;\n /** The teams that manage the code package */\n teams: {\n /** ID of team */\n id: string;\n /** Name of team */\n name: string;\n }[];\n /** The users that manage the code package */\n owners: {\n /** ID of user */\n id: string;\n /** Email of user */\n email: string;\n }[];\n /** The repository where the code package belongs */\n repository: {\n /** ID of repository */\n id: string;\n /** Name of repository */\n name: string;\n };\n /** The data silo that the code package relates to */\n dataSilo?: {\n /** ID of repository */\n id: string;\n /** Title of repository */\n title: string;\n /** Type of data silo */\n type: string;\n };\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all code packages in the organization\n *\n * @param client - GraphQL client\n * @returns All code packages in the organization\n */\nexport async function fetchAllCodePackages(client: GraphQLClient): Promise<CodePackage[]> {\n const codePackages: CodePackage[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n codePackages: { nodes },\n } = await makeGraphQLRequest<{\n /** Code packages */\n codePackages: {\n /** List */\n nodes: CodePackage[];\n };\n }>(client, CODE_PACKAGES, {\n first: PAGE_SIZE,\n offset,\n });\n codePackages.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return codePackages.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { GraphQLClient } from 'graphql-request';\n\nimport { REPOSITORIES } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nexport interface Repository {\n /** ID of repository */\n id: string;\n /** Name of repository */\n name: string;\n /** Description of repository */\n description: string;\n /** URL of repo */\n url: string;\n /** The teams that manage the repository */\n teams: {\n /** ID of team */\n id: string;\n /** Name of team */\n name: string;\n }[];\n /** The users that manage the repository */\n owners: {\n /** ID of user */\n id: string;\n /** Email of user */\n email: string;\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all repositories in the organization\n *\n * @param client - GraphQL client\n * @returns All repositories in the organization\n */\nexport async function fetchAllRepositories(client: GraphQLClient): Promise<Repository[]> {\n const repositories: Repository[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n repositories: { nodes },\n } = await makeGraphQLRequest<{\n /** Repositories */\n repositories: {\n /** List */\n nodes: Repository[];\n };\n }>(client, REPOSITORIES, {\n first: PAGE_SIZE,\n offset,\n });\n repositories.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return repositories.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk, keyBy } from 'lodash-es';\n\nimport { RepositoryInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries, map } from '../bluebird.js';\nimport { fetchAllRepositories, Repository } from './fetchAllRepositories.js';\nimport { UPDATE_REPOSITORIES, CREATE_REPOSITORY } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nconst CHUNK_SIZE = 100;\n\n/**\n * Create a new repository\n *\n * @param client - GraphQL client\n * @param input - Repository input\n * @returns Created repository\n */\nexport async function createRepository(\n client: GraphQLClient,\n input: {\n /** Title of repository */\n name: string;\n /** Description of the repository */\n description?: string;\n /** Github repository */\n url: string;\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n },\n): Promise<Repository> {\n const {\n createRepository: { repository },\n } = await makeGraphQLRequest<{\n /** createRepository mutation */\n createRepository: {\n /** Software development kit */\n repository: Repository;\n };\n }>(client, CREATE_REPOSITORY, {\n input,\n });\n logger.info(colors.green(`Successfully created repository \"${input.name}\"!`));\n return repository;\n}\n\n/**\n * Update an existing repository\n *\n * @param client - GraphQL client\n * @param inputs - Repository input\n * @returns Updated repositories\n */\nexport async function updateRepositories(\n client: GraphQLClient,\n inputs: {\n /** ID of repository */\n id: string;\n /** Title of repository */\n name?: string;\n /** Description of the repository */\n description?: string;\n /** Github repository */\n url?: string;\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n }[],\n): Promise<Repository[]> {\n const {\n updateRepositories: { repositories },\n } = await makeGraphQLRequest<{\n /** updateRepositories mutation */\n updateRepositories: {\n /** Software development kit */\n repositories: Repository[];\n };\n }>(client, UPDATE_REPOSITORIES, {\n input: {\n repositories: inputs,\n },\n });\n logger.info(colors.green(`Successfully updated ${inputs.length} repositories!`));\n return repositories;\n}\n\n/**\n * Sync the repositories\n *\n * @param client - GraphQL client\n * @param repositories - Repositories\n * @param concurrency - Concurrency\n * @returns The repositories that were upserted and whether the sync was successful\n */\nexport async function syncRepositories(\n client: GraphQLClient,\n repositories: RepositoryInput[],\n concurrency = 20,\n): Promise<{\n /** The repositories that were upserted */\n repositories: Repository[];\n /** If successful */\n success: boolean;\n}> {\n let encounteredError = false;\n const repos: Repository[] = [];\n\n // Index existing repositories\n const existing = await fetchAllRepositories(client);\n const repositoryByName = keyBy(existing, 'name');\n\n // Determine which repositories are new vs existing\n const mapRepositoriesToExisting = repositories.map((repoInput) => [\n repoInput,\n repositoryByName[repoInput.name]?.id,\n ]);\n\n // Create the new repositories\n const newRepositories = mapRepositoriesToExisting\n .filter(([, existing]) => !existing)\n .map(([repoInput]) => repoInput as RepositoryInput);\n try {\n logger.info(colors.magenta(`Creating \"${newRepositories.length}\" new repositories...`));\n await map(\n newRepositories,\n async (repo) => {\n const newRepo = await createRepository(client, repo);\n repos.push(newRepo);\n },\n {\n concurrency,\n },\n );\n logger.info(colors.green(`Successfully synced ${newRepositories.length} repositories!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create repositories! - ${err.message}`));\n }\n\n // Update existing repositories\n const existingRepositories = mapRepositoriesToExisting.filter(\n (x): x is [RepositoryInput, string] => !!x[1],\n );\n const chunks = chunk(existingRepositories, CHUNK_SIZE);\n logger.info(colors.magenta(`Updating \"${existingRepositories.length}\" repositories...`));\n\n await mapSeries(chunks, async (chunk) => {\n try {\n const updatedRepos = await updateRepositories(\n client,\n chunk.map(([input, id]) => ({\n ...input,\n id,\n })),\n );\n repos.push(...updatedRepos);\n logger.info(\n colors.green(`Successfully updated \"${existingRepositories.length}\" repositories!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to update repositories! - ${err.message}`));\n }\n\n logger.info(colors.green(`Synced \"${repositories.length}\" repositories!`));\n });\n\n // Return true upon success\n return {\n repositories: repos,\n success: !encounteredError,\n };\n}\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport { GraphQLClient } from 'graphql-request';\n\nimport { SOFTWARE_DEVELOPMENT_KITS } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nexport interface SoftwareDevelopmentKit {\n /** ID of software development kit */\n id: string;\n /** Name of software development kit */\n name: string;\n /** Description of software development kit */\n description: string;\n /** Type of software development kit */\n codePackageType: CodePackageType;\n /** Related documentation */\n documentationLinks: string[];\n /** Link to git repository */\n repositoryUrl?: string;\n /** The teams that manage the software development kit */\n teams: {\n /** ID of team */\n id: string;\n /** Name of team */\n name: string;\n }[];\n /** The users that manage the software development kit */\n owners: {\n /** ID of user */\n id: string;\n /** Email of user */\n email: string;\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all software development kits in the organization\n *\n * @param client - GraphQL client\n * @returns All software development kits in the organization\n */\nexport async function fetchAllSoftwareDevelopmentKits(\n client: GraphQLClient,\n): Promise<SoftwareDevelopmentKit[]> {\n const softwareDevelopmentKits: SoftwareDevelopmentKit[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n softwareDevelopmentKits: { nodes },\n } = await makeGraphQLRequest<{\n /** Software development kits */\n softwareDevelopmentKits: {\n /** List */\n nodes: SoftwareDevelopmentKit[];\n };\n }>(client, SOFTWARE_DEVELOPMENT_KITS, {\n first: PAGE_SIZE,\n offset,\n });\n softwareDevelopmentKits.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return softwareDevelopmentKits.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk, keyBy } from 'lodash-es';\n\nimport { SoftwareDevelopmentKitInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries, map } from '../bluebird.js';\nimport {\n fetchAllSoftwareDevelopmentKits,\n SoftwareDevelopmentKit,\n} from './fetchAllSoftwareDevelopmentKits.js';\nimport { UPDATE_SOFTWARE_DEVELOPMENT_KITS, CREATE_SOFTWARE_DEVELOPMENT_KIT } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nconst CHUNK_SIZE = 100;\n\n/**\n * Create a new software development kit\n *\n * @param client - GraphQL client\n * @param input - Software development kit input\n * @returns Created software development kit\n */\nexport async function createSoftwareDevelopmentKit(\n client: GraphQLClient,\n input: {\n /** Title of software development kit */\n name: string;\n /** Code package type */\n codePackageType: CodePackageType;\n /** Description of the SDK */\n description?: string;\n /** Github repository */\n repositoryUrl?: string;\n /** Integration name */\n catalogIntegrationName?: string;\n /** Doc links */\n documentationLinks?: string[];\n /** Code package IDs */\n codePackageIds?: string[];\n /** Code package names */\n codePackageNames?: string[];\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n },\n): Promise<SoftwareDevelopmentKit> {\n const {\n createSoftwareDevelopmentKit: { softwareDevelopmentKit },\n } = await makeGraphQLRequest<{\n /** createSoftwareDevelopmentKit mutation */\n createSoftwareDevelopmentKit: {\n /** Software development kit */\n softwareDevelopmentKit: SoftwareDevelopmentKit;\n };\n }>(client, CREATE_SOFTWARE_DEVELOPMENT_KIT, {\n input,\n });\n logger.info(colors.green(`Successfully created software development kit \"${input.name}\"!`));\n return softwareDevelopmentKit;\n}\n\n/**\n * Update an existing software development kit\n *\n * @param client - GraphQL client\n * @param inputs - Software development kit input\n * @returns Updated software development kits\n */\nexport async function updateSoftwareDevelopmentKits(\n client: GraphQLClient,\n inputs: {\n /** ID of software development kit */\n id: string;\n /** Title of software development kit */\n name?: string;\n /** Description of the SDK */\n description?: string;\n /** Github repository */\n repositoryUrl?: string;\n /** Integration name */\n catalogIntegrationName?: string;\n /** Doc links */\n documentationLinks?: string[];\n /** Code package IDs */\n codePackageIds?: string[];\n /** Code package names */\n codePackageNames?: string[];\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n }[],\n): Promise<SoftwareDevelopmentKit[]> {\n const {\n updateSoftwareDevelopmentKits: { softwareDevelopmentKits },\n } = await makeGraphQLRequest<{\n /** updateSoftwareDevelopmentKits mutation */\n updateSoftwareDevelopmentKits: {\n /** Software development kit */\n softwareDevelopmentKits: SoftwareDevelopmentKit[];\n };\n }>(client, UPDATE_SOFTWARE_DEVELOPMENT_KITS, {\n input: {\n softwareDevelopmentKits: inputs,\n },\n });\n logger.info(colors.green(`Successfully updated ${inputs.length} software development kits!`));\n return softwareDevelopmentKits;\n}\n\n/**\n * Sync the software development kits\n *\n * @param client - GraphQL client\n * @param softwareDevelopmentKits - Software development kits\n * @param concurrency - Concurrency\n * @returns The software development kits that were upserted and whether the sync was successful\n */\nexport async function syncSoftwareDevelopmentKits(\n client: GraphQLClient,\n softwareDevelopmentKits: SoftwareDevelopmentKitInput[],\n concurrency = 20,\n): Promise<{\n /** The SDKs that were upserted */\n softwareDevelopmentKits: SoftwareDevelopmentKit[];\n /** If successful */\n success: boolean;\n}> {\n let encounteredError = false;\n const sdks: SoftwareDevelopmentKit[] = [];\n logger.info(colors.magenta('Syncing software development kits...'));\n\n // Index existing software development kits\n const existing = await fetchAllSoftwareDevelopmentKits(client);\n const softwareDevelopmentKitByTitle = keyBy(existing, ({ name, codePackageType }) =>\n JSON.stringify({ name, codePackageType }),\n );\n\n // Determine which software development kits are new vs existing\n const mapSoftwareDevelopmentKitsToExisting = softwareDevelopmentKits.map((sdkInput) => [\n sdkInput,\n softwareDevelopmentKitByTitle[\n JSON.stringify({\n name: sdkInput.name,\n codePackageType: sdkInput.codePackageType,\n })\n ]?.id,\n ]);\n\n // Create the new software development kits\n const newSoftwareDevelopmentKits = mapSoftwareDevelopmentKitsToExisting\n .filter(([, existing]) => !existing)\n .map(([sdkInput]) => sdkInput as SoftwareDevelopmentKitInput);\n try {\n logger.info(\n colors.magenta(\n `Creating \"${newSoftwareDevelopmentKits.length}\" new software development kits...`,\n ),\n );\n await map(\n newSoftwareDevelopmentKits,\n async (sdk) => {\n const newSdk = await createSoftwareDevelopmentKit(client, sdk);\n sdks.push(newSdk);\n },\n {\n concurrency,\n },\n );\n logger.info(\n colors.green(\n `Successfully synced ${newSoftwareDevelopmentKits.length} software development kits!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create software development kits! - ${err.message}`));\n }\n\n // Update existing software development kits\n const existingSoftwareDevelopmentKits = mapSoftwareDevelopmentKitsToExisting.filter(\n (x): x is [SoftwareDevelopmentKitInput, string] => !!x[1],\n );\n const chunks = chunk(existingSoftwareDevelopmentKits, CHUNK_SIZE);\n logger.info(\n colors.magenta(\n `Updating \"${existingSoftwareDevelopmentKits.length}\" software development kits...`,\n ),\n );\n\n await mapSeries(chunks, async (chunk) => {\n try {\n const updatedSdks = await updateSoftwareDevelopmentKits(\n client,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n chunk.map(([{ codePackageType, ...input }, id]) => ({\n ...input,\n id,\n })),\n );\n sdks.push(...updatedSdks);\n logger.info(\n colors.green(\n `Successfully updated \"${existingSoftwareDevelopmentKits.length}\" software development kits!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to update software development kits! - ${err.message}`));\n }\n\n logger.info(\n colors.green(`Synced \"${softwareDevelopmentKits.length}\" software development kits!`),\n );\n });\n\n // Return true upon success\n return {\n softwareDevelopmentKits: sdks,\n success: !encounteredError,\n };\n}\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk, uniq, keyBy, uniqBy } from 'lodash-es';\n\nimport { CodePackageInput, RepositoryInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { map, mapSeries } from '../bluebird.js';\nimport { CodePackage, fetchAllCodePackages } from './fetchAllCodePackages.js';\nimport { CREATE_CODE_PACKAGE, UPDATE_CODE_PACKAGES } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\nimport { syncRepositories } from './syncRepositories.js';\nimport { syncSoftwareDevelopmentKits } from './syncSoftwareDevelopmentKits.js';\n\nconst CHUNK_SIZE = 100;\n\nconst LOOKUP_SPLIT_KEY = '%%%%';\n\n/**\n * Create a new code package\n *\n * @param client - GraphQL client\n * @param input - Code package input\n * @returns Code package ID\n */\nexport async function createCodePackage(\n client: GraphQLClient,\n input: {\n /** Name of package */\n name: string;\n /** Description of package */\n description?: string;\n /** Type of package */\n type: CodePackageType;\n /** Relative path to package */\n relativePath: string;\n /** Repository ID */\n repositoryId?: string;\n /** Name of repository */\n repositoryName?: string;\n /** IDs of SDKs */\n softwareDevelopmentKitIds?: string[];\n /** IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** IDs of teams */\n teamIds?: string[];\n /** Names of teams */\n teamNames?: string[];\n },\n): Promise<CodePackage> {\n const {\n createCodePackage: { codePackage },\n } = await makeGraphQLRequest<{\n /** createCodePackage mutation */\n createCodePackage: {\n /** Code package */\n codePackage: CodePackage;\n };\n }>(client, CREATE_CODE_PACKAGE, {\n input,\n });\n logger.info(colors.green(`Successfully created code package \"${input.name}\"!`));\n return codePackage;\n}\n\n/**\n * Update an existing code package\n *\n * @param client - GraphQL client\n * @param inputs - Code package input\n * @returns Code packages that were updated\n */\nexport async function updateCodePackages(\n client: GraphQLClient,\n inputs: {\n /** ID of code package */\n id: string;\n /** Name of package */\n name: string;\n /** Description of package */\n description?: string;\n /** Type of package */\n type: CodePackageType;\n /** Relative path to package */\n relativePath: string;\n /** Repository ID */\n repositoryId?: string;\n /** Name of repository */\n repositoryName?: string;\n /** IDs of SDKs */\n softwareDevelopmentKitIds?: string[];\n /** IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** IDs of teams */\n teamIds?: string[];\n /** Names of teams */\n teamNames?: string[];\n }[],\n): Promise<CodePackage[]> {\n const {\n updateCodePackages: { codePackages },\n } = await makeGraphQLRequest<{\n /** updateCodePackages mutation */\n updateCodePackages: {\n /** Code packages */\n codePackages: CodePackage[];\n };\n }>(client, UPDATE_CODE_PACKAGES, {\n input: {\n codePackages: inputs,\n },\n });\n logger.info(colors.green(`Successfully updated ${inputs.length} code packages!`));\n return codePackages;\n}\n\n/**\n * Uploads silo discovery results for Transcend to classify\n *\n * @param client - GraphQL Client\n * @param codePackages - Packages to upload\n * @param concurrency - How many concurrent requests to make\n * @returns True if successful, false if any updates failed, or an error occurs\n */\nexport async function syncCodePackages(\n client: GraphQLClient,\n codePackages: CodePackageInput[],\n concurrency = 20,\n): Promise<boolean> {\n let encounteredError = false;\n const [existingCodePackages, { softwareDevelopmentKits: existingSoftwareDevelopmentKits }] =\n await Promise.all([\n // fetch all code packages\n fetchAllCodePackages(client),\n // make sure all SDKs exist\n syncSoftwareDevelopmentKits(\n client,\n uniqBy(\n codePackages\n .map(({ type, softwareDevelopmentKits = [] }) =>\n softwareDevelopmentKits.map(({ name }) => ({\n name,\n codePackageType: type,\n })),\n )\n .flat(),\n ({ name, codePackageType }) => `${name}${LOOKUP_SPLIT_KEY}${codePackageType}`,\n ),\n concurrency,\n ),\n // make sure all Repositories exist\n syncRepositories(\n client,\n uniqBy(codePackages, 'repositoryName').map(\n ({ repositoryName }) =>\n ({\n name: repositoryName,\n url: `https://github.com/${repositoryName}`,\n }) as RepositoryInput,\n ),\n ),\n ]);\n\n const softwareDevelopmentKitLookup = keyBy(\n existingSoftwareDevelopmentKits,\n ({ name, codePackageType }) => `${name}${LOOKUP_SPLIT_KEY}${codePackageType}`,\n );\n const codePackagesLookup = keyBy(\n existingCodePackages,\n ({ name, type }) => `${name}${LOOKUP_SPLIT_KEY}${type}`,\n );\n\n // Determine which codePackages are new vs existing\n const mapCodePackagesToExisting = codePackages.map((codePackageInput) => [\n codePackageInput,\n codePackagesLookup[`${codePackageInput.name}${LOOKUP_SPLIT_KEY}${codePackageInput.type}`]?.id,\n ]);\n\n // Create the new codePackages\n const newCodePackages = mapCodePackagesToExisting\n .filter(([, existing]) => !existing)\n .map(([codePackageInput]) => codePackageInput as CodePackageInput);\n try {\n logger.info(colors.magenta(`Creating \"${newCodePackages.length}\" new code packages...`));\n await map(\n newCodePackages,\n async ({ softwareDevelopmentKits, ...codePackage }) => {\n await createCodePackage(client, {\n ...codePackage,\n ...(softwareDevelopmentKits\n ? {\n softwareDevelopmentKitIds: uniq(\n softwareDevelopmentKits.map(({ name }) => {\n const sdk =\n softwareDevelopmentKitLookup[`${name}${LOOKUP_SPLIT_KEY}${codePackage.type}`];\n if (!sdk) {\n throw new Error(`Failed to find SDK with name: \"${name}\"`);\n }\n return sdk.id;\n }),\n ),\n }\n : {}),\n });\n },\n {\n concurrency,\n },\n );\n logger.info(colors.green(`Successfully synced ${newCodePackages.length} code packages!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create code packages! - ${err.message}`));\n }\n\n // Update existing codePackages\n const existingCodePackageInputs = mapCodePackagesToExisting.filter(\n (x): x is [CodePackageInput, string] => !!x[1],\n );\n logger.info(colors.magenta(`Updating \"${existingCodePackageInputs.length}\" code packages...`));\n const chunks = chunk(existingCodePackageInputs, CHUNK_SIZE);\n\n await mapSeries(chunks, async (chunk) => {\n try {\n await updateCodePackages(\n client,\n chunk.map(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ([{ softwareDevelopmentKits, repositoryName, ...input }, id]) => ({\n ...input,\n ...(softwareDevelopmentKits\n ? {\n softwareDevelopmentKitIds: uniq(\n softwareDevelopmentKits.map(({ name }) => {\n const sdk =\n softwareDevelopmentKitLookup[`${name}${LOOKUP_SPLIT_KEY}${input.type}`];\n if (!sdk) {\n throw new Error(`Failed to find SDK with name: \"${name}\"`);\n }\n return sdk.id;\n }),\n ),\n }\n : {}),\n id,\n }),\n ),\n );\n logger.info(colors.green(`Successfully updated \"${chunk.length}\" code packages!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to update code packages! - ${err.message}`));\n }\n });\n\n logger.info(colors.green(`Synced \"${codePackages.length}\" code packages!`));\n return !encounteredError;\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./logger-B-LXIf3U.mjs";import{n as t}from"./bluebird-CUitXgsY.mjs";import{M as n,a as r}from"./fetchConsentManagerId-
|
|
2
|
-
//# sourceMappingURL=syncCookies-
|
|
1
|
+
import{t as e}from"./logger-B-LXIf3U.mjs";import{n as t}from"./bluebird-CUitXgsY.mjs";import{M as n,a as r}from"./fetchConsentManagerId-CFkg3-RS.mjs";import{t as i}from"./makeGraphQLRequest-Cq26A_Lq.mjs";import{chunk as a}from"lodash-es";import o from"colors";async function s(e,o){let s=await r(e);await t(a(o,100),async t=>{await i(e,n,{airgapBundleId:s,cookies:t.map(e=>({name:e.name,trackingPurposes:e.trackingPurposes&&e.trackingPurposes.length>0?e.trackingPurposes:void 0,description:e.description,service:e.service,status:e.status,attributes:e.attributes,isRegex:e.isRegex}))})})}async function c(t,n){let r=!1;e.info(o.magenta(`Syncing "${n.length}" cookies...`));let i=n.filter(e=>n.filter(t=>e.name===t.name&&e.isRegex===t.isRegex).length>1);if(i.length>0)throw Error(`Failed to upload cookies as there were non-unique entries found: ${i.map(({name:e})=>e).join(`,`)}`);try{e.info(o.magenta(`Upserting "${n.length}" new cookies...`)),await s(t,n),e.info(o.green(`Successfully synced ${n.length} cookies!`))}catch(t){r=!0,e.info(o.red(`Failed to create cookies! - ${t.message}`))}return!r}export{s as n,c as t};
|
|
2
|
+
//# sourceMappingURL=syncCookies-BxY36BeJ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncCookies-
|
|
1
|
+
{"version":3,"file":"syncCookies-BxY36BeJ.mjs","names":[],"sources":["../src/lib/graphql/syncCookies.ts"],"sourcesContent":["import colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk } from 'lodash-es';\n\nimport { CookieInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries } from '../bluebird.js';\nimport { fetchConsentManagerId } from './fetchConsentManagerId.js';\nimport { UPDATE_OR_CREATE_COOKIES } from './gqls/index.js';\n// import { keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nconst MAX_PAGE_SIZE = 100;\n\n/**\n * Update or create cookies that already existed\n *\n * @param client - GraphQL client\n * @param cookieInputs - List of cookie input\n */\nexport async function updateOrCreateCookies(\n client: GraphQLClient,\n cookieInputs: CookieInput[],\n): Promise<void> {\n const airgapBundleId = await fetchConsentManagerId(client);\n\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // const purposes = await fetchAllPurposes(client);\n // const purposeNameToId = keyBy(purposes, 'name');\n\n await mapSeries(chunk(cookieInputs, MAX_PAGE_SIZE), async (page) => {\n await makeGraphQLRequest(client, UPDATE_OR_CREATE_COOKIES, {\n airgapBundleId,\n cookies: page.map((cookie) => ({\n name: cookie.name,\n trackingPurposes:\n cookie.trackingPurposes && cookie.trackingPurposes.length > 0\n ? cookie.trackingPurposes\n : undefined,\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // purposeIds: cookie.trackingPurposes\n // ? cookie.trackingPurposes\n // .filter((purpose) => purpose !== 'Unknown')\n // .map((purpose) => purposeNameToId[purpose].id)\n // : undefined,\n description: cookie.description,\n service: cookie.service,\n status: cookie.status,\n attributes: cookie.attributes,\n isRegex: cookie.isRegex,\n // TODO: https://transcend.height.app/T-23718\n // owners,\n // teams,\n })),\n });\n });\n}\n\n/**\n * Sync the set of cookies from the YML interface into the product\n *\n * @param client - GraphQL client\n * @param cookies - Cookies to sync\n * @returns True upon success, false upon failure\n */\nexport async function syncCookies(client: GraphQLClient, cookies: CookieInput[]): Promise<boolean> {\n let encounteredError = false;\n logger.info(colors.magenta(`Syncing \"${cookies.length}\" cookies...`));\n\n // Ensure no duplicates are being uploaded\n const notUnique = cookies.filter(\n (cookie) =>\n cookies.filter((cook) => cookie.name === cook.name && cookie.isRegex === cook.isRegex)\n .length > 1,\n );\n if (notUnique.length > 0) {\n throw new Error(\n `Failed to upload cookies as there were non-unique entries found: ${notUnique\n .map(({ name }) => name)\n .join(',')}`,\n );\n }\n\n try {\n logger.info(colors.magenta(`Upserting \"${cookies.length}\" new cookies...`));\n await updateOrCreateCookies(client, cookies);\n logger.info(colors.green(`Successfully synced ${cookies.length} cookies!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create cookies! - ${err.message}`));\n }\n\n return !encounteredError;\n}\n"],"mappings":"oQAoBA,eAAsB,EACpB,EACA,EACe,CACf,IAAM,EAAiB,MAAM,EAAsB,EAAO,CAM1D,MAAM,EAAU,EAAM,EAAc,IAAc,CAAE,KAAO,IAAS,CAClE,MAAM,EAAmB,EAAQ,EAA0B,CACzD,iBACA,QAAS,EAAK,IAAK,IAAY,CAC7B,KAAM,EAAO,KACb,iBACE,EAAO,kBAAoB,EAAO,iBAAiB,OAAS,EACxD,EAAO,iBACP,IAAA,GAON,YAAa,EAAO,YACpB,QAAS,EAAO,QAChB,OAAQ,EAAO,OACf,WAAY,EAAO,WACnB,QAAS,EAAO,QAIjB,EAAE,CACJ,CAAC,EACF,CAUJ,eAAsB,EAAY,EAAuB,EAA0C,CACjG,IAAI,EAAmB,GACvB,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAQ,OAAO,cAAc,CAAC,CAGrE,IAAM,EAAY,EAAQ,OACvB,GACC,EAAQ,OAAQ,GAAS,EAAO,OAAS,EAAK,MAAQ,EAAO,UAAY,EAAK,QAAQ,CACnF,OAAS,EACf,CACD,GAAI,EAAU,OAAS,EACrB,MAAU,MACR,oEAAoE,EACjE,KAAK,CAAE,UAAW,EAAK,CACvB,KAAK,IAAI,GACb,CAGH,GAAI,CACF,EAAO,KAAK,EAAO,QAAQ,cAAc,EAAQ,OAAO,kBAAkB,CAAC,CAC3E,MAAM,EAAsB,EAAQ,EAAQ,CAC5C,EAAO,KAAK,EAAO,MAAM,uBAAuB,EAAQ,OAAO,WAAW,CAAC,OACpE,EAAK,CACZ,EAAmB,GACnB,EAAO,KAAK,EAAO,IAAI,+BAA+B,EAAI,UAAU,CAAC,CAGvE,MAAO,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{t as e}from"./logger-B-LXIf3U.mjs";import{n as t}from"./bluebird-CUitXgsY.mjs";import{A as n,a as r,p as i}from"./fetchConsentManagerId-
|
|
2
|
-
//# sourceMappingURL=syncDataFlows-
|
|
1
|
+
import{t as e}from"./logger-B-LXIf3U.mjs";import{n as t}from"./bluebird-CUitXgsY.mjs";import{A as n,a as r,p as i}from"./fetchConsentManagerId-CFkg3-RS.mjs";import{t as a}from"./makeGraphQLRequest-Cq26A_Lq.mjs";import{t as o}from"./fetchAllDataFlows-D248lO6_.mjs";import{ConsentTrackerStatus as s}from"@transcend-io/privacy-types";import{chunk as c}from"lodash-es";import l from"colors";async function u(e,i,o=!1){let s=await r(e);await t(c(i,100),async t=>{await a(e,n,{airgapBundleId:s,dataFlows:t.map(([e,t])=>({id:t,value:e.value,type:e.type,trackingType:e.trackingPurposes&&e.trackingPurposes.length>0?e.trackingPurposes:void 0,description:e.description,service:e.service,status:e.status,attributes:e.attributes})),classifyService:o})})}async function d(e,n,o=!1){let s=await r(e);await t(c(n,100),async t=>{await a(e,i,{airgapBundleId:s,dataFlows:t.map(e=>({value:e.value,type:e.type,trackingType:e.trackingPurposes&&e.trackingPurposes.length>0?e.trackingPurposes:void 0,description:e.description,service:e.service,status:e.status,attributes:e.attributes})),dropMatchingDataFlowsInTriage:!0,classifyService:o})})}async function f(t,n,r){let i=!1;e.info(l.magenta(`Syncing "${n.length}" data flows...`));let a=n.filter(e=>n.filter(t=>e.value===t.value&&e.type===t.type).length>1);if(a.length>0)throw Error(`Failed to upload data flows as there were non-unique entries found: ${a.map(({value:e})=>e).join(`,`)}`);e.info(l.magenta(`Fetching data flows...`));let[c,f]=await Promise.all([o(t,s.Live),o(t,s.NeedsReview)]),p=[...c,...f],m=n.map(e=>[e,p.find(t=>e.value===t.value&&e.type===t.type)?.id]),h=m.filter(([,e])=>!e).map(([e])=>e);try{e.info(l.magenta(`Creating "${h.length}" new data flows...`)),await d(t,h,r),e.info(l.green(`Successfully synced ${h.length} data flows!`))}catch(t){i=!0,e.info(l.red(`Failed to create data flows! - ${t.message}`))}let g=m.filter(e=>!!e[1]);try{e.info(l.magenta(`Updating "${g.length}" data flows...`)),await u(t,g,r),e.info(l.green(`Successfully updated "${g.length}" data flows!`))}catch(t){i=!0,e.info(l.red(`Failed to create data flows! - ${t.message}`))}return e.info(l.green(`Synced "${n.length}" data flows!`)),!i}export{f as n,u as r,d as t};
|
|
2
|
+
//# sourceMappingURL=syncDataFlows-Cx5LZCen.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncDataFlows-
|
|
1
|
+
{"version":3,"file":"syncDataFlows-Cx5LZCen.mjs","names":[],"sources":["../src/lib/graphql/syncDataFlows.ts"],"sourcesContent":["import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk } from 'lodash-es';\n\nimport { DataFlowInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries } from '../bluebird.js';\nimport { fetchAllDataFlows } from './fetchAllDataFlows.js';\nimport { fetchConsentManagerId } from './fetchConsentManagerId.js';\nimport { CREATE_DATA_FLOWS, UPDATE_DATA_FLOWS } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nconst MAX_PAGE_SIZE = 100;\n\n/**\n * Update data flows that already existed\n *\n * @param client - GraphQL client\n * @param dataFlowInputs - [DataFlowInput, Data Flow ID] mappings to update\n * @param classifyService - classify service if missing\n */\nexport async function updateDataFlows(\n client: GraphQLClient,\n dataFlowInputs: [DataFlowInput, string][],\n classifyService = false,\n): Promise<void> {\n const airgapBundleId = await fetchConsentManagerId(client);\n\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // const purposes = await fetchAllPurposes(client);\n // const purposeNameToId = keyBy(purposes, 'name');\n\n await mapSeries(chunk(dataFlowInputs, MAX_PAGE_SIZE), async (page) => {\n await makeGraphQLRequest(client, UPDATE_DATA_FLOWS, {\n airgapBundleId,\n dataFlows: page.map(([flow, id]) => ({\n id,\n value: flow.value,\n type: flow.type,\n trackingType:\n flow.trackingPurposes && flow.trackingPurposes.length > 0\n ? flow.trackingPurposes\n : undefined,\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // purposeIds: flow.trackingPurposes\n // ? flow.trackingPurposes\n // .filter((purpose) => purpose !== 'Unknown')\n // .map((purpose) => purposeNameToId[purpose].id)\n // : undefined,\n description: flow.description,\n service: flow.service,\n status: flow.status,\n attributes: flow.attributes,\n // TODO: https://transcend.height.app/T-23718\n // owners,\n // teams,\n })),\n classifyService,\n });\n });\n}\n\n/**\n * Create new data flows\n *\n * @param client - GraphQL client\n * @param dataFlowInputs - List of data flows to create\n * @param classifyService - classify service if missing\n */\nexport async function createDataFlows(\n client: GraphQLClient,\n dataFlowInputs: DataFlowInput[],\n classifyService = false,\n): Promise<void> {\n const airgapBundleId = await fetchConsentManagerId(client);\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // const purposes = await fetchAllPurposes(client);\n // const purposeNameToId = keyBy(purposes, 'name');\n await mapSeries(chunk(dataFlowInputs, MAX_PAGE_SIZE), async (page) => {\n await makeGraphQLRequest(client, CREATE_DATA_FLOWS, {\n airgapBundleId,\n dataFlows: page.map((flow) => ({\n value: flow.value,\n type: flow.type,\n trackingType:\n flow.trackingPurposes && flow.trackingPurposes.length > 0\n ? flow.trackingPurposes\n : undefined,\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // purposeIds: flow.trackingPurposes\n // ? flow.trackingPurposes\n // .filter((purpose) => purpose !== 'Unknown')\n // .map((purpose) => purposeNameToId[purpose].id)\n // : undefined,\n description: flow.description,\n service: flow.service,\n status: flow.status,\n attributes: flow.attributes,\n // TODO: https://transcend.height.app/T-23718\n // owners,\n // teams,\n })),\n dropMatchingDataFlowsInTriage: true,\n classifyService,\n });\n });\n}\n\n/**\n * Sync data flow configurations into Transcend\n *\n * @param client - GraphQL client\n * @param dataFlows - The data flows to upload\n * @param classifyService - When true, auto classify the service based on the data flow value\n * @returns True if the command ran successfully, returns false if an error occurred\n */\nexport async function syncDataFlows(\n client: GraphQLClient,\n dataFlows: DataFlowInput[],\n classifyService: boolean,\n): Promise<boolean> {\n let encounteredError = false;\n logger.info(colors.magenta(`Syncing \"${dataFlows.length}\" data flows...`));\n\n // Ensure no duplicates are being uploaded\n // De-dupe the data flows based on [value, type]\n const notUnique = dataFlows.filter(\n (dataFlow) =>\n dataFlows.filter((flow) => dataFlow.value === flow.value && dataFlow.type === flow.type)\n .length > 1,\n );\n\n // Throw error to prompt user to de-dupe before uploading\n if (notUnique.length > 0) {\n throw new Error(\n `Failed to upload data flows as there were non-unique entries found: ${notUnique\n .map(({ value }) => value)\n .join(',')}`,\n );\n }\n\n // Fetch existing data flows to determine whether we are creating a new data flow\n // or updating an existing data flow\n logger.info(colors.magenta('Fetching data flows...'));\n const [existingLiveDataFlows, existingInReviewDataFlows] = await Promise.all([\n fetchAllDataFlows(client, ConsentTrackerStatus.Live),\n fetchAllDataFlows(client, ConsentTrackerStatus.NeedsReview),\n ]);\n const allDataFlows = [...existingLiveDataFlows, ...existingInReviewDataFlows];\n\n // Determine which data flows are new vs existing\n const mapDataFlowsToExisting = dataFlows.map((dataFlow) => [\n dataFlow,\n allDataFlows.find((flow) => dataFlow.value === flow.value && dataFlow.type === flow.type)?.id,\n ]);\n\n // Create the new data flows\n const newDataFlows = mapDataFlowsToExisting\n .filter(([, existing]) => !existing)\n .map(([flow]) => flow as DataFlowInput);\n try {\n logger.info(colors.magenta(`Creating \"${newDataFlows.length}\" new data flows...`));\n await createDataFlows(client, newDataFlows, classifyService);\n logger.info(colors.green(`Successfully synced ${newDataFlows.length} data flows!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create data flows! - ${err.message}`));\n }\n\n // Update existing data flows\n const existingDataFlows = mapDataFlowsToExisting.filter(\n (x): x is [DataFlowInput, string] => !!x[1],\n );\n try {\n logger.info(colors.magenta(`Updating \"${existingDataFlows.length}\" data flows...`));\n await updateDataFlows(client, existingDataFlows, classifyService);\n logger.info(colors.green(`Successfully updated \"${existingDataFlows.length}\" data flows!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create data flows! - ${err.message}`));\n }\n\n logger.info(colors.green(`Synced \"${dataFlows.length}\" data flows!`));\n\n // Return true upon success\n return !encounteredError;\n}\n"],"mappings":"mYAsBA,eAAsB,EACpB,EACA,EACA,EAAkB,GACH,CACf,IAAM,EAAiB,MAAM,EAAsB,EAAO,CAM1D,MAAM,EAAU,EAAM,EAAgB,IAAc,CAAE,KAAO,IAAS,CACpE,MAAM,EAAmB,EAAQ,EAAmB,CAClD,iBACA,UAAW,EAAK,KAAK,CAAC,EAAM,MAAS,CACnC,KACA,MAAO,EAAK,MACZ,KAAM,EAAK,KACX,aACE,EAAK,kBAAoB,EAAK,iBAAiB,OAAS,EACpD,EAAK,iBACL,IAAA,GAON,YAAa,EAAK,YAClB,QAAS,EAAK,QACd,OAAQ,EAAK,OACb,WAAY,EAAK,WAIlB,EAAE,CACH,kBACD,CAAC,EACF,CAUJ,eAAsB,EACpB,EACA,EACA,EAAkB,GACH,CACf,IAAM,EAAiB,MAAM,EAAsB,EAAO,CAI1D,MAAM,EAAU,EAAM,EAAgB,IAAc,CAAE,KAAO,IAAS,CACpE,MAAM,EAAmB,EAAQ,EAAmB,CAClD,iBACA,UAAW,EAAK,IAAK,IAAU,CAC7B,MAAO,EAAK,MACZ,KAAM,EAAK,KACX,aACE,EAAK,kBAAoB,EAAK,iBAAiB,OAAS,EACpD,EAAK,iBACL,IAAA,GAON,YAAa,EAAK,YAClB,QAAS,EAAK,QACd,OAAQ,EAAK,OACb,WAAY,EAAK,WAIlB,EAAE,CACH,8BAA+B,GAC/B,kBACD,CAAC,EACF,CAWJ,eAAsB,EACpB,EACA,EACA,EACkB,CAClB,IAAI,EAAmB,GACvB,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAU,OAAO,iBAAiB,CAAC,CAI1E,IAAM,EAAY,EAAU,OACzB,GACC,EAAU,OAAQ,GAAS,EAAS,QAAU,EAAK,OAAS,EAAS,OAAS,EAAK,KAAK,CACrF,OAAS,EACf,CAGD,GAAI,EAAU,OAAS,EACrB,MAAU,MACR,uEAAuE,EACpE,KAAK,CAAE,WAAY,EAAM,CACzB,KAAK,IAAI,GACb,CAKH,EAAO,KAAK,EAAO,QAAQ,yBAAyB,CAAC,CACrD,GAAM,CAAC,EAAuB,GAA6B,MAAM,QAAQ,IAAI,CAC3E,EAAkB,EAAQ,EAAqB,KAAK,CACpD,EAAkB,EAAQ,EAAqB,YAAY,CAC5D,CAAC,CACI,EAAe,CAAC,GAAG,EAAuB,GAAG,EAA0B,CAGvE,EAAyB,EAAU,IAAK,GAAa,CACzD,EACA,EAAa,KAAM,GAAS,EAAS,QAAU,EAAK,OAAS,EAAS,OAAS,EAAK,KAAK,EAAE,GAC5F,CAAC,CAGI,EAAe,EAClB,QAAQ,EAAG,KAAc,CAAC,EAAS,CACnC,KAAK,CAAC,KAAU,EAAsB,CACzC,GAAI,CACF,EAAO,KAAK,EAAO,QAAQ,aAAa,EAAa,OAAO,qBAAqB,CAAC,CAClF,MAAM,EAAgB,EAAQ,EAAc,EAAgB,CAC5D,EAAO,KAAK,EAAO,MAAM,uBAAuB,EAAa,OAAO,cAAc,CAAC,OAC5E,EAAK,CACZ,EAAmB,GACnB,EAAO,KAAK,EAAO,IAAI,kCAAkC,EAAI,UAAU,CAAC,CAI1E,IAAM,EAAoB,EAAuB,OAC9C,GAAoC,CAAC,CAAC,EAAE,GAC1C,CACD,GAAI,CACF,EAAO,KAAK,EAAO,QAAQ,aAAa,EAAkB,OAAO,iBAAiB,CAAC,CACnF,MAAM,EAAgB,EAAQ,EAAmB,EAAgB,CACjE,EAAO,KAAK,EAAO,MAAM,yBAAyB,EAAkB,OAAO,eAAe,CAAC,OACpF,EAAK,CACZ,EAAmB,GACnB,EAAO,KAAK,EAAO,IAAI,kCAAkC,EAAI,UAAU,CAAC,CAM1E,OAHA,EAAO,KAAK,EAAO,MAAM,WAAW,EAAU,OAAO,eAAe,CAAC,CAG9D,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as e}from"./makeGraphQLRequest-
|
|
1
|
+
import{t as e}from"./makeGraphQLRequest-Cq26A_Lq.mjs";import{gql as t}from"graphql-request";const n=t`
|
|
2
2
|
query TranscendCliTemplates($title: String, $first: Int!, $offset: Int!) {
|
|
3
3
|
templates(filterBy: { text: $title }, first: $first, offset: $offset, useMaster: false) {
|
|
4
4
|
nodes {
|
|
@@ -20,4 +20,4 @@ import{t as e}from"./makeGraphQLRequest-G078PsEL.mjs";import{gql as t}from"graph
|
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
`;async function i(t,r){let i=[],a=0,o=!1;do{let{templates:{nodes:s}}=await e(t,n,{first:20,offset:a,title:r});i.push(...s),a+=20,o=s.length===20}while(o);return i.sort((e,t)=>e.title.localeCompare(t.title))}async function a(t,n){(await i(n,t.title)).find(({title:e})=>e===t.title)||await e(n,r,{title:t.title})}export{n as i,a as n,r,i as t};
|
|
23
|
-
//# sourceMappingURL=syncTemplates-
|
|
23
|
+
//# sourceMappingURL=syncTemplates-BrH7Yr0V.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"syncTemplates-
|
|
1
|
+
{"version":3,"file":"syncTemplates-BrH7Yr0V.mjs","names":[],"sources":["../src/lib/graphql/gqls/template.ts","../src/lib/graphql/syncTemplates.ts"],"sourcesContent":["import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - order by createdAt\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const TEMPLATES = gql`\n query TranscendCliTemplates($title: String, $first: Int!, $offset: Int!) {\n templates(filterBy: { text: $title }, first: $first, offset: $offset, useMaster: false) {\n nodes {\n id\n title\n subject {\n defaultMessage\n }\n template {\n defaultMessage\n }\n }\n }\n }\n`;\n\nexport const CREATE_TEMPLATE = gql`\n mutation TranscendCliCreateTemplate($title: String!) {\n createTemplate(input: { title: $title, template: \"\", subject: $title }) {\n clientMutationId\n }\n }\n`;\n","import { GraphQLClient } from 'graphql-request';\n\nimport { TemplateInput } from '../../codecs.js';\nimport { TEMPLATES, CREATE_TEMPLATE } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nexport interface Template {\n /** ID of Template */\n id: string;\n /** Title of Template */\n title: string;\n /** Template subject (e.g. email subject) */\n subject: {\n /** Default message for template subject */\n defaultMessage: string;\n };\n /** Template body - rich text HTML */\n template: {\n /** Default message for template body */\n defaultMessage: string;\n };\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all Templates in the organization\n *\n * @param client - GraphQL client\n * @param title - Filter by title\n * @returns All Templates in the organization\n */\nexport async function fetchAllTemplates(\n client: GraphQLClient,\n title?: string,\n): Promise<Template[]> {\n const templates: Template[] = [];\n let offset = 0;\n\n // Try to fetch an Template with the same title\n let shouldContinue = false;\n do {\n const {\n templates: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n templates: {\n /** List of matches */\n nodes: Template[];\n };\n }>(client, TEMPLATES, {\n first: PAGE_SIZE,\n offset,\n title,\n });\n templates.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return templates.sort((a, b) => a.title.localeCompare(b.title));\n}\n\n/**\n * Sync an email template configuration\n *\n * @param template - The email template input\n * @param client - GraphQL client\n */\nexport async function syncTemplate(template: TemplateInput, client: GraphQLClient): Promise<void> {\n // Try to fetch an Template with the same title\n const matches = await fetchAllTemplates(client, template.title);\n const existingTemplate = matches.find(({ title }) => title === template.title);\n\n // If Template exists, update it\n if (!existingTemplate) {\n await makeGraphQLRequest(client, CREATE_TEMPLATE, {\n title: template.title,\n });\n }\n}\n"],"mappings":"4FAKA,MAAa,EAAY,CAAG;;;;;;;;;;;;;;;EAiBf,EAAkB,CAAG;;;;;;ECUlC,eAAsB,EACpB,EACA,EACqB,CACrB,IAAM,EAAwB,EAAE,CAC5B,EAAS,EAGT,EAAiB,GACrB,EAAG,CACD,GAAM,CACJ,UAAW,CAAE,UACX,MAAM,EAMP,EAAQ,EAAW,CACpB,MAAO,GACP,SACA,QACD,CAAC,CACF,EAAU,KAAK,GAAG,EAAM,CACxB,GAAU,GACV,EAAiB,EAAM,SAAW,SAC3B,GAET,OAAO,EAAU,MAAM,EAAG,IAAM,EAAE,MAAM,cAAc,EAAE,MAAM,CAAC,CASjE,eAAsB,EAAa,EAAyB,EAAsC,EAEhF,MAAM,EAAkB,EAAQ,EAAS,MAAM,EAC9B,MAAM,CAAE,WAAY,IAAU,EAAS,MAAM,EAI5E,MAAM,EAAmB,EAAQ,EAAiB,CAChD,MAAO,EAAS,MACjB,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{n}from"./bluebird-CUitXgsY.mjs";import{O as r,a as i,h as a}from"./fetchConsentManagerId-
|
|
2
|
-
//# sourceMappingURL=updateConsentManagerVersionToLatest-
|
|
1
|
+
import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{n}from"./bluebird-CUitXgsY.mjs";import{O as r,a as i,h as a}from"./fetchConsentManagerId-CFkg3-RS.mjs";import{r as o,t as s}from"./makeGraphQLRequest-Cq26A_Lq.mjs";import{ConsentBundleType as c}from"@transcend-io/privacy-types";import l from"colors";async function u(e,{id:t,bundleType:n}){await s(e,a,{airgapBundleId:t,bundleType:n})}async function d(e,{id:t,bundleType:n}){await s(e,r,{airgapBundleId:t,bundleType:n})}async function f({auth:r,deploy:a=!1,transcendUrl:s=e,bundleTypes:f=Object.values(c)}){let p=o(s,r),m=await i(p);await n(f,async e=>{t.info(l.magenta(`Update Consent Manager bundle with ID "${m}" and type "${e}" to latest version...`)),await d(p,{id:m,bundleType:e}),t.info(l.green(`Updated Consent Manager bundle with ID "${m}" and type "${e}" to latest version!`))}),a&&await n(f,async e=>{t.info(l.magenta(`Deploying Consent Manager bundle with ID "${m}" and type "${e}"...`)),await u(p,{id:m,bundleType:e}),t.info(l.green(`Deployed Consent Manager bundle with ID "${m}" and type "${e}"!`))})}export{u as n,d as r,f as t};
|
|
2
|
+
//# sourceMappingURL=updateConsentManagerVersionToLatest-C221vAAw.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateConsentManagerVersionToLatest-
|
|
1
|
+
{"version":3,"file":"updateConsentManagerVersionToLatest-C221vAAw.mjs","names":[],"sources":["../src/lib/graphql/deployConsentManager.ts","../src/lib/consent-manager/updateConsentManagerVersionToLatest.ts"],"sourcesContent":["import { ConsentBundleType } from '@transcend-io/privacy-types';\nimport { GraphQLClient } from 'graphql-request';\n\nimport { UPDATE_CONSENT_MANAGER_TO_LATEST, DEPLOY_CONSENT_MANAGER } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\n/**\n * Deploy the Consent Manager\n *\n * @param client - GraphQL client\n * @param options - Options\n */\nexport async function deployConsentManager(\n client: GraphQLClient,\n {\n id,\n bundleType,\n }: {\n /** ID of Consent Manager */\n id: string;\n /** Type of bundle */\n bundleType: ConsentBundleType;\n },\n): Promise<void> {\n await makeGraphQLRequest(client, DEPLOY_CONSENT_MANAGER, {\n airgapBundleId: id,\n bundleType,\n });\n}\n\n/**\n * Update the Consent Manager to the latest airgap.jz version\n *\n * @param client - GraphQL client\n * @param options - Options\n */\nexport async function updateConsentManagerToLatest(\n client: GraphQLClient,\n {\n id,\n bundleType,\n }: {\n /** ID of Consent Manager */\n id: string;\n /** Type of bundle */\n bundleType: ConsentBundleType;\n },\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_CONSENT_MANAGER_TO_LATEST, {\n airgapBundleId: id,\n bundleType,\n });\n}\n","import { ConsentBundleType } from '@transcend-io/privacy-types';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries } from '../bluebird.js';\nimport {\n updateConsentManagerToLatest,\n buildTranscendGraphQLClient,\n fetchConsentManagerId,\n deployConsentManager,\n} from '../graphql/index.js';\n\n/**\n * Update the consent manager to latest version\n *\n * @param options - Options\n */\nexport async function updateConsentManagerVersionToLatest({\n auth,\n deploy = false,\n transcendUrl = DEFAULT_TRANSCEND_API,\n bundleTypes = Object.values(ConsentBundleType),\n}: {\n /** Transcend API key authentication */\n auth: string;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Deploy consent manager with this update */\n deploy?: boolean;\n /** The bundle types to update and deploy */\n bundleTypes?: ConsentBundleType[];\n}): Promise<void> {\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Grab Consent Manager ID\n const consentManagerId = await fetchConsentManagerId(client);\n\n // Update each bundle type to latest version\n await mapSeries(bundleTypes, async (bundleType) => {\n logger.info(\n colors.magenta(\n `Update Consent Manager bundle with ID \"${consentManagerId}\" and type \"${bundleType}\" to latest version...`,\n ),\n );\n await updateConsentManagerToLatest(client, {\n id: consentManagerId,\n bundleType,\n });\n logger.info(\n colors.green(\n `Updated Consent Manager bundle with ID \"${consentManagerId}\" and type \"${bundleType}\" to latest version!`,\n ),\n );\n });\n\n // deploy Consent Managers\n if (deploy) {\n // Update each bundle type to latest version\n await mapSeries(bundleTypes, async (bundleType) => {\n logger.info(\n colors.magenta(\n `Deploying Consent Manager bundle with ID \"${consentManagerId}\" and type \"${bundleType}\"...`,\n ),\n );\n await deployConsentManager(client, {\n id: consentManagerId,\n bundleType,\n });\n logger.info(\n colors.green(\n `Deployed Consent Manager bundle with ID \"${consentManagerId}\" and type \"${bundleType}\"!`,\n ),\n );\n });\n }\n}\n"],"mappings":"mVAYA,eAAsB,EACpB,EACA,CACE,KACA,cAOa,CACf,MAAM,EAAmB,EAAQ,EAAwB,CACvD,eAAgB,EAChB,aACD,CAAC,CASJ,eAAsB,EACpB,EACA,CACE,KACA,cAOa,CACf,MAAM,EAAmB,EAAQ,EAAkC,CACjE,eAAgB,EAChB,aACD,CAAC,CCjCJ,eAAsB,EAAoC,CACxD,OACA,SAAS,GACT,eAAe,EACf,cAAc,OAAO,OAAO,EAAkB,EAU9B,CAEhB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAmB,MAAM,EAAsB,EAAO,CAG5D,MAAM,EAAU,EAAa,KAAO,IAAe,CACjD,EAAO,KACL,EAAO,QACL,0CAA0C,EAAiB,cAAc,EAAW,wBACrF,CACF,CACD,MAAM,EAA6B,EAAQ,CACzC,GAAI,EACJ,aACD,CAAC,CACF,EAAO,KACL,EAAO,MACL,2CAA2C,EAAiB,cAAc,EAAW,sBACtF,CACF,EACD,CAGE,GAEF,MAAM,EAAU,EAAa,KAAO,IAAe,CACjD,EAAO,KACL,EAAO,QACL,6CAA6C,EAAiB,cAAc,EAAW,MACxF,CACF,CACD,MAAM,EAAqB,EAAQ,CACjC,GAAI,EACJ,aACD,CAAC,CACF,EAAO,KACL,EAAO,MACL,4CAA4C,EAAiB,cAAc,EAAW,IACvF,CACF,EACD"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{A as n}from"./codecs-BE3Wmoh8.mjs";import{t as r}from"./splitCsvToList-BRq_CIfd.mjs";import{t as i}from"./readCsv-CyOL7eCc.mjs";import{r as a}from"./makeGraphQLRequest-
|
|
2
|
-
//# sourceMappingURL=uploadCookiesFromCsv-
|
|
1
|
+
import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{A as n}from"./codecs-BE3Wmoh8.mjs";import{t as r}from"./splitCsvToList-BRq_CIfd.mjs";import{t as i}from"./readCsv-CyOL7eCc.mjs";import{r as a}from"./makeGraphQLRequest-Cq26A_Lq.mjs";import{t as o}from"./syncCookies-BxY36BeJ.mjs";import s from"colors";const c=[`ID`,`Activity`,`Encounters`,`Last Seen At`,`Has Native Do Not Sell/Share Support`,`IAB USP API Support`,`Service Description`,`Website URL`,`Categories of Recipients`];async function l({auth:l,trackerStatus:u,file:d,transcendUrl:f=e}){let p=a(f,l);t.info(s.magenta(`Reading "${d}" from disk`)),await o(p,i(d,n).map(({"Is Regex?":e,Notes:t,Service:n,Purpose:i,Status:a,Owners:o,Teams:s,Name:l,...d})=>({...typeof e==`string`?{isRegex:e.toLowerCase()===`true`}:{},name:l,description:t,trackingPurposes:r(i),status:a||u,owners:o?r(o):void 0,teams:s?r(s):void 0,attributes:Object.entries(d).filter(([e])=>!c.includes(e)).map(([e,t])=>({key:e,values:r(t)}))})))||(t.error(s.red(`Encountered error(s) syncing cookies from CSV, see logs above for more info. `)),process.exit(1))}export{l as t};
|
|
2
|
+
//# sourceMappingURL=uploadCookiesFromCsv-roHWekOP.mjs.map
|
package/dist/{uploadCookiesFromCsv-BKZx_E_2.mjs.map → uploadCookiesFromCsv-roHWekOP.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadCookiesFromCsv-
|
|
1
|
+
{"version":3,"file":"uploadCookiesFromCsv-roHWekOP.mjs","names":[],"sources":["../src/lib/consent-manager/uploadCookiesFromCsv.ts"],"sourcesContent":["import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport colors from 'colors';\n\nimport { CookieInput, CookieCsvInput } from '../../codecs.js';\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { buildTranscendGraphQLClient, syncCookies } from '../graphql/index.js';\nimport { splitCsvToList } from '../requests/index.js';\nimport { readCsv } from '../requests/readCsv.js';\n\nconst OMIT_COLUMNS = [\n 'ID',\n 'Activity',\n 'Encounters',\n 'Last Seen At',\n 'Has Native Do Not Sell/Share Support',\n 'IAB USP API Support',\n 'Service Description',\n 'Website URL',\n 'Categories of Recipients',\n];\n\n/**\n * Upload a set of cookies from CSV\n *\n * @param options - Options\n */\nexport async function uploadCookiesFromCsv({\n auth,\n trackerStatus,\n file,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** Sombra API key authentication */\n trackerStatus: ConsentTrackerStatus;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<void> {\n // Build a GraphQL client\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Read from CSV the set of cookie inputs\n logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const cookieInputs = readCsv(file, CookieCsvInput);\n\n // Convert these inputs into a format that the other function can use\n const validatedCookieInputs = cookieInputs.map(\n ({\n 'Is Regex?': isRegex,\n Notes,\n // TODO: https://transcend.height.app/T-26391 - export in CSV\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Service,\n Purpose,\n Status,\n Owners,\n Teams,\n Name,\n ...rest\n }): CookieInput => ({\n ...(typeof isRegex === 'string' ? { isRegex: isRegex.toLowerCase() === 'true' } : {}),\n name: Name,\n description: Notes,\n trackingPurposes: splitCsvToList(Purpose),\n // TODO: https://transcend.height.app/T-26391\n // service: Service,\n // Apply the trackerStatus to all values in the CSV -> allows for customer to define tracker status\n // on a row by row basis if needed\n status: Status || trackerStatus,\n owners: Owners ? splitCsvToList(Owners) : undefined,\n teams: Teams ? splitCsvToList(Teams) : undefined,\n // all remaining options are attribute\n attributes: Object.entries(rest)\n // filter out native columns that are exported from the admin dashboard\n // but not custom attributes\n .filter(([key]) => !OMIT_COLUMNS.includes(key))\n .map(([key, value]) => ({\n key,\n values: splitCsvToList(value),\n })),\n }),\n );\n\n // Upload the cookies into Transcend dashboard\n const syncedCookies = await syncCookies(client, validatedCookieInputs);\n\n // Log errors\n if (!syncedCookies) {\n logger.error(\n colors.red('Encountered error(s) syncing cookies from CSV, see logs above for more info. '),\n );\n process.exit(1);\n }\n}\n"],"mappings":"oVAUA,MAAM,EAAe,CACnB,KACA,WACA,aACA,eACA,uCACA,sBACA,sBACA,cACA,2BACD,CAOD,eAAsB,EAAqB,CACzC,OACA,gBACA,OACA,eAAe,GAUC,CAEhB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAG9D,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAK,aAAa,CAAC,CA0CpC,MAAM,EAAY,EAzCnB,EAAQ,EAAM,EAAe,CAGP,KACxC,CACC,YAAa,EACb,QAGA,UACA,UACA,SACA,SACA,QACA,OACA,GAAG,MACe,CAClB,GAAI,OAAO,GAAY,SAAW,CAAE,QAAS,EAAQ,aAAa,GAAK,OAAQ,CAAG,EAAE,CACpF,KAAM,EACN,YAAa,EACb,iBAAkB,EAAe,EAAQ,CAKzC,OAAQ,GAAU,EAClB,OAAQ,EAAS,EAAe,EAAO,CAAG,IAAA,GAC1C,MAAO,EAAQ,EAAe,EAAM,CAAG,IAAA,GAEvC,WAAY,OAAO,QAAQ,EAAK,CAG7B,QAAQ,CAAC,KAAS,CAAC,EAAa,SAAS,EAAI,CAAC,CAC9C,KAAK,CAAC,EAAK,MAAY,CACtB,MACA,OAAQ,EAAe,EAAM,CAC9B,EAAE,CACN,EACF,CAGqE,GAIpE,EAAO,MACL,EAAO,IAAI,gFAAgF,CAC5F,CACD,QAAQ,KAAK,EAAE"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{I as n}from"./codecs-BE3Wmoh8.mjs";import{t as r}from"./splitCsvToList-BRq_CIfd.mjs";import{t as i}from"./readCsv-CyOL7eCc.mjs";import{r as a}from"./makeGraphQLRequest-
|
|
2
|
-
//# sourceMappingURL=uploadDataFlowsFromCsv-
|
|
1
|
+
import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{I as n}from"./codecs-BE3Wmoh8.mjs";import{t as r}from"./splitCsvToList-BRq_CIfd.mjs";import{t as i}from"./readCsv-CyOL7eCc.mjs";import{r as a}from"./makeGraphQLRequest-Cq26A_Lq.mjs";import{n as o}from"./syncDataFlows-Cx5LZCen.mjs";import s from"colors";const c=[`ID`,`Activity`,`Encounters`,`Last Seen At`,`Has Native Do Not Sell/Share Support`,`IAB USP API Support`,`Service Description`,`Website URL`,`Categories of Recipients`];async function l({auth:l,trackerStatus:u,file:d,classifyService:f=!1,transcendUrl:p=e}){let m=a(p,l);t.info(s.magenta(`Reading "${d}" from disk`)),await o(m,i(d,n).map(({Type:e,Notes:t,Service:n,Purpose:i,Status:a,Owners:o,Teams:s,"Connections Made To":l,...d})=>({value:l,type:e,description:t,trackingPurposes:r(i),status:a||u,owners:o?r(o):void 0,teams:s?r(s):void 0,attributes:Object.entries(d).filter(([e])=>!c.includes(e)).map(([e,t])=>({key:e,values:r(t)}))})),f)||(t.error(s.red(`Encountered error(s) syncing data flows from CSV, see logs above for more info. `)),process.exit(1))}export{l as t};
|
|
2
|
+
//# sourceMappingURL=uploadDataFlowsFromCsv-DcTbrsv2.mjs.map
|
package/dist/{uploadDataFlowsFromCsv-CJFVLvCJ.mjs.map → uploadDataFlowsFromCsv-DcTbrsv2.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uploadDataFlowsFromCsv-
|
|
1
|
+
{"version":3,"file":"uploadDataFlowsFromCsv-DcTbrsv2.mjs","names":[],"sources":["../src/lib/consent-manager/uploadDataFlowsFromCsv.ts"],"sourcesContent":["import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport colors from 'colors';\n\nimport { DataFlowInput, DataFlowCsvInput } from '../../codecs.js';\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { buildTranscendGraphQLClient, syncDataFlows } from '../graphql/index.js';\nimport { splitCsvToList } from '../requests/index.js';\nimport { readCsv } from '../requests/readCsv.js';\n\nconst OMIT_COLUMNS = [\n 'ID',\n 'Activity',\n 'Encounters',\n 'Last Seen At',\n 'Has Native Do Not Sell/Share Support',\n 'IAB USP API Support',\n 'Service Description',\n 'Website URL',\n 'Categories of Recipients',\n];\n\n/**\n * Upload a set of data flows from CSV\n *\n * @param options - Options\n */\nexport async function uploadDataFlowsFromCsv({\n auth,\n trackerStatus,\n file,\n classifyService = false,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** Sombra API key authentication */\n trackerStatus: ConsentTrackerStatus;\n /** classify data flow service if missing */\n classifyService?: boolean;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<void> {\n // Build a GraphQL client\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Read from CSV the set of data flow inputs\n logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const dataFlowInputs = readCsv(file, DataFlowCsvInput);\n\n // Convert these data flow inputs into a format that the other function can use\n const validatedDataFlowInputs = dataFlowInputs.map(\n ({\n Type,\n Notes,\n // TODO: https://transcend.height.app/T-26391 - export in CSV\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Service,\n Purpose,\n Status,\n Owners,\n Teams,\n 'Connections Made To': value,\n ...rest\n }): DataFlowInput => ({\n value,\n type: Type,\n description: Notes,\n trackingPurposes: splitCsvToList(Purpose),\n // TODO: https://transcend.height.app/T-26391\n // service: Service,\n // Apply the trackerStatus to all values in the CSV -> allows for customer to define tracker status\n // on a row by row basis if needed\n status: Status || trackerStatus,\n owners: Owners ? splitCsvToList(Owners) : undefined,\n teams: Teams ? splitCsvToList(Teams) : undefined,\n // all remaining options are attribute\n attributes: Object.entries(rest)\n // filter out native columns that are exported from the admin dashboard\n // but not custom attributes\n .filter(([key]) => !OMIT_COLUMNS.includes(key))\n .map(([key, value]) => ({\n key,\n values: splitCsvToList(value),\n })),\n }),\n );\n\n // Upload the data flows into Transcend dashboard\n const syncedDataFlows = await syncDataFlows(client, validatedDataFlowInputs, classifyService);\n\n // Log errors\n if (!syncedDataFlows) {\n logger.error(\n colors.red(\n 'Encountered error(s) syncing data flows from CSV, see logs above for more info. ',\n ),\n );\n process.exit(1);\n }\n}\n"],"mappings":"sVAUA,MAAM,EAAe,CACnB,KACA,WACA,aACA,eACA,uCACA,sBACA,sBACA,cACA,2BACD,CAOD,eAAsB,EAAuB,CAC3C,OACA,gBACA,OACA,kBAAkB,GAClB,eAAe,GAYC,CAEhB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAG9D,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAK,aAAa,CAAC,CA0ClC,MAAM,EAAc,EAzCrB,EAAQ,EAAM,EAAiB,CAGP,KAC5C,CACC,OACA,QAGA,UACA,UACA,SACA,SACA,QACA,sBAAuB,EACvB,GAAG,MACiB,CACpB,QACA,KAAM,EACN,YAAa,EACb,iBAAkB,EAAe,EAAQ,CAKzC,OAAQ,GAAU,EAClB,OAAQ,EAAS,EAAe,EAAO,CAAG,IAAA,GAC1C,MAAO,EAAQ,EAAe,EAAM,CAAG,IAAA,GAEvC,WAAY,OAAO,QAAQ,EAAK,CAG7B,QAAQ,CAAC,KAAS,CAAC,EAAa,SAAS,EAAI,CAAC,CAC9C,KAAK,CAAC,EAAK,MAAY,CACtB,MACA,OAAQ,EAAe,EAAM,CAC9B,EAAE,CACN,EACF,CAG4E,EAAgB,GAI3F,EAAO,MACL,EAAO,IACL,mFACD,CACF,CACD,QAAQ,KAAK,EAAE"}
|
package/dist/{uploadPrivacyRequestsFromCsv-BmP1JluQ.mjs → uploadPrivacyRequestsFromCsv-BUGTS-pY.mjs}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{t as n}from"./bluebird-CUitXgsY.mjs";import{n as r,s as i}from"./dataSubject-y_aXI0pa.mjs";import{t as a}from"./createSombraGotInstance-
|
|
1
|
+
import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{t as n}from"./bluebird-CUitXgsY.mjs";import{n as r,s as i}from"./dataSubject-y_aXI0pa.mjs";import{t as a}from"./createSombraGotInstance-D1Il9zUE.mjs";import{a as o,c as s,i as c,l,o as u,r as d,s as f,t as p}from"./constants-lIvXgkdp.mjs";import{i as m,n as h,r as g,t as _}from"./parseAttributesFromString-CZStzJc0.mjs";import{t as v}from"./splitCsvToList-BRq_CIfd.mjs";import{t as ee}from"./readCsv-CyOL7eCc.mjs";import{r as te,t as y}from"./makeGraphQLRequest-Cq26A_Lq.mjs";import{r as ne,t as re}from"./extractClientError-DPjv09EH.mjs";import{CompletedRequestStatus as b,IdentifierType as x,IsoCountryCode as S,IsoCountrySubdivisionCode as C,NORMALIZE_PHONE_NUMBER as w,RequestAction as T}from"@transcend-io/privacy-types";import{startCase as E,uniq as D}from"lodash-es";import{apply as O,getEntries as k,getValues as A,valuesOf as j}from"@transcend-io/type-utils";import{join as ie}from"node:path";import M from"colors";import{LOCALE_KEY as N}from"@transcend-io/internationalization";import*as P from"io-ts";import{gql as F}from"graphql-request";import I from"inquirer";import L from"inquirer-autocomplete-prompt";import R from"cli-progress";import{DateFromISOString as z}from"io-ts-types";import{PersistedState as B}from"@transcend-io/persisted-state";const V=F`
|
|
2
2
|
query TranscendCliAttributeKeys($first: Int!, $offset: Int!) {
|
|
3
3
|
attributeKeys(
|
|
4
4
|
filterBy: { enabledOn: [request] }
|
|
@@ -14,4 +14,4 @@ import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs
|
|
|
14
14
|
}
|
|
15
15
|
}
|
|
16
16
|
`;async function H(e,t,n){I.registerPrompt(`autocomplete`,L);let r=e.map(e=>e||`<blank>`).filter(e=>!n[e]);if(r.length===0)return n;let i=await I.prompt(r.map(e=>({name:e,message:`Map value of: ${e}`,type:`autocomplete`,default:t.find(t=>m(e,t)),source:(e,n)=>n?t.filter(e=>typeof e==`string`&&m(n,e)):t})));return{...n,...O(i,e=>typeof e==`string`?e:Object.values(e)[0])}}function U(e,t){return D(e.map(e=>e[t]||``).flat())}async function W(e){let n=D(e.map(e=>Object.keys(e)).flat()),r=e,i=!0;for(;i;){let{filterColumnName:e}=await I.prompt([{name:`filterColumnName`,message:`If you need to filter the list of requests to import, choose the column to filter on. Currently ${r.length} rows.`,type:`list`,default:n,choices:[l,...n]}]);if(i=l!==e,i){let t=U(r,e),{valuesToKeep:i}=await I.prompt([{name:`valuesToKeep`,message:`Keep rows matching this value`,type:`checkbox`,default:n,choices:t}]);r=r.filter(t=>i.includes(t[e]))}}return t.info(M.magenta(`Importing ${r.length} requests`)),r}async function G(e){let t=[],n=0,r=!1;do{let{attributeKeys:{nodes:i}}=await y(e,V,{first:20,offset:n});t.push(...i),n+=20,r=i.length===20}while(r);return t.sort((e,t)=>e.name.localeCompare(t.name))}async function K(e,t){let n=A(u).filter(e=>!t.getValue(`columnNames`,e)),r=n.length===0?{}:await I.prompt(n.map(t=>{let n=E(t.replace(`ColumnName`,``)),r=g(e,n,s[t],!!d[t]);return{name:t,message:`Choose the column that will be used to map in the field: ${n}`,type:`list`,default:r[0],choices:r}}));return await Promise.all(k(r).map(([e,n])=>t.setValue(n,`columnNames`,e))),r}async function q(e,n,{state:i,columnNameMap:a}){let o=e=>i.getValue(`columnNames`,e)||a[e],{internalSubjects:s}=await y(e,r);t.info(M.magenta(`Determining mapping of columns for request action`));let c=await H(U(n,o(u.RequestType)),Object.values(T),i.getValue(`requestTypeToRequestAction`));await i.setValue(c,`requestTypeToRequestAction`),t.info(M.magenta(`Determining mapping of columns for subject`));let d=await H(U(n,o(u.SubjectType)),s.map(({type:e})=>e),i.getValue(`subjectTypeToSubjectName`));await i.setValue(d,`subjectTypeToSubjectName`),t.info(M.magenta(`Determining mapping of columns for locale`));let f=await H(U(n,o(u.Locale)),Object.values(N),i.getValue(`languageToLocale`));await i.setValue(f,`languageToLocale`),t.info(M.magenta(`Determining mapping of columns for request status`)),t.info(M.magenta(`Determining mapping of columns for request status`));let p=o(u.RequestStatus),m=p===`[NONE]`?{}:await H(U(n,p),[...Object.values(b),l],i.getValue(`statusToRequestStatus`));await i.setValue(m,`statusToRequestStatus`),t.info(M.magenta(`Determining mapping of columns for country`));let h=o(u.Country),g=h===`[NONE]`?{}:await H(U(n,h),[...Object.values(S),l],i.getValue(`regionToCountry`));await i.setValue(g,`regionToCountry`),t.info(M.magenta(`Determining mapping of columns for country sub division`));let _=o(u.CountrySubDivision),v=_===`[NONE]`?{}:await H(U(n,_),[...Object.values(C),l],i.getValue(`regionToCountrySubDivision`));await i.setValue(v,`regionToCountrySubDivision`)}const J=P.record(P.string,P.array(P.intersection([P.type({value:P.string}),P.partial({name:P.string})]))),Y=P.intersection([P.type({email:P.string,attestedExtraIdentifiers:J,coreIdentifier:P.string,requestType:j(T),subjectType:P.string}),P.partial({country:j(S),countrySubDivision:j(C),attributes:P.array(_),status:j(b),createdAt:z,dataSiloIds:P.array(P.string),locale:j(N)})]);function X(e,t,n){if(t===x.Email)return e.toLowerCase();if(t===x.Phone){let t=e.replace(w,``).replace(/[()]/g,``).replace(/[–]/g,``).replace(/[:]/g,``).replace(/[]/g,``).replace(/[A-Za-z]/g,``);return t?t.startsWith(`+`)?t:`+${n}${t}`:``}return e}function Z(e,t,{columnNameMap:n,identifierNameMap:r,attributeNameMap:i,requestAttributeKeys:a,defaultPhoneCountryCode:o=`1`}){let s=e=>t.getValue(`columnNames`,e)||n[e];return e.map(e=>{let n={};Object.entries(r).filter(([,e])=>e!==l).forEach(([t,r])=>{let i=Object.values(x).includes(t)?t:x.Custom,a=e[r];if(a){let e=X(a,i,o);e&&(n[i]||(n[i]=[]),n[i].push({value:e,name:t}))}});let c=[];Object.entries(i).filter(([,e])=>e!==l).forEach(([t,n])=>{let r=e[n];if(r){let e=a.find(e=>e.name===t)?.type===`MULTI_SELECT`;c.push({values:e?v(r):r,key:t})}});let d=s(u.RequestType),f=s(u.SubjectType);return[e,{email:e[s(u.Email)],attestedExtraIdentifiers:n,attributes:c,coreIdentifier:e[s(u.CoreIdentifier)],requestType:d===`[APPLY VALUE TO ALL ROWS]`?t.getValue(`requestTypeToRequestAction`,p):t.getValue(`requestTypeToRequestAction`,e[d]),subjectType:f===`[APPLY VALUE TO ALL ROWS]`?t.getValue(`subjectTypeToSubjectName`,p):t.getValue(`subjectTypeToSubjectName`,e[f]),...s(u.Locale)!==`[NONE]`&&e[s(u.Locale)]?{locale:t.getValue(`languageToLocale`,e[s(u.Locale)])}:{},...s(u.Country)!==`[NONE]`&&e[s(u.Country)]?{country:t.getValue(`regionToCountry`,e[s(u.Country)])}:{},...s(u.CountrySubDivision)!==`[NONE]`&&e[s(u.CountrySubDivision)]?{countrySubDivision:t.getValue(`regionToCountrySubDivision`,e[s(u.CountrySubDivision)])}:{},...s(u.RequestStatus)!==`[NONE]`&&t.getValue(`statusToRequestStatus`,e[s(u.RequestStatus)])!==`[NONE]`&&e[s(u.RequestStatus)]?{status:t.getValue(`statusToRequestStatus`,e[s(u.RequestStatus)])}:{},...s(u.CreatedAt)!==`[NONE]`&&e[s(u.CreatedAt)]?{createdAt:new Date(e[s(u.CreatedAt)])}:{},...s(u.DataSiloIds)!==`[NONE]`&&e[s(u.DataSiloIds)]?{dataSiloIds:v(e[s(u.DataSiloIds)])}:{}}]})}async function Q(e,t,n){let{initializer:r}=await y(e,i),a=r.identifiers.filter(({name:e})=>!n.getValue(`identifierNames`,e)&&!f.includes(e)),o=a.length===0?{}:await I.prompt(a.map(({name:e})=>{let n=g(t,e,!1);return{name:e,message:`Choose the column that will be used to map in the identifier: ${e}`,type:`list`,default:n[0],choices:n}}));return await Promise.all(Object.entries(o).map(([e,t])=>n.setValue(t,`identifierNames`,e))),{...n.getValue(`identifierNames`),...o}}async function $(e,t,n,r){let i=r.filter(({name:e})=>!n.getValue(`attributeNames`,e)),a=i.length===0?{}:await I.prompt(i.map(({name:e})=>{let n=g(t,e,!1);return{name:e,message:`Choose the column that will be used to map in the attribute: ${e}`,type:`list`,default:n[0],choices:n}}));return await Promise.all(Object.entries(a).map(([e,t])=>n.setValue(t,`attributeNames`,e))),{...n.getValue(`attributeNames`),...a}}async function ae({cacheFilepath:r,requestReceiptFolder:i,file:s,auth:l,sombraAuth:u,concurrency:d=100,defaultPhoneCountryCode:f=`1`,transcendUrl:p=e,attributes:m=[],emailIsVerified:g=!0,skipFilterStep:_=!1,skipSendingReceipt:v=!0,isTest:y=!1,isSilent:b=!0,debug:x=!1,dryRun:S=!1}){let C=new Date().getTime(),w=new R.SingleBar({},R.Presets.shades_classic),T=h(m),E=new B(r,c,{columnNames:{},requestTypeToRequestAction:{},subjectTypeToSubjectName:{},languageToLocale:{},statusToRequestStatus:{},identifierNames:{},attributeNames:{},regionToCountrySubDivision:{},regionToCountry:{}}),O=ie(i,`tr-request-upload-${new Date().toISOString()}-${s.split(`/`).pop()}`.replace(`.csv`,`.json`)),k=new B(O,o,{successfulRequests:[],duplicateRequests:[],failingRequests:[]}),A=await a(p,l,u),j=ee(s,P.record(P.string,P.string)),N=D(j.map(e=>Object.keys(e)).flat());if(j.length===0)throw Error(`No Requests found in list! Ensure the first row of the CSV is a header and the rest are requests.`);if(x){let e=j[0];t.info(M.magenta(`First request: ${JSON.stringify(e,null,2)}`))}let F=_?j:await W(j),I=te(p,l),L=await G(I),z=await K(N,E),V=await Q(I,N,E),H=await $(I,N,E,L);await q(I,F,{state:E,columnNameMap:z});let U=Z(F,E,{defaultPhoneCountryCode:f,columnNameMap:z,identifierNameMap:V,attributeNameMap:H,requestAttributeKeys:L});x||w.start(U.length,0);let J=0;await n(U,async([e,n],r)=>{let i=x?`email:${n.email} | coreIdentifier:${n.coreIdentifier}`:`row:${r.toString()}`;if(x&&t.info(M.magenta(`[${r+1}/${U.length}] Importing: ${JSON.stringify(n,null,2)}`)),S){t.info(M.magenta(`Bailing out on dry run because dryRun is set`));return}try{let a=await ne(A,n,{details:`Uploaded by Transcend Cli: "tr-request-upload" : ${JSON.stringify(e,null,2)}`,isTest:y,emailIsVerified:g,skipSendingReceipt:v,isSilent:b,additionalAttributes:T});x&&(t.info(M.green(`[${r+1}/${U.length}] Successfully submitted the test data subject request: "${i}"`)),t.info(M.green(`[${r+1}/${U.length}] View it at: "${a.link}"`)));let o=k.getValue(`successfulRequests`);o.push({id:a.id,link:a.link,rowIndex:r,coreIdentifier:a.coreIdentifier,attemptedAt:new Date().toISOString()}),await k.setValue(o,`successfulRequests`)}catch(e){let a=`${e.message} - ${JSON.stringify(e.response?.body,null,2)}`,o=re(a);if(o===`Client error: You have already made this request.`){x&&t.info(M.yellow(`[${r+1}/${U.length}] Skipping request as it is a duplicate`));let e=k.getValue(`duplicateRequests`);e.push({coreIdentifier:n.coreIdentifier,rowIndex:r,attemptedAt:new Date().toISOString()}),await k.setValue(e,`duplicateRequests`)}else{let e=k.getValue(`failingRequests`);e.push({...n,rowIndex:r,error:o||a,attemptedAt:new Date().toISOString()}),await k.setValue(e,`failingRequests`),x&&(t.error(M.red(o||a)),t.error(M.red(`[${r+1}/${U.length}] Failed to submit request for: "${i}"`)))}}J+=1,x||w.update(J)},{concurrency:d}),w.stop();let Y=new Date().getTime()-C;t.info(M.green(`Completed upload in "${Y/1e3}" seconds.`)),k.getValue(`duplicateRequests`).length>0&&t.info(M.yellow(`Encountered "${k.getValue(`duplicateRequests`).length}" duplicate requests. See "${O}" to review the core identifiers for these requests.`)),k.getValue(`failingRequests`).length>0&&(t.error(M.red(`Encountered "${k.getValue(`failingRequests`).length}" errors. See "${O}" to review the error messages and inputs.`)),process.exit(1))}export{Y as a,q as c,W as d,U as f,J as i,K as l,V as m,$ as n,Z as o,H as p,Q as r,X as s,ae as t,G as u};
|
|
17
|
-
//# sourceMappingURL=uploadPrivacyRequestsFromCsv-
|
|
17
|
+
//# sourceMappingURL=uploadPrivacyRequestsFromCsv-BUGTS-pY.mjs.map
|