@transcend-io/cli 10.27.4 → 10.27.5

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 (355) hide show
  1. package/dist/{app-9G6prJ34.mjs → app-dIu3pdTM.mjs} +21 -21
  2. package/dist/{app-9G6prJ34.mjs.map → app-dIu3pdTM.mjs.map} +1 -1
  3. package/dist/{approvePrivacyRequests-QMPJYI3X.mjs → approvePrivacyRequests-B842tXn4.mjs} +2 -2
  4. package/dist/{approvePrivacyRequests-QMPJYI3X.mjs.map → approvePrivacyRequests-B842tXn4.mjs.map} +1 -1
  5. package/dist/bin/bash-complete.mjs +1 -1
  6. package/dist/bin/cli.mjs +1 -1
  7. package/dist/bin/cli.mjs.map +1 -1
  8. package/dist/bin/deprecated-command.mjs +3 -3
  9. package/dist/bin/deprecated-command.mjs.map +1 -1
  10. package/dist/{buildExamples-BkyOPD_E.mjs → buildExamples-CRrUU89C.mjs} +2 -2
  11. package/dist/{buildExamples-BkyOPD_E.mjs.map → buildExamples-CRrUU89C.mjs.map} +1 -1
  12. package/dist/{buildXdiSyncEndpoint-5HFin8GM.mjs → buildXdiSyncEndpoint-B9seJTxP.mjs} +2 -2
  13. package/dist/{buildXdiSyncEndpoint-5HFin8GM.mjs.map → buildXdiSyncEndpoint-B9seJTxP.mjs.map} +1 -1
  14. package/dist/{bulkRestartRequests-CYTUjpuK.mjs → bulkRestartRequests-CE7cDUMd.mjs} +2 -2
  15. package/dist/{bulkRestartRequests-CYTUjpuK.mjs.map → bulkRestartRequests-CE7cDUMd.mjs.map} +1 -1
  16. package/dist/{bulkRetryEnrichers-xpffnBsW.mjs → bulkRetryEnrichers-BcSANZPC.mjs} +2 -2
  17. package/dist/{bulkRetryEnrichers-xpffnBsW.mjs.map → bulkRetryEnrichers-BcSANZPC.mjs.map} +1 -1
  18. package/dist/{cancelPrivacyRequests-B-QuIjkC.mjs → cancelPrivacyRequests-BKibbagv.mjs} +2 -2
  19. package/dist/{cancelPrivacyRequests-B-QuIjkC.mjs.map → cancelPrivacyRequests-BKibbagv.mjs.map} +1 -1
  20. package/dist/{codecs-DJFlZLGT.mjs → codecs-zRkskjaJ.mjs} +1 -1
  21. package/dist/{codecs-DJFlZLGT.mjs.map → codecs-zRkskjaJ.mjs.map} +1 -1
  22. package/dist/collectCsvFilesOrExit-Dg5U3Qx_.mjs +2 -0
  23. package/dist/collectCsvFilesOrExit-Dg5U3Qx_.mjs.map +1 -0
  24. package/dist/collectParquetFilesOrExit-BlG2RRSC.mjs +2 -0
  25. package/dist/collectParquetFilesOrExit-BlG2RRSC.mjs.map +1 -0
  26. package/dist/{command-_zwStiyM.mjs → command-DKNKpgUB.mjs} +2 -2
  27. package/dist/{command-_zwStiyM.mjs.map → command-DKNKpgUB.mjs.map} +1 -1
  28. package/dist/commands/admin/chunk-csv/worker.mjs +1 -1
  29. package/dist/commands/admin/parquet-to-csv/worker.mjs +1 -1
  30. package/dist/consentManagersToBusinessEntities-Rv-ajWya.mjs +2 -0
  31. package/dist/consentManagersToBusinessEntities-Rv-ajWya.mjs.map +1 -0
  32. package/dist/{constants-BgCEW975.mjs → constants-B6wESCW2.mjs} +2 -2
  33. package/dist/{constants-BgCEW975.mjs.map → constants-B6wESCW2.mjs.map} +1 -1
  34. package/dist/{constants-C9xZJ9YW.mjs → constants-BuoISmXP.mjs} +1 -1
  35. package/dist/{constants-C9xZJ9YW.mjs.map → constants-BuoISmXP.mjs.map} +1 -1
  36. package/dist/{constants-DyD22MtN.mjs → constants-CdgK1myP.mjs} +2 -2
  37. package/dist/{constants-DyD22MtN.mjs.map → constants-CdgK1myP.mjs.map} +1 -1
  38. package/dist/context-4GAUnhTE.mjs +2 -0
  39. package/dist/context-4GAUnhTE.mjs.map +1 -0
  40. package/dist/createPoolingCommandUi-vTsGgYZT.mjs +14 -0
  41. package/dist/createPoolingCommandUi-vTsGgYZT.mjs.map +1 -0
  42. package/dist/done-input-validation-BFgMCQWH.mjs +2 -0
  43. package/dist/done-input-validation-BFgMCQWH.mjs.map +1 -0
  44. package/dist/{downloadPrivacyRequestFiles-W5pXxfeu.mjs → downloadPrivacyRequestFiles-Dn3VexN2.mjs} +2 -2
  45. package/dist/{downloadPrivacyRequestFiles-W5pXxfeu.mjs.map → downloadPrivacyRequestFiles-Dn3VexN2.mjs.map} +1 -1
  46. package/dist/{extractClientError-X9wJVqGq.mjs → extractClientError-DeS63kje.mjs} +1 -1
  47. package/dist/{extractClientError-X9wJVqGq.mjs.map → extractClientError-DeS63kje.mjs.map} +1 -1
  48. package/dist/{fetchAllRequests-DP24WqrP.mjs → fetchAllRequests-DUQGTJjx.mjs} +2 -2
  49. package/dist/{fetchAllRequests-DP24WqrP.mjs.map → fetchAllRequests-DUQGTJjx.mjs.map} +1 -1
  50. package/dist/{fuzzyMatchColumns-C1STZ_T1.mjs → fuzzyMatchColumns-BDD4a2W0.mjs} +2 -2
  51. package/dist/{fuzzyMatchColumns-C1STZ_T1.mjs.map → fuzzyMatchColumns-BDD4a2W0.mjs.map} +1 -1
  52. package/dist/{generateCrossAccountApiKeys-BTuoFxxy.mjs → generateCrossAccountApiKeys-QhnLqtUN.mjs} +2 -2
  53. package/dist/{generateCrossAccountApiKeys-BTuoFxxy.mjs.map → generateCrossAccountApiKeys-QhnLqtUN.mjs.map} +1 -1
  54. package/dist/impl-3IyENr9T.mjs +2 -0
  55. package/dist/impl-3IyENr9T.mjs.map +1 -0
  56. package/dist/impl-4rLX5Wah2.mjs +2 -0
  57. package/dist/impl-4rLX5Wah2.mjs.map +1 -0
  58. package/dist/impl-9TDsbGfF2.mjs +2 -0
  59. package/dist/impl-9TDsbGfF2.mjs.map +1 -0
  60. package/dist/impl-BPjGRqOL2.mjs +3 -0
  61. package/dist/{impl-CNzXdBVG2.mjs.map → impl-BPjGRqOL2.mjs.map} +1 -1
  62. package/dist/impl-BPn_YPIq2.mjs +2 -0
  63. package/dist/{impl-q66XVeBW2.mjs.map → impl-BPn_YPIq2.mjs.map} +1 -1
  64. package/dist/impl-BQTw6jpw.mjs +2 -0
  65. package/dist/impl-BQTw6jpw.mjs.map +1 -0
  66. package/dist/impl-Ba8naMzu.mjs +2 -0
  67. package/dist/impl-Ba8naMzu.mjs.map +1 -0
  68. package/dist/impl-BbWzTCSd2.mjs +2 -0
  69. package/dist/{impl-8wGX5Vf32.mjs.map → impl-BbWzTCSd2.mjs.map} +1 -1
  70. package/dist/impl-BddyFp_q.mjs +3 -0
  71. package/dist/impl-BddyFp_q.mjs.map +1 -0
  72. package/dist/impl-BgxjEv88.mjs +3 -0
  73. package/dist/impl-BgxjEv88.mjs.map +1 -0
  74. package/dist/impl-BiBNqcob.mjs +2 -0
  75. package/dist/impl-BiBNqcob.mjs.map +1 -0
  76. package/dist/{impl-CIncREux.mjs → impl-BkyqCY72.mjs} +2 -2
  77. package/dist/impl-BkyqCY72.mjs.map +1 -0
  78. package/dist/{impl-Ca064LmU.mjs → impl-BlFBTc6f.mjs} +3 -3
  79. package/dist/{impl-Ca064LmU.mjs.map → impl-BlFBTc6f.mjs.map} +1 -1
  80. package/dist/impl-BoCD0t4j.mjs +3 -0
  81. package/dist/impl-BoCD0t4j.mjs.map +1 -0
  82. package/dist/impl-BqiclSRZ.mjs +2 -0
  83. package/dist/impl-BqiclSRZ.mjs.map +1 -0
  84. package/dist/impl-BsEYMBx2.mjs +7 -0
  85. package/dist/{impl-DvSnW_IA.mjs.map → impl-BsEYMBx2.mjs.map} +1 -1
  86. package/dist/impl-CBC5K-IH.mjs +2 -0
  87. package/dist/impl-CBC5K-IH.mjs.map +1 -0
  88. package/dist/impl-CH40t5qf.mjs +2 -0
  89. package/dist/impl-CH40t5qf.mjs.map +1 -0
  90. package/dist/impl-CLVMZXJo.mjs +2 -0
  91. package/dist/impl-CLVMZXJo.mjs.map +1 -0
  92. package/dist/{impl-C2Irk48l.mjs → impl-CMYYX3Kz.mjs} +2 -2
  93. package/dist/{impl-C2Irk48l.mjs.map → impl-CMYYX3Kz.mjs.map} +1 -1
  94. package/dist/impl-CVChVd63.mjs +2 -0
  95. package/dist/impl-CVChVd63.mjs.map +1 -0
  96. package/dist/impl-CXdy0YMX.mjs +2 -0
  97. package/dist/impl-CXdy0YMX.mjs.map +1 -0
  98. package/dist/impl-CZ-KvZE02.mjs +2 -0
  99. package/dist/{impl-DoJDjUsd2.mjs.map → impl-CZ-KvZE02.mjs.map} +1 -1
  100. package/dist/impl-CbijbA-M2.mjs +2 -0
  101. package/dist/{impl-DOoJoSO22.mjs.map → impl-CbijbA-M2.mjs.map} +1 -1
  102. package/dist/impl-CccuY3Za.mjs +12 -0
  103. package/dist/impl-CccuY3Za.mjs.map +1 -0
  104. package/dist/impl-CclEOdC32.mjs +2 -0
  105. package/dist/{impl-BtiWdLEm2.mjs.map → impl-CclEOdC32.mjs.map} +1 -1
  106. package/dist/impl-Cq5wI-kP.mjs +2 -0
  107. package/dist/impl-Cq5wI-kP.mjs.map +1 -0
  108. package/dist/impl-CrY1za0t.mjs +2 -0
  109. package/dist/impl-CrY1za0t.mjs.map +1 -0
  110. package/dist/impl-CusKk_JR2.mjs +2 -0
  111. package/dist/{impl-jVkU5ZQe2.mjs.map → impl-CusKk_JR2.mjs.map} +1 -1
  112. package/dist/impl-CzbVqbm0.mjs +5 -0
  113. package/dist/impl-CzbVqbm0.mjs.map +1 -0
  114. package/dist/impl-D33Zr0vh2.mjs +2 -0
  115. package/dist/impl-D33Zr0vh2.mjs.map +1 -0
  116. package/dist/impl-DG9RwTkA2.mjs +2 -0
  117. package/dist/{impl-BygKSE0s2.mjs.map → impl-DG9RwTkA2.mjs.map} +1 -1
  118. package/dist/impl-DQG3PiAW2.mjs +2 -0
  119. package/dist/{impl-DMMWwLyN2.mjs.map → impl-DQG3PiAW2.mjs.map} +1 -1
  120. package/dist/impl-DRimS_G8.mjs +2 -0
  121. package/dist/impl-DRimS_G8.mjs.map +1 -0
  122. package/dist/impl-DWBQKUuq.mjs +2 -0
  123. package/dist/{impl-BtLxw8E7.mjs.map → impl-DWBQKUuq.mjs.map} +1 -1
  124. package/dist/impl-DbF7uw7f2.mjs +2 -0
  125. package/dist/{impl-BRm1_RUu2.mjs.map → impl-DbF7uw7f2.mjs.map} +1 -1
  126. package/dist/impl-DbPLuDc22.mjs +2 -0
  127. package/dist/impl-DbPLuDc22.mjs.map +1 -0
  128. package/dist/impl-DiyWNLJq.mjs +2 -0
  129. package/dist/impl-DiyWNLJq.mjs.map +1 -0
  130. package/dist/impl-DlaWf-oS2.mjs +2 -0
  131. package/dist/impl-DlaWf-oS2.mjs.map +1 -0
  132. package/dist/impl-Dpes0u_6.mjs +2 -0
  133. package/dist/{impl-CFB9lqIN.mjs.map → impl-Dpes0u_6.mjs.map} +1 -1
  134. package/dist/impl-DxXWaXFU.mjs +2 -0
  135. package/dist/impl-DxXWaXFU.mjs.map +1 -0
  136. package/dist/impl-DzJG5HaX.mjs +2 -0
  137. package/dist/impl-DzJG5HaX.mjs.map +1 -0
  138. package/dist/impl-GYM4LDKp2.mjs +2 -0
  139. package/dist/{impl-CDQ82oJL2.mjs.map → impl-GYM4LDKp2.mjs.map} +1 -1
  140. package/dist/{impl-DSE-RmED.mjs → impl-GnxjtYL7.mjs} +2 -2
  141. package/dist/impl-GnxjtYL7.mjs.map +1 -0
  142. package/dist/impl-PYtpY5hs2.mjs +2 -0
  143. package/dist/impl-PYtpY5hs2.mjs.map +1 -0
  144. package/dist/impl-QeWNZCg4.mjs +3 -0
  145. package/dist/impl-QeWNZCg4.mjs.map +1 -0
  146. package/dist/impl-V_ffkzbd2.mjs +2 -0
  147. package/dist/{impl-B6butj0_2.mjs.map → impl-V_ffkzbd2.mjs.map} +1 -1
  148. package/dist/impl-_rrZ0KXo.mjs +3 -0
  149. package/dist/impl-_rrZ0KXo.mjs.map +1 -0
  150. package/dist/impl-_tY0CJdZ.mjs +5 -0
  151. package/dist/impl-_tY0CJdZ.mjs.map +1 -0
  152. package/dist/impl-nJ7LzilX2.mjs +2 -0
  153. package/dist/impl-nJ7LzilX2.mjs.map +1 -0
  154. package/dist/impl-p0AyZWFL.mjs +2 -0
  155. package/dist/impl-p0AyZWFL.mjs.map +1 -0
  156. package/dist/impl-s5h7dIlv2.mjs +2 -0
  157. package/dist/{impl-D8FcLfAL2.mjs.map → impl-s5h7dIlv2.mjs.map} +1 -1
  158. package/dist/impl-uKjAibIR.mjs +2 -0
  159. package/dist/impl-uKjAibIR.mjs.map +1 -0
  160. package/dist/impl-wf0PvJms.mjs +2 -0
  161. package/dist/impl-wf0PvJms.mjs.map +1 -0
  162. package/dist/impl-xRwX5ZLK.mjs +2 -0
  163. package/dist/impl-xRwX5ZLK.mjs.map +1 -0
  164. package/dist/index.d.mts +76 -12
  165. package/dist/index.d.mts.map +1 -1
  166. package/dist/index.mjs +3 -3
  167. package/dist/index.mjs.map +1 -1
  168. package/dist/initializeCliRuntime-B7zDhMok.mjs +2 -0
  169. package/dist/initializeCliRuntime-B7zDhMok.mjs.map +1 -0
  170. package/dist/{inquirer-B0OF_nRe.mjs → inquirer-DNa31Mkx.mjs} +2 -2
  171. package/dist/{inquirer-B0OF_nRe.mjs.map → inquirer-DNa31Mkx.mjs.map} +1 -1
  172. package/dist/listFiles-DrxRhlZ2.mjs +2 -0
  173. package/dist/listFiles-DrxRhlZ2.mjs.map +1 -0
  174. package/dist/logger-CB_h_zbj.mjs +2 -0
  175. package/dist/logger-CB_h_zbj.mjs.map +1 -0
  176. package/dist/mapConsentCsvRowsToInputs-DA7BRD7M.mjs +2 -0
  177. package/dist/mapConsentCsvRowsToInputs-DA7BRD7M.mjs.map +1 -0
  178. package/dist/{markRequestDataSiloIdsCompleted-CcJGKOn4.mjs → markRequestDataSiloIdsCompleted-CK7PNwTz.mjs} +2 -2
  179. package/dist/{markRequestDataSiloIdsCompleted-CcJGKOn4.mjs.map → markRequestDataSiloIdsCompleted-CK7PNwTz.mjs.map} +1 -1
  180. package/dist/{markSilentPrivacyRequests-CVxwueuH.mjs → markSilentPrivacyRequests-Cb-J9ckA.mjs} +2 -2
  181. package/dist/{markSilentPrivacyRequests-CVxwueuH.mjs.map → markSilentPrivacyRequests-Cb-J9ckA.mjs.map} +1 -1
  182. package/dist/{mergeTranscendInputs-DjPe49yR.mjs → mergeTranscendInputs-CkpitZbH.mjs} +2 -2
  183. package/dist/{mergeTranscendInputs-DjPe49yR.mjs.map → mergeTranscendInputs-CkpitZbH.mjs.map} +1 -1
  184. package/dist/{notifyPrivacyRequestsAdditionalTime-D1gLyndO.mjs → notifyPrivacyRequestsAdditionalTime-it1FA62W.mjs} +2 -2
  185. package/dist/{notifyPrivacyRequestsAdditionalTime-D1gLyndO.mjs.map → notifyPrivacyRequestsAdditionalTime-it1FA62W.mjs.map} +1 -1
  186. package/dist/{parquetToCsvOneFile-0O4iLz0t.mjs → parquetToCsvOneFile-Dtz90qfJ.mjs} +2 -2
  187. package/dist/{parquetToCsvOneFile-0O4iLz0t.mjs.map → parquetToCsvOneFile-Dtz90qfJ.mjs.map} +1 -1
  188. package/dist/{parseAttributesFromString-CYcxsS3n.mjs → parseAttributesFromString-BxJcnKmn.mjs} +2 -2
  189. package/dist/{parseAttributesFromString-CYcxsS3n.mjs.map → parseAttributesFromString-BxJcnKmn.mjs.map} +1 -1
  190. package/dist/{parseVariablesFromString-B4TUkJRF.mjs → parseVariablesFromString-cu5gPC3M.mjs} +1 -1
  191. package/dist/{parseVariablesFromString-B4TUkJRF.mjs.map → parseVariablesFromString-cu5gPC3M.mjs.map} +1 -1
  192. package/dist/{pullAllDatapoints-DJno8LkB.mjs → pullAllDatapoints-XqreMBT5.mjs} +2 -2
  193. package/dist/{pullAllDatapoints-DJno8LkB.mjs.map → pullAllDatapoints-XqreMBT5.mjs.map} +1 -1
  194. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-BCblZfOb.mjs → pullChunkedCustomSiloOutstandingIdentifiers-DuPDOm6f.mjs} +2 -2
  195. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-BCblZfOb.mjs.map → pullChunkedCustomSiloOutstandingIdentifiers-DuPDOm6f.mjs.map} +1 -1
  196. package/dist/{pullConsentManagerMetrics-C41UhU8u.mjs → pullConsentManagerMetrics-Dk5IejaY.mjs} +2 -2
  197. package/dist/{pullConsentManagerMetrics-C41UhU8u.mjs.map → pullConsentManagerMetrics-Dk5IejaY.mjs.map} +1 -1
  198. package/dist/{pullManualEnrichmentIdentifiersToCsv-BYjAq9G5.mjs → pullManualEnrichmentIdentifiersToCsv-CAD1navz.mjs} +2 -2
  199. package/dist/{pullManualEnrichmentIdentifiersToCsv-BYjAq9G5.mjs.map → pullManualEnrichmentIdentifiersToCsv-CAD1navz.mjs.map} +1 -1
  200. package/dist/{pullTranscendConfiguration-DbRVLKq5.mjs → pullTranscendConfiguration-NcFjHE8k.mjs} +2 -2
  201. package/dist/{pullTranscendConfiguration-DbRVLKq5.mjs.map → pullTranscendConfiguration-NcFjHE8k.mjs.map} +1 -1
  202. package/dist/{pullUnstructuredSubDataPointRecommendations-B9xIDPf2.mjs → pullUnstructuredSubDataPointRecommendations-Cf4irXl4.mjs} +2 -2
  203. package/dist/{pullUnstructuredSubDataPointRecommendations-B9xIDPf2.mjs.map → pullUnstructuredSubDataPointRecommendations-Cf4irXl4.mjs.map} +1 -1
  204. package/dist/pushCronIdentifiersFromCsv-BGaJycWo.mjs +2 -0
  205. package/dist/{pushCronIdentifiersFromCsv-DIZF-QXC.mjs.map → pushCronIdentifiersFromCsv-BGaJycWo.mjs.map} +1 -1
  206. package/dist/pushManualEnrichmentIdentifiersFromCsv-B9okRkhL.mjs +2 -0
  207. package/dist/{pushManualEnrichmentIdentifiersFromCsv-Ch5-jHbY.mjs.map → pushManualEnrichmentIdentifiersFromCsv-B9okRkhL.mjs.map} +1 -1
  208. package/dist/readCsv-CmRYYFJc.mjs +2 -0
  209. package/dist/readCsv-CmRYYFJc.mjs.map +1 -0
  210. package/dist/{readTranscendYaml-bL1qFPqv.mjs → readTranscendYaml-DtJz9mor.mjs} +3 -3
  211. package/dist/readTranscendYaml-DtJz9mor.mjs.map +1 -0
  212. package/dist/{removeUnverifiedRequestIdentifiers-CHupDNvu.mjs → removeUnverifiedRequestIdentifiers-DJhxiy_D.mjs} +2 -2
  213. package/dist/{removeUnverifiedRequestIdentifiers-CHupDNvu.mjs.map → removeUnverifiedRequestIdentifiers-DJhxiy_D.mjs.map} +1 -1
  214. package/dist/{request-BIplTb3L.mjs → request-CCCU2SdV.mjs} +1 -1
  215. package/dist/{request-BIplTb3L.mjs.map → request-CCCU2SdV.mjs.map} +1 -1
  216. package/dist/{retryRequestDataSilos-DlAldSyR.mjs → retryRequestDataSilos-6JfyZclD.mjs} +2 -2
  217. package/dist/{retryRequestDataSilos-DlAldSyR.mjs.map → retryRequestDataSilos-6JfyZclD.mjs.map} +1 -1
  218. package/dist/runOpa-Q2r3qPsi.mjs +2 -0
  219. package/dist/runOpa-Q2r3qPsi.mjs.map +1 -0
  220. package/dist/{skipPreflightJobs-C4trcphf.mjs → skipPreflightJobs-xpbtJ3dK.mjs} +2 -2
  221. package/dist/{skipPreflightJobs-C4trcphf.mjs.map → skipPreflightJobs-xpbtJ3dK.mjs.map} +1 -1
  222. package/dist/{skipRequestDataSilos-D6babS9E.mjs → skipRequestDataSilos-B7RA6I3Z.mjs} +2 -2
  223. package/dist/{skipRequestDataSilos-D6babS9E.mjs.map → skipRequestDataSilos-B7RA6I3Z.mjs.map} +1 -1
  224. package/dist/{streamPrivacyRequestsToCsv-CMzC_73c.mjs → streamPrivacyRequestsToCsv-DT31SP6w.mjs} +2 -2
  225. package/dist/{streamPrivacyRequestsToCsv-CMzC_73c.mjs.map → streamPrivacyRequestsToCsv-DT31SP6w.mjs.map} +1 -1
  226. package/dist/{syncCodePackages-Dhm5jI6B.mjs → syncCodePackages-ozt9aBXf.mjs} +2 -2
  227. package/dist/{syncCodePackages-Dhm5jI6B.mjs.map → syncCodePackages-ozt9aBXf.mjs.map} +1 -1
  228. package/dist/{updateConsentManagerVersionToLatest-CFYnN3Gk.mjs → updateConsentManagerVersionToLatest-CCzWEBEj.mjs} +2 -2
  229. package/dist/{updateConsentManagerVersionToLatest-CFYnN3Gk.mjs.map → updateConsentManagerVersionToLatest-CCzWEBEj.mjs.map} +1 -1
  230. package/dist/{uploadConsents-C5sG51Dk.mjs → uploadConsents-CDqFNWX_.mjs} +2 -2
  231. package/dist/{uploadConsents-C5sG51Dk.mjs.map → uploadConsents-CDqFNWX_.mjs.map} +1 -1
  232. package/dist/{uploadPrivacyRequestsFromCsv-BnzI39-b.mjs → uploadPrivacyRequestsFromCsv-CVpBFaYB.mjs} +2 -2
  233. package/dist/{uploadPrivacyRequestsFromCsv-BnzI39-b.mjs.map → uploadPrivacyRequestsFromCsv-CVpBFaYB.mjs.map} +1 -1
  234. package/dist/validateTranscendAuth-3guZJPKH.mjs +2 -0
  235. package/dist/validateTranscendAuth-3guZJPKH.mjs.map +1 -0
  236. package/dist/{writeCsv-DMw5OmWp.mjs → writeCsv-rhlEBjYp.mjs} +1 -1
  237. package/dist/{writeCsv-DMw5OmWp.mjs.map → writeCsv-rhlEBjYp.mjs.map} +1 -1
  238. package/package.json +2 -2
  239. package/dist/collectCsvFilesOrExit-BPo8Mjy7.mjs +0 -2
  240. package/dist/collectCsvFilesOrExit-BPo8Mjy7.mjs.map +0 -1
  241. package/dist/collectParquetFilesOrExit-DVS9_OSv.mjs +0 -2
  242. package/dist/collectParquetFilesOrExit-DVS9_OSv.mjs.map +0 -1
  243. package/dist/consentManagersToBusinessEntities-rf8_xu71.mjs +0 -5
  244. package/dist/consentManagersToBusinessEntities-rf8_xu71.mjs.map +0 -1
  245. package/dist/context-Br0NHHOk.mjs +0 -2
  246. package/dist/context-Br0NHHOk.mjs.map +0 -1
  247. package/dist/createExtraKeyHandler-DSN5zA2f.mjs +0 -14
  248. package/dist/createExtraKeyHandler-DSN5zA2f.mjs.map +0 -1
  249. package/dist/done-input-validation-DL31vk7g.mjs +0 -2
  250. package/dist/done-input-validation-DL31vk7g.mjs.map +0 -1
  251. package/dist/impl-4BsLrbMs.mjs +0 -2
  252. package/dist/impl-4BsLrbMs.mjs.map +0 -1
  253. package/dist/impl-7pxeoDZg.mjs +0 -5
  254. package/dist/impl-7pxeoDZg.mjs.map +0 -1
  255. package/dist/impl-8VwlDfF2.mjs +0 -2
  256. package/dist/impl-8VwlDfF2.mjs.map +0 -1
  257. package/dist/impl-8wGX5Vf32.mjs +0 -2
  258. package/dist/impl-93xjb93p.mjs +0 -2
  259. package/dist/impl-93xjb93p.mjs.map +0 -1
  260. package/dist/impl-B2eZGemA.mjs +0 -2
  261. package/dist/impl-B2eZGemA.mjs.map +0 -1
  262. package/dist/impl-B6butj0_2.mjs +0 -2
  263. package/dist/impl-BRm1_RUu2.mjs +0 -2
  264. package/dist/impl-BauzMfVC2.mjs +0 -2
  265. package/dist/impl-BauzMfVC2.mjs.map +0 -1
  266. package/dist/impl-BmQR1Pae.mjs +0 -3
  267. package/dist/impl-BmQR1Pae.mjs.map +0 -1
  268. package/dist/impl-BnzPrDmM.mjs +0 -2
  269. package/dist/impl-BnzPrDmM.mjs.map +0 -1
  270. package/dist/impl-BohgbWOH.mjs +0 -2
  271. package/dist/impl-BohgbWOH.mjs.map +0 -1
  272. package/dist/impl-BqTimIMI.mjs +0 -2
  273. package/dist/impl-BqTimIMI.mjs.map +0 -1
  274. package/dist/impl-BtLxw8E7.mjs +0 -2
  275. package/dist/impl-BtiWdLEm2.mjs +0 -2
  276. package/dist/impl-Bur_bNXN.mjs +0 -2
  277. package/dist/impl-Bur_bNXN.mjs.map +0 -1
  278. package/dist/impl-BwuWn3TM.mjs +0 -2
  279. package/dist/impl-BwuWn3TM.mjs.map +0 -1
  280. package/dist/impl-BxQE7dL92.mjs +0 -2
  281. package/dist/impl-BxQE7dL92.mjs.map +0 -1
  282. package/dist/impl-BygKSE0s2.mjs +0 -2
  283. package/dist/impl-C3f_H_77.mjs +0 -3
  284. package/dist/impl-C3f_H_77.mjs.map +0 -1
  285. package/dist/impl-CDQ82oJL2.mjs +0 -2
  286. package/dist/impl-CFB9lqIN.mjs +0 -2
  287. package/dist/impl-CIncREux.mjs.map +0 -1
  288. package/dist/impl-CMpVsG1a.mjs +0 -2
  289. package/dist/impl-CMpVsG1a.mjs.map +0 -1
  290. package/dist/impl-CNzXdBVG2.mjs +0 -3
  291. package/dist/impl-CZG9gzzR.mjs +0 -3
  292. package/dist/impl-CZG9gzzR.mjs.map +0 -1
  293. package/dist/impl-CaiSz_JT2.mjs +0 -2
  294. package/dist/impl-CaiSz_JT2.mjs.map +0 -1
  295. package/dist/impl-ChP6AAtL.mjs +0 -3
  296. package/dist/impl-ChP6AAtL.mjs.map +0 -1
  297. package/dist/impl-Chska4J8.mjs +0 -3
  298. package/dist/impl-Chska4J8.mjs.map +0 -1
  299. package/dist/impl-CkoQHhc8.mjs +0 -12
  300. package/dist/impl-CkoQHhc8.mjs.map +0 -1
  301. package/dist/impl-Cl3hf0Pd.mjs +0 -2
  302. package/dist/impl-Cl3hf0Pd.mjs.map +0 -1
  303. package/dist/impl-Cm5zP_mL2.mjs +0 -2
  304. package/dist/impl-Cm5zP_mL2.mjs.map +0 -1
  305. package/dist/impl-CnrK11Gr2.mjs +0 -2
  306. package/dist/impl-CnrK11Gr2.mjs.map +0 -1
  307. package/dist/impl-D0-ioxpZ.mjs +0 -2
  308. package/dist/impl-D0-ioxpZ.mjs.map +0 -1
  309. package/dist/impl-D8FcLfAL2.mjs +0 -2
  310. package/dist/impl-DBK5c6d0.mjs +0 -2
  311. package/dist/impl-DBK5c6d0.mjs.map +0 -1
  312. package/dist/impl-DBny72kx2.mjs +0 -2
  313. package/dist/impl-DBny72kx2.mjs.map +0 -1
  314. package/dist/impl-DLWhxaMi.mjs +0 -2
  315. package/dist/impl-DLWhxaMi.mjs.map +0 -1
  316. package/dist/impl-DMMWwLyN2.mjs +0 -2
  317. package/dist/impl-DOoJoSO22.mjs +0 -2
  318. package/dist/impl-DSE-RmED.mjs.map +0 -1
  319. package/dist/impl-DTaYnwjN.mjs +0 -2
  320. package/dist/impl-DTaYnwjN.mjs.map +0 -1
  321. package/dist/impl-DUn2j-1O.mjs +0 -2
  322. package/dist/impl-DUn2j-1O.mjs.map +0 -1
  323. package/dist/impl-DVjCdEx9.mjs +0 -2
  324. package/dist/impl-DVjCdEx9.mjs.map +0 -1
  325. package/dist/impl-DmODS2cY.mjs +0 -2
  326. package/dist/impl-DmODS2cY.mjs.map +0 -1
  327. package/dist/impl-DoJDjUsd2.mjs +0 -2
  328. package/dist/impl-DvSnW_IA.mjs +0 -7
  329. package/dist/impl-HNBTIl1R.mjs +0 -2
  330. package/dist/impl-HNBTIl1R.mjs.map +0 -1
  331. package/dist/impl-W7FHn0mS.mjs +0 -2
  332. package/dist/impl-W7FHn0mS.mjs.map +0 -1
  333. package/dist/impl-Xrph1kvG2.mjs +0 -2
  334. package/dist/impl-Xrph1kvG2.mjs.map +0 -1
  335. package/dist/impl-jVkU5ZQe2.mjs +0 -2
  336. package/dist/impl-q66XVeBW2.mjs +0 -2
  337. package/dist/impl-xIb20rTt.mjs +0 -2
  338. package/dist/impl-xIb20rTt.mjs.map +0 -1
  339. package/dist/listFiles-C5kubvdN.mjs +0 -2
  340. package/dist/listFiles-C5kubvdN.mjs.map +0 -1
  341. package/dist/logger-Ckep4QXn.mjs +0 -2
  342. package/dist/logger-Ckep4QXn.mjs.map +0 -1
  343. package/dist/pushCronIdentifiersFromCsv-DIZF-QXC.mjs +0 -2
  344. package/dist/pushManualEnrichmentIdentifiersFromCsv-Ch5-jHbY.mjs +0 -2
  345. package/dist/readCsv--FfP8n-H.mjs +0 -2
  346. package/dist/readCsv--FfP8n-H.mjs.map +0 -1
  347. package/dist/readTranscendYaml-bL1qFPqv.mjs.map +0 -1
  348. package/dist/runOpa-D511z37u.mjs +0 -2
  349. package/dist/runOpa-D511z37u.mjs.map +0 -1
  350. package/dist/uploadCookiesFromCsv-BgrbBl1Y.mjs +0 -2
  351. package/dist/uploadCookiesFromCsv-BgrbBl1Y.mjs.map +0 -1
  352. package/dist/uploadDataFlowsFromCsv-CJMs2KA1.mjs +0 -2
  353. package/dist/uploadDataFlowsFromCsv-CJMs2KA1.mjs.map +0 -1
  354. package/dist/validateTranscendAuth-CAO5ktnu.mjs +0 -2
  355. package/dist/validateTranscendAuth-CAO5ktnu.mjs.map +0 -1
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import{i as e,n as t,r as n,t as r}from"./enums-OiLcZ26O.mjs";import{a as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,n as p,o as m,p as h,r as g,s as _,t as v,u as y}from"./constants-DyD22MtN.mjs";import{t as b}from"./logger-Ckep4QXn.mjs";import{$ as x,A as S,B as ee,C as te,D as ne,E as re,F as ie,G as ae,H as oe,I as se,J as ce,K as C,L as w,M as T,N as E,O as D,P as O,Q as k,R as A,S as j,T as M,U as N,V as P,W as F,X as I,Y as L,Z as R,_ as z,a as B,at as V,b as H,c as U,ct as W,d as G,dt as le,et as ue,f as de,ft as fe,g as pe,h as me,i as he,it as ge,j as _e,k as ve,l as ye,lt as be,m as xe,mt as Se,n as Ce,nt as we,o as Te,ot as Ee,p as De,pt as Oe,q as ke,r as Ae,rt as je,s as Me,st as Ne,t as Pe,tt as Fe,u as Ie,ut as Le,v as Re,w as ze,x as Be,y as Ve,z as He}from"./codecs-DJFlZLGT.mjs";import{a as Ue,i as We,n as Ge,r as Ke,t as qe}from"./readTranscendYaml-bL1qFPqv.mjs";import{i as Je,n as Ye,r as Xe,t as Ze}from"./mergeTranscendInputs-DjPe49yR.mjs";import{a as Qe,c as $e,i as et,l as tt,n as nt,o as rt,r as it,s as at,t as ot,u as st}from"./constants-C9xZJ9YW.mjs";import{n as ct,t as lt}from"./fuzzyMatchColumns-C1STZ_T1.mjs";import{a as ut,c as dt,d as ft,f as pt,i as mt,l as ht,n as gt,o as _t,r as vt,s as yt,t as bt,u as xt}from"./uploadPrivacyRequestsFromCsv-BnzI39-b.mjs";import{n as St,t as Ct}from"./parseAttributesFromString-CYcxsS3n.mjs";import{t as wt}from"./readCsv--FfP8n-H.mjs";import{n as Tt,t as Et}from"./pullUnstructuredSubDataPointRecommendations-B9xIDPf2.mjs";import{a as Dt,i as Ot,n as kt,o as At,r as jt,t as Mt}from"./request-BIplTb3L.mjs";import{i as Nt,n as Pt,r as Ft,t as It}from"./pullTranscendConfiguration-DbRVLKq5.mjs";import{i as Lt,n as Rt,r as K,t as zt}from"./fetchAllRequests-DP24WqrP.mjs";import{a as Bt,i as Vt,n as Ht,r as Ut,t as Wt}from"./pullChunkedCustomSiloOutstandingIdentifiers-BCblZfOb.mjs";import{n as Gt,r as Kt,t as qt}from"./syncCodePackages-Dhm5jI6B.mjs";import{t as Jt}from"./markSilentPrivacyRequests-CVxwueuH.mjs";import{a as Yt,i as Xt,n as Zt,o as Qt,r as $t,t as en}from"./downloadPrivacyRequestFiles-W5pXxfeu.mjs";import{n as tn,r as nn,t as rn}from"./extractClientError-X9wJVqGq.mjs";import{t as an}from"./approvePrivacyRequests-QMPJYI3X.mjs";import{t as on}from"./notifyPrivacyRequestsAdditionalTime-D1gLyndO.mjs";import{t as sn}from"./cancelPrivacyRequests-B-QuIjkC.mjs";import{n as cn,t as ln}from"./bulkRestartRequests-CYTUjpuK.mjs";import{t as un}from"./skipPreflightJobs-C4trcphf.mjs";import{t as dn}from"./bulkRetryEnrichers-xpffnBsW.mjs";import{t as fn}from"./retryRequestDataSilos-DlAldSyR.mjs";import{n as q,r as J,t as pn}from"./streamPrivacyRequestsToCsv-CMzC_73c.mjs";import{n as mn,r as hn,t as gn}from"./inquirer-B0OF_nRe.mjs";import{t as _n}from"./parseVariablesFromString-B4TUkJRF.mjs";import{t as vn}from"./collectParquetFilesOrExit-DVS9_OSv.mjs";import{t as yn}from"./collectCsvFilesOrExit-BPo8Mjy7.mjs";import{t as bn}from"./parquetToCsvOneFile-0O4iLz0t.mjs";import{a as xn,i as Sn,n as Cn,o as wn,r as Tn,s as En,t as Dn}from"./writeCsv-DMw5OmWp.mjs";import{t as On}from"./skipRequestDataSilos-D6babS9E.mjs";import{t as kn}from"./removeUnverifiedRequestIdentifiers-CHupDNvu.mjs";import{t as An}from"./updateConsentManagerVersionToLatest-CFYnN3Gk.mjs";import{t as jn}from"./uploadDataFlowsFromCsv-CJMs2KA1.mjs";import{t as Mn}from"./uploadCookiesFromCsv-BgrbBl1Y.mjs";import{t as Nn}from"./pullConsentManagerMetrics-C41UhU8u.mjs";import{n as Pn,r as Fn,t as In}from"./buildXdiSyncEndpoint-5HFin8GM.mjs";import{t as Ln}from"./consentManagersToBusinessEntities-rf8_xu71.mjs";import{i as Rn,n as zn,r as Bn,t as Vn}from"./uploadConsents-C5sG51Dk.mjs";import{n as Hn,r as Un,t as Wn}from"./pushCronIdentifiersFromCsv-DIZF-QXC.mjs";import{t as Gn}from"./markRequestDataSiloIdsCompleted-CcJGKOn4.mjs";import{t as Kn}from"./generateCrossAccountApiKeys-BTuoFxxy.mjs";import{t as qn}from"./validateTranscendAuth-CAO5ktnu.mjs";import{t as Jn}from"./listFiles-C5kubvdN.mjs";import{t as Yn}from"./pullAllDatapoints-DJno8LkB.mjs";import{t as Xn}from"./pullManualEnrichmentIdentifiersToCsv-BYjAq9G5.mjs";import{n as Zn,r as Qn,t as $n}from"./pushManualEnrichmentIdentifiersFromCsv-Ch5-jHbY.mjs";import{chunk as er,difference as tr}from"lodash-es";import{readFileSync as nr,readdirSync as rr,statSync as ir}from"node:fs";import{join as Y}from"node:path";import ar from"fast-glob";import X from"colors";import{UPDATE_OR_CREATE_COOKIES as or,buildTranscendGraphQLClient as sr,createSombraGotInstance as cr,fetchAllRequestIdentifiers as lr,fetchConsentManagerId as ur,makeGraphQLRequest as dr,validateSombraVersion as fr}from"@transcend-io/sdk";import{map as Z,mapSeries as pr}from"@transcend-io/utils";import{execSync as Q}from"child_process";async function $(e,t){let n=await ur(e,{logger:b});await pr(er(t,100),async t=>{await dr(e,or,{variables:{airgapBundleId:n,cookies:t.map(e=>({name:e.name,trackingPurposes:e.trackingPurposes&&e.trackingPurposes.length>0?e.trackingPurposes:void 0,description:e.description,service:e.service,status:e.status,attributes:e.attributes,isRegex:e.isRegex}))},logger:b})})}async function mr(e,t){let n=!1;b.info(X.magenta(`Syncing "${t.length}" cookies...`));let r=t.filter(e=>t.filter(t=>e.name===t.name&&e.isRegex===t.isRegex).length>1);if(r.length>0)throw Error(`Failed to upload cookies as there were non-unique entries found: ${r.map(({name:e})=>e).join(`,`)}`);try{b.info(X.magenta(`Upserting "${t.length}" new cookies...`)),await $(e,t),b.info(X.green(`Successfully synced ${t.length} cookies!`))}catch(e){n=!0,b.error(X.red(`Failed to create cookies! - ${e.message}`))}return!n}async function hr({auth:e,sombraAuth:t,actions:n=[],statuses:r=[],identifierSearch:a,pageLimit:o=100,concurrency:s=1,transcendUrl:c=i,createdAtBefore:l,skipRequestIdentifiers:u=!1,createdAtAfter:d,updatedAtBefore:f,updatedAtAfter:p,isTest:m}){let h=sr(c,e),g=await cr(c,e,{logger:b,sombraApiKey:t,sombraUrl:process.env.SOMBRA_URL}),_=``;l&&(_+=` before ${l.toISOString()}`),d&&(_+=`${_?`, and`:``} after ${d.toISOString()}`),b.info(X.magenta(`${n.length>0?`Pulling requests of type "${n.join(`" , "`)}"`:`Pulling all requests`}${_}`));let v=s>1&&d&&l,y=v?q(d,l,s):[{createdAtAfter:d,createdAtBefore:l}];v&&b.info(X.magenta(`Splitting date range into ${s} parallel chunks`));let x=(await Z(y,e=>K(h,{actions:n,text:a,statuses:r,createdAtBefore:e.createdAtBefore,createdAtAfter:e.createdAtAfter,updatedAtBefore:f,updatedAtAfter:p,isTest:m}),{concurrency:v?s:1})).flat();u||await fr(h,{logger:b});let S=u?x.map(e=>({...e,requestIdentifiers:[]})):await Z(x,async e=>{let t=await lr(h,g,{filterBy:{requestId:e.id},skipSombraCheck:!0,logger:b});return{...e,requestIdentifiers:t}},{concurrency:o});return b.info(X.magenta(`Pulled ${S.length} requests`)),{requestsWithRequestIdentifiers:S,requestsFormattedForCsv:S.map(J)}}function gr(e){try{return e?nr(e,`utf8`):``}catch{return``}}function _r(e){return rr(e).filter(t=>ir(Y(e,t)).isDirectory())}function vr(e){return e.replace(/(https?:\/\/[^\s]+)/g,`<link-omitted>`)}function yr(e){return Object.entries(e).reduce((e,[t,n])=>n!=null&&n!==``&&!(Array.isArray(n)&&n.length===0)&&!(typeof n==`object`&&Object.keys(n).length===0)?Object.assign(e,{[t]:n}):e,{})}function br({baseBranch:e,rootDirectory:t,githubRepo:n,excludedGlob:r=[],fileBlockList:i=[]}){Q(`git fetch origin ${e}`);let a=Q(`git ls-remote ${n} "refs/heads/${e}" | cut -f 1`,{encoding:`utf-8`}).split(`
1
+ import{i as e,n as t,r as n,t as r}from"./enums-OiLcZ26O.mjs";import{a as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,n as p,o as m,p as h,r as g,s as _,t as v,u as y}from"./constants-CdgK1myP.mjs";import{t as b}from"./logger-CB_h_zbj.mjs";import{$ as x,A as S,B as ee,C as te,D as C,E as ne,F as re,G as ie,H as ae,I as oe,J as se,K as ce,L as le,M as ue,N as w,O as de,P as fe,Q as T,R as E,S as D,T as O,U as k,V as A,W as j,X as M,Y as N,Z as P,_ as F,a as I,at as L,b as R,c as z,ct as B,d as V,dt as pe,et as me,f as he,ft as ge,g as _e,h as ve,i as ye,it as be,j as xe,k as Se,l as Ce,lt as we,m as Te,mt as Ee,n as De,nt as Oe,o as ke,ot as Ae,p as je,pt as Me,q as Ne,r as Pe,rt as Fe,s as Ie,st as Le,t as Re,tt as ze,u as Be,ut as Ve,v as He,w as Ue,x as We,y as Ge,z as Ke}from"./codecs-zRkskjaJ.mjs";import{a as qe,i as Je,n as Ye,o as Xe,r as Ze,s as Qe,t as $e}from"./readTranscendYaml-DtJz9mor.mjs";import{i as et,n as tt,r as nt,t as rt}from"./mergeTranscendInputs-CkpitZbH.mjs";import{a as it,c as at,i as ot,l as st,n as ct,o as lt,r as ut,s as dt,t as ft,u as pt}from"./constants-BuoISmXP.mjs";import{n as mt,t as ht}from"./fuzzyMatchColumns-BDD4a2W0.mjs";import{a as gt,c as _t,d as vt,f as yt,i as bt,l as xt,n as St,o as Ct,r as wt,s as Tt,t as Et,u as Dt}from"./uploadPrivacyRequestsFromCsv-CVpBFaYB.mjs";import{n as Ot,t as kt}from"./parseAttributesFromString-BxJcnKmn.mjs";import{n as H,t as At}from"./readCsv-CmRYYFJc.mjs";import{n as jt,t as Mt}from"./pullUnstructuredSubDataPointRecommendations-Cf4irXl4.mjs";import{a as Nt,i as Pt,n as Ft,o as It,r as Lt,t as Rt}from"./request-CCCU2SdV.mjs";import{i as zt,n as Bt,r as Vt,t as Ht}from"./pullTranscendConfiguration-NcFjHE8k.mjs";import{i as Ut,n as Wt,r as U,t as Gt}from"./fetchAllRequests-DUQGTJjx.mjs";import{a as Kt,i as qt,n as Jt,r as Yt,t as Xt}from"./pullChunkedCustomSiloOutstandingIdentifiers-DuPDOm6f.mjs";import{n as Zt,r as Qt,t as $t}from"./syncCodePackages-ozt9aBXf.mjs";import{t as en}from"./markSilentPrivacyRequests-Cb-J9ckA.mjs";import{a as tn,i as nn,n as rn,o as an,r as on,t as sn}from"./downloadPrivacyRequestFiles-Dn3VexN2.mjs";import{n as cn,r as ln,t as un}from"./extractClientError-DeS63kje.mjs";import{t as dn}from"./approvePrivacyRequests-B842tXn4.mjs";import{t as fn}from"./notifyPrivacyRequestsAdditionalTime-it1FA62W.mjs";import{t as pn}from"./cancelPrivacyRequests-BKibbagv.mjs";import{n as mn,t as hn}from"./bulkRestartRequests-CE7cDUMd.mjs";import{t as gn}from"./skipPreflightJobs-xpbtJ3dK.mjs";import{t as _n}from"./bulkRetryEnrichers-BcSANZPC.mjs";import{t as vn}from"./retryRequestDataSilos-6JfyZclD.mjs";import{n as W,r as G,t as yn}from"./streamPrivacyRequestsToCsv-DT31SP6w.mjs";import{n as bn,r as xn,t as Sn}from"./inquirer-DNa31Mkx.mjs";import{t as Cn}from"./parseVariablesFromString-cu5gPC3M.mjs";import{t as wn}from"./collectParquetFilesOrExit-BlG2RRSC.mjs";import{t as Tn}from"./collectCsvFilesOrExit-Dg5U3Qx_.mjs";import{t as En}from"./parquetToCsvOneFile-Dtz90qfJ.mjs";import{a as Dn,i as On,n as kn,o as An,r as jn,s as Mn,t as Nn}from"./writeCsv-rhlEBjYp.mjs";import{t as Pn}from"./skipRequestDataSilos-B7RA6I3Z.mjs";import{t as Fn}from"./removeUnverifiedRequestIdentifiers-DJhxiy_D.mjs";import{t as In}from"./updateConsentManagerVersionToLatest-CCzWEBEj.mjs";import{n as K,t as q}from"./mapConsentCsvRowsToInputs-DA7BRD7M.mjs";import{t as Ln}from"./pullConsentManagerMetrics-Dk5IejaY.mjs";import{n as Rn,r as zn,t as Bn}from"./buildXdiSyncEndpoint-B9seJTxP.mjs";import{t as Vn}from"./consentManagersToBusinessEntities-Rv-ajWya.mjs";import{i as Hn,n as Un,r as Wn,t as Gn}from"./uploadConsents-CDqFNWX_.mjs";import{n as Kn,r as qn,t as Jn}from"./pushCronIdentifiersFromCsv-BGaJycWo.mjs";import{t as Yn}from"./markRequestDataSiloIdsCompleted-CK7PNwTz.mjs";import{t as Xn}from"./generateCrossAccountApiKeys-QhnLqtUN.mjs";import{t as Zn}from"./validateTranscendAuth-3guZJPKH.mjs";import{n as Qn,t as $n}from"./listFiles-DrxRhlZ2.mjs";import{t as er}from"./pullAllDatapoints-XqreMBT5.mjs";import{t as tr}from"./pullManualEnrichmentIdentifiersToCsv-CAD1navz.mjs";import{n as nr,r as rr,t as ir}from"./pushManualEnrichmentIdentifiersFromCsv-B9okRkhL.mjs";import{chunk as ar,difference as or}from"lodash-es";import{readFileSync as sr,readdirSync as cr,statSync as lr}from"node:fs";import{join as ur}from"node:path";import dr from"fast-glob";import J from"colors";import{UPDATE_OR_CREATE_COOKIES as Y,buildTranscendGraphQLClient as X,createSombraGotInstance as fr,fetchAllRequestIdentifiers as pr,fetchConsentManagerId as mr,makeGraphQLRequest as hr,syncCookies as gr,syncDataFlows as _r,validateSombraVersion as vr}from"@transcend-io/sdk";import{map as Z,mapSeries as yr}from"@transcend-io/utils";import{execSync as Q}from"child_process";async function $(e,t){let n=await mr(e,{logger:b});await yr(ar(t,100),async t=>{await hr(e,Y,{variables:{airgapBundleId:n,cookies:t.map(e=>({name:e.name,trackingPurposes:e.trackingPurposes&&e.trackingPurposes.length>0?e.trackingPurposes:void 0,description:e.description,service:e.service,status:e.status,attributes:e.attributes,isRegex:e.isRegex}))},logger:b})})}async function br(e,t){let n=!1;b.info(J.magenta(`Syncing "${t.length}" cookies...`));let r=t.filter(e=>t.filter(t=>e.name===t.name&&e.isRegex===t.isRegex).length>1);if(r.length>0)throw Error(`Failed to upload cookies as there were non-unique entries found: ${r.map(({name:e})=>e).join(`,`)}`);try{b.info(J.magenta(`Upserting "${t.length}" new cookies...`)),await $(e,t),b.info(J.green(`Successfully synced ${t.length} cookies!`))}catch(e){n=!0,b.error(J.red(`Failed to create cookies! - ${e.message}`))}return!n}async function xr({auth:e,sombraAuth:t,actions:n=[],statuses:r=[],identifierSearch:a,pageLimit:o=100,concurrency:s=1,transcendUrl:c=i,createdAtBefore:l,skipRequestIdentifiers:u=!1,createdAtAfter:d,updatedAtBefore:f,updatedAtAfter:p,isTest:m}){let h=X(c,e),g=await fr(c,e,{logger:b,sombraApiKey:t,sombraUrl:process.env.SOMBRA_URL}),_=``;l&&(_+=` before ${l.toISOString()}`),d&&(_+=`${_?`, and`:``} after ${d.toISOString()}`),b.info(J.magenta(`${n.length>0?`Pulling requests of type "${n.join(`" , "`)}"`:`Pulling all requests`}${_}`));let v=s>1&&d&&l,y=v?W(d,l,s):[{createdAtAfter:d,createdAtBefore:l}];v&&b.info(J.magenta(`Splitting date range into ${s} parallel chunks`));let x=(await Z(y,e=>U(h,{actions:n,text:a,statuses:r,createdAtBefore:e.createdAtBefore,createdAtAfter:e.createdAtAfter,updatedAtBefore:f,updatedAtAfter:p,isTest:m}),{concurrency:v?s:1})).flat();u||await vr(h,{logger:b});let S=u?x.map(e=>({...e,requestIdentifiers:[]})):await Z(x,async e=>{let t=await pr(h,g,{filterBy:{requestId:e.id},skipSombraCheck:!0,logger:b});return{...e,requestIdentifiers:t}},{concurrency:o});return b.info(J.magenta(`Pulled ${S.length} requests`)),{requestsWithRequestIdentifiers:S,requestsFormattedForCsv:S.map(G)}}function Sr(e,t=sr){try{return e?t(e,`utf8`):``}catch{return``}}async function Cr({auth:e,trackerStatus:t,file:n,classifyService:r=!1,transcendUrl:a=i}){let o=X(a,e);b.info(J.magenta(`Reading "${n}" from disk`)),await _r(o,K(H(n,w),t),{classifyService:r,logger:b})||(b.error(J.red(`Encountered error(s) syncing data flows from CSV, see logs above for more info. `)),process.exit(1))}async function wr({auth:e,trackerStatus:t,file:n,transcendUrl:r=i}){let a=X(r,e);b.info(J.magenta(`Reading "${n}" from disk`)),await gr(a,q(H(n,C),t),{logger:b})||(b.error(J.red(`Encountered error(s) syncing cookies from CSV, see logs above for more info. `)),process.exit(1))}function Tr(e){return cr(e).filter(t=>lr(ur(e,t)).isDirectory())}function Er(e){return e.replace(/(https?:\/\/[^\s]+)/g,`<link-omitted>`)}function Dr(e){return Object.entries(e).reduce((e,[t,n])=>n!=null&&n!==``&&!(Array.isArray(n)&&n.length===0)&&!(typeof n==`object`&&Object.keys(n).length===0)?Object.assign(e,{[t]:n}):e,{})}function Or({baseBranch:e,rootDirectory:t,githubRepo:n,excludedGlob:r=[],fileBlockList:i=[]}){Q(`git fetch origin ${e}`);let a=Q(`git ls-remote ${n} "refs/heads/${e}" | cut -f 1`,{encoding:`utf-8`}).split(`
2
2
  `)[0],o=Q(`git rev-parse HEAD`,{encoding:`utf-8`}).split(`
3
- `)[0];if(!a||!o)throw Error(`FAILED TO FIND COMMIT RANGE`);let s=tr(Q(`git fetch && git diff --name-only "${e||a}...${o}" -- ${t}`,{encoding:`utf-8`}).split(`
4
- `).filter(e=>e),i),c=r.length>0?ar.sync(s,{ignore:r}):s,l={};return c.forEach(e=>{l[e]=Q(`git show ${o}:${e}`,{encoding:`utf-8`})}),{changedFiles:s,fileDiffs:l,repoName:n.split(`/`).pop().split(`.`)[0],commit:o}}export{v as ADMIN_DASH,p as ADMIN_DASH_DATAPOINTS,g as ADMIN_DASH_INTEGRATIONS,Mt as APPROVE_PRIVACY_REQUEST,Nt as ASSESSMENT_TEMPLATES,Pe as ActionInput,Ce as ActionItemCollectionInput,Ae as ActionItemInput,he as ApiKeyInput,B as AssessmentAnswerOptionInput,Te as AssessmentDisplayLogicInput,Me as AssessmentInput,U as AssessmentNestedRuleInput,ye as AssessmentResourceInput,Ie as AssessmentRetentionScheduleInput,G as AssessmentRuleInput,de as AssessmentSectionInput,De as AssessmentSectionQuestionInput,xe as AssessmentTemplateInput,mt as AttestedExtraIdentifiers,me as AttributeInput,pe as AttributePreview,z as AttributeValueInput,ot as BLANK,nt as BULK_APPLY,Re as BusinessEntityInput,kt as CANCEL_PRIVACY_REQUEST,it as CAN_APPLY_IN_BULK,et as CachedFileState,Qe as CachedRequestState,Ve as CodePackageInput,H as CodePackageSdk,rt as ColumnName,Be as ConsentManageExperienceInput,j as ConsentManagerInput,te as ConsentManagerServiceMetadata,ze as ConsentPreferenceTopic,M as ConsentPreferenceTopicOptionValue,re as ConsentPurpose,ne as CookieCsvInput,D as CookieInput,Ht as CronIdentifier,Hn as CronIdentifierPush,Ut as CronPartition,u as DEBUG,i as DEFAULT_TRANSCEND_API,m as DEFAULT_TRANSCEND_API_KEY,_ as DEFAULT_TRANSCEND_CONSENT_API,It as DEFAULT_TRANSCEND_PULL_RESOURCES,ve as DataCategoryGuessInput,S as DataCategoryInput,_e as DataCategoryPreviewInput,T as DataCategoryRecommendationInput,E as DataFlowCsvInput,O as DataFlowInput,ie as DataSiloInput,se as DataSubjectInput,w as DatapointInput,A as DeletionDependencies,He as DeletionDependency,ee as DeletionDependencyInput,P as DeletionDependencyReset,Tt as ENTRY_COUNT,Zn as EnrichPrivacyRequest,oe as EnricherInput,N as FieldInput,at as IDENTIFIER_BLOCK_LIST,In as IP_ADDRESS_REGEX,$e as IS_REQUIRED,F as IdentifierInput,ae as ImportOnetrustAssessmentsInput,$t as IntlMessage,C as IntlMessageInput,tt as NONE,jt as NOTIFY_ADDITIONAL_TIME,r as OneTrustFileFormat,t as OneTrustPullResource,n as OneTrustPullSource,Ct as ParsedAttributeInput,ke as PartitionInput,ce as PolicyInput,L as PreferenceWorkflowConfigInput,I as PreferenceWorkflowConfigPurposeInput,R as PrivacyCenterInput,zt as PrivacyRequest,ut as PrivacyRequestInput,tn as PrivacyRequestResponse,k as ProcessingActivityInput,x as ProcessingPurposeInput,ue as ProcessingPurposePreviewInput,Fe as PromptAVendorEmailSettings,Vn as PurposeMap,Ot as REQUESTS,Dt as REQUESTS_COUNT,a as RETRYABLE_BATCH_STATUSES,we as RegionInput,je as RepositoryInput,Xt as RequestFileMetadata,Yt as RequestFileMetadataResponse,Rt as RequestPurposeTrigger,ge as RiskAssignmentInput,V as RiskLogicInput,d as SCOPES_BY_TITLE,y as SCOPE_TITLES,Ee as SiloDiscoveryResultInput,Ne as SoftwareDevelopmentKitInput,W as StoredApiKey,st as SuccessfulRequest,o as TR_PULL_RESOURCE_SCOPE_MAP,s as TR_PUSH_RESOURCE_SCOPE_MAP,h as TR_YML_RESOURCE_TO_FIELD_NAME,be as TeamInput,Le as TemplateInput,le as TranscendInput,e as TranscendPullResource,At as UPDATE_PRIVACY_REQUEST,zn as USP_STRING_REGEX,qe as VARIABLE_PARAMETERS_NAME,Ge as VARIABLE_PARAMETERS_REGEXP,fe as VendorInput,Oe as WebhookHeader,Se as WorkflowConfigInput,Dn as appendCsvRowsOrdered,Cn as appendCsvSync,an as approvePrivacyRequests,Pn as buildXdiSyncEndpoint,ln as bulkRestartRequests,dn as bulkRetryEnrichers,sn as cancelPrivacyRequests,yn as collectCsvFilesOrExit,vn as collectParquetFilesOrExit,Ln as consentManagersToBusinessEntities,qt as createCodePackage,Rn as createConsentToken,l as description,Fn as domainToHost,en as downloadPrivacyRequestFiles,Qn as enrichPrivacyRequest,Je as ensureAllDataSubjectsExist,rn as extractClientError,Ft as fetchAllAssessmentTemplates,K as fetchAllRequests,Bt as fetchRequestDataSiloActiveCount,Lt as fetchRequestsTotalCount,yr as filterNullishValuesFromObject,xt as filterRows,J as formatRequestForCsv,lt as fuzzyMatchColumns,ct as fuzzySearch,Kn as generateCrossAccountApiKeys,Qt as getFileMetadataForPrivacyRequests,br as getGitFilesThatChanged,ft as getUniqueValuesForColumn,Tn as initCsvFile,gn as inquirerAutoComplete,mn as inquirerConfirmBoolean,hn as inquirerConfirmText,_r as listDirectories,Jn as listFiles,gt as mapColumnsToAttributes,vt as mapColumnsToIdentifiers,ht as mapCsvColumnsToApi,_t as mapCsvRowsToRequestInputs,pt as mapEnumValues,dt as mapRequestEnumValues,Un as markCronIdentifierCompleted,Gn as markRequestDataSiloIdsCompleted,Jt as markSilentPrivacyRequests,Ze as mergeTranscendInputs,f as name,yt as normalizeIdentifierValue,on as notifyPrivacyRequestsAdditionalTime,bn as parquetToCsvOneFile,St as parseAttributesFromString,Sn as parseFilePath,_n as parseVariablesFromString,Yn as pullAllDatapoints,Wt as pullChunkedCustomSiloOutstandingIdentifiers,Nn as pullConsentManagerMetrics,Vt as pullCronPageOfIdentifiers,Xn as pullManualEnrichmentIdentifiersToCsv,hr as pullPrivacyRequests,Pt as pullTranscendConfiguration,Et as pullUnstructuredSubDataPointRecommendations,Wn as pushCronIdentifiersFromCsv,$n as pushManualEnrichmentIdentifiersFromCsv,wt as readCsv,gr as readSafe,Ke as readTranscendYaml,vr as removeLinks,kn as removeUnverifiedRequestIdentifiers,We as replaceVariablesInYaml,cn as restartPrivacyRequest,fn as retryRequestDataSilos,un as skipPreflightJobs,On as skipRequestDataSilos,q as splitDateRange,Zt as streamPrivacyRequestFiles,pn as streamPrivacyRequestsToCsv,nn as submitPrivacyRequest,Gt as syncCodePackages,Ye as syncConfigurationToTranscend,mr as syncCookies,Xe as syncDataSilos,Kt as updateCodePackages,An as updateConsentManagerVersionToLatest,$ as updateOrCreateCookies,Bn as uploadConsents,Mn as uploadCookiesFromCsv,jn as uploadDataFlowsFromCsv,bt as uploadPrivacyRequestsFromCsv,qn as validateTranscendAuth,c as version,xn as writeCsv,wn as writeCsvSync,En as writeLargeCsv,Ue as writeTranscendYaml};
3
+ `)[0];if(!a||!o)throw Error(`FAILED TO FIND COMMIT RANGE`);let s=or(Q(`git fetch && git diff --name-only "${e||a}...${o}" -- ${t}`,{encoding:`utf-8`}).split(`
4
+ `).filter(e=>e),i),c=r.length>0?dr.sync(s,{ignore:r}):s,l={};return c.forEach(e=>{l[e]=Q(`git show ${o}:${e}`,{encoding:`utf-8`})}),{changedFiles:s,fileDiffs:l,repoName:n.split(`/`).pop().split(`.`)[0],commit:o}}export{v as ADMIN_DASH,p as ADMIN_DASH_DATAPOINTS,g as ADMIN_DASH_INTEGRATIONS,Rt as APPROVE_PRIVACY_REQUEST,zt as ASSESSMENT_TEMPLATES,Re as ActionInput,De as ActionItemCollectionInput,Pe as ActionItemInput,ye as ApiKeyInput,I as AssessmentAnswerOptionInput,ke as AssessmentDisplayLogicInput,Ie as AssessmentInput,z as AssessmentNestedRuleInput,Ce as AssessmentResourceInput,Be as AssessmentRetentionScheduleInput,V as AssessmentRuleInput,he as AssessmentSectionInput,je as AssessmentSectionQuestionInput,Te as AssessmentTemplateInput,bt as AttestedExtraIdentifiers,ve as AttributeInput,_e as AttributePreview,F as AttributeValueInput,ft as BLANK,ct as BULK_APPLY,He as BusinessEntityInput,Ft as CANCEL_PRIVACY_REQUEST,ut as CAN_APPLY_IN_BULK,ot as CachedFileState,it as CachedRequestState,Ge as CodePackageInput,R as CodePackageSdk,lt as ColumnName,We as ConsentManageExperienceInput,D as ConsentManagerInput,te as ConsentManagerServiceMetadata,Ue as ConsentPreferenceTopic,O as ConsentPreferenceTopicOptionValue,ne as ConsentPurpose,C as CookieCsvInput,de as CookieInput,Jt as CronIdentifier,Kn as CronIdentifierPush,Yt as CronPartition,u as DEBUG,i as DEFAULT_TRANSCEND_API,m as DEFAULT_TRANSCEND_API_KEY,_ as DEFAULT_TRANSCEND_CONSENT_API,Ht as DEFAULT_TRANSCEND_PULL_RESOURCES,Se as DataCategoryGuessInput,S as DataCategoryInput,xe as DataCategoryPreviewInput,ue as DataCategoryRecommendationInput,w as DataFlowCsvInput,fe as DataFlowInput,re as DataSiloInput,oe as DataSubjectInput,le as DatapointInput,E as DeletionDependencies,Ke as DeletionDependency,ee as DeletionDependencyInput,A as DeletionDependencyReset,jt as ENTRY_COUNT,nr as EnrichPrivacyRequest,ae as EnricherInput,k as FieldInput,dt as IDENTIFIER_BLOCK_LIST,Bn as IP_ADDRESS_REGEX,at as IS_REQUIRED,j as IdentifierInput,ie as ImportOnetrustAssessmentsInput,on as IntlMessage,ce as IntlMessageInput,st as NONE,Lt as NOTIFY_ADDITIONAL_TIME,r as OneTrustFileFormat,t as OneTrustPullResource,n as OneTrustPullSource,kt as ParsedAttributeInput,Ne as PartitionInput,se as PolicyInput,N as PreferenceWorkflowConfigInput,M as PreferenceWorkflowConfigPurposeInput,P as PrivacyCenterInput,Gt as PrivacyRequest,gt as PrivacyRequestInput,cn as PrivacyRequestResponse,T as ProcessingActivityInput,x as ProcessingPurposeInput,me as ProcessingPurposePreviewInput,ze as PromptAVendorEmailSettings,Gn as PurposeMap,Pt as REQUESTS,Nt as REQUESTS_COUNT,a as RETRYABLE_BATCH_STATUSES,Oe as RegionInput,Fe as RepositoryInput,nn as RequestFileMetadata,tn as RequestFileMetadataResponse,Wt as RequestPurposeTrigger,be as RiskAssignmentInput,L as RiskLogicInput,d as SCOPES_BY_TITLE,y as SCOPE_TITLES,Ae as SiloDiscoveryResultInput,Le as SoftwareDevelopmentKitInput,B as StoredApiKey,pt as SuccessfulRequest,o as TR_PULL_RESOURCE_SCOPE_MAP,s as TR_PUSH_RESOURCE_SCOPE_MAP,h as TR_YML_RESOURCE_TO_FIELD_NAME,we as TeamInput,Ve as TemplateInput,pe as TranscendInput,e as TranscendPullResource,It as UPDATE_PRIVACY_REQUEST,Un as USP_STRING_REGEX,$e as VARIABLE_PARAMETERS_NAME,Ye as VARIABLE_PARAMETERS_REGEXP,ge as VendorInput,Me as WebhookHeader,Ee as WorkflowConfigInput,Nn as appendCsvRowsOrdered,kn as appendCsvSync,dn as approvePrivacyRequests,Rn as buildXdiSyncEndpoint,hn as bulkRestartRequests,_n as bulkRetryEnrichers,pn as cancelPrivacyRequests,Tn as collectCsvFilesOrExit,wn as collectParquetFilesOrExit,Vn as consentManagersToBusinessEntities,$t as createCodePackage,Hn as createConsentToken,l as description,zn as domainToHost,sn as downloadPrivacyRequestFiles,rr as enrichPrivacyRequest,et as ensureAllDataSubjectsExist,un as extractClientError,Vt as fetchAllAssessmentTemplates,U as fetchAllRequests,Kt as fetchRequestDataSiloActiveCount,Ut as fetchRequestsTotalCount,$n as filterFileNames,Dr as filterNullishValuesFromObject,Dt as filterRows,G as formatRequestForCsv,ht as fuzzyMatchColumns,mt as fuzzySearch,Xn as generateCrossAccountApiKeys,an as getFileMetadataForPrivacyRequests,Or as getGitFilesThatChanged,vt as getUniqueValuesForColumn,jn as initCsvFile,Sn as inquirerAutoComplete,bn as inquirerConfirmBoolean,xn as inquirerConfirmText,Tr as listDirectories,Qn as listFiles,St as mapColumnsToAttributes,wt as mapColumnsToIdentifiers,q as mapCookieCsvRowsToInputs,xt as mapCsvColumnsToApi,Ct as mapCsvRowsToRequestInputs,K as mapDataFlowCsvRowsToInputs,yt as mapEnumValues,_t as mapRequestEnumValues,qn as markCronIdentifierCompleted,Yn as markRequestDataSiloIdsCompleted,en as markSilentPrivacyRequests,rt as mergeTranscendInputs,f as name,Tt as normalizeIdentifierValue,fn as notifyPrivacyRequestsAdditionalTime,En as parquetToCsvOneFile,Ot as parseAttributesFromString,At as parseCsv,On as parseFilePath,Ze as parseTranscendYaml,Cn as parseVariablesFromString,er as pullAllDatapoints,Xt as pullChunkedCustomSiloOutstandingIdentifiers,Ln as pullConsentManagerMetrics,qt as pullCronPageOfIdentifiers,tr as pullManualEnrichmentIdentifiersToCsv,xr as pullPrivacyRequests,Bt as pullTranscendConfiguration,Mt as pullUnstructuredSubDataPointRecommendations,Jn as pushCronIdentifiersFromCsv,ir as pushManualEnrichmentIdentifiersFromCsv,H as readCsv,Sr as readSafe,Je as readTranscendYaml,Er as removeLinks,Fn as removeUnverifiedRequestIdentifiers,qe as replaceVariablesInYaml,mn as restartPrivacyRequest,vn as retryRequestDataSilos,Xe as serializeTranscendYaml,gn as skipPreflightJobs,Pn as skipRequestDataSilos,W as splitDateRange,rn as streamPrivacyRequestFiles,yn as streamPrivacyRequestsToCsv,ln as submitPrivacyRequest,Zt as syncCodePackages,tt as syncConfigurationToTranscend,br as syncCookies,nt as syncDataSilos,Qt as updateCodePackages,In as updateConsentManagerVersionToLatest,$ as updateOrCreateCookies,Wn as uploadConsents,wr as uploadCookiesFromCsv,Cr as uploadDataFlowsFromCsv,Et as uploadPrivacyRequestsFromCsv,Zn as validateTranscendAuth,c as version,Dn as writeCsv,An as writeCsvSync,Mn as writeLargeCsv,Qe as writeTranscendYaml};
5
5
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/lib/graphql/syncCookies.ts","../src/lib/requests/pullPrivacyRequests.ts","../src/lib/helpers/readSafe.ts","../src/lib/api-keys/listDirectories.ts","../src/lib/ai/removeLinks.ts","../src/lib/ai/filterNullishValuesFromObject.ts","../src/lib/ai/getGitFilesThatChanged.ts"],"sourcesContent":["// import { keyBy } from 'lodash-es';\nimport {\n fetchConsentManagerId,\n makeGraphQLRequest,\n UPDATE_OR_CREATE_COOKIES,\n} from '@transcend-io/sdk';\nimport { mapSeries } from '@transcend-io/utils';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk } from 'lodash-es';\n\nimport { CookieInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\n\nconst MAX_PAGE_SIZE = 100;\n\n/**\n * Update or create cookies that already existed\n *\n * @param client - GraphQL client\n * @param cookieInputs - List of cookie input\n */\nexport async function updateOrCreateCookies(\n client: GraphQLClient,\n cookieInputs: CookieInput[],\n): Promise<void> {\n const airgapBundleId = await fetchConsentManagerId(client, { logger });\n\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // const purposes = await fetchAllPurposes(client);\n // const purposeNameToId = keyBy(purposes, 'name');\n\n await mapSeries(chunk(cookieInputs, MAX_PAGE_SIZE), async (page) => {\n await makeGraphQLRequest(client, UPDATE_OR_CREATE_COOKIES, {\n variables: {\n airgapBundleId,\n cookies: page.map((cookie) => ({\n name: cookie.name,\n trackingPurposes:\n cookie.trackingPurposes && cookie.trackingPurposes.length > 0\n ? cookie.trackingPurposes\n : undefined,\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // purposeIds: cookie.trackingPurposes\n // ? cookie.trackingPurposes\n // .filter((purpose) => purpose !== 'Unknown')\n // .map((purpose) => purposeNameToId[purpose].id)\n // : undefined,\n description: cookie.description,\n service: cookie.service,\n status: cookie.status,\n attributes: cookie.attributes,\n isRegex: cookie.isRegex,\n // TODO: https://transcend.height.app/T-23718\n // owners,\n // teams,\n })),\n },\n logger,\n });\n });\n}\n\n/**\n * Sync the set of cookies from the YML interface into the product\n *\n * @param client - GraphQL client\n * @param cookies - Cookies to sync\n * @returns True upon success, false upon failure\n */\nexport async function syncCookies(client: GraphQLClient, cookies: CookieInput[]): Promise<boolean> {\n let encounteredError = false;\n logger.info(colors.magenta(`Syncing \"${cookies.length}\" cookies...`));\n\n // Ensure no duplicates are being uploaded\n const notUnique = cookies.filter(\n (cookie) =>\n cookies.filter((cook) => cookie.name === cook.name && cookie.isRegex === cook.isRegex)\n .length > 1,\n );\n if (notUnique.length > 0) {\n throw new Error(\n `Failed to upload cookies as there were non-unique entries found: ${notUnique\n .map(({ name }) => name)\n .join(',')}`,\n );\n }\n\n try {\n logger.info(colors.magenta(`Upserting \"${cookies.length}\" new cookies...`));\n await updateOrCreateCookies(client, cookies);\n logger.info(colors.green(`Successfully synced ${cookies.length} cookies!`));\n } catch (err) {\n encounteredError = true;\n logger.error(colors.red(`Failed to create cookies! - ${err.message}`));\n }\n\n return !encounteredError;\n}\n","import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\nimport {\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n fetchAllRequestIdentifiers,\n validateSombraVersion,\n type RequestIdentifier,\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 { fetchAllRequests } from '../graphql/index.js';\nimport { formatRequestForCsv, CsvRow, ExportedPrivacyRequest } from './formatRequestForCsv.js';\nimport { splitDateRange } from './splitDateRange.js';\n\n/**\n * Pull down a list of privacy requests\n *\n * @param options - Options\n * @returns The requests with request identifiers and requests formatted for CSV\n */\nexport async function pullPrivacyRequests({\n auth,\n sombraAuth,\n actions = [],\n statuses = [],\n identifierSearch,\n pageLimit = 100,\n concurrency = 1,\n transcendUrl = DEFAULT_TRANSCEND_API,\n createdAtBefore,\n skipRequestIdentifiers = false,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n isTest,\n}: {\n /** Transcend API key authentication */\n auth: string;\n /** Search for a specific identifier */\n identifierSearch?: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Statuses to filter on */\n statuses?: RequestStatus[];\n /** The request action to fetch */\n actions?: RequestAction[];\n /** Page limit when fetching requests */\n pageLimit?: number;\n /** Number of parallel date-range chunks */\n concurrency?: number;\n /** Filter for requests created before this date */\n createdAtBefore?: Date;\n /** Filter for requests created after this date */\n createdAtAfter?: Date;\n /** Filter for requests updated before this date */\n updatedAtBefore?: Date;\n /** Filter for requests updated after this date */\n updatedAtAfter?: Date;\n /** Return test requests */\n isTest?: boolean;\n /** Skip fetching request identifier */\n skipRequestIdentifiers?: boolean;\n}): Promise<{\n /** All request information with attached identifiers */\n requestsWithRequestIdentifiers: ExportedPrivacyRequest[];\n /** Requests that are formatted for CSV */\n requestsFormattedForCsv: CsvRow[];\n}> {\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n const sombra = await createSombraGotInstance(transcendUrl, auth, {\n logger,\n sombraApiKey: sombraAuth,\n sombraUrl: process.env.SOMBRA_URL,\n });\n\n // Log date range\n let dateRange = '';\n if (createdAtBefore) {\n dateRange += ` before ${createdAtBefore.toISOString()}`;\n }\n if (createdAtAfter) {\n dateRange += `${dateRange ? ', and' : ''} after ${createdAtAfter.toISOString()}`;\n }\n logger.info(\n colors.magenta(\n `${\n actions.length > 0\n ? `Pulling requests of type \"${actions.join('\" , \"')}\"`\n : 'Pulling all requests'\n }${dateRange}`,\n ),\n );\n\n // Split into parallel date-range chunks when possible\n const useChunks = concurrency > 1 && createdAtAfter && createdAtBefore;\n const chunks = useChunks\n ? splitDateRange(createdAtAfter, createdAtBefore, concurrency)\n : [{ createdAtAfter, createdAtBefore }];\n\n if (useChunks) {\n logger.info(colors.magenta(`Splitting date range into ${concurrency} parallel chunks`));\n }\n\n // Fetch requests across all chunks in parallel\n const chunkResults = await map(\n chunks,\n (chunk) =>\n fetchAllRequests(client, {\n actions,\n text: identifierSearch,\n statuses,\n createdAtBefore: chunk.createdAtBefore,\n createdAtAfter: chunk.createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n isTest,\n }),\n { concurrency: useChunks ? concurrency : 1 },\n );\n const requests = chunkResults.flat();\n\n // Validate Sombra version once before bulk-fetching identifiers\n if (!skipRequestIdentifiers) {\n await validateSombraVersion(client, { logger });\n }\n\n // Fetch the request identifiers for those requests\n const requestsWithRequestIdentifiers = skipRequestIdentifiers\n ? requests.map((request) => ({\n ...request,\n requestIdentifiers: [] as RequestIdentifier[],\n }))\n : await map(\n requests,\n async (request) => {\n const requestIdentifiers = await fetchAllRequestIdentifiers(client, sombra, {\n filterBy: { requestId: request.id },\n skipSombraCheck: true,\n logger,\n });\n return {\n ...request,\n requestIdentifiers,\n };\n },\n {\n concurrency: pageLimit,\n },\n );\n\n logger.info(colors.magenta(`Pulled ${requestsWithRequestIdentifiers.length} requests`));\n\n const data = requestsWithRequestIdentifiers.map(formatRequestForCsv);\n\n return { requestsWithRequestIdentifiers, requestsFormattedForCsv: data };\n}\n","import { readFileSync } from 'node:fs';\n\n/**\n * Safely reads the contents of a file as a UTF-8 string.\n * Returns an empty string if the path is not provided or if reading fails.\n *\n * @param p - The path to the file to read.\n * @returns The file contents as a string, or an empty string on error.\n */\nexport function readSafe(p?: string): string {\n try {\n return p ? readFileSync(p, 'utf8') : '';\n } catch {\n return '';\n }\n}\n","import { readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * List the folders in a directory\n *\n * @param startDir - The base directory to list from\n * @returns The list of folders in that directory\n */\nexport function listDirectories(startDir: string): string[] {\n return readdirSync(startDir).filter((entryName) =>\n statSync(join(startDir, entryName)).isDirectory(),\n );\n}\n","/**\n * Remove links from a string\n *\n * @param inputString - String\n * @returns String without links\n */\nexport function removeLinks(inputString: string): string {\n const regex = /(https?:\\/\\/[^\\s]+)/g;\n return inputString.replace(regex, '<link-omitted>');\n}\n","import { ObjByString } from '@transcend-io/type-utils';\n\n/**\n * Given an object, remove all keys that are null-ish\n *\n * @param obj - Object\n * @returns Object with null-ish values removed\n */\nexport function filterNullishValuesFromObject<T extends ObjByString>(obj: T): T {\n return Object.entries(obj).reduce(\n (acc, [k, v]) =>\n v !== null &&\n v !== undefined &&\n v !== '' &&\n !(Array.isArray(v) && v.length === 0) &&\n !(typeof v === 'object' && Object.keys(v).length === 0)\n ? Object.assign(acc, { [k]: v })\n : acc,\n {} as T,\n );\n}\n","import { execSync } from 'child_process';\n\nimport fastGlob from 'fast-glob';\nimport { difference } from 'lodash-es';\n\n/**\n * Function thats gets the git files that have changed\n * and returns the code\n *\n * @param options - Options\n * @returns Changes files and diffs\n */\nexport function getGitFilesThatChanged({\n baseBranch,\n rootDirectory,\n githubRepo,\n excludedGlob = [],\n fileBlockList = [],\n}: {\n /** Base branch */\n baseBranch: string;\n /** Github repo name */\n githubRepo: string;\n /** Root directory */\n rootDirectory: string;\n /** A glob that excludes files */\n excludedGlob?: string[];\n /** Block list of files to not process */\n fileBlockList?: string[];\n}): {\n /** The list of files that changed */\n changedFiles: string[];\n /** Github repo name */\n repoName: string;\n /** Current commit */\n commit: string;\n /** File diffs */\n fileDiffs: { [k in string]: string };\n} {\n // Pull base branch\n execSync(`git fetch origin ${baseBranch}`);\n\n // Latest commit on base branch. If we are on the base branch, we take the prior commit\n const latestBasedCommit = execSync(\n `git ls-remote ${githubRepo} \"refs/heads/${baseBranch}\" | cut -f 1`,\n { encoding: 'utf-8' },\n ).split('\\n')[0];\n\n // This commit\n const latestThisCommit = execSync('git rev-parse HEAD', {\n encoding: 'utf-8',\n }).split('\\n')[0];\n\n // Ensure commits are present\n if (!latestBasedCommit || !latestThisCommit) {\n throw new Error('FAILED TO FIND COMMIT RANGE');\n }\n\n // Get the diff between the given branch and base branch\n const diff = execSync(\n `git fetch && git diff --name-only \"${\n baseBranch || latestBasedCommit\n }...${latestThisCommit}\" -- ${rootDirectory}`,\n { encoding: 'utf-8' },\n );\n\n // Filter out block list\n const changedFiles = difference(\n diff.split('\\n').filter((f) => f),\n fileBlockList,\n );\n\n // Filter out globs\n const filteredChanges =\n excludedGlob.length > 0 ? fastGlob.sync(changedFiles, { ignore: excludedGlob }) : changedFiles;\n\n // Get the contents of only the changed files\n const fileDiffs: { [k in string]: string } = {};\n filteredChanges.forEach((file) => {\n const contents = execSync(`git show ${latestThisCommit}:${file}`, {\n encoding: 'utf-8',\n });\n fileDiffs[file] = contents;\n });\n\n // Pull the github repo name\n const repoName = githubRepo.split('/').pop()!.split('.')[0];\n\n return {\n changedFiles,\n fileDiffs,\n repoName,\n commit: latestThisCommit,\n };\n}\n"],"mappings":"gpJAsBA,eAAsB,EACpB,EACA,EACe,CACf,IAAM,EAAiB,MAAM,GAAsB,EAAQ,CAAE,SAAQ,CAAC,CAMtE,MAAM,GAAU,GAAM,EAAc,IAAc,CAAE,KAAO,IAAS,CAClE,MAAM,GAAmB,EAAQ,GAA0B,CACzD,UAAW,CACT,iBACA,QAAS,EAAK,IAAK,IAAY,CAC7B,KAAM,EAAO,KACb,iBACE,EAAO,kBAAoB,EAAO,iBAAiB,OAAS,EACxD,EAAO,iBACP,IAAA,GAON,YAAa,EAAO,YACpB,QAAS,EAAO,QAChB,OAAQ,EAAO,OACf,WAAY,EAAO,WACnB,QAAS,EAAO,QAIjB,EAAE,CACJ,CACD,SACD,CAAC,EACF,CAUJ,eAAsB,GAAY,EAAuB,EAA0C,CACjG,IAAI,EAAmB,GACvB,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAQ,OAAO,cAAc,CAAC,CAGrE,IAAM,EAAY,EAAQ,OACvB,GACC,EAAQ,OAAQ,GAAS,EAAO,OAAS,EAAK,MAAQ,EAAO,UAAY,EAAK,QAAQ,CACnF,OAAS,EACf,CACD,GAAI,EAAU,OAAS,EACrB,MAAU,MACR,oEAAoE,EACjE,KAAK,CAAE,UAAW,EAAK,CACvB,KAAK,IAAI,GACb,CAGH,GAAI,CACF,EAAO,KAAK,EAAO,QAAQ,cAAc,EAAQ,OAAO,kBAAkB,CAAC,CAC3E,MAAM,EAAsB,EAAQ,EAAQ,CAC5C,EAAO,KAAK,EAAO,MAAM,uBAAuB,EAAQ,OAAO,WAAW,CAAC,OACpE,EAAK,CACZ,EAAmB,GACnB,EAAO,MAAM,EAAO,IAAI,+BAA+B,EAAI,UAAU,CAAC,CAGxE,MAAO,CAAC,EC1EV,eAAsB,GAAoB,CACxC,OACA,aACA,UAAU,EAAE,CACZ,WAAW,EAAE,CACb,mBACA,YAAY,IACZ,cAAc,EACd,eAAe,EACf,kBACA,yBAAyB,GACzB,iBACA,kBACA,iBACA,UAmCC,CACD,IAAM,EAAS,GAA4B,EAAc,EAAK,CACxD,EAAS,MAAM,GAAwB,EAAc,EAAM,CAC/D,SACA,aAAc,EACd,UAAW,QAAQ,IAAI,WACxB,CAAC,CAGE,EAAY,GACZ,IACF,GAAa,WAAW,EAAgB,aAAa,IAEnD,IACF,GAAa,GAAG,EAAY,QAAU,GAAG,SAAS,EAAe,aAAa,IAEhF,EAAO,KACL,EAAO,QACL,GACE,EAAQ,OAAS,EACb,6BAA6B,EAAQ,KAAK,QAAQ,CAAC,GACnD,yBACH,IACJ,CACF,CAGD,IAAM,EAAY,EAAc,GAAK,GAAkB,EACjD,EAAS,EACX,EAAe,EAAgB,EAAiB,EAAY,CAC5D,CAAC,CAAE,iBAAgB,kBAAiB,CAAC,CAErC,GACF,EAAO,KAAK,EAAO,QAAQ,6BAA6B,EAAY,kBAAkB,CAAC,CAmBzF,IAAM,GAAW,MAfU,EACzB,EACC,GACC,EAAiB,EAAQ,CACvB,UACA,KAAM,EACN,WACA,gBAAiB,EAAM,gBACvB,eAAgB,EAAM,eACtB,kBACA,iBACA,SACD,CAAC,CACJ,CAAE,YAAa,EAAY,EAAc,EAAG,CAC7C,EAC6B,MAAM,CAG/B,GACH,MAAM,GAAsB,EAAQ,CAAE,SAAQ,CAAC,CAIjD,IAAM,EAAiC,EACnC,EAAS,IAAK,IAAa,CACzB,GAAG,EACH,mBAAoB,EAAE,CACvB,EAAE,CACH,MAAM,EACJ,EACA,KAAO,IAAY,CACjB,IAAM,EAAqB,MAAM,GAA2B,EAAQ,EAAQ,CAC1E,SAAU,CAAE,UAAW,EAAQ,GAAI,CACnC,gBAAiB,GACjB,SACD,CAAC,CACF,MAAO,CACL,GAAG,EACH,qBACD,EAEH,CACE,YAAa,EACd,CACF,CAML,OAJA,EAAO,KAAK,EAAO,QAAQ,UAAU,EAA+B,OAAO,WAAW,CAAC,CAIhF,CAAE,iCAAgC,wBAF5B,EAA+B,IAAI,EAEsB,CAAE,CCtJ1E,SAAgB,GAAS,EAAoB,CAC3C,GAAI,CACF,OAAO,EAAI,GAAa,EAAG,OAAO,CAAG,QAC/B,CACN,MAAO,ICJX,SAAgB,GAAgB,EAA4B,CAC1D,OAAO,GAAY,EAAS,CAAC,OAAQ,GACnC,GAAS,EAAK,EAAU,EAAU,CAAC,CAAC,aAAa,CAClD,CCNH,SAAgB,GAAY,EAA6B,CAEvD,OAAO,EAAY,QAAQ,uBAAO,iBAAiB,CCArD,SAAgB,GAAqD,EAAW,CAC9E,OAAO,OAAO,QAAQ,EAAI,CAAC,QACxB,EAAK,CAAC,EAAG,KACR,GAAM,MAEN,IAAM,IACN,EAAE,MAAM,QAAQ,EAAE,EAAI,EAAE,SAAW,IACnC,EAAE,OAAO,GAAM,UAAY,OAAO,KAAK,EAAE,CAAC,SAAW,GACjD,OAAO,OAAO,EAAK,EAAG,GAAI,EAAG,CAAC,CAC9B,EACN,EAAE,CACH,CCPH,SAAgB,GAAuB,CACrC,aACA,gBACA,aACA,eAAe,EAAE,CACjB,gBAAgB,EAAE,EAqBlB,CAEA,EAAS,oBAAoB,IAAa,CAG1C,IAAM,EAAoB,EACxB,iBAAiB,EAAW,eAAe,EAAW,cACtD,CAAE,SAAU,QAAS,CACtB,CAAC,MAAM;EAAK,CAAC,GAGR,EAAmB,EAAS,qBAAsB,CACtD,SAAU,QACX,CAAC,CAAC,MAAM;EAAK,CAAC,GAGf,GAAI,CAAC,GAAqB,CAAC,EACzB,MAAU,MAAM,8BAA8B,CAYhD,IAAM,EAAe,GARR,EACX,sCACE,GAAc,EACf,KAAK,EAAiB,OAAO,IAC9B,CAAE,SAAU,QAAS,CAKjB,CAAC,MAAM;EAAK,CAAC,OAAQ,GAAM,EAAE,CACjC,EACD,CAGK,EACJ,EAAa,OAAS,EAAI,GAAS,KAAK,EAAc,CAAE,OAAQ,EAAc,CAAC,CAAG,EAG9E,EAAuC,EAAE,CAW/C,OAVA,EAAgB,QAAS,GAAS,CAIhC,EAAU,GAHO,EAAS,YAAY,EAAiB,GAAG,IAAQ,CAChE,SAAU,QACX,CACyB,EAC1B,CAKK,CACL,eACA,YACA,SALe,EAAW,MAAM,IAAI,CAAC,KAAK,CAAE,MAAM,IAAI,CAAC,GAMvD,OAAQ,EACT"}
1
+ {"version":3,"file":"index.mjs","names":["syncCookies"],"sources":["../src/lib/graphql/syncCookies.ts","../src/lib/requests/pullPrivacyRequests.ts","../src/lib/helpers/readSafe.ts","../src/lib/consent-manager/uploadDataFlowsFromCsv.ts","../src/lib/consent-manager/uploadCookiesFromCsv.ts","../src/lib/api-keys/listDirectories.ts","../src/lib/ai/removeLinks.ts","../src/lib/ai/filterNullishValuesFromObject.ts","../src/lib/ai/getGitFilesThatChanged.ts"],"sourcesContent":["// import { keyBy } from 'lodash-es';\nimport {\n fetchConsentManagerId,\n makeGraphQLRequest,\n UPDATE_OR_CREATE_COOKIES,\n} from '@transcend-io/sdk';\nimport { mapSeries } from '@transcend-io/utils';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk } from 'lodash-es';\n\nimport { CookieInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\n\nconst MAX_PAGE_SIZE = 100;\n\n/**\n * Update or create cookies that already existed\n *\n * @param client - GraphQL client\n * @param cookieInputs - List of cookie input\n */\nexport async function updateOrCreateCookies(\n client: GraphQLClient,\n cookieInputs: CookieInput[],\n): Promise<void> {\n const airgapBundleId = await fetchConsentManagerId(client, { logger });\n\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // const purposes = await fetchAllPurposes(client);\n // const purposeNameToId = keyBy(purposes, 'name');\n\n await mapSeries(chunk(cookieInputs, MAX_PAGE_SIZE), async (page) => {\n await makeGraphQLRequest(client, UPDATE_OR_CREATE_COOKIES, {\n variables: {\n airgapBundleId,\n cookies: page.map((cookie) => ({\n name: cookie.name,\n trackingPurposes:\n cookie.trackingPurposes && cookie.trackingPurposes.length > 0\n ? cookie.trackingPurposes\n : undefined,\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // purposeIds: cookie.trackingPurposes\n // ? cookie.trackingPurposes\n // .filter((purpose) => purpose !== 'Unknown')\n // .map((purpose) => purposeNameToId[purpose].id)\n // : undefined,\n description: cookie.description,\n service: cookie.service,\n status: cookie.status,\n attributes: cookie.attributes,\n isRegex: cookie.isRegex,\n // TODO: https://transcend.height.app/T-23718\n // owners,\n // teams,\n })),\n },\n logger,\n });\n });\n}\n\n/**\n * Sync the set of cookies from the YML interface into the product\n *\n * @param client - GraphQL client\n * @param cookies - Cookies to sync\n * @returns True upon success, false upon failure\n */\nexport async function syncCookies(client: GraphQLClient, cookies: CookieInput[]): Promise<boolean> {\n let encounteredError = false;\n logger.info(colors.magenta(`Syncing \"${cookies.length}\" cookies...`));\n\n // Ensure no duplicates are being uploaded\n const notUnique = cookies.filter(\n (cookie) =>\n cookies.filter((cook) => cookie.name === cook.name && cookie.isRegex === cook.isRegex)\n .length > 1,\n );\n if (notUnique.length > 0) {\n throw new Error(\n `Failed to upload cookies as there were non-unique entries found: ${notUnique\n .map(({ name }) => name)\n .join(',')}`,\n );\n }\n\n try {\n logger.info(colors.magenta(`Upserting \"${cookies.length}\" new cookies...`));\n await updateOrCreateCookies(client, cookies);\n logger.info(colors.green(`Successfully synced ${cookies.length} cookies!`));\n } catch (err) {\n encounteredError = true;\n logger.error(colors.red(`Failed to create cookies! - ${err.message}`));\n }\n\n return !encounteredError;\n}\n","import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\nimport {\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n fetchAllRequestIdentifiers,\n validateSombraVersion,\n type RequestIdentifier,\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 { fetchAllRequests } from '../graphql/index.js';\nimport { formatRequestForCsv, CsvRow, ExportedPrivacyRequest } from './formatRequestForCsv.js';\nimport { splitDateRange } from './splitDateRange.js';\n\n/**\n * Pull down a list of privacy requests\n *\n * @param options - Options\n * @returns The requests with request identifiers and requests formatted for CSV\n */\nexport async function pullPrivacyRequests({\n auth,\n sombraAuth,\n actions = [],\n statuses = [],\n identifierSearch,\n pageLimit = 100,\n concurrency = 1,\n transcendUrl = DEFAULT_TRANSCEND_API,\n createdAtBefore,\n skipRequestIdentifiers = false,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n isTest,\n}: {\n /** Transcend API key authentication */\n auth: string;\n /** Search for a specific identifier */\n identifierSearch?: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Statuses to filter on */\n statuses?: RequestStatus[];\n /** The request action to fetch */\n actions?: RequestAction[];\n /** Page limit when fetching requests */\n pageLimit?: number;\n /** Number of parallel date-range chunks */\n concurrency?: number;\n /** Filter for requests created before this date */\n createdAtBefore?: Date;\n /** Filter for requests created after this date */\n createdAtAfter?: Date;\n /** Filter for requests updated before this date */\n updatedAtBefore?: Date;\n /** Filter for requests updated after this date */\n updatedAtAfter?: Date;\n /** Return test requests */\n isTest?: boolean;\n /** Skip fetching request identifier */\n skipRequestIdentifiers?: boolean;\n}): Promise<{\n /** All request information with attached identifiers */\n requestsWithRequestIdentifiers: ExportedPrivacyRequest[];\n /** Requests that are formatted for CSV */\n requestsFormattedForCsv: CsvRow[];\n}> {\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n const sombra = await createSombraGotInstance(transcendUrl, auth, {\n logger,\n sombraApiKey: sombraAuth,\n sombraUrl: process.env.SOMBRA_URL,\n });\n\n // Log date range\n let dateRange = '';\n if (createdAtBefore) {\n dateRange += ` before ${createdAtBefore.toISOString()}`;\n }\n if (createdAtAfter) {\n dateRange += `${dateRange ? ', and' : ''} after ${createdAtAfter.toISOString()}`;\n }\n logger.info(\n colors.magenta(\n `${\n actions.length > 0\n ? `Pulling requests of type \"${actions.join('\" , \"')}\"`\n : 'Pulling all requests'\n }${dateRange}`,\n ),\n );\n\n // Split into parallel date-range chunks when possible\n const useChunks = concurrency > 1 && createdAtAfter && createdAtBefore;\n const chunks = useChunks\n ? splitDateRange(createdAtAfter, createdAtBefore, concurrency)\n : [{ createdAtAfter, createdAtBefore }];\n\n if (useChunks) {\n logger.info(colors.magenta(`Splitting date range into ${concurrency} parallel chunks`));\n }\n\n // Fetch requests across all chunks in parallel\n const chunkResults = await map(\n chunks,\n (chunk) =>\n fetchAllRequests(client, {\n actions,\n text: identifierSearch,\n statuses,\n createdAtBefore: chunk.createdAtBefore,\n createdAtAfter: chunk.createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n isTest,\n }),\n { concurrency: useChunks ? concurrency : 1 },\n );\n const requests = chunkResults.flat();\n\n // Validate Sombra version once before bulk-fetching identifiers\n if (!skipRequestIdentifiers) {\n await validateSombraVersion(client, { logger });\n }\n\n // Fetch the request identifiers for those requests\n const requestsWithRequestIdentifiers = skipRequestIdentifiers\n ? requests.map((request) => ({\n ...request,\n requestIdentifiers: [] as RequestIdentifier[],\n }))\n : await map(\n requests,\n async (request) => {\n const requestIdentifiers = await fetchAllRequestIdentifiers(client, sombra, {\n filterBy: { requestId: request.id },\n skipSombraCheck: true,\n logger,\n });\n return {\n ...request,\n requestIdentifiers,\n };\n },\n {\n concurrency: pageLimit,\n },\n );\n\n logger.info(colors.magenta(`Pulled ${requestsWithRequestIdentifiers.length} requests`));\n\n const data = requestsWithRequestIdentifiers.map(formatRequestForCsv);\n\n return { requestsWithRequestIdentifiers, requestsFormattedForCsv: data };\n}\n","import { readFileSync } from 'node:fs';\n\n/** Reads a UTF-8 file from disk. */\ntype ReadUtf8File = (path: string, encoding: 'utf8') => string;\n\n/**\n * Safely reads the contents of a file as a UTF-8 string.\n * Returns an empty string if the path is not provided or if reading fails.\n *\n * @param p - The path to the file to read.\n * @param readFile - File reader dependency.\n * @returns The file contents as a string, or an empty string on error.\n */\nexport function readSafe(p?: string, readFile: ReadUtf8File = readFileSync): string {\n try {\n return p ? readFile(p, 'utf8') : '';\n } catch {\n return '';\n }\n}\n","import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport { buildTranscendGraphQLClient, syncDataFlows } from '@transcend-io/sdk';\nimport colors from 'colors';\n\nimport { DataFlowCsvInput } from '../../codecs.js';\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { readCsv } from '../requests/readCsv.js';\nimport { mapDataFlowCsvRowsToInputs } from './mapConsentCsvRowsToInputs.js';\n\n/**\n * Upload a set of data flows from CSV\n *\n * @param options - Options\n */\nexport async function uploadDataFlowsFromCsv({\n auth,\n trackerStatus,\n file,\n classifyService = false,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** Sombra API key authentication */\n trackerStatus: ConsentTrackerStatus;\n /** classify data flow service if missing */\n classifyService?: boolean;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<void> {\n // Build a GraphQL client\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Read from CSV the set of data flow inputs\n logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const dataFlowInputs = readCsv(file, DataFlowCsvInput);\n\n const validatedDataFlowInputs = mapDataFlowCsvRowsToInputs(dataFlowInputs, trackerStatus);\n\n // Upload the data flows into Transcend dashboard\n const syncedDataFlows = await syncDataFlows(client, validatedDataFlowInputs, {\n classifyService,\n logger,\n });\n\n // Log errors\n if (!syncedDataFlows) {\n logger.error(\n colors.red(\n 'Encountered error(s) syncing data flows from CSV, see logs above for more info. ',\n ),\n );\n process.exit(1);\n }\n}\n","import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport { buildTranscendGraphQLClient, syncCookies } from '@transcend-io/sdk';\nimport colors from 'colors';\n\nimport { CookieCsvInput } from '../../codecs.js';\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { readCsv } from '../requests/readCsv.js';\nimport { mapCookieCsvRowsToInputs } from './mapConsentCsvRowsToInputs.js';\n\n/**\n * Upload a set of cookies from CSV\n *\n * @param options - Options\n */\nexport async function uploadCookiesFromCsv({\n auth,\n trackerStatus,\n file,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** Sombra API key authentication */\n trackerStatus: ConsentTrackerStatus;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<void> {\n // Build a GraphQL client\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Read from CSV the set of cookie inputs\n logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const cookieInputs = readCsv(file, CookieCsvInput);\n\n const validatedCookieInputs = mapCookieCsvRowsToInputs(cookieInputs, trackerStatus);\n\n // Upload the cookies into Transcend dashboard\n const syncedCookies = await syncCookies(client, validatedCookieInputs, { logger });\n\n // Log errors\n if (!syncedCookies) {\n logger.error(\n colors.red('Encountered error(s) syncing cookies from CSV, see logs above for more info. '),\n );\n process.exit(1);\n }\n}\n","import { readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * List the folders in a directory\n *\n * @param startDir - The base directory to list from\n * @returns The list of folders in that directory\n */\nexport function listDirectories(startDir: string): string[] {\n return readdirSync(startDir).filter((entryName) =>\n statSync(join(startDir, entryName)).isDirectory(),\n );\n}\n","/**\n * Remove links from a string\n *\n * @param inputString - String\n * @returns String without links\n */\nexport function removeLinks(inputString: string): string {\n const regex = /(https?:\\/\\/[^\\s]+)/g;\n return inputString.replace(regex, '<link-omitted>');\n}\n","import { ObjByString } from '@transcend-io/type-utils';\n\n/**\n * Given an object, remove all keys that are null-ish\n *\n * @param obj - Object\n * @returns Object with null-ish values removed\n */\nexport function filterNullishValuesFromObject<T extends ObjByString>(obj: T): T {\n return Object.entries(obj).reduce(\n (acc, [k, v]) =>\n v !== null &&\n v !== undefined &&\n v !== '' &&\n !(Array.isArray(v) && v.length === 0) &&\n !(typeof v === 'object' && Object.keys(v).length === 0)\n ? Object.assign(acc, { [k]: v })\n : acc,\n {} as T,\n );\n}\n","import { execSync } from 'child_process';\n\nimport fastGlob from 'fast-glob';\nimport { difference } from 'lodash-es';\n\n/**\n * Function thats gets the git files that have changed\n * and returns the code\n *\n * @param options - Options\n * @returns Changes files and diffs\n */\nexport function getGitFilesThatChanged({\n baseBranch,\n rootDirectory,\n githubRepo,\n excludedGlob = [],\n fileBlockList = [],\n}: {\n /** Base branch */\n baseBranch: string;\n /** Github repo name */\n githubRepo: string;\n /** Root directory */\n rootDirectory: string;\n /** A glob that excludes files */\n excludedGlob?: string[];\n /** Block list of files to not process */\n fileBlockList?: string[];\n}): {\n /** The list of files that changed */\n changedFiles: string[];\n /** Github repo name */\n repoName: string;\n /** Current commit */\n commit: string;\n /** File diffs */\n fileDiffs: { [k in string]: string };\n} {\n // Pull base branch\n execSync(`git fetch origin ${baseBranch}`);\n\n // Latest commit on base branch. If we are on the base branch, we take the prior commit\n const latestBasedCommit = execSync(\n `git ls-remote ${githubRepo} \"refs/heads/${baseBranch}\" | cut -f 1`,\n { encoding: 'utf-8' },\n ).split('\\n')[0];\n\n // This commit\n const latestThisCommit = execSync('git rev-parse HEAD', {\n encoding: 'utf-8',\n }).split('\\n')[0];\n\n // Ensure commits are present\n if (!latestBasedCommit || !latestThisCommit) {\n throw new Error('FAILED TO FIND COMMIT RANGE');\n }\n\n // Get the diff between the given branch and base branch\n const diff = execSync(\n `git fetch && git diff --name-only \"${\n baseBranch || latestBasedCommit\n }...${latestThisCommit}\" -- ${rootDirectory}`,\n { encoding: 'utf-8' },\n );\n\n // Filter out block list\n const changedFiles = difference(\n diff.split('\\n').filter((f) => f),\n fileBlockList,\n );\n\n // Filter out globs\n const filteredChanges =\n excludedGlob.length > 0 ? fastGlob.sync(changedFiles, { ignore: excludedGlob }) : changedFiles;\n\n // Get the contents of only the changed files\n const fileDiffs: { [k in string]: string } = {};\n filteredChanges.forEach((file) => {\n const contents = execSync(`git show ${latestThisCommit}:${file}`, {\n encoding: 'utf-8',\n });\n fileDiffs[file] = contents;\n });\n\n // Pull the github repo name\n const repoName = githubRepo.split('/').pop()!.split('.')[0];\n\n return {\n changedFiles,\n fileDiffs,\n repoName,\n commit: latestThisCommit,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import e from"colors";import{bootstrap as t}from"global-agent";import{ProxyAgent as n,setGlobalDispatcher as r}from"undici";import i from"yargs-parser";const a={bootstrap:t,createProxyAgent:e=>new n(e),logger:console,process,setGlobalDispatcher:r};function o(t=a){let{httpProxy:n=t.process.env.http_proxy}=i(t.process.argv.slice(2));n&&(t.logger.info(e.green(`Initializing proxy: ${n}`)),t.process.env.GLOBAL_AGENT_HTTP_PROXY=n,t.bootstrap(),t.setGlobalDispatcher(t.createProxyAgent(n)))}export{o as t};
2
+ //# sourceMappingURL=initializeCliRuntime-B7zDhMok.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initializeCliRuntime-B7zDhMok.mjs","names":[],"sources":["../src/lib/cli/initializeCliRuntime.ts"],"sourcesContent":["import colors from 'colors';\nimport { bootstrap } from 'global-agent';\nimport { ProxyAgent, type Dispatcher, setGlobalDispatcher } from 'undici';\nimport yargs from 'yargs-parser';\n\nimport type { CliLogger } from '../../context.js';\n\n/** Runtime dependencies used to initialize CLI proxy support. */\nexport interface InitializeCliRuntimeDependencies {\n /** Bootstrap proxy support for Node.js request clients. */\n readonly bootstrap: () => void;\n /** Create a dispatcher that routes fetch requests through a proxy. */\n readonly createProxyAgent: (httpProxy: string) => Dispatcher;\n /** Logger used to report proxy initialization. */\n readonly logger: Pick<CliLogger, 'info'>;\n /** Process arguments and environment used to resolve proxy configuration. */\n readonly process: Pick<NodeJS.Process, 'argv' | 'env'>;\n /** Set the dispatcher used by Node.js fetch. */\n readonly setGlobalDispatcher: (dispatcher: Dispatcher) => void;\n}\n\nconst defaultDependencies: InitializeCliRuntimeDependencies = {\n bootstrap,\n createProxyAgent: (httpProxy) => new ProxyAgent(httpProxy),\n logger: console,\n process,\n setGlobalDispatcher,\n};\n\n/**\n * Initialize process-wide proxy support for an executable CLI invocation.\n *\n * @param dependencies - Runtime operations used to configure proxy support.\n */\nexport function initializeCliRuntime(\n dependencies: InitializeCliRuntimeDependencies = defaultDependencies,\n): void {\n const { httpProxy = dependencies.process.env.http_proxy } = yargs(\n dependencies.process.argv.slice(2),\n );\n if (!httpProxy) {\n return;\n }\n\n dependencies.logger.info(colors.green(`Initializing proxy: ${httpProxy}`));\n\n // Use global-agent, which overrides `request` based requests.\n dependencies.process.env.GLOBAL_AGENT_HTTP_PROXY = httpProxy;\n dependencies.bootstrap();\n\n // Use undici, which overrides `fetch` based requests.\n dependencies.setGlobalDispatcher(dependencies.createProxyAgent(httpProxy));\n}\n"],"mappings":"wJAqBA,MAAM,EAAwD,CAC5D,YACA,iBAAmB,GAAc,IAAI,EAAW,EAAU,CAC1D,OAAQ,QACR,QACA,sBACD,CAOD,SAAgB,EACd,EAAiD,EAC3C,CACN,GAAM,CAAE,YAAY,EAAa,QAAQ,IAAI,YAAe,EAC1D,EAAa,QAAQ,KAAK,MAAM,EAAE,CACnC,CACI,IAIL,EAAa,OAAO,KAAK,EAAO,MAAM,uBAAuB,IAAY,CAAC,CAG1E,EAAa,QAAQ,IAAI,wBAA0B,EACnD,EAAa,WAAW,CAGxB,EAAa,oBAAoB,EAAa,iBAAiB,EAAU,CAAC"}
@@ -1,2 +1,2 @@
1
- import{n as e}from"./fuzzyMatchColumns-C1STZ_T1.mjs";import t from"inquirer";import n from"inquirer-autocomplete-prompt";async function r({message:e}){let{response:n}=await t.prompt([{name:`response`,message:e,type:`confirm`}]);return n}async function i({message:e}){let{response:n}=await t.prompt([{name:`response`,message:e,type:`text`,validate:e=>e.trim().length>0}]);return n}async function a({defaultValue:r,values:i,message:a}){t.registerPrompt(`autocomplete`,n);let{response:o}=await t.prompt([{name:`response`,message:a,type:`autocomplete`,default:r,source:(t,n)=>n?i.filter(t=>typeof t==`string`&&e(n,t)):i}]);return o}export{r as n,i as r,a as t};
2
- //# sourceMappingURL=inquirer-B0OF_nRe.mjs.map
1
+ import{n as e}from"./fuzzyMatchColumns-BDD4a2W0.mjs";import t from"inquirer";import n from"inquirer-autocomplete-prompt";async function r({message:e}){let{response:n}=await t.prompt([{name:`response`,message:e,type:`confirm`}]);return n}async function i({message:e}){let{response:n}=await t.prompt([{name:`response`,message:e,type:`text`,validate:e=>e.trim().length>0}]);return n}async function a({defaultValue:r,values:i,message:a}){t.registerPrompt(`autocomplete`,n);let{response:o}=await t.prompt([{name:`response`,message:a,type:`autocomplete`,default:r,source:(t,n)=>n?i.filter(t=>typeof t==`string`&&e(n,t)):i}]);return o}export{r as n,i as r,a as t};
2
+ //# sourceMappingURL=inquirer-DNa31Mkx.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"inquirer-B0OF_nRe.mjs","names":[],"sources":["../src/lib/helpers/inquirer.ts"],"sourcesContent":["import { ObjByString } from '@transcend-io/type-utils';\nimport inquirer from 'inquirer';\nimport autoCompletePrompt from 'inquirer-autocomplete-prompt';\n\nimport { fuzzySearch } from '../requests/index.js';\n\n/**\n * Inquirer confirm text\n *\n * @param options - Options\n * @returns The response\n */\nexport async function inquirerConfirmBoolean({\n message,\n}: {\n /** Message */\n message: string;\n}): Promise<boolean> {\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: boolean;\n }>([\n {\n name: 'response',\n message,\n type: 'confirm',\n },\n ]);\n return response;\n}\n\n/**\n * Inquirer confirm text\n *\n * @param options - Options\n * @returns The response\n */\nexport async function inquirerConfirmText({\n message,\n}: {\n /** Message */\n message: string;\n}): Promise<string> {\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: string;\n }>([\n {\n name: 'response',\n message,\n type: 'text',\n validate: (x) => x.trim().length > 0,\n },\n ]);\n return response;\n}\n\n/**\n * Inquirer auto complete\n *\n * @param options - Options\n * @returns The response\n */\nexport async function inquirerAutoComplete({\n defaultValue,\n values,\n message,\n}: {\n /** Default value */\n defaultValue?: string;\n /** Message */\n message: string;\n /** Values to select */\n values: string[];\n}): Promise<string> {\n inquirer.registerPrompt('autocomplete', autoCompletePrompt);\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: string;\n }>([\n {\n name: 'response',\n message,\n type: 'autocomplete',\n default: defaultValue,\n source: (answersSoFar: ObjByString, input: string) =>\n !input ? values : values.filter((x) => typeof x === 'string' && fuzzySearch(input, x)),\n },\n ]);\n return response;\n}\n"],"mappings":"yHAYA,eAAsB,EAAuB,CAC3C,WAImB,CACnB,GAAM,CAAE,YAAa,MAAM,EAAS,OAGjC,CACD,CACE,KAAM,WACN,UACA,KAAM,UACP,CACF,CAAC,CACF,OAAO,EAST,eAAsB,EAAoB,CACxC,WAIkB,CAClB,GAAM,CAAE,YAAa,MAAM,EAAS,OAGjC,CACD,CACE,KAAM,WACN,UACA,KAAM,OACN,SAAW,GAAM,EAAE,MAAM,CAAC,OAAS,EACpC,CACF,CAAC,CACF,OAAO,EAST,eAAsB,EAAqB,CACzC,eACA,SACA,WAQkB,CAClB,EAAS,eAAe,eAAgB,EAAmB,CAC3D,GAAM,CAAE,YAAa,MAAM,EAAS,OAGjC,CACD,CACE,KAAM,WACN,UACA,KAAM,eACN,QAAS,EACT,QAAS,EAA2B,IACjC,EAAiB,EAAO,OAAQ,GAAM,OAAO,GAAM,UAAY,EAAY,EAAO,EAAE,CAAC,CAA7E,EACZ,CACF,CAAC,CACF,OAAO"}
1
+ {"version":3,"file":"inquirer-DNa31Mkx.mjs","names":[],"sources":["../src/lib/helpers/inquirer.ts"],"sourcesContent":["import { ObjByString } from '@transcend-io/type-utils';\nimport inquirer from 'inquirer';\nimport autoCompletePrompt from 'inquirer-autocomplete-prompt';\n\nimport { fuzzySearch } from '../requests/index.js';\n\n/**\n * Inquirer confirm text\n *\n * @param options - Options\n * @returns The response\n */\nexport async function inquirerConfirmBoolean({\n message,\n}: {\n /** Message */\n message: string;\n}): Promise<boolean> {\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: boolean;\n }>([\n {\n name: 'response',\n message,\n type: 'confirm',\n },\n ]);\n return response;\n}\n\n/**\n * Inquirer confirm text\n *\n * @param options - Options\n * @returns The response\n */\nexport async function inquirerConfirmText({\n message,\n}: {\n /** Message */\n message: string;\n}): Promise<string> {\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: string;\n }>([\n {\n name: 'response',\n message,\n type: 'text',\n validate: (x) => x.trim().length > 0,\n },\n ]);\n return response;\n}\n\n/**\n * Inquirer auto complete\n *\n * @param options - Options\n * @returns The response\n */\nexport async function inquirerAutoComplete({\n defaultValue,\n values,\n message,\n}: {\n /** Default value */\n defaultValue?: string;\n /** Message */\n message: string;\n /** Values to select */\n values: string[];\n}): Promise<string> {\n inquirer.registerPrompt('autocomplete', autoCompletePrompt);\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: string;\n }>([\n {\n name: 'response',\n message,\n type: 'autocomplete',\n default: defaultValue,\n source: (answersSoFar: ObjByString, input: string) =>\n !input ? values : values.filter((x) => typeof x === 'string' && fuzzySearch(input, x)),\n },\n ]);\n return response;\n}\n"],"mappings":"yHAYA,eAAsB,EAAuB,CAC3C,WAImB,CACnB,GAAM,CAAE,YAAa,MAAM,EAAS,OAGjC,CACD,CACE,KAAM,WACN,UACA,KAAM,UACP,CACF,CAAC,CACF,OAAO,EAST,eAAsB,EAAoB,CACxC,WAIkB,CAClB,GAAM,CAAE,YAAa,MAAM,EAAS,OAGjC,CACD,CACE,KAAM,WACN,UACA,KAAM,OACN,SAAW,GAAM,EAAE,MAAM,CAAC,OAAS,EACpC,CACF,CAAC,CACF,OAAO,EAST,eAAsB,EAAqB,CACzC,eACA,SACA,WAQkB,CAClB,EAAS,eAAe,eAAgB,EAAmB,CAC3D,GAAM,CAAE,YAAa,MAAM,EAAS,OAGjC,CACD,CACE,KAAM,WACN,UACA,KAAM,eACN,QAAS,EACT,QAAS,EAA2B,IACjC,EAAiB,EAAO,OAAQ,GAAM,OAAO,GAAM,UAAY,EAAY,EAAO,EAAE,CAAC,CAA7E,EACZ,CACF,CAAC,CACF,OAAO"}
@@ -0,0 +1,2 @@
1
+ import{existsSync as e,readdirSync as t}from"node:fs";function n(e,t,n=!1){let r=e.filter(e=>t?t.some(t=>e.endsWith(t)):!0).filter(e=>e.indexOf(`.`)>0);return n?r.map(e=>e.replace(/\.[^/.]+$/,``)):r}function r(r,i,a=!1){return e(r)?n(t(r),i,a):[]}export{r as n,n as t};
2
+ //# sourceMappingURL=listFiles-DrxRhlZ2.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listFiles-DrxRhlZ2.mjs","names":[],"sources":["../src/lib/api-keys/listFiles.ts"],"sourcesContent":["import { existsSync, readdirSync } from 'node:fs';\n\n/**\n * Filter directory entry names to files recognized by the CLI.\n *\n * @param entries - Directory entry names.\n * @param validExtensions - The list of valid extensions.\n * @param removeExtensions - When true, remove extensions from returned names.\n * @returns Filtered file names.\n */\nexport function filterFileNames(\n entries: string[],\n validExtensions?: string[],\n removeExtensions = false,\n): string[] {\n const files = entries\n .filter((file) =>\n validExtensions ? validExtensions.some((extension) => file.endsWith(extension)) : true,\n )\n .filter((file) => file.indexOf('.') > 0);\n\n return removeExtensions ? files.map((file) => file.replace(/\\.[^/.]+$/, '')) : files;\n}\n\n/**\n * List the files in a directory\n *\n * ```typescript\n * // The directory to search\n * const directory = '/User/test/transcend/my-app/app/containers';\n * // Returns ['test.js']\n * listFiles(directory);\n * ```\n *\n * @param directory - The directory to search\n * @param validExtensions - The list of valid extensions\n * @param removeExtensions - When true, remove the extensions from the listed files\n * @returns The list of files in the directory\n */\nexport function listFiles(\n directory: string,\n validExtensions?: string[],\n removeExtensions = false,\n): string[] {\n if (!existsSync(directory)) {\n return [];\n }\n\n return filterFileNames(readdirSync(directory), validExtensions, removeExtensions);\n}\n"],"mappings":"sDAUA,SAAgB,EACd,EACA,EACA,EAAmB,GACT,CACV,IAAM,EAAQ,EACX,OAAQ,GACP,EAAkB,EAAgB,KAAM,GAAc,EAAK,SAAS,EAAU,CAAC,CAAG,GACnF,CACA,OAAQ,GAAS,EAAK,QAAQ,IAAI,CAAG,EAAE,CAE1C,OAAO,EAAmB,EAAM,IAAK,GAAS,EAAK,QAAQ,YAAa,GAAG,CAAC,CAAG,EAkBjF,SAAgB,EACd,EACA,EACA,EAAmB,GACT,CAKV,OAJK,EAAW,EAAU,CAInB,EAAgB,EAAY,EAAU,CAAE,EAAiB,EAAiB,CAHxE,EAAE"}
@@ -0,0 +1,2 @@
1
+ const e=console;export{e as t};
2
+ //# sourceMappingURL=logger-CB_h_zbj.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-CB_h_zbj.mjs","names":[],"sources":["../src/logger.ts"],"sourcesContent":["export const logger = console;\n"],"mappings":"AAAA,MAAa,EAAS"}
@@ -0,0 +1,2 @@
1
+ import{splitCsvToList as e}from"@transcend-io/utils";const t=new Set([`ID`,`Activity`,`Encounters`,`Last Seen At`,`Has Native Do Not Sell/Share Support`,`IAB USP API Support`,`Service`,`Service Description`,`Website URL`,`Categories of Recipients`]);function n(n){return Object.entries(n).filter(e=>e[1]!==void 0&&!t.has(e[0])).map(([t,n])=>({key:t,values:e(n)}))}function r(t,r){return t.map(({"Is Regex?":t,Notes:i,Purpose:a,Status:o,Owners:s,Teams:c,Name:l,...u})=>({...typeof t==`string`?{isRegex:t.toLowerCase()===`true`}:{},name:l,description:i,trackingPurposes:e(a),status:o||r,owners:s?e(s):void 0,teams:c?e(c):void 0,attributes:n(u)}))}function i(t,r){return t.map(({Type:t,Notes:i,Purpose:a,Status:o,Owners:s,Teams:c,"Connections Made To":l,...u})=>({value:l,type:t,description:i,trackingPurposes:e(a),status:o||r,owners:s?e(s):void 0,teams:c?e(c):void 0,attributes:n(u)}))}export{i as n,r as t};
2
+ //# sourceMappingURL=mapConsentCsvRowsToInputs-DA7BRD7M.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapConsentCsvRowsToInputs-DA7BRD7M.mjs","names":[],"sources":["../src/lib/consent-manager/mapConsentCsvRowsToInputs.ts"],"sourcesContent":["import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport { splitCsvToList } from '@transcend-io/utils';\n\nimport type { CookieCsvInput, CookieInput, DataFlowCsvInput, DataFlowInput } from '../../codecs.js';\n\nconst OMITTED_CONSENT_CSV_COLUMNS = new Set([\n 'ID',\n 'Activity',\n 'Encounters',\n 'Last Seen At',\n 'Has Native Do Not Sell/Share Support',\n 'IAB USP API Support',\n 'Service',\n 'Service Description',\n 'Website URL',\n 'Categories of Recipients',\n]);\n\n/**\n * Convert remaining CSV columns into custom attributes.\n *\n * @param columns - Columns not consumed by the native input fields.\n * @returns Custom attribute inputs.\n */\nfunction mapCustomAttributes(\n columns: Record<string, string | undefined>,\n): Array<{ key: string; values: string[] }> {\n return Object.entries(columns)\n .filter(\n (entry): entry is [string, string] =>\n entry[1] !== undefined && !OMITTED_CONSENT_CSV_COLUMNS.has(entry[0]),\n )\n .map(([key, value]) => ({\n key,\n values: splitCsvToList(value),\n }));\n}\n\n/**\n * Convert decoded cookie CSV rows into API inputs.\n *\n * @param rows - Decoded cookie CSV rows.\n * @param trackerStatus - Default status for rows without a status.\n * @returns Cookie API inputs.\n */\nexport function mapCookieCsvRowsToInputs(\n rows: CookieCsvInput[],\n trackerStatus: ConsentTrackerStatus,\n): CookieInput[] {\n return rows.map(\n ({\n 'Is Regex?': isRegex,\n Notes,\n Purpose,\n Status,\n Owners,\n Teams,\n Name,\n ...rest\n }): CookieInput => ({\n ...(typeof isRegex === 'string' ? { isRegex: isRegex.toLowerCase() === 'true' } : {}),\n name: Name,\n description: Notes,\n trackingPurposes: splitCsvToList(Purpose),\n status: Status || trackerStatus,\n owners: Owners ? splitCsvToList(Owners) : undefined,\n teams: Teams ? splitCsvToList(Teams) : undefined,\n attributes: mapCustomAttributes(rest),\n }),\n );\n}\n\n/**\n * Convert decoded data flow CSV rows into API inputs.\n *\n * @param rows - Decoded data flow CSV rows.\n * @param trackerStatus - Default status for rows without a status.\n * @returns Data flow API inputs.\n */\nexport function mapDataFlowCsvRowsToInputs(\n rows: DataFlowCsvInput[],\n trackerStatus: ConsentTrackerStatus,\n): DataFlowInput[] {\n return rows.map(\n ({\n Type,\n Notes,\n Purpose,\n Status,\n Owners,\n Teams,\n 'Connections Made To': value,\n ...rest\n }): DataFlowInput => ({\n value,\n type: Type,\n description: Notes,\n trackingPurposes: splitCsvToList(Purpose),\n status: Status || trackerStatus,\n owners: Owners ? splitCsvToList(Owners) : undefined,\n teams: Teams ? splitCsvToList(Teams) : undefined,\n attributes: mapCustomAttributes(rest),\n }),\n );\n}\n"],"mappings":"qDAKA,MAAM,EAA8B,IAAI,IAAI,CAC1C,KACA,WACA,aACA,eACA,uCACA,sBACA,UACA,sBACA,cACA,2BACD,CAAC,CAQF,SAAS,EACP,EAC0C,CAC1C,OAAO,OAAO,QAAQ,EAAQ,CAC3B,OACE,GACC,EAAM,KAAO,IAAA,IAAa,CAAC,EAA4B,IAAI,EAAM,GAAG,CACvE,CACA,KAAK,CAAC,EAAK,MAAY,CACtB,MACA,OAAQ,EAAe,EAAM,CAC9B,EAAE,CAUP,SAAgB,EACd,EACA,EACe,CACf,OAAO,EAAK,KACT,CACC,YAAa,EACb,QACA,UACA,SACA,SACA,QACA,OACA,GAAG,MACe,CAClB,GAAI,OAAO,GAAY,SAAW,CAAE,QAAS,EAAQ,aAAa,GAAK,OAAQ,CAAG,EAAE,CACpF,KAAM,EACN,YAAa,EACb,iBAAkB,EAAe,EAAQ,CACzC,OAAQ,GAAU,EAClB,OAAQ,EAAS,EAAe,EAAO,CAAG,IAAA,GAC1C,MAAO,EAAQ,EAAe,EAAM,CAAG,IAAA,GACvC,WAAY,EAAoB,EAAK,CACtC,EACF,CAUH,SAAgB,EACd,EACA,EACiB,CACjB,OAAO,EAAK,KACT,CACC,OACA,QACA,UACA,SACA,SACA,QACA,sBAAuB,EACvB,GAAG,MACiB,CACpB,QACA,KAAM,EACN,YAAa,EACb,iBAAkB,EAAe,EAAQ,CACzC,OAAQ,GAAU,EAClB,OAAQ,EAAS,EAAe,EAAO,CAAG,IAAA,GAC1C,MAAO,EAAQ,EAAe,EAAM,CAAG,IAAA,GACvC,WAAY,EAAoB,EAAK,CACtC,EACF"}
@@ -1,2 +1,2 @@
1
- import{a as e}from"./constants-DyD22MtN.mjs";import{t}from"./logger-Ckep4QXn.mjs";import{RequestDataSiloStatus as n}from"@transcend-io/privacy-types";import r from"colors";import{CHANGE_REQUEST_DATA_SILO_STATUS as i,buildTranscendGraphQLClient as a,fetchRequestDataSilo as o,makeGraphQLRequest as s}from"@transcend-io/sdk";import{map as c}from"@transcend-io/utils";import l from"cli-progress";async function u({requestIds:u,dataSiloId:d,auth:f,concurrency:p=100,status:m=n.Resolved,transcendUrl:h=e}){let g=a(h,f),_=new Date().getTime(),v=new l.SingleBar({},l.Presets.shades_classic);t.info(r.magenta(`Notifying Transcend for data silo "${d}" marking "${u.length}" requests as completed.`));let y=0;v.start(u.length,0),await c(u,async e=>{let n=await o(g,{logger:t,filterBy:{requestId:e,dataSiloId:d}});try{await s(g,i,{variables:{requestDataSiloId:n.id,status:m},logger:t})}catch(e){if(!e.message.includes(`Client error: Request must be active:`)&&!e.message.includes(`Failed to find RequestDataSilo`))throw e}y+=1,v.update(y)},{concurrency:p}),v.stop();let b=new Date().getTime()-_;return t.info(r.green(`Successfully notified Transcend in "${b/1e3}" seconds!`)),u.length}export{u as t};
2
- //# sourceMappingURL=markRequestDataSiloIdsCompleted-CcJGKOn4.mjs.map
1
+ import{a as e}from"./constants-CdgK1myP.mjs";import{t}from"./logger-CB_h_zbj.mjs";import{RequestDataSiloStatus as n}from"@transcend-io/privacy-types";import r from"colors";import{CHANGE_REQUEST_DATA_SILO_STATUS as i,buildTranscendGraphQLClient as a,fetchRequestDataSilo as o,makeGraphQLRequest as s}from"@transcend-io/sdk";import{map as c}from"@transcend-io/utils";import l from"cli-progress";async function u({requestIds:u,dataSiloId:d,auth:f,concurrency:p=100,status:m=n.Resolved,transcendUrl:h=e}){let g=a(h,f),_=new Date().getTime(),v=new l.SingleBar({},l.Presets.shades_classic);t.info(r.magenta(`Notifying Transcend for data silo "${d}" marking "${u.length}" requests as completed.`));let y=0;v.start(u.length,0),await c(u,async e=>{let n=await o(g,{logger:t,filterBy:{requestId:e,dataSiloId:d}});try{await s(g,i,{variables:{requestDataSiloId:n.id,status:m},logger:t})}catch(e){if(!e.message.includes(`Client error: Request must be active:`)&&!e.message.includes(`Failed to find RequestDataSilo`))throw e}y+=1,v.update(y)},{concurrency:p}),v.stop();let b=new Date().getTime()-_;return t.info(r.green(`Successfully notified Transcend in "${b/1e3}" seconds!`)),u.length}export{u as t};
2
+ //# sourceMappingURL=markRequestDataSiloIdsCompleted-CK7PNwTz.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"markRequestDataSiloIdsCompleted-CcJGKOn4.mjs","names":[],"sources":["../src/lib/cron/markRequestDataSiloIdsCompleted.ts"],"sourcesContent":["import { RequestDataSiloStatus } from '@transcend-io/privacy-types';\nimport {\n buildTranscendGraphQLClient,\n makeGraphQLRequest,\n CHANGE_REQUEST_DATA_SILO_STATUS,\n fetchRequestDataSilo,\n} from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\n\n/**\n * Given a CSV of Request IDs, mark associated RequestDataSilos as completed\n *\n * @param options - Options\n * @returns Number of items marked as completed\n */\nexport async function markRequestDataSiloIdsCompleted({\n requestIds,\n dataSiloId,\n auth,\n concurrency = 100,\n status = RequestDataSiloStatus.Resolved,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** The list of request ids to mark as completed */\n requestIds: string[];\n /** Transcend API key authentication */\n auth: string;\n /** Data Silo ID to pull down jobs for */\n dataSiloId: string;\n /** Status to update requests to */\n status?: RequestDataSiloStatus;\n /** Upload concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<number> {\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Notify Transcend\n logger.info(\n colors.magenta(\n `Notifying Transcend for data silo \"${dataSiloId}\" marking \"${requestIds.length}\" requests as completed.`,\n ),\n );\n\n let total = 0;\n progressBar.start(requestIds.length, 0);\n await map(\n requestIds,\n async (requestId) => {\n const requestDataSilo = await fetchRequestDataSilo(client, {\n logger,\n filterBy: { requestId, dataSiloId },\n });\n\n try {\n await makeGraphQLRequest<{\n /** Whether we successfully uploaded the results */\n success: boolean;\n }>(client, CHANGE_REQUEST_DATA_SILO_STATUS, {\n variables: {\n requestDataSiloId: requestDataSilo.id,\n status,\n },\n logger,\n });\n } catch (err) {\n if (\n !err.message.includes('Client error: Request must be active:') &&\n !err.message.includes('Failed to find RequestDataSilo')\n ) {\n throw err;\n }\n }\n\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(colors.green(`Successfully notified Transcend in \"${totalTime / 1000}\" seconds!`));\n return requestIds.length;\n}\n"],"mappings":"yYAoBA,eAAsB,EAAgC,CACpD,aACA,aACA,OACA,cAAc,IACd,SAAS,EAAsB,SAC/B,eAAe,GAcG,CAElB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAGrF,EAAO,KACL,EAAO,QACL,sCAAsC,EAAW,aAAa,EAAW,OAAO,0BACjF,CACF,CAED,IAAI,EAAQ,EACZ,EAAY,MAAM,EAAW,OAAQ,EAAE,CACvC,MAAM,EACJ,EACA,KAAO,IAAc,CACnB,IAAM,EAAkB,MAAM,EAAqB,EAAQ,CACzD,SACA,SAAU,CAAE,YAAW,aAAY,CACpC,CAAC,CAEF,GAAI,CACF,MAAM,EAGH,EAAQ,EAAiC,CAC1C,UAAW,CACT,kBAAmB,EAAgB,GACnC,SACD,CACD,SACD,CAAC,OACK,EAAK,CACZ,GACE,CAAC,EAAI,QAAQ,SAAS,wCAAwC,EAC9D,CAAC,EAAI,QAAQ,SAAS,iCAAiC,CAEvD,MAAM,EAIV,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAGvB,OADA,EAAO,KAAK,EAAO,MAAM,uCAAuC,EAAY,IAAK,YAAY,CAAC,CACvF,EAAW"}
1
+ {"version":3,"file":"markRequestDataSiloIdsCompleted-CK7PNwTz.mjs","names":[],"sources":["../src/lib/cron/markRequestDataSiloIdsCompleted.ts"],"sourcesContent":["import { RequestDataSiloStatus } from '@transcend-io/privacy-types';\nimport {\n buildTranscendGraphQLClient,\n makeGraphQLRequest,\n CHANGE_REQUEST_DATA_SILO_STATUS,\n fetchRequestDataSilo,\n} from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\n\n/**\n * Given a CSV of Request IDs, mark associated RequestDataSilos as completed\n *\n * @param options - Options\n * @returns Number of items marked as completed\n */\nexport async function markRequestDataSiloIdsCompleted({\n requestIds,\n dataSiloId,\n auth,\n concurrency = 100,\n status = RequestDataSiloStatus.Resolved,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** The list of request ids to mark as completed */\n requestIds: string[];\n /** Transcend API key authentication */\n auth: string;\n /** Data Silo ID to pull down jobs for */\n dataSiloId: string;\n /** Status to update requests to */\n status?: RequestDataSiloStatus;\n /** Upload concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<number> {\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Notify Transcend\n logger.info(\n colors.magenta(\n `Notifying Transcend for data silo \"${dataSiloId}\" marking \"${requestIds.length}\" requests as completed.`,\n ),\n );\n\n let total = 0;\n progressBar.start(requestIds.length, 0);\n await map(\n requestIds,\n async (requestId) => {\n const requestDataSilo = await fetchRequestDataSilo(client, {\n logger,\n filterBy: { requestId, dataSiloId },\n });\n\n try {\n await makeGraphQLRequest<{\n /** Whether we successfully uploaded the results */\n success: boolean;\n }>(client, CHANGE_REQUEST_DATA_SILO_STATUS, {\n variables: {\n requestDataSiloId: requestDataSilo.id,\n status,\n },\n logger,\n });\n } catch (err) {\n if (\n !err.message.includes('Client error: Request must be active:') &&\n !err.message.includes('Failed to find RequestDataSilo')\n ) {\n throw err;\n }\n }\n\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(colors.green(`Successfully notified Transcend in \"${totalTime / 1000}\" seconds!`));\n return requestIds.length;\n}\n"],"mappings":"yYAoBA,eAAsB,EAAgC,CACpD,aACA,aACA,OACA,cAAc,IACd,SAAS,EAAsB,SAC/B,eAAe,GAcG,CAElB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAGrF,EAAO,KACL,EAAO,QACL,sCAAsC,EAAW,aAAa,EAAW,OAAO,0BACjF,CACF,CAED,IAAI,EAAQ,EACZ,EAAY,MAAM,EAAW,OAAQ,EAAE,CACvC,MAAM,EACJ,EACA,KAAO,IAAc,CACnB,IAAM,EAAkB,MAAM,EAAqB,EAAQ,CACzD,SACA,SAAU,CAAE,YAAW,aAAY,CACpC,CAAC,CAEF,GAAI,CACF,MAAM,EAGH,EAAQ,EAAiC,CAC1C,UAAW,CACT,kBAAmB,EAAgB,GACnC,SACD,CACD,SACD,CAAC,OACK,EAAK,CACZ,GACE,CAAC,EAAI,QAAQ,SAAS,wCAAwC,EAC9D,CAAC,EAAI,QAAQ,SAAS,iCAAiC,CAEvD,MAAM,EAIV,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAGvB,OADA,EAAO,KAAK,EAAO,MAAM,uCAAuC,EAAY,IAAK,YAAY,CAAC,CACvF,EAAW"}
@@ -1,2 +1,2 @@
1
- import{a as e}from"./constants-DyD22MtN.mjs";import{t}from"./logger-Ckep4QXn.mjs";import{o as n}from"./request-BIplTb3L.mjs";import{r}from"./fetchAllRequests-DP24WqrP.mjs";import{RequestStatus as i}from"@transcend-io/privacy-types";import a from"colors";import{buildTranscendGraphQLClient as o,makeGraphQLRequest as s}from"@transcend-io/sdk";import{map as c}from"@transcend-io/utils";import l from"cli-progress";async function u({requestActions:u,auth:d,requestIds:f,statuses:p=[i.Compiling,i.RequestMade,i.Delayed,i.Approving,i.Secondary,i.Enriching,i.Waiting,i.SecondaryApproving],createdAtAfter:m,createdAtBefore:h,updatedAtBefore:g,updatedAtAfter:_,concurrency:v=100,transcendUrl:y=e}){let b=o(y,d),x=new Date().getTime(),S=new l.SingleBar({},l.Presets.shades_classic),C=await r(b,{actions:u,statuses:p,createdAtBefore:h,createdAtAfter:m,updatedAtBefore:g,updatedAtAfter:_,isSilent:!1,requestIds:f});t.info(a.magenta(`Marking "${C.length}" as silent mode.`));let w=0;S.start(C.length,0),await c(C,async e=>{await s(b,n,{variables:{input:{id:e.id,isSilent:!0}},logger:t}),w+=1,S.update(w)},{concurrency:v}),S.stop();let T=new Date().getTime()-x;return t.info(a.green(`Successfully marked ${w} requests as silent mode in "${T/1e3}" seconds!`)),C.length}export{u as t};
2
- //# sourceMappingURL=markSilentPrivacyRequests-CVxwueuH.mjs.map
1
+ import{a as e}from"./constants-CdgK1myP.mjs";import{t}from"./logger-CB_h_zbj.mjs";import{o as n}from"./request-CCCU2SdV.mjs";import{r}from"./fetchAllRequests-DUQGTJjx.mjs";import{RequestStatus as i}from"@transcend-io/privacy-types";import a from"colors";import{buildTranscendGraphQLClient as o,makeGraphQLRequest as s}from"@transcend-io/sdk";import{map as c}from"@transcend-io/utils";import l from"cli-progress";async function u({requestActions:u,auth:d,requestIds:f,statuses:p=[i.Compiling,i.RequestMade,i.Delayed,i.Approving,i.Secondary,i.Enriching,i.Waiting,i.SecondaryApproving],createdAtAfter:m,createdAtBefore:h,updatedAtBefore:g,updatedAtAfter:_,concurrency:v=100,transcendUrl:y=e}){let b=o(y,d),x=new Date().getTime(),S=new l.SingleBar({},l.Presets.shades_classic),C=await r(b,{actions:u,statuses:p,createdAtBefore:h,createdAtAfter:m,updatedAtBefore:g,updatedAtAfter:_,isSilent:!1,requestIds:f});t.info(a.magenta(`Marking "${C.length}" as silent mode.`));let w=0;S.start(C.length,0),await c(C,async e=>{await s(b,n,{variables:{input:{id:e.id,isSilent:!0}},logger:t}),w+=1,S.update(w)},{concurrency:v}),S.stop();let T=new Date().getTime()-x;return t.info(a.green(`Successfully marked ${w} requests as silent mode in "${T/1e3}" seconds!`)),C.length}export{u as t};
2
+ //# sourceMappingURL=markSilentPrivacyRequests-Cb-J9ckA.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"markSilentPrivacyRequests-CVxwueuH.mjs","names":[],"sources":["../src/lib/requests/markSilentPrivacyRequests.ts"],"sourcesContent":["import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\nimport { buildTranscendGraphQLClient, makeGraphQLRequest } from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { UPDATE_PRIVACY_REQUEST, fetchAllRequests } from '../graphql/index.js';\n\n/**\n * Mark a set of privacy requests to be in silent mode\n *\n * @param options - Options\n * @returns The number of requests marked silent\n */\nexport async function markSilentPrivacyRequests({\n requestActions,\n auth,\n requestIds,\n statuses = [\n RequestStatus.Compiling,\n RequestStatus.RequestMade,\n RequestStatus.Delayed,\n RequestStatus.Approving,\n RequestStatus.Secondary,\n RequestStatus.Enriching,\n RequestStatus.Waiting,\n RequestStatus.SecondaryApproving,\n ],\n createdAtAfter,\n createdAtBefore,\n updatedAtBefore,\n updatedAtAfter,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** The request actions that should be restarted */\n requestActions: RequestAction[];\n /** Transcend API key authentication */\n auth: string;\n /** Concurrency limit for approving */\n concurrency?: number;\n /** The request statuses to mark silent */\n statuses?: RequestStatus[];\n /** The set of privacy requests to mark silent */\n requestIds?: string[];\n /** Filter for requests created before this date */\n createdAtBefore?: Date;\n /** Filter for requests created after this date */\n createdAtAfter?: Date;\n /** Filter for requests updated before this date */\n updatedAtBefore?: Date;\n /** Filter for requests updated after this date */\n updatedAtAfter?: Date;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<number> {\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Pull in the requests\n const allRequests = await fetchAllRequests(client, {\n actions: requestActions,\n statuses,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n isSilent: false,\n requestIds,\n });\n\n // Notify Transcend\n logger.info(colors.magenta(`Marking \"${allRequests.length}\" as silent mode.`));\n\n let total = 0;\n progressBar.start(allRequests.length, 0);\n await map(\n allRequests,\n async (requestToMarkSilent) => {\n await makeGraphQLRequest(client, UPDATE_PRIVACY_REQUEST, {\n variables: {\n input: {\n id: requestToMarkSilent.id,\n isSilent: true,\n },\n },\n logger,\n });\n\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(\n colors.green(\n `Successfully marked ${total} requests as silent mode in \"${totalTime / 1000}\" seconds!`,\n ),\n );\n return allRequests.length;\n}\n"],"mappings":"4ZAgBA,eAAsB,EAA0B,CAC9C,iBACA,OACA,aACA,WAAW,CACT,EAAc,UACd,EAAc,YACd,EAAc,QACd,EAAc,UACd,EAAc,UACd,EAAc,UACd,EAAc,QACd,EAAc,mBACf,CACD,iBACA,kBACA,kBACA,iBACA,cAAc,IACd,eAAe,GAsBG,CAElB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAG/E,EAAc,MAAM,EAAiB,EAAQ,CACjD,QAAS,EACT,WACA,kBACA,iBACA,kBACA,iBACA,SAAU,GACV,aACD,CAAC,CAGF,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAY,OAAO,mBAAmB,CAAC,CAE9E,IAAI,EAAQ,EACZ,EAAY,MAAM,EAAY,OAAQ,EAAE,CACxC,MAAM,EACJ,EACA,KAAO,IAAwB,CAC7B,MAAM,EAAmB,EAAQ,EAAwB,CACvD,UAAW,CACT,MAAO,CACL,GAAI,EAAoB,GACxB,SAAU,GACX,CACF,CACD,SACD,CAAC,CAEF,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAOvB,OALA,EAAO,KACL,EAAO,MACL,uBAAuB,EAAM,+BAA+B,EAAY,IAAK,YAC9E,CACF,CACM,EAAY"}
1
+ {"version":3,"file":"markSilentPrivacyRequests-Cb-J9ckA.mjs","names":[],"sources":["../src/lib/requests/markSilentPrivacyRequests.ts"],"sourcesContent":["import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\nimport { buildTranscendGraphQLClient, makeGraphQLRequest } from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { UPDATE_PRIVACY_REQUEST, fetchAllRequests } from '../graphql/index.js';\n\n/**\n * Mark a set of privacy requests to be in silent mode\n *\n * @param options - Options\n * @returns The number of requests marked silent\n */\nexport async function markSilentPrivacyRequests({\n requestActions,\n auth,\n requestIds,\n statuses = [\n RequestStatus.Compiling,\n RequestStatus.RequestMade,\n RequestStatus.Delayed,\n RequestStatus.Approving,\n RequestStatus.Secondary,\n RequestStatus.Enriching,\n RequestStatus.Waiting,\n RequestStatus.SecondaryApproving,\n ],\n createdAtAfter,\n createdAtBefore,\n updatedAtBefore,\n updatedAtAfter,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** The request actions that should be restarted */\n requestActions: RequestAction[];\n /** Transcend API key authentication */\n auth: string;\n /** Concurrency limit for approving */\n concurrency?: number;\n /** The request statuses to mark silent */\n statuses?: RequestStatus[];\n /** The set of privacy requests to mark silent */\n requestIds?: string[];\n /** Filter for requests created before this date */\n createdAtBefore?: Date;\n /** Filter for requests created after this date */\n createdAtAfter?: Date;\n /** Filter for requests updated before this date */\n updatedAtBefore?: Date;\n /** Filter for requests updated after this date */\n updatedAtAfter?: Date;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<number> {\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Pull in the requests\n const allRequests = await fetchAllRequests(client, {\n actions: requestActions,\n statuses,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n isSilent: false,\n requestIds,\n });\n\n // Notify Transcend\n logger.info(colors.magenta(`Marking \"${allRequests.length}\" as silent mode.`));\n\n let total = 0;\n progressBar.start(allRequests.length, 0);\n await map(\n allRequests,\n async (requestToMarkSilent) => {\n await makeGraphQLRequest(client, UPDATE_PRIVACY_REQUEST, {\n variables: {\n input: {\n id: requestToMarkSilent.id,\n isSilent: true,\n },\n },\n logger,\n });\n\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(\n colors.green(\n `Successfully marked ${total} requests as silent mode in \"${totalTime / 1000}\" seconds!`,\n ),\n );\n return allRequests.length;\n}\n"],"mappings":"4ZAgBA,eAAsB,EAA0B,CAC9C,iBACA,OACA,aACA,WAAW,CACT,EAAc,UACd,EAAc,YACd,EAAc,QACd,EAAc,UACd,EAAc,UACd,EAAc,UACd,EAAc,QACd,EAAc,mBACf,CACD,iBACA,kBACA,kBACA,iBACA,cAAc,IACd,eAAe,GAsBG,CAElB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAG/E,EAAc,MAAM,EAAiB,EAAQ,CACjD,QAAS,EACT,WACA,kBACA,iBACA,kBACA,iBACA,SAAU,GACV,aACD,CAAC,CAGF,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAY,OAAO,mBAAmB,CAAC,CAE9E,IAAI,EAAQ,EACZ,EAAY,MAAM,EAAY,OAAQ,EAAE,CACxC,MAAM,EACJ,EACA,KAAO,IAAwB,CAC7B,MAAM,EAAmB,EAAQ,EAAwB,CACvD,UAAW,CACT,MAAO,CACL,GAAI,EAAoB,GACxB,SAAU,GACX,CACF,CACD,SACD,CAAC,CAEF,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAOvB,OALA,EAAO,KACL,EAAO,MACL,uBAAuB,EAAM,+BAA+B,EAAY,IAAK,YAC9E,CACF,CACM,EAAY"}
@@ -1,3 +1,3 @@
1
- import{t as e}from"./logger-Ckep4QXn.mjs";import{chunk as t,difference as n,flatten as r,keyBy as i,uniq as a}from"lodash-es";import o from"colors";import{apply as s,getEntries as c}from"@transcend-io/type-utils";import{CREATE_DATA_SILOS as l,UPDATE_DATA_SILOS as u,UPDATE_OR_CREATE_DATA_POINT as d,convertToDataSubjectBlockList as f,createDataSubject as p,fetchAllActions as m,fetchAllAttributes as h,fetchAllDataSilos as g,fetchAllDataSubjects as _,fetchApiKeys as v,fetchIdentifiersAndCreateMissing as y,makeGraphQLRequest as b,syncAction as x,syncActionItemCollections as S,syncActionItems as C,syncAttribute as w,syncBusinessEntities as T,syncConsentManager as ee,syncConsentWorkflowTriggers as te,syncCookies as ne,syncDataCategories as re,syncDataFlows as ie,syncDataSiloDependencies as ae,syncDataSubject as oe,syncEnricher as se,syncIdentifier as ce,syncIntlMessages as le,syncPartitions as ue,syncPolicies as de,syncPreferenceOptionValues as fe,syncPreferenceTopics as pe,syncPrivacyCenter as me,syncProcessingActivities as he,syncProcessingPurposes as ge,syncPurposes as _e,syncTeams as ve,syncTemplate as ye,syncVendors as be,syncWorkflowConfigs as xe}from"@transcend-io/sdk";import{map as E,mapSeries as D}from"@transcend-io/utils";import O from"cli-progress";const k=/^[A-Za-z]+$/;function Se(e){let t=[],n=(e,n)=>{k.test(e)||t.push(`${n}: slug "${e}" is invalid — slugs must contain only alphabetical letters (A-Z, a-z). Topic slugs are normalized to PascalCase server-side, so YAML slugs should already be PascalCase or matching will break on subsequent pulls.`)};for(let t of e[`preference-options`]??[])n(t.slug,`preference-options`);for(let t of e.purposes??[])for(let e of t[`preference-topics`]??[]){n(e.slug,`purposes (topic "${e.title}")`);for(let t of e.options??[])n(t.slug,`purposes (topic "${e.title}" option "${t.title}")`)}return t}async function A({"data-silos":t=[],"data-subjects":s=[],"processing-activities":c=[],enrichers:l=[]},u,d=!1){let f=a([...r(t.map(e=>e[`data-subjects`]||[])||[]),...r(c.map(({dataSubjectTypes:e})=>e??[])??[]),...r(l.map(e=>e[`data-subjects`]||[])||[]),...s.map(e=>e.type)]);if(f.length===0&&!d)return{};let m=await _(u,{logger:e}),h=i(m,`type`),g=n(f,m.map(({type:e})=>e));if(g.length>0){e.info(o.magenta(`Creating ${g.length} new data subjects...`));for(let t of g){e.info(o.magenta(`Creating data subject ${t}...`));let n=await p(u,{input:t,logger:e});e.info(o.green(`Created data subject ${t}!`)),h[t]=n}}return h}function Ce(e,t){if(e.length===0)return[];if(typeof e[0]==`string`)return[{titles:a(e)}];let n,r=[],i=new Set,o=(e,n)=>{if(i.has(e))throw Error(`Data silo "${t}" has multiple deletion-dependencies entries for workflow "${e}". Combine them into a single entry.`);i.add(e),r.push({workflowConfigInternalName:e,...n})};return e.forEach(e=>{if(`reset-to-global`in e&&`titles`in e)throw Error(`Data silo "${t}" has a deletion-dependencies entry for workflow "${e.workflow}" that sets both "reset-to-global" and "titles". Use "titles: []" to override the global configuration with no dependencies, or "reset-to-global: true" to fall back to the global configuration.`);if(`reset-to-global`in e){o(e.workflow,{resetToGlobal:!0});return}if(e.workflow){o(e.workflow,{titles:e.titles});return}if(n!==void 0)throw Error(`Data silo "${t}" has multiple global deletion-dependencies entries. Combine them into a single \`{ titles: [...] }\` entry.`);n=e.titles}),[...n===void 0?[]:[{titles:a(n)}],...r]}async function j(n,r,{pageSize:a,dataSubjectsByName:c,apiKeysByTitle:p}){let m=!1,h=new Date().getTime();e.info(o.magenta(`Syncing "${n.length}" data silos...`));let _=i(await g(r,{titles:n.map(({title:e})=>e),pageSize:a,logger:e}),`title`),v=n.filter(({title:e})=>!_[e]);v.length>0&&(e.info(o.magenta(`Creating "${v.length}" data silos that did not exist...`)),await D(t(v,20),async t=>{let{createDataSilos:{dataSilos:n}}=await b(r,l,{variables:{input:t.map(e=>({name:e[`outer-type`]||e.integrationName,title:e.title,country:e.country,countrySubDivision:e.countrySubDivision,sombraId:e[`sombra-id`]}))},logger:e});n.forEach(e=>{_[e.title]=e})}),e.info(o.green(`Successfully created "${v.length}" data silos!`)));let y=t(n,20);await D(y,async(t,n)=>{e.info(o.magenta(`[Batch ${n+1}/${y.length}] Syncing "${t.length}" data silos`)),await b(r,u,{variables:{input:{dataSilos:t.map(e=>({id:_[e.title].id,country:e.country,countrySubDivision:e.countrySubDivision,url:e.url,headers:e.headers,description:e.description,identifiers:e[`identity-keys`],isLive:!e.disabled,ownerEmails:e.owners,teamNames:e.teams,dependedOnDataSilos:e[`deletion-dependencies`]?void 0:[{titles:[]}],apiKeyId:e[`api-key-title`]?p[e[`api-key-title`]].id:void 0,dataSubjectBlockListIds:e[`data-subjects`]?f(e[`data-subjects`],c):void 0,attributes:e.attributes,businessEntityTitles:e.businessEntityTitles,sombraId:e[`sombra-id`],notifyEmailAddress:e[`email-settings`]?.[`notify-email-address`],promptAVendorEmailSendFrequency:e[`email-settings`]?.[`send-frequency`],promptAVendorEmailSendType:e[`email-settings`]?.[`send-type`],promptAVendorEmailIncludeIdentifiersAttachment:e[`email-settings`]?.[`include-identifiers-attachment`],promptAVendorEmailCompletionLinkType:e[`email-settings`]?.[`completion-link-type`],manualWorkRetryFrequency:e[`email-settings`]?.[`manual-work-retry-frequency`]}))}},logger:e}),e.info(o.green(`[Batch ${n+1}/${y.length}] Synced "${t.length}" data silos!`))});let x=new O.SingleBar({},O.Presets.shades_classic),S=n.filter(({datapoints:e=[]})=>e.length>0),C=n.map(({datapoints:e=[]})=>e.length).reduce((e,t)=>e+t,0);e.info(o.magenta(`Syncing "${C}" datapoints from "${S.length}" data silos...`)),x.start(C,0);let w=0;await E(S,async({datapoints:t,title:n})=>{t&&await D(t,async t=>{let i=t.fields?t.fields.map(({key:e,description:t,categories:n,purposes:r,attributes:i,...a})=>({name:e,description:t,categories:n?n.map(e=>({...e,name:e.name||`Other`})):void 0,purposes:r?r.map(e=>({...e,name:e.name||`Other`})):void 0,attributes:i,accessRequestVisibilityEnabled:a[`access-request-visibility-enabled`],erasureRequestRedactionEnabled:a[`erasure-request-redaction-enabled`]})):void 0,a={dataSiloId:_[n].id,path:t.path,name:t.key,title:t.title,description:t.description,...t.owners?{ownerEmails:t.owners}:{},...t.teams?{teamNames:t.teams}:{},...t[`data-collection-tag`]?{dataCollectionTag:t[`data-collection-tag`]}:{},querySuggestions:t[`privacy-action-queries`]?Object.entries(t[`privacy-action-queries`]).map(([e,t])=>({requestType:e,suggestedQuery:t})):void 0,enabledActions:t[`privacy-actions`]||[],subDataPoints:i},s=(a.subDataPoints||[]).map(({name:e})=>e),c=s.filter((e,t)=>s.indexOf(e)!==t);if(c.length>0)e.info(o.red(`\nCannot update datapoint "${t.key}" as it has duplicate sub-datapoints with the same name: \n${c.join(`
1
+ import{t as e}from"./logger-CB_h_zbj.mjs";import{chunk as t,difference as n,flatten as r,keyBy as i,uniq as a}from"lodash-es";import o from"colors";import{apply as s,getEntries as c}from"@transcend-io/type-utils";import{CREATE_DATA_SILOS as l,UPDATE_DATA_SILOS as u,UPDATE_OR_CREATE_DATA_POINT as d,convertToDataSubjectBlockList as f,createDataSubject as p,fetchAllActions as m,fetchAllAttributes as h,fetchAllDataSilos as g,fetchAllDataSubjects as _,fetchApiKeys as v,fetchIdentifiersAndCreateMissing as y,makeGraphQLRequest as b,syncAction as x,syncActionItemCollections as S,syncActionItems as C,syncAttribute as w,syncBusinessEntities as T,syncConsentManager as ee,syncConsentWorkflowTriggers as te,syncCookies as ne,syncDataCategories as re,syncDataFlows as ie,syncDataSiloDependencies as ae,syncDataSubject as oe,syncEnricher as se,syncIdentifier as ce,syncIntlMessages as le,syncPartitions as ue,syncPolicies as de,syncPreferenceOptionValues as fe,syncPreferenceTopics as pe,syncPrivacyCenter as me,syncProcessingActivities as he,syncProcessingPurposes as ge,syncPurposes as _e,syncTeams as ve,syncTemplate as ye,syncVendors as be,syncWorkflowConfigs as xe}from"@transcend-io/sdk";import{map as E,mapSeries as D}from"@transcend-io/utils";import O from"cli-progress";const k=/^[A-Za-z]+$/;function Se(e){let t=[],n=(e,n)=>{k.test(e)||t.push(`${n}: slug "${e}" is invalid — slugs must contain only alphabetical letters (A-Z, a-z). Topic slugs are normalized to PascalCase server-side, so YAML slugs should already be PascalCase or matching will break on subsequent pulls.`)};for(let t of e[`preference-options`]??[])n(t.slug,`preference-options`);for(let t of e.purposes??[])for(let e of t[`preference-topics`]??[]){n(e.slug,`purposes (topic "${e.title}")`);for(let t of e.options??[])n(t.slug,`purposes (topic "${e.title}" option "${t.title}")`)}return t}async function A({"data-silos":t=[],"data-subjects":s=[],"processing-activities":c=[],enrichers:l=[]},u,d=!1){let f=a([...r(t.map(e=>e[`data-subjects`]||[])||[]),...r(c.map(({dataSubjectTypes:e})=>e??[])??[]),...r(l.map(e=>e[`data-subjects`]||[])||[]),...s.map(e=>e.type)]);if(f.length===0&&!d)return{};let m=await _(u,{logger:e}),h=i(m,`type`),g=n(f,m.map(({type:e})=>e));if(g.length>0){e.info(o.magenta(`Creating ${g.length} new data subjects...`));for(let t of g){e.info(o.magenta(`Creating data subject ${t}...`));let n=await p(u,{input:t,logger:e});e.info(o.green(`Created data subject ${t}!`)),h[t]=n}}return h}function Ce(e,t){if(e.length===0)return[];if(typeof e[0]==`string`)return[{titles:a(e)}];let n,r=[],i=new Set,o=(e,n)=>{if(i.has(e))throw Error(`Data silo "${t}" has multiple deletion-dependencies entries for workflow "${e}". Combine them into a single entry.`);i.add(e),r.push({workflowConfigInternalName:e,...n})};return e.forEach(e=>{if(`reset-to-global`in e&&`titles`in e)throw Error(`Data silo "${t}" has a deletion-dependencies entry for workflow "${e.workflow}" that sets both "reset-to-global" and "titles". Use "titles: []" to override the global configuration with no dependencies, or "reset-to-global: true" to fall back to the global configuration.`);if(`reset-to-global`in e){o(e.workflow,{resetToGlobal:!0});return}if(e.workflow){o(e.workflow,{titles:e.titles});return}if(n!==void 0)throw Error(`Data silo "${t}" has multiple global deletion-dependencies entries. Combine them into a single \`{ titles: [...] }\` entry.`);n=e.titles}),[...n===void 0?[]:[{titles:a(n)}],...r]}async function j(n,r,{pageSize:a,dataSubjectsByName:c,apiKeysByTitle:p}){let m=!1,h=new Date().getTime();e.info(o.magenta(`Syncing "${n.length}" data silos...`));let _=i(await g(r,{titles:n.map(({title:e})=>e),pageSize:a,logger:e}),`title`),v=n.filter(({title:e})=>!_[e]);v.length>0&&(e.info(o.magenta(`Creating "${v.length}" data silos that did not exist...`)),await D(t(v,20),async t=>{let{createDataSilos:{dataSilos:n}}=await b(r,l,{variables:{input:t.map(e=>({name:e[`outer-type`]||e.integrationName,title:e.title,country:e.country,countrySubDivision:e.countrySubDivision,sombraId:e[`sombra-id`]}))},logger:e});n.forEach(e=>{_[e.title]=e})}),e.info(o.green(`Successfully created "${v.length}" data silos!`)));let y=t(n,20);await D(y,async(t,n)=>{e.info(o.magenta(`[Batch ${n+1}/${y.length}] Syncing "${t.length}" data silos`)),await b(r,u,{variables:{input:{dataSilos:t.map(e=>({id:_[e.title].id,country:e.country,countrySubDivision:e.countrySubDivision,url:e.url,headers:e.headers,description:e.description,identifiers:e[`identity-keys`],isLive:!e.disabled,ownerEmails:e.owners,teamNames:e.teams,dependedOnDataSilos:e[`deletion-dependencies`]?void 0:[{titles:[]}],apiKeyId:e[`api-key-title`]?p[e[`api-key-title`]].id:void 0,dataSubjectBlockListIds:e[`data-subjects`]?f(e[`data-subjects`],c):void 0,attributes:e.attributes,businessEntityTitles:e.businessEntityTitles,sombraId:e[`sombra-id`],notifyEmailAddress:e[`email-settings`]?.[`notify-email-address`],promptAVendorEmailSendFrequency:e[`email-settings`]?.[`send-frequency`],promptAVendorEmailSendType:e[`email-settings`]?.[`send-type`],promptAVendorEmailIncludeIdentifiersAttachment:e[`email-settings`]?.[`include-identifiers-attachment`],promptAVendorEmailCompletionLinkType:e[`email-settings`]?.[`completion-link-type`],manualWorkRetryFrequency:e[`email-settings`]?.[`manual-work-retry-frequency`]}))}},logger:e}),e.info(o.green(`[Batch ${n+1}/${y.length}] Synced "${t.length}" data silos!`))});let x=new O.SingleBar({},O.Presets.shades_classic),S=n.filter(({datapoints:e=[]})=>e.length>0),C=n.map(({datapoints:e=[]})=>e.length).reduce((e,t)=>e+t,0);e.info(o.magenta(`Syncing "${C}" datapoints from "${S.length}" data silos...`)),x.start(C,0);let w=0;await E(S,async({datapoints:t,title:n})=>{t&&await D(t,async t=>{let i=t.fields?t.fields.map(({key:e,description:t,categories:n,purposes:r,attributes:i,...a})=>({name:e,description:t,categories:n?n.map(e=>({...e,name:e.name||`Other`})):void 0,purposes:r?r.map(e=>({...e,name:e.name||`Other`})):void 0,attributes:i,accessRequestVisibilityEnabled:a[`access-request-visibility-enabled`],erasureRequestRedactionEnabled:a[`erasure-request-redaction-enabled`]})):void 0,a={dataSiloId:_[n].id,path:t.path,name:t.key,title:t.title,description:t.description,...t.owners?{ownerEmails:t.owners}:{},...t.teams?{teamNames:t.teams}:{},...t[`data-collection-tag`]?{dataCollectionTag:t[`data-collection-tag`]}:{},querySuggestions:t[`privacy-action-queries`]?Object.entries(t[`privacy-action-queries`]).map(([e,t])=>({requestType:e,suggestedQuery:t})):void 0,enabledActions:t[`privacy-actions`]||[],subDataPoints:i},s=(a.subDataPoints||[]).map(({name:e})=>e),c=s.filter((e,t)=>s.indexOf(e)!==t);if(c.length>0)e.info(o.red(`\nCannot update datapoint "${t.key}" as it has duplicate sub-datapoints with the same name: \n${c.join(`
2
2
  `)}`)),m=!0;else try{await b(r,d,{variables:a,logger:e})}catch(r){e.info(o.red(`\nFailed to update datapoint "${t.key}" for data silo "${n}"! - \n${r.message}`)),m=!0}w+=1,x.update(w)})},{concurrency:10}),x.stop();let T=new Date().getTime()-h;return e.info(o.green(`Synced "${n.length}" data silos and "${C}" datapoints in "${T/1e3}" seconds!`)),{success:!m,dataSiloTitleToId:s(_,({id:e})=>e)}}async function M(t,n,{pageSize:r=50,publishToPrivacyCenter:i=!0,classifyService:a=!1,deleteExtraAttributeValues:s=!1,logger:c,warnings:l=[]}){let u=c??e,d=[],f=!1,p=(e,t,n)=>{d.push({resource:e,item:n,message:t}),f=!0};u.info(o.magenta(`Fetching data with page size ${r}...`));let{templates:g,attributes:b,actions:D,identifiers:O,"data-subjects":k,"business-entities":M,enrichers:N,cookies:P,"consent-manager":F,"data-silos":I,"data-flows":L,vendors:R,"data-categories":z,"processing-activities":B,"processing-purposes":V,"action-items":H,"action-item-collections":U,teams:W,"privacy-center":G,messages:K,policies:q,partitions:J,"preference-workflow-configs":we,"workflow-configs":Y}=t,Te=t[`preference-options`],X=t.purposes,Ee=Se(t);if(Ee.length>0){for(let e of Ee)p(`preference-slugs`,e);return{success:!1,errors:d,warnings:l.length>0?l:void 0}}let[Z,Q,De]=await Promise.all([N||O?y(n,{input:t,skipPublish:!i,logger:e}):{},I||k||N||B?A(t,n):{},I&&I.map(e=>e[`api-key-title`]||[]).reduce((e,t)=>e+t.length,0)>0?v(n,{apiKeyInputs:t,logger:e}):{}]);if(we?.length&&(await te(n,we,{logger:u,pageSize:r})||p(`preference-workflow-configs`,`Failed to sync preference workflow configs`)),Y?.length&&(await xe(n,Y,{logger:u})||p(`workflow-configs`,`Failed to sync workflow configs`)),Te?.length&&(await fe(n,Te,{logger:u})||p(`preference-options`,`Failed to sync preference option values`)),X?.length){let{success:e,purposeIdByTrackingType:t}=await _e(n,X,{logger:u});e||p(`purposes`,`Failed to sync one or more purposes`);let r=X.flatMap(e=>(e[`preference-topics`]??[]).map(t=>({...t,"tracking-type":e.trackingType})));r.length>0&&(await pe(n,r,{logger:u,purposeIdByTrackingType:t})||p(`preference-topics`,`Failed to sync one or more preference topics`))}if(F){u.info(o.magenta(`Syncing consent manager...`));try{await ee(n,F,{logger:u}),u.info(o.green(`Successfully synced consent manager!`))}catch(e){p(`consent-manager`,e.message),u.error(o.red(`Failed to sync consent manager! - ${e.message}`))}}if(W){let t=await ve(n,W,{logger:e});f||=!t}if(g&&(e.info(o.magenta(`Syncing "${g.length}" email templates...`)),await E(g,async t=>{e.info(o.magenta(`Syncing template "${t.title}"...`));try{await ye(n,t,{logger:e}),e.info(o.green(`Successfully synced template "${t.title}"!`))}catch(n){f=!0,e.error(o.red(`Failed to sync template "${t.title}"! - ${n.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${g.length}" email templates!`))),M){let t=await T(n,M,{logger:e});f||=!t}if(R){let t=await be(n,R,{logger:e});f||=!t}if(z){let t=await re(n,z,{logger:e});f||=!t}if(V){let t=await ge(n,V,{logger:e});f||=!t}if(J){let t=await ue(n,J,{logger:e});f||=!t}if(P){let t=await ne(n,P,{logger:e});f||=!t}if(U){let t=await S(n,U,{logger:e});f||=!t}if(b){e.info(o.magenta(`Syncing "${b.length}" attributes...`));let t=await h(n,{logger:e});await E(b,async r=>{let i=t.find(e=>e.name===r.name);e.info(o.magenta(`Syncing attribute "${r.name}"...`));try{await w(n,r,{existingAttribute:i,deleteExtraAttributeValues:s,logger:e}),e.info(o.green(`Successfully synced attribute "${r.name}"!`))}catch(t){f=!0,e.error(o.red(`Failed to sync attribute "${r.name}"! - ${t.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${b.length}" attributes!`))}if(H){let t=await C(n,H,{logger:e});f||=!t}if(N&&(e.info(o.magenta(`Syncing "${N.length}" enrichers...`)),await E(N,async t=>{e.info(o.magenta(`Syncing enricher "${t.title}"...`));try{await se(n,{input:t,identifierByName:Z,dataSubjectsByName:Q,logger:e}),e.info(o.green(`Successfully synced enricher "${t.title}"!`))}catch(n){f=!0,e.error(o.red(`Failed to sync enricher "${t.title}"! - ${n.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${N.length}" enrichers!`))),O&&(e.info(o.magenta(`Syncing "${O.length}" identifiers...`)),await E(O,async t=>{let r=Z[t.name];if(!r)throw Error(`Failed to find identifier with name: ${t.type}. Should have been auto-created by cli.`);e.info(o.magenta(`Syncing identifier "${t.type}"...`));try{await ce(n,{input:t,dataSubjectsByName:Q,identifierId:r.id,skipPublish:!i,logger:e}),e.info(o.green(`Successfully synced identifier "${t.type}"!`))}catch(n){f=!0,e.info(o.red(`Failed to sync identifier "${t.type}"! - ${n.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${O.length}" identifiers!`))),D){e.info(o.magenta(`Syncing "${D.length}" actions...`));let t=await m(n,{logger:e});await E(D,async r=>{let a=t.find(e=>e.type===r.type);if(!a)throw Error(`Failed to find action with type: ${r.type}. Should have already existing in the organization.`);e.info(o.magenta(`Syncing action "${r.type}"...`));try{await x(n,{action:r,actionId:a.id,skipPublish:!i},{logger:e}),e.info(o.green(`Successfully synced action "${r.type}"!`))}catch(t){f=!0,e.error(o.red(`Failed to sync action "${r.type}"! - ${t.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${D.length}" actions!`))}if(k){e.info(o.magenta(`Syncing "${k.length}" data subjects...`));let t=await _(n,{logger:e});await E(k,async r=>{let a=t.find(e=>e.type===r.type);if(!a)throw Error(`Failed to find data subject with type: ${r.type}. Should have already existing in the organization.`);e.info(o.magenta(`Syncing data subject "${r.type}"...`));try{await oe(n,{input:r,dataSubjectId:a.id,skipPublish:!i,logger:e}),e.info(o.green(`Successfully synced data subject "${r.type}"!`))}catch(t){f=!0;let n=r.supportsAuthorizedAgent!==void 0&&/authorized.agent/i.test(t.message)?` (enable the Authorized Agents feature for this organization before setting "supportsAuthorizedAgent")`:``;e.info(o.red(`Failed to sync data subject "${r.type}"! - ${t.message}${n}`))}},{concurrency:10}),e.info(o.green(`Synced "${k.length}" data subjects!`))}if(L){let t=await ie(n,L,{classifyService:a,logger:e});f||=!t}if(G)try{await me(n,G,{logger:e,skipPublish:!i})||p(`privacy-center`,`Failed to sync privacy center`)}catch(e){p(`privacy-center`,e.message)}if(K){let t=await le(n,K,{logger:e});f||=!t}if(q){let t=await de(n,q,{logger:e});f||=!t}let $=[];if(I){let{success:e,dataSiloTitleToId:t}=await j(I,n,{dataSubjectsByName:Q,apiKeysByTitle:De,pageSize:r});I?.forEach(e=>{let n=e[`deletion-dependencies`];if(n)try{$.push([t[e.title],Ce(n,e.title)])}catch(t){p(`data-silos`,t.message,e.title),u.error(o.red(t.message))}}),f||=!e}if($.length>0){let t=await ae(n,{input:$,logger:e});f||=!t}if(B){let t=await he(n,B,{logger:e});f||=!t}return{success:!f,errors:d,warnings:l.length>0?l:void 0}}function N(e,...t){let n=JSON.parse(JSON.stringify(e));return t.forEach(e=>{c(e).forEach(([e,t])=>{n[e]===void 0?n[e]=t:Array.isArray(t)?n[e]=[...n[e],...t]:n[e]=t})}),n}export{A as i,M as n,j as r,N as t};
3
- //# sourceMappingURL=mergeTranscendInputs-DjPe49yR.mjs.map
3
+ //# sourceMappingURL=mergeTranscendInputs-CkpitZbH.mjs.map