@transcend-io/cli 10.8.0 → 10.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/README.md +105 -0
  2. package/dist/{app-D_KGbISv.mjs → app-C5WMPpiF.mjs} +20 -20
  3. package/dist/app-C5WMPpiF.mjs.map +1 -0
  4. package/dist/{approvePrivacyRequests-Dqh2bp9k.mjs → approvePrivacyRequests-DpXfRCtG.mjs} +2 -2
  5. package/dist/{approvePrivacyRequests-Dqh2bp9k.mjs.map → approvePrivacyRequests-DpXfRCtG.mjs.map} +1 -1
  6. package/dist/bin/bash-complete.mjs +1 -1
  7. package/dist/bin/cli.mjs +1 -1
  8. package/dist/bin/deprecated-command.mjs +1 -1
  9. package/dist/{buildXdiSyncEndpoint-B0q4_c4K.mjs → buildXdiSyncEndpoint-CpADEY6i.mjs} +2 -2
  10. package/dist/{buildXdiSyncEndpoint-B0q4_c4K.mjs.map → buildXdiSyncEndpoint-CpADEY6i.mjs.map} +1 -1
  11. package/dist/{bulkRestartRequests-majedIhh.mjs → bulkRestartRequests-BUkavWWX.mjs} +2 -2
  12. package/dist/{bulkRestartRequests-majedIhh.mjs.map → bulkRestartRequests-BUkavWWX.mjs.map} +1 -1
  13. package/dist/{bulkRetryEnrichers-CLF2FxTu.mjs → bulkRetryEnrichers-Br27FAbD.mjs} +2 -2
  14. package/dist/{bulkRetryEnrichers-CLF2FxTu.mjs.map → bulkRetryEnrichers-Br27FAbD.mjs.map} +1 -1
  15. package/dist/{cancelPrivacyRequests-6OnBWUm6.mjs → cancelPrivacyRequests-BEUOjF_G.mjs} +2 -2
  16. package/dist/{cancelPrivacyRequests-6OnBWUm6.mjs.map → cancelPrivacyRequests-BEUOjF_G.mjs.map} +1 -1
  17. package/dist/{codecs-Dnq-rEcB.mjs → codecs-BOAm14sp.mjs} +1 -1
  18. package/dist/{codecs-Dnq-rEcB.mjs.map → codecs-BOAm14sp.mjs.map} +1 -1
  19. package/dist/{collectCsvFilesOrExit-CbtyKAzu.mjs → collectCsvFilesOrExit-ChKkrsVz.mjs} +2 -2
  20. package/dist/{collectCsvFilesOrExit-CbtyKAzu.mjs.map → collectCsvFilesOrExit-ChKkrsVz.mjs.map} +1 -1
  21. package/dist/{collectParquetFilesOrExit-BJiAyaQ5.mjs → collectParquetFilesOrExit-4EqbLDaB.mjs} +2 -2
  22. package/dist/{collectParquetFilesOrExit-BJiAyaQ5.mjs.map → collectParquetFilesOrExit-4EqbLDaB.mjs.map} +1 -1
  23. package/dist/command-BZbmwdxB.mjs +9 -0
  24. package/dist/command-BZbmwdxB.mjs.map +1 -0
  25. package/dist/commands/admin/chunk-csv/worker.mjs +1 -1
  26. package/dist/commands/admin/parquet-to-csv/worker.mjs +1 -1
  27. package/dist/{consentManagersToBusinessEntities-BdKDganK.mjs → consentManagersToBusinessEntities-C95GQMxK.mjs} +2 -2
  28. package/dist/{consentManagersToBusinessEntities-BdKDganK.mjs.map → consentManagersToBusinessEntities-C95GQMxK.mjs.map} +1 -1
  29. package/dist/constants-FP8lxFg5.mjs +2 -0
  30. package/dist/{constants-9AglpfjZ.mjs.map → constants-FP8lxFg5.mjs.map} +1 -1
  31. package/dist/{constants-CLxPXlJM.mjs → constants-KYaYveEQ.mjs} +1 -1
  32. package/dist/{constants-CLxPXlJM.mjs.map → constants-KYaYveEQ.mjs.map} +1 -1
  33. package/dist/{constants-BmwXDQu9.mjs → constants-xRJ7Twuw.mjs} +2 -2
  34. package/dist/{constants-BmwXDQu9.mjs.map → constants-xRJ7Twuw.mjs.map} +1 -1
  35. package/dist/{context-bkKpii_t.mjs → context-CdSyuBlf.mjs} +1 -1
  36. package/dist/{context-bkKpii_t.mjs.map → context-CdSyuBlf.mjs.map} +1 -1
  37. package/dist/{createExtraKeyHandler-BxX_-qPT.mjs → createExtraKeyHandler-D-M6PDok.mjs} +2 -2
  38. package/dist/{createExtraKeyHandler-BxX_-qPT.mjs.map → createExtraKeyHandler-D-M6PDok.mjs.map} +1 -1
  39. package/dist/{dataFlowsToDataSilos-Ca2DtTsd.mjs → dataFlowsToDataSilos-Cj60GwT2.mjs} +1 -1
  40. package/dist/{dataFlowsToDataSilos-Ca2DtTsd.mjs.map → dataFlowsToDataSilos-Cj60GwT2.mjs.map} +1 -1
  41. package/dist/{done-input-validation-BcNBxhEs.mjs → done-input-validation-9r-9VL6r.mjs} +1 -1
  42. package/dist/{done-input-validation-BcNBxhEs.mjs.map → done-input-validation-9r-9VL6r.mjs.map} +1 -1
  43. package/dist/{downloadPrivacyRequestFiles-HjCf3aC8.mjs → downloadPrivacyRequestFiles-BY_6MMoZ.mjs} +2 -2
  44. package/dist/{downloadPrivacyRequestFiles-HjCf3aC8.mjs.map → downloadPrivacyRequestFiles-BY_6MMoZ.mjs.map} +1 -1
  45. package/dist/{extractClientError-i-Tw_az7.mjs → extractClientError-ZFI8f5OR.mjs} +1 -1
  46. package/dist/{extractClientError-i-Tw_az7.mjs.map → extractClientError-ZFI8f5OR.mjs.map} +1 -1
  47. package/dist/{fetchAllRequests-CHHdyb4Q.mjs → fetchAllRequests-B2qEAfDh.mjs} +2 -2
  48. package/dist/{fetchAllRequests-CHHdyb4Q.mjs.map → fetchAllRequests-B2qEAfDh.mjs.map} +1 -1
  49. package/dist/{generateCrossAccountApiKeys-CdTYH4qC.mjs → generateCrossAccountApiKeys-BkLSweFo.mjs} +2 -2
  50. package/dist/{generateCrossAccountApiKeys-CdTYH4qC.mjs.map → generateCrossAccountApiKeys-BkLSweFo.mjs.map} +1 -1
  51. package/dist/impl--ee0ekVf.mjs +3 -0
  52. package/dist/impl--ee0ekVf.mjs.map +1 -0
  53. package/dist/{impl-Bq_KOmdY.mjs → impl-B-fy3iVm.mjs} +2 -2
  54. package/dist/{impl-Bq_KOmdY.mjs.map → impl-B-fy3iVm.mjs.map} +1 -1
  55. package/dist/{impl-C08anQRz.mjs → impl-B5bE0lSK.mjs} +2 -2
  56. package/dist/{impl-C08anQRz.mjs.map → impl-B5bE0lSK.mjs.map} +1 -1
  57. package/dist/{impl-CbniR_F7.mjs → impl-B9Q9CnIK.mjs} +2 -2
  58. package/dist/{impl-CbniR_F7.mjs.map → impl-B9Q9CnIK.mjs.map} +1 -1
  59. package/dist/{impl-xtlx25UP.mjs → impl-B9W5P4LM.mjs} +2 -2
  60. package/dist/{impl-xtlx25UP.mjs.map → impl-B9W5P4LM.mjs.map} +1 -1
  61. package/dist/{impl-B1MGTkHY.mjs → impl-BD2Rqu17.mjs} +2 -2
  62. package/dist/{impl-B1MGTkHY.mjs.map → impl-BD2Rqu17.mjs.map} +1 -1
  63. package/dist/{impl-CkJ92AF_.mjs → impl-BJoZpj1a.mjs} +2 -2
  64. package/dist/{impl-CkJ92AF_.mjs.map → impl-BJoZpj1a.mjs.map} +1 -1
  65. package/dist/impl-BM0Ir6_d2.mjs +2 -0
  66. package/dist/{impl-0WZg8_Bg2.mjs.map → impl-BM0Ir6_d2.mjs.map} +1 -1
  67. package/dist/{impl-Xona8YN1.mjs → impl-BaDggdDO.mjs} +2 -2
  68. package/dist/{impl-Xona8YN1.mjs.map → impl-BaDggdDO.mjs.map} +1 -1
  69. package/dist/impl-BcIarr1b.mjs +2 -0
  70. package/dist/{impl-DwjCLPLM.mjs.map → impl-BcIarr1b.mjs.map} +1 -1
  71. package/dist/{impl-DiHeNVFr.mjs → impl-BhFQcH3n.mjs} +2 -2
  72. package/dist/{impl-DiHeNVFr.mjs.map → impl-BhFQcH3n.mjs.map} +1 -1
  73. package/dist/{impl-B-_54MR0.mjs → impl-BvYc_ZAH.mjs} +2 -2
  74. package/dist/{impl-B-_54MR0.mjs.map → impl-BvYc_ZAH.mjs.map} +1 -1
  75. package/dist/{impl-CxJbQgVv.mjs → impl-Bw74_1W6.mjs} +2 -2
  76. package/dist/{impl-CxJbQgVv.mjs.map → impl-Bw74_1W6.mjs.map} +1 -1
  77. package/dist/{impl-BuQwysCL.mjs → impl-C-Ky12n4.mjs} +2 -2
  78. package/dist/{impl-BuQwysCL.mjs.map → impl-C-Ky12n4.mjs.map} +1 -1
  79. package/dist/{impl-CPEzHnwk2.mjs → impl-C7BHhHii2.mjs} +2 -2
  80. package/dist/{impl-CPEzHnwk2.mjs.map → impl-C7BHhHii2.mjs.map} +1 -1
  81. package/dist/impl-C8EH5IWl2.mjs +2 -0
  82. package/dist/{impl-CeF1n_i02.mjs.map → impl-C8EH5IWl2.mjs.map} +1 -1
  83. package/dist/{impl-CTfLJzwA.mjs → impl-CDISKj8u.mjs} +2 -2
  84. package/dist/{impl-CTfLJzwA.mjs.map → impl-CDISKj8u.mjs.map} +1 -1
  85. package/dist/{impl-ny4GTh5k.mjs → impl-CG882Vct.mjs} +2 -2
  86. package/dist/{impl-ny4GTh5k.mjs.map → impl-CG882Vct.mjs.map} +1 -1
  87. package/dist/{impl-BdCC8rpK.mjs → impl-CMAmsDt9.mjs} +2 -2
  88. package/dist/{impl-BdCC8rpK.mjs.map → impl-CMAmsDt9.mjs.map} +1 -1
  89. package/dist/{impl-DV-bbA8-.mjs → impl-CQe-MaZ_.mjs} +2 -2
  90. package/dist/{impl-DV-bbA8-.mjs.map → impl-CQe-MaZ_.mjs.map} +1 -1
  91. package/dist/{impl-OcaxH19u.mjs → impl-CUZkpK1I2.mjs} +2 -2
  92. package/dist/impl-CUZkpK1I2.mjs.map +1 -0
  93. package/dist/{impl-CLznNZ5F.mjs → impl-CVoLLxEQ.mjs} +2 -2
  94. package/dist/{impl-CLznNZ5F.mjs.map → impl-CVoLLxEQ.mjs.map} +1 -1
  95. package/dist/{impl-B0TnAEc-.mjs → impl-CWpfY0TU.mjs} +2 -2
  96. package/dist/{impl-B0TnAEc-.mjs.map → impl-CWpfY0TU.mjs.map} +1 -1
  97. package/dist/{impl-BjCQSRLu.mjs → impl-CZXftWOO.mjs} +2 -2
  98. package/dist/{impl-BjCQSRLu.mjs.map → impl-CZXftWOO.mjs.map} +1 -1
  99. package/dist/{impl-C_Hw0O5q.mjs → impl-C_KFt7Y8.mjs} +2 -2
  100. package/dist/{impl-C_Hw0O5q.mjs.map → impl-C_KFt7Y8.mjs.map} +1 -1
  101. package/dist/{impl-BzH3NMTh2.mjs → impl-CfBhfUVL2.mjs} +2 -2
  102. package/dist/{impl-BzH3NMTh2.mjs.map → impl-CfBhfUVL2.mjs.map} +1 -1
  103. package/dist/{impl-9w-woYiS.mjs → impl-Cn0BtYye.mjs} +2 -2
  104. package/dist/{impl-9w-woYiS.mjs.map → impl-Cn0BtYye.mjs.map} +1 -1
  105. package/dist/impl-D0FfuS4u2.mjs +2 -0
  106. package/dist/impl-D0FfuS4u2.mjs.map +1 -0
  107. package/dist/{impl-9pjmJ_Wo.mjs → impl-D3uvvB70.mjs} +2 -2
  108. package/dist/{impl-9pjmJ_Wo.mjs.map → impl-D3uvvB70.mjs.map} +1 -1
  109. package/dist/impl-D4JiKANv.mjs +2 -0
  110. package/dist/impl-D4JiKANv.mjs.map +1 -0
  111. package/dist/{impl-BjG7d8-s.mjs → impl-D4SNAWH12.mjs} +2 -2
  112. package/dist/impl-D4SNAWH12.mjs.map +1 -0
  113. package/dist/{impl-Cw3_0zqC.mjs → impl-D6J2bsoN.mjs} +2 -2
  114. package/dist/{impl-Cw3_0zqC.mjs.map → impl-D6J2bsoN.mjs.map} +1 -1
  115. package/dist/{impl-BsTZyBo4.mjs → impl-DI3mf99H.mjs} +2 -2
  116. package/dist/{impl-BsTZyBo4.mjs.map → impl-DI3mf99H.mjs.map} +1 -1
  117. package/dist/{impl-BPY0YGuj.mjs → impl-DQdsAf-6.mjs} +2 -2
  118. package/dist/{impl-BPY0YGuj.mjs.map → impl-DQdsAf-6.mjs.map} +1 -1
  119. package/dist/{impl-DdppV2cQ.mjs → impl-DWWx9PXJ.mjs} +2 -2
  120. package/dist/{impl-DdppV2cQ.mjs.map → impl-DWWx9PXJ.mjs.map} +1 -1
  121. package/dist/{impl-D0ox6bF2.mjs → impl-DfxHCJfb.mjs} +2 -2
  122. package/dist/{impl-D0ox6bF2.mjs.map → impl-DfxHCJfb.mjs.map} +1 -1
  123. package/dist/{impl-Dm6ITkBn.mjs → impl-E_iiNVwN.mjs} +2 -2
  124. package/dist/{impl-Dm6ITkBn.mjs.map → impl-E_iiNVwN.mjs.map} +1 -1
  125. package/dist/{impl-CDoq18kF.mjs → impl-GjQ_LTsa.mjs} +2 -2
  126. package/dist/{impl-CDoq18kF.mjs.map → impl-GjQ_LTsa.mjs.map} +1 -1
  127. package/dist/{impl-BKYnyVYM.mjs → impl-IgBneuQ8.mjs} +2 -2
  128. package/dist/{impl-BKYnyVYM.mjs.map → impl-IgBneuQ8.mjs.map} +1 -1
  129. package/dist/{impl-RyGwqEe9.mjs → impl-O5gKrwRH.mjs} +2 -2
  130. package/dist/{impl-RyGwqEe9.mjs.map → impl-O5gKrwRH.mjs.map} +1 -1
  131. package/dist/{impl-DKIBerx4.mjs → impl-P7bPD8V0.mjs} +2 -2
  132. package/dist/{impl-DKIBerx4.mjs.map → impl-P7bPD8V0.mjs.map} +1 -1
  133. package/dist/{impl-DQQ_nI25.mjs → impl-cr6noMmG.mjs} +2 -2
  134. package/dist/{impl-DQQ_nI25.mjs.map → impl-cr6noMmG.mjs.map} +1 -1
  135. package/dist/{impl-VOd609Hk.mjs → impl-g4gvqD93.mjs} +2 -2
  136. package/dist/{impl-VOd609Hk.mjs.map → impl-g4gvqD93.mjs.map} +1 -1
  137. package/dist/{impl-4d-Dff8G.mjs → impl-hE7w_dha.mjs} +2 -2
  138. package/dist/{impl-4d-Dff8G.mjs.map → impl-hE7w_dha.mjs.map} +1 -1
  139. package/dist/{impl-B7jvk8Vm.mjs → impl-lHNw_K3v.mjs} +2 -2
  140. package/dist/{impl-B7jvk8Vm.mjs.map → impl-lHNw_K3v.mjs.map} +1 -1
  141. package/dist/{impl-DH9VwrKd.mjs → impl-mW3c3HNU.mjs} +2 -2
  142. package/dist/{impl-DH9VwrKd.mjs.map → impl-mW3c3HNU.mjs.map} +1 -1
  143. package/dist/{impl-BAjeCiyZ.mjs → impl-mxcFaXMI.mjs} +2 -2
  144. package/dist/{impl-BAjeCiyZ.mjs.map → impl-mxcFaXMI.mjs.map} +1 -1
  145. package/dist/{impl-BhNnDVWM.mjs → impl-u8cmT1tT.mjs} +2 -2
  146. package/dist/{impl-BhNnDVWM.mjs.map → impl-u8cmT1tT.mjs.map} +1 -1
  147. package/dist/impl-xiJwue6x.mjs +2 -0
  148. package/dist/{impl-DWiyVOll.mjs.map → impl-xiJwue6x.mjs.map} +1 -1
  149. package/dist/index.d.mts +9 -9
  150. package/dist/index.mjs +1 -1
  151. package/dist/{inquirer-B4iEodLy.mjs → inquirer-C-TI9k_N.mjs} +2 -2
  152. package/dist/{inquirer-B4iEodLy.mjs.map → inquirer-C-TI9k_N.mjs.map} +1 -1
  153. package/dist/{listFiles-D2wMHnEr.mjs → listFiles-oqwR2oZ4.mjs} +1 -1
  154. package/dist/{listFiles-D2wMHnEr.mjs.map → listFiles-oqwR2oZ4.mjs.map} +1 -1
  155. package/dist/{logger-Bj782ZYD.mjs → logger-B-LXIf3U.mjs} +1 -1
  156. package/dist/{logger-Bj782ZYD.mjs.map → logger-B-LXIf3U.mjs.map} +1 -1
  157. package/dist/{markRequestDataSiloIdsCompleted-BZpcBACY.mjs → markRequestDataSiloIdsCompleted-Cg5Hfs4-.mjs} +2 -2
  158. package/dist/{markRequestDataSiloIdsCompleted-BZpcBACY.mjs.map → markRequestDataSiloIdsCompleted-Cg5Hfs4-.mjs.map} +1 -1
  159. package/dist/{markSilentPrivacyRequests-H4ZJIdtS.mjs → markSilentPrivacyRequests-1spmn5h3.mjs} +2 -2
  160. package/dist/{markSilentPrivacyRequests-H4ZJIdtS.mjs.map → markSilentPrivacyRequests-1spmn5h3.mjs.map} +1 -1
  161. package/dist/{notifyPrivacyRequestsAdditionalTime-Bhy5342F.mjs → notifyPrivacyRequestsAdditionalTime-DIY4ofMV.mjs} +2 -2
  162. package/dist/{notifyPrivacyRequestsAdditionalTime-Bhy5342F.mjs.map → notifyPrivacyRequestsAdditionalTime-DIY4ofMV.mjs.map} +1 -1
  163. package/dist/{parquetToCsvOneFile-B84XXInh.mjs → parquetToCsvOneFile-Bry79xw-.mjs} +2 -2
  164. package/dist/{parquetToCsvOneFile-B84XXInh.mjs.map → parquetToCsvOneFile-Bry79xw-.mjs.map} +1 -1
  165. package/dist/{parseAttributesFromString-q4-59nEN.mjs → parseAttributesFromString-tbxM3lmh.mjs} +2 -2
  166. package/dist/{parseAttributesFromString-q4-59nEN.mjs.map → parseAttributesFromString-tbxM3lmh.mjs.map} +1 -1
  167. package/dist/{parseVariablesFromString-BeKOGw5n.mjs → parseVariablesFromString-C3CPWxqY.mjs} +2 -2
  168. package/dist/{parseVariablesFromString-BeKOGw5n.mjs.map → parseVariablesFromString-C3CPWxqY.mjs.map} +1 -1
  169. package/dist/parsers-Bl90Wjbz.mjs +2 -0
  170. package/dist/parsers-Bl90Wjbz.mjs.map +1 -0
  171. package/dist/{pullAllDatapoints-Bbmky50p.mjs → pullAllDatapoints-49ZSGNFN.mjs} +2 -2
  172. package/dist/{pullAllDatapoints-Bbmky50p.mjs.map → pullAllDatapoints-49ZSGNFN.mjs.map} +1 -1
  173. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-S1_ffqTu.mjs → pullChunkedCustomSiloOutstandingIdentifiers-Caiw44KV.mjs} +2 -2
  174. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-S1_ffqTu.mjs.map → pullChunkedCustomSiloOutstandingIdentifiers-Caiw44KV.mjs.map} +1 -1
  175. package/dist/{pullConsentManagerMetrics-zKgjc3Ap.mjs → pullConsentManagerMetrics-CcBfEEzz.mjs} +2 -2
  176. package/dist/{pullConsentManagerMetrics-zKgjc3Ap.mjs.map → pullConsentManagerMetrics-CcBfEEzz.mjs.map} +1 -1
  177. package/dist/{pullManualEnrichmentIdentifiersToCsv-DBK6XImP.mjs → pullManualEnrichmentIdentifiersToCsv-Et8K20SJ.mjs} +2 -2
  178. package/dist/{pullManualEnrichmentIdentifiersToCsv-DBK6XImP.mjs.map → pullManualEnrichmentIdentifiersToCsv-Et8K20SJ.mjs.map} +1 -1
  179. package/dist/{pullTranscendConfiguration-BHP6t_Nq.mjs → pullTranscendConfiguration-ChFN8Wp4.mjs} +2 -2
  180. package/dist/{pullTranscendConfiguration-BHP6t_Nq.mjs.map → pullTranscendConfiguration-ChFN8Wp4.mjs.map} +1 -1
  181. package/dist/{pullUnstructuredSubDataPointRecommendations-D0z-vPgq.mjs → pullUnstructuredSubDataPointRecommendations-C8VuWR7j.mjs} +2 -2
  182. package/dist/{pullUnstructuredSubDataPointRecommendations-D0z-vPgq.mjs.map → pullUnstructuredSubDataPointRecommendations-C8VuWR7j.mjs.map} +1 -1
  183. package/dist/{pushCronIdentifiersFromCsv-CE3_S3pT.mjs → pushCronIdentifiersFromCsv-DqOtCwY5.mjs} +2 -2
  184. package/dist/{pushCronIdentifiersFromCsv-CE3_S3pT.mjs.map → pushCronIdentifiersFromCsv-DqOtCwY5.mjs.map} +1 -1
  185. package/dist/{pushManualEnrichmentIdentifiersFromCsv-Cw6K-4Am.mjs → pushManualEnrichmentIdentifiersFromCsv-LWKOrJTN.mjs} +2 -2
  186. package/dist/{pushManualEnrichmentIdentifiersFromCsv-Cw6K-4Am.mjs.map → pushManualEnrichmentIdentifiersFromCsv-LWKOrJTN.mjs.map} +1 -1
  187. package/dist/{readCsv-C4TyEs-r.mjs → readCsv-C-5HBa7w.mjs} +1 -1
  188. package/dist/{readCsv-C4TyEs-r.mjs.map → readCsv-C-5HBa7w.mjs.map} +1 -1
  189. package/dist/{readTranscendYaml-CGb2UUyM.mjs → readTranscendYaml-DnvxeV7w.mjs} +2 -2
  190. package/dist/{readTranscendYaml-CGb2UUyM.mjs.map → readTranscendYaml-DnvxeV7w.mjs.map} +1 -1
  191. package/dist/{removeUnverifiedRequestIdentifiers-DP-R33id.mjs → removeUnverifiedRequestIdentifiers-C8aAV99N.mjs} +2 -2
  192. package/dist/{removeUnverifiedRequestIdentifiers-DP-R33id.mjs.map → removeUnverifiedRequestIdentifiers-C8aAV99N.mjs.map} +1 -1
  193. package/dist/{request-DfkRPQFr.mjs → request-CikRkOJR.mjs} +1 -1
  194. package/dist/{request-DfkRPQFr.mjs.map → request-CikRkOJR.mjs.map} +1 -1
  195. package/dist/resolveBundleIdByName-C6GQuO2d.mjs +3 -0
  196. package/dist/resolveBundleIdByName-C6GQuO2d.mjs.map +1 -0
  197. package/dist/{retryRequestDataSilos-B8Z4TeWR.mjs → retryRequestDataSilos-CYvolpVQ.mjs} +2 -2
  198. package/dist/{retryRequestDataSilos-B8Z4TeWR.mjs.map → retryRequestDataSilos-CYvolpVQ.mjs.map} +1 -1
  199. package/dist/runOpa-Cbh5ktOh.mjs +2 -0
  200. package/dist/{runOpa-CR5t23wR.mjs.map → runOpa-Cbh5ktOh.mjs.map} +1 -1
  201. package/dist/{skipPreflightJobs-Cec25u-P.mjs → skipPreflightJobs-CsAbVlmo.mjs} +2 -2
  202. package/dist/{skipPreflightJobs-Cec25u-P.mjs.map → skipPreflightJobs-CsAbVlmo.mjs.map} +1 -1
  203. package/dist/{skipRequestDataSilos-CYrHW6uN.mjs → skipRequestDataSilos-BAO67gHg.mjs} +2 -2
  204. package/dist/{skipRequestDataSilos-CYrHW6uN.mjs.map → skipRequestDataSilos-BAO67gHg.mjs.map} +1 -1
  205. package/dist/{streamPrivacyRequestsToCsv-BROB0xWG.mjs → streamPrivacyRequestsToCsv-B2yq8AGa.mjs} +2 -2
  206. package/dist/{streamPrivacyRequestsToCsv-BROB0xWG.mjs.map → streamPrivacyRequestsToCsv-B2yq8AGa.mjs.map} +1 -1
  207. package/dist/{syncCodePackages-CAk_Hjyl.mjs → syncCodePackages-Du1OqJvL.mjs} +2 -2
  208. package/dist/{syncCodePackages-CAk_Hjyl.mjs.map → syncCodePackages-Du1OqJvL.mjs.map} +1 -1
  209. package/dist/{updateConsentManagerVersionToLatest-DI5ODyxN.mjs → updateConsentManagerVersionToLatest-Dd0GfGAj.mjs} +2 -2
  210. package/dist/{updateConsentManagerVersionToLatest-DI5ODyxN.mjs.map → updateConsentManagerVersionToLatest-Dd0GfGAj.mjs.map} +1 -1
  211. package/dist/{uploadConsents-CYNe_Q5q.mjs → uploadConsents-DgkSQj5-.mjs} +2 -2
  212. package/dist/{uploadConsents-CYNe_Q5q.mjs.map → uploadConsents-DgkSQj5-.mjs.map} +1 -1
  213. package/dist/{uploadCookiesFromCsv-Bhw5tHNp.mjs → uploadCookiesFromCsv-C2lTYrbc.mjs} +2 -2
  214. package/dist/{uploadCookiesFromCsv-Bhw5tHNp.mjs.map → uploadCookiesFromCsv-C2lTYrbc.mjs.map} +1 -1
  215. package/dist/{uploadDataFlowsFromCsv-pm5uNPQL.mjs → uploadDataFlowsFromCsv-BkrAh4SY.mjs} +2 -2
  216. package/dist/{uploadDataFlowsFromCsv-pm5uNPQL.mjs.map → uploadDataFlowsFromCsv-BkrAh4SY.mjs.map} +1 -1
  217. package/dist/{uploadPrivacyRequestsFromCsv-CMjkF04D.mjs → uploadPrivacyRequestsFromCsv-i46OEhw-.mjs} +2 -2
  218. package/dist/{uploadPrivacyRequestsFromCsv-CMjkF04D.mjs.map → uploadPrivacyRequestsFromCsv-i46OEhw-.mjs.map} +1 -1
  219. package/dist/{validateTranscendAuth-DJ8qHb9B.mjs → validateTranscendAuth-RgQkJacW.mjs} +2 -2
  220. package/dist/{validateTranscendAuth-DJ8qHb9B.mjs.map → validateTranscendAuth-RgQkJacW.mjs.map} +1 -1
  221. package/dist/{writeCsv-C4pjXGsD.mjs → writeCsv-CbT4a0uj.mjs} +1 -1
  222. package/dist/{writeCsv-C4pjXGsD.mjs.map → writeCsv-CbT4a0uj.mjs.map} +1 -1
  223. package/package.json +2 -2
  224. package/dist/app-D_KGbISv.mjs.map +0 -1
  225. package/dist/command-BgjBWI6m.mjs +0 -9
  226. package/dist/command-BgjBWI6m.mjs.map +0 -1
  227. package/dist/constants-9AglpfjZ.mjs +0 -2
  228. package/dist/impl-0WZg8_Bg2.mjs +0 -2
  229. package/dist/impl-BIhPJDO-.mjs +0 -2
  230. package/dist/impl-BIhPJDO-.mjs.map +0 -1
  231. package/dist/impl-BjG7d8-s.mjs.map +0 -1
  232. package/dist/impl-CeF1n_i02.mjs +0 -2
  233. package/dist/impl-DWiyVOll.mjs +0 -2
  234. package/dist/impl-DwjCLPLM.mjs +0 -2
  235. package/dist/impl-OcaxH19u.mjs.map +0 -1
  236. package/dist/runOpa-CR5t23wR.mjs +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"pullTranscendConfiguration-BHP6t_Nq.mjs","names":[],"sources":["../src/lib/graphql/gqls/assessmentTemplate.ts","../src/lib/graphql/fetchAllAssessmentTemplates.ts","../src/lib/graphql/pullTranscendConfiguration.ts"],"sourcesContent":["import { ASSESSMENT_SECTION_FIELDS } from '@transcend-io/sdk';\nimport { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\n// orderBy: [\n// { field: createdAt, direction: ASC }\n// { field: name, direction: ASC }\n// ]\nexport const ASSESSMENT_TEMPLATES = gql`\n query TranscendCliAssessmentTemplates(\n $first: Int!\n $offset: Int!\n $filterBy: AssessmentFormTemplateFiltersInput\n ) {\n assessmentFormTemplates(\n first: $first\n offset: $offset\n filterBy: $filterBy\n ) {\n nodes {\n id\n creator {\n id\n email\n name\n }\n lastEditor {\n id\n email\n name\n }\n title\n description\n status\n source\n parentId\n isLocked\n isArchived\n createdAt\n updatedAt\n retentionSchedule {\n id\n type\n durationDays\n operation\n createdAt\n updatedAt\n }\n assessmentEmailSet {\n id\n title\n description\n isDefault\n templates {\n id\n title\n }\n }\n sections {\n ${ASSESSMENT_SECTION_FIELDS}\n }\n }\n }\n }\n`;\n","import {\n AssessmentFormTemplateSource,\n AssessmentFormTemplateStatus,\n} from '@transcend-io/privacy-types';\nimport {\n makeGraphQLRequest,\n type AssessmentSection,\n type RetentionSchedule,\n type UserPreview,\n} from '@transcend-io/sdk';\nimport { GraphQLClient } from 'graphql-request';\n\nimport { logger } from '../../logger.js';\nimport { ASSESSMENT_TEMPLATES } from './gqls/index.js';\n\n/**\n * Represents an assessment template with various properties and metadata.\n */\nexport interface AssessmentTemplate {\n /** The ID of the assessment template */\n id: string;\n /** The user who created the assessment template */\n creator: UserPreview;\n /** The user who last edited the assessment template */\n lastEditor: UserPreview;\n /** The title of the assessment template */\n title: string;\n /** The description of the assessment template */\n description: string;\n /** The current status of the assessment template */\n status: AssessmentFormTemplateStatus;\n /** The source fo the form template */\n source: AssessmentFormTemplateSource;\n /** ID of parent template */\n parentId: string;\n /** Indicates if the assessment template is locked */\n isLocked: boolean;\n /** Indicates if the assessment template is archived */\n isArchived: boolean;\n /** The date when the assessment template was created */\n createdAt: string;\n /** The date when the assessment template was last updated */\n updatedAt: string;\n /** The retention schedule of the assessment template */\n retentionSchedule?: RetentionSchedule;\n /** The sections of the assessment template */\n sections: AssessmentSection[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all assessment templates in the organization\n *\n * @param client - GraphQL client\n * @returns All assessment templates in the organization\n */\nexport async function fetchAllAssessmentTemplates(\n client: GraphQLClient,\n): Promise<AssessmentTemplate[]> {\n const assessmentTemplates: AssessmentTemplate[] = [];\n let offset = 0;\n\n let shouldContinue = false;\n do {\n const {\n assessmentFormTemplates: { nodes },\n } = await makeGraphQLRequest<{\n /** Templates */\n assessmentFormTemplates: {\n /** Nodes */\n nodes: AssessmentTemplate[];\n };\n }>(client, ASSESSMENT_TEMPLATES, {\n variables: { first: PAGE_SIZE, offset },\n logger,\n });\n assessmentTemplates.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return assessmentTemplates.sort((a, b) => a.title.localeCompare(b.title));\n}\n","import { LocaleValue } from '@transcend-io/internationalization';\nimport {\n RequestAction,\n ConsentTrackerStatus,\n ActionItemCode,\n RetentionType,\n type ConsentThemeInput,\n type ConsentVariantInput,\n} from '@transcend-io/privacy-types';\nimport {\n fetchAllActionItemCollections,\n fetchAllActionItems,\n fetchAllActions,\n fetchAllAgentFiles,\n fetchAllAgentFunctions,\n fetchAllAgents,\n fetchAllAssessments,\n fetchAllAttributes,\n fetchAllBusinessEntities,\n fetchAllCookies,\n fetchAllDataCategories,\n fetchAllDataFlows,\n fetchAllPolicies,\n fetchAllPrivacyCenters,\n fetchAllProcessingPurposes,\n fetchAllSiloDiscoveryResults,\n fetchAllTemplates,\n fetchConsentManager,\n fetchConsentManagerExperiences,\n fetchConsentVariants,\n fetchConsentThemes,\n fetchConsentManagerTheme,\n fetchAllEnrichers,\n fetchAllIdentifiers,\n fetchAllMessages,\n fetchAllPromptGroups,\n fetchAllPromptPartials,\n fetchAllProcessingActivities,\n fetchAllPrompts,\n fetchAllPurposesAndPreferences,\n fetchPartitions,\n fetchAllTeams,\n fetchAllVendors,\n fetchApiKeys,\n formatAttributeValues,\n formatRegions,\n parseAssessmentDisplayLogic,\n parseAssessmentRiskLogic,\n convertToDataSubjectAllowlist,\n fetchAllDataSubjects,\n fetchEnrichedDataSilos,\n type AssessmentRule,\n} from '@transcend-io/sdk';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { flatten, keyBy, mapValues } from 'lodash-es';\n\n/* eslint-disable max-lines */\nimport {\n TranscendInput,\n ApiKeyInput,\n DataSiloInput,\n AttributeInput,\n ActionInput,\n IdentifierInput,\n BusinessEntityInput,\n EnricherInput,\n PromptGroupInput,\n DataFlowInput,\n PromptPartialInput,\n DataSubjectInput,\n CookieInput,\n PromptInput,\n DatapointInput,\n FieldInput,\n ProcessingPurposeInput,\n ProcessingActivityInput,\n DataCategoryInput,\n VendorInput,\n AgentFileInput,\n AgentFunctionInput,\n AgentInput,\n PolicyInput,\n IntlMessageInput,\n ActionItemInput,\n TeamInput,\n ActionItemCollectionInput,\n AssessmentInput,\n AssessmentTemplateInput,\n AssessmentSectionInput,\n AssessmentSectionQuestionInput,\n RiskLogicInput,\n ConsentPurpose,\n type SiloDiscoveryResultInput,\n} from '../../codecs.js';\nimport { TranscendPullResource } from '../../enums.js';\nimport { logger } from '../../logger.js';\nimport { fetchAllAssessmentTemplates } from './fetchAllAssessmentTemplates.js';\n\nexport const DEFAULT_TRANSCEND_PULL_RESOURCES = [\n TranscendPullResource.DataSilos,\n TranscendPullResource.Enrichers,\n TranscendPullResource.Templates,\n TranscendPullResource.ApiKeys,\n];\n\nexport interface TranscendPullConfigurationInput {\n /** Page size */\n pageSize: number;\n /** Enable debug logs */\n debug: boolean;\n /** The data silo IDs to sync. If empty list, pull all. */\n dataSiloIds: string[];\n /** Resources to pull in */\n resources?: TranscendPullResource[];\n /** The data silo types to sync.If empty list, pull all. */\n integrationNames: string[];\n /** The tracker statuses to pull */\n trackerStatuses?: ConsentTrackerStatus[];\n /** Skip fetching of datapoints */\n skipDatapoints?: boolean;\n /** Skip fetching of subdatapoints */\n skipSubDatapoints?: boolean;\n /** When true, metadata around guessed data categories should be included */\n includeGuessedCategories?: boolean;\n}\n\n/**\n * Pull a yaml configuration from Transcend\n *\n * @param client - GraphQL client\n * @param dataSiloIds - The data silos to sync. If empty list, pull all.\n * @returns The configuration\n */\nexport async function pullTranscendConfiguration(\n client: GraphQLClient,\n {\n dataSiloIds,\n integrationNames,\n debug,\n resources = DEFAULT_TRANSCEND_PULL_RESOURCES,\n pageSize,\n skipDatapoints,\n includeGuessedCategories,\n skipSubDatapoints,\n trackerStatuses = Object.values(ConsentTrackerStatus),\n }: TranscendPullConfigurationInput,\n): Promise<TranscendInput> {\n if (dataSiloIds.length > 0 && integrationNames.length > 0) {\n throw new Error('Only 1 of integrationNames OR dataSiloIds can be provided');\n }\n\n logger.info(colors.magenta(`Fetching data with page size ${pageSize}...`));\n\n // Fetch all data, but only conditional fetch data that is requested\n const [\n dataSubjects,\n apiKeyTitleMap,\n dataSilos,\n enrichers,\n dataFlows,\n cookies,\n attributes,\n templates,\n identifiers,\n actions,\n businessEntities,\n processingActivities,\n consentManager,\n consentManagerExperiences,\n consentVariants,\n consentThemes,\n prompts,\n promptPartials,\n promptGroups,\n agents,\n agentFunctions,\n agentFiles,\n vendors,\n dataCategories,\n processingPurposes,\n actionItems,\n actionItemCollections,\n teams,\n policies,\n privacyCenters,\n messages,\n partitions,\n assessments,\n assessmentTemplates,\n purposes,\n siloDiscoveryResults,\n ] = await Promise.all([\n // Grab all data subjects in the organization\n resources.includes(TranscendPullResource.DataSilos) ||\n resources.includes(TranscendPullResource.DataSubjects)\n ? fetchAllDataSubjects(client, { logger })\n : [],\n // Grab API keys\n resources.includes(TranscendPullResource.ApiKeys)\n ? fetchApiKeys(client, { fetchAll: true, logger })\n : [],\n // Fetch the data silos\n resources.includes(TranscendPullResource.DataSilos)\n ? fetchEnrichedDataSilos(client, {\n ids: dataSiloIds,\n integrationNames,\n pageSize,\n debug,\n includeGuessedCategories,\n skipDatapoints,\n skipSubDatapoints,\n logger,\n })\n : [],\n // Fetch enrichers\n resources.includes(TranscendPullResource.Enrichers)\n ? fetchAllEnrichers(client, { logger })\n : [],\n // Fetch data flows\n resources.includes(TranscendPullResource.DataFlows)\n ? [\n ...(trackerStatuses.includes(ConsentTrackerStatus.Live)\n ? await fetchAllDataFlows(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.Live },\n })\n : []),\n ...(trackerStatuses.includes(ConsentTrackerStatus.NeedsReview)\n ? await fetchAllDataFlows(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.NeedsReview },\n })\n : []),\n ]\n : [],\n // Fetch data flows\n resources.includes(TranscendPullResource.Cookies)\n ? [\n ...(trackerStatuses.includes(ConsentTrackerStatus.Live)\n ? await fetchAllCookies(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.Live },\n })\n : []),\n ...(trackerStatuses.includes(ConsentTrackerStatus.NeedsReview)\n ? await fetchAllCookies(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.NeedsReview },\n })\n : []),\n ]\n : [],\n // Fetch attributes\n resources.includes(TranscendPullResource.Attributes)\n ? fetchAllAttributes(client, { logger })\n : [],\n // Fetch email templates\n resources.includes(TranscendPullResource.Templates)\n ? fetchAllTemplates(client, { logger })\n : [],\n // Fetch identifiers\n resources.includes(TranscendPullResource.Identifiers)\n ? fetchAllIdentifiers(client, { logger })\n : [],\n // Fetch actions\n resources.includes(TranscendPullResource.Actions) ? fetchAllActions(client, { logger }) : [],\n // Fetch business entities\n resources.includes(TranscendPullResource.BusinessEntities)\n ? fetchAllBusinessEntities(client, { logger })\n : [],\n // Fetch processing activities\n resources.includes(TranscendPullResource.ProcessingActivities)\n ? fetchAllProcessingActivities(client, { logger })\n : [],\n // Fetch consent manager\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentManager(client, { logger })\n : undefined,\n // Fetch consent manager experiences\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentManagerExperiences(client, { logger })\n : [],\n // Fetch consent manager consent variants\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentVariants(client, { logger })\n : [],\n // Fetch consent manager consent themes\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentThemes(client, { logger })\n : [],\n // Fetch prompts\n resources.includes(TranscendPullResource.Prompts) ? fetchAllPrompts(client, { logger }) : [],\n // Fetch promptPartials\n resources.includes(TranscendPullResource.PromptPartials)\n ? fetchAllPromptPartials(client, { logger })\n : [],\n // Fetch promptGroups\n resources.includes(TranscendPullResource.PromptGroups)\n ? fetchAllPromptGroups(client, { logger })\n : [],\n // Fetch agents\n resources.includes(TranscendPullResource.Agents) ? fetchAllAgents(client, { logger }) : [],\n // Fetch agentFunctions\n resources.includes(TranscendPullResource.AgentFunctions)\n ? fetchAllAgentFunctions(client, { logger })\n : [],\n // Fetch agentFiles\n resources.includes(TranscendPullResource.AgentFiles)\n ? fetchAllAgentFiles(client, { logger })\n : [],\n // Fetch vendors\n resources.includes(TranscendPullResource.Vendors) ? fetchAllVendors(client, { logger }) : [],\n // Fetch dataCategories\n resources.includes(TranscendPullResource.DataCategories)\n ? fetchAllDataCategories(client, { logger })\n : [],\n // Fetch dataCategories\n resources.includes(TranscendPullResource.ProcessingPurposes)\n ? fetchAllProcessingPurposes(client, { logger })\n : [],\n // Fetch actionItems\n resources.includes(TranscendPullResource.ActionItems)\n ? fetchAllActionItems(client, {\n logger,\n filterBy: { type: [ActionItemCode.Onboarding] },\n })\n : [],\n // Fetch actionItemCollections\n resources.includes(TranscendPullResource.ActionItemCollections)\n ? fetchAllActionItemCollections(client, { logger })\n : [],\n // Fetch teams\n resources.includes(TranscendPullResource.Teams) ? fetchAllTeams(client, { logger }) : [],\n // Fetch policies\n resources.includes(TranscendPullResource.Policies) ? fetchAllPolicies(client, { logger }) : [],\n // Fetch privacy centers\n resources.includes(TranscendPullResource.PrivacyCenters)\n ? fetchAllPrivacyCenters(client, { logger })\n : [],\n // Fetch messages\n resources.includes(TranscendPullResource.Messages) ? fetchAllMessages(client, { logger }) : [],\n // Fetch partitions\n resources.includes(TranscendPullResource.Partitions) ? fetchPartitions(client, { logger }) : [],\n // Fetch assessments\n resources.includes(TranscendPullResource.Assessments)\n ? fetchAllAssessments(client, { logger })\n : [],\n // Fetch assessmentTemplates\n resources.includes(TranscendPullResource.AssessmentTemplates)\n ? fetchAllAssessmentTemplates(client)\n : [],\n // Fetch purpose and preferences\n resources.includes(TranscendPullResource.Purposes)\n ? fetchAllPurposesAndPreferences(client, { logger })\n : [],\n // Fetch silo discovery results\n resources.includes(TranscendPullResource.SystemDiscovery)\n ? fetchAllSiloDiscoveryResults(client, { logger })\n : [],\n ]);\n\n const consentManagerTheme =\n resources.includes(TranscendPullResource.ConsentManager) && consentManager\n ? await fetchConsentManagerTheme(client, {\n logger,\n filterBy: { airgapBundleId: consentManager.id },\n })\n : undefined;\n\n const result: TranscendInput = {};\n\n // Save API keys\n const apiKeyTitles = flatten(dataSilos.map(([{ apiKeys }]) => apiKeys.map(({ title }) => title)));\n const relevantApiKeys = Object.values(apiKeyTitleMap).filter(({ title }) =>\n resources.includes(TranscendPullResource.ApiKeys) ? true : apiKeyTitles.includes(title),\n );\n if (relevantApiKeys.length > 0 && resources.includes(TranscendPullResource.ApiKeys)) {\n result['api-keys'] = relevantApiKeys.map(\n ({ title }): ApiKeyInput => ({\n title,\n }),\n );\n }\n\n // Save Partitions\n if (partitions.length > 0 && resources.includes(TranscendPullResource.Partitions)) {\n result.partitions = partitions.map(({ name, partition }) => ({\n name,\n partition,\n }));\n }\n\n // Save Consent Manager\n if (consentManager && resources.includes(TranscendPullResource.ConsentManager)) {\n result['consent-manager'] = {\n bundleUrls: {\n TEST: consentManager.testBundleURL,\n PRODUCTION: consentManager.bundleURL,\n },\n domains: consentManager.configuration.domains || undefined,\n partition: consentManager.configuration.partition || undefined,\n consentPrecedence: consentManager.configuration.consentPrecedence || undefined,\n unknownRequestPolicy: consentManager.configuration.unknownRequestPolicy || undefined,\n unknownCookiePolicy: consentManager.configuration.unknownCookiePolicy || undefined,\n syncEndpoint: consentManager.configuration.syncEndpoint || undefined,\n telemetryPartitioning: consentManager.configuration.telemetryPartitioning || undefined,\n signedIabAgreement: consentManager.configuration.signedIabAgreement || undefined,\n // TODO: https://transcend.height.app/T-23919 - reconsider simpler yml shape\n syncGroups: consentManager.configuration.syncGroups || undefined,\n theme: !consentManagerTheme\n ? undefined\n : {\n primaryColor: consentManagerTheme.primaryColor || undefined,\n fontColor: consentManagerTheme.fontColor || undefined,\n privacyPolicy: consentManagerTheme.privacyPolicy || undefined,\n prompt: consentManagerTheme.prompt,\n },\n experiences: consentManagerExperiences.map((experience) => ({\n name: experience.name,\n displayName: experience.displayName || undefined,\n regions: experience.regions.map((region) => ({\n countrySubDivision: region.countrySubDivision || undefined,\n country: region.country || undefined,\n })),\n onConsentExpiry: experience.onConsentExpiry,\n consentExpiry: experience.consentExpiry,\n operator: experience.operator,\n displayPriority: experience.displayPriority,\n viewState: experience.viewState,\n purposes: experience.purposes.map((purpose) => ({\n trackingType: purpose.trackingType,\n })),\n optedOutPurposes: experience.optedOutPurposes.map((purpose) => ({\n trackingType: purpose.trackingType,\n })),\n browserLanguages: experience.browserLanguages,\n browserTimeZones: experience.browserTimeZones,\n consentUiVariantSlug: experience.consentUiVariant?.slug,\n })),\n consentVariants: consentVariants.map(\n (variant): ConsentVariantInput => ({\n id: variant.id,\n name: variant.name,\n slug: variant.slug,\n description: variant.description,\n configuration: JSON.stringify(variant.configuration),\n locales: variant.locales as LocaleValue[],\n status: variant.status,\n userFlow: variant.userFlow,\n themeSlug: variant.theme?.slug,\n }),\n ),\n consentThemes: consentThemes.map(\n (theme): ConsentThemeInput => ({\n id: theme.id,\n name: theme.name,\n slug: theme.slug,\n configuration: JSON.stringify(theme.configuration),\n }),\n ),\n };\n }\n\n // Save assessments\n if (assessments.length > 0 && resources.includes(TranscendPullResource.Assessments)) {\n result.assessments = assessments.map(\n ({\n title,\n assessmentGroup,\n sections,\n creator,\n description,\n status,\n assignees,\n externalAssignees,\n reviewers,\n isLocked,\n isArchived,\n isExternallyCreated,\n dueDate,\n createdAt,\n assignedAt,\n submittedAt,\n approvedAt,\n rejectedAt,\n titleIsInternal,\n retentionSchedule,\n attributeValues,\n resources,\n syncedRows,\n }): AssessmentInput => ({\n title,\n group: assessmentGroup.title,\n sections: sections.map(\n ({\n title,\n status,\n questions,\n assignees,\n isReviewed,\n externalAssignees,\n }): AssessmentSectionInput => ({\n title,\n status,\n questions: questions.map(\n ({\n title,\n type,\n subType,\n placeholder,\n description,\n isRequired,\n referenceId,\n displayLogic,\n riskLogic,\n riskCategories,\n riskFramework,\n answerOptions,\n selectedAnswers,\n allowedMimeTypes,\n allowSelectOther,\n syncModel,\n syncColumn,\n attributeKey,\n requireRiskEvaluation,\n requireRiskMatrixEvaluation,\n }): AssessmentSectionQuestionInput => {\n const displayLogicParsed = displayLogic\n ? parseAssessmentDisplayLogic(displayLogic)\n : undefined;\n return {\n title,\n type,\n 'sub-type': subType,\n placeholder,\n description,\n 'is-required': isRequired,\n 'reference-id': referenceId,\n 'display-logic':\n displayLogicParsed && Object.keys(displayLogicParsed).length > 0\n ? {\n action: displayLogicParsed.action!,\n rule: displayLogicParsed.rule\n ? {\n 'depends-on-question-reference-id':\n displayLogicParsed.rule.dependsOnQuestionReferenceId,\n 'comparison-operator': displayLogicParsed.rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property with a check\n 'comparisonOperands' in displayLogicParsed.rule\n ? displayLogicParsed.rule.comparisonOperands\n : undefined,\n }\n : undefined,\n 'nested-rule': displayLogicParsed.nestedRule\n ? {\n 'logic-operator': displayLogicParsed.nestedRule.logicOperator,\n rules: (displayLogicParsed.nestedRule.rules || []).map(\n (rule: AssessmentRule) => ({\n 'depends-on-question-reference-id':\n rule.dependsOnQuestionReferenceId,\n 'comparison-operator': rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property on the nested rule\n 'comparisonOperands' in rule\n ? rule.comparisonOperands\n : undefined,\n }),\n ),\n }\n : undefined,\n }\n : undefined,\n 'risk-logic': riskLogic.map((logic): RiskLogicInput => {\n const parsed = parseAssessmentRiskLogic(logic);\n return {\n 'risk-level': parsed.riskAssignment?.riskLevelId,\n 'comparison-operands': parsed.comparisonOperands,\n 'comparison-operator': parsed.comparisonOperator,\n };\n }),\n 'risk-categories': riskCategories.map(({ title }) => title),\n 'risk-framework': riskFramework?.title,\n 'answer-options': answerOptions.map(({ value }) => ({\n value,\n })),\n 'selected-answers': selectedAnswers.map(({ value }) => value),\n 'allowed-mime-types': allowedMimeTypes,\n 'allow-select-other': allowSelectOther,\n 'sync-model': syncModel || undefined,\n 'sync-column': syncColumn || undefined,\n 'attribute-key': attributeKey?.name,\n 'require-risk-evaluation': requireRiskEvaluation,\n 'require-risk-matrix-evaluation': requireRiskMatrixEvaluation,\n };\n },\n ),\n assignees: assignees.map(({ email }) => email),\n 'external-assignees': externalAssignees.map(({ email }) => email),\n 'is-reviewed': isReviewed,\n }),\n ),\n creator: creator?.email,\n description,\n status,\n assignees: assignees.map(({ email }) => email),\n 'external-assignees': externalAssignees.map(({ email }) => email),\n reviewers: reviewers.map(({ email }) => email),\n locked: isLocked,\n archived: isArchived,\n external: isExternallyCreated,\n 'title-is-internal': titleIsInternal,\n 'due-date': dueDate || undefined,\n 'created-at': createdAt || undefined,\n 'assigned-at': assignedAt || undefined,\n 'submitted-at': submittedAt || undefined,\n 'approved-at': approvedAt || undefined,\n 'rejected-at': rejectedAt || undefined,\n 'retention-schedule': retentionSchedule\n ? {\n type: retentionSchedule.type,\n 'duration-days': retentionSchedule.durationDays,\n operand: retentionSchedule.operation,\n }\n : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n resources: resources.map(({ resourceType, title, name, category, type, purpose }) => ({\n type: resourceType,\n title: category\n ? `${category} - ${name}`\n : purpose\n ? `${purpose} - ${name}`\n : title || name || type || '',\n })),\n rows: syncedRows.map(({ resourceType, title, name, category, type, purpose }) => ({\n type: resourceType,\n title: category\n ? `${category} - ${name}`\n : purpose\n ? `${purpose} - ${name}`\n : title || name || type || '',\n })),\n }),\n );\n }\n\n // Save assessmentTemplates\n if (\n assessmentTemplates.length > 0 &&\n resources.includes(TranscendPullResource.AssessmentTemplates)\n ) {\n result['assessment-templates'] = assessmentTemplates.map(\n ({\n title,\n description,\n sections,\n status,\n source,\n creator,\n isLocked,\n isArchived,\n createdAt,\n retentionSchedule,\n }): AssessmentTemplateInput => ({\n title,\n description,\n sections: sections.map(\n ({ title, questions }): AssessmentSectionInput => ({\n title,\n questions: questions.map(\n ({\n title,\n type,\n subType,\n placeholder,\n description,\n isRequired,\n referenceId,\n displayLogic,\n riskLogic,\n riskCategories,\n riskFramework,\n answerOptions,\n allowedMimeTypes,\n allowSelectOther,\n syncModel,\n syncColumn,\n attributeKey,\n requireRiskEvaluation,\n requireRiskMatrixEvaluation,\n }): AssessmentSectionQuestionInput => {\n const displayLogicParsed = displayLogic\n ? parseAssessmentDisplayLogic(displayLogic)\n : undefined;\n return {\n title,\n type,\n 'sub-type': subType,\n placeholder,\n description,\n 'is-required': isRequired,\n 'reference-id': referenceId,\n 'display-logic':\n displayLogicParsed && Object.keys(displayLogicParsed).length > 0\n ? {\n action: displayLogicParsed.action!,\n rule: displayLogicParsed.rule\n ? {\n 'depends-on-question-reference-id':\n displayLogicParsed.rule.dependsOnQuestionReferenceId,\n 'comparison-operator': displayLogicParsed.rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property with a check\n 'comparisonOperands' in displayLogicParsed.rule\n ? displayLogicParsed.rule.comparisonOperands\n : undefined,\n }\n : undefined,\n 'nested-rule': displayLogicParsed.nestedRule\n ? {\n 'logic-operator': displayLogicParsed.nestedRule.logicOperator,\n rules: (displayLogicParsed.nestedRule.rules || []).map(\n (rule: AssessmentRule) => ({\n 'depends-on-question-reference-id':\n rule.dependsOnQuestionReferenceId,\n 'comparison-operator': rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property on the nested rule\n 'comparisonOperands' in rule\n ? rule.comparisonOperands\n : undefined,\n }),\n ),\n }\n : undefined,\n }\n : undefined,\n 'risk-logic': riskLogic.map((logic): RiskLogicInput => {\n const parsed = parseAssessmentRiskLogic(logic);\n return {\n 'risk-level': parsed.riskAssignment?.riskLevelId,\n 'risk-matrix-row': parsed.riskAssignment?.riskMatrixRowId,\n 'risk-matrix-column': parsed.riskAssignment?.riskMatrixColumnId,\n 'comparison-operands': parsed.comparisonOperands,\n 'comparison-operator': parsed.comparisonOperator,\n };\n }),\n 'risk-categories': riskCategories.map(({ title }) => title),\n 'risk-framework': riskFramework?.title,\n 'answer-options': answerOptions.map(({ value }) => ({\n value,\n })),\n 'allowed-mime-types': allowedMimeTypes,\n 'allow-select-other': allowSelectOther,\n 'sync-model': syncModel || undefined,\n 'sync-column': syncColumn || undefined,\n 'attribute-key': attributeKey?.name,\n 'require-risk-evaluation': requireRiskEvaluation,\n 'require-risk-matrix-evaluation': requireRiskMatrixEvaluation,\n };\n },\n ),\n }),\n ),\n status,\n source,\n creator: creator?.email,\n locked: isLocked,\n archived: isArchived,\n 'created-at': createdAt || undefined,\n 'retention-schedule': retentionSchedule\n ? {\n type: retentionSchedule.type,\n 'duration-days': retentionSchedule.durationDays,\n operand: retentionSchedule.operation,\n }\n : undefined,\n }),\n );\n }\n\n // Save Silo Discovery Results\n if (\n siloDiscoveryResults.length > 0 &&\n resources.includes(TranscendPullResource.SystemDiscovery)\n ) {\n result['system-discovery'] = siloDiscoveryResults.map(\n ({\n title,\n resourceId,\n suggestedCatalog: { title: suggestedCatalogTitle },\n plugin: {\n dataSilo: { title: dataSiloTitle },\n },\n country,\n countrySubDivision,\n plaintextContext,\n containsSensitiveData,\n status,\n }): SiloDiscoveryResultInput => ({\n title,\n resourceId,\n suggestedCatalog: suggestedCatalogTitle,\n plugin: dataSiloTitle,\n country: country || undefined,\n countrySubDivision: countrySubDivision || undefined,\n plaintextContext,\n containsSensitiveData,\n status,\n }),\n );\n }\n\n // Save prompts\n if (prompts.length > 0 && resources.includes(TranscendPullResource.Prompts)) {\n result.prompts = prompts.map(\n ({ title, content }): PromptInput => ({\n title,\n content,\n }),\n );\n }\n\n // Save promptPartials\n if (promptPartials.length > 0 && resources.includes(TranscendPullResource.PromptPartials)) {\n result['prompt-partials'] = promptPartials.map(\n ({ title, content }): PromptPartialInput => ({\n title,\n content,\n }),\n );\n }\n\n // Save promptGroups\n if (promptGroups.length > 0 && resources.includes(TranscendPullResource.PromptGroups)) {\n result['prompt-groups'] = promptGroups.map(\n ({ title, description, prompts }): PromptGroupInput => ({\n title,\n description,\n prompts: prompts.map(({ title }) => title),\n }),\n );\n }\n\n // Save teams\n if (teams.length > 0 && resources.includes(TranscendPullResource.Teams)) {\n result.teams = teams.map(\n ({\n name,\n description,\n ssoDepartment,\n ssoGroup,\n ssoTitle,\n users,\n scopes,\n parentTeam,\n }): TeamInput => ({\n name,\n description,\n 'sso-department': ssoDepartment || undefined,\n 'sso-group': ssoGroup || undefined,\n 'sso-title': ssoTitle || undefined,\n 'parent-team-name': parentTeam?.name,\n users: users.map(({ email }) => email),\n scopes: scopes.map(({ name }) => name),\n }),\n );\n }\n\n // Save Data Subjects\n if (dataSubjects.length > 0 && resources.includes(TranscendPullResource.DataSubjects)) {\n result['data-subjects'] = dataSubjects.map(\n ({ type, title, active, adminDashboardDefaultSilentMode, actions }): DataSubjectInput => ({\n type,\n title: title?.defaultMessage,\n active,\n adminDashboardDefaultSilentMode,\n actions: actions.map(({ type }) => type),\n }),\n );\n }\n\n // Save privacy policies\n if (policies.length > 0) {\n result.policies = policies.map(\n ({ title, versions, disabledLocales }): PolicyInput => ({\n title: title?.defaultMessage,\n content: versions?.[0]?.content?.defaultMessage,\n disabledLocales,\n }),\n );\n }\n\n // Save messages\n if (messages.length > 0) {\n result.messages = messages.map(\n ({ id, defaultMessage, targetReactIntlId, description, translations }): IntlMessageInput => ({\n id,\n defaultMessage,\n description,\n targetReactIntlId: targetReactIntlId || undefined,\n translations: translations.reduce(\n (acc, { locale, value }) => Object.assign(acc, { [locale]: value }),\n {} as Record<LocaleValue, string>,\n ),\n }),\n );\n }\n\n // Save privacy center\n if (privacyCenters.length > 0) {\n const privacyCenter = privacyCenters[0];\n result['privacy-center'] = {\n isDisabled: privacyCenter.isDisabled,\n showPrivacyRequestButton: privacyCenter.showPrivacyRequestButton,\n showPolicies: privacyCenter.showPolicies,\n showTrackingTechnologies: privacyCenter.showTrackingTechnologies,\n showCookies: privacyCenter.showCookies,\n showDataFlows: privacyCenter.showDataFlows,\n showConsentManager: privacyCenter.showConsentManager,\n showManageYourPrivacy: privacyCenter.showManageYourPrivacy,\n showMarketingPreferences: privacyCenter.showMarketingPreferences,\n locales: privacyCenter.locales,\n defaultLocale: privacyCenter.defaultLocale,\n preferBrowserDefaultLocale: privacyCenter.preferBrowserDefaultLocale,\n supportEmail: privacyCenter.supportEmail || undefined,\n replyToEmail: privacyCenter.replyToEmail || undefined,\n useNoReplyEmailAddress: privacyCenter.useNoReplyEmailAddress,\n useCustomEmailDomain: privacyCenter.useCustomEmailDomain,\n transformAccessReportJsonToCsv: privacyCenter.transformAccessReportJsonToCsv,\n theme: privacyCenter.theme,\n };\n }\n\n // Save business entities\n if (businessEntities.length > 0 && resources.includes(TranscendPullResource.BusinessEntities)) {\n result['business-entities'] = businessEntities.map(\n ({\n title,\n description,\n address,\n headquarterCountry,\n headquarterSubDivision,\n dataProtectionOfficerName,\n dataProtectionOfficerEmail,\n attributeValues,\n }): BusinessEntityInput => ({\n title,\n description: description || undefined,\n address: address || undefined,\n headquarterCountry: headquarterCountry || undefined,\n headquarterSubDivision: headquarterSubDivision || undefined,\n dataProtectionOfficerName: dataProtectionOfficerName || undefined,\n dataProtectionOfficerEmail: dataProtectionOfficerEmail || undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save processing activities\n if (\n processingActivities.length > 0 &&\n resources.includes(TranscendPullResource.ProcessingActivities)\n ) {\n result['processing-activities'] = processingActivities.map(\n ({\n title,\n description,\n securityMeasureDetails,\n controllerships,\n storageRegions,\n transferRegions,\n retentionType,\n retentionPeriod,\n dataProtectionImpactAssessmentLink,\n dataProtectionImpactAssessmentStatus,\n attributeValues,\n dataSilos,\n dataSubjects,\n teams,\n owners,\n processingPurposeSubCategories,\n dataSubCategories,\n saaSCategories,\n }): ProcessingActivityInput => ({\n title,\n description,\n securityMeasureDetails: securityMeasureDetails ?? undefined,\n controllerships: controllerships.length > 0 ? controllerships : undefined,\n storageRegions: storageRegions.length > 0 ? formatRegions(storageRegions) : undefined,\n transferRegions: transferRegions.length > 0 ? formatRegions(transferRegions) : undefined,\n retentionType,\n retentionPeriod: retentionType === RetentionType.StatedPeriod ? retentionPeriod : undefined,\n dataProtectionImpactAssessmentLink: dataProtectionImpactAssessmentLink ?? undefined,\n dataProtectionImpactAssessmentStatus,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n dataSiloTitles: dataSilos.length > 0 ? dataSilos.map(({ title }) => title) : undefined,\n dataSubjectTypes:\n dataSubjects.length > 0 ? dataSubjects.map(({ type }) => type) : undefined,\n teamNames: teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n ownerEmails: owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n processingSubPurposes:\n processingPurposeSubCategories.length > 0\n ? processingPurposeSubCategories.map(({ name, purpose }) => ({\n purpose,\n ...(name ? { name } : {}),\n }))\n : undefined,\n dataSubCategories:\n dataSubCategories.length > 0\n ? dataSubCategories.map(({ name, category }) => ({\n category,\n ...(name ? { name } : {}),\n }))\n : undefined,\n saaSCategories:\n saaSCategories.length > 0 ? saaSCategories.map(({ title }) => title) : undefined,\n }),\n );\n }\n\n // Save Actions\n if (actions.length > 0 && resources.includes(TranscendPullResource.Actions)) {\n result.actions = actions.map(\n ({\n type,\n skipSecondaryIfNoFiles,\n skipDownloadableStep,\n requiresReview,\n regionList,\n regionDetectionMethod,\n waitingPeriod,\n }): ActionInput => ({\n type,\n ...(type === RequestAction.Erasure\n ? {\n skipSecondaryIfNoFiles,\n skipDownloadableStep,\n }\n : {}),\n requiresReview,\n waitingPeriod,\n regionDetectionMethod,\n regionList: regionList.length > 0 ? regionList : undefined,\n }),\n );\n }\n\n // Save identifiers\n if (identifiers.length > 0 && resources.includes(TranscendPullResource.Identifiers)) {\n result.identifiers = identifiers.map(\n ({\n name,\n type,\n regex,\n selectOptions,\n privacyCenterVisibility,\n isRequiredInForm,\n placeholder,\n displayTitle,\n dataSubjects,\n displayDescription,\n displayOrder,\n isUniqueOnPreferenceStore,\n }): IdentifierInput => ({\n name,\n type,\n regex,\n selectOptions: selectOptions.length > 0 ? selectOptions : undefined,\n privacyCenterVisibility:\n privacyCenterVisibility.length > 0 ? privacyCenterVisibility : undefined,\n isRequiredInForm,\n placeholder: placeholder || undefined,\n dataSubjects: dataSubjects.length > 0 ? dataSubjects.map(({ type }) => type) : undefined,\n displayTitle: displayTitle?.defaultMessage,\n displayDescription: displayDescription?.defaultMessage,\n displayOrder,\n isUniqueOnPreferenceStore,\n }),\n );\n }\n\n // Save agents\n if (agents.length > 0 && resources.includes(TranscendPullResource.Agents)) {\n result.agents = agents.map(\n ({\n name,\n agentId,\n description,\n instructions,\n codeInterpreterEnabled,\n retrievalEnabled,\n prompt,\n largeLanguageModel,\n teams,\n owners,\n agentFunctions,\n agentFiles,\n }): AgentInput => ({\n name,\n agentId,\n description: description || undefined,\n instructions,\n codeInterpreterEnabled,\n retrievalEnabled,\n prompt: prompt?.title,\n 'large-language-model': {\n name: largeLanguageModel.name,\n client: largeLanguageModel.client,\n },\n teams: teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n owners: owners && owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n 'agent-functions':\n agentFunctions && agentFunctions.length > 0\n ? agentFunctions.map(({ name }) => name)\n : undefined,\n 'agent-files':\n agentFiles && agentFiles.length > 0 ? agentFiles.map(({ name }) => name) : undefined,\n }),\n );\n }\n\n // Save action items\n if (actionItems.length > 0 && resources.includes(TranscendPullResource.ActionItems)) {\n result['action-items'] = actionItems.map(\n ({\n teams,\n users,\n customerExperienceActionItemIds: [customerExperienceActionItemId],\n dueDate,\n priority,\n resolved,\n collections,\n notes,\n link,\n title,\n type,\n attributeValues,\n }): ActionItemInput => ({\n teams: teams.map(({ name }) => name),\n users: users.map(({ email }) => email),\n dueDate: dueDate || undefined,\n title,\n notes,\n customerExperienceActionItemId,\n collections: collections.map(({ title }) => title),\n link,\n priority: priority || undefined,\n resolved,\n type,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save action item collections\n if (\n actionItemCollections.length > 0 &&\n resources.includes(TranscendPullResource.ActionItemCollections)\n ) {\n result['action-item-collections'] = actionItemCollections.map(\n ({ title, description, hidden, productLine }): ActionItemCollectionInput => ({\n title,\n description: description || undefined,\n hidden,\n productLine,\n }),\n );\n }\n\n // Save agent functions\n if (agentFunctions.length > 0 && resources.includes(TranscendPullResource.AgentFunctions)) {\n result['agent-functions'] = agentFunctions.map(\n ({ name, description, parameters }): AgentFunctionInput => ({\n name,\n description,\n parameters: JSON.stringify(parameters),\n }),\n );\n }\n\n // Save agent files\n if (agentFiles.length > 0 && resources.includes(TranscendPullResource.AgentFiles)) {\n result['agent-files'] = agentFiles.map(\n ({ name, description, fileId, size, purpose }): AgentFileInput => ({\n name,\n description,\n fileId,\n size,\n purpose,\n }),\n );\n }\n\n // Save vendors\n if (vendors.length > 0 && resources.includes(TranscendPullResource.Vendors)) {\n result.vendors = vendors.map(\n ({\n title,\n description,\n dataProcessingAgreementLink,\n contactName,\n contactPhone,\n address,\n headquarterCountry,\n headquarterSubDivision,\n websiteUrl,\n businessEntity,\n teams,\n owners,\n attributeValues,\n }): VendorInput => ({\n title,\n description: description || undefined,\n dataProcessingAgreementLink: dataProcessingAgreementLink || undefined,\n contactName: contactName || undefined,\n contactPhone: contactPhone || undefined,\n address: address || undefined,\n headquarterCountry: headquarterCountry || undefined,\n headquarterSubDivision: headquarterSubDivision || undefined,\n websiteUrl: websiteUrl || undefined,\n businessEntity: businessEntity?.title,\n teams: teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n owners: owners && owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save data categories\n if (dataCategories.length > 0 && resources.includes(TranscendPullResource.DataCategories)) {\n result['data-categories'] = dataCategories.map(\n ({\n name,\n category,\n description,\n regex,\n owners,\n teams,\n attributeValues,\n }): DataCategoryInput => ({\n name,\n category,\n description: description || undefined,\n regex: regex || undefined,\n owners: owners && owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n teams: teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save processing purposes\n if (\n processingPurposes.length > 0 &&\n resources.includes(TranscendPullResource.ProcessingPurposes)\n ) {\n result['processing-purposes'] = processingPurposes.map(\n ({ name, purpose, description, owners, teams, attributeValues }): ProcessingPurposeInput => ({\n name,\n purpose,\n description: description || undefined,\n owners: owners && owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n teams: teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save data flows\n if (dataFlows.length > 0 && resources.includes(TranscendPullResource.DataFlows)) {\n result['data-flows'] = dataFlows.map(\n ({\n value,\n type,\n description,\n trackingType,\n service,\n status,\n owners,\n teams,\n attributeValues,\n }): DataFlowInput => ({\n value,\n type,\n description: description || undefined,\n trackingPurposes: trackingType,\n status,\n service: service?.integrationName,\n owners: owners.map(({ email }) => email),\n teams: teams.map(({ name }) => name),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save cookies\n if (cookies.length > 0 && resources.includes(TranscendPullResource.Cookies)) {\n result.cookies = cookies.map(\n ({\n name,\n isRegex,\n description,\n trackingPurposes,\n service,\n status,\n owners,\n teams,\n attributeValues,\n }): CookieInput => ({\n name,\n isRegex,\n description: description || undefined,\n trackingPurposes,\n status,\n service: service?.integrationName,\n owners: owners.map(({ email }) => email),\n teams: teams.map(({ name }) => name),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save attributes\n if (attributes.length > 0 && resources.includes(TranscendPullResource.Attributes)) {\n result.attributes = attributes.map(\n ({ description, name, type, values, enabledOn = [] }): AttributeInput => ({\n description: description || undefined,\n resources: enabledOn,\n name,\n type,\n values: values.map(({ name, color, description }) => ({\n name,\n color: color || undefined,\n description,\n })),\n }),\n );\n }\n\n // save purposes\n if (purposes.length > 0) {\n result.purposes = purposes.map(\n ({\n name,\n description,\n trackingType,\n defaultConsent,\n configurable,\n showInConsentManager,\n isActive,\n displayOrder,\n optOutSignals,\n authLevel,\n topics,\n showInPrivacyCenter,\n title,\n }): ConsentPurpose => ({\n name,\n title,\n description: description || undefined,\n trackingType,\n 'default-consent': defaultConsent,\n configurable,\n 'show-in-consent-manager': showInConsentManager,\n 'show-in-privacy-center': showInPrivacyCenter,\n 'is-active': isActive,\n 'display-order': displayOrder,\n 'opt-out-signals': optOutSignals.length > 0 ? optOutSignals : undefined,\n 'auth-level': authLevel || undefined,\n 'preference-topics': topics.map(\n ({\n title,\n type,\n displayDescription,\n defaultConfiguration,\n showInPrivacyCenter,\n preferenceOptionValues,\n }) => ({\n title: title.defaultMessage,\n type,\n description: displayDescription.defaultMessage,\n 'default-configuration': defaultConfiguration,\n 'show-in-privacy-center': showInPrivacyCenter,\n ...(preferenceOptionValues.length > 0\n ? {\n options: preferenceOptionValues.map(({ title, slug }) => ({\n title: title.defaultMessage,\n slug,\n })),\n }\n : {}),\n }),\n ),\n }),\n );\n }\n\n // save email templates\n if (\n dataSiloIds.length === 0 &&\n templates.length > 0 &&\n resources.includes(TranscendPullResource.Templates)\n ) {\n result.templates = templates.map(({ title }) => ({ title }));\n }\n\n // Save enrichers\n if (enrichers.length > 0 && resources.includes(TranscendPullResource.Enrichers)) {\n result.enrichers = enrichers.map(\n ({\n title,\n url,\n type,\n inputIdentifier,\n identifiers,\n actions,\n testRegex,\n dataSubjects,\n expirationDuration,\n lookerQueryTitle,\n transitionRequestStatus,\n phoneNumbers,\n regionList,\n }): EnricherInput => ({\n title,\n url: url || undefined,\n type,\n 'input-identifier': inputIdentifier?.name,\n 'output-identifiers': identifiers.map(({ name }) => name),\n 'privacy-actions':\n Object.values(RequestAction).length === actions.length ? undefined : actions,\n testRegex: testRegex || undefined,\n lookerQueryTitle: lookerQueryTitle || undefined,\n expirationDuration: parseInt(expirationDuration, 10),\n transitionRequestStatus: transitionRequestStatus || undefined,\n phoneNumbers: phoneNumbers && phoneNumbers.length > 0 ? phoneNumbers : undefined,\n regionList: regionList && regionList.length > 0 ? regionList : undefined,\n 'data-subjects': dataSubjects.map(({ type }) => type),\n }),\n );\n }\n\n // Save data silos\n if (dataSilos.length > 0 && resources.includes(TranscendPullResource.DataSilos)) {\n const indexedDataSubjects = keyBy(dataSubjects, 'type');\n result['data-silos'] = dataSilos.map(\n ([\n {\n title,\n description,\n url,\n type,\n outerType,\n apiKeys,\n notifyEmailAddress,\n identifiers,\n dependentDataSilos,\n owners,\n country,\n countrySubDivision,\n teams,\n subjectBlocklist,\n isLive,\n promptAVendorEmailSendFrequency,\n promptAVendorEmailSendType,\n promptAVendorEmailIncludeIdentifiersAttachment,\n promptAVendorEmailCompletionLinkType,\n manualWorkRetryFrequency,\n catalog,\n attributeValues,\n discoveredBy,\n businessEntities,\n },\n dataPoints,\n ]): DataSiloInput => ({\n title,\n description,\n integrationName: type,\n 'outer-type': outerType || undefined,\n url: url || undefined,\n 'api-key-title': apiKeys[0]?.title,\n 'identity-keys': identifiers\n .filter(({ isConnected }) => isConnected)\n .map(({ name }) => name),\n ...(dependentDataSilos.length > 0\n ? {\n 'deletion-dependencies': dependentDataSilos.map(({ title }) => title),\n }\n : {}),\n ...(owners.length > 0 ? { owners: owners.map(({ email }) => email) } : {}),\n ...(teams.length > 0 ? { teams: teams.map(({ name }) => name) } : {}),\n ...(discoveredBy.length > 0\n ? { discoveredBy: discoveredBy.map(({ title }) => title) }\n : {}),\n ...(businessEntities.length > 0\n ? {\n businessEntities: businessEntities.map(({ title }) => title),\n }\n : {}),\n country: country || undefined,\n countrySubDivision: countrySubDivision || undefined,\n disabled: !isLive,\n 'data-subjects':\n subjectBlocklist.length > 0\n ? convertToDataSubjectAllowlist(\n subjectBlocklist.map(({ type }) => type),\n indexedDataSubjects,\n )\n : undefined,\n ...(catalog.hasAvcFunctionality\n ? {\n 'email-settings': {\n 'notify-email-address': notifyEmailAddress || undefined,\n 'send-frequency': promptAVendorEmailSendFrequency,\n 'send-type': promptAVendorEmailSendType,\n 'include-identifiers-attachment': promptAVendorEmailIncludeIdentifiersAttachment,\n 'completion-link-type': promptAVendorEmailCompletionLinkType,\n 'manual-work-retry-frequency': manualWorkRetryFrequency,\n },\n }\n : {}),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n\n datapoints: dataPoints\n .map(\n (dataPoint): DatapointInput => ({\n key: dataPoint.name,\n title: dataPoint.title?.defaultMessage,\n description: dataPoint.description?.defaultMessage,\n owners: dataPoint.owners.map(({ email }) => email),\n teams: dataPoint.teams.map(({ name }) => name),\n ...(dataPoint.path.length > 0 ? { path: dataPoint.path } : {}),\n ...(dataPoint.dataCollection?.title\n ? {\n 'data-collection-tag': dataPoint.dataCollection.title.defaultMessage,\n }\n : {}),\n ...(dataPoint.dbIntegrationQueries.length > 0\n ? {\n 'privacy-action-queries': mapValues(\n keyBy(dataPoint.dbIntegrationQueries, 'requestType'),\n (databaseIntegrationQuery) =>\n databaseIntegrationQuery.suggestedQuery ||\n databaseIntegrationQuery.query ||\n undefined,\n ),\n }\n : {}),\n ...(dataPoint.subDataPoints.length > 0\n ? {\n fields: dataPoint.subDataPoints\n .map(\n (field): FieldInput => ({\n key: field.name,\n description: field.description,\n purposes: field.purposes,\n categories: field.categories,\n ...(includeGuessedCategories && field.pendingCategoryGuesses\n ? {\n 'guessed-categories': field.pendingCategoryGuesses\n .filter((guess) => guess.status === 'PENDING')\n .map((guess) => ({\n category: {\n name: guess.category.name,\n category: guess.category.category,\n },\n status: guess.status,\n confidence: guess.confidence,\n classifierVersion: guess.classifierVersion || undefined,\n })),\n }\n : {}),\n 'access-request-visibility-enabled': field.accessRequestVisibilityEnabled,\n 'erasure-request-redaction-enabled': field.erasureRequestRedactionEnabled,\n attributes:\n field.attributeValues !== undefined && field.attributeValues.length > 0\n ? formatAttributeValues(field.attributeValues)\n : undefined,\n }),\n )\n .sort((a, b) => a.key.localeCompare(b.key)),\n }\n : {}),\n 'privacy-actions': dataPoint.actionSettings\n .filter(({ active }) => active)\n .map(({ type }) => type),\n }),\n )\n .sort((a, b) =>\n [...(a.path ?? []), a.key]\n .join('.')\n .localeCompare([...(b.path ?? []), b.key].join('.')),\n ),\n }),\n );\n }\n return result;\n}\n/* eslint-enable max-lines */\n"],"mappings":"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"}
