@transcend-io/cli 11.0.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/README.md +229 -84
  2. package/dist/app-CR3U95JW.mjs +148 -0
  3. package/dist/app-CR3U95JW.mjs.map +1 -0
  4. package/dist/{approvePrivacyRequests-C165wLBa.mjs → approvePrivacyRequests-BDG82nlp.mjs} +2 -2
  5. package/dist/{approvePrivacyRequests-C165wLBa.mjs.map → approvePrivacyRequests-BDG82nlp.mjs.map} +1 -1
  6. package/dist/bin/bash-complete.mjs +1 -1
  7. package/dist/bin/cli.mjs +1 -1
  8. package/dist/bin/deprecated-command.mjs +1 -1
  9. package/dist/{buildExamples-DOopJFYY.mjs → buildExamples-B6BdW0FD.mjs} +2 -2
  10. package/dist/{buildExamples-DOopJFYY.mjs.map → buildExamples-B6BdW0FD.mjs.map} +1 -1
  11. package/dist/{buildXdiSyncEndpoint-DeStnIit.mjs → buildXdiSyncEndpoint-FExEagKc.mjs} +2 -2
  12. package/dist/{buildXdiSyncEndpoint-DeStnIit.mjs.map → buildXdiSyncEndpoint-FExEagKc.mjs.map} +1 -1
  13. package/dist/{bulkRestartRequests-_Mu1rwZQ.mjs → bulkRestartRequests-OKwKXc52.mjs} +2 -2
  14. package/dist/{bulkRestartRequests-_Mu1rwZQ.mjs.map → bulkRestartRequests-OKwKXc52.mjs.map} +1 -1
  15. package/dist/{bulkRetryEnrichers-C2keTKuQ.mjs → bulkRetryEnrichers-Dl-n8AFF.mjs} +2 -2
  16. package/dist/{bulkRetryEnrichers-C2keTKuQ.mjs.map → bulkRetryEnrichers-Dl-n8AFF.mjs.map} +1 -1
  17. package/dist/{cancelPrivacyRequests-DwQr18Fk.mjs → cancelPrivacyRequests-BIgX5SDz.mjs} +2 -2
  18. package/dist/{cancelPrivacyRequests-DwQr18Fk.mjs.map → cancelPrivacyRequests-BIgX5SDz.mjs.map} +1 -1
  19. package/dist/{codecs-CTxFjCg4.mjs → codecs-CfcaFoZR.mjs} +1 -1
  20. package/dist/{codecs-CTxFjCg4.mjs.map → codecs-CfcaFoZR.mjs.map} +1 -1
  21. package/dist/{collectCsvFilesOrExit-B1VOVGWN.mjs → collectCsvFilesOrExit-BindZ0dF.mjs} +1 -1
  22. package/dist/{collectCsvFilesOrExit-B1VOVGWN.mjs.map → collectCsvFilesOrExit-BindZ0dF.mjs.map} +1 -1
  23. package/dist/{collectParquetFilesOrExit-DVlv5ctt.mjs → collectParquetFilesOrExit-CbNQ9CJc.mjs} +1 -1
  24. package/dist/{collectParquetFilesOrExit-DVlv5ctt.mjs.map → collectParquetFilesOrExit-CbNQ9CJc.mjs.map} +1 -1
  25. package/dist/command-X7lkPELf.mjs +9 -0
  26. package/dist/command-X7lkPELf.mjs.map +1 -0
  27. package/dist/command-output-BJcDRXNr.mjs +2 -0
  28. package/dist/command-output-BJcDRXNr.mjs.map +1 -0
  29. package/dist/command-output-BRfF3YFv.mjs +2 -0
  30. package/dist/command-output-BRfF3YFv.mjs.map +1 -0
  31. package/dist/commands/admin/chunk-csv/worker.mjs +1 -1
  32. package/dist/commands/admin/parquet-to-csv/worker.mjs +1 -1
  33. package/dist/{consentManagersToBusinessEntities-CBJ81aGO.mjs → consentManagersToBusinessEntities-DG0_eby5.mjs} +1 -1
  34. package/dist/{consentManagersToBusinessEntities-CBJ81aGO.mjs.map → consentManagersToBusinessEntities-DG0_eby5.mjs.map} +1 -1
  35. package/dist/{constants-Upxn_rQF.mjs → constants-BRsj50Nb.mjs} +2 -2
  36. package/dist/{constants-Upxn_rQF.mjs.map → constants-BRsj50Nb.mjs.map} +1 -1
  37. package/dist/{constants-DXzsg2CQ.mjs → constants-DC_bBO09.mjs} +3 -3
  38. package/dist/{constants-DXzsg2CQ.mjs.map → constants-DC_bBO09.mjs.map} +1 -1
  39. package/dist/{constants-D_HVDaOy.mjs → constants-qvGk0wlN.mjs} +1 -1
  40. package/dist/{constants-D_HVDaOy.mjs.map → constants-qvGk0wlN.mjs.map} +1 -1
  41. package/dist/{context-B33NT3ki.mjs → context-D0A0LxsP.mjs} +1 -1
  42. package/dist/{context-B33NT3ki.mjs.map → context-D0A0LxsP.mjs.map} +1 -1
  43. package/dist/{createPoolingCommandUi-CKH-24w5.mjs → createPoolingCommandUi-CyPZ3GqN.mjs} +5 -5
  44. package/dist/{createPoolingCommandUi-CKH-24w5.mjs.map → createPoolingCommandUi-CyPZ3GqN.mjs.map} +1 -1
  45. package/dist/{dataFlowsToDataSilos-BF6fzWcm.mjs → dataFlowsToDataSilos-CRqbNjZ0.mjs} +1 -1
  46. package/dist/{dataFlowsToDataSilos-BF6fzWcm.mjs.map → dataFlowsToDataSilos-CRqbNjZ0.mjs.map} +1 -1
  47. package/dist/deno-runtime-CB2HBach.mjs +2 -0
  48. package/dist/deno-runtime-CB2HBach.mjs.map +1 -0
  49. package/dist/{done-input-validation-BUz-aVC5.mjs → done-input-validation-LiTaCEzF.mjs} +1 -1
  50. package/dist/{done-input-validation-BUz-aVC5.mjs.map → done-input-validation-LiTaCEzF.mjs.map} +1 -1
  51. package/dist/{downloadPrivacyRequestFiles-D3bzcegH.mjs → downloadPrivacyRequestFiles-EBySRnvd.mjs} +2 -2
  52. package/dist/{downloadPrivacyRequestFiles-D3bzcegH.mjs.map → downloadPrivacyRequestFiles-EBySRnvd.mjs.map} +1 -1
  53. package/dist/{extractClientError-HZ2U7yqV.mjs → extractClientError-DUJxHv07.mjs} +1 -1
  54. package/dist/{extractClientError-HZ2U7yqV.mjs.map → extractClientError-DUJxHv07.mjs.map} +1 -1
  55. package/dist/{fetchAllRequests-2TZr-LfT.mjs → fetchAllRequests-BI0tFl_a.mjs} +2 -2
  56. package/dist/{fetchAllRequests-2TZr-LfT.mjs.map → fetchAllRequests-BI0tFl_a.mjs.map} +1 -1
  57. package/dist/{formatPolicyBundleVersionSummary-CJmMCLtJ.mjs → formatPolicyBundleVersionSummary-DCHl1Vhy.mjs} +1 -1
  58. package/dist/{formatPolicyBundleVersionSummary-CJmMCLtJ.mjs.map → formatPolicyBundleVersionSummary-DCHl1Vhy.mjs.map} +1 -1
  59. package/dist/{fuzzyMatchColumns-CQCzpjWC.mjs → fuzzyMatchColumns-2NmQqCZI.mjs} +2 -2
  60. package/dist/{fuzzyMatchColumns-CQCzpjWC.mjs.map → fuzzyMatchColumns-2NmQqCZI.mjs.map} +1 -1
  61. package/dist/{generateCrossAccountApiKeys-DWfJtB3t.mjs → generateCrossAccountApiKeys-pWTrIUE6.mjs} +2 -2
  62. package/dist/{generateCrossAccountApiKeys-DWfJtB3t.mjs.map → generateCrossAccountApiKeys-pWTrIUE6.mjs.map} +1 -1
  63. package/dist/impl-0-_oxvck.mjs +2 -0
  64. package/dist/impl-0-_oxvck.mjs.map +1 -0
  65. package/dist/{impl-ByFyaZkK.mjs → impl-1SsreZWo.mjs} +2 -2
  66. package/dist/{impl-ByFyaZkK.mjs.map → impl-1SsreZWo.mjs.map} +1 -1
  67. package/dist/{impl-D4Ne3Vbg.mjs → impl-7rdGuHOC.mjs} +2 -2
  68. package/dist/{impl-D4Ne3Vbg.mjs.map → impl-7rdGuHOC.mjs.map} +1 -1
  69. package/dist/{impl-DRpK-QLC.mjs → impl-ApZGIx6l.mjs} +2 -2
  70. package/dist/{impl-DRpK-QLC.mjs.map → impl-ApZGIx6l.mjs.map} +1 -1
  71. package/dist/{impl-DVeGQCrr.mjs → impl-Ay6JeH-7.mjs} +2 -2
  72. package/dist/{impl-DVeGQCrr.mjs.map → impl-Ay6JeH-7.mjs.map} +1 -1
  73. package/dist/{impl-C2sSZ8qF.mjs → impl-B2ZXtnpX.mjs} +2 -2
  74. package/dist/{impl-C2sSZ8qF.mjs.map → impl-B2ZXtnpX.mjs.map} +1 -1
  75. package/dist/impl-B440iuvL.mjs +3 -0
  76. package/dist/impl-B440iuvL.mjs.map +1 -0
  77. package/dist/{impl-BhfxcCgN2.mjs → impl-B7l4bLG5.mjs} +2 -2
  78. package/dist/impl-B7l4bLG5.mjs.map +1 -0
  79. package/dist/{impl-BPoEH3Nf2.mjs → impl-B94dMG4x2.mjs} +2 -2
  80. package/dist/{impl-BPoEH3Nf2.mjs.map → impl-B94dMG4x2.mjs.map} +1 -1
  81. package/dist/{impl-DXowiNOz.mjs → impl-BH1fCPDh.mjs} +2 -2
  82. package/dist/{impl-DXowiNOz.mjs.map → impl-BH1fCPDh.mjs.map} +1 -1
  83. package/dist/{impl-CfvxD3RI.mjs → impl-BLOhoP-b2.mjs} +2 -2
  84. package/dist/impl-BLOhoP-b2.mjs.map +1 -0
  85. package/dist/{impl-CHUxKOz_.mjs → impl-BLQDgwxL.mjs} +2 -2
  86. package/dist/{impl-CHUxKOz_.mjs.map → impl-BLQDgwxL.mjs.map} +1 -1
  87. package/dist/{impl-Dqqb0lVN.mjs → impl-BWPPVXG3.mjs} +3 -3
  88. package/dist/{impl-Dqqb0lVN.mjs.map → impl-BWPPVXG3.mjs.map} +1 -1
  89. package/dist/{impl-Cw0L2xEU.mjs → impl-BdTxFv63.mjs} +2 -2
  90. package/dist/{impl-Cw0L2xEU.mjs.map → impl-BdTxFv63.mjs.map} +1 -1
  91. package/dist/impl-BpVe6fMe.mjs +3 -0
  92. package/dist/{impl--JGnR3wp.mjs.map → impl-BpVe6fMe.mjs.map} +1 -1
  93. package/dist/impl-BqTMPbwc2.mjs +2 -0
  94. package/dist/impl-BqTMPbwc2.mjs.map +1 -0
  95. package/dist/impl-CAoIp9Nl2.mjs +3 -0
  96. package/dist/impl-CAoIp9Nl2.mjs.map +1 -0
  97. package/dist/{impl-C_62Z4ED.mjs → impl-CU38kdj8.mjs} +2 -2
  98. package/dist/{impl-C_62Z4ED.mjs.map → impl-CU38kdj8.mjs.map} +1 -1
  99. package/dist/{impl-BppXJ1AD2.mjs → impl-CWP6AXSb.mjs} +2 -2
  100. package/dist/impl-CWP6AXSb.mjs.map +1 -0
  101. package/dist/impl-CY8C-Fvj2.mjs +2 -0
  102. package/dist/impl-CY8C-Fvj2.mjs.map +1 -0
  103. package/dist/{impl-BJyzyrZD.mjs → impl-C_Ifcb00.mjs} +2 -2
  104. package/dist/{impl-BJyzyrZD.mjs.map → impl-C_Ifcb00.mjs.map} +1 -1
  105. package/dist/{impl-CPSEzCc9.mjs → impl-Cb42aI60.mjs} +2 -2
  106. package/dist/{impl-CPSEzCc9.mjs.map → impl-Cb42aI60.mjs.map} +1 -1
  107. package/dist/impl-Cee7Q1Ne.mjs +2 -0
  108. package/dist/impl-Cee7Q1Ne.mjs.map +1 -0
  109. package/dist/impl-CieztjdM.mjs +2 -0
  110. package/dist/impl-CieztjdM.mjs.map +1 -0
  111. package/dist/{impl-DqhZR11m.mjs → impl-ClqrQo1M.mjs} +2 -2
  112. package/dist/{impl-DqhZR11m.mjs.map → impl-ClqrQo1M.mjs.map} +1 -1
  113. package/dist/impl-CnHfn7rr.mjs +5 -0
  114. package/dist/{impl-DPtx5iZO.mjs.map → impl-CnHfn7rr.mjs.map} +1 -1
  115. package/dist/{impl-BpMQYnbR.mjs → impl-CrdqsTUy.mjs} +2 -2
  116. package/dist/{impl-BpMQYnbR.mjs.map → impl-CrdqsTUy.mjs.map} +1 -1
  117. package/dist/{impl-DzUTmaID2.mjs → impl-CsaT3aM2.mjs} +2 -2
  118. package/dist/impl-CsaT3aM2.mjs.map +1 -0
  119. package/dist/{impl-BEA5cQOT2.mjs → impl-CspH2ZWx.mjs} +2 -2
  120. package/dist/impl-CspH2ZWx.mjs.map +1 -0
  121. package/dist/{impl-lsmXIGSo2.mjs → impl-CudSYx-g.mjs} +2 -2
  122. package/dist/impl-CudSYx-g.mjs.map +1 -0
  123. package/dist/{impl-DXQHLpMw.mjs → impl-Cxprr2hw.mjs} +2 -2
  124. package/dist/{impl-DXQHLpMw.mjs.map → impl-Cxprr2hw.mjs.map} +1 -1
  125. package/dist/{impl-gs5wJ1BK.mjs → impl-D-a5xGld.mjs} +2 -2
  126. package/dist/{impl-gs5wJ1BK.mjs.map → impl-D-a5xGld.mjs.map} +1 -1
  127. package/dist/{impl-D94m3EPp.mjs → impl-D1UogVAq.mjs} +2 -2
  128. package/dist/{impl-D94m3EPp.mjs.map → impl-D1UogVAq.mjs.map} +1 -1
  129. package/dist/{impl-B5df-igZ.mjs → impl-D1f9mJL_.mjs} +2 -2
  130. package/dist/{impl-B5df-igZ.mjs.map → impl-D1f9mJL_.mjs.map} +1 -1
  131. package/dist/{impl-CSk_okwj.mjs → impl-DJcNhpbx.mjs} +2 -2
  132. package/dist/{impl-CSk_okwj.mjs.map → impl-DJcNhpbx.mjs.map} +1 -1
  133. package/dist/impl-DQG1pMzD2.mjs +2 -0
  134. package/dist/impl-DQG1pMzD2.mjs.map +1 -0
  135. package/dist/impl-DQcgEx7V2.mjs +298 -0
  136. package/dist/impl-DQcgEx7V2.mjs.map +1 -0
  137. package/dist/impl-DRKPx_I9.mjs +2 -0
  138. package/dist/impl-DRKPx_I9.mjs.map +1 -0
  139. package/dist/{impl-DhxDp4GN.mjs → impl-DTadLabu.mjs} +2 -2
  140. package/dist/{impl-DhxDp4GN.mjs.map → impl-DTadLabu.mjs.map} +1 -1
  141. package/dist/{impl-CD2R3L0v.mjs → impl-DXbxO2VJ.mjs} +2 -2
  142. package/dist/{impl-CD2R3L0v.mjs.map → impl-DXbxO2VJ.mjs.map} +1 -1
  143. package/dist/{impl-nz1MyjX22.mjs → impl-DcL-8NEa2.mjs} +2 -2
  144. package/dist/{impl-nz1MyjX22.mjs.map → impl-DcL-8NEa2.mjs.map} +1 -1
  145. package/dist/{impl-DKepRc812.mjs → impl-DeCRXfAh2.mjs} +2 -2
  146. package/dist/{impl-DKepRc812.mjs.map → impl-DeCRXfAh2.mjs.map} +1 -1
  147. package/dist/impl-DezV3QMo.mjs +3 -0
  148. package/dist/impl-DezV3QMo.mjs.map +1 -0
  149. package/dist/{impl-COujMWgp.mjs → impl-Dg7XSQdO2.mjs} +2 -2
  150. package/dist/impl-Dg7XSQdO2.mjs.map +1 -0
  151. package/dist/{impl-a_Y8bnSn.mjs → impl-DhXzxQDN2.mjs} +5 -5
  152. package/dist/impl-DhXzxQDN2.mjs.map +1 -0
  153. package/dist/impl-DiwxYcux.mjs +2 -0
  154. package/dist/{impl-GytUVAMP.mjs.map → impl-DiwxYcux.mjs.map} +1 -1
  155. package/dist/{impl-C9OmNI49.mjs → impl-Do2TNA3-.mjs} +2 -2
  156. package/dist/{impl-C9OmNI49.mjs.map → impl-Do2TNA3-.mjs.map} +1 -1
  157. package/dist/{impl-DaH1_ZzK.mjs → impl-DqHEIzpj.mjs} +2 -2
  158. package/dist/{impl-DaH1_ZzK.mjs.map → impl-DqHEIzpj.mjs.map} +1 -1
  159. package/dist/{impl-CzdUHruN.mjs → impl-Dr_l_SLd.mjs} +2 -2
  160. package/dist/{impl-CzdUHruN.mjs.map → impl-Dr_l_SLd.mjs.map} +1 -1
  161. package/dist/{impl-CTwyYUw3.mjs → impl-Ds-gQfdc.mjs} +2 -2
  162. package/dist/{impl-CTwyYUw3.mjs.map → impl-Ds-gQfdc.mjs.map} +1 -1
  163. package/dist/{impl-C8jjYvgu.mjs → impl-DtnYcktN.mjs} +2 -2
  164. package/dist/{impl-C8jjYvgu.mjs.map → impl-DtnYcktN.mjs.map} +1 -1
  165. package/dist/impl-DtpgD_as.mjs +2 -0
  166. package/dist/{impl-DQPmSYSE.mjs.map → impl-DtpgD_as.mjs.map} +1 -1
  167. package/dist/{impl-D2Q4nxUO.mjs → impl-DxQ9yj3H.mjs} +2 -2
  168. package/dist/{impl-D2Q4nxUO.mjs.map → impl-DxQ9yj3H.mjs.map} +1 -1
  169. package/dist/impl-FerHBNJx2.mjs +4 -0
  170. package/dist/{impl-D-AHlqlD2.mjs.map → impl-FerHBNJx2.mjs.map} +1 -1
  171. package/dist/{impl-CiBT9-GH2.mjs → impl-HUfaARep.mjs} +2 -2
  172. package/dist/impl-HUfaARep.mjs.map +1 -0
  173. package/dist/impl-btKJ1-VJ.mjs +3 -0
  174. package/dist/impl-btKJ1-VJ.mjs.map +1 -0
  175. package/dist/impl-eeS2lVi5.mjs +2 -0
  176. package/dist/impl-eeS2lVi5.mjs.map +1 -0
  177. package/dist/impl-iD6Fknfe.mjs +2 -0
  178. package/dist/impl-iD6Fknfe.mjs.map +1 -0
  179. package/dist/impl-ijoNwhGI.mjs +2 -0
  180. package/dist/impl-ijoNwhGI.mjs.map +1 -0
  181. package/dist/{impl-zRAjMVgz.mjs → impl-vmLq6HCI.mjs} +2 -2
  182. package/dist/{impl-zRAjMVgz.mjs.map → impl-vmLq6HCI.mjs.map} +1 -1
  183. package/dist/{impl-a0BFtbna.mjs → impl-wBcVYHlA.mjs} +2 -2
  184. package/dist/{impl-a0BFtbna.mjs.map → impl-wBcVYHlA.mjs.map} +1 -1
  185. package/dist/index.mjs +2 -2
  186. package/dist/index.mjs.map +1 -1
  187. package/dist/{initializeCliRuntime-6wI_VIHV.mjs → initializeCliRuntime-BaATMO1X.mjs} +1 -1
  188. package/dist/{initializeCliRuntime-6wI_VIHV.mjs.map → initializeCliRuntime-BaATMO1X.mjs.map} +1 -1
  189. package/dist/{inquirer-BeaBetMO.mjs → inquirer-BU5IpgA8.mjs} +2 -2
  190. package/dist/{inquirer-BeaBetMO.mjs.map → inquirer-BU5IpgA8.mjs.map} +1 -1
  191. package/dist/{jsonc-D9dDWb1J.mjs → jsonc-CdTubr53.mjs} +1 -1
  192. package/dist/{jsonc-D9dDWb1J.mjs.map → jsonc-CdTubr53.mjs.map} +1 -1
  193. package/dist/{listFiles-BdFUbX5x.mjs → listFiles-DDGCBdtx.mjs} +1 -1
  194. package/dist/{listFiles-BdFUbX5x.mjs.map → listFiles-DDGCBdtx.mjs.map} +1 -1
  195. package/dist/logger-CPu6zbyQ.mjs +2 -0
  196. package/dist/logger-CPu6zbyQ.mjs.map +1 -0
  197. package/dist/{mapConsentCsvRowsToInputs-Dqb6WL4r.mjs → mapConsentCsvRowsToInputs-CkLfxaIf.mjs} +1 -1
  198. package/dist/{mapConsentCsvRowsToInputs-Dqb6WL4r.mjs.map → mapConsentCsvRowsToInputs-CkLfxaIf.mjs.map} +1 -1
  199. package/dist/{markRequestDataSiloIdsCompleted-Br5gIS3S.mjs → markRequestDataSiloIdsCompleted-BYNMCkhy.mjs} +2 -2
  200. package/dist/{markRequestDataSiloIdsCompleted-Br5gIS3S.mjs.map → markRequestDataSiloIdsCompleted-BYNMCkhy.mjs.map} +1 -1
  201. package/dist/{markSilentPrivacyRequests-Cs_iZNJs.mjs → markSilentPrivacyRequests-gKYivzH1.mjs} +2 -2
  202. package/dist/{markSilentPrivacyRequests-Cs_iZNJs.mjs.map → markSilentPrivacyRequests-gKYivzH1.mjs.map} +1 -1
  203. package/dist/{mergeTranscendInputs-DFQcbh8b.mjs → mergeTranscendInputs-D1CvxQu0.mjs} +2 -2
  204. package/dist/{mergeTranscendInputs-DFQcbh8b.mjs.map → mergeTranscendInputs-D1CvxQu0.mjs.map} +1 -1
  205. package/dist/missing-manifest-D8y1VL4p.mjs +2 -0
  206. package/dist/missing-manifest-D8y1VL4p.mjs.map +1 -0
  207. package/dist/{module-graph-Cb0g74Ft.mjs → module-graph-CAT8_JCG.mjs} +1 -1
  208. package/dist/{module-graph-Cb0g74Ft.mjs.map → module-graph-CAT8_JCG.mjs.map} +1 -1
  209. package/dist/{notifyPrivacyRequestsAdditionalTime-kPXTdjgT.mjs → notifyPrivacyRequestsAdditionalTime-DbERhQ1Q.mjs} +2 -2
  210. package/dist/{notifyPrivacyRequestsAdditionalTime-kPXTdjgT.mjs.map → notifyPrivacyRequestsAdditionalTime-DbERhQ1Q.mjs.map} +1 -1
  211. package/dist/{parquetToCsvOneFile-ChmPC6dL.mjs → parquetToCsvOneFile-DtbCFm08.mjs} +3 -3
  212. package/dist/{parquetToCsvOneFile-ChmPC6dL.mjs.map → parquetToCsvOneFile-DtbCFm08.mjs.map} +1 -1
  213. package/dist/{parseAttributesFromString-CO16oAlx.mjs → parseAttributesFromString-C5hJMRvt.mjs} +2 -2
  214. package/dist/{parseAttributesFromString-CO16oAlx.mjs.map → parseAttributesFromString-C5hJMRvt.mjs.map} +1 -1
  215. package/dist/{parseVariablesFromString-BOSfQ4QF.mjs → parseVariablesFromString-6TYW65LF.mjs} +1 -1
  216. package/dist/{parseVariablesFromString-BOSfQ4QF.mjs.map → parseVariablesFromString-6TYW65LF.mjs.map} +1 -1
  217. package/dist/paths-J5KScOaQ.mjs +2 -0
  218. package/dist/paths-J5KScOaQ.mjs.map +1 -0
  219. package/dist/policy-bundle-manifest-BZnBMZQq.mjs +7 -0
  220. package/dist/policy-bundle-manifest-BZnBMZQq.mjs.map +1 -0
  221. package/dist/policy-project-discovery-C29UxWwt.mjs +427 -0
  222. package/dist/policy-project-discovery-C29UxWwt.mjs.map +1 -0
  223. package/dist/{policy-runtime-BMKa-Upy.mjs → policy-runtime-6jmkXlBk.mjs} +2 -2
  224. package/dist/{policy-runtime-BMKa-Upy.mjs.map → policy-runtime-6jmkXlBk.mjs.map} +1 -1
  225. package/dist/policy-scaffold-config-BUKAyPad.mjs +76 -0
  226. package/dist/policy-scaffold-config-BUKAyPad.mjs.map +1 -0
  227. package/dist/{policyEngineCliError-DY8V-qkK.mjs → policyEngineCliError-CZrOHhLv.mjs} +1 -1
  228. package/dist/{policyEngineCliError-DY8V-qkK.mjs.map → policyEngineCliError-CZrOHhLv.mjs.map} +1 -1
  229. package/dist/{printResult-CHe3nRN4.mjs → printResult-C2K9ODeE.mjs} +3 -3
  230. package/dist/printResult-C2K9ODeE.mjs.map +1 -0
  231. package/dist/project-discovery-BkHpTXDx.mjs +2 -0
  232. package/dist/project-discovery-BkHpTXDx.mjs.map +1 -0
  233. package/dist/project-discovery-CWRjlFnC.mjs +2 -0
  234. package/dist/project-discovery-CWRjlFnC.mjs.map +1 -0
  235. package/dist/project-plan-apply-Bg_1eMX9.mjs +3 -0
  236. package/dist/{project-plan-apply-Dvndx455.mjs.map → project-plan-apply-Bg_1eMX9.mjs.map} +1 -1
  237. package/dist/project-plan-output-BHHlkLxe.mjs +4 -0
  238. package/dist/project-plan-output-BHHlkLxe.mjs.map +1 -0
  239. package/dist/prompts-BhXfYD6g.mjs +2 -0
  240. package/dist/prompts-BhXfYD6g.mjs.map +1 -0
  241. package/dist/{pullAllDatapoints-uk5ggk6O.mjs → pullAllDatapoints-Bm-Orhse.mjs} +2 -2
  242. package/dist/{pullAllDatapoints-uk5ggk6O.mjs.map → pullAllDatapoints-Bm-Orhse.mjs.map} +1 -1
  243. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-DbFFXAVM.mjs → pullChunkedCustomSiloOutstandingIdentifiers-DTGQOw--.mjs} +2 -2
  244. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-DbFFXAVM.mjs.map → pullChunkedCustomSiloOutstandingIdentifiers-DTGQOw--.mjs.map} +1 -1
  245. package/dist/{pullConsentManagerMetrics-Dv5n1ZGp.mjs → pullConsentManagerMetrics-DKCkfbCB.mjs} +2 -2
  246. package/dist/{pullConsentManagerMetrics-Dv5n1ZGp.mjs.map → pullConsentManagerMetrics-DKCkfbCB.mjs.map} +1 -1
  247. package/dist/{pullManualEnrichmentIdentifiersToCsv-D5is0Nrs.mjs → pullManualEnrichmentIdentifiersToCsv-DMC5CQtE.mjs} +2 -2
  248. package/dist/{pullManualEnrichmentIdentifiersToCsv-D5is0Nrs.mjs.map → pullManualEnrichmentIdentifiersToCsv-DMC5CQtE.mjs.map} +1 -1
  249. package/dist/{pullTranscendConfiguration-B63M3ild.mjs → pullTranscendConfiguration-CDUDqxpm.mjs} +2 -2
  250. package/dist/{pullTranscendConfiguration-B63M3ild.mjs.map → pullTranscendConfiguration-CDUDqxpm.mjs.map} +1 -1
  251. package/dist/{pullUnstructuredSubDataPointRecommendations-YTBzfkRZ.mjs → pullUnstructuredSubDataPointRecommendations-Ci4AOxyH.mjs} +2 -2
  252. package/dist/{pullUnstructuredSubDataPointRecommendations-YTBzfkRZ.mjs.map → pullUnstructuredSubDataPointRecommendations-Ci4AOxyH.mjs.map} +1 -1
  253. package/dist/{pushCronIdentifiersFromCsv-Ctq38wAY.mjs → pushCronIdentifiersFromCsv-DhS2z8IG.mjs} +2 -2
  254. package/dist/{pushCronIdentifiersFromCsv-Ctq38wAY.mjs.map → pushCronIdentifiersFromCsv-DhS2z8IG.mjs.map} +1 -1
  255. package/dist/{pushManualEnrichmentIdentifiersFromCsv-0WHf6d_m.mjs → pushManualEnrichmentIdentifiersFromCsv-BTJGOmdU.mjs} +2 -2
  256. package/dist/{pushManualEnrichmentIdentifiersFromCsv-0WHf6d_m.mjs.map → pushManualEnrichmentIdentifiersFromCsv-BTJGOmdU.mjs.map} +1 -1
  257. package/dist/{readCsv-DLg8pwjd.mjs → readCsv-DNcJ_UfU.mjs} +1 -1
  258. package/dist/{readCsv-DLg8pwjd.mjs.map → readCsv-DNcJ_UfU.mjs.map} +1 -1
  259. package/dist/{readTranscendYaml-BNn6-Ofi.mjs → readTranscendYaml-BfqQbPiT.mjs} +3 -3
  260. package/dist/{readTranscendYaml-BNn6-Ofi.mjs.map → readTranscendYaml-BfqQbPiT.mjs.map} +1 -1
  261. package/dist/{removeUnverifiedRequestIdentifiers-Do3Pus6m.mjs → removeUnverifiedRequestIdentifiers-BkAcUZZN.mjs} +2 -2
  262. package/dist/{removeUnverifiedRequestIdentifiers-Do3Pus6m.mjs.map → removeUnverifiedRequestIdentifiers-BkAcUZZN.mjs.map} +1 -1
  263. package/dist/{renderTable-D68QasPc.mjs → renderTable-CZP2roD1.mjs} +1 -1
  264. package/dist/{renderTable-D68QasPc.mjs.map → renderTable-CZP2roD1.mjs.map} +1 -1
  265. package/dist/{request-BiPv6jmP.mjs → request-BpKyN9Xm.mjs} +1 -1
  266. package/dist/{request-BiPv6jmP.mjs.map → request-BpKyN9Xm.mjs.map} +1 -1
  267. package/dist/{resolveBundleIdByName-qXZBrUz_.mjs → resolveBundleIdByName-Dm_o5_bg.mjs} +2 -2
  268. package/dist/{resolveBundleIdByName-qXZBrUz_.mjs.map → resolveBundleIdByName-Dm_o5_bg.mjs.map} +1 -1
  269. package/dist/{resolvePolicyBundleVersion-BG7XqBBP.mjs → resolvePolicyBundleVersion-DRUwe7fA.mjs} +2 -2
  270. package/dist/{resolvePolicyBundleVersion-BG7XqBBP.mjs.map → resolvePolicyBundleVersion-DRUwe7fA.mjs.map} +1 -1
  271. package/dist/{retryRequestDataSilos-CEgUW6Fx.mjs → retryRequestDataSilos-BoPmcB8-.mjs} +2 -2
  272. package/dist/{retryRequestDataSilos-CEgUW6Fx.mjs.map → retryRequestDataSilos-BoPmcB8-.mjs.map} +1 -1
  273. package/dist/{run-captured-process-BXwWXuTh.mjs → run-captured-process-BjaSDWXG.mjs} +1 -1
  274. package/dist/{run-captured-process-BXwWXuTh.mjs.map → run-captured-process-BjaSDWXG.mjs.map} +1 -1
  275. package/dist/{runOpa-CswzJxIs.mjs → runOpa-ojIqU1tO.mjs} +2 -2
  276. package/dist/{runOpa-CswzJxIs.mjs.map → runOpa-ojIqU1tO.mjs.map} +1 -1
  277. package/dist/{scaffold-model-BAbYTR0q.mjs → scaffold-model-CUZER0BC.mjs} +1 -1
  278. package/dist/scaffold-model-CUZER0BC.mjs.map +1 -0
  279. package/dist/{scaffold-planning-CNv83t_v.mjs → scaffold-planning-CaetLfv8.mjs} +9 -9
  280. package/dist/{scaffold-planning-CNv83t_v.mjs.map → scaffold-planning-CaetLfv8.mjs.map} +1 -1
  281. package/dist/{scaffold-templates-DzDGTZie.mjs → scaffold-templates-CUL82Zf8.mjs} +1 -1
  282. package/dist/{scaffold-templates-DzDGTZie.mjs.map → scaffold-templates-CUL82Zf8.mjs.map} +1 -1
  283. package/dist/{skipPreflightJobs-D_1mZ9mr.mjs → skipPreflightJobs-DkBdYw-r.mjs} +2 -2
  284. package/dist/{skipPreflightJobs-D_1mZ9mr.mjs.map → skipPreflightJobs-DkBdYw-r.mjs.map} +1 -1
  285. package/dist/{skipRequestDataSilos-CcGl9Z8M.mjs → skipRequestDataSilos-BRFiokix.mjs} +2 -2
  286. package/dist/{skipRequestDataSilos-CcGl9Z8M.mjs.map → skipRequestDataSilos-BRFiokix.mjs.map} +1 -1
  287. package/dist/{streamPrivacyRequestsToCsv-1l8RAcnK.mjs → streamPrivacyRequestsToCsv-Bt-H5J-y.mjs} +2 -2
  288. package/dist/{streamPrivacyRequestsToCsv-1l8RAcnK.mjs.map → streamPrivacyRequestsToCsv-Bt-H5J-y.mjs.map} +1 -1
  289. package/dist/{syncCodePackages-BHE2Tn1Q.mjs → syncCodePackages-CPkEukDm.mjs} +2 -2
  290. package/dist/{syncCodePackages-BHE2Tn1Q.mjs.map → syncCodePackages-CPkEukDm.mjs.map} +1 -1
  291. package/dist/{updateConsentManagerVersionToLatest-yZhBDcv8.mjs → updateConsentManagerVersionToLatest-DWblAwus.mjs} +2 -2
  292. package/dist/{updateConsentManagerVersionToLatest-yZhBDcv8.mjs.map → updateConsentManagerVersionToLatest-DWblAwus.mjs.map} +1 -1
  293. package/dist/{uploadConsents-DQqApEaH.mjs → uploadConsents-D7Vg8ZRW.mjs} +2 -2
  294. package/dist/{uploadConsents-DQqApEaH.mjs.map → uploadConsents-D7Vg8ZRW.mjs.map} +1 -1
  295. package/dist/{uploadPrivacyRequestsFromCsv-ntuK0eSR.mjs → uploadPrivacyRequestsFromCsv-B_hQwIn6.mjs} +2 -2
  296. package/dist/{uploadPrivacyRequestsFromCsv-ntuK0eSR.mjs.map → uploadPrivacyRequestsFromCsv-B_hQwIn6.mjs.map} +1 -1
  297. package/dist/validateTranscendAuth-D-dDINof.mjs +2 -0
  298. package/dist/{validateTranscendAuth-D6Wr1cxY.mjs.map → validateTranscendAuth-D-dDINof.mjs.map} +1 -1
  299. package/dist/{writeCsv-D-2siSwE.mjs → writeCsv-CNZrq3zU.mjs} +1 -1
  300. package/dist/{writeCsv-D-2siSwE.mjs.map → writeCsv-CNZrq3zU.mjs.map} +1 -1
  301. package/package.json +6 -5
  302. package/dist/app-DhG-JhT3.mjs +0 -148
  303. package/dist/app-DhG-JhT3.mjs.map +0 -1
  304. package/dist/command-Ds6oNo0v.mjs +0 -9
  305. package/dist/command-Ds6oNo0v.mjs.map +0 -1
  306. package/dist/deno-runtime-DV52X8-P.mjs +0 -2
  307. package/dist/deno-runtime-DV52X8-P.mjs.map +0 -1
  308. package/dist/impl--JGnR3wp.mjs +0 -3
  309. package/dist/impl-7UqkSO3x2.mjs +0 -2
  310. package/dist/impl-7UqkSO3x2.mjs.map +0 -1
  311. package/dist/impl-B4BgGuF_.mjs +0 -3
  312. package/dist/impl-B4BgGuF_.mjs.map +0 -1
  313. package/dist/impl-B5oVsX-F2.mjs +0 -303
  314. package/dist/impl-B5oVsX-F2.mjs.map +0 -1
  315. package/dist/impl-BEA5cQOT2.mjs.map +0 -1
  316. package/dist/impl-BhfxcCgN2.mjs.map +0 -1
  317. package/dist/impl-BppXJ1AD2.mjs.map +0 -1
  318. package/dist/impl-C6HtWd1t.mjs +0 -2
  319. package/dist/impl-C6HtWd1t.mjs.map +0 -1
  320. package/dist/impl-CO4ZqlLV.mjs +0 -3
  321. package/dist/impl-CO4ZqlLV.mjs.map +0 -1
  322. package/dist/impl-COujMWgp.mjs.map +0 -1
  323. package/dist/impl-CUOVJsRg.mjs +0 -3
  324. package/dist/impl-CUOVJsRg.mjs.map +0 -1
  325. package/dist/impl-CUiYbk6G.mjs +0 -3
  326. package/dist/impl-CUiYbk6G.mjs.map +0 -1
  327. package/dist/impl-CfvxD3RI.mjs.map +0 -1
  328. package/dist/impl-CiBT9-GH2.mjs.map +0 -1
  329. package/dist/impl-Cli2XRp02.mjs +0 -2
  330. package/dist/impl-Cli2XRp02.mjs.map +0 -1
  331. package/dist/impl-D-AHlqlD2.mjs +0 -4
  332. package/dist/impl-DPN1En7L.mjs +0 -2
  333. package/dist/impl-DPN1En7L.mjs.map +0 -1
  334. package/dist/impl-DPtx5iZO.mjs +0 -5
  335. package/dist/impl-DQPmSYSE.mjs +0 -2
  336. package/dist/impl-DXRDWiB1.mjs +0 -2
  337. package/dist/impl-DXRDWiB1.mjs.map +0 -1
  338. package/dist/impl-DdIa0zla.mjs +0 -2
  339. package/dist/impl-DdIa0zla.mjs.map +0 -1
  340. package/dist/impl-Dp4bZvAV.mjs +0 -2
  341. package/dist/impl-Dp4bZvAV.mjs.map +0 -1
  342. package/dist/impl-DryC3OJu.mjs +0 -2
  343. package/dist/impl-DryC3OJu.mjs.map +0 -1
  344. package/dist/impl-DzUTmaID2.mjs.map +0 -1
  345. package/dist/impl-GytUVAMP.mjs +0 -2
  346. package/dist/impl-Z8oWVENM.mjs +0 -2
  347. package/dist/impl-Z8oWVENM.mjs.map +0 -1
  348. package/dist/impl-a_Y8bnSn.mjs.map +0 -1
  349. package/dist/impl-lsmXIGSo2.mjs.map +0 -1
  350. package/dist/logger-zplFSeXU.mjs +0 -2
  351. package/dist/logger-zplFSeXU.mjs.map +0 -1
  352. package/dist/manifest-BNIpO_zW.mjs +0 -2
  353. package/dist/manifest-BNIpO_zW.mjs.map +0 -1
  354. package/dist/missing-manifest-DgcukXfg.mjs +0 -2
  355. package/dist/missing-manifest-DgcukXfg.mjs.map +0 -1
  356. package/dist/path-safety-D5Qwl40b.mjs +0 -2
  357. package/dist/path-safety-D5Qwl40b.mjs.map +0 -1
  358. package/dist/policy-bundle-manifest-D6dkbjNi.mjs +0 -7
  359. package/dist/policy-bundle-manifest-D6dkbjNi.mjs.map +0 -1
  360. package/dist/printResult-CHe3nRN4.mjs.map +0 -1
  361. package/dist/project-plan-apply-Dvndx455.mjs +0 -3
  362. package/dist/prompts-ClBXdELk.mjs +0 -4
  363. package/dist/prompts-ClBXdELk.mjs.map +0 -1
  364. package/dist/scaffold-model-BAbYTR0q.mjs.map +0 -1
  365. package/dist/validateTranscendAuth-D6Wr1cxY.mjs +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"impl-a0BFtbna.mjs","names":[],"sources":["../src/commands/request/notify-additional-time/impl.ts"],"sourcesContent":["import type { RequestAction } from '@transcend-io/privacy-types';\n\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { notifyPrivacyRequestsAdditionalTime } from '../../../lib/requests/index.js';\n\nexport interface NotifyAdditionalTimeCommandFlags {\n auth: string;\n createdAtBefore: Date;\n createdAtAfter?: Date;\n updatedAtBefore?: Date;\n updatedAtAfter?: Date;\n actions?: RequestAction[];\n daysLeft: number;\n days: number;\n requestIds?: string[];\n emailTemplate: string;\n transcendUrl: string;\n concurrency: number;\n}\n\nexport async function notifyAdditionalTime(\n this: LocalContext,\n {\n auth,\n transcendUrl,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n actions,\n daysLeft,\n days,\n requestIds,\n emailTemplate,\n concurrency,\n }: NotifyAdditionalTimeCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await notifyPrivacyRequestsAdditionalTime({\n transcendUrl,\n requestActions: actions,\n auth,\n emailTemplate,\n days,\n daysLeft,\n requestIds,\n concurrency,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n });\n}\n"],"mappings":"2HAqBA,eAAsB,EAEpB,CACE,OACA,eACA,kBACA,iBACA,kBACA,iBACA,UACA,WACA,OACA,aACA,gBACA,eAEa,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAM,EAAoC,CACxC,eACA,eAAgB,EAChB,OACA,gBACA,OACA,WACA,aACA,cACA,kBACA,iBACA,kBACA,iBACD,CAAC"}