1
+ {"version":3,"file":"pullTranscendConfiguration-ChFN8Wp4.mjs","names":[],"sources":["../src/lib/graphql/gqls/assessmentTemplate.ts","../src/lib/graphql/fetchAllAssessmentTemplates.ts","../src/lib/graphql/pullTranscendConfiguration.ts"],"sourcesContent":["import { ASSESSMENT_SECTION_FIELDS } from '@transcend-io/sdk';\nimport { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\n// orderBy: [\n// { field: createdAt, direction: ASC }\n// { field: name, direction: ASC }\n// ]\nexport const ASSESSMENT_TEMPLATES = gql`\n query TranscendCliAssessmentTemplates(\n $first: Int!\n $offset: Int!\n $filterBy: AssessmentFormTemplateFiltersInput\n ) {\n assessmentFormTemplates(\n first: $first\n offset: $offset\n filterBy: $filterBy\n ) {\n nodes {\n id\n creator {\n id\n email\n name\n }\n lastEditor {\n id\n email\n name\n }\n title\n description\n status\n source\n parentId\n isLocked\n isArchived\n createdAt\n updatedAt\n retentionSchedule {\n id\n type\n durationDays\n operation\n createdAt\n updatedAt\n }\n assessmentEmailSet {\n id\n title\n description\n isDefault\n templates {\n id\n title\n }\n }\n sections {\n ${ASSESSMENT_SECTION_FIELDS}\n }\n }\n }\n }\n`;\n","import {\n AssessmentFormTemplateSource,\n AssessmentFormTemplateStatus,\n} from '@transcend-io/privacy-types';\nimport {\n makeGraphQLRequest,\n type AssessmentSection,\n type RetentionSchedule,\n type UserPreview,\n} from '@transcend-io/sdk';\nimport { GraphQLClient } from 'graphql-request';\n\nimport { logger } from '../../logger.js';\nimport { ASSESSMENT_TEMPLATES } from './gqls/index.js';\n\n/**\n * Represents an assessment template with various properties and metadata.\n */\nexport interface AssessmentTemplate {\n /** The ID of the assessment template */\n id: string;\n /** The user who created the assessment template */\n creator: UserPreview;\n /** The user who last edited the assessment template */\n lastEditor: UserPreview;\n /** The title of the assessment template */\n title: string;\n /** The description of the assessment template */\n description: string;\n /** The current status of the assessment template */\n status: AssessmentFormTemplateStatus;\n /** The source fo the form template */\n source: AssessmentFormTemplateSource;\n /** ID of parent template */\n parentId: string;\n /** Indicates if the assessment template is locked */\n isLocked: boolean;\n /** Indicates if the assessment template is archived */\n isArchived: boolean;\n /** The date when the assessment template was created */\n createdAt: string;\n /** The date when the assessment template was last updated */\n updatedAt: string;\n /** The retention schedule of the assessment template */\n retentionSchedule?: RetentionSchedule;\n /** The sections of the assessment template */\n sections: AssessmentSection[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all assessment templates in the organization\n *\n * @param client - GraphQL client\n * @returns All assessment templates in the organization\n */\nexport async function fetchAllAssessmentTemplates(\n client: GraphQLClient,\n): Promise<AssessmentTemplate[]> {\n const assessmentTemplates: AssessmentTemplate[] = [];\n let offset = 0;\n\n let shouldContinue = false;\n do {\n const {\n assessmentFormTemplates: { nodes },\n } = await makeGraphQLRequest<{\n /** Templates */\n assessmentFormTemplates: {\n /** Nodes */\n nodes: AssessmentTemplate[];\n };\n }>(client, ASSESSMENT_TEMPLATES, {\n variables: { first: PAGE_SIZE, offset },\n logger,\n });\n assessmentTemplates.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return assessmentTemplates.sort((a, b) => a.title.localeCompare(b.title));\n}\n","import { LocaleValue } from '@transcend-io/internationalization';\nimport {\n RequestAction,\n ConsentTrackerStatus,\n ActionItemCode,\n RetentionType,\n type ConsentThemeInput,\n type ConsentVariantInput,\n} from '@transcend-io/privacy-types';\nimport {\n fetchAllActionItemCollections,\n fetchAllActionItems,\n fetchAllActions,\n fetchAllAgentFiles,\n fetchAllAgentFunctions,\n fetchAllAgents,\n fetchAllAssessments,\n fetchAllAttributes,\n fetchAllBusinessEntities,\n fetchAllCookies,\n fetchAllDataCategories,\n fetchAllDataFlows,\n fetchAllPolicies,\n fetchAllPrivacyCenters,\n fetchAllProcessingPurposes,\n fetchAllSiloDiscoveryResults,\n fetchAllTemplates,\n fetchConsentManager,\n fetchConsentManagerExperiences,\n fetchConsentVariants,\n fetchConsentThemes,\n fetchConsentManagerTheme,\n fetchAllEnrichers,\n fetchAllIdentifiers,\n fetchAllMessages,\n fetchAllPromptGroups,\n fetchAllPromptPartials,\n fetchAllProcessingActivities,\n fetchAllPrompts,\n fetchAllPurposesAndPreferences,\n fetchPartitions,\n fetchAllTeams,\n fetchAllVendors,\n fetchApiKeys,\n formatAttributeValues,\n formatRegions,\n parseAssessmentDisplayLogic,\n parseAssessmentRiskLogic,\n convertToDataSubjectAllowlist,\n fetchAllDataSubjects,\n fetchEnrichedDataSilos,\n type AssessmentRule,\n} from '@transcend-io/sdk';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { flatten, keyBy, mapValues } from 'lodash-es';\n\n/* eslint-disable max-lines */\nimport {\n TranscendInput,\n ApiKeyInput,\n DataSiloInput,\n AttributeInput,\n ActionInput,\n IdentifierInput,\n BusinessEntityInput,\n EnricherInput,\n PromptGroupInput,\n DataFlowInput,\n PromptPartialInput,\n DataSubjectInput,\n CookieInput,\n PromptInput,\n DatapointInput,\n FieldInput,\n ProcessingPurposeInput,\n ProcessingActivityInput,\n DataCategoryInput,\n VendorInput,\n AgentFileInput,\n AgentFunctionInput,\n AgentInput,\n PolicyInput,\n IntlMessageInput,\n ActionItemInput,\n TeamInput,\n ActionItemCollectionInput,\n AssessmentInput,\n AssessmentTemplateInput,\n AssessmentSectionInput,\n AssessmentSectionQuestionInput,\n RiskLogicInput,\n ConsentPurpose,\n type SiloDiscoveryResultInput,\n} from '../../codecs.js';\nimport { TranscendPullResource } from '../../enums.js';\nimport { logger } from '../../logger.js';\nimport { fetchAllAssessmentTemplates } from './fetchAllAssessmentTemplates.js';\n\nexport const DEFAULT_TRANSCEND_PULL_RESOURCES = [\n TranscendPullResource.DataSilos,\n TranscendPullResource.Enrichers,\n TranscendPullResource.Templates,\n TranscendPullResource.ApiKeys,\n];\n\nexport interface TranscendPullConfigurationInput {\n /** Page size */\n pageSize: number;\n /** Enable debug logs */\n debug: boolean;\n /** The data silo IDs to sync. If empty list, pull all. */\n dataSiloIds: string[];\n /** Resources to pull in */\n resources?: TranscendPullResource[];\n /** The data silo types to sync.If empty list, pull all. */\n integrationNames: string[];\n /** The tracker statuses to pull */\n trackerStatuses?: ConsentTrackerStatus[];\n /** Skip fetching of datapoints */\n skipDatapoints?: boolean;\n /** Skip fetching of subdatapoints */\n skipSubDatapoints?: boolean;\n /** When true, metadata around guessed data categories should be included */\n includeGuessedCategories?: boolean;\n}\n\n/**\n * Pull a yaml configuration from Transcend\n *\n * @param client - GraphQL client\n * @param dataSiloIds - The data silos to sync. If empty list, pull all.\n * @returns The configuration\n */\nexport async function pullTranscendConfiguration(\n client: GraphQLClient,\n {\n dataSiloIds,\n integrationNames,\n debug,\n resources = DEFAULT_TRANSCEND_PULL_RESOURCES,\n pageSize,\n skipDatapoints,\n includeGuessedCategories,\n skipSubDatapoints,\n trackerStatuses = Object.values(ConsentTrackerStatus),\n }: TranscendPullConfigurationInput,\n): Promise<TranscendInput> {\n if (dataSiloIds.length > 0 && integrationNames.length > 0) {\n throw new Error('Only 1 of integrationNames OR dataSiloIds can be provided');\n }\n\n logger.info(colors.magenta(`Fetching data with page size ${pageSize}...`));\n\n // Fetch all data, but only conditional fetch data that is requested\n const [\n dataSubjects,\n apiKeyTitleMap,\n dataSilos,\n enrichers,\n dataFlows,\n cookies,\n attributes,\n templates,\n identifiers,\n actions,\n businessEntities,\n processingActivities,\n consentManager,\n consentManagerExperiences,\n consentVariants,\n consentThemes,\n prompts,\n promptPartials,\n promptGroups,\n agents,\n agentFunctions,\n agentFiles,\n vendors,\n dataCategories,\n processingPurposes,\n actionItems,\n actionItemCollections,\n teams,\n policies,\n privacyCenters,\n messages,\n partitions,\n assessments,\n assessmentTemplates,\n purposes,\n siloDiscoveryResults,\n ] = await Promise.all([\n // Grab all data subjects in the organization\n resources.includes(TranscendPullResource.DataSilos) ||\n resources.includes(TranscendPullResource.DataSubjects)\n ? fetchAllDataSubjects(client, { logger })\n : [],\n // Grab API keys\n resources.includes(TranscendPullResource.ApiKeys)\n ? fetchApiKeys(client, { fetchAll: true, logger })\n : [],\n // Fetch the data silos\n resources.includes(TranscendPullResource.DataSilos)\n ? fetchEnrichedDataSilos(client, {\n ids: dataSiloIds,\n integrationNames,\n pageSize,\n debug,\n includeGuessedCategories,\n skipDatapoints,\n skipSubDatapoints,\n logger,\n })\n : [],\n // Fetch enrichers\n resources.includes(TranscendPullResource.Enrichers)\n ? fetchAllEnrichers(client, { logger })\n : [],\n // Fetch data flows\n resources.includes(TranscendPullResource.DataFlows)\n ? [\n ...(trackerStatuses.includes(ConsentTrackerStatus.Live)\n ? await fetchAllDataFlows(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.Live },\n })\n : []),\n ...(trackerStatuses.includes(ConsentTrackerStatus.NeedsReview)\n ? await fetchAllDataFlows(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.NeedsReview },\n })\n : []),\n ]\n : [],\n // Fetch data flows\n resources.includes(TranscendPullResource.Cookies)\n ? [\n ...(trackerStatuses.includes(ConsentTrackerStatus.Live)\n ? await fetchAllCookies(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.Live },\n })\n : []),\n ...(trackerStatuses.includes(ConsentTrackerStatus.NeedsReview)\n ? await fetchAllCookies(client, {\n logger,\n filterBy: { status: ConsentTrackerStatus.NeedsReview },\n })\n : []),\n ]\n : [],\n // Fetch attributes\n resources.includes(TranscendPullResource.Attributes)\n ? fetchAllAttributes(client, { logger })\n : [],\n // Fetch email templates\n resources.includes(TranscendPullResource.Templates)\n ? fetchAllTemplates(client, { logger })\n : [],\n // Fetch identifiers\n resources.includes(TranscendPullResource.Identifiers)\n ? fetchAllIdentifiers(client, { logger })\n : [],\n // Fetch actions\n resources.includes(TranscendPullResource.Actions) ? fetchAllActions(client, { logger }) : [],\n // Fetch business entities\n resources.includes(TranscendPullResource.BusinessEntities)\n ? fetchAllBusinessEntities(client, { logger })\n : [],\n // Fetch processing activities\n resources.includes(TranscendPullResource.ProcessingActivities)\n ? fetchAllProcessingActivities(client, { logger })\n : [],\n // Fetch consent manager\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentManager(client, { logger })\n : undefined,\n // Fetch consent manager experiences\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentManagerExperiences(client, { logger })\n : [],\n // Fetch consent manager consent variants\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentVariants(client, { logger })\n : [],\n // Fetch consent manager consent themes\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentThemes(client, { logger })\n : [],\n // Fetch prompts\n resources.includes(TranscendPullResource.Prompts) ? fetchAllPrompts(client, { logger }) : [],\n // Fetch promptPartials\n resources.includes(TranscendPullResource.PromptPartials)\n ? fetchAllPromptPartials(client, { logger })\n : [],\n // Fetch promptGroups\n resources.includes(TranscendPullResource.PromptGroups)\n ? fetchAllPromptGroups(client, { logger })\n : [],\n // Fetch agents\n resources.includes(TranscendPullResource.Agents) ? fetchAllAgents(client, { logger }) : [],\n // Fetch agentFunctions\n resources.includes(TranscendPullResource.AgentFunctions)\n ? fetchAllAgentFunctions(client, { logger })\n : [],\n // Fetch agentFiles\n resources.includes(TranscendPullResource.AgentFiles)\n ? fetchAllAgentFiles(client, { logger })\n : [],\n // Fetch vendors\n resources.includes(TranscendPullResource.Vendors) ? fetchAllVendors(client, { logger }) : [],\n // Fetch dataCategories\n resources.includes(TranscendPullResource.DataCategories)\n ? fetchAllDataCategories(client, { logger })\n : [],\n // Fetch dataCategories\n resources.includes(TranscendPullResource.ProcessingPurposes)\n ? fetchAllProcessingPurposes(client, { logger })\n : [],\n // Fetch actionItems\n resources.includes(TranscendPullResource.ActionItems)\n ? fetchAllActionItems(client, {\n logger,\n filterBy: { type: [ActionItemCode.Onboarding] },\n })\n : [],\n // Fetch actionItemCollections\n resources.includes(TranscendPullResource.ActionItemCollections)\n ? fetchAllActionItemCollections(client, { logger })\n : [],\n // Fetch teams\n resources.includes(TranscendPullResource.Teams) ? fetchAllTeams(client, { logger }) : [],\n // Fetch policies\n resources.includes(TranscendPullResource.Policies) ? fetchAllPolicies(client, { logger }) : [],\n // Fetch privacy centers\n resources.includes(TranscendPullResource.PrivacyCenters)\n ? fetchAllPrivacyCenters(client, { logger })\n : [],\n // Fetch messages\n resources.includes(TranscendPullResource.Messages) ? fetchAllMessages(client, { logger }) : [],\n // Fetch partitions\n resources.includes(TranscendPullResource.Partitions) ? fetchPartitions(client, { logger }) : [],\n // Fetch assessments\n resources.includes(TranscendPullResource.Assessments)\n ? fetchAllAssessments(client, { logger })\n : [],\n // Fetch assessmentTemplates\n resources.includes(TranscendPullResource.AssessmentTemplates)\n ? fetchAllAssessmentTemplates(client)\n : [],\n // Fetch purpose and preferences\n resources.includes(TranscendPullResource.Purposes)\n ? fetchAllPurposesAndPreferences(client, { logger })\n : [],\n // Fetch silo discovery results\n resources.includes(TranscendPullResource.SystemDiscovery)\n ? fetchAllSiloDiscoveryResults(client, { logger })\n : [],\n ]);\n\n const consentManagerTheme =\n resources.includes(TranscendPullResource.ConsentManager) && consentManager\n ? await fetchConsentManagerTheme(client, {\n logger,\n filterBy: { airgapBundleId: consentManager.id },\n })\n : undefined;\n\n const result: TranscendInput = {};\n\n // Save API keys\n const apiKeyTitles = flatten(dataSilos.map(([{ apiKeys }]) => apiKeys.map(({ title }) => title)));\n const relevantApiKeys = Object.values(apiKeyTitleMap).filter(({ title }) =>\n resources.includes(TranscendPullResource.ApiKeys) ? true : apiKeyTitles.includes(title),\n );\n if (relevantApiKeys.length > 0 && resources.includes(TranscendPullResource.ApiKeys)) {\n result['api-keys'] = relevantApiKeys.map(\n ({ title }): ApiKeyInput => ({\n title,\n }),\n );\n }\n\n // Save Partitions\n if (partitions.length > 0 && resources.includes(TranscendPullResource.Partitions)) {\n result.partitions = partitions.map(({ name, partition }) => ({\n name,\n partition,\n }));\n }\n\n // Save Consent Manager\n if (consentManager && resources.includes(TranscendPullResource.ConsentManager)) {\n result['consent-manager'] = {\n bundleUrls: {\n TEST: consentManager.testBundleURL,\n PRODUCTION: consentManager.bundleURL,\n },\n domains: consentManager.configuration.domains || undefined,\n partition: consentManager.configuration.partition || undefined,\n consentPrecedence: consentManager.configuration.consentPrecedence || undefined,\n unknownRequestPolicy: consentManager.configuration.unknownRequestPolicy || undefined,\n unknownCookiePolicy: consentManager.configuration.unknownCookiePolicy || undefined,\n syncEndpoint: consentManager.configuration.syncEndpoint || undefined,\n telemetryPartitioning: consentManager.configuration.telemetryPartitioning || undefined,\n signedIabAgreement: consentManager.configuration.signedIabAgreement || undefined,\n // TODO: https://transcend.height.app/T-23919 - reconsider simpler yml shape\n syncGroups: consentManager.configuration.syncGroups || undefined,\n theme: !consentManagerTheme\n ? undefined\n : {\n primaryColor: consentManagerTheme.primaryColor || undefined,\n fontColor: consentManagerTheme.fontColor || undefined,\n privacyPolicy: consentManagerTheme.privacyPolicy || undefined,\n prompt: consentManagerTheme.prompt,\n },\n experiences: consentManagerExperiences.map((experience) => ({\n name: experience.name,\n displayName: experience.displayName || undefined,\n regions: experience.regions.map((region) => ({\n countrySubDivision: region.countrySubDivision || undefined,\n country: region.country || undefined,\n })),\n onConsentExpiry: experience.onConsentExpiry,\n consentExpiry: experience.consentExpiry,\n operator: experience.operator,\n displayPriority: experience.displayPriority,\n viewState: experience.viewState,\n purposes: experience.purposes.map((purpose) => ({\n trackingType: purpose.trackingType,\n })),\n optedOutPurposes: experience.optedOutPurposes.map((purpose) => ({\n trackingType: purpose.trackingType,\n })),\n browserLanguages: experience.browserLanguages,\n browserTimeZones: experience.browserTimeZones,\n consentUiVariantSlug: experience.consentUiVariant?.slug,\n })),\n consentVariants: consentVariants.map(\n (variant): ConsentVariantInput => ({\n id: variant.id,\n name: variant.name,\n slug: variant.slug,\n description: variant.description,\n configuration: JSON.stringify(variant.configuration),\n locales: variant.locales as LocaleValue[],\n status: variant.status,\n userFlow: variant.userFlow,\n themeSlug: variant.theme?.slug,\n }),\n ),\n consentThemes: consentThemes.map(\n (theme): ConsentThemeInput => ({\n id: theme.id,\n name: theme.name,\n slug: theme.slug,\n configuration: JSON.stringify(theme.configuration),\n }),\n ),\n };\n }\n\n // Save assessments\n if (assessments.length > 0 && resources.includes(TranscendPullResource.Assessments)) {\n result.assessments = assessments.map(\n ({\n title,\n assessmentGroup,\n sections,\n creator,\n description,\n status,\n assignees,\n externalAssignees,\n reviewers,\n isLocked,\n isArchived,\n isExternallyCreated,\n dueDate,\n createdAt,\n assignedAt,\n submittedAt,\n approvedAt,\n rejectedAt,\n titleIsInternal,\n retentionSchedule,\n attributeValues,\n resources,\n syncedRows,\n }): AssessmentInput => ({\n title,\n group: assessmentGroup.title,\n sections: sections.map(\n ({\n title,\n status,\n questions,\n assignees,\n isReviewed,\n externalAssignees,\n }): AssessmentSectionInput => ({\n title,\n status,\n questions: questions.map(\n ({\n title,\n type,\n subType,\n placeholder,\n description,\n isRequired,\n referenceId,\n displayLogic,\n riskLogic,\n riskCategories,\n riskFramework,\n answerOptions,\n selectedAnswers,\n allowedMimeTypes,\n allowSelectOther,\n syncModel,\n syncColumn,\n attributeKey,\n requireRiskEvaluation,\n requireRiskMatrixEvaluation,\n }): AssessmentSectionQuestionInput => {\n const displayLogicParsed = displayLogic\n ? parseAssessmentDisplayLogic(displayLogic)\n : undefined;\n return {\n title,\n type,\n 'sub-type': subType,\n placeholder,\n description,\n 'is-required': isRequired,\n 'reference-id': referenceId,\n 'display-logic':\n displayLogicParsed && Object.keys(displayLogicParsed).length > 0\n ? {\n action: displayLogicParsed.action!,\n rule: displayLogicParsed.rule\n ? {\n 'depends-on-question-reference-id':\n displayLogicParsed.rule.dependsOnQuestionReferenceId,\n 'comparison-operator': displayLogicParsed.rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property with a check\n 'comparisonOperands' in displayLogicParsed.rule\n ? displayLogicParsed.rule.comparisonOperands\n : undefined,\n }\n : undefined,\n 'nested-rule': displayLogicParsed.nestedRule\n ? {\n 'logic-operator': displayLogicParsed.nestedRule.logicOperator,\n rules: (displayLogicParsed.nestedRule.rules || []).map(\n (rule: AssessmentRule) => ({\n 'depends-on-question-reference-id':\n rule.dependsOnQuestionReferenceId,\n 'comparison-operator': rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property on the nested rule\n 'comparisonOperands' in rule\n ? rule.comparisonOperands\n : undefined,\n }),\n ),\n }\n : undefined,\n }\n : undefined,\n 'risk-logic': riskLogic.map((logic): RiskLogicInput => {\n const parsed = parseAssessmentRiskLogic(logic);\n return {\n 'risk-level': parsed.riskAssignment?.riskLevelId,\n 'comparison-operands': parsed.comparisonOperands,\n 'comparison-operator': parsed.comparisonOperator,\n };\n }),\n 'risk-categories': riskCategories.map(({ title }) => title),\n 'risk-framework': riskFramework?.title,\n 'answer-options': answerOptions.map(({ value }) => ({\n value,\n })),\n 'selected-answers': selectedAnswers.map(({ value }) => value),\n 'allowed-mime-types': allowedMimeTypes,\n 'allow-select-other': allowSelectOther,\n 'sync-model': syncModel || undefined,\n 'sync-column': syncColumn || undefined,\n 'attribute-key': attributeKey?.name,\n 'require-risk-evaluation': requireRiskEvaluation,\n 'require-risk-matrix-evaluation': requireRiskMatrixEvaluation,\n };\n },\n ),\n assignees: assignees.map(({ email }) => email),\n 'external-assignees': externalAssignees.map(({ email }) => email),\n 'is-reviewed': isReviewed,\n }),\n ),\n creator: creator?.email,\n description,\n status,\n assignees: assignees.map(({ email }) => email),\n 'external-assignees': externalAssignees.map(({ email }) => email),\n reviewers: reviewers.map(({ email }) => email),\n locked: isLocked,\n archived: isArchived,\n external: isExternallyCreated,\n 'title-is-internal': titleIsInternal,\n 'due-date': dueDate || undefined,\n 'created-at': createdAt || undefined,\n 'assigned-at': assignedAt || undefined,\n 'submitted-at': submittedAt || undefined,\n 'approved-at': approvedAt || undefined,\n 'rejected-at': rejectedAt || undefined,\n 'retention-schedule': retentionSchedule\n ? {\n type: retentionSchedule.type,\n 'duration-days': retentionSchedule.durationDays,\n operand: retentionSchedule.operation,\n }\n : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n resources: resources.map(({ resourceType, title, name, category, type, purpose }) => ({\n type: resourceType,\n title: category\n ? `${category} - ${name}`\n : purpose\n ? `${purpose} - ${name}`\n : title || name || type || '',\n })),\n rows: syncedRows.map(({ resourceType, title, name, category, type, purpose }) => ({\n type: resourceType,\n title: category\n ? `${category} - ${name}`\n : purpose\n ? `${purpose} - ${name}`\n : title || name || type || '',\n })),\n }),\n );\n }\n\n // Save assessmentTemplates\n if (\n assessmentTemplates.length > 0 &&\n resources.includes(TranscendPullResource.AssessmentTemplates)\n ) {\n result['assessment-templates'] = assessmentTemplates.map(\n ({\n title,\n description,\n sections,\n status,\n source,\n creator,\n isLocked,\n isArchived,\n createdAt,\n retentionSchedule,\n }): AssessmentTemplateInput => ({\n title,\n description,\n sections: sections.map(\n ({ title, questions }): AssessmentSectionInput => ({\n title,\n questions: questions.map(\n ({\n title,\n type,\n subType,\n placeholder,\n description,\n isRequired,\n referenceId,\n displayLogic,\n riskLogic,\n riskCategories,\n riskFramework,\n answerOptions,\n allowedMimeTypes,\n allowSelectOther,\n syncModel,\n syncColumn,\n attributeKey,\n requireRiskEvaluation,\n requireRiskMatrixEvaluation,\n }): AssessmentSectionQuestionInput => {\n const displayLogicParsed = displayLogic\n ? parseAssessmentDisplayLogic(displayLogic)\n : undefined;\n return {\n title,\n type,\n 'sub-type': subType,\n placeholder,\n description,\n 'is-required': isRequired,\n 'reference-id': referenceId,\n 'display-logic':\n displayLogicParsed && Object.keys(displayLogicParsed).length > 0\n ? {\n action: displayLogicParsed.action!,\n rule: displayLogicParsed.rule\n ? {\n 'depends-on-question-reference-id':\n displayLogicParsed.rule.dependsOnQuestionReferenceId,\n 'comparison-operator': displayLogicParsed.rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property with a check\n 'comparisonOperands' in displayLogicParsed.rule\n ? displayLogicParsed.rule.comparisonOperands\n : undefined,\n }\n : undefined,\n 'nested-rule': displayLogicParsed.nestedRule\n ? {\n 'logic-operator': displayLogicParsed.nestedRule.logicOperator,\n rules: (displayLogicParsed.nestedRule.rules || []).map(\n (rule: AssessmentRule) => ({\n 'depends-on-question-reference-id':\n rule.dependsOnQuestionReferenceId,\n 'comparison-operator': rule.comparisonOperator,\n 'comparison-operands':\n // Safely access property on the nested rule\n 'comparisonOperands' in rule\n ? rule.comparisonOperands\n : undefined,\n }),\n ),\n }\n : undefined,\n }\n : undefined,\n 'risk-logic': riskLogic.map((logic): RiskLogicInput => {\n const parsed = parseAssessmentRiskLogic(logic);\n return {\n 'risk-level': parsed.riskAssignment?.riskLevelId,\n 'risk-matrix-row': parsed.riskAssignment?.riskMatrixRowId,\n 'risk-matrix-column': parsed.riskAssignment?.riskMatrixColumnId,\n 'comparison-operands': parsed.comparisonOperands,\n 'comparison-operator': parsed.comparisonOperator,\n };\n }),\n 'risk-categories': riskCategories.map(({ title }) => title),\n 'risk-framework': riskFramework?.title,\n 'answer-options': answerOptions.map(({ value }) => ({\n value,\n })),\n 'allowed-mime-types': allowedMimeTypes,\n 'allow-select-other': allowSelectOther,\n 'sync-model': syncModel || undefined,\n 'sync-column': syncColumn || undefined,\n 'attribute-key': attributeKey?.name,\n 'require-risk-evaluation': requireRiskEvaluation,\n 'require-risk-matrix-evaluation': requireRiskMatrixEvaluation,\n };\n },\n ),\n }),\n ),\n status,\n source,\n creator: creator?.email,\n locked: isLocked,\n archived: isArchived,\n 'created-at': createdAt || undefined,\n 'retention-schedule': retentionSchedule\n ? {\n type: retentionSchedule.type,\n 'duration-days': retentionSchedule.durationDays,\n operand: retentionSchedule.operation,\n }\n : undefined,\n }),\n );\n }\n\n // Save Silo Discovery Results\n if (\n siloDiscoveryResults.length > 0 &&\n resources.includes(TranscendPullResource.SystemDiscovery)\n ) {\n result['system-discovery'] = siloDiscoveryResults.map(\n ({\n title,\n resourceId,\n suggestedCatalog: { title: suggestedCatalogTitle },\n plugin: {\n dataSilo: { title: dataSiloTitle },\n },\n country,\n countrySubDivision,\n plaintextContext,\n containsSensitiveData,\n status,\n }): SiloDiscoveryResultInput => ({\n title,\n resourceId,\n suggestedCatalog: suggestedCatalogTitle,\n plugin: dataSiloTitle,\n country: country || undefined,\n countrySubDivision: countrySubDivision || undefined,\n plaintextContext,\n containsSensitiveData,\n status,\n }),\n );\n }\n\n // Save prompts\n if (prompts.length > 0 && resources.includes(TranscendPullResource.Prompts)) {\n result.prompts = prompts.map(\n ({ title, content }): PromptInput => ({\n title,\n content,\n }),\n );\n }\n\n // Save promptPartials\n if (promptPartials.length > 0 && resources.includes(TranscendPullResource.PromptPartials)) {\n result['prompt-partials'] = promptPartials.map(\n ({ title, content }): PromptPartialInput => ({\n title,\n content,\n }),\n );\n }\n\n // Save promptGroups\n if (promptGroups.length > 0 && resources.includes(TranscendPullResource.PromptGroups)) {\n result['prompt-groups'] = promptGroups.map(\n ({ title, description, prompts }): PromptGroupInput => ({\n title,\n description,\n prompts: prompts.map(({ title }) => title),\n }),\n );\n }\n\n // Save teams\n if (teams.length > 0 && resources.includes(TranscendPullResource.Teams)) {\n result.teams = teams.map(\n ({\n name,\n description,\n ssoDepartment,\n ssoGroup,\n ssoTitle,\n users,\n scopes,\n parentTeam,\n }): TeamInput => ({\n name,\n description,\n 'sso-department': ssoDepartment || undefined,\n 'sso-group': ssoGroup || undefined,\n 'sso-title': ssoTitle || undefined,\n 'parent-team-name': parentTeam?.name,\n users: users.map(({ email }) => email),\n scopes: scopes.map(({ name }) => name),\n }),\n );\n }\n\n // Save Data Subjects\n if (dataSubjects.length > 0 && resources.includes(TranscendPullResource.DataSubjects)) {\n result['data-subjects'] = dataSubjects.map(\n ({ type, title, active, adminDashboardDefaultSilentMode, actions }): DataSubjectInput => ({\n type,\n title: title?.defaultMessage,\n active,\n adminDashboardDefaultSilentMode,\n actions: actions.map(({ type }) => type),\n }),\n );\n }\n\n // Save privacy policies\n if (policies.length > 0) {\n result.policies = policies.map(\n ({ title, versions, disabledLocales }): PolicyInput => ({\n title: title?.defaultMessage,\n content: versions?.[0]?.content?.defaultMessage,\n disabledLocales,\n }),\n );\n }\n\n // Save messages\n if (messages.length > 0) {\n result.messages = messages.map(\n ({ id, defaultMessage, targetReactIntlId, description, translations }): IntlMessageInput => ({\n id,\n defaultMessage,\n description,\n targetReactIntlId: targetReactIntlId || undefined,\n translations: translations.reduce(\n (acc, { locale, value }) => Object.assign(acc, { [locale]: value }),\n {} as Record<LocaleValue, string>,\n ),\n }),\n );\n }\n\n // Save privacy center\n if (privacyCenters.length > 0) {\n const privacyCenter = privacyCenters[0];\n result['privacy-center'] = {\n isDisabled: privacyCenter.isDisabled,\n showPrivacyRequestButton: privacyCenter.showPrivacyRequestButton,\n showPolicies: privacyCenter.showPolicies,\n showTrackingTechnologies: privacyCenter.showTrackingTechnologies,\n showCookies: privacyCenter.showCookies,\n showDataFlows: privacyCenter.showDataFlows,\n showConsentManager: privacyCenter.showConsentManager,\n showManageYourPrivacy: privacyCenter.showManageYourPrivacy,\n showMarketingPreferences: privacyCenter.showMarketingPreferences,\n locales: privacyCenter.locales,\n defaultLocale: privacyCenter.defaultLocale,\n preferBrowserDefaultLocale: privacyCenter.preferBrowserDefaultLocale,\n supportEmail: privacyCenter.supportEmail || undefined,\n replyToEmail: privacyCenter.replyToEmail || undefined,\n useNoReplyEmailAddress: privacyCenter.useNoReplyEmailAddress,\n useCustomEmailDomain: privacyCenter.useCustomEmailDomain,\n transformAccessReportJsonToCsv: privacyCenter.transformAccessReportJsonToCsv,\n theme: privacyCenter.theme,\n };\n }\n\n // Save business entities\n if (businessEntities.length > 0 && resources.includes(TranscendPullResource.BusinessEntities)) {\n result['business-entities'] = businessEntities.map(\n ({\n title,\n description,\n address,\n headquarterCountry,\n headquarterSubDivision,\n dataProtectionOfficerName,\n dataProtectionOfficerEmail,\n attributeValues,\n }): BusinessEntityInput => ({\n title,\n description: description || undefined,\n address: address || undefined,\n headquarterCountry: headquarterCountry || undefined,\n headquarterSubDivision: headquarterSubDivision || undefined,\n dataProtectionOfficerName: dataProtectionOfficerName || undefined,\n dataProtectionOfficerEmail: dataProtectionOfficerEmail || undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save processing activities\n if (\n processingActivities.length > 0 &&\n resources.includes(TranscendPullResource.ProcessingActivities)\n ) {\n result['processing-activities'] = processingActivities.map(\n ({\n title,\n description,\n securityMeasureDetails,\n controllerships,\n storageRegions,\n transferRegions,\n retentionType,\n retentionPeriod,\n dataProtectionImpactAssessmentLink,\n dataProtectionImpactAssessmentStatus,\n attributeValues,\n dataSilos,\n dataSubjects,\n teams,\n owners,\n processingPurposeSubCategories,\n dataSubCategories,\n saaSCategories,\n }): ProcessingActivityInput => ({\n title,\n description,\n securityMeasureDetails: securityMeasureDetails ?? undefined,\n controllerships: controllerships.length > 0 ? controllerships : undefined,\n storageRegions: storageRegions.length > 0 ? formatRegions(storageRegions) : undefined,\n transferRegions: transferRegions.length > 0 ? formatRegions(transferRegions) : undefined,\n retentionType,\n retentionPeriod: retentionType === RetentionType.StatedPeriod ? retentionPeriod : undefined,\n dataProtectionImpactAssessmentLink: dataProtectionImpactAssessmentLink ?? undefined,\n dataProtectionImpactAssessmentStatus,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n dataSiloTitles: dataSilos.length > 0 ? dataSilos.map(({ title }) => title) : undefined,\n dataSubjectTypes:\n dataSubjects.length > 0 ? dataSubjects.map(({ type }) => type) : undefined,\n teamNames: teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n ownerEmails: owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n processingSubPurposes:\n processingPurposeSubCategories.length > 0\n ? processingPurposeSubCategories.map(({ name, purpose }) => ({\n purpose,\n ...(name ? { name } : {}),\n }))\n : undefined,\n dataSubCategories:\n dataSubCategories.length > 0\n ? dataSubCategories.map(({ name, category }) => ({\n category,\n ...(name ? { name } : {}),\n }))\n : undefined,\n saaSCategories:\n saaSCategories.length > 0 ? saaSCategories.map(({ title }) => title) : undefined,\n }),\n );\n }\n\n // Save Actions\n if (actions.length > 0 && resources.includes(TranscendPullResource.Actions)) {\n result.actions = actions.map(\n ({\n type,\n skipSecondaryIfNoFiles,\n skipDownloadableStep,\n requiresReview,\n regionList,\n regionDetectionMethod,\n waitingPeriod,\n }): ActionInput => ({\n type,\n ...(type === RequestAction.Erasure\n ? {\n skipSecondaryIfNoFiles,\n skipDownloadableStep,\n }\n : {}),\n requiresReview,\n waitingPeriod,\n regionDetectionMethod,\n regionList: regionList.length > 0 ? regionList : undefined,\n }),\n );\n }\n\n // Save identifiers\n if (identifiers.length > 0 && resources.includes(TranscendPullResource.Identifiers)) {\n result.identifiers = identifiers.map(\n ({\n name,\n type,\n regex,\n selectOptions,\n privacyCenterVisibility,\n isRequiredInForm,\n placeholder,\n displayTitle,\n dataSubjects,\n displayDescription,\n displayOrder,\n isUniqueOnPreferenceStore,\n }): IdentifierInput => ({\n name,\n type,\n regex,\n selectOptions: selectOptions.length > 0 ? selectOptions : undefined,\n privacyCenterVisibility:\n privacyCenterVisibility.length > 0 ? privacyCenterVisibility : undefined,\n isRequiredInForm,\n placeholder: placeholder || undefined,\n dataSubjects: dataSubjects.length > 0 ? dataSubjects.map(({ type }) => type) : undefined,\n displayTitle: displayTitle?.defaultMessage,\n displayDescription: displayDescription?.defaultMessage,\n displayOrder,\n isUniqueOnPreferenceStore,\n }),\n );\n }\n\n // Save agents\n if (agents.length > 0 && resources.includes(TranscendPullResource.Agents)) {\n result.agents = agents.map(\n ({\n name,\n agentId,\n description,\n instructions,\n codeInterpreterEnabled,\n retrievalEnabled,\n prompt,\n largeLanguageModel,\n teams,\n owners,\n agentFunctions,\n agentFiles,\n }): AgentInput => ({\n name,\n agentId,\n description: description || undefined,\n instructions,\n codeInterpreterEnabled,\n retrievalEnabled,\n prompt: prompt?.title,\n 'large-language-model': {\n name: largeLanguageModel.name,\n client: largeLanguageModel.client,\n },\n teams: teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n owners: owners && owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n 'agent-functions':\n agentFunctions && agentFunctions.length > 0\n ? agentFunctions.map(({ name }) => name)\n : undefined,\n 'agent-files':\n agentFiles && agentFiles.length > 0 ? agentFiles.map(({ name }) => name) : undefined,\n }),\n );\n }\n\n // Save action items\n if (actionItems.length > 0 && resources.includes(TranscendPullResource.ActionItems)) {\n result['action-items'] = actionItems.map(\n ({\n teams,\n users,\n customerExperienceActionItemIds: [customerExperienceActionItemId],\n dueDate,\n priority,\n resolved,\n collections,\n notes,\n link,\n title,\n type,\n attributeValues,\n }): ActionItemInput => ({\n teams: teams.map(({ name }) => name),\n users: users.map(({ email }) => email),\n dueDate: dueDate || undefined,\n title,\n notes,\n customerExperienceActionItemId,\n collections: collections.map(({ title }) => title),\n link,\n priority: priority || undefined,\n resolved,\n type,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save action item collections\n if (\n actionItemCollections.length > 0 &&\n resources.includes(TranscendPullResource.ActionItemCollections)\n ) {\n result['action-item-collections'] = actionItemCollections.map(\n ({ title, description, hidden, productLine }): ActionItemCollectionInput => ({\n title,\n description: description || undefined,\n hidden,\n productLine,\n }),\n );\n }\n\n // Save agent functions\n if (agentFunctions.length > 0 && resources.includes(TranscendPullResource.AgentFunctions)) {\n result['agent-functions'] = agentFunctions.map(\n ({ name, description, parameters }): AgentFunctionInput => ({\n name,\n description,\n parameters: JSON.stringify(parameters),\n }),\n );\n }\n\n // Save agent files\n if (agentFiles.length > 0 && resources.includes(TranscendPullResource.AgentFiles)) {\n result['agent-files'] = agentFiles.map(\n ({ name, description, fileId, size, purpose }): AgentFileInput => ({\n name,\n description,\n fileId,\n size,\n purpose,\n }),\n );\n }\n\n // Save vendors\n if (vendors.length > 0 && resources.includes(TranscendPullResource.Vendors)) {\n result.vendors = vendors.map(\n ({\n title,\n description,\n dataProcessingAgreementLink,\n contactName,\n contactPhone,\n address,\n headquarterCountry,\n headquarterSubDivision,\n websiteUrl,\n businessEntity,\n teams,\n owners,\n attributeValues,\n }): VendorInput => ({\n title,\n description: description || undefined,\n dataProcessingAgreementLink: dataProcessingAgreementLink || undefined,\n contactName: contactName || undefined,\n contactPhone: contactPhone || undefined,\n address: address || undefined,\n headquarterCountry: headquarterCountry || undefined,\n headquarterSubDivision: headquarterSubDivision || undefined,\n websiteUrl: websiteUrl || undefined,\n businessEntity: businessEntity?.title,\n teams: teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n owners: owners && owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save data categories\n if (dataCategories.length > 0 && resources.includes(TranscendPullResource.DataCategories)) {\n result['data-categories'] = dataCategories.map(\n ({\n name,\n category,\n description,\n regex,\n owners,\n teams,\n attributeValues,\n }): DataCategoryInput => ({\n name,\n category,\n description: description || undefined,\n regex: regex || undefined,\n owners: owners && owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n teams: teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save processing purposes\n if (\n processingPurposes.length > 0 &&\n resources.includes(TranscendPullResource.ProcessingPurposes)\n ) {\n result['processing-purposes'] = processingPurposes.map(\n ({ name, purpose, description, owners, teams, attributeValues }): ProcessingPurposeInput => ({\n name,\n purpose,\n description: description || undefined,\n owners: owners && owners.length > 0 ? owners.map(({ email }) => email) : undefined,\n teams: teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save data flows\n if (dataFlows.length > 0 && resources.includes(TranscendPullResource.DataFlows)) {\n result['data-flows'] = dataFlows.map(\n ({\n value,\n type,\n description,\n trackingType,\n service,\n status,\n owners,\n teams,\n attributeValues,\n }): DataFlowInput => ({\n value,\n type,\n description: description || undefined,\n trackingPurposes: trackingType,\n status,\n service: service?.integrationName,\n owners: owners.map(({ email }) => email),\n teams: teams.map(({ name }) => name),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save cookies\n if (cookies.length > 0 && resources.includes(TranscendPullResource.Cookies)) {\n result.cookies = cookies.map(\n ({\n name,\n isRegex,\n description,\n trackingPurposes,\n service,\n status,\n owners,\n teams,\n attributeValues,\n }): CookieInput => ({\n name,\n isRegex,\n description: description || undefined,\n trackingPurposes,\n status,\n service: service?.integrationName,\n owners: owners.map(({ email }) => email),\n teams: teams.map(({ name }) => name),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save attributes\n if (attributes.length > 0 && resources.includes(TranscendPullResource.Attributes)) {\n result.attributes = attributes.map(\n ({ description, name, type, values, enabledOn = [] }): AttributeInput => ({\n description: description || undefined,\n resources: enabledOn,\n name,\n type,\n values: values.map(({ name, color, description }) => ({\n name,\n color: color || undefined,\n description,\n })),\n }),\n );\n }\n\n // save purposes\n if (purposes.length > 0) {\n result.purposes = purposes.map(\n ({\n name,\n description,\n trackingType,\n defaultConsent,\n configurable,\n showInConsentManager,\n isActive,\n displayOrder,\n optOutSignals,\n authLevel,\n topics,\n showInPrivacyCenter,\n title,\n }): ConsentPurpose => ({\n name,\n title,\n description: description || undefined,\n trackingType,\n 'default-consent': defaultConsent,\n configurable,\n 'show-in-consent-manager': showInConsentManager,\n 'show-in-privacy-center': showInPrivacyCenter,\n 'is-active': isActive,\n 'display-order': displayOrder,\n 'opt-out-signals': optOutSignals.length > 0 ? optOutSignals : undefined,\n 'auth-level': authLevel || undefined,\n 'preference-topics': topics.map(\n ({\n title,\n type,\n displayDescription,\n defaultConfiguration,\n showInPrivacyCenter,\n preferenceOptionValues,\n }) => ({\n title: title.defaultMessage,\n type,\n description: displayDescription.defaultMessage,\n 'default-configuration': defaultConfiguration,\n 'show-in-privacy-center': showInPrivacyCenter,\n ...(preferenceOptionValues.length > 0\n ? {\n options: preferenceOptionValues.map(({ title, slug }) => ({\n title: title.defaultMessage,\n slug,\n })),\n }\n : {}),\n }),\n ),\n }),\n );\n }\n\n // save email templates\n if (\n dataSiloIds.length === 0 &&\n templates.length > 0 &&\n resources.includes(TranscendPullResource.Templates)\n ) {\n result.templates = templates.map(({ title }) => ({ title }));\n }\n\n // Save enrichers\n if (enrichers.length > 0 && resources.includes(TranscendPullResource.Enrichers)) {\n result.enrichers = enrichers.map(\n ({\n title,\n url,\n type,\n inputIdentifier,\n identifiers,\n actions,\n testRegex,\n dataSubjects,\n expirationDuration,\n lookerQueryTitle,\n transitionRequestStatus,\n phoneNumbers,\n regionList,\n }): EnricherInput => ({\n title,\n url: url || undefined,\n type,\n 'input-identifier': inputIdentifier?.name,\n 'output-identifiers': identifiers.map(({ name }) => name),\n 'privacy-actions':\n Object.values(RequestAction).length === actions.length ? undefined : actions,\n testRegex: testRegex || undefined,\n lookerQueryTitle: lookerQueryTitle || undefined,\n expirationDuration: parseInt(expirationDuration, 10),\n transitionRequestStatus: transitionRequestStatus || undefined,\n phoneNumbers: phoneNumbers && phoneNumbers.length > 0 ? phoneNumbers : undefined,\n regionList: regionList && regionList.length > 0 ? regionList : undefined,\n 'data-subjects': dataSubjects.map(({ type }) => type),\n }),\n );\n }\n\n // Save data silos\n if (dataSilos.length > 0 && resources.includes(TranscendPullResource.DataSilos)) {\n const indexedDataSubjects = keyBy(dataSubjects, 'type');\n result['data-silos'] = dataSilos.map(\n ([\n {\n title,\n description,\n url,\n type,\n outerType,\n apiKeys,\n notifyEmailAddress,\n identifiers,\n dependentDataSilos,\n owners,\n country,\n countrySubDivision,\n teams,\n subjectBlocklist,\n isLive,\n promptAVendorEmailSendFrequency,\n promptAVendorEmailSendType,\n promptAVendorEmailIncludeIdentifiersAttachment,\n promptAVendorEmailCompletionLinkType,\n manualWorkRetryFrequency,\n catalog,\n attributeValues,\n discoveredBy,\n businessEntities,\n },\n dataPoints,\n ]): DataSiloInput => ({\n title,\n description,\n integrationName: type,\n 'outer-type': outerType || undefined,\n url: url || undefined,\n 'api-key-title': apiKeys[0]?.title,\n 'identity-keys': identifiers\n .filter(({ isConnected }) => isConnected)\n .map(({ name }) => name),\n ...(dependentDataSilos.length > 0\n ? {\n 'deletion-dependencies': dependentDataSilos.map(({ title }) => title),\n }\n : {}),\n ...(owners.length > 0 ? { owners: owners.map(({ email }) => email) } : {}),\n ...(teams.length > 0 ? { teams: teams.map(({ name }) => name) } : {}),\n ...(discoveredBy.length > 0\n ? { discoveredBy: discoveredBy.map(({ title }) => title) }\n : {}),\n ...(businessEntities.length > 0\n ? {\n businessEntities: businessEntities.map(({ title }) => title),\n }\n : {}),\n country: country || undefined,\n countrySubDivision: countrySubDivision || undefined,\n disabled: !isLive,\n 'data-subjects':\n subjectBlocklist.length > 0\n ? convertToDataSubjectAllowlist(\n subjectBlocklist.map(({ type }) => type),\n indexedDataSubjects,\n )\n : undefined,\n ...(catalog.hasAvcFunctionality\n ? {\n 'email-settings': {\n 'notify-email-address': notifyEmailAddress || undefined,\n 'send-frequency': promptAVendorEmailSendFrequency,\n 'send-type': promptAVendorEmailSendType,\n 'include-identifiers-attachment': promptAVendorEmailIncludeIdentifiersAttachment,\n 'completion-link-type': promptAVendorEmailCompletionLinkType,\n 'manual-work-retry-frequency': manualWorkRetryFrequency,\n },\n }\n : {}),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n\n datapoints: dataPoints\n .map(\n (dataPoint): DatapointInput => ({\n key: dataPoint.name,\n title: dataPoint.title?.defaultMessage,\n description: dataPoint.description?.defaultMessage,\n owners: dataPoint.owners.map(({ email }) => email),\n teams: dataPoint.teams.map(({ name }) => name),\n ...(dataPoint.path.length > 0 ? { path: dataPoint.path } : {}),\n ...(dataPoint.dataCollection?.title\n ? {\n 'data-collection-tag': dataPoint.dataCollection.title.defaultMessage,\n }\n : {}),\n ...(dataPoint.dbIntegrationQueries.length > 0\n ? {\n 'privacy-action-queries': mapValues(\n keyBy(dataPoint.dbIntegrationQueries, 'requestType'),\n (databaseIntegrationQuery) =>\n databaseIntegrationQuery.suggestedQuery ||\n databaseIntegrationQuery.query ||\n undefined,\n ),\n }\n : {}),\n ...(dataPoint.subDataPoints.length > 0\n ? {\n fields: dataPoint.subDataPoints\n .map(\n (field): FieldInput => ({\n key: field.name,\n description: field.description,\n purposes: field.purposes,\n categories: field.categories,\n ...(includeGuessedCategories && field.pendingCategoryGuesses\n ? {\n 'guessed-categories': field.pendingCategoryGuesses\n .filter((guess) => guess.status === 'PENDING')\n .map((guess) => ({\n category: {\n name: guess.category.name,\n category: guess.category.category,\n },\n status: guess.status,\n confidence: guess.confidence,\n classifierVersion: guess.classifierVersion || undefined,\n })),\n }\n : {}),\n 'access-request-visibility-enabled': field.accessRequestVisibilityEnabled,\n 'erasure-request-redaction-enabled': field.erasureRequestRedactionEnabled,\n attributes:\n field.attributeValues !== undefined && field.attributeValues.length > 0\n ? formatAttributeValues(field.attributeValues)\n : undefined,\n }),\n )\n .sort((a, b) => a.key.localeCompare(b.key)),\n }\n : {}),\n 'privacy-actions': dataPoint.actionSettings\n .filter(({ active }) => active)\n .map(({ type }) => type),\n }),\n )\n .sort((a, b) =>\n [...(a.path ?? []), a.key]\n .join('.')\n .localeCompare([...(b.path ?? []), b.key].join('.')),\n ),\n }),\n );\n }\n return result;\n}\n/* eslint-enable max-lines */\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import{t as e}from"./logger-Bj782ZYD.mjs";import{sortBy as t}from"lodash-es";import n from"colors";import{makeGraphQLRequest as r}from"@transcend-io/sdk";import i from"cli-progress";import{gql as a}from"graphql-request";const o=a`
1
+ import{t as e}from"./logger-B-LXIf3U.mjs";import{sortBy as t}from"lodash-es";import n from"colors";import{makeGraphQLRequest as r}from"@transcend-io/sdk";import i from"cli-progress";import{gql as a}from"graphql-request";const o=a`
2
2
  query TranscendCliEntryCount($filterBy: UnstructuredSubDataPointRecommendationsFilterInput) {
3
3
  unstructuredSubDataPointRecommendations(filterBy: $filterBy, useMaster: false) {
4
4
  totalCount
@@ -35,4 +35,4 @@ import{t as e}from"./logger-Bj782ZYD.mjs";import{sortBy as t}from"lodash-es";imp
35
35
  }
36
36
  }
37
37
  `,{variables:{first:f,offset:x,filterBy:{...g}},logger:e});b=t[t.length-1]?.id,p.push(...t),y=t.length===f,v+=t.length,x+=t.length,h.update(v)}catch(t){throw e.error(n.red(`An error fetching subdatapoints for cursor ${b} and offset ${x}`)),t}while(y);h.stop();let S=new Date().getTime()-m,C=t(p,`name`);return e.info(n.green(`Successfully pulled in ${C.length} subdatapoints in ${S/1e3} seconds!`)),C}export{o as n,s as t};
38
- //# sourceMappingURL=pullUnstructuredSubDataPointRecommendations-D0z-vPgq.mjs.map
38
+ //# sourceMappingURL=pullUnstructuredSubDataPointRecommendations-C8VuWR7j.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pullUnstructuredSubDataPointRecommendations-D0z-vPgq.mjs","names":[],"sources":["../src/lib/graphql/gqls/entry.ts","../src/lib/data-inventory/pullUnstructuredSubDataPointRecommendations.ts"],"sourcesContent":["import { gql } from 'graphql-request';\n\nexport const ENTRY_COUNT = gql`\n query TranscendCliEntryCount($filterBy: UnstructuredSubDataPointRecommendationsFilterInput) {\n unstructuredSubDataPointRecommendations(filterBy: $filterBy, useMaster: false) {\n totalCount\n }\n }\n`;\n","import type { UnstructuredSubDataPointRecommendationStatus } from '@transcend-io/privacy-types';\nimport { makeGraphQLRequest } from '@transcend-io/sdk';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\nimport { gql, type GraphQLClient } from 'graphql-request';\nimport { sortBy } from 'lodash-es';\n\nimport type { DataCategoryInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { ENTRY_COUNT } from '../graphql/index.js';\n\ninterface UnstructuredSubDataPointRecommendationCsvPreview {\n /** ID of subDatapoint */\n id: string;\n /** Entry or Named Entity recognized by the classifier */\n name: string;\n /** Context snippet including entry */\n contextSnippet: string;\n /** Scanned object ID */\n scannedObjectId: string;\n /** Scanned object path ID */\n scannedObjectPathId: string;\n /** The data silo ID */\n dataSiloId: string;\n /** Personal data category */\n dataSubCategory: DataCategoryInput;\n /** Classification Status */\n status: UnstructuredSubDataPointRecommendationStatus;\n /** Confidence */\n confidence: number;\n /** Classification method */\n classificationMethod: string;\n /** Classifier version */\n classifierVersion: string;\n}\n\ninterface EntryFilterOptions {\n /** IDs of data silos to filter down */\n dataSiloIds?: string[];\n /** Parent categories to filter down for */\n status?: UnstructuredSubDataPointRecommendationStatus[];\n /** Sub categories to filter down for */\n subCategories?: string[]; // TODO: https://transcend.height.app/T-40482 - do by name not ID\n /** Include entry and snippet */\n includeEncryptedSnippets?: boolean;\n /** Include encryptedSamplesS3Key */\n includeEncryptedSamplesS3Key?: boolean;\n}\n/**\n * Pull unstructured subdatapoint information\n *\n * @param client - Client to use for the request\n * @param options - Options\n * @param options.dataSiloIds - IDs of data silos to filter down\n * @param options.status - Parent categories to filter down for\n * @param options.subCategories - Sub categories to filter down for\n * @param options.includeEncryptedSnippets - Include entry and snippet\n * @param options.includeEncryptedSamplesS3Key - Include encryptedSamplesS3Key\n * @param options.pageSize - Page size to pull in\n * @returns A promise that resolves to an array of unstructured subdatapoint recommendations\n */\nexport async function pullUnstructuredSubDataPointRecommendations(\n client: GraphQLClient,\n {\n dataSiloIds = [],\n status,\n subCategories = [],\n includeEncryptedSnippets,\n pageSize = 100,\n }: EntryFilterOptions & {\n /** Page size to pull in */\n pageSize?: number;\n } = {},\n): Promise<UnstructuredSubDataPointRecommendationCsvPreview[]> {\n const unstructuredSubDataPointRecommendations: UnstructuredSubDataPointRecommendationCsvPreview[] =\n [];\n\n // Time duration\n const t0 = new Date().getTime();\n\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Filters\n const filterBy = {\n ...(subCategories.length > 0 ? { subCategoryIds: subCategories } : {}),\n ...(status ? { status } : {}),\n ...(dataSiloIds.length > 0 ? { dataSilos: dataSiloIds } : {}),\n };\n\n // Build a GraphQL client\n const {\n unstructuredSubDataPointRecommendations: { totalCount },\n } = await makeGraphQLRequest<{\n /** Query response */\n unstructuredSubDataPointRecommendations: {\n /** Count */\n totalCount: number;\n };\n }>(client, ENTRY_COUNT, {\n variables: { filterBy },\n logger,\n });\n\n logger.info(colors.magenta('[Step 1/3] Pulling in all subdatapoints'));\n\n progressBar.start(totalCount, 0);\n let total = 0;\n let shouldContinue = false;\n let cursor: string | undefined;\n let offset = 0;\n do {\n try {\n const {\n unstructuredSubDataPointRecommendations: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n unstructuredSubDataPointRecommendations: {\n /** List of matches */\n nodes: UnstructuredSubDataPointRecommendationCsvPreview[];\n };\n }>(\n client,\n gql`\n query TranscendCliUnstructuredSubDataPointRecommendationCsvExport(\n $filterBy: UnstructuredSubDataPointRecommendationsFilterInput\n $first: Int!\n $offset: Int!\n ) {\n unstructuredSubDataPointRecommendations(\n filterBy: $filterBy\n first: $first\n offset: $offset\n useMaster: false\n ) {\n nodes {\n id\n dataSiloId\n scannedObjectPathId\n scannedObjectId\n ${includeEncryptedSnippets ? 'name' : ''}\n ${includeEncryptedSnippets ? 'contextSnippet' : ''}\n dataSubCategory {\n name\n category\n }\n status\n confidence\n classificationMethod\n classifierVersion\n }\n }\n }\n `,\n {\n variables: {\n first: pageSize,\n offset,\n filterBy: {\n ...filterBy,\n },\n },\n logger,\n },\n );\n\n cursor = nodes[nodes.length - 1]?.id as string;\n unstructuredSubDataPointRecommendations.push(...nodes);\n shouldContinue = nodes.length === pageSize;\n total += nodes.length;\n offset += nodes.length;\n progressBar.update(total);\n } catch (err) {\n logger.error(\n colors.red(`An error fetching subdatapoints for cursor ${cursor} and offset ${offset}`),\n );\n throw err;\n }\n } while (shouldContinue);\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n const sorted = sortBy(unstructuredSubDataPointRecommendations, 'name');\n\n logger.info(\n colors.green(\n `Successfully pulled in ${sorted.length} subdatapoints in ${totalTime / 1000} seconds!`,\n ),\n );\n return sorted;\n}\n"],"mappings":"4NAEA,MAAa,EAAc,CAAG;;;;;;EC2D9B,eAAsB,EACpB,EACA,CACE,cAAc,EAAE,CAChB,SACA,gBAAgB,EAAE,CAClB,2BACA,WAAW,KAIT,EAAE,CACuD,CAC7D,IAAM,EACJ,EAAE,CAGE,EAAK,IAAI,MAAM,CAAC,SAAS,CAGzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAG/E,EAAW,CACf,GAAI,EAAc,OAAS,EAAI,CAAE,eAAgB,EAAe,CAAG,EAAE,CACrE,GAAI,EAAS,CAAE,SAAQ,CAAG,EAAE,CAC5B,GAAI,EAAY,OAAS,EAAI,CAAE,UAAW,EAAa,CAAG,EAAE,CAC7D,CAGK,CACJ,wCAAyC,CAAE,eACzC,MAAM,EAMP,EAAQ,EAAa,CACtB,UAAW,CAAE,WAAU,CACvB,SACD,CAAC,CAEF,EAAO,KAAK,EAAO,QAAQ,0CAA0C,CAAC,CAEtE,EAAY,MAAM,EAAY,EAAE,CAChC,IAAI,EAAQ,EACR,EAAiB,GACjB,EACA,EAAS,EACb,EACE,IAAI,CACF,GAAM,CACJ,wCAAyC,CAAE,UACzC,MAAM,EAOR,EACA,CAAG;;;;;;;;;;;;;;;;;kBAiBO,EAA2B,OAAS,GAAG;kBACvC,EAA2B,iBAAmB,GAAG;;;;;;;;;;;;UAa3D,CACE,UAAW,CACT,MAAO,EACP,SACA,SAAU,CACR,GAAG,EACJ,CACF,CACD,SACD,CACF,CAED,EAAS,EAAM,EAAM,OAAS,IAAI,GAClC,EAAwC,KAAK,GAAG,EAAM,CACtD,EAAiB,EAAM,SAAW,EAClC,GAAS,EAAM,OACf,GAAU,EAAM,OAChB,EAAY,OAAO,EAAM,OAClB,EAAK,CAIZ,MAHA,EAAO,MACL,EAAO,IAAI,8CAA8C,EAAO,cAAc,IAAS,CACxF,CACK,QAED,GAET,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAEjB,EAAS,EAAO,EAAyC,OAAO,CAOtE,OALA,EAAO,KACL,EAAO,MACL,0BAA0B,EAAO,OAAO,oBAAoB,EAAY,IAAK,WAC9E,CACF,CACM"}
1
+ {"version":3,"file":"pullUnstructuredSubDataPointRecommendations-C8VuWR7j.mjs","names":[],"sources":["../src/lib/graphql/gqls/entry.ts","../src/lib/data-inventory/pullUnstructuredSubDataPointRecommendations.ts"],"sourcesContent":["import { gql } from 'graphql-request';\n\nexport const ENTRY_COUNT = gql`\n query TranscendCliEntryCount($filterBy: UnstructuredSubDataPointRecommendationsFilterInput) {\n unstructuredSubDataPointRecommendations(filterBy: $filterBy, useMaster: false) {\n totalCount\n }\n }\n`;\n","import type { UnstructuredSubDataPointRecommendationStatus } from '@transcend-io/privacy-types';\nimport { makeGraphQLRequest } from '@transcend-io/sdk';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\nimport { gql, type GraphQLClient } from 'graphql-request';\nimport { sortBy } from 'lodash-es';\n\nimport type { DataCategoryInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { ENTRY_COUNT } from '../graphql/index.js';\n\ninterface UnstructuredSubDataPointRecommendationCsvPreview {\n /** ID of subDatapoint */\n id: string;\n /** Entry or Named Entity recognized by the classifier */\n name: string;\n /** Context snippet including entry */\n contextSnippet: string;\n /** Scanned object ID */\n scannedObjectId: string;\n /** Scanned object path ID */\n scannedObjectPathId: string;\n /** The data silo ID */\n dataSiloId: string;\n /** Personal data category */\n dataSubCategory: DataCategoryInput;\n /** Classification Status */\n status: UnstructuredSubDataPointRecommendationStatus;\n /** Confidence */\n confidence: number;\n /** Classification method */\n classificationMethod: string;\n /** Classifier version */\n classifierVersion: string;\n}\n\ninterface EntryFilterOptions {\n /** IDs of data silos to filter down */\n dataSiloIds?: string[];\n /** Parent categories to filter down for */\n status?: UnstructuredSubDataPointRecommendationStatus[];\n /** Sub categories to filter down for */\n subCategories?: string[]; // TODO: https://transcend.height.app/T-40482 - do by name not ID\n /** Include entry and snippet */\n includeEncryptedSnippets?: boolean;\n /** Include encryptedSamplesS3Key */\n includeEncryptedSamplesS3Key?: boolean;\n}\n/**\n * Pull unstructured subdatapoint information\n *\n * @param client - Client to use for the request\n * @param options - Options\n * @param options.dataSiloIds - IDs of data silos to filter down\n * @param options.status - Parent categories to filter down for\n * @param options.subCategories - Sub categories to filter down for\n * @param options.includeEncryptedSnippets - Include entry and snippet\n * @param options.includeEncryptedSamplesS3Key - Include encryptedSamplesS3Key\n * @param options.pageSize - Page size to pull in\n * @returns A promise that resolves to an array of unstructured subdatapoint recommendations\n */\nexport async function pullUnstructuredSubDataPointRecommendations(\n client: GraphQLClient,\n {\n dataSiloIds = [],\n status,\n subCategories = [],\n includeEncryptedSnippets,\n pageSize = 100,\n }: EntryFilterOptions & {\n /** Page size to pull in */\n pageSize?: number;\n } = {},\n): Promise<UnstructuredSubDataPointRecommendationCsvPreview[]> {\n const unstructuredSubDataPointRecommendations: UnstructuredSubDataPointRecommendationCsvPreview[] =\n [];\n\n // Time duration\n const t0 = new Date().getTime();\n\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Filters\n const filterBy = {\n ...(subCategories.length > 0 ? { subCategoryIds: subCategories } : {}),\n ...(status ? { status } : {}),\n ...(dataSiloIds.length > 0 ? { dataSilos: dataSiloIds } : {}),\n };\n\n // Build a GraphQL client\n const {\n unstructuredSubDataPointRecommendations: { totalCount },\n } = await makeGraphQLRequest<{\n /** Query response */\n unstructuredSubDataPointRecommendations: {\n /** Count */\n totalCount: number;\n };\n }>(client, ENTRY_COUNT, {\n variables: { filterBy },\n logger,\n });\n\n logger.info(colors.magenta('[Step 1/3] Pulling in all subdatapoints'));\n\n progressBar.start(totalCount, 0);\n let total = 0;\n let shouldContinue = false;\n let cursor: string | undefined;\n let offset = 0;\n do {\n try {\n const {\n unstructuredSubDataPointRecommendations: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n unstructuredSubDataPointRecommendations: {\n /** List of matches */\n nodes: UnstructuredSubDataPointRecommendationCsvPreview[];\n };\n }>(\n client,\n gql`\n query TranscendCliUnstructuredSubDataPointRecommendationCsvExport(\n $filterBy: UnstructuredSubDataPointRecommendationsFilterInput\n $first: Int!\n $offset: Int!\n ) {\n unstructuredSubDataPointRecommendations(\n filterBy: $filterBy\n first: $first\n offset: $offset\n useMaster: false\n ) {\n nodes {\n id\n dataSiloId\n scannedObjectPathId\n scannedObjectId\n ${includeEncryptedSnippets ? 'name' : ''}\n ${includeEncryptedSnippets ? 'contextSnippet' : ''}\n dataSubCategory {\n name\n category\n }\n status\n confidence\n classificationMethod\n classifierVersion\n }\n }\n }\n `,\n {\n variables: {\n first: pageSize,\n offset,\n filterBy: {\n ...filterBy,\n },\n },\n logger,\n },\n );\n\n cursor = nodes[nodes.length - 1]?.id as string;\n unstructuredSubDataPointRecommendations.push(...nodes);\n shouldContinue = nodes.length === pageSize;\n total += nodes.length;\n offset += nodes.length;\n progressBar.update(total);\n } catch (err) {\n logger.error(\n colors.red(`An error fetching subdatapoints for cursor ${cursor} and offset ${offset}`),\n );\n throw err;\n }\n } while (shouldContinue);\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n const sorted = sortBy(unstructuredSubDataPointRecommendations, 'name');\n\n logger.info(\n colors.green(\n `Successfully pulled in ${sorted.length} subdatapoints in ${totalTime / 1000} seconds!`,\n ),\n );\n return sorted;\n}\n"],"mappings":"4NAEA,MAAa,EAAc,CAAG;;;;;;EC2D9B,eAAsB,EACpB,EACA,CACE,cAAc,EAAE,CAChB,SACA,gBAAgB,EAAE,CAClB,2BACA,WAAW,KAIT,EAAE,CACuD,CAC7D,IAAM,EACJ,EAAE,CAGE,EAAK,IAAI,MAAM,CAAC,SAAS,CAGzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAG/E,EAAW,CACf,GAAI,EAAc,OAAS,EAAI,CAAE,eAAgB,EAAe,CAAG,EAAE,CACrE,GAAI,EAAS,CAAE,SAAQ,CAAG,EAAE,CAC5B,GAAI,EAAY,OAAS,EAAI,CAAE,UAAW,EAAa,CAAG,EAAE,CAC7D,CAGK,CACJ,wCAAyC,CAAE,eACzC,MAAM,EAMP,EAAQ,EAAa,CACtB,UAAW,CAAE,WAAU,CACvB,SACD,CAAC,CAEF,EAAO,KAAK,EAAO,QAAQ,0CAA0C,CAAC,CAEtE,EAAY,MAAM,EAAY,EAAE,CAChC,IAAI,EAAQ,EACR,EAAiB,GACjB,EACA,EAAS,EACb,EACE,IAAI,CACF,GAAM,CACJ,wCAAyC,CAAE,UACzC,MAAM,EAOR,EACA,CAAG;;;;;;;;;;;;;;;;;kBAiBO,EAA2B,OAAS,GAAG;kBACvC,EAA2B,iBAAmB,GAAG;;;;;;;;;;;;UAa3D,CACE,UAAW,CACT,MAAO,EACP,SACA,SAAU,CACR,GAAG,EACJ,CACF,CACD,SACD,CACF,CAED,EAAS,EAAM,EAAM,OAAS,IAAI,GAClC,EAAwC,KAAK,GAAG,EAAM,CACtD,EAAiB,EAAM,SAAW,EAClC,GAAS,EAAM,OACf,GAAU,EAAM,OAChB,EAAY,OAAO,EAAM,OAClB,EAAK,CAIZ,MAHA,EAAO,MACL,EAAO,IAAI,8CAA8C,EAAO,cAAc,IAAS,CACxF,CACK,QAED,GAET,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAEjB,EAAS,EAAO,EAAyC,OAAO,CAOtE,OALA,EAAO,KACL,EAAO,MACL,0BAA0B,EAAO,OAAO,oBAAoB,EAAY,IAAK,WAC9E,CACF,CACM"}
@@ -1,2 +1,2 @@
1
- import{a as e}from"./constants-9AglpfjZ.mjs";import{t}from"./logger-Bj782ZYD.mjs";import{t as n}from"./readCsv-C4TyEs-r.mjs";import{chunk as r}from"lodash-es";import i from"colors";import*as a from"io-ts";import{createSombraGotInstance as o}from"@transcend-io/sdk";import{map as s,mapSeries as c}from"@transcend-io/utils";import l from"cli-progress";const u=a.type({nonce:a.string,identifier:a.string});async function d(e,{nonce:t,identifier:n}){try{return await e.put(`v1/data-silo`,{headers:{"x-transcend-nonce":t},json:{profiles:[{profileId:n}]}}),!0}catch(e){if(e.response?.statusCode===409)return!1;throw Error(`Received an error from server: ${e?.response?.body||e?.message}`)}}async function f({file:a,dataSiloId:f,auth:p,sombraAuth:m,concurrency:h=100,transcendUrl:g=e,sleepSeconds:_=10}){let v=await o(g,p,{logger:t,sombraApiKey:m,sombraUrl:process.env.SOMBRA_URL});t.info(i.magenta(`Reading "${a}" from disk`));let y=n(a,u);t.info(i.magenta(`Notifying Transcend for data silo "${f}" marking "${y.length}" identifiers as completed.`));let b=new Date().getTime(),x=new l.SingleBar({},l.Presets.shades_classic),S=0,C=0,w=0;x.start(y.length,0);let T=r(y,h),E=T.length;await c(T,async(e,n)=>{t.info(i.blue(`Processing chunk ${n+1}/${E} (${r.length} items)`)),await s(e,async e=>{try{await d(v,e)?S+=1:C+=1}catch(n){t.error(i.red(`Error notifying Transcend for identifier "${e.identifier}" - ${n?.message}`)),w+=1}x.update(S+C)}),_>0&&n<E-1&&(t.info(i.yellow(`Sleeping for ${_}s before next chunk...`)),await new Promise(e=>{setTimeout(e,_*1e3)}))}),x.stop();let D=new Date().getTime()-b;if(t.info(i.green(`Successfully notified Transcend for ${S} identifiers in "${D/1e3}" seconds!`)),C&&t.info(i.magenta(`There were ${C} identifiers that were not in a state to be updated.They likely have already been resolved.`)),w)throw t.error(i.red(`There were ${w} identifiers that failed to be updated. Please review the logs for more information.`)),Error(`Failed to update all identifiers`);return y.length}export{u as n,d as r,f as t};
2
- //# sourceMappingURL=pushCronIdentifiersFromCsv-CE3_S3pT.mjs.map
1
+ import{a as e}from"./constants-FP8lxFg5.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{t as n}from"./readCsv-C-5HBa7w.mjs";import{chunk as r}from"lodash-es";import i from"colors";import*as a from"io-ts";import{createSombraGotInstance as o}from"@transcend-io/sdk";import{map as s,mapSeries as c}from"@transcend-io/utils";import l from"cli-progress";const u=a.type({nonce:a.string,identifier:a.string});async function d(e,{nonce:t,identifier:n}){try{return await e.put(`v1/data-silo`,{headers:{"x-transcend-nonce":t},json:{profiles:[{profileId:n}]}}),!0}catch(e){if(e.response?.statusCode===409)return!1;throw Error(`Received an error from server: ${e?.response?.body||e?.message}`)}}async function f({file:a,dataSiloId:f,auth:p,sombraAuth:m,concurrency:h=100,transcendUrl:g=e,sleepSeconds:_=10}){let v=await o(g,p,{logger:t,sombraApiKey:m,sombraUrl:process.env.SOMBRA_URL});t.info(i.magenta(`Reading "${a}" from disk`));let y=n(a,u);t.info(i.magenta(`Notifying Transcend for data silo "${f}" marking "${y.length}" identifiers as completed.`));let b=new Date().getTime(),x=new l.SingleBar({},l.Presets.shades_classic),S=0,C=0,w=0;x.start(y.length,0);let T=r(y,h),E=T.length;await c(T,async(e,n)=>{t.info(i.blue(`Processing chunk ${n+1}/${E} (${r.length} items)`)),await s(e,async e=>{try{await d(v,e)?S+=1:C+=1}catch(n){t.error(i.red(`Error notifying Transcend for identifier "${e.identifier}" - ${n?.message}`)),w+=1}x.update(S+C)}),_>0&&n<E-1&&(t.info(i.yellow(`Sleeping for ${_}s before next chunk...`)),await new Promise(e=>{setTimeout(e,_*1e3)}))}),x.stop();let D=new Date().getTime()-b;if(t.info(i.green(`Successfully notified Transcend for ${S} identifiers in "${D/1e3}" seconds!`)),C&&t.info(i.magenta(`There were ${C} identifiers that were not in a state to be updated.They likely have already been resolved.`)),w)throw t.error(i.red(`There were ${w} identifiers that failed to be updated. Please review the logs for more information.`)),Error(`Failed to update all identifiers`);return y.length}export{u as n,d as r,f as t};
2
+ //# sourceMappingURL=pushCronIdentifiersFromCsv-DqOtCwY5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pushCronIdentifiersFromCsv-CE3_S3pT.mjs","names":[],"sources":["../src/lib/cron/markCronIdentifierCompleted.ts","../src/lib/cron/pushCronIdentifiersFromCsv.ts"],"sourcesContent":["import type { Got } from 'got';\nimport * as t from 'io-ts';\n\n/**\n * Minimal set required to mark as completed\n */\nexport const CronIdentifierPush = t.type({\n nonce: t.string,\n identifier: t.string,\n});\n\n/** Type override */\nexport type CronIdentifierPush = t.TypeOf<typeof CronIdentifierPush>;\n\n/**\n * Mark an identifier output by the cron job as completed.\n *\n * @see https://docs.transcend.io/docs/api-reference/PUT/v1/data-silo\n * @param sombra - Sombra instance configured to make requests\n * @param options - Additional options\n * @returns Successfully submitted request, false if not in a state to update\n */\nexport async function markCronIdentifierCompleted(\n sombra: Got,\n { nonce, identifier }: CronIdentifierPush,\n): Promise<boolean> {\n try {\n // Make the GraphQL request\n await sombra.put('v1/data-silo', {\n headers: {\n 'x-transcend-nonce': nonce,\n },\n json: {\n profiles: [\n {\n profileId: identifier,\n },\n ],\n },\n });\n return true;\n } catch (err) {\n // handle gracefully\n if (err.response?.statusCode === 409) {\n return false;\n }\n throw new Error(`Received an error from server: ${err?.response?.body || err?.message}`);\n }\n}\n","import { createSombraGotInstance } from '@transcend-io/sdk';\nimport { map, mapSeries } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\nimport { chunk } from 'lodash-es';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { readCsv } from '../requests/index.js';\nimport { markCronIdentifierCompleted, CronIdentifierPush } from './markCronIdentifierCompleted.js';\n\n/**\n * Given a CSV of cron job outputs, mark all requests as completed in Transcend\n *\n * @param options - Options\n * @returns Number of items marked as completed\n */\nexport async function pushCronIdentifiersFromCsv({\n file,\n dataSiloId,\n auth,\n sombraAuth,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n sleepSeconds = 10,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** Data Silo ID to pull down jobs for */\n dataSiloId: string;\n /** Upload concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** Sleep time in seconds between chunks of concurrent calls */\n sleepSeconds?: number;\n}): Promise<number> {\n // Create sombra instance to communicate with\n const sombra = await createSombraGotInstance(transcendUrl, auth, {\n logger,\n sombraApiKey: sombraAuth,\n sombraUrl: process.env.SOMBRA_URL,\n });\n\n // Read from CSV\n logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const activeResults = readCsv(file, CronIdentifierPush);\n\n // Notify Transcend\n logger.info(\n colors.magenta(\n `Notifying Transcend for data silo \"${dataSiloId}\" marking \"${activeResults.length}\" identifiers as completed.`,\n ),\n );\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n let successCount = 0;\n let failureCount = 0;\n let errorCount = 0;\n progressBar.start(activeResults.length, 0);\n\n // Process in chunks with sleep intervals\n const chunks = chunk(activeResults, concurrency);\n const totalChunks = chunks.length;\n const processChunk = async (items: CronIdentifierPush[], chunkIndex: number): Promise<void> => {\n logger.info(\n colors.blue(`Processing chunk ${chunkIndex + 1}/${totalChunks} (${chunk.length} items)`),\n );\n\n // Process the items of the chunk concurrently\n await map(items, async (identifier) => {\n try {\n const success = await markCronIdentifierCompleted(sombra, identifier);\n if (success) {\n successCount += 1;\n } else {\n failureCount += 1;\n }\n } catch (e) {\n logger.error(\n colors.red(\n `Error notifying Transcend for identifier \"${identifier.identifier}\" - ${e?.message}`,\n ),\n );\n errorCount += 1;\n }\n progressBar.update(successCount + failureCount);\n });\n\n // Sleep between chunks (except for the last chunk)\n if (sleepSeconds > 0 && chunkIndex < totalChunks - 1) {\n logger.info(colors.yellow(`Sleeping for ${sleepSeconds}s before next chunk...`));\n\n await new Promise((resolve) => {\n setTimeout(resolve, sleepSeconds * 1000);\n });\n }\n };\n\n // Process all chunks sequentially\n await mapSeries(chunks, processChunk);\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(\n colors.green(\n `Successfully notified Transcend for ${successCount} identifiers in \"${\n totalTime / 1000\n }\" seconds!`,\n ),\n );\n if (failureCount) {\n logger.info(\n colors.magenta(\n `There were ${failureCount} identifiers that were not in a state to be updated.` +\n 'They likely have already been resolved.',\n ),\n );\n }\n if (errorCount) {\n logger.error(\n colors.red(\n `There were ${errorCount} identifiers that failed to be updated. Please review the logs for more information.`,\n ),\n );\n throw new Error('Failed to update all identifiers');\n }\n return activeResults.length;\n}\n"],"mappings":"8VAMA,MAAa,EAAqB,EAAE,KAAK,CACvC,MAAO,EAAE,OACT,WAAY,EAAE,OACf,CAAC,CAaF,eAAsB,EACpB,EACA,CAAE,QAAO,cACS,CAClB,GAAI,CAcF,OAZA,MAAM,EAAO,IAAI,eAAgB,CAC/B,QAAS,CACP,oBAAqB,EACtB,CACD,KAAM,CACJ,SAAU,CACR,CACE,UAAW,EACZ,CACF,CACF,CACF,CAAC,CACK,SACA,EAAK,CAEZ,GAAI,EAAI,UAAU,aAAe,IAC/B,MAAO,GAET,MAAU,MAAM,kCAAkC,GAAK,UAAU,MAAQ,GAAK,UAAU,EC7B5F,eAAsB,EAA2B,CAC/C,OACA,aACA,OACA,aACA,cAAc,IACd,eAAe,EACf,eAAe,IAgBG,CAElB,IAAM,EAAS,MAAM,EAAwB,EAAc,EAAM,CAC/D,SACA,aAAc,EACd,UAAW,QAAQ,IAAI,WACxB,CAAC,CAGF,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAK,aAAa,CAAC,CAC1D,IAAM,EAAgB,EAAQ,EAAM,EAAmB,CAGvD,EAAO,KACL,EAAO,QACL,sCAAsC,EAAW,aAAa,EAAc,OAAO,6BACpF,CACF,CAGD,IAAM,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAEjF,EAAe,EACf,EAAe,EACf,EAAa,EACjB,EAAY,MAAM,EAAc,OAAQ,EAAE,CAG1C,IAAM,EAAS,EAAM,EAAe,EAAY,CAC1C,EAAc,EAAO,OAqC3B,MAAM,EAAU,EAAQ,MApCI,EAA6B,IAAsC,CAC7F,EAAO,KACL,EAAO,KAAK,oBAAoB,EAAa,EAAE,GAAG,EAAY,IAAI,EAAM,OAAO,SAAS,CACzF,CAGD,MAAM,EAAI,EAAO,KAAO,IAAe,CACrC,GAAI,CAEE,MADkB,EAA4B,EAAQ,EAAW,CAEnE,GAAgB,EAEhB,GAAgB,QAEX,EAAG,CACV,EAAO,MACL,EAAO,IACL,6CAA6C,EAAW,WAAW,MAAM,GAAG,UAC7E,CACF,CACD,GAAc,EAEhB,EAAY,OAAO,EAAe,EAAa,EAC/C,CAGE,EAAe,GAAK,EAAa,EAAc,IACjD,EAAO,KAAK,EAAO,OAAO,gBAAgB,EAAa,wBAAwB,CAAC,CAEhF,MAAM,IAAI,QAAS,GAAY,CAC7B,WAAW,EAAS,EAAe,IAAK,EACxC,GAK+B,CAErC,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAiBvB,GAfA,EAAO,KACL,EAAO,MACL,uCAAuC,EAAa,mBAClD,EAAY,IACb,YACF,CACF,CACG,GACF,EAAO,KACL,EAAO,QACL,cAAc,EAAa,6FAE5B,CACF,CAEC,EAMF,MALA,EAAO,MACL,EAAO,IACL,cAAc,EAAW,sFAC1B,CACF,CACS,MAAM,mCAAmC,CAErD,OAAO,EAAc"}
1
+ {"version":3,"file":"pushCronIdentifiersFromCsv-DqOtCwY5.mjs","names":[],"sources":["../src/lib/cron/markCronIdentifierCompleted.ts","../src/lib/cron/pushCronIdentifiersFromCsv.ts"],"sourcesContent":["import type { Got } from 'got';\nimport * as t from 'io-ts';\n\n/**\n * Minimal set required to mark as completed\n */\nexport const CronIdentifierPush = t.type({\n nonce: t.string,\n identifier: t.string,\n});\n\n/** Type override */\nexport type CronIdentifierPush = t.TypeOf<typeof CronIdentifierPush>;\n\n/**\n * Mark an identifier output by the cron job as completed.\n *\n * @see https://docs.transcend.io/docs/api-reference/PUT/v1/data-silo\n * @param sombra - Sombra instance configured to make requests\n * @param options - Additional options\n * @returns Successfully submitted request, false if not in a state to update\n */\nexport async function markCronIdentifierCompleted(\n sombra: Got,\n { nonce, identifier }: CronIdentifierPush,\n): Promise<boolean> {\n try {\n // Make the GraphQL request\n await sombra.put('v1/data-silo', {\n headers: {\n 'x-transcend-nonce': nonce,\n },\n json: {\n profiles: [\n {\n profileId: identifier,\n },\n ],\n },\n });\n return true;\n } catch (err) {\n // handle gracefully\n if (err.response?.statusCode === 409) {\n return false;\n }\n throw new Error(`Received an error from server: ${err?.response?.body || err?.message}`);\n }\n}\n","import { createSombraGotInstance } from '@transcend-io/sdk';\nimport { map, mapSeries } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\nimport { chunk } from 'lodash-es';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { readCsv } from '../requests/index.js';\nimport { markCronIdentifierCompleted, CronIdentifierPush } from './markCronIdentifierCompleted.js';\n\n/**\n * Given a CSV of cron job outputs, mark all requests as completed in Transcend\n *\n * @param options - Options\n * @returns Number of items marked as completed\n */\nexport async function pushCronIdentifiersFromCsv({\n file,\n dataSiloId,\n auth,\n sombraAuth,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n sleepSeconds = 10,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** Data Silo ID to pull down jobs for */\n dataSiloId: string;\n /** Upload concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** Sleep time in seconds between chunks of concurrent calls */\n sleepSeconds?: number;\n}): Promise<number> {\n // Create sombra instance to communicate with\n const sombra = await createSombraGotInstance(transcendUrl, auth, {\n logger,\n sombraApiKey: sombraAuth,\n sombraUrl: process.env.SOMBRA_URL,\n });\n\n // Read from CSV\n logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const activeResults = readCsv(file, CronIdentifierPush);\n\n // Notify Transcend\n logger.info(\n colors.magenta(\n `Notifying Transcend for data silo \"${dataSiloId}\" marking \"${activeResults.length}\" identifiers as completed.`,\n ),\n );\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n let successCount = 0;\n let failureCount = 0;\n let errorCount = 0;\n progressBar.start(activeResults.length, 0);\n\n // Process in chunks with sleep intervals\n const chunks = chunk(activeResults, concurrency);\n const totalChunks = chunks.length;\n const processChunk = async (items: CronIdentifierPush[], chunkIndex: number): Promise<void> => {\n logger.info(\n colors.blue(`Processing chunk ${chunkIndex + 1}/${totalChunks} (${chunk.length} items)`),\n );\n\n // Process the items of the chunk concurrently\n await map(items, async (identifier) => {\n try {\n const success = await markCronIdentifierCompleted(sombra, identifier);\n if (success) {\n successCount += 1;\n } else {\n failureCount += 1;\n }\n } catch (e) {\n logger.error(\n colors.red(\n `Error notifying Transcend for identifier \"${identifier.identifier}\" - ${e?.message}`,\n ),\n );\n errorCount += 1;\n }\n progressBar.update(successCount + failureCount);\n });\n\n // Sleep between chunks (except for the last chunk)\n if (sleepSeconds > 0 && chunkIndex < totalChunks - 1) {\n logger.info(colors.yellow(`Sleeping for ${sleepSeconds}s before next chunk...`));\n\n await new Promise((resolve) => {\n setTimeout(resolve, sleepSeconds * 1000);\n });\n }\n };\n\n // Process all chunks sequentially\n await mapSeries(chunks, processChunk);\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(\n colors.green(\n `Successfully notified Transcend for ${successCount} identifiers in \"${\n totalTime / 1000\n }\" seconds!`,\n ),\n );\n if (failureCount) {\n logger.info(\n colors.magenta(\n `There were ${failureCount} identifiers that were not in a state to be updated.` +\n 'They likely have already been resolved.',\n ),\n );\n }\n if (errorCount) {\n logger.error(\n colors.red(\n `There were ${errorCount} identifiers that failed to be updated. Please review the logs for more information.`,\n ),\n );\n throw new Error('Failed to update all identifiers');\n }\n return activeResults.length;\n}\n"],"mappings":"8VAMA,MAAa,EAAqB,EAAE,KAAK,CACvC,MAAO,EAAE,OACT,WAAY,EAAE,OACf,CAAC,CAaF,eAAsB,EACpB,EACA,CAAE,QAAO,cACS,CAClB,GAAI,CAcF,OAZA,MAAM,EAAO,IAAI,eAAgB,CAC/B,QAAS,CACP,oBAAqB,EACtB,CACD,KAAM,CACJ,SAAU,CACR,CACE,UAAW,EACZ,CACF,CACF,CACF,CAAC,CACK,SACA,EAAK,CAEZ,GAAI,EAAI,UAAU,aAAe,IAC/B,MAAO,GAET,MAAU,MAAM,kCAAkC,GAAK,UAAU,MAAQ,GAAK,UAAU,EC7B5F,eAAsB,EAA2B,CAC/C,OACA,aACA,OACA,aACA,cAAc,IACd,eAAe,EACf,eAAe,IAgBG,CAElB,IAAM,EAAS,MAAM,EAAwB,EAAc,EAAM,CAC/D,SACA,aAAc,EACd,UAAW,QAAQ,IAAI,WACxB,CAAC,CAGF,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAK,aAAa,CAAC,CAC1D,IAAM,EAAgB,EAAQ,EAAM,EAAmB,CAGvD,EAAO,KACL,EAAO,QACL,sCAAsC,EAAW,aAAa,EAAc,OAAO,6BACpF,CACF,CAGD,IAAM,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAEjF,EAAe,EACf,EAAe,EACf,EAAa,EACjB,EAAY,MAAM,EAAc,OAAQ,EAAE,CAG1C,IAAM,EAAS,EAAM,EAAe,EAAY,CAC1C,EAAc,EAAO,OAqC3B,MAAM,EAAU,EAAQ,MApCI,EAA6B,IAAsC,CAC7F,EAAO,KACL,EAAO,KAAK,oBAAoB,EAAa,EAAE,GAAG,EAAY,IAAI,EAAM,OAAO,SAAS,CACzF,CAGD,MAAM,EAAI,EAAO,KAAO,IAAe,CACrC,GAAI,CAEE,MADkB,EAA4B,EAAQ,EAAW,CAEnE,GAAgB,EAEhB,GAAgB,QAEX,EAAG,CACV,EAAO,MACL,EAAO,IACL,6CAA6C,EAAW,WAAW,MAAM,GAAG,UAC7E,CACF,CACD,GAAc,EAEhB,EAAY,OAAO,EAAe,EAAa,EAC/C,CAGE,EAAe,GAAK,EAAa,EAAc,IACjD,EAAO,KAAK,EAAO,OAAO,gBAAgB,EAAa,wBAAwB,CAAC,CAEhF,MAAM,IAAI,QAAS,GAAY,CAC7B,WAAW,EAAS,EAAe,IAAK,EACxC,GAK+B,CAErC,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAiBvB,GAfA,EAAO,KACL,EAAO,MACL,uCAAuC,EAAa,mBAClD,EAAY,IACb,YACF,CACF,CACG,GACF,EAAO,KACL,EAAO,QACL,cAAc,EAAa,6FAE5B,CACF,CAEC,EAMF,MALA,EAAO,MACL,EAAO,IACL,cAAc,EAAW,sFAC1B,CACF,CACS,MAAM,mCAAmC,CAErD,OAAO,EAAc"}
@@ -1,2 +1,2 @@
1
- import{a as e}from"./constants-9AglpfjZ.mjs";import{t}from"./logger-Bj782ZYD.mjs";import{t as n}from"./readCsv-C4TyEs-r.mjs";import{o as r}from"./request-DfkRPQFr.mjs";import{uniq as i}from"lodash-es";import a from"colors";import*as o from"io-ts";import{buildTranscendGraphQLClient as s,createSombraGotInstance as c,makeGraphQLRequest as l}from"@transcend-io/sdk";import{map as u,splitCsvToList as d}from"@transcend-io/utils";const f=`https://app.transcend.io/privacy-requests/incoming-requests/`,p=o.record(o.string,o.string);async function m(e,{id:n,...r},o,s){if(!n){let e=`Request ID must be provided to enricher request.${s?` Found error in row: ${s}`:``}`;throw t.error(a.red(e)),Error(e)}let c=n.toLowerCase(),l=Object.entries(r).reduce((e,[t,n])=>i(d(n)).length===0?e:Object.assign(e,{[t]:i(d(n)).map(e=>({value:t===`email`?e.toLowerCase():e}))}),{});try{return await e.post(`v1/enrich-identifiers`,{headers:{"x-transcend-request-id":c,"x-transcend-enricher-id":o},json:{enrichedIdentifiers:l}}).json(),t.error(a.green(`Successfully enriched request: ${f}${c}`)),!0}catch(e){if(typeof e.response.body==`string`&&e.response.body.includes(`Cannot update a resolved RequestEnricher`))return t.warn(a.magenta(`Skipped enrichment for request: ${f}${c}, request is no longer in the enriching phase.`)),!1;throw t.error(a.red(`Failed to enricher identifiers for request with id: ${f}${c} - ${e.message} - ${e.response.body}`)),e}}async function h({file:i,auth:o,sombraAuth:d,enricherId:f,markSilent:h,concurrency:g=100,transcendUrl:_=e}){let v=await c(_,o,{logger:t,sombraApiKey:d,sombraUrl:process.env.SOMBRA_URL}),y=s(_,o);t.info(a.magenta(`Reading "${i}" from disk`));let b=n(i,p);t.info(a.magenta(`Enriching "${b.length}" privacy requests.`));let x=0,S=0,C=0;if(await u(b,async(e,n)=>{try{h&&(await l(y,r,{variables:{input:{id:e.id,isSilent:!0}},logger:t}),t.info(a.magenta(`Mark request as silent mode - ${e.id}`))),await m(v,e,f,n)?x+=1:S+=1}catch{C+=1}},{concurrency:g}),t.info(a.green(`Successfully notified Transcend! \n Success count: ${x}.`)),S>0&&t.info(a.magenta(`Skipped count: ${S}.`)),C>0)throw t.info(a.red(`Error Count: ${C}.`)),Error(`Failed to enrich: ${C} requests.`);return b.length}export{p as n,m as r,h as t};
2
- //# sourceMappingURL=pushManualEnrichmentIdentifiersFromCsv-Cw6K-4Am.mjs.map
1
+ import{a as e}from"./constants-FP8lxFg5.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{t as n}from"./readCsv-C-5HBa7w.mjs";import{o as r}from"./request-CikRkOJR.mjs";import{uniq as i}from"lodash-es";import a from"colors";import*as o from"io-ts";import{buildTranscendGraphQLClient as s,createSombraGotInstance as c,makeGraphQLRequest as l}from"@transcend-io/sdk";import{map as u,splitCsvToList as d}from"@transcend-io/utils";const f=`https://app.transcend.io/privacy-requests/incoming-requests/`,p=o.record(o.string,o.string);async function m(e,{id:n,...r},o,s){if(!n){let e=`Request ID must be provided to enricher request.${s?` Found error in row: ${s}`:``}`;throw t.error(a.red(e)),Error(e)}let c=n.toLowerCase(),l=Object.entries(r).reduce((e,[t,n])=>i(d(n)).length===0?e:Object.assign(e,{[t]:i(d(n)).map(e=>({value:t===`email`?e.toLowerCase():e}))}),{});try{return await e.post(`v1/enrich-identifiers`,{headers:{"x-transcend-request-id":c,"x-transcend-enricher-id":o},json:{enrichedIdentifiers:l}}).json(),t.error(a.green(`Successfully enriched request: ${f}${c}`)),!0}catch(e){if(typeof e.response.body==`string`&&e.response.body.includes(`Cannot update a resolved RequestEnricher`))return t.warn(a.magenta(`Skipped enrichment for request: ${f}${c}, request is no longer in the enriching phase.`)),!1;throw t.error(a.red(`Failed to enricher identifiers for request with id: ${f}${c} - ${e.message} - ${e.response.body}`)),e}}async function h({file:i,auth:o,sombraAuth:d,enricherId:f,markSilent:h,concurrency:g=100,transcendUrl:_=e}){let v=await c(_,o,{logger:t,sombraApiKey:d,sombraUrl:process.env.SOMBRA_URL}),y=s(_,o);t.info(a.magenta(`Reading "${i}" from disk`));let b=n(i,p);t.info(a.magenta(`Enriching "${b.length}" privacy requests.`));let x=0,S=0,C=0;if(await u(b,async(e,n)=>{try{h&&(await l(y,r,{variables:{input:{id:e.id,isSilent:!0}},logger:t}),t.info(a.magenta(`Mark request as silent mode - ${e.id}`))),await m(v,e,f,n)?x+=1:S+=1}catch{C+=1}},{concurrency:g}),t.info(a.green(`Successfully notified Transcend! \n Success count: ${x}.`)),S>0&&t.info(a.magenta(`Skipped count: ${S}.`)),C>0)throw t.info(a.red(`Error Count: ${C}.`)),Error(`Failed to enrich: ${C} requests.`);return b.length}export{p as n,m as r,h as t};
2
+ //# sourceMappingURL=pushManualEnrichmentIdentifiersFromCsv-LWKOrJTN.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"pushManualEnrichmentIdentifiersFromCsv-Cw6K-4Am.mjs","names":[],"sources":["../src/lib/manual-enrichment/enrichPrivacyRequest.ts","../src/lib/manual-enrichment/pushManualEnrichmentIdentifiersFromCsv.ts"],"sourcesContent":["import { splitCsvToList } from '@transcend-io/utils';\nimport colors from 'colors';\nimport type { Got } from 'got';\nimport * as t from 'io-ts';\nimport { uniq } from 'lodash-es';\n\nimport { logger } from '../../logger.js';\n\nconst ADMIN_URL = 'https://app.transcend.io/privacy-requests/incoming-requests/';\n/**\n * Minimal set required to mark as completed\n */\nexport const EnrichPrivacyRequest = t.record(t.string, t.string);\n\n/** Type override */\nexport type EnrichPrivacyRequest = t.TypeOf<typeof EnrichPrivacyRequest>;\n\n/**\n * Upload identifiers to a privacy request or mark request as\n *\n * @param sombra - Sombra instance configured to make requests\n * @param request - Request to enricher\n * @param enricherId - The ID of the enricher being uploaded to\n * @param index - Index of request ID\n * @returns True if enriched successfully, false if skipped, throws error if failed\n */\nexport async function enrichPrivacyRequest(\n sombra: Got,\n { id: rawId, ...rest }: EnrichPrivacyRequest,\n enricherId: string,\n index?: number,\n): Promise<boolean> {\n if (!rawId) {\n // error\n const msg = `Request ID must be provided to enricher request.${\n index ? ` Found error in row: ${index}` : ''\n }`;\n logger.error(colors.red(msg));\n throw new Error(msg);\n }\n\n const id = rawId.toLowerCase();\n\n // Pull out the identifiers\n const enrichedIdentifiers = Object.entries(rest).reduce(\n (acc, [key, value]) => {\n const values = uniq(splitCsvToList(value));\n return values.length === 0\n ? acc\n : Object.assign(acc, {\n [key]: uniq(splitCsvToList(value)).map((val) => ({\n value: key === 'email' ? val.toLowerCase() : val,\n })),\n });\n },\n {} as Record<string, string[]>,\n );\n\n // Make the GraphQL request\n try {\n await sombra\n .post('v1/enrich-identifiers', {\n headers: {\n 'x-transcend-request-id': id,\n 'x-transcend-enricher-id': enricherId,\n },\n json: {\n enrichedIdentifiers,\n },\n })\n .json();\n\n logger.error(colors.green(`Successfully enriched request: ${ADMIN_URL}${id}`));\n return true;\n } catch (err) {\n // skip if already enriched\n if (\n typeof err.response.body === 'string' &&\n err.response.body.includes('Cannot update a resolved RequestEnricher')\n ) {\n logger.warn(\n colors.magenta(\n `Skipped enrichment for request: ${ADMIN_URL}${id}, request is no longer in the enriching phase.`,\n ),\n );\n return false;\n }\n\n // error\n logger.error(\n colors.red(\n `Failed to enricher identifiers for request with id: ${ADMIN_URL}${id} - ${err.message} - ${err.response.body}`,\n ),\n );\n throw err;\n }\n}\n","import {\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n makeGraphQLRequest,\n} from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { UPDATE_PRIVACY_REQUEST } from '../graphql/index.js';\nimport { readCsv } from '../requests/index.js';\nimport { enrichPrivacyRequest, EnrichPrivacyRequest } from './enrichPrivacyRequest.js';\n\n/**\n * Push a CSV of enriched requests back into Transcend\n *\n * @param options - Options\n * @returns Number of items processed\n */\nexport async function pushManualEnrichmentIdentifiersFromCsv({\n file,\n auth,\n sombraAuth,\n enricherId,\n markSilent,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** ID of enricher being uploaded to */\n enricherId: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** Concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Mark requests in silent mode before enriching */\n markSilent?: boolean;\n}): Promise<number> {\n // Create sombra instance to communicate with\n const sombra = await createSombraGotInstance(transcendUrl, auth, {\n logger,\n sombraApiKey: sombraAuth,\n sombraUrl: process.env.SOMBRA_URL,\n });\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Read from CSV\n logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const activeResults = readCsv(file, EnrichPrivacyRequest);\n\n // Notify Transcend\n logger.info(colors.magenta(`Enriching \"${activeResults.length}\" privacy requests.`));\n\n let successCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n\n await map(\n activeResults,\n async (request, index) => {\n try {\n // Mark requests in silent mode before a certain date\n if (markSilent) {\n await makeGraphQLRequest(client, UPDATE_PRIVACY_REQUEST, {\n variables: {\n input: {\n id: request.id,\n isSilent: true,\n },\n },\n logger,\n });\n\n logger.info(colors.magenta(`Mark request as silent mode - ${request.id}`));\n }\n\n const result = await enrichPrivacyRequest(sombra, request, enricherId, index);\n if (result) {\n successCount += 1;\n } else {\n skippedCount += 1;\n }\n } catch {\n errorCount += 1;\n }\n },\n { concurrency },\n );\n\n logger.info(colors.green(`Successfully notified Transcend! \\n Success count: ${successCount}.`));\n\n if (skippedCount > 0) {\n logger.info(colors.magenta(`Skipped count: ${skippedCount}.`));\n }\n\n if (errorCount > 0) {\n logger.info(colors.red(`Error Count: ${errorCount}.`));\n throw new Error(`Failed to enrich: ${errorCount} requests.`);\n }\n\n return activeResults.length;\n}\n"],"mappings":"0aAQA,MAAM,EAAY,+DAIL,EAAuB,EAAE,OAAO,EAAE,OAAQ,EAAE,OAAO,CAchE,eAAsB,EACpB,EACA,CAAE,GAAI,EAAO,GAAG,GAChB,EACA,EACkB,CAClB,GAAI,CAAC,EAAO,CAEV,IAAM,EAAM,mDACV,EAAQ,wBAAwB,IAAU,KAG5C,MADA,EAAO,MAAM,EAAO,IAAI,EAAI,CAAC,CACnB,MAAM,EAAI,CAGtB,IAAM,EAAK,EAAM,aAAa,CAGxB,EAAsB,OAAO,QAAQ,EAAK,CAAC,QAC9C,EAAK,CAAC,EAAK,KACK,EAAK,EAAe,EAAM,CAC5B,CAAC,SAAW,EACrB,EACA,OAAO,OAAO,EAAK,EAChB,GAAM,EAAK,EAAe,EAAM,CAAC,CAAC,IAAK,IAAS,CAC/C,MAAO,IAAQ,QAAU,EAAI,aAAa,CAAG,EAC9C,EAAE,CACJ,CAAC,CAER,EAAE,CACH,CAGD,GAAI,CAcF,OAbA,MAAM,EACH,KAAK,wBAAyB,CAC7B,QAAS,CACP,yBAA0B,EAC1B,0BAA2B,EAC5B,CACD,KAAM,CACJ,sBACD,CACF,CAAC,CACD,MAAM,CAET,EAAO,MAAM,EAAO,MAAM,kCAAkC,IAAY,IAAK,CAAC,CACvE,SACA,EAAK,CAEZ,GACE,OAAO,EAAI,SAAS,MAAS,UAC7B,EAAI,SAAS,KAAK,SAAS,2CAA2C,CAOtE,OALA,EAAO,KACL,EAAO,QACL,mCAAmC,IAAY,EAAG,gDACnD,CACF,CACM,GAST,MALA,EAAO,MACL,EAAO,IACL,uDAAuD,IAAY,EAAG,KAAK,EAAI,QAAQ,KAAK,EAAI,SAAS,OAC1G,CACF,CACK,GC1EV,eAAsB,EAAuC,CAC3D,OACA,OACA,aACA,aACA,aACA,cAAc,IACd,eAAe,GAgBG,CAElB,IAAM,EAAS,MAAM,EAAwB,EAAc,EAAM,CAC/D,SACA,aAAc,EACd,UAAW,QAAQ,IAAI,WACxB,CAAC,CACI,EAAS,EAA4B,EAAc,EAAK,CAG9D,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAK,aAAa,CAAC,CAC1D,IAAM,EAAgB,EAAQ,EAAM,EAAqB,CAGzD,EAAO,KAAK,EAAO,QAAQ,cAAc,EAAc,OAAO,qBAAqB,CAAC,CAEpF,IAAI,EAAe,EACf,EAAe,EACf,EAAa,EAwCjB,GAtCA,MAAM,EACJ,EACA,MAAO,EAAS,IAAU,CACxB,GAAI,CAEE,IACF,MAAM,EAAmB,EAAQ,EAAwB,CACvD,UAAW,CACT,MAAO,CACL,GAAI,EAAQ,GACZ,SAAU,GACX,CACF,CACD,SACD,CAAC,CAEF,EAAO,KAAK,EAAO,QAAQ,iCAAiC,EAAQ,KAAK,CAAC,EAIxE,MADiB,EAAqB,EAAQ,EAAS,EAAY,EAAM,CAE3E,GAAgB,EAEhB,GAAgB,OAEZ,CACN,GAAc,IAGlB,CAAE,cAAa,CAChB,CAED,EAAO,KAAK,EAAO,MAAM,sDAAsD,EAAa,GAAG,CAAC,CAE5F,EAAe,GACjB,EAAO,KAAK,EAAO,QAAQ,kBAAkB,EAAa,GAAG,CAAC,CAG5D,EAAa,EAEf,MADA,EAAO,KAAK,EAAO,IAAI,gBAAgB,EAAW,GAAG,CAAC,CAC5C,MAAM,qBAAqB,EAAW,YAAY,CAG9D,OAAO,EAAc"}
1
+ {"version":3,"file":"pushManualEnrichmentIdentifiersFromCsv-LWKOrJTN.mjs","names":[],"sources":["../src/lib/manual-enrichment/enrichPrivacyRequest.ts","../src/lib/manual-enrichment/pushManualEnrichmentIdentifiersFromCsv.ts"],"sourcesContent":["import { splitCsvToList } from '@transcend-io/utils';\nimport colors from 'colors';\nimport type { Got } from 'got';\nimport * as t from 'io-ts';\nimport { uniq } from 'lodash-es';\n\nimport { logger } from '../../logger.js';\n\nconst ADMIN_URL = 'https://app.transcend.io/privacy-requests/incoming-requests/';\n/**\n * Minimal set required to mark as completed\n */\nexport const EnrichPrivacyRequest = t.record(t.string, t.string);\n\n/** Type override */\nexport type EnrichPrivacyRequest = t.TypeOf<typeof EnrichPrivacyRequest>;\n\n/**\n * Upload identifiers to a privacy request or mark request as\n *\n * @param sombra - Sombra instance configured to make requests\n * @param request - Request to enricher\n * @param enricherId - The ID of the enricher being uploaded to\n * @param index - Index of request ID\n * @returns True if enriched successfully, false if skipped, throws error if failed\n */\nexport async function enrichPrivacyRequest(\n sombra: Got,\n { id: rawId, ...rest }: EnrichPrivacyRequest,\n enricherId: string,\n index?: number,\n): Promise<boolean> {\n if (!rawId) {\n // error\n const msg = `Request ID must be provided to enricher request.${\n index ? ` Found error in row: ${index}` : ''\n }`;\n logger.error(colors.red(msg));\n throw new Error(msg);\n }\n\n const id = rawId.toLowerCase();\n\n // Pull out the identifiers\n const enrichedIdentifiers = Object.entries(rest).reduce(\n (acc, [key, value]) => {\n const values = uniq(splitCsvToList(value));\n return values.length === 0\n ? acc\n : Object.assign(acc, {\n [key]: uniq(splitCsvToList(value)).map((val) => ({\n value: key === 'email' ? val.toLowerCase() : val,\n })),\n });\n },\n {} as Record<string, string[]>,\n );\n\n // Make the GraphQL request\n try {\n await sombra\n .post('v1/enrich-identifiers', {\n headers: {\n 'x-transcend-request-id': id,\n 'x-transcend-enricher-id': enricherId,\n },\n json: {\n enrichedIdentifiers,\n },\n })\n .json();\n\n logger.error(colors.green(`Successfully enriched request: ${ADMIN_URL}${id}`));\n return true;\n } catch (err) {\n // skip if already enriched\n if (\n typeof err.response.body === 'string' &&\n err.response.body.includes('Cannot update a resolved RequestEnricher')\n ) {\n logger.warn(\n colors.magenta(\n `Skipped enrichment for request: ${ADMIN_URL}${id}, request is no longer in the enriching phase.`,\n ),\n );\n return false;\n }\n\n // error\n logger.error(\n colors.red(\n `Failed to enricher identifiers for request with id: ${ADMIN_URL}${id} - ${err.message} - ${err.response.body}`,\n ),\n );\n throw err;\n }\n}\n","import {\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n makeGraphQLRequest,\n} from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { UPDATE_PRIVACY_REQUEST } from '../graphql/index.js';\nimport { readCsv } from '../requests/index.js';\nimport { enrichPrivacyRequest, EnrichPrivacyRequest } from './enrichPrivacyRequest.js';\n\n/**\n * Push a CSV of enriched requests back into Transcend\n *\n * @param options - Options\n * @returns Number of items processed\n */\nexport async function pushManualEnrichmentIdentifiersFromCsv({\n file,\n auth,\n sombraAuth,\n enricherId,\n markSilent,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** ID of enricher being uploaded to */\n enricherId: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** Concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Mark requests in silent mode before enriching */\n markSilent?: boolean;\n}): Promise<number> {\n // Create sombra instance to communicate with\n const sombra = await createSombraGotInstance(transcendUrl, auth, {\n logger,\n sombraApiKey: sombraAuth,\n sombraUrl: process.env.SOMBRA_URL,\n });\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Read from CSV\n logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const activeResults = readCsv(file, EnrichPrivacyRequest);\n\n // Notify Transcend\n logger.info(colors.magenta(`Enriching \"${activeResults.length}\" privacy requests.`));\n\n let successCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n\n await map(\n activeResults,\n async (request, index) => {\n try {\n // Mark requests in silent mode before a certain date\n if (markSilent) {\n await makeGraphQLRequest(client, UPDATE_PRIVACY_REQUEST, {\n variables: {\n input: {\n id: request.id,\n isSilent: true,\n },\n },\n logger,\n });\n\n logger.info(colors.magenta(`Mark request as silent mode - ${request.id}`));\n }\n\n const result = await enrichPrivacyRequest(sombra, request, enricherId, index);\n if (result) {\n successCount += 1;\n } else {\n skippedCount += 1;\n }\n } catch {\n errorCount += 1;\n }\n },\n { concurrency },\n );\n\n logger.info(colors.green(`Successfully notified Transcend! \\n Success count: ${successCount}.`));\n\n if (skippedCount > 0) {\n logger.info(colors.magenta(`Skipped count: ${skippedCount}.`));\n }\n\n if (errorCount > 0) {\n logger.info(colors.red(`Error Count: ${errorCount}.`));\n throw new Error(`Failed to enrich: ${errorCount} requests.`);\n }\n\n return activeResults.length;\n}\n"],"mappings":"0aAQA,MAAM,EAAY,+DAIL,EAAuB,EAAE,OAAO,EAAE,OAAQ,EAAE,OAAO,CAchE,eAAsB,EACpB,EACA,CAAE,GAAI,EAAO,GAAG,GAChB,EACA,EACkB,CAClB,GAAI,CAAC,EAAO,CAEV,IAAM,EAAM,mDACV,EAAQ,wBAAwB,IAAU,KAG5C,MADA,EAAO,MAAM,EAAO,IAAI,EAAI,CAAC,CACnB,MAAM,EAAI,CAGtB,IAAM,EAAK,EAAM,aAAa,CAGxB,EAAsB,OAAO,QAAQ,EAAK,CAAC,QAC9C,EAAK,CAAC,EAAK,KACK,EAAK,EAAe,EAAM,CAC5B,CAAC,SAAW,EACrB,EACA,OAAO,OAAO,EAAK,EAChB,GAAM,EAAK,EAAe,EAAM,CAAC,CAAC,IAAK,IAAS,CAC/C,MAAO,IAAQ,QAAU,EAAI,aAAa,CAAG,EAC9C,EAAE,CACJ,CAAC,CAER,EAAE,CACH,CAGD,GAAI,CAcF,OAbA,MAAM,EACH,KAAK,wBAAyB,CAC7B,QAAS,CACP,yBAA0B,EAC1B,0BAA2B,EAC5B,CACD,KAAM,CACJ,sBACD,CACF,CAAC,CACD,MAAM,CAET,EAAO,MAAM,EAAO,MAAM,kCAAkC,IAAY,IAAK,CAAC,CACvE,SACA,EAAK,CAEZ,GACE,OAAO,EAAI,SAAS,MAAS,UAC7B,EAAI,SAAS,KAAK,SAAS,2CAA2C,CAOtE,OALA,EAAO,KACL,EAAO,QACL,mCAAmC,IAAY,EAAG,gDACnD,CACF,CACM,GAST,MALA,EAAO,MACL,EAAO,IACL,uDAAuD,IAAY,EAAG,KAAK,EAAI,QAAQ,KAAK,EAAI,SAAS,OAC1G,CACF,CACK,GC1EV,eAAsB,EAAuC,CAC3D,OACA,OACA,aACA,aACA,aACA,cAAc,IACd,eAAe,GAgBG,CAElB,IAAM,EAAS,MAAM,EAAwB,EAAc,EAAM,CAC/D,SACA,aAAc,EACd,UAAW,QAAQ,IAAI,WACxB,CAAC,CACI,EAAS,EAA4B,EAAc,EAAK,CAG9D,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAK,aAAa,CAAC,CAC1D,IAAM,EAAgB,EAAQ,EAAM,EAAqB,CAGzD,EAAO,KAAK,EAAO,QAAQ,cAAc,EAAc,OAAO,qBAAqB,CAAC,CAEpF,IAAI,EAAe,EACf,EAAe,EACf,EAAa,EAwCjB,GAtCA,MAAM,EACJ,EACA,MAAO,EAAS,IAAU,CACxB,GAAI,CAEE,IACF,MAAM,EAAmB,EAAQ,EAAwB,CACvD,UAAW,CACT,MAAO,CACL,GAAI,EAAQ,GACZ,SAAU,GACX,CACF,CACD,SACD,CAAC,CAEF,EAAO,KAAK,EAAO,QAAQ,iCAAiC,EAAQ,KAAK,CAAC,EAIxE,MADiB,EAAqB,EAAQ,EAAS,EAAY,EAAM,CAE3E,GAAgB,EAEhB,GAAgB,OAEZ,CACN,GAAc,IAGlB,CAAE,cAAa,CAChB,CAED,EAAO,KAAK,EAAO,MAAM,sDAAsD,EAAa,GAAG,CAAC,CAE5F,EAAe,GACjB,EAAO,KAAK,EAAO,QAAQ,kBAAkB,EAAa,GAAG,CAAC,CAG5D,EAAa,EAEf,MADA,EAAO,KAAK,EAAO,IAAI,gBAAgB,EAAW,GAAG,CAAC,CAC5C,MAAM,qBAAqB,EAAW,YAAY,CAG9D,OAAO,EAAc"}
@@ -1,2 +1,2 @@
1
1
  import{decodeCodec as e}from"@transcend-io/type-utils";import{readFileSync as t}from"node:fs";import*as n from"io-ts";import{parse as r}from"csv-parse/sync";function i(i,a,o={columns:!0}){let s=r(t(i,`utf-8`),o);return e(n.array(a),s).map(e=>Object.entries(e).reduce((e,[t,n])=>Object.assign(e,{[t.replace(/[^a-z_.+\-A-Z -~]/g,``)]:n}),{}))}export{i as t};
2
- //# sourceMappingURL=readCsv-C4TyEs-r.mjs.map
2
+ //# sourceMappingURL=readCsv-C-5HBa7w.mjs.map