1
+ {"version":3,"file":"impl-wBcVYHlA.mjs","names":[],"sources":["../src/commands/request/notify-additional-time/impl.ts"],"sourcesContent":["import type { RequestAction } from '@transcend-io/privacy-types';\n\nimport type { LocalContext } from '../../../context.js';\nimport { doneInputValidation } from '../../../lib/cli/done-input-validation.js';\nimport { notifyPrivacyRequestsAdditionalTime } from '../../../lib/requests/index.js';\n\nexport interface NotifyAdditionalTimeCommandFlags {\n auth: string;\n createdAtBefore: Date;\n createdAtAfter?: Date;\n updatedAtBefore?: Date;\n updatedAtAfter?: Date;\n actions?: RequestAction[];\n daysLeft: number;\n days: number;\n requestIds?: string[];\n emailTemplate: string;\n transcendUrl: string;\n concurrency: number;\n}\n\nexport async function notifyAdditionalTime(\n this: LocalContext,\n {\n auth,\n transcendUrl,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n actions,\n daysLeft,\n days,\n requestIds,\n emailTemplate,\n concurrency,\n }: NotifyAdditionalTimeCommandFlags,\n): Promise<void> {\n doneInputValidation(this.process);\n\n await notifyPrivacyRequestsAdditionalTime({\n transcendUrl,\n requestActions: actions,\n auth,\n emailTemplate,\n days,\n daysLeft,\n requestIds,\n concurrency,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n });\n}\n"],"mappings":"2HAqBA,eAAsB,EAEpB,CACE,OACA,eACA,kBACA,iBACA,kBACA,iBACA,UACA,WACA,OACA,aACA,gBACA,eAEa,CACf,EAAoB,KAAK,QAAQ,CAEjC,MAAM,EAAoC,CACxC,eACA,eAAgB,EAChB,OACA,gBACA,OACA,WACA,aACA,cACA,kBACA,iBACA,kBACA,iBACD,CAAC"}
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-Upxn_rQF.mjs";import{t as b}from"./logger-zplFSeXU.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,gt as ve,h as ye,ht as be,i as xe,it as Se,j as Ce,k as we,l as Te,lt as Ee,m as De,mt as Oe,n as ke,nt as Ae,o as je,ot as Me,p as Ne,pt as Pe,q as Fe,r as Ie,rt as Le,s as Re,st as ze,t as Be,tt as Ve,u as He,ut as Ue,v as We,w as Ge,x as Ke,y as qe,z as Je}from"./codecs-CTxFjCg4.mjs";import{a as Ye,i as Xe,n as Ze,o as Qe,r as $e,s as et,t as tt}from"./readTranscendYaml-BNn6-Ofi.mjs";import{i as nt,n as rt,r as it,t as at}from"./mergeTranscendInputs-DFQcbh8b.mjs";import{a as ot,c as st,i as ct,l as lt,n as ut,o as dt,r as ft,s as pt,t as mt,u as ht}from"./constants-D_HVDaOy.mjs";import{n as gt,t as _t}from"./fuzzyMatchColumns-CQCzpjWC.mjs";import{a as vt,c as yt,d as bt,f as xt,i as St,l as Ct,n as wt,o as Tt,r as Et,s as Dt,t as Ot,u as kt}from"./uploadPrivacyRequestsFromCsv-ntuK0eSR.mjs";import{n as At,t as jt}from"./parseAttributesFromString-CO16oAlx.mjs";import{n as H,t as Mt}from"./readCsv-DLg8pwjd.mjs";import{n as Nt,t as Pt}from"./pullUnstructuredSubDataPointRecommendations-YTBzfkRZ.mjs";import{a as Ft,i as It,n as Lt,o as Rt,r as zt,t as Bt}from"./request-BiPv6jmP.mjs";import{i as Vt,n as Ht,r as Ut,t as Wt}from"./pullTranscendConfiguration-B63M3ild.mjs";import{i as Gt,n as Kt,r as U,t as qt}from"./fetchAllRequests-2TZr-LfT.mjs";import{a as Jt,i as Yt,n as Xt,r as Zt,t as Qt}from"./pullChunkedCustomSiloOutstandingIdentifiers-DbFFXAVM.mjs";import{n as $t,r as en,t as tn}from"./syncCodePackages-BHE2Tn1Q.mjs";import{t as nn}from"./markSilentPrivacyRequests-Cs_iZNJs.mjs";import{a as rn,i as an,n as on,o as sn,r as cn,t as ln}from"./downloadPrivacyRequestFiles-D3bzcegH.mjs";import{n as un,r as dn,t as fn}from"./extractClientError-HZ2U7yqV.mjs";import{t as pn}from"./approvePrivacyRequests-C165wLBa.mjs";import{t as mn}from"./notifyPrivacyRequestsAdditionalTime-kPXTdjgT.mjs";import{t as hn}from"./cancelPrivacyRequests-DwQr18Fk.mjs";import{n as gn,t as _n}from"./bulkRestartRequests-_Mu1rwZQ.mjs";import{t as vn}from"./skipPreflightJobs-D_1mZ9mr.mjs";import{t as yn}from"./bulkRetryEnrichers-C2keTKuQ.mjs";import{t as bn}from"./retryRequestDataSilos-CEgUW6Fx.mjs";import{n as W,r as G,t as xn}from"./streamPrivacyRequestsToCsv-1l8RAcnK.mjs";import{n as Sn,r as Cn,t as wn}from"./inquirer-BeaBetMO.mjs";import{t as Tn}from"./parseVariablesFromString-BOSfQ4QF.mjs";import{t as En}from"./collectParquetFilesOrExit-DVlv5ctt.mjs";import{t as Dn}from"./collectCsvFilesOrExit-B1VOVGWN.mjs";import{t as On}from"./parquetToCsvOneFile-ChmPC6dL.mjs";import{a as kn,i as An,n as jn,o as Mn,r as Nn,s as Pn,t as Fn}from"./writeCsv-D-2siSwE.mjs";import{t as In}from"./skipRequestDataSilos-CcGl9Z8M.mjs";import{t as Ln}from"./removeUnverifiedRequestIdentifiers-Do3Pus6m.mjs";import{t as Rn}from"./updateConsentManagerVersionToLatest-yZhBDcv8.mjs";import{n as K,t as q}from"./mapConsentCsvRowsToInputs-Dqb6WL4r.mjs";import{t as zn}from"./pullConsentManagerMetrics-Dv5n1ZGp.mjs";import{n as Bn,r as Vn,t as Hn}from"./buildXdiSyncEndpoint-DeStnIit.mjs";import{t as Un}from"./consentManagersToBusinessEntities-CBJ81aGO.mjs";import{i as Wn,n as Gn,r as Kn,t as qn}from"./uploadConsents-DQqApEaH.mjs";import{n as Jn,r as Yn,t as Xn}from"./pushCronIdentifiersFromCsv-Ctq38wAY.mjs";import{t as Zn}from"./markRequestDataSiloIdsCompleted-Br5gIS3S.mjs";import{t as Qn}from"./generateCrossAccountApiKeys-DWfJtB3t.mjs";import{t as $n}from"./validateTranscendAuth-D6Wr1cxY.mjs";import{n as er,t as tr}from"./listFiles-BdFUbX5x.mjs";import{t as nr}from"./pullAllDatapoints-uk5ggk6O.mjs";import{t as rr}from"./pullManualEnrichmentIdentifiersToCsv-D5is0Nrs.mjs";import{n as ir,r as ar,t as or}from"./pushManualEnrichmentIdentifiersFromCsv-0WHf6d_m.mjs";import{chunk as sr,difference as cr}from"lodash-es";import{readFileSync as lr,readdirSync as ur,statSync as dr}from"node:fs";import{join as fr}from"node:path";import J from"fast-glob";import Y from"colors";import{UPDATE_OR_CREATE_COOKIES as pr,buildTranscendGraphQLClient as X,createSombraGotInstance as mr,fetchAllRequestIdentifiers as hr,fetchConsentManagerId as gr,makeGraphQLRequest as _r,syncCookies as vr,syncDataFlows as yr,validateSombraVersion as br}from"@transcend-io/sdk";import{map as Z,mapSeries as xr}from"@transcend-io/utils";import{execSync as Q}from"child_process";async function $(e,t){let n=await gr(e,{logger:b});await xr(sr(t,100),async t=>{await _r(e,pr,{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 Sr(e,t){let n=!1;b.info(Y.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(Y.magenta(`Upserting "${t.length}" new cookies...`)),await $(e,t),b.info(Y.green(`Successfully synced ${t.length} cookies!`))}catch(e){n=!0,b.error(Y.red(`Failed to create cookies! - ${e.message}`))}return!n}async function Cr({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 mr(c,e,{logger:b,sombraApiKey:t,sombraUrl:process.env.SOMBRA_URL}),_=``;l&&(_+=` before ${l.toISOString()}`),d&&(_+=`${_?`, and`:``} after ${d.toISOString()}`),b.info(Y.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(Y.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 br(h,{logger:b});let S=u?x.map(e=>({...e,requestIdentifiers:[]})):await Z(x,async e=>{let t=await hr(h,g,{filterBy:{requestId:e.id},skipSombraCheck:!0,logger:b});return{...e,requestIdentifiers:t}},{concurrency:o});return b.info(Y.magenta(`Pulled ${S.length} requests`)),{requestsWithRequestIdentifiers:S,requestsFormattedForCsv:S.map(G)}}function wr(e,t=lr){try{return e?t(e,`utf8`):``}catch{return``}}async function Tr({auth:e,trackerStatus:t,file:n,classifyService:r=!1,transcendUrl:a=i}){let o=X(a,e);b.info(Y.magenta(`Reading "${n}" from disk`)),await yr(o,K(H(n,w),t),{classifyService:r,logger:b})||(b.error(Y.red(`Encountered error(s) syncing data flows from CSV, see logs above for more info. `)),process.exit(1))}async function Er({auth:e,trackerStatus:t,file:n,transcendUrl:r=i}){let a=X(r,e);b.info(Y.magenta(`Reading "${n}" from disk`)),await vr(a,q(H(n,C),t),{logger:b})||(b.error(Y.red(`Encountered error(s) syncing cookies from CSV, see logs above for more info. `)),process.exit(1))}function Dr(e){return ur(e).filter(t=>dr(fr(e,t)).isDirectory())}function Or(e){return e.replace(/(https?:\/\/[^\s]+)/g,`<link-omitted>`)}function kr(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 Ar({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-BRsj50Nb.mjs";import{t as b}from"./logger-CPu6zbyQ.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,gt as ve,h as ye,ht as be,i as xe,it as Se,j as Ce,k as we,l as Te,lt as Ee,m as De,mt as Oe,n as ke,nt as Ae,o as je,ot as Me,p as Ne,pt as Pe,q as Fe,r as Ie,rt as Le,s as Re,st as ze,t as Be,tt as Ve,u as He,ut as Ue,v as We,w as Ge,x as Ke,y as qe,z as Je}from"./codecs-CfcaFoZR.mjs";import{a as Ye,i as Xe,n as Ze,o as Qe,r as $e,s as et,t as tt}from"./readTranscendYaml-BfqQbPiT.mjs";import{i as nt,n as rt,r as it,t as at}from"./mergeTranscendInputs-D1CvxQu0.mjs";import{a as ot,c as st,i as ct,l as lt,n as ut,o as dt,r as ft,s as pt,t as mt,u as ht}from"./constants-qvGk0wlN.mjs";import{n as gt,t as _t}from"./fuzzyMatchColumns-2NmQqCZI.mjs";import{a as vt,c as yt,d as bt,f as xt,i as St,l as Ct,n as wt,o as Tt,r as Et,s as Dt,t as Ot,u as kt}from"./uploadPrivacyRequestsFromCsv-B_hQwIn6.mjs";import{n as At,t as jt}from"./parseAttributesFromString-C5hJMRvt.mjs";import{n as H,t as Mt}from"./readCsv-DNcJ_UfU.mjs";import{n as Nt,t as Pt}from"./pullUnstructuredSubDataPointRecommendations-Ci4AOxyH.mjs";import{a as Ft,i as It,n as Lt,o as Rt,r as zt,t as Bt}from"./request-BpKyN9Xm.mjs";import{i as Vt,n as Ht,r as Ut,t as Wt}from"./pullTranscendConfiguration-CDUDqxpm.mjs";import{i as Gt,n as Kt,r as U,t as qt}from"./fetchAllRequests-BI0tFl_a.mjs";import{a as Jt,i as Yt,n as Xt,r as Zt,t as Qt}from"./pullChunkedCustomSiloOutstandingIdentifiers-DTGQOw--.mjs";import{n as $t,r as en,t as tn}from"./syncCodePackages-CPkEukDm.mjs";import{t as nn}from"./markSilentPrivacyRequests-gKYivzH1.mjs";import{a as rn,i as an,n as on,o as sn,r as cn,t as ln}from"./downloadPrivacyRequestFiles-EBySRnvd.mjs";import{n as un,r as dn,t as fn}from"./extractClientError-DUJxHv07.mjs";import{t as pn}from"./approvePrivacyRequests-BDG82nlp.mjs";import{t as mn}from"./notifyPrivacyRequestsAdditionalTime-DbERhQ1Q.mjs";import{t as hn}from"./cancelPrivacyRequests-BIgX5SDz.mjs";import{n as gn,t as _n}from"./bulkRestartRequests-OKwKXc52.mjs";import{t as vn}from"./skipPreflightJobs-DkBdYw-r.mjs";import{t as yn}from"./bulkRetryEnrichers-Dl-n8AFF.mjs";import{t as bn}from"./retryRequestDataSilos-BoPmcB8-.mjs";import{n as W,r as G,t as xn}from"./streamPrivacyRequestsToCsv-Bt-H5J-y.mjs";import{n as Sn,r as Cn,t as wn}from"./inquirer-BU5IpgA8.mjs";import{t as Tn}from"./parseVariablesFromString-6TYW65LF.mjs";import{t as En}from"./collectParquetFilesOrExit-CbNQ9CJc.mjs";import{t as Dn}from"./collectCsvFilesOrExit-BindZ0dF.mjs";import{t as On}from"./parquetToCsvOneFile-DtbCFm08.mjs";import{a as kn,i as An,n as jn,o as Mn,r as Nn,s as Pn,t as Fn}from"./writeCsv-CNZrq3zU.mjs";import{t as In}from"./skipRequestDataSilos-BRFiokix.mjs";import{t as Ln}from"./removeUnverifiedRequestIdentifiers-BkAcUZZN.mjs";import{t as Rn}from"./updateConsentManagerVersionToLatest-DWblAwus.mjs";import{n as K,t as q}from"./mapConsentCsvRowsToInputs-CkLfxaIf.mjs";import{t as zn}from"./pullConsentManagerMetrics-DKCkfbCB.mjs";import{n as Bn,r as Vn,t as Hn}from"./buildXdiSyncEndpoint-FExEagKc.mjs";import{t as Un}from"./consentManagersToBusinessEntities-DG0_eby5.mjs";import{i as Wn,n as Gn,r as Kn,t as qn}from"./uploadConsents-D7Vg8ZRW.mjs";import{n as Jn,r as Yn,t as Xn}from"./pushCronIdentifiersFromCsv-DhS2z8IG.mjs";import{t as Zn}from"./markRequestDataSiloIdsCompleted-BYNMCkhy.mjs";import{t as Qn}from"./generateCrossAccountApiKeys-pWTrIUE6.mjs";import{t as $n}from"./validateTranscendAuth-D-dDINof.mjs";import{n as er,t as tr}from"./listFiles-DDGCBdtx.mjs";import{t as nr}from"./pullAllDatapoints-Bm-Orhse.mjs";import{t as rr}from"./pullManualEnrichmentIdentifiersToCsv-DMC5CQtE.mjs";import{n as ir,r as ar,t as or}from"./pushManualEnrichmentIdentifiersFromCsv-BTJGOmdU.mjs";import{chunk as sr,difference as cr}from"lodash-es";import{join as lr}from"node:path";import J from"colors";import{readFileSync as ur,readdirSync as dr,statSync as Y}from"node:fs";import fr from"fast-glob";import{UPDATE_OR_CREATE_COOKIES as pr,buildTranscendGraphQLClient as X,createSombraGotInstance as mr,fetchAllRequestIdentifiers as hr,fetchConsentManagerId as gr,makeGraphQLRequest as _r,syncCookies as vr,syncDataFlows as yr,validateSombraVersion as br}from"@transcend-io/sdk";import{map as Z,mapSeries as xr}from"@transcend-io/utils";import{execSync as Q}from"child_process";async function $(e,t){let n=await gr(e,{logger:b});await xr(sr(t,100),async t=>{await _r(e,pr,{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 Sr(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 Cr({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 mr(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 br(h,{logger:b});let S=u?x.map(e=>({...e,requestIdentifiers:[]})):await Z(x,async e=>{let t=await hr(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 wr(e,t=ur){try{return e?t(e,`utf8`):``}catch{return``}}async function Tr({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 yr(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 Er({auth:e,trackerStatus:t,file:n,transcendUrl:r=i}){let a=X(r,e);b.info(J.magenta(`Reading "${n}" from disk`)),await vr(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 Dr(e){return dr(e).filter(t=>Y(lr(e,t)).isDirectory())}function Or(e){return e.replace(/(https?:\/\/[^\s]+)/g,`<link-omitted>`)}function kr(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 Ar({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
3
  `)[0];if(!a||!o)throw Error(`FAILED TO FIND COMMIT RANGE`);let s=cr(Q(`git fetch && git diff --name-only "${e||a}...${o}" -- ${t}`,{encoding:`utf-8`}).split(`
4
- `).filter(e=>e),i),c=r.length>0?J.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,Bt as APPROVE_PRIVACY_REQUEST,Vt as ASSESSMENT_TEMPLATES,Be as ActionInput,ke as ActionItemCollectionInput,Ie as ActionItemInput,xe as ApiKeyInput,I as AssessmentAnswerOptionInput,je as AssessmentDisplayLogicInput,Re as AssessmentInput,z as AssessmentNestedRuleInput,Te as AssessmentResourceInput,He as AssessmentRetentionScheduleInput,V as AssessmentRuleInput,he as AssessmentSectionInput,Ne as AssessmentSectionQuestionInput,De as AssessmentTemplateInput,St as AttestedExtraIdentifiers,ye as AttributeInput,_e as AttributePreview,F as AttributeValueInput,mt as BLANK,ut as BULK_APPLY,We as BusinessEntityInput,Lt as CANCEL_PRIVACY_REQUEST,ft as CAN_APPLY_IN_BULK,ct as CachedFileState,ot as CachedRequestState,qe as CodePackageInput,R as CodePackageSdk,dt as ColumnName,Ke as ConsentManageExperienceInput,D as ConsentManagerInput,te as ConsentManagerServiceMetadata,Ge as ConsentPreferenceTopic,O as ConsentPreferenceTopicOptionValue,ne as ConsentPurpose,C as CookieCsvInput,de as CookieInput,Xt as CronIdentifier,Jn as CronIdentifierPush,Zt as CronPartition,u as DEBUG,i as DEFAULT_TRANSCEND_API,m as DEFAULT_TRANSCEND_API_KEY,_ as DEFAULT_TRANSCEND_CONSENT_API,Wt as DEFAULT_TRANSCEND_PULL_RESOURCES,we as DataCategoryGuessInput,S as DataCategoryInput,Ce as DataCategoryPreviewInput,ue as DataCategoryRecommendationInput,w as DataFlowCsvInput,fe as DataFlowInput,re as DataSiloInput,oe as DataSubjectInput,le as DatapointInput,E as DeletionDependencies,Je as DeletionDependency,ee as DeletionDependencyInput,A as DeletionDependencyReset,Nt as ENTRY_COUNT,ir as EnrichPrivacyRequest,ae as EnricherInput,k as FieldInput,pt as IDENTIFIER_BLOCK_LIST,Hn as IP_ADDRESS_REGEX,st as IS_REQUIRED,j as IdentifierInput,ie as ImportOnetrustAssessmentsInput,cn as IntlMessage,ce as IntlMessageInput,lt as NONE,zt as NOTIFY_ADDITIONAL_TIME,r as OneTrustFileFormat,t as OneTrustPullResource,n as OneTrustPullSource,jt as ParsedAttributeInput,Fe as PartitionInput,se as PolicyInput,N as PreferenceWorkflowConfigInput,M as PreferenceWorkflowConfigPurposeInput,P as PreflightInput,T as PrivacyCenterInput,qt as PrivacyRequest,vt as PrivacyRequestInput,un as PrivacyRequestResponse,x as ProcessingActivityInput,me as ProcessingPurposeInput,Ve as ProcessingPurposePreviewInput,Ae as PromptAVendorEmailSettings,qn as PurposeMap,It as REQUESTS,Ft as REQUESTS_COUNT,a as RETRYABLE_BATCH_STATUSES,Le as RegionInput,Se as RepositoryInput,an as RequestFileMetadata,rn as RequestFileMetadataResponse,Kt as RequestPurposeTrigger,L as RiskAssignmentInput,Me as RiskLogicInput,d as SCOPES_BY_TITLE,y as SCOPE_TITLES,ze as SiloDiscoveryResultInput,B as SoftwareDevelopmentKitInput,Ee as StoredApiKey,ht as SuccessfulRequest,o as TR_PULL_RESOURCE_SCOPE_MAP,s as TR_PUSH_RESOURCE_SCOPE_MAP,h as TR_YML_RESOURCE_TO_FIELD_NAME,Ue as TeamInput,pe as TemplateInput,ge as TranscendInput,e as TranscendPullResource,Rt as UPDATE_PRIVACY_REQUEST,Gn as USP_STRING_REGEX,tt as VARIABLE_PARAMETERS_NAME,Ze as VARIABLE_PARAMETERS_REGEXP,Pe as VendorInput,Oe as WebhookHeader,be as WorkflowConfigInput,Fn as appendCsvRowsOrdered,jn as appendCsvSync,pn as approvePrivacyRequests,Bn as buildXdiSyncEndpoint,_n as bulkRestartRequests,yn as bulkRetryEnrichers,hn as cancelPrivacyRequests,Dn as collectCsvFilesOrExit,En as collectParquetFilesOrExit,Un as consentManagersToBusinessEntities,tn as createCodePackage,Wn as createConsentToken,l as description,Vn as domainToHost,ln as downloadPrivacyRequestFiles,ar as enrichPrivacyRequest,nt as ensureAllDataSubjectsExist,fn as extractClientError,Ut as fetchAllAssessmentTemplates,U as fetchAllRequests,Jt as fetchRequestDataSiloActiveCount,Gt as fetchRequestsTotalCount,tr as filterFileNames,kr as filterNullishValuesFromObject,kt as filterRows,G as formatRequestForCsv,_t as fuzzyMatchColumns,gt as fuzzySearch,Qn as generateCrossAccountApiKeys,sn as getFileMetadataForPrivacyRequests,Ar as getGitFilesThatChanged,bt as getUniqueValuesForColumn,Nn as initCsvFile,wn as inquirerAutoComplete,Sn as inquirerConfirmBoolean,Cn as inquirerConfirmText,Dr as listDirectories,er as listFiles,wt as mapColumnsToAttributes,Et as mapColumnsToIdentifiers,q as mapCookieCsvRowsToInputs,Ct as mapCsvColumnsToApi,Tt as mapCsvRowsToRequestInputs,K as mapDataFlowCsvRowsToInputs,xt as mapEnumValues,yt as mapRequestEnumValues,Yn as markCronIdentifierCompleted,Zn as markRequestDataSiloIdsCompleted,nn as markSilentPrivacyRequests,at as mergeTranscendInputs,f as name,Dt as normalizeIdentifierValue,ve as normalizeTranscendInput,mn as notifyPrivacyRequestsAdditionalTime,On as parquetToCsvOneFile,At as parseAttributesFromString,Mt as parseCsv,An as parseFilePath,$e as parseTranscendYaml,Tn as parseVariablesFromString,nr as pullAllDatapoints,Qt as pullChunkedCustomSiloOutstandingIdentifiers,zn as pullConsentManagerMetrics,Yt as pullCronPageOfIdentifiers,rr as pullManualEnrichmentIdentifiersToCsv,Cr as pullPrivacyRequests,Ht as pullTranscendConfiguration,Pt as pullUnstructuredSubDataPointRecommendations,Xn as pushCronIdentifiersFromCsv,or as pushManualEnrichmentIdentifiersFromCsv,H as readCsv,wr as readSafe,Xe as readTranscendYaml,Or as removeLinks,Ln as removeUnverifiedRequestIdentifiers,Ye as replaceVariablesInYaml,gn as restartPrivacyRequest,bn as retryRequestDataSilos,Qe as serializeTranscendYaml,vn as skipPreflightJobs,In as skipRequestDataSilos,W as splitDateRange,on as streamPrivacyRequestFiles,xn as streamPrivacyRequestsToCsv,dn as submitPrivacyRequest,$t as syncCodePackages,rt as syncConfigurationToTranscend,Sr as syncCookies,it as syncDataSilos,en as updateCodePackages,Rn as updateConsentManagerVersionToLatest,$ as updateOrCreateCookies,Kn as uploadConsents,Er as uploadCookiesFromCsv,Tr as uploadDataFlowsFromCsv,Ot as uploadPrivacyRequestsFromCsv,$n as validateTranscendAuth,c as version,kn as writeCsv,Mn as writeCsvSync,Pn as writeLargeCsv,et as writeTranscendYaml};
4
+ `).filter(e=>e),i),c=r.length>0?fr.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,Bt as APPROVE_PRIVACY_REQUEST,Vt as ASSESSMENT_TEMPLATES,Be as ActionInput,ke as ActionItemCollectionInput,Ie as ActionItemInput,xe as ApiKeyInput,I as AssessmentAnswerOptionInput,je as AssessmentDisplayLogicInput,Re as AssessmentInput,z as AssessmentNestedRuleInput,Te as AssessmentResourceInput,He as AssessmentRetentionScheduleInput,V as AssessmentRuleInput,he as AssessmentSectionInput,Ne as AssessmentSectionQuestionInput,De as AssessmentTemplateInput,St as AttestedExtraIdentifiers,ye as AttributeInput,_e as AttributePreview,F as AttributeValueInput,mt as BLANK,ut as BULK_APPLY,We as BusinessEntityInput,Lt as CANCEL_PRIVACY_REQUEST,ft as CAN_APPLY_IN_BULK,ct as CachedFileState,ot as CachedRequestState,qe as CodePackageInput,R as CodePackageSdk,dt as ColumnName,Ke as ConsentManageExperienceInput,D as ConsentManagerInput,te as ConsentManagerServiceMetadata,Ge as ConsentPreferenceTopic,O as ConsentPreferenceTopicOptionValue,ne as ConsentPurpose,C as CookieCsvInput,de as CookieInput,Xt as CronIdentifier,Jn as CronIdentifierPush,Zt as CronPartition,u as DEBUG,i as DEFAULT_TRANSCEND_API,m as DEFAULT_TRANSCEND_API_KEY,_ as DEFAULT_TRANSCEND_CONSENT_API,Wt as DEFAULT_TRANSCEND_PULL_RESOURCES,we as DataCategoryGuessInput,S as DataCategoryInput,Ce as DataCategoryPreviewInput,ue as DataCategoryRecommendationInput,w as DataFlowCsvInput,fe as DataFlowInput,re as DataSiloInput,oe as DataSubjectInput,le as DatapointInput,E as DeletionDependencies,Je as DeletionDependency,ee as DeletionDependencyInput,A as DeletionDependencyReset,Nt as ENTRY_COUNT,ir as EnrichPrivacyRequest,ae as EnricherInput,k as FieldInput,pt as IDENTIFIER_BLOCK_LIST,Hn as IP_ADDRESS_REGEX,st as IS_REQUIRED,j as IdentifierInput,ie as ImportOnetrustAssessmentsInput,cn as IntlMessage,ce as IntlMessageInput,lt as NONE,zt as NOTIFY_ADDITIONAL_TIME,r as OneTrustFileFormat,t as OneTrustPullResource,n as OneTrustPullSource,jt as ParsedAttributeInput,Fe as PartitionInput,se as PolicyInput,N as PreferenceWorkflowConfigInput,M as PreferenceWorkflowConfigPurposeInput,P as PreflightInput,T as PrivacyCenterInput,qt as PrivacyRequest,vt as PrivacyRequestInput,un as PrivacyRequestResponse,x as ProcessingActivityInput,me as ProcessingPurposeInput,Ve as ProcessingPurposePreviewInput,Ae as PromptAVendorEmailSettings,qn as PurposeMap,It as REQUESTS,Ft as REQUESTS_COUNT,a as RETRYABLE_BATCH_STATUSES,Le as RegionInput,Se as RepositoryInput,an as RequestFileMetadata,rn as RequestFileMetadataResponse,Kt as RequestPurposeTrigger,L as RiskAssignmentInput,Me as RiskLogicInput,d as SCOPES_BY_TITLE,y as SCOPE_TITLES,ze as SiloDiscoveryResultInput,B as SoftwareDevelopmentKitInput,Ee as StoredApiKey,ht as SuccessfulRequest,o as TR_PULL_RESOURCE_SCOPE_MAP,s as TR_PUSH_RESOURCE_SCOPE_MAP,h as TR_YML_RESOURCE_TO_FIELD_NAME,Ue as TeamInput,pe as TemplateInput,ge as TranscendInput,e as TranscendPullResource,Rt as UPDATE_PRIVACY_REQUEST,Gn as USP_STRING_REGEX,tt as VARIABLE_PARAMETERS_NAME,Ze as VARIABLE_PARAMETERS_REGEXP,Pe as VendorInput,Oe as WebhookHeader,be as WorkflowConfigInput,Fn as appendCsvRowsOrdered,jn as appendCsvSync,pn as approvePrivacyRequests,Bn as buildXdiSyncEndpoint,_n as bulkRestartRequests,yn as bulkRetryEnrichers,hn as cancelPrivacyRequests,Dn as collectCsvFilesOrExit,En as collectParquetFilesOrExit,Un as consentManagersToBusinessEntities,tn as createCodePackage,Wn as createConsentToken,l as description,Vn as domainToHost,ln as downloadPrivacyRequestFiles,ar as enrichPrivacyRequest,nt as ensureAllDataSubjectsExist,fn as extractClientError,Ut as fetchAllAssessmentTemplates,U as fetchAllRequests,Jt as fetchRequestDataSiloActiveCount,Gt as fetchRequestsTotalCount,tr as filterFileNames,kr as filterNullishValuesFromObject,kt as filterRows,G as formatRequestForCsv,_t as fuzzyMatchColumns,gt as fuzzySearch,Qn as generateCrossAccountApiKeys,sn as getFileMetadataForPrivacyRequests,Ar as getGitFilesThatChanged,bt as getUniqueValuesForColumn,Nn as initCsvFile,wn as inquirerAutoComplete,Sn as inquirerConfirmBoolean,Cn as inquirerConfirmText,Dr as listDirectories,er as listFiles,wt as mapColumnsToAttributes,Et as mapColumnsToIdentifiers,q as mapCookieCsvRowsToInputs,Ct as mapCsvColumnsToApi,Tt as mapCsvRowsToRequestInputs,K as mapDataFlowCsvRowsToInputs,xt as mapEnumValues,yt as mapRequestEnumValues,Yn as markCronIdentifierCompleted,Zn as markRequestDataSiloIdsCompleted,nn as markSilentPrivacyRequests,at as mergeTranscendInputs,f as name,Dt as normalizeIdentifierValue,ve as normalizeTranscendInput,mn as notifyPrivacyRequestsAdditionalTime,On as parquetToCsvOneFile,At as parseAttributesFromString,Mt as parseCsv,An as parseFilePath,$e as parseTranscendYaml,Tn as parseVariablesFromString,nr as pullAllDatapoints,Qt as pullChunkedCustomSiloOutstandingIdentifiers,zn as pullConsentManagerMetrics,Yt as pullCronPageOfIdentifiers,rr as pullManualEnrichmentIdentifiersToCsv,Cr as pullPrivacyRequests,Ht as pullTranscendConfiguration,Pt as pullUnstructuredSubDataPointRecommendations,Xn as pushCronIdentifiersFromCsv,or as pushManualEnrichmentIdentifiersFromCsv,H as readCsv,wr as readSafe,Xe as readTranscendYaml,Or as removeLinks,Ln as removeUnverifiedRequestIdentifiers,Ye as replaceVariablesInYaml,gn as restartPrivacyRequest,bn as retryRequestDataSilos,Qe as serializeTranscendYaml,vn as skipPreflightJobs,In as skipRequestDataSilos,W as splitDateRange,on as streamPrivacyRequestFiles,xn as streamPrivacyRequestsToCsv,dn as submitPrivacyRequest,$t as syncCodePackages,rt as syncConfigurationToTranscend,Sr as syncCookies,it as syncDataSilos,en as updateCodePackages,Rn as updateConsentManagerVersionToLatest,$ as updateOrCreateCookies,Kn as uploadConsents,Er as uploadCookiesFromCsv,Tr as uploadDataFlowsFromCsv,Ot as uploadPrivacyRequestsFromCsv,$n as validateTranscendAuth,c as version,kn as writeCsv,Mn as writeCsvSync,Pn as writeLargeCsv,et as writeTranscendYaml};
5
5
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
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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"}
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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"}
@@ -1,2 +1,2 @@
1
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-6wI_VIHV.mjs.map
2
+ //# sourceMappingURL=initializeCliRuntime-BaATMO1X.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"initializeCliRuntime-6wI_VIHV.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
+ {"version":3,"file":"initializeCliRuntime-BaATMO1X.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-CQCzpjWC.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-BeaBetMO.mjs.map
1
+ import{n as e}from"./fuzzyMatchColumns-2NmQqCZI.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-BU5IpgA8.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"inquirer-BeaBetMO.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-BU5IpgA8.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"}
@@ -3,4 +3,4 @@ import{applyEdits as e,createScanner as t,modify as n,parse as r}from"jsonc-pars
3
3
  `:`
4
4
  `}}function s(e){let n=t(e,!1),r=[],a=n.scan();for(;a!==i.EOF;)(a===i.LineCommentTrivia||a===i.BlockCommentTrivia)&&r.push(e.slice(n.getTokenOffset(),n.getTokenOffset()+n.getTokenLength())),a=n.scan();return r}function c(e){let n=t(e,!1),r=-1,a=n.scan();for(;a!==i.EOF;){if(a===i.LineCommentTrivia){let e=r===n.getTokenStartLine(),t=n.scan();for(;t===i.Trivia||t===i.LineBreakTrivia||t===i.LineCommentTrivia||t===i.BlockCommentTrivia;)t=n.scan();if(e&&(t===i.CloseBraceToken||t===i.CloseBracketToken))return!0;a=t;continue}a!==i.Trivia&&a!==i.LineBreakTrivia&&a!==i.BlockCommentTrivia&&(r=n.getTokenStartLine()),a=n.scan()}return!1}function l(t,r,i){let l=t??`{}
5
5
  `;if(a(l,i),t!==null&&c(t))throw Error(`Cannot prove comment-preserving edits for ${i}; apply the displayed patch manually.`);let u=s(l),d=o(l);r.forEach(({path:t,value:r})=>{l=e(l,n(l,t,r,{formattingOptions:{...d,insertFinalNewline:!0,keepLines:!0}}))});let f=s(l);if(u.length!==f.length||u.some((e,t)=>f[t]!==e))throw Error(`A comment would move or disappear in ${i}; apply the patch manually.`);return a(l,i),l.endsWith(d.eol)?l:`${l}${d.eol}`}function u(e,t){let n=Array.isArray(e)?e.filter(e=>typeof e==`string`):[];return[...n,...t.filter(e=>!n.includes(e))]}export{u as n,a as r,l as t};
6
- //# sourceMappingURL=jsonc-D9dDWb1J.mjs.map
6
+ //# sourceMappingURL=jsonc-CdTubr53.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsonc-D9dDWb1J.mjs","names":[],"sources":["../src/lib/scaffolding/jsonc.ts"],"sourcesContent":["import { applyEdits, createScanner, modify, parse, type ParseError } from 'jsonc-parser';\n\n/**\n * Runtime values of jsonc-parser's ambient const enum, repeated locally\n * because isolated modules cannot access that enum directly.\n */\nconst JSONC_SYNTAX_KIND = {\n /** Closing object delimiter. */\n CloseBraceToken: 2,\n /** Closing array delimiter. */\n CloseBracketToken: 4,\n /** Single-line comment. */\n LineCommentTrivia: 12,\n /** Block comment. */\n BlockCommentTrivia: 13,\n /** Line break. */\n LineBreakTrivia: 14,\n /** Whitespace. */\n Trivia: 15,\n /** End of input. */\n EOF: 17,\n} as const;\n\n/** One JSONC path update. */\nexport interface JsoncUpdate {\n /** Object path. */\n path: (string | number)[];\n /** Desired value. */\n value: unknown;\n}\n\n/**\n * Parse a JSONC object and fail with a manual-patch-oriented error.\n *\n * @param contents - JSON or JSONC text\n * @param label - Configuration label\n * @returns Parsed object\n */\nexport function parseJsoncObject(contents: string, label: string): Record<string, unknown> {\n const errors: ParseError[] = [];\n const value = parse(contents, errors, {\n allowTrailingComma: true,\n disallowComments: false,\n }) as unknown;\n if (errors.length > 0 || value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(\n `Cannot safely merge ${label}; fix its JSONC syntax or apply the patch manually.`,\n );\n }\n return value as Record<string, unknown>;\n}\n\n/**\n * Infer formatting without reformatting existing content.\n *\n * @param contents - Existing JSONC\n * @returns Formatting settings\n */\nfunction inferFormatting(contents: string): {\n /** Number of spaces per indent. */\n tabSize: number;\n /** Whether indentation uses spaces. */\n insertSpaces: boolean;\n /** Existing line ending. */\n eol: string;\n} {\n const indent = contents.match(/\\n([ \\t]+)\"/)?.[1] ?? ' ';\n return {\n tabSize: indent.includes('\\t') ? 1 : indent.length,\n insertSpaces: !indent.includes('\\t'),\n eol: contents.includes('\\r\\n') ? '\\r\\n' : '\\n',\n };\n}\n\n/**\n * Capture comment text in order.\n *\n * @param contents - JSONC text\n * @returns Comments\n */\nfunction extractComments(contents: string): string[] {\n const scanner = createScanner(contents, false);\n const comments: string[] = [];\n let token = scanner.scan();\n while (token !== JSONC_SYNTAX_KIND.EOF) {\n if (\n token === JSONC_SYNTAX_KIND.LineCommentTrivia ||\n token === JSONC_SYNTAX_KIND.BlockCommentTrivia\n ) {\n comments.push(\n contents.slice(\n scanner.getTokenOffset(),\n scanner.getTokenOffset() + scanner.getTokenLength(),\n ),\n );\n }\n token = scanner.scan();\n }\n return comments;\n}\n\n/**\n * Detect the jsonc-parser insertion edge case that can reattach an inline\n * comment from the previous final property.\n *\n * @param contents - Existing JSONC text\n * @returns Whether a guarded manual patch is required\n */\nfunction hasTrailingPropertyComment(contents: string): boolean {\n const scanner = createScanner(contents, false);\n let previousSignificantLine = -1;\n let token = scanner.scan();\n while (token !== JSONC_SYNTAX_KIND.EOF) {\n if (token === JSONC_SYNTAX_KIND.LineCommentTrivia) {\n const hasInlineValue = previousSignificantLine === scanner.getTokenStartLine();\n let next = scanner.scan();\n while (\n next === JSONC_SYNTAX_KIND.Trivia ||\n next === JSONC_SYNTAX_KIND.LineBreakTrivia ||\n next === JSONC_SYNTAX_KIND.LineCommentTrivia ||\n next === JSONC_SYNTAX_KIND.BlockCommentTrivia\n ) {\n next = scanner.scan();\n }\n if (\n hasInlineValue &&\n (next === JSONC_SYNTAX_KIND.CloseBraceToken || next === JSONC_SYNTAX_KIND.CloseBracketToken)\n ) {\n return true;\n }\n token = next;\n continue;\n }\n if (\n token !== JSONC_SYNTAX_KIND.Trivia &&\n token !== JSONC_SYNTAX_KIND.LineBreakTrivia &&\n token !== JSONC_SYNTAX_KIND.BlockCommentTrivia\n ) {\n previousSignificantLine = scanner.getTokenStartLine();\n }\n token = scanner.scan();\n }\n return false;\n}\n\n/**\n * Apply surgical JSONC updates while retaining every existing comment.\n *\n * @param contents - Existing contents, or null for a new file\n * @param updates - Ordered updates\n * @param label - Configuration label\n * @returns Updated contents\n */\nexport function mergeJsonc(\n contents: string | null,\n updates: readonly JsoncUpdate[],\n label: string,\n): string {\n let next = contents ?? '{}\\n';\n parseJsoncObject(next, label);\n if (contents !== null && hasTrailingPropertyComment(contents)) {\n throw new Error(\n `Cannot prove comment-preserving edits for ${label}; apply the displayed patch manually.`,\n );\n }\n const originalComments = extractComments(next);\n const formattingOptions = inferFormatting(next);\n updates.forEach(({ path, value }) => {\n next = applyEdits(\n next,\n modify(next, path, value, {\n formattingOptions: {\n ...formattingOptions,\n insertFinalNewline: true,\n keepLines: true,\n },\n }),\n );\n });\n const finalComments = extractComments(next);\n if (\n originalComments.length !== finalComments.length ||\n originalComments.some((comment, index) => finalComments[index] !== comment)\n ) {\n throw new Error(`A comment would move or disappear in ${label}; apply the patch manually.`);\n }\n parseJsoncObject(next, label);\n return next.endsWith(formattingOptions.eol) ? next : `${next}${formattingOptions.eol}`;\n}\n\n/**\n * Merge unique string values without reordering existing entries.\n *\n * @param current - Existing value\n * @param additions - Values to append\n * @returns Merged strings\n */\nexport function mergeStringArray(current: unknown, additions: readonly string[]): string[] {\n const values = Array.isArray(current)\n ? current.filter((value): value is string => typeof value === 'string')\n : [];\n return [...values, ...additions.filter((value) => !values.includes(value))];\n}\n"],"mappings":"oFAMA,MAAM,EAAoB,CAExB,gBAAiB,EAEjB,kBAAmB,EAEnB,kBAAmB,GAEnB,mBAAoB,GAEpB,gBAAiB,GAEjB,OAAQ,GAER,IAAK,GACN,CAiBD,SAAgB,EAAiB,EAAkB,EAAwC,CACzF,IAAM,EAAuB,EAAE,CACzB,EAAQ,EAAM,EAAU,EAAQ,CACpC,mBAAoB,GACpB,iBAAkB,GACnB,CAAC,CACF,GAAI,EAAO,OAAS,GAAuB,OAAO,GAAU,WAAnC,GAA+C,MAAM,QAAQ,EAAM,CAC1F,MAAU,MACR,uBAAuB,EAAM,qDAC9B,CAEH,OAAO,EAST,SAAS,EAAgB,EAOvB,CACA,IAAM,EAAS,EAAS,MAAM,cAAc,GAAG,IAAM,KACrD,MAAO,CACL,QAAS,EAAO,SAAS,IAAK,CAAG,EAAI,EAAO,OAC5C,aAAc,CAAC,EAAO,SAAS,IAAK,CACpC,IAAK,EAAS,SAAS;EAAO,CAAG;EAAS;EAC3C,CASH,SAAS,EAAgB,EAA4B,CACnD,IAAM,EAAU,EAAc,EAAU,GAAM,CACxC,EAAqB,EAAE,CACzB,EAAQ,EAAQ,MAAM,CAC1B,KAAO,IAAU,EAAkB,MAE/B,IAAU,EAAkB,mBAC5B,IAAU,EAAkB,qBAE5B,EAAS,KACP,EAAS,MACP,EAAQ,gBAAgB,CACxB,EAAQ,gBAAgB,CAAG,EAAQ,gBAAgB,CACpD,CACF,CAEH,EAAQ,EAAQ,MAAM,CAExB,OAAO,EAUT,SAAS,EAA2B,EAA2B,CAC7D,IAAM,EAAU,EAAc,EAAU,GAAM,CAC1C,EAA0B,GAC1B,EAAQ,EAAQ,MAAM,CAC1B,KAAO,IAAU,EAAkB,KAAK,CACtC,GAAI,IAAU,EAAkB,kBAAmB,CACjD,IAAM,EAAiB,IAA4B,EAAQ,mBAAmB,CAC1E,EAAO,EAAQ,MAAM,CACzB,KACE,IAAS,EAAkB,QAC3B,IAAS,EAAkB,iBAC3B,IAAS,EAAkB,mBAC3B,IAAS,EAAkB,oBAE3B,EAAO,EAAQ,MAAM,CAEvB,GACE,IACC,IAAS,EAAkB,iBAAmB,IAAS,EAAkB,mBAE1E,MAAO,GAET,EAAQ,EACR,SAGA,IAAU,EAAkB,QAC5B,IAAU,EAAkB,iBAC5B,IAAU,EAAkB,qBAE5B,EAA0B,EAAQ,mBAAmB,EAEvD,EAAQ,EAAQ,MAAM,CAExB,MAAO,GAWT,SAAgB,EACd,EACA,EACA,EACQ,CACR,IAAI,EAAO,GAAY;EAEvB,GADA,EAAiB,EAAM,EAAM,CACzB,IAAa,MAAQ,EAA2B,EAAS,CAC3D,MAAU,MACR,6CAA6C,EAAM,uCACpD,CAEH,IAAM,EAAmB,EAAgB,EAAK,CACxC,EAAoB,EAAgB,EAAK,CAC/C,EAAQ,SAAS,CAAE,OAAM,WAAY,CACnC,EAAO,EACL,EACA,EAAO,EAAM,EAAM,EAAO,CACxB,kBAAmB,CACjB,GAAG,EACH,mBAAoB,GACpB,UAAW,GACZ,CACF,CAAC,CACH,EACD,CACF,IAAM,EAAgB,EAAgB,EAAK,CAC3C,GACE,EAAiB,SAAW,EAAc,QAC1C,EAAiB,MAAM,EAAS,IAAU,EAAc,KAAW,EAAQ,CAE3E,MAAU,MAAM,wCAAwC,EAAM,6BAA6B,CAG7F,OADA,EAAiB,EAAM,EAAM,CACtB,EAAK,SAAS,EAAkB,IAAI,CAAG,EAAO,GAAG,IAAO,EAAkB,MAUnF,SAAgB,EAAiB,EAAkB,EAAwC,CACzF,IAAM,EAAS,MAAM,QAAQ,EAAQ,CACjC,EAAQ,OAAQ,GAA2B,OAAO,GAAU,SAAS,CACrE,EAAE,CACN,MAAO,CAAC,GAAG,EAAQ,GAAG,EAAU,OAAQ,GAAU,CAAC,EAAO,SAAS,EAAM,CAAC,CAAC"}
1
+ {"version":3,"file":"jsonc-CdTubr53.mjs","names":[],"sources":["../src/lib/scaffolding/jsonc.ts"],"sourcesContent":["import { applyEdits, createScanner, modify, parse, type ParseError } from 'jsonc-parser';\n\n/**\n * Runtime values of jsonc-parser's ambient const enum, repeated locally\n * because isolated modules cannot access that enum directly.\n */\nconst JSONC_SYNTAX_KIND = {\n /** Closing object delimiter. */\n CloseBraceToken: 2,\n /** Closing array delimiter. */\n CloseBracketToken: 4,\n /** Single-line comment. */\n LineCommentTrivia: 12,\n /** Block comment. */\n BlockCommentTrivia: 13,\n /** Line break. */\n LineBreakTrivia: 14,\n /** Whitespace. */\n Trivia: 15,\n /** End of input. */\n EOF: 17,\n} as const;\n\n/** One JSONC path update. */\nexport interface JsoncUpdate {\n /** Object path. */\n path: (string | number)[];\n /** Desired value. */\n value: unknown;\n}\n\n/**\n * Parse a JSONC object and fail with a manual-patch-oriented error.\n *\n * @param contents - JSON or JSONC text\n * @param label - Configuration label\n * @returns Parsed object\n */\nexport function parseJsoncObject(contents: string, label: string): Record<string, unknown> {\n const errors: ParseError[] = [];\n const value = parse(contents, errors, {\n allowTrailingComma: true,\n disallowComments: false,\n }) as unknown;\n if (errors.length > 0 || value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error(\n `Cannot safely merge ${label}; fix its JSONC syntax or apply the patch manually.`,\n );\n }\n return value as Record<string, unknown>;\n}\n\n/**\n * Infer formatting without reformatting existing content.\n *\n * @param contents - Existing JSONC\n * @returns Formatting settings\n */\nfunction inferFormatting(contents: string): {\n /** Number of spaces per indent. */\n tabSize: number;\n /** Whether indentation uses spaces. */\n insertSpaces: boolean;\n /** Existing line ending. */\n eol: string;\n} {\n const indent = contents.match(/\\n([ \\t]+)\"/)?.[1] ?? ' ';\n return {\n tabSize: indent.includes('\\t') ? 1 : indent.length,\n insertSpaces: !indent.includes('\\t'),\n eol: contents.includes('\\r\\n') ? '\\r\\n' : '\\n',\n };\n}\n\n/**\n * Capture comment text in order.\n *\n * @param contents - JSONC text\n * @returns Comments\n */\nfunction extractComments(contents: string): string[] {\n const scanner = createScanner(contents, false);\n const comments: string[] = [];\n let token = scanner.scan();\n while (token !== JSONC_SYNTAX_KIND.EOF) {\n if (\n token === JSONC_SYNTAX_KIND.LineCommentTrivia ||\n token === JSONC_SYNTAX_KIND.BlockCommentTrivia\n ) {\n comments.push(\n contents.slice(\n scanner.getTokenOffset(),\n scanner.getTokenOffset() + scanner.getTokenLength(),\n ),\n );\n }\n token = scanner.scan();\n }\n return comments;\n}\n\n/**\n * Detect the jsonc-parser insertion edge case that can reattach an inline\n * comment from the previous final property.\n *\n * @param contents - Existing JSONC text\n * @returns Whether a guarded manual patch is required\n */\nfunction hasTrailingPropertyComment(contents: string): boolean {\n const scanner = createScanner(contents, false);\n let previousSignificantLine = -1;\n let token = scanner.scan();\n while (token !== JSONC_SYNTAX_KIND.EOF) {\n if (token === JSONC_SYNTAX_KIND.LineCommentTrivia) {\n const hasInlineValue = previousSignificantLine === scanner.getTokenStartLine();\n let next = scanner.scan();\n while (\n next === JSONC_SYNTAX_KIND.Trivia ||\n next === JSONC_SYNTAX_KIND.LineBreakTrivia ||\n next === JSONC_SYNTAX_KIND.LineCommentTrivia ||\n next === JSONC_SYNTAX_KIND.BlockCommentTrivia\n ) {\n next = scanner.scan();\n }\n if (\n hasInlineValue &&\n (next === JSONC_SYNTAX_KIND.CloseBraceToken || next === JSONC_SYNTAX_KIND.CloseBracketToken)\n ) {\n return true;\n }\n token = next;\n continue;\n }\n if (\n token !== JSONC_SYNTAX_KIND.Trivia &&\n token !== JSONC_SYNTAX_KIND.LineBreakTrivia &&\n token !== JSONC_SYNTAX_KIND.BlockCommentTrivia\n ) {\n previousSignificantLine = scanner.getTokenStartLine();\n }\n token = scanner.scan();\n }\n return false;\n}\n\n/**\n * Apply surgical JSONC updates while retaining every existing comment.\n *\n * @param contents - Existing contents, or null for a new file\n * @param updates - Ordered updates\n * @param label - Configuration label\n * @returns Updated contents\n */\nexport function mergeJsonc(\n contents: string | null,\n updates: readonly JsoncUpdate[],\n label: string,\n): string {\n let next = contents ?? '{}\\n';\n parseJsoncObject(next, label);\n if (contents !== null && hasTrailingPropertyComment(contents)) {\n throw new Error(\n `Cannot prove comment-preserving edits for ${label}; apply the displayed patch manually.`,\n );\n }\n const originalComments = extractComments(next);\n const formattingOptions = inferFormatting(next);\n updates.forEach(({ path, value }) => {\n next = applyEdits(\n next,\n modify(next, path, value, {\n formattingOptions: {\n ...formattingOptions,\n insertFinalNewline: true,\n keepLines: true,\n },\n }),\n );\n });\n const finalComments = extractComments(next);\n if (\n originalComments.length !== finalComments.length ||\n originalComments.some((comment, index) => finalComments[index] !== comment)\n ) {\n throw new Error(`A comment would move or disappear in ${label}; apply the patch manually.`);\n }\n parseJsoncObject(next, label);\n return next.endsWith(formattingOptions.eol) ? next : `${next}${formattingOptions.eol}`;\n}\n\n/**\n * Merge unique string values without reordering existing entries.\n *\n * @param current - Existing value\n * @param additions - Values to append\n * @returns Merged strings\n */\nexport function mergeStringArray(current: unknown, additions: readonly string[]): string[] {\n const values = Array.isArray(current)\n ? current.filter((value): value is string => typeof value === 'string')\n : [];\n return [...values, ...additions.filter((value) => !values.includes(value))];\n}\n"],"mappings":"oFAMA,MAAM,EAAoB,CAExB,gBAAiB,EAEjB,kBAAmB,EAEnB,kBAAmB,GAEnB,mBAAoB,GAEpB,gBAAiB,GAEjB,OAAQ,GAER,IAAK,GACN,CAiBD,SAAgB,EAAiB,EAAkB,EAAwC,CACzF,IAAM,EAAuB,EAAE,CACzB,EAAQ,EAAM,EAAU,EAAQ,CACpC,mBAAoB,GACpB,iBAAkB,GACnB,CAAC,CACF,GAAI,EAAO,OAAS,GAAuB,OAAO,GAAU,WAAnC,GAA+C,MAAM,QAAQ,EAAM,CAC1F,MAAU,MACR,uBAAuB,EAAM,qDAC9B,CAEH,OAAO,EAST,SAAS,EAAgB,EAOvB,CACA,IAAM,EAAS,EAAS,MAAM,cAAc,GAAG,IAAM,KACrD,MAAO,CACL,QAAS,EAAO,SAAS,IAAK,CAAG,EAAI,EAAO,OAC5C,aAAc,CAAC,EAAO,SAAS,IAAK,CACpC,IAAK,EAAS,SAAS;EAAO,CAAG;EAAS;EAC3C,CASH,SAAS,EAAgB,EAA4B,CACnD,IAAM,EAAU,EAAc,EAAU,GAAM,CACxC,EAAqB,EAAE,CACzB,EAAQ,EAAQ,MAAM,CAC1B,KAAO,IAAU,EAAkB,MAE/B,IAAU,EAAkB,mBAC5B,IAAU,EAAkB,qBAE5B,EAAS,KACP,EAAS,MACP,EAAQ,gBAAgB,CACxB,EAAQ,gBAAgB,CAAG,EAAQ,gBAAgB,CACpD,CACF,CAEH,EAAQ,EAAQ,MAAM,CAExB,OAAO,EAUT,SAAS,EAA2B,EAA2B,CAC7D,IAAM,EAAU,EAAc,EAAU,GAAM,CAC1C,EAA0B,GAC1B,EAAQ,EAAQ,MAAM,CAC1B,KAAO,IAAU,EAAkB,KAAK,CACtC,GAAI,IAAU,EAAkB,kBAAmB,CACjD,IAAM,EAAiB,IAA4B,EAAQ,mBAAmB,CAC1E,EAAO,EAAQ,MAAM,CACzB,KACE,IAAS,EAAkB,QAC3B,IAAS,EAAkB,iBAC3B,IAAS,EAAkB,mBAC3B,IAAS,EAAkB,oBAE3B,EAAO,EAAQ,MAAM,CAEvB,GACE,IACC,IAAS,EAAkB,iBAAmB,IAAS,EAAkB,mBAE1E,MAAO,GAET,EAAQ,EACR,SAGA,IAAU,EAAkB,QAC5B,IAAU,EAAkB,iBAC5B,IAAU,EAAkB,qBAE5B,EAA0B,EAAQ,mBAAmB,EAEvD,EAAQ,EAAQ,MAAM,CAExB,MAAO,GAWT,SAAgB,EACd,EACA,EACA,EACQ,CACR,IAAI,EAAO,GAAY;EAEvB,GADA,EAAiB,EAAM,EAAM,CACzB,IAAa,MAAQ,EAA2B,EAAS,CAC3D,MAAU,MACR,6CAA6C,EAAM,uCACpD,CAEH,IAAM,EAAmB,EAAgB,EAAK,CACxC,EAAoB,EAAgB,EAAK,CAC/C,EAAQ,SAAS,CAAE,OAAM,WAAY,CACnC,EAAO,EACL,EACA,EAAO,EAAM,EAAM,EAAO,CACxB,kBAAmB,CACjB,GAAG,EACH,mBAAoB,GACpB,UAAW,GACZ,CACF,CAAC,CACH,EACD,CACF,IAAM,EAAgB,EAAgB,EAAK,CAC3C,GACE,EAAiB,SAAW,EAAc,QAC1C,EAAiB,MAAM,EAAS,IAAU,EAAc,KAAW,EAAQ,CAE3E,MAAU,MAAM,wCAAwC,EAAM,6BAA6B,CAG7F,OADA,EAAiB,EAAM,EAAM,CACtB,EAAK,SAAS,EAAkB,IAAI,CAAG,EAAO,GAAG,IAAO,EAAkB,MAUnF,SAAgB,EAAiB,EAAkB,EAAwC,CACzF,IAAM,EAAS,MAAM,QAAQ,EAAQ,CACjC,EAAQ,OAAQ,GAA2B,OAAO,GAAU,SAAS,CACrE,EAAE,CACN,MAAO,CAAC,GAAG,EAAQ,GAAG,EAAU,OAAQ,GAAU,CAAC,EAAO,SAAS,EAAM,CAAC,CAAC"}
@@ -1,2 +1,2 @@
1
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-BdFUbX5x.mjs.map
2
+ //# sourceMappingURL=listFiles-DDGCBdtx.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"listFiles-BdFUbX5x.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"}
1
+ {"version":3,"file":"listFiles-DDGCBdtx.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-CPu6zbyQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-CPu6zbyQ.mjs","names":[],"sources":["../src/logger.ts"],"sourcesContent":["export const logger = console;\n"],"mappings":"AAAA,MAAa,EAAS"}
@@ -1,2 +1,2 @@
1
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-Dqb6WL4r.mjs.map
2
+ //# sourceMappingURL=mapConsentCsvRowsToInputs-CkLfxaIf.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapConsentCsvRowsToInputs-Dqb6WL4r.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
+ {"version":3,"file":"mapConsentCsvRowsToInputs-CkLfxaIf.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-Upxn_rQF.mjs";import{t}from"./logger-zplFSeXU.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-Br5gIS3S.mjs.map
1
+ import{a as e}from"./constants-BRsj50Nb.mjs";import{t}from"./logger-CPu6zbyQ.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-BYNMCkhy.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"markRequestDataSiloIdsCompleted-Br5gIS3S.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-BYNMCkhy.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-Upxn_rQF.mjs";import{t}from"./logger-zplFSeXU.mjs";import{o as n}from"./request-BiPv6jmP.mjs";import{r}from"./fetchAllRequests-2TZr-LfT.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-Cs_iZNJs.mjs.map
1
+ import{a as e}from"./constants-BRsj50Nb.mjs";import{t}from"./logger-CPu6zbyQ.mjs";import{o as n}from"./request-BpKyN9Xm.mjs";import{r}from"./fetchAllRequests-BI0tFl_a.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-gKYivzH1.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"markSilentPrivacyRequests-Cs_iZNJs.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-gKYivzH1.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-zplFSeXU.mjs";import{gt as t}from"./codecs-CTxFjCg4.mjs";import{chunk as n,difference as r,flatten as i,keyBy as a,uniq as o}from"lodash-es";import s from"colors";import{apply as c,getEntries as l}from"@transcend-io/type-utils";import{CREATE_DATA_SILOS as u,UPDATE_DATA_SILOS as d,UPDATE_OR_CREATE_DATA_POINT as f,convertToDataSubjectBlockList as p,createDataSubject as m,fetchAllActions as h,fetchAllAttributes as g,fetchAllDataSilos as _,fetchAllDataSubjects as v,fetchApiKeys as y,fetchIdentifiersAndCreateMissing as b,makeGraphQLRequest as x,syncAction as S,syncActionItemCollections as C,syncActionItems as w,syncAttribute as T,syncBusinessEntities as ee,syncConsentManager as te,syncConsentWorkflowTriggers as ne,syncCookies as re,syncDataCategories as ie,syncDataFlows as ae,syncDataSiloDependencies as oe,syncDataSubject as se,syncEnricher as ce,syncIdentifier as le,syncIntlMessages as ue,syncPartitions as de,syncPolicies as fe,syncPreferenceOptionValues as pe,syncPreferenceTopics as me,syncPrivacyCenter as he,syncProcessingActivities as ge,syncProcessingPurposes as _e,syncPurposes as ve,syncTeams as ye,syncTemplate as be,syncVendors as xe,syncWorkflowConfigs as Se}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 Ce(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":n=[],"processing-activities":c=[],preflights:l=[]},u,d=!1){let f=o([...i(t.map(e=>e[`data-subjects`]||[])||[]),...i(c.map(({dataSubjectTypes:e})=>e??[])??[]),...i(l.map(e=>e[`data-subjects`]||[])||[]),...n.map(e=>e.type)]);if(f.length===0&&!d)return{};let p=await v(u,{logger:e}),h=a(p,`type`),g=r(f,p.map(({type:e})=>e));if(g.length>0){e.info(s.magenta(`Creating ${g.length} new data subjects...`));for(let t of g){e.info(s.magenta(`Creating data subject ${t}...`));let n=await m(u,{input:t,logger:e});e.info(s.green(`Created data subject ${t}!`)),h[t]=n}}return h}function we(e,t){if(e.length===0)return[];if(typeof e[0]==`string`)return[{titles:o(e)}];let n,r=[],i=new Set,a=(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){a(e.workflow,{resetToGlobal:!0});return}if(e.workflow){a(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:o(n)}],...r]}async function j(t,r,{pageSize:i,dataSubjectsByName:o,apiKeysByTitle:l}){let m=!1,h=new Date().getTime();e.info(s.magenta(`Syncing "${t.length}" data silos...`));let g=a(await _(r,{titles:t.map(({title:e})=>e),pageSize:i,logger:e}),`title`),v=t.filter(({title:e})=>!g[e]);v.length>0&&(e.info(s.magenta(`Creating "${v.length}" data silos that did not exist...`)),await D(n(v,20),async t=>{let{createDataSilos:{dataSilos:n}}=await x(r,u,{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=>{g[e.title]=e})}),e.info(s.green(`Successfully created "${v.length}" data silos!`)));let y=n(t,20);await D(y,async(t,n)=>{e.info(s.magenta(`[Batch ${n+1}/${y.length}] Syncing "${t.length}" data silos`)),await x(r,d,{variables:{input:{dataSilos:t.map(e=>({id:g[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`]?l[e[`api-key-title`]].id:void 0,dataSubjectBlockListIds:e[`data-subjects`]?p(e[`data-subjects`],o):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(s.green(`[Batch ${n+1}/${y.length}] Synced "${t.length}" data silos!`))});let b=new O.SingleBar({},O.Presets.shades_classic),S=t.filter(({datapoints:e=[]})=>e.length>0),C=t.map(({datapoints:e=[]})=>e.length).reduce((e,t)=>e+t,0);e.info(s.magenta(`Syncing "${C}" datapoints from "${S.length}" data silos...`)),b.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:g[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},o=(a.subDataPoints||[]).map(({name:e})=>e),c=o.filter((e,t)=>o.indexOf(e)!==t);if(c.length>0)e.info(s.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-CPu6zbyQ.mjs";import{gt as t}from"./codecs-CfcaFoZR.mjs";import{chunk as n,difference as r,flatten as i,keyBy as a,uniq as o}from"lodash-es";import s from"colors";import{apply as c,getEntries as l}from"@transcend-io/type-utils";import{CREATE_DATA_SILOS as u,UPDATE_DATA_SILOS as d,UPDATE_OR_CREATE_DATA_POINT as f,convertToDataSubjectBlockList as p,createDataSubject as m,fetchAllActions as h,fetchAllAttributes as g,fetchAllDataSilos as _,fetchAllDataSubjects as v,fetchApiKeys as y,fetchIdentifiersAndCreateMissing as b,makeGraphQLRequest as x,syncAction as S,syncActionItemCollections as C,syncActionItems as w,syncAttribute as T,syncBusinessEntities as ee,syncConsentManager as te,syncConsentWorkflowTriggers as ne,syncCookies as re,syncDataCategories as ie,syncDataFlows as ae,syncDataSiloDependencies as oe,syncDataSubject as se,syncEnricher as ce,syncIdentifier as le,syncIntlMessages as ue,syncPartitions as de,syncPolicies as fe,syncPreferenceOptionValues as pe,syncPreferenceTopics as me,syncPrivacyCenter as he,syncProcessingActivities as ge,syncProcessingPurposes as _e,syncPurposes as ve,syncTeams as ye,syncTemplate as be,syncVendors as xe,syncWorkflowConfigs as Se}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 Ce(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":n=[],"processing-activities":c=[],preflights:l=[]},u,d=!1){let f=o([...i(t.map(e=>e[`data-subjects`]||[])||[]),...i(c.map(({dataSubjectTypes:e})=>e??[])??[]),...i(l.map(e=>e[`data-subjects`]||[])||[]),...n.map(e=>e.type)]);if(f.length===0&&!d)return{};let p=await v(u,{logger:e}),h=a(p,`type`),g=r(f,p.map(({type:e})=>e));if(g.length>0){e.info(s.magenta(`Creating ${g.length} new data subjects...`));for(let t of g){e.info(s.magenta(`Creating data subject ${t}...`));let n=await m(u,{input:t,logger:e});e.info(s.green(`Created data subject ${t}!`)),h[t]=n}}return h}function we(e,t){if(e.length===0)return[];if(typeof e[0]==`string`)return[{titles:o(e)}];let n,r=[],i=new Set,a=(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){a(e.workflow,{resetToGlobal:!0});return}if(e.workflow){a(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:o(n)}],...r]}async function j(t,r,{pageSize:i,dataSubjectsByName:o,apiKeysByTitle:l}){let m=!1,h=new Date().getTime();e.info(s.magenta(`Syncing "${t.length}" data silos...`));let g=a(await _(r,{titles:t.map(({title:e})=>e),pageSize:i,logger:e}),`title`),v=t.filter(({title:e})=>!g[e]);v.length>0&&(e.info(s.magenta(`Creating "${v.length}" data silos that did not exist...`)),await D(n(v,20),async t=>{let{createDataSilos:{dataSilos:n}}=await x(r,u,{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=>{g[e.title]=e})}),e.info(s.green(`Successfully created "${v.length}" data silos!`)));let y=n(t,20);await D(y,async(t,n)=>{e.info(s.magenta(`[Batch ${n+1}/${y.length}] Syncing "${t.length}" data silos`)),await x(r,d,{variables:{input:{dataSilos:t.map(e=>({id:g[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`]?l[e[`api-key-title`]].id:void 0,dataSubjectBlockListIds:e[`data-subjects`]?p(e[`data-subjects`],o):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(s.green(`[Batch ${n+1}/${y.length}] Synced "${t.length}" data silos!`))});let b=new O.SingleBar({},O.Presets.shades_classic),S=t.filter(({datapoints:e=[]})=>e.length>0),C=t.map(({datapoints:e=[]})=>e.length).reduce((e,t)=>e+t,0);e.info(s.magenta(`Syncing "${C}" datapoints from "${S.length}" data silos...`)),b.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:g[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},o=(a.subDataPoints||[]).map(({name:e})=>e),c=o.filter((e,t)=>o.indexOf(e)!==t);if(c.length>0)e.info(s.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 x(r,f,{variables:a,logger:e})}catch(r){e.info(s.red(`\nFailed to update datapoint "${t.key}" for data silo "${n}"! - \n${r.message}`)),m=!0}w+=1,b.update(w)})},{concurrency:10}),b.stop();let T=new Date().getTime()-h;return e.info(s.green(`Synced "${t.length}" data silos and "${C}" datapoints in "${T/1e3}" seconds!`)),{success:!m,dataSiloTitleToId:c(g,({id:e})=>e)}}async function M(n,r,{pageSize:i=50,publishToPrivacyCenter:a=!0,classifyService:o=!1,deleteExtraAttributeValues:c=!1,logger:l,warnings:u=[]}){let d=t(n),f=l??e,p=[],m=!1,_=(e,t,n)=>{p.push({resource:e,item:n,message:t}),m=!0};f.info(s.magenta(`Fetching data with page size ${i}...`));let{templates:x,attributes:D,actions:O,identifiers:k,"data-subjects":M,"business-entities":N,preflights:P,cookies:F,"consent-manager":I,"data-silos":L,"data-flows":R,vendors:z,"data-categories":B,"processing-activities":V,"processing-purposes":H,"action-items":U,"action-item-collections":W,teams:G,"privacy-center":K,messages:q,policies:J,partitions:Y,"preference-workflow-configs":Te,"workflow-configs":Ee}=d,De=d[`preference-options`],X=d.purposes,Oe=Ce(d);if(Oe.length>0){for(let e of Oe)_(`preference-slugs`,e);return{success:!1,errors:p,warnings:u.length>0?u:void 0}}let[Z,Q,ke]=await Promise.all([P||k?b(r,{input:d,skipPublish:!a,logger:e}):{},L||M||P||V?A(d,r):{},L&&L.map(e=>e[`api-key-title`]||[]).reduce((e,t)=>e+t.length,0)>0?y(r,{apiKeyInputs:d,logger:e}):{}]);if(Te?.length&&(await ne(r,Te,{logger:f,pageSize:i})||_(`preference-workflow-configs`,`Failed to sync preference workflow configs`)),Ee?.length&&(await Se(r,Ee,{logger:f})||_(`workflow-configs`,`Failed to sync workflow configs`)),De?.length&&(await pe(r,De,{logger:f})||_(`preference-options`,`Failed to sync preference option values`)),X?.length){let{success:e,purposeIdByTrackingType:t}=await ve(r,X,{logger:f});e||_(`purposes`,`Failed to sync one or more purposes`);let n=X.flatMap(e=>(e[`preference-topics`]??[]).map(t=>({...t,"tracking-type":e.trackingType})));n.length>0&&(await me(r,n,{logger:f,purposeIdByTrackingType:t})||_(`preference-topics`,`Failed to sync one or more preference topics`))}if(I){f.info(s.magenta(`Syncing consent manager...`));try{await te(r,I,{logger:f}),f.info(s.green(`Successfully synced consent manager!`))}catch(e){_(`consent-manager`,e.message),f.error(s.red(`Failed to sync consent manager! - ${e.message}`))}}if(G){let t=await ye(r,G,{logger:e});m||=!t}if(x&&(e.info(s.magenta(`Syncing "${x.length}" email templates...`)),await E(x,async t=>{e.info(s.magenta(`Syncing template "${t.title}"...`));try{await be(r,t,{logger:e}),e.info(s.green(`Successfully synced template "${t.title}"!`))}catch(n){m=!0,e.error(s.red(`Failed to sync template "${t.title}"! - ${n.message}`))}},{concurrency:10}),e.info(s.green(`Synced "${x.length}" email templates!`))),N){let t=await ee(r,N,{logger:e});m||=!t}if(z){let t=await xe(r,z,{logger:e});m||=!t}if(B){let t=await ie(r,B,{logger:e});m||=!t}if(H){let t=await _e(r,H,{logger:e});m||=!t}if(Y){let t=await de(r,Y,{logger:e});m||=!t}if(F){let t=await re(r,F,{logger:e});m||=!t}if(W){let t=await C(r,W,{logger:e});m||=!t}if(D){e.info(s.magenta(`Syncing "${D.length}" attributes...`));let t=await g(r,{logger:e});await E(D,async n=>{let i=t.find(e=>e.name===n.name);e.info(s.magenta(`Syncing attribute "${n.name}"...`));try{await T(r,n,{existingAttribute:i,deleteExtraAttributeValues:c,logger:e}),e.info(s.green(`Successfully synced attribute "${n.name}"!`))}catch(t){m=!0,e.error(s.red(`Failed to sync attribute "${n.name}"! - ${t.message}`))}},{concurrency:10}),e.info(s.green(`Synced "${D.length}" attributes!`))}if(U){let t=await w(r,U,{logger:e});m||=!t}if(P&&(e.info(s.magenta(`Syncing "${P.length}" preflight checks...`)),await E(P,async t=>{e.info(s.magenta(`Syncing preflight check "${t.title}"...`));try{await ce(r,{input:t,identifierByName:Z,dataSubjectsByName:Q,logger:e}),e.info(s.green(`Successfully synced preflight check "${t.title}"!`))}catch(n){m=!0,e.error(s.red(`Failed to sync preflight check "${t.title}"! - ${n.message}`))}},{concurrency:10}),e.info(s.green(`Synced "${P.length}" preflight checks!`))),k&&(e.info(s.magenta(`Syncing "${k.length}" identifiers...`)),await E(k,async t=>{let n=Z[t.name];if(!n)throw Error(`Failed to find identifier with name: ${t.type}. Should have been auto-created by cli.`);e.info(s.magenta(`Syncing identifier "${t.type}"...`));try{await le(r,{input:t,dataSubjectsByName:Q,identifierId:n.id,skipPublish:!a,logger:e}),e.info(s.green(`Successfully synced identifier "${t.type}"!`))}catch(n){m=!0,e.info(s.red(`Failed to sync identifier "${t.type}"! - ${n.message}`))}},{concurrency:10}),e.info(s.green(`Synced "${k.length}" identifiers!`))),O){e.info(s.magenta(`Syncing "${O.length}" actions...`));let t=await h(r,{logger:e});await E(O,async n=>{let i=t.find(e=>e.type===n.type);if(!i)throw Error(`Failed to find action with type: ${n.type}. Should have already existing in the organization.`);e.info(s.magenta(`Syncing action "${n.type}"...`));try{await S(r,{action:n,actionId:i.id,skipPublish:!a},{logger:e}),e.info(s.green(`Successfully synced action "${n.type}"!`))}catch(t){m=!0,e.error(s.red(`Failed to sync action "${n.type}"! - ${t.message}`))}},{concurrency:10}),e.info(s.green(`Synced "${O.length}" actions!`))}if(M){e.info(s.magenta(`Syncing "${M.length}" data subjects...`));let t=await v(r,{logger:e});await E(M,async n=>{let i=t.find(e=>e.type===n.type);if(!i)throw Error(`Failed to find data subject with type: ${n.type}. Should have already existing in the organization.`);e.info(s.magenta(`Syncing data subject "${n.type}"...`));try{await se(r,{input:n,dataSubjectId:i.id,skipPublish:!a,logger:e}),e.info(s.green(`Successfully synced data subject "${n.type}"!`))}catch(t){m=!0;let r=n.supportsAuthorizedAgent!==void 0&&/authorized.agent/i.test(t.message)?` (enable the Authorized Agents feature for this organization before setting "supportsAuthorizedAgent")`:``;e.info(s.red(`Failed to sync data subject "${n.type}"! - ${t.message}${r}`))}},{concurrency:10}),e.info(s.green(`Synced "${M.length}" data subjects!`))}if(R){let t=await ae(r,R,{classifyService:o,logger:e});m||=!t}if(K)try{await he(r,K,{logger:e,skipPublish:!a})||_(`privacy-center`,`Failed to sync privacy center`)}catch(e){_(`privacy-center`,e.message)}if(q){let t=await ue(r,q,{logger:e});m||=!t}if(J){let t=await fe(r,J,{logger:e});m||=!t}let $=[];if(L){let{success:e,dataSiloTitleToId:t}=await j(L,r,{dataSubjectsByName:Q,apiKeysByTitle:ke,pageSize:i});L?.forEach(e=>{let n=e[`deletion-dependencies`];if(n)try{$.push([t[e.title],we(n,e.title)])}catch(t){_(`data-silos`,t.message,e.title),f.error(s.red(t.message))}}),m||=!e}if($.length>0){let t=await oe(r,{input:$,logger:e});m||=!t}if(V){let t=await ge(r,V,{logger:e});m||=!t}return{success:!m,errors:p,warnings:u.length>0?u:void 0}}function N(e,...n){let r=JSON.parse(JSON.stringify(e));return n.forEach(e=>{l(e).forEach(([e,t])=>{r[e]===void 0?r[e]=t:Array.isArray(t)?r[e]=[...r[e],...t]:r[e]=t})}),t(r)}export{A as i,M as n,j as r,N as t};
3
- //# sourceMappingURL=mergeTranscendInputs-DFQcbh8b.mjs.map
3
+ //# sourceMappingURL=mergeTranscendInputs-D1CvxQu0.mjs.map