@transcend-io/cli 10.27.5 → 10.28.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 (302) hide show
  1. package/README.md +193 -24
  2. package/dist/app-DCY8E776.mjs +148 -0
  3. package/dist/app-DCY8E776.mjs.map +1 -0
  4. package/dist/{approvePrivacyRequests-B842tXn4.mjs → approvePrivacyRequests-80SV_94y.mjs} +2 -2
  5. package/dist/{approvePrivacyRequests-B842tXn4.mjs.map → approvePrivacyRequests-80SV_94y.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-CRrUU89C.mjs → buildExamples-2YDkSvtA.mjs} +2 -2
  10. package/dist/{buildExamples-CRrUU89C.mjs.map → buildExamples-2YDkSvtA.mjs.map} +1 -1
  11. package/dist/{buildXdiSyncEndpoint-B9seJTxP.mjs → buildXdiSyncEndpoint-B3zUrI16.mjs} +2 -2
  12. package/dist/{buildXdiSyncEndpoint-B9seJTxP.mjs.map → buildXdiSyncEndpoint-B3zUrI16.mjs.map} +1 -1
  13. package/dist/{bulkRestartRequests-CE7cDUMd.mjs → bulkRestartRequests-BLb8OJmf.mjs} +2 -2
  14. package/dist/{bulkRestartRequests-CE7cDUMd.mjs.map → bulkRestartRequests-BLb8OJmf.mjs.map} +1 -1
  15. package/dist/{bulkRetryEnrichers-BcSANZPC.mjs → bulkRetryEnrichers-BA9cboSe.mjs} +2 -2
  16. package/dist/{bulkRetryEnrichers-BcSANZPC.mjs.map → bulkRetryEnrichers-BA9cboSe.mjs.map} +1 -1
  17. package/dist/{cancelPrivacyRequests-BKibbagv.mjs → cancelPrivacyRequests-BEyOBJ2r.mjs} +2 -2
  18. package/dist/{cancelPrivacyRequests-BKibbagv.mjs.map → cancelPrivacyRequests-BEyOBJ2r.mjs.map} +1 -1
  19. package/dist/{codecs-zRkskjaJ.mjs → codecs-BsQFAFGT.mjs} +1 -1
  20. package/dist/{codecs-zRkskjaJ.mjs.map → codecs-BsQFAFGT.mjs.map} +1 -1
  21. package/dist/{collectCsvFilesOrExit-Dg5U3Qx_.mjs → collectCsvFilesOrExit-BqnmK63h.mjs} +1 -1
  22. package/dist/{collectCsvFilesOrExit-Dg5U3Qx_.mjs.map → collectCsvFilesOrExit-BqnmK63h.mjs.map} +1 -1
  23. package/dist/{collectParquetFilesOrExit-BlG2RRSC.mjs → collectParquetFilesOrExit-BiksFI-Q.mjs} +1 -1
  24. package/dist/{collectParquetFilesOrExit-BlG2RRSC.mjs.map → collectParquetFilesOrExit-BiksFI-Q.mjs.map} +1 -1
  25. package/dist/{command-DKNKpgUB.mjs → command-eIenZMOx.mjs} +2 -2
  26. package/dist/{command-DKNKpgUB.mjs.map → command-eIenZMOx.mjs.map} +1 -1
  27. package/dist/commands/admin/chunk-csv/worker.mjs +1 -1
  28. package/dist/commands/admin/parquet-to-csv/worker.mjs +1 -1
  29. package/dist/{consentManagersToBusinessEntities-Rv-ajWya.mjs → consentManagersToBusinessEntities-O4KBox9u.mjs} +1 -1
  30. package/dist/{consentManagersToBusinessEntities-Rv-ajWya.mjs.map → consentManagersToBusinessEntities-O4KBox9u.mjs.map} +1 -1
  31. package/dist/{constants-CdgK1myP.mjs → constants-BG53Mbi9.mjs} +2 -2
  32. package/dist/{constants-CdgK1myP.mjs.map → constants-BG53Mbi9.mjs.map} +1 -1
  33. package/dist/{constants-FbK2iR--.mjs → constants-BMAOvdcA.mjs} +1 -1
  34. package/dist/{constants-FbK2iR--.mjs.map → constants-BMAOvdcA.mjs.map} +1 -1
  35. package/dist/{constants-B6wESCW2.mjs → constants-BpQ5awGp.mjs} +2 -2
  36. package/dist/{constants-B6wESCW2.mjs.map → constants-BpQ5awGp.mjs.map} +1 -1
  37. package/dist/{constants-BuoISmXP.mjs → constants-C1seVfCu.mjs} +1 -1
  38. package/dist/{constants-BuoISmXP.mjs.map → constants-C1seVfCu.mjs.map} +1 -1
  39. package/dist/{context-4GAUnhTE.mjs → context-CZYrQfAn.mjs} +1 -1
  40. package/dist/{context-4GAUnhTE.mjs.map → context-CZYrQfAn.mjs.map} +1 -1
  41. package/dist/{createPoolingCommandUi-vTsGgYZT.mjs → createPoolingCommandUi-C39R_zo3.mjs} +2 -2
  42. package/dist/{createPoolingCommandUi-vTsGgYZT.mjs.map → createPoolingCommandUi-C39R_zo3.mjs.map} +1 -1
  43. package/dist/{dataFlowsToDataSilos-DRuAfwIn.mjs → dataFlowsToDataSilos-CLSHb1GA.mjs} +1 -1
  44. package/dist/{dataFlowsToDataSilos-DRuAfwIn.mjs.map → dataFlowsToDataSilos-CLSHb1GA.mjs.map} +1 -1
  45. package/dist/deno-runtime-QqwBDKXX.mjs +2 -0
  46. package/dist/deno-runtime-QqwBDKXX.mjs.map +1 -0
  47. package/dist/{done-input-validation-BFgMCQWH.mjs → done-input-validation-Cjk7a3jX.mjs} +1 -1
  48. package/dist/{done-input-validation-BFgMCQWH.mjs.map → done-input-validation-Cjk7a3jX.mjs.map} +1 -1
  49. package/dist/{downloadPrivacyRequestFiles-Dn3VexN2.mjs → downloadPrivacyRequestFiles-CLFgQItk.mjs} +2 -2
  50. package/dist/{downloadPrivacyRequestFiles-Dn3VexN2.mjs.map → downloadPrivacyRequestFiles-CLFgQItk.mjs.map} +1 -1
  51. package/dist/{extractClientError-DeS63kje.mjs → extractClientError-C_6ly7Gw.mjs} +1 -1
  52. package/dist/{extractClientError-DeS63kje.mjs.map → extractClientError-C_6ly7Gw.mjs.map} +1 -1
  53. package/dist/{fetchAllRequests-DUQGTJjx.mjs → fetchAllRequests-CEDKdq0c.mjs} +2 -2
  54. package/dist/{fetchAllRequests-DUQGTJjx.mjs.map → fetchAllRequests-CEDKdq0c.mjs.map} +1 -1
  55. package/dist/{formatPolicyBundleVersionSummary-Bo7DYxoy.mjs → formatPolicyBundleVersionSummary-CrFtcPwS.mjs} +1 -1
  56. package/dist/{formatPolicyBundleVersionSummary-Bo7DYxoy.mjs.map → formatPolicyBundleVersionSummary-CrFtcPwS.mjs.map} +1 -1
  57. package/dist/{fuzzyMatchColumns-BDD4a2W0.mjs → fuzzyMatchColumns-OTsFJ21f.mjs} +2 -2
  58. package/dist/{fuzzyMatchColumns-BDD4a2W0.mjs.map → fuzzyMatchColumns-OTsFJ21f.mjs.map} +1 -1
  59. package/dist/{generateCrossAccountApiKeys-QhnLqtUN.mjs → generateCrossAccountApiKeys-D6O_Qm3Y.mjs} +2 -2
  60. package/dist/{generateCrossAccountApiKeys-QhnLqtUN.mjs.map → generateCrossAccountApiKeys-D6O_Qm3Y.mjs.map} +1 -1
  61. package/dist/{impl-CrY1za0t.mjs → impl-6m7GXUAe.mjs} +2 -2
  62. package/dist/{impl-CrY1za0t.mjs.map → impl-6m7GXUAe.mjs.map} +1 -1
  63. package/dist/{impl-D33Zr0vh2.mjs → impl-B--lr5RJ2.mjs} +2 -2
  64. package/dist/{impl-D33Zr0vh2.mjs.map → impl-B--lr5RJ2.mjs.map} +1 -1
  65. package/dist/{impl-QeWNZCg4.mjs → impl-B3_hrFPX.mjs} +2 -2
  66. package/dist/{impl-QeWNZCg4.mjs.map → impl-B3_hrFPX.mjs.map} +1 -1
  67. package/dist/{impl-CbijbA-M2.mjs → impl-BFJtKA2o2.mjs} +2 -2
  68. package/dist/{impl-CbijbA-M2.mjs.map → impl-BFJtKA2o2.mjs.map} +1 -1
  69. package/dist/{impl-GnxjtYL7.mjs → impl-BJlKQJdS2.mjs} +2 -2
  70. package/dist/impl-BJlKQJdS2.mjs.map +1 -0
  71. package/dist/{impl-_rrZ0KXo.mjs → impl-BNPgYSBT.mjs} +2 -2
  72. package/dist/{impl-_rrZ0KXo.mjs.map → impl-BNPgYSBT.mjs.map} +1 -1
  73. package/dist/{impl-s5h7dIlv2.mjs → impl-BWVe4VGF2.mjs} +2 -2
  74. package/dist/{impl-s5h7dIlv2.mjs.map → impl-BWVe4VGF2.mjs.map} +1 -1
  75. package/dist/{impl-DiyWNLJq.mjs → impl-BYGNx-8W2.mjs} +2 -2
  76. package/dist/impl-BYGNx-8W2.mjs.map +1 -0
  77. package/dist/impl-BcJ019T2.mjs +2 -0
  78. package/dist/impl-BcJ019T2.mjs.map +1 -0
  79. package/dist/{impl-CMYYX3Kz.mjs → impl-BewF8tB6.mjs} +2 -2
  80. package/dist/{impl-CMYYX3Kz.mjs.map → impl-BewF8tB6.mjs.map} +1 -1
  81. package/dist/{impl-DQG3PiAW2.mjs → impl-Bq6g_xYv.mjs} +2 -2
  82. package/dist/impl-Bq6g_xYv.mjs.map +1 -0
  83. package/dist/{impl-DRimS_G8.mjs → impl-BqrSLoig.mjs} +2 -2
  84. package/dist/{impl-DRimS_G8.mjs.map → impl-BqrSLoig.mjs.map} +1 -1
  85. package/dist/{impl-CccuY3Za.mjs → impl-Bs-drNBf.mjs} +2 -2
  86. package/dist/{impl-CccuY3Za.mjs.map → impl-Bs-drNBf.mjs.map} +1 -1
  87. package/dist/impl-BsC1KVxS.mjs +2 -0
  88. package/dist/impl-BsC1KVxS.mjs.map +1 -0
  89. package/dist/{impl-BgxjEv88.mjs → impl-BvNZqLrT.mjs} +2 -2
  90. package/dist/{impl-BgxjEv88.mjs.map → impl-BvNZqLrT.mjs.map} +1 -1
  91. package/dist/{impl-BkyqCY72.mjs → impl-BwRcpAno.mjs} +2 -2
  92. package/dist/{impl-BkyqCY72.mjs.map → impl-BwRcpAno.mjs.map} +1 -1
  93. package/dist/{impl-BddyFp_q.mjs → impl-BySmbxEt.mjs} +2 -2
  94. package/dist/{impl-BddyFp_q.mjs.map → impl-BySmbxEt.mjs.map} +1 -1
  95. package/dist/{impl-BPn_YPIq2.mjs → impl-C50tdWlL2.mjs} +2 -2
  96. package/dist/{impl-BPn_YPIq2.mjs.map → impl-C50tdWlL2.mjs.map} +1 -1
  97. package/dist/{impl-CusKk_JR2.mjs → impl-C5dzaDga2.mjs} +2 -2
  98. package/dist/{impl-CusKk_JR2.mjs.map → impl-C5dzaDga2.mjs.map} +1 -1
  99. package/dist/impl-C8BmxFQ2.mjs +2 -0
  100. package/dist/impl-C8BmxFQ2.mjs.map +1 -0
  101. package/dist/{impl-CBC5K-IH.mjs → impl-CDtUusmg.mjs} +2 -2
  102. package/dist/{impl-CBC5K-IH.mjs.map → impl-CDtUusmg.mjs.map} +1 -1
  103. package/dist/{impl-Dpes0u_6.mjs → impl-CE56-wQh.mjs} +2 -2
  104. package/dist/{impl-Dpes0u_6.mjs.map → impl-CE56-wQh.mjs.map} +1 -1
  105. package/dist/{impl-DzJG5HaX.mjs → impl-CEmXPEq22.mjs} +2 -2
  106. package/dist/impl-CEmXPEq22.mjs.map +1 -0
  107. package/dist/{impl-CZ-KvZE02.mjs → impl-CHmjV-Pa.mjs} +2 -2
  108. package/dist/impl-CHmjV-Pa.mjs.map +1 -0
  109. package/dist/{impl-CXdy0YMX.mjs → impl-CQGeH47F.mjs} +2 -2
  110. package/dist/{impl-CXdy0YMX.mjs.map → impl-CQGeH47F.mjs.map} +1 -1
  111. package/dist/{impl-DG9RwTkA2.mjs → impl-CTIWliTx.mjs} +2 -2
  112. package/dist/impl-CTIWliTx.mjs.map +1 -0
  113. package/dist/{impl-DbPLuDc22.mjs → impl-CWh9H7mL.mjs} +2 -2
  114. package/dist/impl-CWh9H7mL.mjs.map +1 -0
  115. package/dist/{impl-BQTw6jpw.mjs → impl-CXUJ1eRC.mjs} +2 -2
  116. package/dist/{impl-BQTw6jpw.mjs.map → impl-CXUJ1eRC.mjs.map} +1 -1
  117. package/dist/{impl-xRwX5ZLK.mjs → impl-CfPXYgT42.mjs} +2 -2
  118. package/dist/impl-CfPXYgT42.mjs.map +1 -0
  119. package/dist/{impl-CLVMZXJo.mjs → impl-CiYKuCHV.mjs} +2 -2
  120. package/dist/{impl-CLVMZXJo.mjs.map → impl-CiYKuCHV.mjs.map} +1 -1
  121. package/dist/{impl-BoCD0t4j.mjs → impl-CqF9xIIy.mjs} +2 -2
  122. package/dist/{impl-BoCD0t4j.mjs.map → impl-CqF9xIIy.mjs.map} +1 -1
  123. package/dist/{impl-CVChVd63.mjs → impl-Cx3T0Iei.mjs} +2 -2
  124. package/dist/{impl-CVChVd63.mjs.map → impl-Cx3T0Iei.mjs.map} +1 -1
  125. package/dist/impl-CzxvoiGW.mjs +3 -0
  126. package/dist/impl-CzxvoiGW.mjs.map +1 -0
  127. package/dist/impl-D-SQJc3t.mjs +2 -0
  128. package/dist/impl-D-SQJc3t.mjs.map +1 -0
  129. package/dist/{impl-BPjGRqOL2.mjs → impl-D23kJPAQ2.mjs} +2 -2
  130. package/dist/{impl-BPjGRqOL2.mjs.map → impl-D23kJPAQ2.mjs.map} +1 -1
  131. package/dist/{impl-uKjAibIR.mjs → impl-DF8RGVlT.mjs} +2 -2
  132. package/dist/{impl-uKjAibIR.mjs.map → impl-DF8RGVlT.mjs.map} +1 -1
  133. package/dist/{impl-PYtpY5hs2.mjs → impl-DHfYO9T52.mjs} +2 -2
  134. package/dist/{impl-PYtpY5hs2.mjs.map → impl-DHfYO9T52.mjs.map} +1 -1
  135. package/dist/{impl-p0AyZWFL.mjs → impl-DIPvFKiP.mjs} +2 -2
  136. package/dist/{impl-p0AyZWFL.mjs.map → impl-DIPvFKiP.mjs.map} +1 -1
  137. package/dist/{impl-CzbVqbm0.mjs → impl-DJLlcqSg.mjs} +2 -2
  138. package/dist/{impl-CzbVqbm0.mjs.map → impl-DJLlcqSg.mjs.map} +1 -1
  139. package/dist/{impl-3IyENr9T.mjs → impl-DOoR93T6.mjs} +2 -2
  140. package/dist/{impl-3IyENr9T.mjs.map → impl-DOoR93T6.mjs.map} +1 -1
  141. package/dist/{impl-BiBNqcob.mjs → impl-DXNcD7CZ.mjs} +2 -2
  142. package/dist/{impl-BiBNqcob.mjs.map → impl-DXNcD7CZ.mjs.map} +1 -1
  143. package/dist/{impl-nJ7LzilX2.mjs → impl-DYf10-BD2.mjs} +2 -2
  144. package/dist/{impl-nJ7LzilX2.mjs.map → impl-DYf10-BD2.mjs.map} +1 -1
  145. package/dist/{impl-wf0PvJms.mjs → impl-DYwojWvN.mjs} +2 -2
  146. package/dist/{impl-wf0PvJms.mjs.map → impl-DYwojWvN.mjs.map} +1 -1
  147. package/dist/{impl-CH40t5qf.mjs → impl-DbZ1cYoR.mjs} +2 -2
  148. package/dist/{impl-CH40t5qf.mjs.map → impl-DbZ1cYoR.mjs.map} +1 -1
  149. package/dist/{impl-DbF7uw7f2.mjs → impl-Dib6Fff12.mjs} +2 -2
  150. package/dist/{impl-DbF7uw7f2.mjs.map → impl-Dib6Fff12.mjs.map} +1 -1
  151. package/dist/{impl-4rLX5Wah2.mjs → impl-Dk6TZKrp2.mjs} +2 -2
  152. package/dist/{impl-4rLX5Wah2.mjs.map → impl-Dk6TZKrp2.mjs.map} +1 -1
  153. package/dist/{impl-Cq5wI-kP.mjs → impl-Dm-Fkr392.mjs} +2 -2
  154. package/dist/impl-Dm-Fkr392.mjs.map +1 -0
  155. package/dist/{impl-BsEYMBx2.mjs → impl-DpuhHpuk.mjs} +2 -2
  156. package/dist/{impl-BsEYMBx2.mjs.map → impl-DpuhHpuk.mjs.map} +1 -1
  157. package/dist/{impl-DlaWf-oS2.mjs → impl-Drql0g72.mjs} +2 -2
  158. package/dist/impl-Drql0g72.mjs.map +1 -0
  159. package/dist/{impl-_tY0CJdZ.mjs → impl-DzNk41xd.mjs} +2 -2
  160. package/dist/{impl-_tY0CJdZ.mjs.map → impl-DzNk41xd.mjs.map} +1 -1
  161. package/dist/impl-FLj_mWLO.mjs +2 -0
  162. package/dist/impl-FLj_mWLO.mjs.map +1 -0
  163. package/dist/{impl-DxXWaXFU.mjs → impl-GHukPBnk.mjs} +2 -2
  164. package/dist/{impl-DxXWaXFU.mjs.map → impl-GHukPBnk.mjs.map} +1 -1
  165. package/dist/{impl-V_ffkzbd2.mjs → impl-KKrDTraf.mjs} +2 -2
  166. package/dist/impl-KKrDTraf.mjs.map +1 -0
  167. package/dist/{impl-BbWzTCSd2.mjs → impl-M3Eu4QjS.mjs} +2 -2
  168. package/dist/impl-M3Eu4QjS.mjs.map +1 -0
  169. package/dist/{impl-BlFBTc6f.mjs → impl-VPBEqV0w2.mjs} +2 -2
  170. package/dist/impl-VPBEqV0w2.mjs.map +1 -0
  171. package/dist/{impl-DWBQKUuq.mjs → impl-amV0wRWk.mjs} +2 -2
  172. package/dist/{impl-DWBQKUuq.mjs.map → impl-amV0wRWk.mjs.map} +1 -1
  173. package/dist/impl-m3QXCc6n.mjs +91 -0
  174. package/dist/impl-m3QXCc6n.mjs.map +1 -0
  175. package/dist/{impl-Ba8naMzu.mjs → impl-syp5hclX.mjs} +2 -2
  176. package/dist/{impl-Ba8naMzu.mjs.map → impl-syp5hclX.mjs.map} +1 -1
  177. package/dist/{impl-9TDsbGfF2.mjs → impl-zZFaSmxd2.mjs} +2 -2
  178. package/dist/{impl-9TDsbGfF2.mjs.map → impl-zZFaSmxd2.mjs.map} +1 -1
  179. package/dist/index.d.mts +4 -4
  180. package/dist/index.d.mts.map +1 -1
  181. package/dist/index.mjs +1 -1
  182. package/dist/{initializeCliRuntime-B7zDhMok.mjs → initializeCliRuntime-802-P8MC.mjs} +1 -1
  183. package/dist/{initializeCliRuntime-B7zDhMok.mjs.map → initializeCliRuntime-802-P8MC.mjs.map} +1 -1
  184. package/dist/{inquirer-DNa31Mkx.mjs → inquirer-DkFTQU00.mjs} +2 -2
  185. package/dist/{inquirer-DNa31Mkx.mjs.map → inquirer-DkFTQU00.mjs.map} +1 -1
  186. package/dist/{listFiles-DrxRhlZ2.mjs → listFiles-CWHAdKY-.mjs} +1 -1
  187. package/dist/{listFiles-DrxRhlZ2.mjs.map → listFiles-CWHAdKY-.mjs.map} +1 -1
  188. package/dist/logger-9T6vva73.mjs +2 -0
  189. package/dist/logger-9T6vva73.mjs.map +1 -0
  190. package/dist/manifest-DVuW_vvO.mjs +2 -0
  191. package/dist/manifest-DVuW_vvO.mjs.map +1 -0
  192. package/dist/{mapConsentCsvRowsToInputs-DA7BRD7M.mjs → mapConsentCsvRowsToInputs-MMPZwzrV.mjs} +1 -1
  193. package/dist/{mapConsentCsvRowsToInputs-DA7BRD7M.mjs.map → mapConsentCsvRowsToInputs-MMPZwzrV.mjs.map} +1 -1
  194. package/dist/{markRequestDataSiloIdsCompleted-CK7PNwTz.mjs → markRequestDataSiloIdsCompleted-PKCcn5wQ.mjs} +2 -2
  195. package/dist/{markRequestDataSiloIdsCompleted-CK7PNwTz.mjs.map → markRequestDataSiloIdsCompleted-PKCcn5wQ.mjs.map} +1 -1
  196. package/dist/{markSilentPrivacyRequests-Cb-J9ckA.mjs → markSilentPrivacyRequests-7l9I99pe.mjs} +2 -2
  197. package/dist/{markSilentPrivacyRequests-Cb-J9ckA.mjs.map → markSilentPrivacyRequests-7l9I99pe.mjs.map} +1 -1
  198. package/dist/{mergeTranscendInputs-CkpitZbH.mjs → mergeTranscendInputs-CWHXH0kF.mjs} +2 -2
  199. package/dist/{mergeTranscendInputs-CkpitZbH.mjs.map → mergeTranscendInputs-CWHXH0kF.mjs.map} +1 -1
  200. package/dist/missing-manifest-BKj1j-jg.mjs +2 -0
  201. package/dist/missing-manifest-BKj1j-jg.mjs.map +1 -0
  202. package/dist/module-graph-DBC7ZvyA.mjs +2 -0
  203. package/dist/module-graph-DBC7ZvyA.mjs.map +1 -0
  204. package/dist/{notifyPrivacyRequestsAdditionalTime-it1FA62W.mjs → notifyPrivacyRequestsAdditionalTime-BPIYuCov.mjs} +2 -2
  205. package/dist/{notifyPrivacyRequestsAdditionalTime-it1FA62W.mjs.map → notifyPrivacyRequestsAdditionalTime-BPIYuCov.mjs.map} +1 -1
  206. package/dist/{parquetToCsvOneFile-Dtz90qfJ.mjs → parquetToCsvOneFile-CSVdrLvq.mjs} +2 -2
  207. package/dist/{parquetToCsvOneFile-Dtz90qfJ.mjs.map → parquetToCsvOneFile-CSVdrLvq.mjs.map} +1 -1
  208. package/dist/{parseAttributesFromString-BxJcnKmn.mjs → parseAttributesFromString-C5-KGkPH.mjs} +2 -2
  209. package/dist/{parseAttributesFromString-BxJcnKmn.mjs.map → parseAttributesFromString-C5-KGkPH.mjs.map} +1 -1
  210. package/dist/parseVariablesFromString-Cr3x2uq3.mjs +2 -0
  211. package/dist/parseVariablesFromString-Cr3x2uq3.mjs.map +1 -0
  212. package/dist/{policyEngineCliError-BnBghLd1.mjs → policyEngineCliError-DY8V-qkK.mjs} +1 -1
  213. package/dist/{policyEngineCliError-BnBghLd1.mjs.map → policyEngineCliError-DY8V-qkK.mjs.map} +1 -1
  214. package/dist/{printResult-oXnpZu_9.mjs → printResult-esxW3HhT.mjs} +2 -2
  215. package/dist/{printResult-oXnpZu_9.mjs.map → printResult-esxW3HhT.mjs.map} +1 -1
  216. package/dist/project-plan-apply-C2DfikVN.mjs +3 -0
  217. package/dist/project-plan-apply-C2DfikVN.mjs.map +1 -0
  218. package/dist/{pullAllDatapoints-XqreMBT5.mjs → pullAllDatapoints-H92qjLSx.mjs} +2 -2
  219. package/dist/{pullAllDatapoints-XqreMBT5.mjs.map → pullAllDatapoints-H92qjLSx.mjs.map} +1 -1
  220. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-DuPDOm6f.mjs → pullChunkedCustomSiloOutstandingIdentifiers-BrDmPbvc.mjs} +2 -2
  221. package/dist/{pullChunkedCustomSiloOutstandingIdentifiers-DuPDOm6f.mjs.map → pullChunkedCustomSiloOutstandingIdentifiers-BrDmPbvc.mjs.map} +1 -1
  222. package/dist/{pullConsentManagerMetrics-Dk5IejaY.mjs → pullConsentManagerMetrics-Cvex-gpd.mjs} +2 -2
  223. package/dist/{pullConsentManagerMetrics-Dk5IejaY.mjs.map → pullConsentManagerMetrics-Cvex-gpd.mjs.map} +1 -1
  224. package/dist/{pullManualEnrichmentIdentifiersToCsv-CAD1navz.mjs → pullManualEnrichmentIdentifiersToCsv-qjdNA75O.mjs} +2 -2
  225. package/dist/{pullManualEnrichmentIdentifiersToCsv-CAD1navz.mjs.map → pullManualEnrichmentIdentifiersToCsv-qjdNA75O.mjs.map} +1 -1
  226. package/dist/{pullTranscendConfiguration-NcFjHE8k.mjs → pullTranscendConfiguration-CD7Frn8z.mjs} +2 -2
  227. package/dist/{pullTranscendConfiguration-NcFjHE8k.mjs.map → pullTranscendConfiguration-CD7Frn8z.mjs.map} +1 -1
  228. package/dist/{pullUnstructuredSubDataPointRecommendations-Cf4irXl4.mjs → pullUnstructuredSubDataPointRecommendations-Dmh_-r95.mjs} +2 -2
  229. package/dist/{pullUnstructuredSubDataPointRecommendations-Cf4irXl4.mjs.map → pullUnstructuredSubDataPointRecommendations-Dmh_-r95.mjs.map} +1 -1
  230. package/dist/{pushCronIdentifiersFromCsv-BGaJycWo.mjs → pushCronIdentifiersFromCsv-DjeY7TtK.mjs} +2 -2
  231. package/dist/{pushCronIdentifiersFromCsv-BGaJycWo.mjs.map → pushCronIdentifiersFromCsv-DjeY7TtK.mjs.map} +1 -1
  232. package/dist/{pushManualEnrichmentIdentifiersFromCsv-B9okRkhL.mjs → pushManualEnrichmentIdentifiersFromCsv-BDtMo13j.mjs} +2 -2
  233. package/dist/{pushManualEnrichmentIdentifiersFromCsv-B9okRkhL.mjs.map → pushManualEnrichmentIdentifiersFromCsv-BDtMo13j.mjs.map} +1 -1
  234. package/dist/{readCsv-CmRYYFJc.mjs → readCsv-Cr_1t8F5.mjs} +1 -1
  235. package/dist/{readCsv-CmRYYFJc.mjs.map → readCsv-Cr_1t8F5.mjs.map} +1 -1
  236. package/dist/{readTranscendYaml-DtJz9mor.mjs → readTranscendYaml-STYnRzq-.mjs} +3 -3
  237. package/dist/readTranscendYaml-STYnRzq-.mjs.map +1 -0
  238. package/dist/{removeUnverifiedRequestIdentifiers-DJhxiy_D.mjs → removeUnverifiedRequestIdentifiers-B9uPApVR.mjs} +2 -2
  239. package/dist/{removeUnverifiedRequestIdentifiers-DJhxiy_D.mjs.map → removeUnverifiedRequestIdentifiers-B9uPApVR.mjs.map} +1 -1
  240. package/dist/{renderTable-DKXvortp.mjs → renderTable-DKTZbMjY.mjs} +1 -1
  241. package/dist/{renderTable-DKXvortp.mjs.map → renderTable-DKTZbMjY.mjs.map} +1 -1
  242. package/dist/{request-CCCU2SdV.mjs → request-B1yRTdG-.mjs} +1 -1
  243. package/dist/{request-CCCU2SdV.mjs.map → request-B1yRTdG-.mjs.map} +1 -1
  244. package/dist/{resolveBundleIdByName-By5Vl8Iz.mjs → resolveBundleIdByName-DuxWYrDF.mjs} +2 -2
  245. package/dist/{resolveBundleIdByName-By5Vl8Iz.mjs.map → resolveBundleIdByName-DuxWYrDF.mjs.map} +1 -1
  246. package/dist/{resolvePolicyBundleVersion-DO7IvEwb.mjs → resolvePolicyBundleVersion-DhXZKwb4.mjs} +2 -2
  247. package/dist/{resolvePolicyBundleVersion-DO7IvEwb.mjs.map → resolvePolicyBundleVersion-DhXZKwb4.mjs.map} +1 -1
  248. package/dist/{retryRequestDataSilos-6JfyZclD.mjs → retryRequestDataSilos-D9dBtbdl.mjs} +2 -2
  249. package/dist/{retryRequestDataSilos-6JfyZclD.mjs.map → retryRequestDataSilos-D9dBtbdl.mjs.map} +1 -1
  250. package/dist/run-captured-process-CpZBh0lG.mjs +2 -0
  251. package/dist/run-captured-process-CpZBh0lG.mjs.map +1 -0
  252. package/dist/{runOpa-Q2r3qPsi.mjs → runOpa-CkKAwsvB.mjs} +2 -2
  253. package/dist/{runOpa-Q2r3qPsi.mjs.map → runOpa-CkKAwsvB.mjs.map} +1 -1
  254. package/dist/scaffold-planning-DMACXSnX.mjs +121 -0
  255. package/dist/scaffold-planning-DMACXSnX.mjs.map +1 -0
  256. package/dist/scaffold-templates-CsHM1y80.mjs +84 -0
  257. package/dist/scaffold-templates-CsHM1y80.mjs.map +1 -0
  258. package/dist/{skipPreflightJobs-xpbtJ3dK.mjs → skipPreflightJobs-Beia_iB6.mjs} +2 -2
  259. package/dist/{skipPreflightJobs-xpbtJ3dK.mjs.map → skipPreflightJobs-Beia_iB6.mjs.map} +1 -1
  260. package/dist/{skipRequestDataSilos-B7RA6I3Z.mjs → skipRequestDataSilos-BSNLacnR.mjs} +2 -2
  261. package/dist/{skipRequestDataSilos-B7RA6I3Z.mjs.map → skipRequestDataSilos-BSNLacnR.mjs.map} +1 -1
  262. package/dist/{streamPrivacyRequestsToCsv-DT31SP6w.mjs → streamPrivacyRequestsToCsv-Cksb9D49.mjs} +2 -2
  263. package/dist/{streamPrivacyRequestsToCsv-DT31SP6w.mjs.map → streamPrivacyRequestsToCsv-Cksb9D49.mjs.map} +1 -1
  264. package/dist/{syncCodePackages-ozt9aBXf.mjs → syncCodePackages-DsC1tE8B.mjs} +2 -2
  265. package/dist/{syncCodePackages-ozt9aBXf.mjs.map → syncCodePackages-DsC1tE8B.mjs.map} +1 -1
  266. package/dist/{updateConsentManagerVersionToLatest-CCzWEBEj.mjs → updateConsentManagerVersionToLatest-CaEkTnlL.mjs} +2 -2
  267. package/dist/{updateConsentManagerVersionToLatest-CCzWEBEj.mjs.map → updateConsentManagerVersionToLatest-CaEkTnlL.mjs.map} +1 -1
  268. package/dist/{uploadConsents-CDqFNWX_.mjs → uploadConsents-CNyuYx0o.mjs} +2 -2
  269. package/dist/{uploadConsents-CDqFNWX_.mjs.map → uploadConsents-CNyuYx0o.mjs.map} +1 -1
  270. package/dist/{uploadPrivacyRequestsFromCsv-CVpBFaYB.mjs → uploadPrivacyRequestsFromCsv-BdTQOZnF.mjs} +2 -2
  271. package/dist/{uploadPrivacyRequestsFromCsv-CVpBFaYB.mjs.map → uploadPrivacyRequestsFromCsv-BdTQOZnF.mjs.map} +1 -1
  272. package/dist/{validateTranscendAuth-3guZJPKH.mjs → validateTranscendAuth-CnHMn77m.mjs} +2 -2
  273. package/dist/{validateTranscendAuth-3guZJPKH.mjs.map → validateTranscendAuth-CnHMn77m.mjs.map} +1 -1
  274. package/dist/{writeCsv-rhlEBjYp.mjs → writeCsv-D46aDkGf.mjs} +1 -1
  275. package/dist/{writeCsv-rhlEBjYp.mjs.map → writeCsv-D46aDkGf.mjs.map} +1 -1
  276. package/package.json +10 -5
  277. package/dist/app-dIu3pdTM.mjs +0 -148
  278. package/dist/app-dIu3pdTM.mjs.map +0 -1
  279. package/dist/impl-BbWzTCSd2.mjs.map +0 -1
  280. package/dist/impl-BlFBTc6f.mjs.map +0 -1
  281. package/dist/impl-BqiclSRZ.mjs +0 -2
  282. package/dist/impl-BqiclSRZ.mjs.map +0 -1
  283. package/dist/impl-CZ-KvZE02.mjs.map +0 -1
  284. package/dist/impl-CclEOdC32.mjs +0 -2
  285. package/dist/impl-CclEOdC32.mjs.map +0 -1
  286. package/dist/impl-Cq5wI-kP.mjs.map +0 -1
  287. package/dist/impl-DG9RwTkA2.mjs.map +0 -1
  288. package/dist/impl-DQG3PiAW2.mjs.map +0 -1
  289. package/dist/impl-DbPLuDc22.mjs.map +0 -1
  290. package/dist/impl-DiyWNLJq.mjs.map +0 -1
  291. package/dist/impl-DlaWf-oS2.mjs.map +0 -1
  292. package/dist/impl-DzJG5HaX.mjs.map +0 -1
  293. package/dist/impl-GYM4LDKp2.mjs +0 -2
  294. package/dist/impl-GYM4LDKp2.mjs.map +0 -1
  295. package/dist/impl-GnxjtYL7.mjs.map +0 -1
  296. package/dist/impl-V_ffkzbd2.mjs.map +0 -1
  297. package/dist/impl-xRwX5ZLK.mjs.map +0 -1
  298. package/dist/logger-CB_h_zbj.mjs +0 -2
  299. package/dist/logger-CB_h_zbj.mjs.map +0 -1
  300. package/dist/parseVariablesFromString-cu5gPC3M.mjs +0 -2
  301. package/dist/parseVariablesFromString-cu5gPC3M.mjs.map +0 -1
  302. package/dist/readTranscendYaml-DtJz9mor.mjs.map +0 -1
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import{i as e,n as t,r as n,t as r}from"./enums-OiLcZ26O.mjs";import{a as i,c as a,d as o,f as s,g as c,h as l,i as u,l as d,m as f,n as p,o as m,p as h,r as g,s as _,t as v,u as y}from"./constants-CdgK1myP.mjs";import{t as b}from"./logger-CB_h_zbj.mjs";import{$ as x,A as S,B as ee,C as te,D as C,E as ne,F as re,G as ie,H as ae,I as oe,J as se,K as ce,L as le,M as ue,N as w,O as de,P as fe,Q as T,R as E,S as D,T as O,U as k,V as A,W as j,X as M,Y as N,Z as P,_ as F,a as I,at as L,b as R,c as z,ct as B,d as V,dt as pe,et as me,f as he,ft as ge,g as _e,h as ve,i as ye,it as be,j as xe,k as Se,l as Ce,lt as we,m as Te,mt as Ee,n as De,nt as Oe,o as ke,ot as Ae,p as je,pt as Me,q as Ne,r as Pe,rt as Fe,s as Ie,st as Le,t as Re,tt as ze,u as Be,ut as Ve,v as He,w as Ue,x as We,y as Ge,z as Ke}from"./codecs-zRkskjaJ.mjs";import{a as qe,i as Je,n as Ye,o as Xe,r as Ze,s as Qe,t as $e}from"./readTranscendYaml-DtJz9mor.mjs";import{i as et,n as tt,r as nt,t as rt}from"./mergeTranscendInputs-CkpitZbH.mjs";import{a as it,c as at,i as ot,l as st,n as ct,o as lt,r as ut,s as dt,t as ft,u as pt}from"./constants-BuoISmXP.mjs";import{n as mt,t as ht}from"./fuzzyMatchColumns-BDD4a2W0.mjs";import{a as gt,c as _t,d as vt,f as yt,i as bt,l as xt,n as St,o as Ct,r as wt,s as Tt,t as Et,u as Dt}from"./uploadPrivacyRequestsFromCsv-CVpBFaYB.mjs";import{n as Ot,t as kt}from"./parseAttributesFromString-BxJcnKmn.mjs";import{n as H,t as At}from"./readCsv-CmRYYFJc.mjs";import{n as jt,t as Mt}from"./pullUnstructuredSubDataPointRecommendations-Cf4irXl4.mjs";import{a as Nt,i as Pt,n as Ft,o as It,r as Lt,t as Rt}from"./request-CCCU2SdV.mjs";import{i as zt,n as Bt,r as Vt,t as Ht}from"./pullTranscendConfiguration-NcFjHE8k.mjs";import{i as Ut,n as Wt,r as U,t as Gt}from"./fetchAllRequests-DUQGTJjx.mjs";import{a as Kt,i as qt,n as Jt,r as Yt,t as Xt}from"./pullChunkedCustomSiloOutstandingIdentifiers-DuPDOm6f.mjs";import{n as Zt,r as Qt,t as $t}from"./syncCodePackages-ozt9aBXf.mjs";import{t as en}from"./markSilentPrivacyRequests-Cb-J9ckA.mjs";import{a as tn,i as nn,n as rn,o as an,r as on,t as sn}from"./downloadPrivacyRequestFiles-Dn3VexN2.mjs";import{n as cn,r as ln,t as un}from"./extractClientError-DeS63kje.mjs";import{t as dn}from"./approvePrivacyRequests-B842tXn4.mjs";import{t as fn}from"./notifyPrivacyRequestsAdditionalTime-it1FA62W.mjs";import{t as pn}from"./cancelPrivacyRequests-BKibbagv.mjs";import{n as mn,t as hn}from"./bulkRestartRequests-CE7cDUMd.mjs";import{t as gn}from"./skipPreflightJobs-xpbtJ3dK.mjs";import{t as _n}from"./bulkRetryEnrichers-BcSANZPC.mjs";import{t as vn}from"./retryRequestDataSilos-6JfyZclD.mjs";import{n as W,r as G,t as yn}from"./streamPrivacyRequestsToCsv-DT31SP6w.mjs";import{n as bn,r as xn,t as Sn}from"./inquirer-DNa31Mkx.mjs";import{t as Cn}from"./parseVariablesFromString-cu5gPC3M.mjs";import{t as wn}from"./collectParquetFilesOrExit-BlG2RRSC.mjs";import{t as Tn}from"./collectCsvFilesOrExit-Dg5U3Qx_.mjs";import{t as En}from"./parquetToCsvOneFile-Dtz90qfJ.mjs";import{a as Dn,i as On,n as kn,o as An,r as jn,s as Mn,t as Nn}from"./writeCsv-rhlEBjYp.mjs";import{t as Pn}from"./skipRequestDataSilos-B7RA6I3Z.mjs";import{t as Fn}from"./removeUnverifiedRequestIdentifiers-DJhxiy_D.mjs";import{t as In}from"./updateConsentManagerVersionToLatest-CCzWEBEj.mjs";import{n as K,t as q}from"./mapConsentCsvRowsToInputs-DA7BRD7M.mjs";import{t as Ln}from"./pullConsentManagerMetrics-Dk5IejaY.mjs";import{n as Rn,r as zn,t as Bn}from"./buildXdiSyncEndpoint-B9seJTxP.mjs";import{t as Vn}from"./consentManagersToBusinessEntities-Rv-ajWya.mjs";import{i as Hn,n as Un,r as Wn,t as Gn}from"./uploadConsents-CDqFNWX_.mjs";import{n as Kn,r as qn,t as Jn}from"./pushCronIdentifiersFromCsv-BGaJycWo.mjs";import{t as Yn}from"./markRequestDataSiloIdsCompleted-CK7PNwTz.mjs";import{t as Xn}from"./generateCrossAccountApiKeys-QhnLqtUN.mjs";import{t as Zn}from"./validateTranscendAuth-3guZJPKH.mjs";import{n as Qn,t as $n}from"./listFiles-DrxRhlZ2.mjs";import{t as er}from"./pullAllDatapoints-XqreMBT5.mjs";import{t as tr}from"./pullManualEnrichmentIdentifiersToCsv-CAD1navz.mjs";import{n as nr,r as rr,t as ir}from"./pushManualEnrichmentIdentifiersFromCsv-B9okRkhL.mjs";import{chunk as ar,difference as or}from"lodash-es";import{readFileSync as sr,readdirSync as cr,statSync as lr}from"node:fs";import{join as ur}from"node:path";import dr from"fast-glob";import J from"colors";import{UPDATE_OR_CREATE_COOKIES as Y,buildTranscendGraphQLClient as X,createSombraGotInstance as fr,fetchAllRequestIdentifiers as pr,fetchConsentManagerId as mr,makeGraphQLRequest as hr,syncCookies as gr,syncDataFlows as _r,validateSombraVersion as vr}from"@transcend-io/sdk";import{map as Z,mapSeries as yr}from"@transcend-io/utils";import{execSync as Q}from"child_process";async function $(e,t){let n=await mr(e,{logger:b});await yr(ar(t,100),async t=>{await hr(e,Y,{variables:{airgapBundleId:n,cookies:t.map(e=>({name:e.name,trackingPurposes:e.trackingPurposes&&e.trackingPurposes.length>0?e.trackingPurposes:void 0,description:e.description,service:e.service,status:e.status,attributes:e.attributes,isRegex:e.isRegex}))},logger:b})})}async function br(e,t){let n=!1;b.info(J.magenta(`Syncing "${t.length}" cookies...`));let r=t.filter(e=>t.filter(t=>e.name===t.name&&e.isRegex===t.isRegex).length>1);if(r.length>0)throw Error(`Failed to upload cookies as there were non-unique entries found: ${r.map(({name:e})=>e).join(`,`)}`);try{b.info(J.magenta(`Upserting "${t.length}" new cookies...`)),await $(e,t),b.info(J.green(`Successfully synced ${t.length} cookies!`))}catch(e){n=!0,b.error(J.red(`Failed to create cookies! - ${e.message}`))}return!n}async function xr({auth:e,sombraAuth:t,actions:n=[],statuses:r=[],identifierSearch:a,pageLimit:o=100,concurrency:s=1,transcendUrl:c=i,createdAtBefore:l,skipRequestIdentifiers:u=!1,createdAtAfter:d,updatedAtBefore:f,updatedAtAfter:p,isTest:m}){let h=X(c,e),g=await fr(c,e,{logger:b,sombraApiKey:t,sombraUrl:process.env.SOMBRA_URL}),_=``;l&&(_+=` before ${l.toISOString()}`),d&&(_+=`${_?`, and`:``} after ${d.toISOString()}`),b.info(J.magenta(`${n.length>0?`Pulling requests of type "${n.join(`" , "`)}"`:`Pulling all requests`}${_}`));let v=s>1&&d&&l,y=v?W(d,l,s):[{createdAtAfter:d,createdAtBefore:l}];v&&b.info(J.magenta(`Splitting date range into ${s} parallel chunks`));let x=(await Z(y,e=>U(h,{actions:n,text:a,statuses:r,createdAtBefore:e.createdAtBefore,createdAtAfter:e.createdAtAfter,updatedAtBefore:f,updatedAtAfter:p,isTest:m}),{concurrency:v?s:1})).flat();u||await vr(h,{logger:b});let S=u?x.map(e=>({...e,requestIdentifiers:[]})):await Z(x,async e=>{let t=await pr(h,g,{filterBy:{requestId:e.id},skipSombraCheck:!0,logger:b});return{...e,requestIdentifiers:t}},{concurrency:o});return b.info(J.magenta(`Pulled ${S.length} requests`)),{requestsWithRequestIdentifiers:S,requestsFormattedForCsv:S.map(G)}}function Sr(e,t=sr){try{return e?t(e,`utf8`):``}catch{return``}}async function Cr({auth:e,trackerStatus:t,file:n,classifyService:r=!1,transcendUrl:a=i}){let o=X(a,e);b.info(J.magenta(`Reading "${n}" from disk`)),await _r(o,K(H(n,w),t),{classifyService:r,logger:b})||(b.error(J.red(`Encountered error(s) syncing data flows from CSV, see logs above for more info. `)),process.exit(1))}async function wr({auth:e,trackerStatus:t,file:n,transcendUrl:r=i}){let a=X(r,e);b.info(J.magenta(`Reading "${n}" from disk`)),await gr(a,q(H(n,C),t),{logger:b})||(b.error(J.red(`Encountered error(s) syncing cookies from CSV, see logs above for more info. `)),process.exit(1))}function Tr(e){return cr(e).filter(t=>lr(ur(e,t)).isDirectory())}function Er(e){return e.replace(/(https?:\/\/[^\s]+)/g,`<link-omitted>`)}function Dr(e){return Object.entries(e).reduce((e,[t,n])=>n!=null&&n!==``&&!(Array.isArray(n)&&n.length===0)&&!(typeof n==`object`&&Object.keys(n).length===0)?Object.assign(e,{[t]:n}):e,{})}function Or({baseBranch:e,rootDirectory:t,githubRepo:n,excludedGlob:r=[],fileBlockList:i=[]}){Q(`git fetch origin ${e}`);let a=Q(`git ls-remote ${n} "refs/heads/${e}" | cut -f 1`,{encoding:`utf-8`}).split(`
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-BG53Mbi9.mjs";import{t as b}from"./logger-9T6vva73.mjs";import{$ as x,A as S,B as ee,C as te,D as C,E as ne,F as re,G as ie,H as ae,I as oe,J as se,K as ce,L as le,M as ue,N as w,O as de,P as fe,Q as T,R as E,S as D,T as O,U as k,V as A,W as j,X as M,Y as N,Z as P,_ as F,a as I,at as L,b as R,c as z,ct as B,d as V,dt as pe,et as me,f as he,ft as ge,g as _e,h as ve,i as ye,it as be,j as xe,k as Se,l as Ce,lt as we,m as Te,mt as Ee,n as De,nt as Oe,o as ke,ot as Ae,p as je,pt as Me,q as Ne,r as Pe,rt as Fe,s as Ie,st as Le,t as Re,tt as ze,u as Be,ut as Ve,v as He,w as Ue,x as We,y as Ge,z as Ke}from"./codecs-BsQFAFGT.mjs";import{a as qe,i as Je,n as Ye,o as Xe,r as Ze,s as Qe,t as $e}from"./readTranscendYaml-STYnRzq-.mjs";import{i as et,n as tt,r as nt,t as rt}from"./mergeTranscendInputs-CWHXH0kF.mjs";import{a as it,c as at,i as ot,l as st,n as ct,o as lt,r as ut,s as dt,t as ft,u as pt}from"./constants-C1seVfCu.mjs";import{n as mt,t as ht}from"./fuzzyMatchColumns-OTsFJ21f.mjs";import{a as gt,c as _t,d as vt,f as yt,i as bt,l as xt,n as St,o as Ct,r as wt,s as Tt,t as Et,u as Dt}from"./uploadPrivacyRequestsFromCsv-BdTQOZnF.mjs";import{n as Ot,t as kt}from"./parseAttributesFromString-C5-KGkPH.mjs";import{n as H,t as At}from"./readCsv-Cr_1t8F5.mjs";import{n as jt,t as Mt}from"./pullUnstructuredSubDataPointRecommendations-Dmh_-r95.mjs";import{a as Nt,i as Pt,n as Ft,o as It,r as Lt,t as Rt}from"./request-B1yRTdG-.mjs";import{i as zt,n as Bt,r as Vt,t as Ht}from"./pullTranscendConfiguration-CD7Frn8z.mjs";import{i as Ut,n as Wt,r as U,t as Gt}from"./fetchAllRequests-CEDKdq0c.mjs";import{a as Kt,i as qt,n as Jt,r as Yt,t as Xt}from"./pullChunkedCustomSiloOutstandingIdentifiers-BrDmPbvc.mjs";import{n as Zt,r as Qt,t as $t}from"./syncCodePackages-DsC1tE8B.mjs";import{t as en}from"./markSilentPrivacyRequests-7l9I99pe.mjs";import{a as tn,i as nn,n as rn,o as an,r as on,t as sn}from"./downloadPrivacyRequestFiles-CLFgQItk.mjs";import{n as cn,r as ln,t as un}from"./extractClientError-C_6ly7Gw.mjs";import{t as dn}from"./approvePrivacyRequests-80SV_94y.mjs";import{t as fn}from"./notifyPrivacyRequestsAdditionalTime-BPIYuCov.mjs";import{t as pn}from"./cancelPrivacyRequests-BEyOBJ2r.mjs";import{n as mn,t as hn}from"./bulkRestartRequests-BLb8OJmf.mjs";import{t as gn}from"./skipPreflightJobs-Beia_iB6.mjs";import{t as _n}from"./bulkRetryEnrichers-BA9cboSe.mjs";import{t as vn}from"./retryRequestDataSilos-D9dBtbdl.mjs";import{n as W,r as G,t as yn}from"./streamPrivacyRequestsToCsv-Cksb9D49.mjs";import{n as bn,r as xn,t as Sn}from"./inquirer-DkFTQU00.mjs";import{t as Cn}from"./parseVariablesFromString-Cr3x2uq3.mjs";import{t as wn}from"./collectParquetFilesOrExit-BiksFI-Q.mjs";import{t as Tn}from"./collectCsvFilesOrExit-BqnmK63h.mjs";import{t as En}from"./parquetToCsvOneFile-CSVdrLvq.mjs";import{a as Dn,i as On,n as kn,o as An,r as jn,s as Mn,t as Nn}from"./writeCsv-D46aDkGf.mjs";import{t as Pn}from"./skipRequestDataSilos-BSNLacnR.mjs";import{t as Fn}from"./removeUnverifiedRequestIdentifiers-B9uPApVR.mjs";import{t as In}from"./updateConsentManagerVersionToLatest-CaEkTnlL.mjs";import{n as K,t as q}from"./mapConsentCsvRowsToInputs-MMPZwzrV.mjs";import{t as Ln}from"./pullConsentManagerMetrics-Cvex-gpd.mjs";import{n as Rn,r as zn,t as Bn}from"./buildXdiSyncEndpoint-B3zUrI16.mjs";import{t as Vn}from"./consentManagersToBusinessEntities-O4KBox9u.mjs";import{i as Hn,n as Un,r as Wn,t as Gn}from"./uploadConsents-CNyuYx0o.mjs";import{n as Kn,r as qn,t as Jn}from"./pushCronIdentifiersFromCsv-DjeY7TtK.mjs";import{t as Yn}from"./markRequestDataSiloIdsCompleted-PKCcn5wQ.mjs";import{t as Xn}from"./generateCrossAccountApiKeys-D6O_Qm3Y.mjs";import{t as Zn}from"./validateTranscendAuth-CnHMn77m.mjs";import{n as Qn,t as $n}from"./listFiles-CWHAdKY-.mjs";import{t as er}from"./pullAllDatapoints-H92qjLSx.mjs";import{t as tr}from"./pullManualEnrichmentIdentifiersToCsv-qjdNA75O.mjs";import{n as nr,r as rr,t as ir}from"./pushManualEnrichmentIdentifiersFromCsv-BDtMo13j.mjs";import{chunk as ar,difference as or}from"lodash-es";import{readFileSync as sr,readdirSync as cr,statSync as lr}from"node:fs";import{join as ur}from"node:path";import dr from"fast-glob";import J from"colors";import{UPDATE_OR_CREATE_COOKIES as Y,buildTranscendGraphQLClient as X,createSombraGotInstance as fr,fetchAllRequestIdentifiers as pr,fetchConsentManagerId as mr,makeGraphQLRequest as hr,syncCookies as gr,syncDataFlows as _r,validateSombraVersion as vr}from"@transcend-io/sdk";import{map as Z,mapSeries as yr}from"@transcend-io/utils";import{execSync as Q}from"child_process";async function $(e,t){let n=await mr(e,{logger:b});await yr(ar(t,100),async t=>{await hr(e,Y,{variables:{airgapBundleId:n,cookies:t.map(e=>({name:e.name,trackingPurposes:e.trackingPurposes&&e.trackingPurposes.length>0?e.trackingPurposes:void 0,description:e.description,service:e.service,status:e.status,attributes:e.attributes,isRegex:e.isRegex}))},logger:b})})}async function br(e,t){let n=!1;b.info(J.magenta(`Syncing "${t.length}" cookies...`));let r=t.filter(e=>t.filter(t=>e.name===t.name&&e.isRegex===t.isRegex).length>1);if(r.length>0)throw Error(`Failed to upload cookies as there were non-unique entries found: ${r.map(({name:e})=>e).join(`,`)}`);try{b.info(J.magenta(`Upserting "${t.length}" new cookies...`)),await $(e,t),b.info(J.green(`Successfully synced ${t.length} cookies!`))}catch(e){n=!0,b.error(J.red(`Failed to create cookies! - ${e.message}`))}return!n}async function xr({auth:e,sombraAuth:t,actions:n=[],statuses:r=[],identifierSearch:a,pageLimit:o=100,concurrency:s=1,transcendUrl:c=i,createdAtBefore:l,skipRequestIdentifiers:u=!1,createdAtAfter:d,updatedAtBefore:f,updatedAtAfter:p,isTest:m}){let h=X(c,e),g=await fr(c,e,{logger:b,sombraApiKey:t,sombraUrl:process.env.SOMBRA_URL}),_=``;l&&(_+=` before ${l.toISOString()}`),d&&(_+=`${_?`, and`:``} after ${d.toISOString()}`),b.info(J.magenta(`${n.length>0?`Pulling requests of type "${n.join(`" , "`)}"`:`Pulling all requests`}${_}`));let v=s>1&&d&&l,y=v?W(d,l,s):[{createdAtAfter:d,createdAtBefore:l}];v&&b.info(J.magenta(`Splitting date range into ${s} parallel chunks`));let x=(await Z(y,e=>U(h,{actions:n,text:a,statuses:r,createdAtBefore:e.createdAtBefore,createdAtAfter:e.createdAtAfter,updatedAtBefore:f,updatedAtAfter:p,isTest:m}),{concurrency:v?s:1})).flat();u||await vr(h,{logger:b});let S=u?x.map(e=>({...e,requestIdentifiers:[]})):await Z(x,async e=>{let t=await pr(h,g,{filterBy:{requestId:e.id},skipSombraCheck:!0,logger:b});return{...e,requestIdentifiers:t}},{concurrency:o});return b.info(J.magenta(`Pulled ${S.length} requests`)),{requestsWithRequestIdentifiers:S,requestsFormattedForCsv:S.map(G)}}function Sr(e,t=sr){try{return e?t(e,`utf8`):``}catch{return``}}async function Cr({auth:e,trackerStatus:t,file:n,classifyService:r=!1,transcendUrl:a=i}){let o=X(a,e);b.info(J.magenta(`Reading "${n}" from disk`)),await _r(o,K(H(n,w),t),{classifyService:r,logger:b})||(b.error(J.red(`Encountered error(s) syncing data flows from CSV, see logs above for more info. `)),process.exit(1))}async function wr({auth:e,trackerStatus:t,file:n,transcendUrl:r=i}){let a=X(r,e);b.info(J.magenta(`Reading "${n}" from disk`)),await gr(a,q(H(n,C),t),{logger:b})||(b.error(J.red(`Encountered error(s) syncing cookies from CSV, see logs above for more info. `)),process.exit(1))}function Tr(e){return cr(e).filter(t=>lr(ur(e,t)).isDirectory())}function Er(e){return e.replace(/(https?:\/\/[^\s]+)/g,`<link-omitted>`)}function Dr(e){return Object.entries(e).reduce((e,[t,n])=>n!=null&&n!==``&&!(Array.isArray(n)&&n.length===0)&&!(typeof n==`object`&&Object.keys(n).length===0)?Object.assign(e,{[t]:n}):e,{})}function Or({baseBranch:e,rootDirectory:t,githubRepo:n,excludedGlob:r=[],fileBlockList:i=[]}){Q(`git fetch origin ${e}`);let a=Q(`git ls-remote ${n} "refs/heads/${e}" | cut -f 1`,{encoding:`utf-8`}).split(`
2
2
  `)[0],o=Q(`git rev-parse HEAD`,{encoding:`utf-8`}).split(`
3
3
  `)[0];if(!a||!o)throw Error(`FAILED TO FIND COMMIT RANGE`);let s=or(Q(`git fetch && git diff --name-only "${e||a}...${o}" -- ${t}`,{encoding:`utf-8`}).split(`
4
4
  `).filter(e=>e),i),c=r.length>0?dr.sync(s,{ignore:r}):s,l={};return c.forEach(e=>{l[e]=Q(`git show ${o}:${e}`,{encoding:`utf-8`})}),{changedFiles:s,fileDiffs:l,repoName:n.split(`/`).pop().split(`.`)[0],commit:o}}export{v as ADMIN_DASH,p as ADMIN_DASH_DATAPOINTS,g as ADMIN_DASH_INTEGRATIONS,Rt as APPROVE_PRIVACY_REQUEST,zt as ASSESSMENT_TEMPLATES,Re as ActionInput,De as ActionItemCollectionInput,Pe as ActionItemInput,ye as ApiKeyInput,I as AssessmentAnswerOptionInput,ke as AssessmentDisplayLogicInput,Ie as AssessmentInput,z as AssessmentNestedRuleInput,Ce as AssessmentResourceInput,Be as AssessmentRetentionScheduleInput,V as AssessmentRuleInput,he as AssessmentSectionInput,je as AssessmentSectionQuestionInput,Te as AssessmentTemplateInput,bt as AttestedExtraIdentifiers,ve as AttributeInput,_e as AttributePreview,F as AttributeValueInput,ft as BLANK,ct as BULK_APPLY,He as BusinessEntityInput,Ft as CANCEL_PRIVACY_REQUEST,ut as CAN_APPLY_IN_BULK,ot as CachedFileState,it as CachedRequestState,Ge as CodePackageInput,R as CodePackageSdk,lt as ColumnName,We as ConsentManageExperienceInput,D as ConsentManagerInput,te as ConsentManagerServiceMetadata,Ue as ConsentPreferenceTopic,O as ConsentPreferenceTopicOptionValue,ne as ConsentPurpose,C as CookieCsvInput,de as CookieInput,Jt as CronIdentifier,Kn as CronIdentifierPush,Yt as CronPartition,u as DEBUG,i as DEFAULT_TRANSCEND_API,m as DEFAULT_TRANSCEND_API_KEY,_ as DEFAULT_TRANSCEND_CONSENT_API,Ht as DEFAULT_TRANSCEND_PULL_RESOURCES,Se as DataCategoryGuessInput,S as DataCategoryInput,xe as DataCategoryPreviewInput,ue as DataCategoryRecommendationInput,w as DataFlowCsvInput,fe as DataFlowInput,re as DataSiloInput,oe as DataSubjectInput,le as DatapointInput,E as DeletionDependencies,Ke as DeletionDependency,ee as DeletionDependencyInput,A as DeletionDependencyReset,jt as ENTRY_COUNT,nr as EnrichPrivacyRequest,ae as EnricherInput,k as FieldInput,dt as IDENTIFIER_BLOCK_LIST,Bn as IP_ADDRESS_REGEX,at as IS_REQUIRED,j as IdentifierInput,ie as ImportOnetrustAssessmentsInput,on as IntlMessage,ce as IntlMessageInput,st as NONE,Lt as NOTIFY_ADDITIONAL_TIME,r as OneTrustFileFormat,t as OneTrustPullResource,n as OneTrustPullSource,kt as ParsedAttributeInput,Ne as PartitionInput,se as PolicyInput,N as PreferenceWorkflowConfigInput,M as PreferenceWorkflowConfigPurposeInput,P as PrivacyCenterInput,Gt as PrivacyRequest,gt as PrivacyRequestInput,cn as PrivacyRequestResponse,T as ProcessingActivityInput,x as ProcessingPurposeInput,me as ProcessingPurposePreviewInput,ze as PromptAVendorEmailSettings,Gn as PurposeMap,Pt as REQUESTS,Nt as REQUESTS_COUNT,a as RETRYABLE_BATCH_STATUSES,Oe as RegionInput,Fe as RepositoryInput,nn as RequestFileMetadata,tn as RequestFileMetadataResponse,Wt as RequestPurposeTrigger,be as RiskAssignmentInput,L as RiskLogicInput,d as SCOPES_BY_TITLE,y as SCOPE_TITLES,Ae as SiloDiscoveryResultInput,Le as SoftwareDevelopmentKitInput,B as StoredApiKey,pt as SuccessfulRequest,o as TR_PULL_RESOURCE_SCOPE_MAP,s as TR_PUSH_RESOURCE_SCOPE_MAP,h as TR_YML_RESOURCE_TO_FIELD_NAME,we as TeamInput,Ve as TemplateInput,pe as TranscendInput,e as TranscendPullResource,It as UPDATE_PRIVACY_REQUEST,Un as USP_STRING_REGEX,$e as VARIABLE_PARAMETERS_NAME,Ye as VARIABLE_PARAMETERS_REGEXP,ge as VendorInput,Me as WebhookHeader,Ee as WorkflowConfigInput,Nn as appendCsvRowsOrdered,kn as appendCsvSync,dn as approvePrivacyRequests,Rn as buildXdiSyncEndpoint,hn as bulkRestartRequests,_n as bulkRetryEnrichers,pn as cancelPrivacyRequests,Tn as collectCsvFilesOrExit,wn as collectParquetFilesOrExit,Vn as consentManagersToBusinessEntities,$t as createCodePackage,Hn as createConsentToken,l as description,zn as domainToHost,sn as downloadPrivacyRequestFiles,rr as enrichPrivacyRequest,et as ensureAllDataSubjectsExist,un as extractClientError,Vt as fetchAllAssessmentTemplates,U as fetchAllRequests,Kt as fetchRequestDataSiloActiveCount,Ut as fetchRequestsTotalCount,$n as filterFileNames,Dr as filterNullishValuesFromObject,Dt as filterRows,G as formatRequestForCsv,ht as fuzzyMatchColumns,mt as fuzzySearch,Xn as generateCrossAccountApiKeys,an as getFileMetadataForPrivacyRequests,Or as getGitFilesThatChanged,vt as getUniqueValuesForColumn,jn as initCsvFile,Sn as inquirerAutoComplete,bn as inquirerConfirmBoolean,xn as inquirerConfirmText,Tr as listDirectories,Qn as listFiles,St as mapColumnsToAttributes,wt as mapColumnsToIdentifiers,q as mapCookieCsvRowsToInputs,xt as mapCsvColumnsToApi,Ct as mapCsvRowsToRequestInputs,K as mapDataFlowCsvRowsToInputs,yt as mapEnumValues,_t as mapRequestEnumValues,qn as markCronIdentifierCompleted,Yn as markRequestDataSiloIdsCompleted,en as markSilentPrivacyRequests,rt as mergeTranscendInputs,f as name,Tt as normalizeIdentifierValue,fn as notifyPrivacyRequestsAdditionalTime,En as parquetToCsvOneFile,Ot as parseAttributesFromString,At as parseCsv,On as parseFilePath,Ze as parseTranscendYaml,Cn as parseVariablesFromString,er as pullAllDatapoints,Xt as pullChunkedCustomSiloOutstandingIdentifiers,Ln as pullConsentManagerMetrics,qt as pullCronPageOfIdentifiers,tr as pullManualEnrichmentIdentifiersToCsv,xr as pullPrivacyRequests,Bt as pullTranscendConfiguration,Mt as pullUnstructuredSubDataPointRecommendations,Jn as pushCronIdentifiersFromCsv,ir as pushManualEnrichmentIdentifiersFromCsv,H as readCsv,Sr as readSafe,Je as readTranscendYaml,Er as removeLinks,Fn as removeUnverifiedRequestIdentifiers,qe as replaceVariablesInYaml,mn as restartPrivacyRequest,vn as retryRequestDataSilos,Xe as serializeTranscendYaml,gn as skipPreflightJobs,Pn as skipRequestDataSilos,W as splitDateRange,rn as streamPrivacyRequestFiles,yn as streamPrivacyRequestsToCsv,ln as submitPrivacyRequest,Zt as syncCodePackages,tt as syncConfigurationToTranscend,br as syncCookies,nt as syncDataSilos,Qt as updateCodePackages,In as updateConsentManagerVersionToLatest,$ as updateOrCreateCookies,Wn as uploadConsents,wr as uploadCookiesFromCsv,Cr as uploadDataFlowsFromCsv,Et as uploadPrivacyRequestsFromCsv,Zn as validateTranscendAuth,c as version,Dn as writeCsv,An as writeCsvSync,Mn as writeLargeCsv,Qe as writeTranscendYaml};
@@ -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-B7zDhMok.mjs.map
2
+ //# sourceMappingURL=initializeCliRuntime-802-P8MC.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"initializeCliRuntime-B7zDhMok.mjs","names":[],"sources":["../src/lib/cli/initializeCliRuntime.ts"],"sourcesContent":["import colors from 'colors';\nimport { bootstrap } from 'global-agent';\nimport { ProxyAgent, type Dispatcher, setGlobalDispatcher } from 'undici';\nimport yargs from 'yargs-parser';\n\nimport type { CliLogger } from '../../context.js';\n\n/** Runtime dependencies used to initialize CLI proxy support. */\nexport interface InitializeCliRuntimeDependencies {\n /** Bootstrap proxy support for Node.js request clients. */\n readonly bootstrap: () => void;\n /** Create a dispatcher that routes fetch requests through a proxy. */\n readonly createProxyAgent: (httpProxy: string) => Dispatcher;\n /** Logger used to report proxy initialization. */\n readonly logger: Pick<CliLogger, 'info'>;\n /** Process arguments and environment used to resolve proxy configuration. */\n readonly process: Pick<NodeJS.Process, 'argv' | 'env'>;\n /** Set the dispatcher used by Node.js fetch. */\n readonly setGlobalDispatcher: (dispatcher: Dispatcher) => void;\n}\n\nconst defaultDependencies: InitializeCliRuntimeDependencies = {\n bootstrap,\n createProxyAgent: (httpProxy) => new ProxyAgent(httpProxy),\n logger: console,\n process,\n setGlobalDispatcher,\n};\n\n/**\n * Initialize process-wide proxy support for an executable CLI invocation.\n *\n * @param dependencies - Runtime operations used to configure proxy support.\n */\nexport function initializeCliRuntime(\n dependencies: InitializeCliRuntimeDependencies = defaultDependencies,\n): void {\n const { httpProxy = dependencies.process.env.http_proxy } = yargs(\n dependencies.process.argv.slice(2),\n );\n if (!httpProxy) {\n return;\n }\n\n dependencies.logger.info(colors.green(`Initializing proxy: ${httpProxy}`));\n\n // Use global-agent, which overrides `request` based requests.\n dependencies.process.env.GLOBAL_AGENT_HTTP_PROXY = httpProxy;\n dependencies.bootstrap();\n\n // Use undici, which overrides `fetch` based requests.\n dependencies.setGlobalDispatcher(dependencies.createProxyAgent(httpProxy));\n}\n"],"mappings":"wJAqBA,MAAM,EAAwD,CAC5D,YACA,iBAAmB,GAAc,IAAI,EAAW,EAAU,CAC1D,OAAQ,QACR,QACA,sBACD,CAOD,SAAgB,EACd,EAAiD,EAC3C,CACN,GAAM,CAAE,YAAY,EAAa,QAAQ,IAAI,YAAe,EAC1D,EAAa,QAAQ,KAAK,MAAM,EAAE,CACnC,CACI,IAIL,EAAa,OAAO,KAAK,EAAO,MAAM,uBAAuB,IAAY,CAAC,CAG1E,EAAa,QAAQ,IAAI,wBAA0B,EACnD,EAAa,WAAW,CAGxB,EAAa,oBAAoB,EAAa,iBAAiB,EAAU,CAAC"}
1
+ {"version":3,"file":"initializeCliRuntime-802-P8MC.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-BDD4a2W0.mjs";import t from"inquirer";import n from"inquirer-autocomplete-prompt";async function r({message:e}){let{response:n}=await t.prompt([{name:`response`,message:e,type:`confirm`}]);return n}async function i({message:e}){let{response:n}=await t.prompt([{name:`response`,message:e,type:`text`,validate:e=>e.trim().length>0}]);return n}async function a({defaultValue:r,values:i,message:a}){t.registerPrompt(`autocomplete`,n);let{response:o}=await t.prompt([{name:`response`,message:a,type:`autocomplete`,default:r,source:(t,n)=>n?i.filter(t=>typeof t==`string`&&e(n,t)):i}]);return o}export{r as n,i as r,a as t};
2
- //# sourceMappingURL=inquirer-DNa31Mkx.mjs.map
1
+ import{n as e}from"./fuzzyMatchColumns-OTsFJ21f.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-DkFTQU00.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"inquirer-DNa31Mkx.mjs","names":[],"sources":["../src/lib/helpers/inquirer.ts"],"sourcesContent":["import { ObjByString } from '@transcend-io/type-utils';\nimport inquirer from 'inquirer';\nimport autoCompletePrompt from 'inquirer-autocomplete-prompt';\n\nimport { fuzzySearch } from '../requests/index.js';\n\n/**\n * Inquirer confirm text\n *\n * @param options - Options\n * @returns The response\n */\nexport async function inquirerConfirmBoolean({\n message,\n}: {\n /** Message */\n message: string;\n}): Promise<boolean> {\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: boolean;\n }>([\n {\n name: 'response',\n message,\n type: 'confirm',\n },\n ]);\n return response;\n}\n\n/**\n * Inquirer confirm text\n *\n * @param options - Options\n * @returns The response\n */\nexport async function inquirerConfirmText({\n message,\n}: {\n /** Message */\n message: string;\n}): Promise<string> {\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: string;\n }>([\n {\n name: 'response',\n message,\n type: 'text',\n validate: (x) => x.trim().length > 0,\n },\n ]);\n return response;\n}\n\n/**\n * Inquirer auto complete\n *\n * @param options - Options\n * @returns The response\n */\nexport async function inquirerAutoComplete({\n defaultValue,\n values,\n message,\n}: {\n /** Default value */\n defaultValue?: string;\n /** Message */\n message: string;\n /** Values to select */\n values: string[];\n}): Promise<string> {\n inquirer.registerPrompt('autocomplete', autoCompletePrompt);\n const { response } = await inquirer.prompt<{\n /** confirmation */\n response: string;\n }>([\n {\n name: 'response',\n message,\n type: 'autocomplete',\n default: defaultValue,\n source: (answersSoFar: ObjByString, input: string) =>\n !input ? values : values.filter((x) => typeof x === 'string' && fuzzySearch(input, x)),\n },\n ]);\n return response;\n}\n"],"mappings":"yHAYA,eAAsB,EAAuB,CAC3C,WAImB,CACnB,GAAM,CAAE,YAAa,MAAM,EAAS,OAGjC,CACD,CACE,KAAM,WACN,UACA,KAAM,UACP,CACF,CAAC,CACF,OAAO,EAST,eAAsB,EAAoB,CACxC,WAIkB,CAClB,GAAM,CAAE,YAAa,MAAM,EAAS,OAGjC,CACD,CACE,KAAM,WACN,UACA,KAAM,OACN,SAAW,GAAM,EAAE,MAAM,CAAC,OAAS,EACpC,CACF,CAAC,CACF,OAAO,EAST,eAAsB,EAAqB,CACzC,eACA,SACA,WAQkB,CAClB,EAAS,eAAe,eAAgB,EAAmB,CAC3D,GAAM,CAAE,YAAa,MAAM,EAAS,OAGjC,CACD,CACE,KAAM,WACN,UACA,KAAM,eACN,QAAS,EACT,QAAS,EAA2B,IACjC,EAAiB,EAAO,OAAQ,GAAM,OAAO,GAAM,UAAY,EAAY,EAAO,EAAE,CAAC,CAA7E,EACZ,CACF,CAAC,CACF,OAAO"}
1
+ {"version":3,"file":"inquirer-DkFTQU00.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,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-DrxRhlZ2.mjs.map
2
+ //# sourceMappingURL=listFiles-CWHAdKY-.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"listFiles-DrxRhlZ2.mjs","names":[],"sources":["../src/lib/api-keys/listFiles.ts"],"sourcesContent":["import { existsSync, readdirSync } from 'node:fs';\n\n/**\n * Filter directory entry names to files recognized by the CLI.\n *\n * @param entries - Directory entry names.\n * @param validExtensions - The list of valid extensions.\n * @param removeExtensions - When true, remove extensions from returned names.\n * @returns Filtered file names.\n */\nexport function filterFileNames(\n entries: string[],\n validExtensions?: string[],\n removeExtensions = false,\n): string[] {\n const files = entries\n .filter((file) =>\n validExtensions ? validExtensions.some((extension) => file.endsWith(extension)) : true,\n )\n .filter((file) => file.indexOf('.') > 0);\n\n return removeExtensions ? files.map((file) => file.replace(/\\.[^/.]+$/, '')) : files;\n}\n\n/**\n * List the files in a directory\n *\n * ```typescript\n * // The directory to search\n * const directory = '/User/test/transcend/my-app/app/containers';\n * // Returns ['test.js']\n * listFiles(directory);\n * ```\n *\n * @param directory - The directory to search\n * @param validExtensions - The list of valid extensions\n * @param removeExtensions - When true, remove the extensions from the listed files\n * @returns The list of files in the directory\n */\nexport function listFiles(\n directory: string,\n validExtensions?: string[],\n removeExtensions = false,\n): string[] {\n if (!existsSync(directory)) {\n return [];\n }\n\n return filterFileNames(readdirSync(directory), validExtensions, removeExtensions);\n}\n"],"mappings":"sDAUA,SAAgB,EACd,EACA,EACA,EAAmB,GACT,CACV,IAAM,EAAQ,EACX,OAAQ,GACP,EAAkB,EAAgB,KAAM,GAAc,EAAK,SAAS,EAAU,CAAC,CAAG,GACnF,CACA,OAAQ,GAAS,EAAK,QAAQ,IAAI,CAAG,EAAE,CAE1C,OAAO,EAAmB,EAAM,IAAK,GAAS,EAAK,QAAQ,YAAa,GAAG,CAAC,CAAG,EAkBjF,SAAgB,EACd,EACA,EACA,EAAmB,GACT,CAKV,OAJK,EAAW,EAAU,CAInB,EAAgB,EAAY,EAAU,CAAE,EAAiB,EAAiB,CAHxE,EAAE"}
1
+ {"version":3,"file":"listFiles-CWHAdKY-.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-9T6vva73.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger-9T6vva73.mjs","names":[],"sources":["../src/logger.ts"],"sourcesContent":["export const logger = console;\n"],"mappings":"AAAA,MAAa,EAAS"}
@@ -0,0 +1,2 @@
1
+ import{a as e}from"./readTranscendYaml-STYnRzq-.mjs";import{CustomFunctionPayloadType as t,CustomFunctionType as n}from"@transcend-io/privacy-types";import{existsSync as r,readFileSync as i,writeFileSync as a}from"node:fs";import{basename as o,dirname as s,isAbsolute as c,relative as l,resolve as u,sep as d}from"node:path";import{decodeCodec as f}from"@transcend-io/type-utils";import*as p from"io-ts";import m from"js-yaml";import{isMap as h,isScalar as g,isSeq as _,parseDocument as v}from"yaml";import{Buffer as y}from"node:buffer";import{isIP as b}from"node:net";function x(e,t){let n=u(t),r=[];for(;;)try{return e.fs.lstatSync(n),u(e.fs.realpathSync(n),...r)}catch(e){let t=e.code;if(t!==`ENOENT`&&t!==`ENOTDIR`)throw e;let i=s(n);if(i===n)throw e;r.unshift(o(n)),n=i}}function S(e,t,n){let r=l(x(e,t),x(e,n));return r!==`..`&&!r.startsWith(`..${d}`)&&!c(r)}function C(e,t,n){if(!S(e,t,n))throw Error(`Refusing to access path outside project root through a symlink: ${n}`)}const w=64*1024,T=new Set([`DENO_CERT`,`DENO_DIR`,`DENO_TLS_CA_STORE`,`HTTP_PROXY`,`HTTPS_PROXY`,`NODE_EXTRA_CA_CERTS`,`NO_COLOR`,`NO_PROXY`,`NPM_CONFIG_REGISTRY`]);function E(e){let t=/^\[([^\]]+)\](?::(\d+))?$/u.exec(e);if(t){let e=t[2];return b(t[1])===6&&(!e||Number(e)>0&&Number(e)<=65535)}if(b(e)>0)return!0;let n=/^([^:]+):(\d+)$/u.exec(e),r=n?.[1]??e,i=n?.[2];return(!i||Number(i)>0&&Number(i)<=65535)&&r.length<=253&&r.split(`.`).every(e=>e.length>0&&e.length<=63&&/^[A-Za-z\d](?:[A-Za-z\d-]*[A-Za-z\d])?$/u.test(e))}function D(e){let t=e.env??{},n=Object.keys(t),r=n.filter(e=>!/^[A-Za-z][A-Za-z\d_]*$/u.test(e)),i=n.filter(e=>T.has(e)||e.startsWith(`DENO_`));if(r.length>0||i.length>0)throw Error([r.length>0?`Invalid environment variable names: ${r.join(`, `)}`:void 0,i.length>0?`Reserved environment variable names: ${i.join(`, `)}`:void 0].filter(Boolean).join(`. `));let a=n.filter(e=>y.byteLength(t[e])>w);if(a.length>0)throw Error(`Environment values exceed ${w} bytes: ${a.join(`, `)}`);let o=e.allowedHosts??[];if(o.length>1&&o.includes(`*`))throw Error(`allowed-hosts cannot combine "*" with specific hosts.`);let s=o.filter(e=>e!==`*`&&!E(e));if(s.length>0)throw Error(`Invalid allowed-hosts: ${s.join(`, `)}`)}const O=p.intersection([p.type({name:p.string,code:p.string}),p.partial({id:p.string,description:p.string,type:p.union([p.literal(n.Dsr),p.literal(n.General)]),"data-silo-id":p.string,"sombra-id":p.string,"sombra-auth-env":p.string,"allowed-hosts":p.array(p.string),"timeout-ms":p.number,"allow-third-party-imports":p.boolean,env:p.record(p.string,p.string),"test-payload":p.string,"test-payload-type":p.union([p.literal(t.DataPoint),p.literal(t.RequestEnricher)]),"test-payloads":p.array(p.intersection([p.type({payload:p.string}),p.partial({"payload-type":p.union([p.literal(t.DataPoint),p.literal(t.RequestEnricher)])})]))})]),k=p.type({functions:p.array(O)});function A(e){let t=u(`/`,`__custom-function-manifest__`),n=l(t,u(t,e));return n!==`..`&&!n.startsWith(`..${d}`)&&!c(n)}function j(e,t={}){let r=e.functions.map(({id:e})=>e).filter((e,t,n)=>e!==void 0&&n.indexOf(e)!==t);if(r.length>0)throw Error(`Duplicate custom function ids in manifest: ${[...new Set(r)].join(`, `)}`);let i=e.functions.map(({name:e})=>e),a=e.functions.filter(({id:e,name:t})=>e===void 0&&i.filter(e=>e===t).length>1).map(({name:e})=>e);if(a.length>0)throw Error(`Duplicate custom function names in manifest without ids: ${[...new Set(a)].join(`, `)}. Add an \`id\` field to each duplicated entry to disambiguate.`);e.functions.forEach(e=>{if(e[`test-payload`]!==void 0&&e[`test-payloads`]!==void 0)throw Error(`Custom function "${e.name}" sets both test-payload and test-payloads — use test-payloads alone to define multiple payloads.`);if(e[`test-payload-type`]!==void 0&&e[`test-payload`]===void 0)throw Error(`Custom function "${e.name}" sets test-payload-type without test-payload — set payload-type per item in test-payloads instead.`);if(e.type!==n.Dsr&&(e[`test-payload-type`]!==void 0||e[`test-payloads`]?.some(({"payload-type":e})=>e!==void 0)))throw Error(`Custom function "${e.name}" sets a DSR payload type but is not type DSR.`);[{field:`code`,path:e.code},...e[`test-payload`]===void 0?[]:[{field:`test-payload`,path:e[`test-payload`]}],...(e[`test-payloads`]??[]).map(({payload:e},t)=>({field:`test-payloads[${t}].payload`,path:e}))].forEach(({field:n,path:r})=>{if(!t.skipPathValidation&&!A(r))throw Error(`Custom function "${e.name}" has a ${n} path outside the manifest directory: ${r}`)})})}function M(e,t={}){let n=f(k,m.load(e));return j(n,t),n}function N(e,t,n){let a=s(u(e)),o=(e,t)=>{let o=u(a,t);if(n?.(o),!r(o))throw Error(`Test payload file for custom function "${e}" does not exist: ${o}`);let s=i(o,`utf-8`);try{return JSON.parse(s)}catch(t){throw Error(`Test payload file for custom function "${e}" is not valid JSON (${o}): ${t.message}`)}};return t.functions.map(e=>{D({...e.env?{env:e.env}:{},...e[`allowed-hosts`]?{allowedHosts:e[`allowed-hosts`]}:{}});let t=u(a,e.code);if(n?.(t),!r(t))throw Error(`Code file for custom function "${e.name}" does not exist: ${t}`);let s;return e[`test-payload`]===void 0?e[`test-payloads`]!==void 0&&e[`test-payloads`].length>0&&(s=e[`test-payloads`].map(t=>({payload:o(e.name,t.payload),...t[`payload-type`]===void 0?{}:{payloadType:t[`payload-type`]}}))):s=[{payload:o(e.name,e[`test-payload`]),...e[`test-payload-type`]===void 0?{}:{payloadType:e[`test-payload-type`]}}],{name:e.name,code:i(t,`utf-8`),...e.id===void 0?{}:{id:e.id},...e.description===void 0?{}:{description:e.description},...e.type===void 0?{}:{type:e.type},...e[`data-silo-id`]===void 0?{}:{dataSiloId:e[`data-silo-id`]},...e[`sombra-id`]===void 0?{}:{sombraId:e[`sombra-id`]},...e[`sombra-auth-env`]===void 0?{}:{sombraAuthEnv:e[`sombra-auth-env`]},...e[`allowed-hosts`]===void 0?{}:{allowedHosts:e[`allowed-hosts`]},...e[`timeout-ms`]===void 0?{}:{timeoutMs:e[`timeout-ms`]},...e[`allow-third-party-imports`]===void 0?{}:{allowThirdPartyImports:e[`allow-third-party-imports`]},...e.env===void 0?{}:{env:e.env},...s===void 0?{}:{testPayloads:s}}})}function P(t,n={},r){return N(t,M(e(i(t,`utf-8`),n,`Also check that there are no extra variables defined in your manifest: ${t}`)),r)}function F(t,n,r={},i){let a=M(e(m.dump({functions:[n]}),r,`Also check that there are no extra variables defined for "${n.name}" in: ${t}`)),o=a.functions[0],c=u(s(u(t)),o.code);return{config:N(t,a,i)[0],sourcePath:c}}function I(e,t){let n=v(e);if(n.errors.length>0)throw n.errors[0];let r=n.get(`functions`);if(!_(r))throw Error("Expected a `functions` list in custom function manifest");r.items.length===0&&(r.flow=!1),r.add(n.createNode(t));let i=n.toString();return M(i),i}function L(e,t){let n=v(i(e,`utf-8`)),r=n.get(`functions`);if(!_(r))throw Error(`Expected a \`functions\` list in manifest: ${e}`);let o=0;return r.items.forEach((e,r)=>{let i=t[r];if(!i||!h(e))return;let a=!1;if(i.id&&!e.has(`id`)&&(e.items.unshift(n.createPair(`id`,i.id)),a=!0),i.dataSiloId&&!e.has(`data-silo-id`)){let t=e.items.findIndex(e=>g(e.key)&&e.key.value===`id`);e.items.splice(t+1,0,n.createPair(`data-silo-id`,i.dataSiloId)),a=!0}a&&(o+=1)}),o>0&&a(e,n.toString()),o}export{P as a,C as c,F as i,S as l,A as n,L as o,M as r,D as s,I as t};
2
+ //# sourceMappingURL=manifest-DVuW_vvO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest-DVuW_vvO.mjs","names":[],"sources":["../src/lib/scaffolding/path-safety.ts","../src/lib/custom-functions/execution-context.ts","../src/lib/custom-functions/manifest.ts"],"sourcesContent":["import { basename, dirname, isAbsolute, relative, resolve, sep } from 'node:path';\n\nimport type { LocalContext } from '../../context.js';\n\n/**\n * Resolve a path through its nearest existing ancestor.\n *\n * This retains nonexistent suffixes while resolving every existing symlink in\n * the prefix, which is required before safely creating a new file.\n *\n * @param context - CLI context\n * @param path - Absolute or relative path\n * @returns Physical absolute path\n */\nfunction resolvePhysicalPath(context: LocalContext, path: string): string {\n let current = resolve(path);\n const suffix: string[] = [];\n while (true) {\n try {\n context.fs.lstatSync(current);\n return resolve(context.fs.realpathSync(current), ...suffix);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code !== 'ENOENT' && code !== 'ENOTDIR') {\n throw error;\n }\n const parent = dirname(current);\n if (parent === current) {\n throw error;\n }\n suffix.unshift(basename(current));\n current = parent;\n }\n }\n}\n\n/**\n * Determine whether a path physically remains under an approved root.\n *\n * @param context - CLI context\n * @param root - Approved directory\n * @param path - Candidate destination or referenced file\n * @returns Whether existing symlinks keep the path under the root\n */\nexport function isPathPhysicallyContained(\n context: LocalContext,\n root: string,\n path: string,\n): boolean {\n const physicalRoot = resolvePhysicalPath(context, root);\n const physicalPath = resolvePhysicalPath(context, path);\n const child = relative(physicalRoot, physicalPath);\n return child !== '..' && !child.startsWith(`..${sep}`) && !isAbsolute(child);\n}\n\n/**\n * Reject a path whose existing symlink ancestors escape an approved root.\n *\n * @param context - CLI context\n * @param root - Approved directory\n * @param path - Candidate path\n */\nexport function assertPathPhysicallyContained(\n context: LocalContext,\n root: string,\n path: string,\n): void {\n if (!isPathPhysicallyContained(context, root, path)) {\n throw new Error(`Refusing to access path outside project root through a symlink: ${path}`);\n }\n}\n","import { Buffer } from 'node:buffer';\nimport { isIP } from 'node:net';\n\n/** Maximum environment value size supported by the local process. */\nexport const CUSTOM_FUNCTION_MAX_ENV_VALUE_BYTES = 64 * 1024;\n\nconst RESERVED_ENV_NAMES = new Set([\n 'DENO_CERT',\n 'DENO_DIR',\n 'DENO_TLS_CA_STORE',\n 'HTTP_PROXY',\n 'HTTPS_PROXY',\n 'NODE_EXTRA_CA_CERTS',\n 'NO_COLOR',\n 'NO_PROXY',\n 'NPM_CONFIG_REGISTRY',\n]);\n\n/**\n * Check whether a value matches Sombra's hostname/IP contract.\n *\n * @param host - Manifest allowed-host value\n * @returns Whether the host is valid\n */\nfunction isValidAllowedHost(host: string): boolean {\n const bracketedIp = /^\\[([^\\]]+)\\](?::(\\d+))?$/u.exec(host);\n if (bracketedIp) {\n const port = bracketedIp[2];\n return isIP(bracketedIp[1]!) === 6 && (!port || (Number(port) > 0 && Number(port) <= 65_535));\n }\n if (isIP(host) > 0) {\n return true;\n }\n const hostWithPort = /^([^:]+):(\\d+)$/u.exec(host);\n const hostname = hostWithPort?.[1] ?? host;\n const port = hostWithPort?.[2];\n return (\n (!port || (Number(port) > 0 && Number(port) <= 65_535)) &&\n hostname.length <= 253 &&\n hostname\n .split('.')\n .every(\n (label) =>\n label.length > 0 &&\n label.length <= 63 &&\n /^[A-Za-z\\d](?:[A-Za-z\\d-]*[A-Za-z\\d])?$/u.test(label),\n )\n );\n}\n\n/**\n * Validate execution settings shared by check, push, and local simulation.\n *\n * @param config - Environment and network settings\n */\nexport function validateCustomFunctionExecutionContext(config: {\n /** User-defined environment variables. */\n env?: Record<string, string>;\n /** Native network destinations. */\n allowedHosts?: string[];\n}): void {\n const environment = config.env ?? {};\n const envNames = Object.keys(environment);\n const malformedEnvNames = envNames.filter((name) => !/^[A-Za-z][A-Za-z\\d_]*$/u.test(name));\n const reservedEnvNames = envNames.filter(\n (name) => RESERVED_ENV_NAMES.has(name) || name.startsWith('DENO_'),\n );\n if (malformedEnvNames.length > 0 || reservedEnvNames.length > 0) {\n throw new Error(\n [\n malformedEnvNames.length > 0\n ? `Invalid environment variable names: ${malformedEnvNames.join(', ')}`\n : undefined,\n reservedEnvNames.length > 0\n ? `Reserved environment variable names: ${reservedEnvNames.join(', ')}`\n : undefined,\n ]\n .filter(Boolean)\n .join('. '),\n );\n }\n const oversizedEnvNames = envNames.filter(\n (name) => Buffer.byteLength(environment[name]!) > CUSTOM_FUNCTION_MAX_ENV_VALUE_BYTES,\n );\n if (oversizedEnvNames.length > 0) {\n throw new Error(\n `Environment values exceed ${CUSTOM_FUNCTION_MAX_ENV_VALUE_BYTES} bytes: ${oversizedEnvNames.join(', ')}`,\n );\n }\n const allowedHosts = config.allowedHosts ?? [];\n if (allowedHosts.length > 1 && allowedHosts.includes('*')) {\n throw new Error('allowed-hosts cannot combine \"*\" with specific hosts.');\n }\n const invalidHosts = allowedHosts.filter((host) => host !== '*' && !isValidAllowedHost(host));\n if (invalidHosts.length > 0) {\n throw new Error(`Invalid allowed-hosts: ${invalidHosts.join(', ')}`);\n }\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, relative, resolve, sep } from 'node:path';\n\nimport { CustomFunctionPayloadType, CustomFunctionType } from '@transcend-io/privacy-types';\nimport type { CustomFunctionConfigInput } from '@transcend-io/sdk';\nimport { decodeCodec, type ObjByString } from '@transcend-io/type-utils';\nimport * as t from 'io-ts';\nimport yaml from 'js-yaml';\nimport { isMap, isScalar, isSeq, parseDocument } from 'yaml';\n\nimport { replaceVariablesInYaml } from '../readTranscendYaml.js';\nimport { validateCustomFunctionExecutionContext } from './execution-context.js';\n\nexport const CustomFunctionManifestEntry = t.intersection([\n t.type({\n /** Display name of the custom function — used as the sync key when no `id` is set */\n name: t.string,\n /** Path to the TypeScript source file, relative to the manifest */\n code: t.string,\n }),\n t.partial({\n /**\n * Custom function ID. Optional, but required to disambiguate when multiple\n * custom functions share a name. Written back by `push --updateManifest`.\n */\n id: t.string,\n /** Description shown in the Transcend dashboard */\n description: t.string,\n /** Custom function type. Defaults to GENERAL */\n type: t.union([t.literal(CustomFunctionType.Dsr), t.literal(CustomFunctionType.General)]),\n /** Data silo ID to attach to (required for DSR functions) */\n 'data-silo-id': t.string,\n /** The Sombra gateway the function belongs to */\n 'sombra-id': t.string,\n /**\n * Name of the environment variable holding the internal key of the\n * function's Sombra gateway. The key itself never lives in the manifest —\n * it is read from the CLI's process environment at push time. Overrides\n * `--sombraAuth` for this entry.\n */\n 'sombra-auth-env': t.string,\n /** Hosts the function may make network requests to */\n 'allowed-hosts': t.array(t.string),\n /** Execution timeout in milliseconds */\n 'timeout-ms': t.number,\n /** Whether the function may import third party modules */\n 'allow-third-party-imports': t.boolean,\n /** Environment variables to expose to the function */\n env: t.record(t.string, t.string),\n /**\n * Path to a JSON file (relative to the manifest) holding the test payload\n * to run the function with before pushing. When set, the function is\n * test-run after signing and only pushed/promoted when the test passes.\n * Shorthand for a single-item `test-payloads` list.\n */\n 'test-payload': t.string,\n /**\n * Which export to invoke when test-running a DSR function:\n * `DATA_POINT` invokes the default export, `REQUEST_ENRICHER` invokes the\n * `enricher` export. Defaults to DATA_POINT. Ignored for GENERAL functions.\n * Only valid alongside `test-payload`.\n */\n 'test-payload-type': t.union([\n t.literal(CustomFunctionPayloadType.DataPoint),\n t.literal(CustomFunctionPayloadType.RequestEnricher),\n ]),\n /**\n * Test payloads to run the function with before pushing. Every payload\n * runs and all must pass for the function to be pushed/promoted. DSR\n * functions should list one payload per export they implement\n * (`DATA_POINT` for the default export, `REQUEST_ENRICHER` for the\n * `enricher` export). Mutually exclusive with `test-payload`.\n */\n 'test-payloads': t.array(\n t.intersection([\n t.type({\n /** Path to the JSON payload file, relative to the manifest */\n payload: t.string,\n }),\n t.partial({\n /** Which export the payload invokes (DSR only). Defaults to DATA_POINT */\n 'payload-type': t.union([\n t.literal(CustomFunctionPayloadType.DataPoint),\n t.literal(CustomFunctionPayloadType.RequestEnricher),\n ]),\n }),\n ]),\n ),\n }),\n]);\n\n/** Override type */\nexport type CustomFunctionManifestEntry = t.TypeOf<typeof CustomFunctionManifestEntry>;\n\nexport const CustomFunctionsManifest = t.type({\n /** The custom functions to sync */\n functions: t.array(CustomFunctionManifestEntry),\n});\n\n/** Override type */\nexport type CustomFunctionsManifest = t.TypeOf<typeof CustomFunctionsManifest>;\n\n/**\n * Determine whether a relative manifest path stays inside the manifest's\n * directory after normalization.\n *\n * @param filePath - Path from a custom function manifest entry\n * @returns Whether the normalized path is contained by the manifest directory\n */\nexport function isCustomFunctionManifestPathContained(filePath: string): boolean {\n const manifestDirectory = resolve('/', '__custom-function-manifest__');\n const relativePath = relative(manifestDirectory, resolve(manifestDirectory, filePath));\n return relativePath !== '..' && !relativePath.startsWith(`..${sep}`) && !isAbsolute(relativePath);\n}\n\n/**\n * Validate semantic constraints shared by manifest readers and editors.\n *\n * @param manifest - Shape-validated custom function manifest\n * @param options - Validation behavior\n */\nexport function validateCustomFunctionsManifest(\n manifest: CustomFunctionsManifest,\n options: {\n /** Skip path validation while identifying candidate manifest files. */\n skipPathValidation?: boolean;\n } = {},\n): void {\n // IDs must be unique — two entries cannot target the same function\n const duplicateIds = manifest.functions\n .map(({ id }) => id)\n .filter((id, index, ids) => id !== undefined && ids.indexOf(id) !== index);\n if (duplicateIds.length > 0) {\n throw new Error(\n `Duplicate custom function ids in manifest: ${[...new Set(duplicateIds)].join(', ')}`,\n );\n }\n\n // Names may repeat only when every entry sharing the name carries an `id`\n // to disambiguate; an id-less entry syncs by name and would be ambiguous.\n const allNames = manifest.functions.map(({ name }) => name);\n const ambiguousNames = manifest.functions\n .filter(({ id, name }) => id === undefined && allNames.filter((n) => n === name).length > 1)\n .map(({ name }) => name);\n if (ambiguousNames.length > 0) {\n throw new Error(\n `Duplicate custom function names in manifest without ids: ${[...new Set(ambiguousNames)].join(', ')}. ` +\n 'Add an `id` field to each duplicated entry to disambiguate.',\n );\n }\n\n manifest.functions.forEach((entry) => {\n if (entry['test-payload'] !== undefined && entry['test-payloads'] !== undefined) {\n throw new Error(\n `Custom function \"${entry.name}\" sets both test-payload and test-payloads — ` +\n 'use test-payloads alone to define multiple payloads.',\n );\n }\n if (entry['test-payload-type'] !== undefined && entry['test-payload'] === undefined) {\n throw new Error(\n `Custom function \"${entry.name}\" sets test-payload-type without test-payload — ` +\n 'set payload-type per item in test-payloads instead.',\n );\n }\n if (\n entry.type !== CustomFunctionType.Dsr &&\n (entry['test-payload-type'] !== undefined ||\n entry['test-payloads']?.some(\n ({ ['payload-type']: payloadType }) => payloadType !== undefined,\n ))\n ) {\n throw new Error(\n `Custom function \"${entry.name}\" sets a DSR payload type but is not type DSR.`,\n );\n }\n\n const referencedPaths = [\n { field: 'code', path: entry.code },\n ...(entry['test-payload'] === undefined\n ? []\n : [{ field: 'test-payload', path: entry['test-payload'] }]),\n ...(entry['test-payloads'] ?? []).map(({ payload }, index) => ({\n field: `test-payloads[${index}].payload`,\n path: payload,\n })),\n ];\n referencedPaths.forEach(({ field, path }) => {\n if (!options.skipPathValidation && !isCustomFunctionManifestPathContained(path)) {\n throw new Error(\n `Custom function \"${entry.name}\" has a ${field} path outside the manifest directory: ${path}`,\n );\n }\n });\n });\n}\n\n/**\n * Parse and validate a custom functions manifest without resolving variables\n * or reading any referenced files.\n *\n * Unresolved `<<parameters.*>>` values remain plain strings in the returned\n * manifest.\n *\n * @param contents - Custom function manifest YAML\n * @param options - Validation behavior\n * @returns The parsed, shape-validated, and semantically valid manifest\n */\nexport function parseCustomFunctionsManifest(\n contents: string,\n options: {\n /** Skip path validation while identifying candidate manifest files. */\n skipPathValidation?: boolean;\n } = {},\n): CustomFunctionsManifest {\n const manifest = decodeCodec(CustomFunctionsManifest, yaml.load(contents));\n validateCustomFunctionsManifest(manifest, options);\n return manifest;\n}\n\n/**\n * A custom function config from the manifest, plus CLI-level settings that\n * are not part of the SDK sync input.\n */\nexport type CustomFunctionManifestConfig = CustomFunctionConfigInput & {\n /** Env variable name holding the internal key of the function's Sombra gateway */\n sombraAuthEnv?: string;\n /** Parsed JSON test payloads to run the function with before pushing */\n testPayloads?: {\n /** The parsed JSON payload */\n payload: object;\n /** Which export the payload invokes when test-running a DSR function */\n payloadType?: Exclude<CustomFunctionPayloadType, typeof CustomFunctionPayloadType.Maestro>;\n }[];\n};\n\n/**\n * Hydrate parsed manifest entries from their referenced files.\n *\n * @param filePath - Path to the manifest YAML file\n * @param manifest - Parsed manifest\n * @param assertPath - Optional safety check applied before referenced files are read\n * @returns Custom Function configs with code and payloads loaded\n */\nfunction hydrateCustomFunctionsManifest(\n filePath: string,\n manifest: CustomFunctionsManifest,\n assertPath?: (path: string) => void,\n): CustomFunctionManifestConfig[] {\n const manifestDir = dirname(resolve(filePath));\n\n /**\n * Load and parse a JSON test payload file.\n *\n * @param entryName - The manifest entry name, for error messages\n * @param payloadFile - The payload file path, relative to the manifest\n * @returns The parsed payload object\n */\n const loadTestPayload = (entryName: string, payloadFile: string): object => {\n const testPayloadPath = resolve(manifestDir, payloadFile);\n assertPath?.(testPayloadPath);\n if (!existsSync(testPayloadPath)) {\n throw new Error(\n `Test payload file for custom function \"${entryName}\" does not exist: ${testPayloadPath}`,\n );\n }\n const rawPayload = readFileSync(testPayloadPath, 'utf-8');\n try {\n return JSON.parse(rawPayload);\n } catch (err) {\n throw new Error(\n `Test payload file for custom function \"${entryName}\" is not valid JSON ` +\n `(${testPayloadPath}): ${(err as Error).message}`,\n );\n }\n };\n\n return manifest.functions.map((entry) => {\n validateCustomFunctionExecutionContext({\n ...(entry.env ? { env: entry.env } : {}),\n ...(entry['allowed-hosts'] ? { allowedHosts: entry['allowed-hosts'] } : {}),\n });\n const codePath = resolve(manifestDir, entry.code);\n assertPath?.(codePath);\n if (!existsSync(codePath)) {\n throw new Error(`Code file for custom function \"${entry.name}\" does not exist: ${codePath}`);\n }\n\n // `test-payload` is shorthand for a single-item `test-payloads` list\n let testPayloads: CustomFunctionManifestConfig['testPayloads'];\n if (entry['test-payload'] !== undefined) {\n testPayloads = [\n {\n payload: loadTestPayload(entry.name, entry['test-payload']),\n ...(entry['test-payload-type'] !== undefined\n ? { payloadType: entry['test-payload-type'] }\n : {}),\n },\n ];\n } else if (entry['test-payloads'] !== undefined && entry['test-payloads'].length > 0) {\n testPayloads = entry['test-payloads'].map((item) => ({\n payload: loadTestPayload(entry.name, item.payload),\n ...(item['payload-type'] !== undefined ? { payloadType: item['payload-type'] } : {}),\n }));\n }\n\n return {\n name: entry.name,\n code: readFileSync(codePath, 'utf-8'),\n ...(entry.id !== undefined ? { id: entry.id } : {}),\n ...(entry.description !== undefined ? { description: entry.description } : {}),\n ...(entry.type !== undefined ? { type: entry.type } : {}),\n ...(entry['data-silo-id'] !== undefined ? { dataSiloId: entry['data-silo-id'] } : {}),\n ...(entry['sombra-id'] !== undefined ? { sombraId: entry['sombra-id'] } : {}),\n ...(entry['sombra-auth-env'] !== undefined\n ? { sombraAuthEnv: entry['sombra-auth-env'] }\n : {}),\n ...(entry['allowed-hosts'] !== undefined ? { allowedHosts: entry['allowed-hosts'] } : {}),\n ...(entry['timeout-ms'] !== undefined ? { timeoutMs: entry['timeout-ms'] } : {}),\n ...(entry['allow-third-party-imports'] !== undefined\n ? { allowThirdPartyImports: entry['allow-third-party-imports'] }\n : {}),\n ...(entry.env !== undefined ? { env: entry.env } : {}),\n ...(testPayloads !== undefined ? { testPayloads } : {}),\n };\n });\n}\n\n/**\n * Read a custom functions manifest from disk, apply variable substitution,\n * validate it, and hydrate its referenced code and payload files.\n *\n * Variable substitution deliberately happens before parsing and hydration to\n * preserve push behavior.\n *\n * @param filePath - Path to the manifest YAML file\n * @param variables - Variables to fill into `<<parameters.x>>` placeholders\n * @param assertPath - Optional safety check applied before referenced files are read\n * @returns The custom function configs, with code loaded from disk\n */\nexport function readCustomFunctionsManifest(\n filePath: string,\n variables: ObjByString = {},\n assertPath?: (path: string) => void,\n): CustomFunctionManifestConfig[] {\n const fileContents = readFileSync(filePath, 'utf-8');\n const replacedVariables = replaceVariablesInYaml(\n fileContents,\n variables,\n `Also check that there are no extra variables defined in your manifest: ${filePath}`,\n );\n const manifest = parseCustomFunctionsManifest(replacedVariables);\n return hydrateCustomFunctionsManifest(filePath, manifest, assertPath);\n}\n\n/**\n * Resolve and hydrate one selected manifest entry.\n *\n * This lets local execution ignore unrelated entries whose files or\n * variables are currently incomplete.\n *\n * @param filePath - Path to the containing manifest\n * @param entry - Selected raw manifest entry\n * @param variables - Variables to fill into `<<parameters.x>>` placeholders\n * @param assertPath - Optional safety check applied before referenced files are read\n * @returns Hydrated selected configuration and its source path\n */\nexport function readCustomFunctionManifestEntry(\n filePath: string,\n entry: CustomFunctionManifestEntry,\n variables: ObjByString = {},\n assertPath?: (path: string) => void,\n): { config: CustomFunctionManifestConfig; sourcePath: string } {\n const entryContents = yaml.dump({ functions: [entry] });\n const replacedVariables = replaceVariablesInYaml(\n entryContents,\n variables,\n `Also check that there are no extra variables defined for \"${entry.name}\" in: ${filePath}`,\n );\n const manifest = parseCustomFunctionsManifest(replacedVariables);\n const resolvedEntry = manifest.functions[0]!;\n const manifestDirectory = dirname(resolve(filePath));\n const sourcePath = resolve(manifestDirectory, resolvedEntry.code);\n return {\n config: hydrateCustomFunctionsManifest(filePath, manifest, assertPath)[0]!,\n sourcePath,\n };\n}\n\n/**\n * Append an entry to a manifest YAML document while preserving the existing\n * document's comments, ordering, scalar styles, and unresolved placeholders.\n *\n * The complete result is parsed and validated with the same codec and\n * semantic rules used by {@link readCustomFunctionsManifest}.\n *\n * @param contents - Existing custom function manifest YAML\n * @param entry - Manifest entry to append\n * @returns Updated manifest YAML\n */\nexport function insertCustomFunctionManifestEntry(\n contents: string,\n entry: CustomFunctionManifestEntry,\n): string {\n const document = parseDocument(contents);\n if (document.errors.length > 0) {\n throw document.errors[0];\n }\n\n const functions = document.get('functions');\n if (!isSeq(functions)) {\n throw new Error('Expected a `functions` list in custom function manifest');\n }\n\n if (functions.items.length === 0) {\n functions.flow = false;\n }\n functions.add(document.createNode(entry));\n const updatedContents = document.toString();\n parseCustomFunctionsManifest(updatedContents);\n return updatedContents;\n}\n\n/**\n * The IDs assigned to a manifest entry during a push, to write back into the\n * manifest file.\n */\nexport interface CustomFunctionManifestIds {\n /** Custom function ID */\n id?: string;\n /** Data silo (DSR integration) ID, for DSR functions */\n dataSiloId?: string;\n}\n\n/**\n * Write custom function and data silo IDs back into a manifest file, so\n * future pushes match by ID instead of by (potentially non-unique) name and\n * DSR entries keep pointing at their integration.\n *\n * The raw file text is edited via a comment- and formatting-preserving YAML\n * document, so comments and un-substituted `<<parameters.x>>` placeholders\n * survive untouched. Only entries that are missing the respective key are\n * modified.\n *\n * @param filePath - Path to the manifest YAML file\n * @param idsByIndex - IDs for each manifest entry, by array index (undefined\n * entries are left unchanged)\n * @returns The number of entries that were updated\n */\nexport function writeCustomFunctionIdsToManifest(\n filePath: string,\n idsByIndex: (CustomFunctionManifestIds | undefined)[],\n): number {\n const document = parseDocument(readFileSync(filePath, 'utf-8'));\n const functions = document.get('functions');\n if (!isSeq(functions)) {\n throw new Error(`Expected a \\`functions\\` list in manifest: ${filePath}`);\n }\n\n let updated = 0;\n functions.items.forEach((item, index) => {\n const ids = idsByIndex[index];\n if (!ids || !isMap(item)) {\n return;\n }\n let changed = false;\n if (ids.id && !item.has('id')) {\n // Place `id` first so it reads as the entry's key\n item.items.unshift(document.createPair('id', ids.id));\n changed = true;\n }\n if (ids.dataSiloId && !item.has('data-silo-id')) {\n // Place `data-silo-id` right after `id` (or first when there is no id)\n const idIndex = item.items.findIndex((pair) => isScalar(pair.key) && pair.key.value === 'id');\n item.items.splice(idIndex + 1, 0, document.createPair('data-silo-id', ids.dataSiloId));\n changed = true;\n }\n if (changed) {\n updated += 1;\n }\n });\n\n if (updated > 0) {\n writeFileSync(filePath, document.toString());\n }\n return updated;\n}\n"],"mappings":"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"}
@@ -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-DA7BRD7M.mjs.map
2
+ //# sourceMappingURL=mapConsentCsvRowsToInputs-MMPZwzrV.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"mapConsentCsvRowsToInputs-DA7BRD7M.mjs","names":[],"sources":["../src/lib/consent-manager/mapConsentCsvRowsToInputs.ts"],"sourcesContent":["import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport { splitCsvToList } from '@transcend-io/utils';\n\nimport type { CookieCsvInput, CookieInput, DataFlowCsvInput, DataFlowInput } from '../../codecs.js';\n\nconst OMITTED_CONSENT_CSV_COLUMNS = new Set([\n 'ID',\n 'Activity',\n 'Encounters',\n 'Last Seen At',\n 'Has Native Do Not Sell/Share Support',\n 'IAB USP API Support',\n 'Service',\n 'Service Description',\n 'Website URL',\n 'Categories of Recipients',\n]);\n\n/**\n * Convert remaining CSV columns into custom attributes.\n *\n * @param columns - Columns not consumed by the native input fields.\n * @returns Custom attribute inputs.\n */\nfunction mapCustomAttributes(\n columns: Record<string, string | undefined>,\n): Array<{ key: string; values: string[] }> {\n return Object.entries(columns)\n .filter(\n (entry): entry is [string, string] =>\n entry[1] !== undefined && !OMITTED_CONSENT_CSV_COLUMNS.has(entry[0]),\n )\n .map(([key, value]) => ({\n key,\n values: splitCsvToList(value),\n }));\n}\n\n/**\n * Convert decoded cookie CSV rows into API inputs.\n *\n * @param rows - Decoded cookie CSV rows.\n * @param trackerStatus - Default status for rows without a status.\n * @returns Cookie API inputs.\n */\nexport function mapCookieCsvRowsToInputs(\n rows: CookieCsvInput[],\n trackerStatus: ConsentTrackerStatus,\n): CookieInput[] {\n return rows.map(\n ({\n 'Is Regex?': isRegex,\n Notes,\n Purpose,\n Status,\n Owners,\n Teams,\n Name,\n ...rest\n }): CookieInput => ({\n ...(typeof isRegex === 'string' ? { isRegex: isRegex.toLowerCase() === 'true' } : {}),\n name: Name,\n description: Notes,\n trackingPurposes: splitCsvToList(Purpose),\n status: Status || trackerStatus,\n owners: Owners ? splitCsvToList(Owners) : undefined,\n teams: Teams ? splitCsvToList(Teams) : undefined,\n attributes: mapCustomAttributes(rest),\n }),\n );\n}\n\n/**\n * Convert decoded data flow CSV rows into API inputs.\n *\n * @param rows - Decoded data flow CSV rows.\n * @param trackerStatus - Default status for rows without a status.\n * @returns Data flow API inputs.\n */\nexport function mapDataFlowCsvRowsToInputs(\n rows: DataFlowCsvInput[],\n trackerStatus: ConsentTrackerStatus,\n): DataFlowInput[] {\n return rows.map(\n ({\n Type,\n Notes,\n Purpose,\n Status,\n Owners,\n Teams,\n 'Connections Made To': value,\n ...rest\n }): DataFlowInput => ({\n value,\n type: Type,\n description: Notes,\n trackingPurposes: splitCsvToList(Purpose),\n status: Status || trackerStatus,\n owners: Owners ? splitCsvToList(Owners) : undefined,\n teams: Teams ? splitCsvToList(Teams) : undefined,\n attributes: mapCustomAttributes(rest),\n }),\n );\n}\n"],"mappings":"qDAKA,MAAM,EAA8B,IAAI,IAAI,CAC1C,KACA,WACA,aACA,eACA,uCACA,sBACA,UACA,sBACA,cACA,2BACD,CAAC,CAQF,SAAS,EACP,EAC0C,CAC1C,OAAO,OAAO,QAAQ,EAAQ,CAC3B,OACE,GACC,EAAM,KAAO,IAAA,IAAa,CAAC,EAA4B,IAAI,EAAM,GAAG,CACvE,CACA,KAAK,CAAC,EAAK,MAAY,CACtB,MACA,OAAQ,EAAe,EAAM,CAC9B,EAAE,CAUP,SAAgB,EACd,EACA,EACe,CACf,OAAO,EAAK,KACT,CACC,YAAa,EACb,QACA,UACA,SACA,SACA,QACA,OACA,GAAG,MACe,CAClB,GAAI,OAAO,GAAY,SAAW,CAAE,QAAS,EAAQ,aAAa,GAAK,OAAQ,CAAG,EAAE,CACpF,KAAM,EACN,YAAa,EACb,iBAAkB,EAAe,EAAQ,CACzC,OAAQ,GAAU,EAClB,OAAQ,EAAS,EAAe,EAAO,CAAG,IAAA,GAC1C,MAAO,EAAQ,EAAe,EAAM,CAAG,IAAA,GACvC,WAAY,EAAoB,EAAK,CACtC,EACF,CAUH,SAAgB,EACd,EACA,EACiB,CACjB,OAAO,EAAK,KACT,CACC,OACA,QACA,UACA,SACA,SACA,QACA,sBAAuB,EACvB,GAAG,MACiB,CACpB,QACA,KAAM,EACN,YAAa,EACb,iBAAkB,EAAe,EAAQ,CACzC,OAAQ,GAAU,EAClB,OAAQ,EAAS,EAAe,EAAO,CAAG,IAAA,GAC1C,MAAO,EAAQ,EAAe,EAAM,CAAG,IAAA,GACvC,WAAY,EAAoB,EAAK,CACtC,EACF"}
1
+ {"version":3,"file":"mapConsentCsvRowsToInputs-MMPZwzrV.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-CdgK1myP.mjs";import{t}from"./logger-CB_h_zbj.mjs";import{RequestDataSiloStatus as n}from"@transcend-io/privacy-types";import r from"colors";import{CHANGE_REQUEST_DATA_SILO_STATUS as i,buildTranscendGraphQLClient as a,fetchRequestDataSilo as o,makeGraphQLRequest as s}from"@transcend-io/sdk";import{map as c}from"@transcend-io/utils";import l from"cli-progress";async function u({requestIds:u,dataSiloId:d,auth:f,concurrency:p=100,status:m=n.Resolved,transcendUrl:h=e}){let g=a(h,f),_=new Date().getTime(),v=new l.SingleBar({},l.Presets.shades_classic);t.info(r.magenta(`Notifying Transcend for data silo "${d}" marking "${u.length}" requests as completed.`));let y=0;v.start(u.length,0),await c(u,async e=>{let n=await o(g,{logger:t,filterBy:{requestId:e,dataSiloId:d}});try{await s(g,i,{variables:{requestDataSiloId:n.id,status:m},logger:t})}catch(e){if(!e.message.includes(`Client error: Request must be active:`)&&!e.message.includes(`Failed to find RequestDataSilo`))throw e}y+=1,v.update(y)},{concurrency:p}),v.stop();let b=new Date().getTime()-_;return t.info(r.green(`Successfully notified Transcend in "${b/1e3}" seconds!`)),u.length}export{u as t};
2
- //# sourceMappingURL=markRequestDataSiloIdsCompleted-CK7PNwTz.mjs.map
1
+ import{a as e}from"./constants-BG53Mbi9.mjs";import{t}from"./logger-9T6vva73.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-PKCcn5wQ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"markRequestDataSiloIdsCompleted-CK7PNwTz.mjs","names":[],"sources":["../src/lib/cron/markRequestDataSiloIdsCompleted.ts"],"sourcesContent":["import { RequestDataSiloStatus } from '@transcend-io/privacy-types';\nimport {\n buildTranscendGraphQLClient,\n makeGraphQLRequest,\n CHANGE_REQUEST_DATA_SILO_STATUS,\n fetchRequestDataSilo,\n} from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\n\n/**\n * Given a CSV of Request IDs, mark associated RequestDataSilos as completed\n *\n * @param options - Options\n * @returns Number of items marked as completed\n */\nexport async function markRequestDataSiloIdsCompleted({\n requestIds,\n dataSiloId,\n auth,\n concurrency = 100,\n status = RequestDataSiloStatus.Resolved,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** The list of request ids to mark as completed */\n requestIds: string[];\n /** Transcend API key authentication */\n auth: string;\n /** Data Silo ID to pull down jobs for */\n dataSiloId: string;\n /** Status to update requests to */\n status?: RequestDataSiloStatus;\n /** Upload concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<number> {\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Notify Transcend\n logger.info(\n colors.magenta(\n `Notifying Transcend for data silo \"${dataSiloId}\" marking \"${requestIds.length}\" requests as completed.`,\n ),\n );\n\n let total = 0;\n progressBar.start(requestIds.length, 0);\n await map(\n requestIds,\n async (requestId) => {\n const requestDataSilo = await fetchRequestDataSilo(client, {\n logger,\n filterBy: { requestId, dataSiloId },\n });\n\n try {\n await makeGraphQLRequest<{\n /** Whether we successfully uploaded the results */\n success: boolean;\n }>(client, CHANGE_REQUEST_DATA_SILO_STATUS, {\n variables: {\n requestDataSiloId: requestDataSilo.id,\n status,\n },\n logger,\n });\n } catch (err) {\n if (\n !err.message.includes('Client error: Request must be active:') &&\n !err.message.includes('Failed to find RequestDataSilo')\n ) {\n throw err;\n }\n }\n\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(colors.green(`Successfully notified Transcend in \"${totalTime / 1000}\" seconds!`));\n return requestIds.length;\n}\n"],"mappings":"yYAoBA,eAAsB,EAAgC,CACpD,aACA,aACA,OACA,cAAc,IACd,SAAS,EAAsB,SAC/B,eAAe,GAcG,CAElB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAGrF,EAAO,KACL,EAAO,QACL,sCAAsC,EAAW,aAAa,EAAW,OAAO,0BACjF,CACF,CAED,IAAI,EAAQ,EACZ,EAAY,MAAM,EAAW,OAAQ,EAAE,CACvC,MAAM,EACJ,EACA,KAAO,IAAc,CACnB,IAAM,EAAkB,MAAM,EAAqB,EAAQ,CACzD,SACA,SAAU,CAAE,YAAW,aAAY,CACpC,CAAC,CAEF,GAAI,CACF,MAAM,EAGH,EAAQ,EAAiC,CAC1C,UAAW,CACT,kBAAmB,EAAgB,GACnC,SACD,CACD,SACD,CAAC,OACK,EAAK,CACZ,GACE,CAAC,EAAI,QAAQ,SAAS,wCAAwC,EAC9D,CAAC,EAAI,QAAQ,SAAS,iCAAiC,CAEvD,MAAM,EAIV,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAGvB,OADA,EAAO,KAAK,EAAO,MAAM,uCAAuC,EAAY,IAAK,YAAY,CAAC,CACvF,EAAW"}
1
+ {"version":3,"file":"markRequestDataSiloIdsCompleted-PKCcn5wQ.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-CdgK1myP.mjs";import{t}from"./logger-CB_h_zbj.mjs";import{o as n}from"./request-CCCU2SdV.mjs";import{r}from"./fetchAllRequests-DUQGTJjx.mjs";import{RequestStatus as i}from"@transcend-io/privacy-types";import a from"colors";import{buildTranscendGraphQLClient as o,makeGraphQLRequest as s}from"@transcend-io/sdk";import{map as c}from"@transcend-io/utils";import l from"cli-progress";async function u({requestActions:u,auth:d,requestIds:f,statuses:p=[i.Compiling,i.RequestMade,i.Delayed,i.Approving,i.Secondary,i.Enriching,i.Waiting,i.SecondaryApproving],createdAtAfter:m,createdAtBefore:h,updatedAtBefore:g,updatedAtAfter:_,concurrency:v=100,transcendUrl:y=e}){let b=o(y,d),x=new Date().getTime(),S=new l.SingleBar({},l.Presets.shades_classic),C=await r(b,{actions:u,statuses:p,createdAtBefore:h,createdAtAfter:m,updatedAtBefore:g,updatedAtAfter:_,isSilent:!1,requestIds:f});t.info(a.magenta(`Marking "${C.length}" as silent mode.`));let w=0;S.start(C.length,0),await c(C,async e=>{await s(b,n,{variables:{input:{id:e.id,isSilent:!0}},logger:t}),w+=1,S.update(w)},{concurrency:v}),S.stop();let T=new Date().getTime()-x;return t.info(a.green(`Successfully marked ${w} requests as silent mode in "${T/1e3}" seconds!`)),C.length}export{u as t};
2
- //# sourceMappingURL=markSilentPrivacyRequests-Cb-J9ckA.mjs.map
1
+ import{a as e}from"./constants-BG53Mbi9.mjs";import{t}from"./logger-9T6vva73.mjs";import{o as n}from"./request-B1yRTdG-.mjs";import{r}from"./fetchAllRequests-CEDKdq0c.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-7l9I99pe.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"markSilentPrivacyRequests-Cb-J9ckA.mjs","names":[],"sources":["../src/lib/requests/markSilentPrivacyRequests.ts"],"sourcesContent":["import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\nimport { buildTranscendGraphQLClient, makeGraphQLRequest } from '@transcend-io/sdk';\nimport { map } from '@transcend-io/utils';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { UPDATE_PRIVACY_REQUEST, fetchAllRequests } from '../graphql/index.js';\n\n/**\n * Mark a set of privacy requests to be in silent mode\n *\n * @param options - Options\n * @returns The number of requests marked silent\n */\nexport async function markSilentPrivacyRequests({\n requestActions,\n auth,\n requestIds,\n statuses = [\n RequestStatus.Compiling,\n RequestStatus.RequestMade,\n RequestStatus.Delayed,\n RequestStatus.Approving,\n RequestStatus.Secondary,\n RequestStatus.Enriching,\n RequestStatus.Waiting,\n RequestStatus.SecondaryApproving,\n ],\n createdAtAfter,\n createdAtBefore,\n updatedAtBefore,\n updatedAtAfter,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** The request actions that should be restarted */\n requestActions: RequestAction[];\n /** Transcend API key authentication */\n auth: string;\n /** Concurrency limit for approving */\n concurrency?: number;\n /** The request statuses to mark silent */\n statuses?: RequestStatus[];\n /** The set of privacy requests to mark silent */\n requestIds?: string[];\n /** Filter for requests created before this date */\n createdAtBefore?: Date;\n /** Filter for requests created after this date */\n createdAtAfter?: Date;\n /** Filter for requests updated before this date */\n updatedAtBefore?: Date;\n /** Filter for requests updated after this date */\n updatedAtAfter?: Date;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n}): Promise<number> {\n // Find all requests made before createdAt that are in a removing data state\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Time duration\n const t0 = new Date().getTime();\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n // Pull in the requests\n const allRequests = await fetchAllRequests(client, {\n actions: requestActions,\n statuses,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n isSilent: false,\n requestIds,\n });\n\n // Notify Transcend\n logger.info(colors.magenta(`Marking \"${allRequests.length}\" as silent mode.`));\n\n let total = 0;\n progressBar.start(allRequests.length, 0);\n await map(\n allRequests,\n async (requestToMarkSilent) => {\n await makeGraphQLRequest(client, UPDATE_PRIVACY_REQUEST, {\n variables: {\n input: {\n id: requestToMarkSilent.id,\n isSilent: true,\n },\n },\n logger,\n });\n\n total += 1;\n progressBar.update(total);\n },\n { concurrency },\n );\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n logger.info(\n colors.green(\n `Successfully marked ${total} requests as silent mode in \"${totalTime / 1000}\" seconds!`,\n ),\n );\n return allRequests.length;\n}\n"],"mappings":"4ZAgBA,eAAsB,EAA0B,CAC9C,iBACA,OACA,aACA,WAAW,CACT,EAAc,UACd,EAAc,YACd,EAAc,QACd,EAAc,UACd,EAAc,UACd,EAAc,UACd,EAAc,QACd,EAAc,mBACf,CACD,iBACA,kBACA,kBACA,iBACA,cAAc,IACd,eAAe,GAsBG,CAElB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAK,IAAI,MAAM,CAAC,SAAS,CAEzB,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAG/E,EAAc,MAAM,EAAiB,EAAQ,CACjD,QAAS,EACT,WACA,kBACA,iBACA,kBACA,iBACA,SAAU,GACV,aACD,CAAC,CAGF,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAY,OAAO,mBAAmB,CAAC,CAE9E,IAAI,EAAQ,EACZ,EAAY,MAAM,EAAY,OAAQ,EAAE,CACxC,MAAM,EACJ,EACA,KAAO,IAAwB,CAC7B,MAAM,EAAmB,EAAQ,EAAwB,CACvD,UAAW,CACT,MAAO,CACL,GAAI,EAAoB,GACxB,SAAU,GACX,CACF,CACD,SACD,CAAC,CAEF,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SACF,CAAG,EAOvB,OALA,EAAO,KACL,EAAO,MACL,uBAAuB,EAAM,+BAA+B,EAAY,IAAK,YAC9E,CACF,CACM,EAAY"}
1
+ {"version":3,"file":"markSilentPrivacyRequests-7l9I99pe.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-CB_h_zbj.mjs";import{chunk as t,difference as n,flatten as r,keyBy as i,uniq as a}from"lodash-es";import o from"colors";import{apply as s,getEntries as c}from"@transcend-io/type-utils";import{CREATE_DATA_SILOS as l,UPDATE_DATA_SILOS as u,UPDATE_OR_CREATE_DATA_POINT as d,convertToDataSubjectBlockList as f,createDataSubject as p,fetchAllActions as m,fetchAllAttributes as h,fetchAllDataSilos as g,fetchAllDataSubjects as _,fetchApiKeys as v,fetchIdentifiersAndCreateMissing as y,makeGraphQLRequest as b,syncAction as x,syncActionItemCollections as S,syncActionItems as C,syncAttribute as w,syncBusinessEntities as T,syncConsentManager as ee,syncConsentWorkflowTriggers as te,syncCookies as ne,syncDataCategories as re,syncDataFlows as ie,syncDataSiloDependencies as ae,syncDataSubject as oe,syncEnricher as se,syncIdentifier as ce,syncIntlMessages as le,syncPartitions as ue,syncPolicies as de,syncPreferenceOptionValues as fe,syncPreferenceTopics as pe,syncPrivacyCenter as me,syncProcessingActivities as he,syncProcessingPurposes as ge,syncPurposes as _e,syncTeams as ve,syncTemplate as ye,syncVendors as be,syncWorkflowConfigs as xe}from"@transcend-io/sdk";import{map as E,mapSeries as D}from"@transcend-io/utils";import O from"cli-progress";const k=/^[A-Za-z]+$/;function Se(e){let t=[],n=(e,n)=>{k.test(e)||t.push(`${n}: slug "${e}" is invalid — slugs must contain only alphabetical letters (A-Z, a-z). Topic slugs are normalized to PascalCase server-side, so YAML slugs should already be PascalCase or matching will break on subsequent pulls.`)};for(let t of e[`preference-options`]??[])n(t.slug,`preference-options`);for(let t of e.purposes??[])for(let e of t[`preference-topics`]??[]){n(e.slug,`purposes (topic "${e.title}")`);for(let t of e.options??[])n(t.slug,`purposes (topic "${e.title}" option "${t.title}")`)}return t}async function A({"data-silos":t=[],"data-subjects":s=[],"processing-activities":c=[],enrichers:l=[]},u,d=!1){let f=a([...r(t.map(e=>e[`data-subjects`]||[])||[]),...r(c.map(({dataSubjectTypes:e})=>e??[])??[]),...r(l.map(e=>e[`data-subjects`]||[])||[]),...s.map(e=>e.type)]);if(f.length===0&&!d)return{};let m=await _(u,{logger:e}),h=i(m,`type`),g=n(f,m.map(({type:e})=>e));if(g.length>0){e.info(o.magenta(`Creating ${g.length} new data subjects...`));for(let t of g){e.info(o.magenta(`Creating data subject ${t}...`));let n=await p(u,{input:t,logger:e});e.info(o.green(`Created data subject ${t}!`)),h[t]=n}}return h}function Ce(e,t){if(e.length===0)return[];if(typeof e[0]==`string`)return[{titles:a(e)}];let n,r=[],i=new Set,o=(e,n)=>{if(i.has(e))throw Error(`Data silo "${t}" has multiple deletion-dependencies entries for workflow "${e}". Combine them into a single entry.`);i.add(e),r.push({workflowConfigInternalName:e,...n})};return e.forEach(e=>{if(`reset-to-global`in e&&`titles`in e)throw Error(`Data silo "${t}" has a deletion-dependencies entry for workflow "${e.workflow}" that sets both "reset-to-global" and "titles". Use "titles: []" to override the global configuration with no dependencies, or "reset-to-global: true" to fall back to the global configuration.`);if(`reset-to-global`in e){o(e.workflow,{resetToGlobal:!0});return}if(e.workflow){o(e.workflow,{titles:e.titles});return}if(n!==void 0)throw Error(`Data silo "${t}" has multiple global deletion-dependencies entries. Combine them into a single \`{ titles: [...] }\` entry.`);n=e.titles}),[...n===void 0?[]:[{titles:a(n)}],...r]}async function j(n,r,{pageSize:a,dataSubjectsByName:c,apiKeysByTitle:p}){let m=!1,h=new Date().getTime();e.info(o.magenta(`Syncing "${n.length}" data silos...`));let _=i(await g(r,{titles:n.map(({title:e})=>e),pageSize:a,logger:e}),`title`),v=n.filter(({title:e})=>!_[e]);v.length>0&&(e.info(o.magenta(`Creating "${v.length}" data silos that did not exist...`)),await D(t(v,20),async t=>{let{createDataSilos:{dataSilos:n}}=await b(r,l,{variables:{input:t.map(e=>({name:e[`outer-type`]||e.integrationName,title:e.title,country:e.country,countrySubDivision:e.countrySubDivision,sombraId:e[`sombra-id`]}))},logger:e});n.forEach(e=>{_[e.title]=e})}),e.info(o.green(`Successfully created "${v.length}" data silos!`)));let y=t(n,20);await D(y,async(t,n)=>{e.info(o.magenta(`[Batch ${n+1}/${y.length}] Syncing "${t.length}" data silos`)),await b(r,u,{variables:{input:{dataSilos:t.map(e=>({id:_[e.title].id,country:e.country,countrySubDivision:e.countrySubDivision,url:e.url,headers:e.headers,description:e.description,identifiers:e[`identity-keys`],isLive:!e.disabled,ownerEmails:e.owners,teamNames:e.teams,dependedOnDataSilos:e[`deletion-dependencies`]?void 0:[{titles:[]}],apiKeyId:e[`api-key-title`]?p[e[`api-key-title`]].id:void 0,dataSubjectBlockListIds:e[`data-subjects`]?f(e[`data-subjects`],c):void 0,attributes:e.attributes,businessEntityTitles:e.businessEntityTitles,sombraId:e[`sombra-id`],notifyEmailAddress:e[`email-settings`]?.[`notify-email-address`],promptAVendorEmailSendFrequency:e[`email-settings`]?.[`send-frequency`],promptAVendorEmailSendType:e[`email-settings`]?.[`send-type`],promptAVendorEmailIncludeIdentifiersAttachment:e[`email-settings`]?.[`include-identifiers-attachment`],promptAVendorEmailCompletionLinkType:e[`email-settings`]?.[`completion-link-type`],manualWorkRetryFrequency:e[`email-settings`]?.[`manual-work-retry-frequency`]}))}},logger:e}),e.info(o.green(`[Batch ${n+1}/${y.length}] Synced "${t.length}" data silos!`))});let x=new O.SingleBar({},O.Presets.shades_classic),S=n.filter(({datapoints:e=[]})=>e.length>0),C=n.map(({datapoints:e=[]})=>e.length).reduce((e,t)=>e+t,0);e.info(o.magenta(`Syncing "${C}" datapoints from "${S.length}" data silos...`)),x.start(C,0);let w=0;await E(S,async({datapoints:t,title:n})=>{t&&await D(t,async t=>{let i=t.fields?t.fields.map(({key:e,description:t,categories:n,purposes:r,attributes:i,...a})=>({name:e,description:t,categories:n?n.map(e=>({...e,name:e.name||`Other`})):void 0,purposes:r?r.map(e=>({...e,name:e.name||`Other`})):void 0,attributes:i,accessRequestVisibilityEnabled:a[`access-request-visibility-enabled`],erasureRequestRedactionEnabled:a[`erasure-request-redaction-enabled`]})):void 0,a={dataSiloId:_[n].id,path:t.path,name:t.key,title:t.title,description:t.description,...t.owners?{ownerEmails:t.owners}:{},...t.teams?{teamNames:t.teams}:{},...t[`data-collection-tag`]?{dataCollectionTag:t[`data-collection-tag`]}:{},querySuggestions:t[`privacy-action-queries`]?Object.entries(t[`privacy-action-queries`]).map(([e,t])=>({requestType:e,suggestedQuery:t})):void 0,enabledActions:t[`privacy-actions`]||[],subDataPoints:i},s=(a.subDataPoints||[]).map(({name:e})=>e),c=s.filter((e,t)=>s.indexOf(e)!==t);if(c.length>0)e.info(o.red(`\nCannot update datapoint "${t.key}" as it has duplicate sub-datapoints with the same name: \n${c.join(`
1
+ import{t as e}from"./logger-9T6vva73.mjs";import{chunk as t,difference as n,flatten as r,keyBy as i,uniq as a}from"lodash-es";import o from"colors";import{apply as s,getEntries as c}from"@transcend-io/type-utils";import{CREATE_DATA_SILOS as l,UPDATE_DATA_SILOS as u,UPDATE_OR_CREATE_DATA_POINT as d,convertToDataSubjectBlockList as f,createDataSubject as p,fetchAllActions as m,fetchAllAttributes as h,fetchAllDataSilos as g,fetchAllDataSubjects as _,fetchApiKeys as v,fetchIdentifiersAndCreateMissing as y,makeGraphQLRequest as b,syncAction as x,syncActionItemCollections as S,syncActionItems as C,syncAttribute as w,syncBusinessEntities as T,syncConsentManager as ee,syncConsentWorkflowTriggers as te,syncCookies as ne,syncDataCategories as re,syncDataFlows as ie,syncDataSiloDependencies as ae,syncDataSubject as oe,syncEnricher as se,syncIdentifier as ce,syncIntlMessages as le,syncPartitions as ue,syncPolicies as de,syncPreferenceOptionValues as fe,syncPreferenceTopics as pe,syncPrivacyCenter as me,syncProcessingActivities as he,syncProcessingPurposes as ge,syncPurposes as _e,syncTeams as ve,syncTemplate as ye,syncVendors as be,syncWorkflowConfigs as xe}from"@transcend-io/sdk";import{map as E,mapSeries as D}from"@transcend-io/utils";import O from"cli-progress";const k=/^[A-Za-z]+$/;function Se(e){let t=[],n=(e,n)=>{k.test(e)||t.push(`${n}: slug "${e}" is invalid — slugs must contain only alphabetical letters (A-Z, a-z). Topic slugs are normalized to PascalCase server-side, so YAML slugs should already be PascalCase or matching will break on subsequent pulls.`)};for(let t of e[`preference-options`]??[])n(t.slug,`preference-options`);for(let t of e.purposes??[])for(let e of t[`preference-topics`]??[]){n(e.slug,`purposes (topic "${e.title}")`);for(let t of e.options??[])n(t.slug,`purposes (topic "${e.title}" option "${t.title}")`)}return t}async function A({"data-silos":t=[],"data-subjects":s=[],"processing-activities":c=[],enrichers:l=[]},u,d=!1){let f=a([...r(t.map(e=>e[`data-subjects`]||[])||[]),...r(c.map(({dataSubjectTypes:e})=>e??[])??[]),...r(l.map(e=>e[`data-subjects`]||[])||[]),...s.map(e=>e.type)]);if(f.length===0&&!d)return{};let m=await _(u,{logger:e}),h=i(m,`type`),g=n(f,m.map(({type:e})=>e));if(g.length>0){e.info(o.magenta(`Creating ${g.length} new data subjects...`));for(let t of g){e.info(o.magenta(`Creating data subject ${t}...`));let n=await p(u,{input:t,logger:e});e.info(o.green(`Created data subject ${t}!`)),h[t]=n}}return h}function Ce(e,t){if(e.length===0)return[];if(typeof e[0]==`string`)return[{titles:a(e)}];let n,r=[],i=new Set,o=(e,n)=>{if(i.has(e))throw Error(`Data silo "${t}" has multiple deletion-dependencies entries for workflow "${e}". Combine them into a single entry.`);i.add(e),r.push({workflowConfigInternalName:e,...n})};return e.forEach(e=>{if(`reset-to-global`in e&&`titles`in e)throw Error(`Data silo "${t}" has a deletion-dependencies entry for workflow "${e.workflow}" that sets both "reset-to-global" and "titles". Use "titles: []" to override the global configuration with no dependencies, or "reset-to-global: true" to fall back to the global configuration.`);if(`reset-to-global`in e){o(e.workflow,{resetToGlobal:!0});return}if(e.workflow){o(e.workflow,{titles:e.titles});return}if(n!==void 0)throw Error(`Data silo "${t}" has multiple global deletion-dependencies entries. Combine them into a single \`{ titles: [...] }\` entry.`);n=e.titles}),[...n===void 0?[]:[{titles:a(n)}],...r]}async function j(n,r,{pageSize:a,dataSubjectsByName:c,apiKeysByTitle:p}){let m=!1,h=new Date().getTime();e.info(o.magenta(`Syncing "${n.length}" data silos...`));let _=i(await g(r,{titles:n.map(({title:e})=>e),pageSize:a,logger:e}),`title`),v=n.filter(({title:e})=>!_[e]);v.length>0&&(e.info(o.magenta(`Creating "${v.length}" data silos that did not exist...`)),await D(t(v,20),async t=>{let{createDataSilos:{dataSilos:n}}=await b(r,l,{variables:{input:t.map(e=>({name:e[`outer-type`]||e.integrationName,title:e.title,country:e.country,countrySubDivision:e.countrySubDivision,sombraId:e[`sombra-id`]}))},logger:e});n.forEach(e=>{_[e.title]=e})}),e.info(o.green(`Successfully created "${v.length}" data silos!`)));let y=t(n,20);await D(y,async(t,n)=>{e.info(o.magenta(`[Batch ${n+1}/${y.length}] Syncing "${t.length}" data silos`)),await b(r,u,{variables:{input:{dataSilos:t.map(e=>({id:_[e.title].id,country:e.country,countrySubDivision:e.countrySubDivision,url:e.url,headers:e.headers,description:e.description,identifiers:e[`identity-keys`],isLive:!e.disabled,ownerEmails:e.owners,teamNames:e.teams,dependedOnDataSilos:e[`deletion-dependencies`]?void 0:[{titles:[]}],apiKeyId:e[`api-key-title`]?p[e[`api-key-title`]].id:void 0,dataSubjectBlockListIds:e[`data-subjects`]?f(e[`data-subjects`],c):void 0,attributes:e.attributes,businessEntityTitles:e.businessEntityTitles,sombraId:e[`sombra-id`],notifyEmailAddress:e[`email-settings`]?.[`notify-email-address`],promptAVendorEmailSendFrequency:e[`email-settings`]?.[`send-frequency`],promptAVendorEmailSendType:e[`email-settings`]?.[`send-type`],promptAVendorEmailIncludeIdentifiersAttachment:e[`email-settings`]?.[`include-identifiers-attachment`],promptAVendorEmailCompletionLinkType:e[`email-settings`]?.[`completion-link-type`],manualWorkRetryFrequency:e[`email-settings`]?.[`manual-work-retry-frequency`]}))}},logger:e}),e.info(o.green(`[Batch ${n+1}/${y.length}] Synced "${t.length}" data silos!`))});let x=new O.SingleBar({},O.Presets.shades_classic),S=n.filter(({datapoints:e=[]})=>e.length>0),C=n.map(({datapoints:e=[]})=>e.length).reduce((e,t)=>e+t,0);e.info(o.magenta(`Syncing "${C}" datapoints from "${S.length}" data silos...`)),x.start(C,0);let w=0;await E(S,async({datapoints:t,title:n})=>{t&&await D(t,async t=>{let i=t.fields?t.fields.map(({key:e,description:t,categories:n,purposes:r,attributes:i,...a})=>({name:e,description:t,categories:n?n.map(e=>({...e,name:e.name||`Other`})):void 0,purposes:r?r.map(e=>({...e,name:e.name||`Other`})):void 0,attributes:i,accessRequestVisibilityEnabled:a[`access-request-visibility-enabled`],erasureRequestRedactionEnabled:a[`erasure-request-redaction-enabled`]})):void 0,a={dataSiloId:_[n].id,path:t.path,name:t.key,title:t.title,description:t.description,...t.owners?{ownerEmails:t.owners}:{},...t.teams?{teamNames:t.teams}:{},...t[`data-collection-tag`]?{dataCollectionTag:t[`data-collection-tag`]}:{},querySuggestions:t[`privacy-action-queries`]?Object.entries(t[`privacy-action-queries`]).map(([e,t])=>({requestType:e,suggestedQuery:t})):void 0,enabledActions:t[`privacy-actions`]||[],subDataPoints:i},s=(a.subDataPoints||[]).map(({name:e})=>e),c=s.filter((e,t)=>s.indexOf(e)!==t);if(c.length>0)e.info(o.red(`\nCannot update datapoint "${t.key}" as it has duplicate sub-datapoints with the same name: \n${c.join(`
2
2
  `)}`)),m=!0;else try{await b(r,d,{variables:a,logger:e})}catch(r){e.info(o.red(`\nFailed to update datapoint "${t.key}" for data silo "${n}"! - \n${r.message}`)),m=!0}w+=1,x.update(w)})},{concurrency:10}),x.stop();let T=new Date().getTime()-h;return e.info(o.green(`Synced "${n.length}" data silos and "${C}" datapoints in "${T/1e3}" seconds!`)),{success:!m,dataSiloTitleToId:s(_,({id:e})=>e)}}async function M(t,n,{pageSize:r=50,publishToPrivacyCenter:i=!0,classifyService:a=!1,deleteExtraAttributeValues:s=!1,logger:c,warnings:l=[]}){let u=c??e,d=[],f=!1,p=(e,t,n)=>{d.push({resource:e,item:n,message:t}),f=!0};u.info(o.magenta(`Fetching data with page size ${r}...`));let{templates:g,attributes:b,actions:D,identifiers:O,"data-subjects":k,"business-entities":M,enrichers:N,cookies:P,"consent-manager":F,"data-silos":I,"data-flows":L,vendors:R,"data-categories":z,"processing-activities":B,"processing-purposes":V,"action-items":H,"action-item-collections":U,teams:W,"privacy-center":G,messages:K,policies:q,partitions:J,"preference-workflow-configs":we,"workflow-configs":Y}=t,Te=t[`preference-options`],X=t.purposes,Ee=Se(t);if(Ee.length>0){for(let e of Ee)p(`preference-slugs`,e);return{success:!1,errors:d,warnings:l.length>0?l:void 0}}let[Z,Q,De]=await Promise.all([N||O?y(n,{input:t,skipPublish:!i,logger:e}):{},I||k||N||B?A(t,n):{},I&&I.map(e=>e[`api-key-title`]||[]).reduce((e,t)=>e+t.length,0)>0?v(n,{apiKeyInputs:t,logger:e}):{}]);if(we?.length&&(await te(n,we,{logger:u,pageSize:r})||p(`preference-workflow-configs`,`Failed to sync preference workflow configs`)),Y?.length&&(await xe(n,Y,{logger:u})||p(`workflow-configs`,`Failed to sync workflow configs`)),Te?.length&&(await fe(n,Te,{logger:u})||p(`preference-options`,`Failed to sync preference option values`)),X?.length){let{success:e,purposeIdByTrackingType:t}=await _e(n,X,{logger:u});e||p(`purposes`,`Failed to sync one or more purposes`);let r=X.flatMap(e=>(e[`preference-topics`]??[]).map(t=>({...t,"tracking-type":e.trackingType})));r.length>0&&(await pe(n,r,{logger:u,purposeIdByTrackingType:t})||p(`preference-topics`,`Failed to sync one or more preference topics`))}if(F){u.info(o.magenta(`Syncing consent manager...`));try{await ee(n,F,{logger:u}),u.info(o.green(`Successfully synced consent manager!`))}catch(e){p(`consent-manager`,e.message),u.error(o.red(`Failed to sync consent manager! - ${e.message}`))}}if(W){let t=await ve(n,W,{logger:e});f||=!t}if(g&&(e.info(o.magenta(`Syncing "${g.length}" email templates...`)),await E(g,async t=>{e.info(o.magenta(`Syncing template "${t.title}"...`));try{await ye(n,t,{logger:e}),e.info(o.green(`Successfully synced template "${t.title}"!`))}catch(n){f=!0,e.error(o.red(`Failed to sync template "${t.title}"! - ${n.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${g.length}" email templates!`))),M){let t=await T(n,M,{logger:e});f||=!t}if(R){let t=await be(n,R,{logger:e});f||=!t}if(z){let t=await re(n,z,{logger:e});f||=!t}if(V){let t=await ge(n,V,{logger:e});f||=!t}if(J){let t=await ue(n,J,{logger:e});f||=!t}if(P){let t=await ne(n,P,{logger:e});f||=!t}if(U){let t=await S(n,U,{logger:e});f||=!t}if(b){e.info(o.magenta(`Syncing "${b.length}" attributes...`));let t=await h(n,{logger:e});await E(b,async r=>{let i=t.find(e=>e.name===r.name);e.info(o.magenta(`Syncing attribute "${r.name}"...`));try{await w(n,r,{existingAttribute:i,deleteExtraAttributeValues:s,logger:e}),e.info(o.green(`Successfully synced attribute "${r.name}"!`))}catch(t){f=!0,e.error(o.red(`Failed to sync attribute "${r.name}"! - ${t.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${b.length}" attributes!`))}if(H){let t=await C(n,H,{logger:e});f||=!t}if(N&&(e.info(o.magenta(`Syncing "${N.length}" enrichers...`)),await E(N,async t=>{e.info(o.magenta(`Syncing enricher "${t.title}"...`));try{await se(n,{input:t,identifierByName:Z,dataSubjectsByName:Q,logger:e}),e.info(o.green(`Successfully synced enricher "${t.title}"!`))}catch(n){f=!0,e.error(o.red(`Failed to sync enricher "${t.title}"! - ${n.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${N.length}" enrichers!`))),O&&(e.info(o.magenta(`Syncing "${O.length}" identifiers...`)),await E(O,async t=>{let r=Z[t.name];if(!r)throw Error(`Failed to find identifier with name: ${t.type}. Should have been auto-created by cli.`);e.info(o.magenta(`Syncing identifier "${t.type}"...`));try{await ce(n,{input:t,dataSubjectsByName:Q,identifierId:r.id,skipPublish:!i,logger:e}),e.info(o.green(`Successfully synced identifier "${t.type}"!`))}catch(n){f=!0,e.info(o.red(`Failed to sync identifier "${t.type}"! - ${n.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${O.length}" identifiers!`))),D){e.info(o.magenta(`Syncing "${D.length}" actions...`));let t=await m(n,{logger:e});await E(D,async r=>{let a=t.find(e=>e.type===r.type);if(!a)throw Error(`Failed to find action with type: ${r.type}. Should have already existing in the organization.`);e.info(o.magenta(`Syncing action "${r.type}"...`));try{await x(n,{action:r,actionId:a.id,skipPublish:!i},{logger:e}),e.info(o.green(`Successfully synced action "${r.type}"!`))}catch(t){f=!0,e.error(o.red(`Failed to sync action "${r.type}"! - ${t.message}`))}},{concurrency:10}),e.info(o.green(`Synced "${D.length}" actions!`))}if(k){e.info(o.magenta(`Syncing "${k.length}" data subjects...`));let t=await _(n,{logger:e});await E(k,async r=>{let a=t.find(e=>e.type===r.type);if(!a)throw Error(`Failed to find data subject with type: ${r.type}. Should have already existing in the organization.`);e.info(o.magenta(`Syncing data subject "${r.type}"...`));try{await oe(n,{input:r,dataSubjectId:a.id,skipPublish:!i,logger:e}),e.info(o.green(`Successfully synced data subject "${r.type}"!`))}catch(t){f=!0;let n=r.supportsAuthorizedAgent!==void 0&&/authorized.agent/i.test(t.message)?` (enable the Authorized Agents feature for this organization before setting "supportsAuthorizedAgent")`:``;e.info(o.red(`Failed to sync data subject "${r.type}"! - ${t.message}${n}`))}},{concurrency:10}),e.info(o.green(`Synced "${k.length}" data subjects!`))}if(L){let t=await ie(n,L,{classifyService:a,logger:e});f||=!t}if(G)try{await me(n,G,{logger:e,skipPublish:!i})||p(`privacy-center`,`Failed to sync privacy center`)}catch(e){p(`privacy-center`,e.message)}if(K){let t=await le(n,K,{logger:e});f||=!t}if(q){let t=await de(n,q,{logger:e});f||=!t}let $=[];if(I){let{success:e,dataSiloTitleToId:t}=await j(I,n,{dataSubjectsByName:Q,apiKeysByTitle:De,pageSize:r});I?.forEach(e=>{let n=e[`deletion-dependencies`];if(n)try{$.push([t[e.title],Ce(n,e.title)])}catch(t){p(`data-silos`,t.message,e.title),u.error(o.red(t.message))}}),f||=!e}if($.length>0){let t=await ae(n,{input:$,logger:e});f||=!t}if(B){let t=await he(n,B,{logger:e});f||=!t}return{success:!f,errors:d,warnings:l.length>0?l:void 0}}function N(e,...t){let n=JSON.parse(JSON.stringify(e));return t.forEach(e=>{c(e).forEach(([e,t])=>{n[e]===void 0?n[e]=t:Array.isArray(t)?n[e]=[...n[e],...t]:n[e]=t})}),n}export{A as i,M as n,j as r,N as t};
3
- //# sourceMappingURL=mergeTranscendInputs-CkpitZbH.mjs.map
3
+ //# sourceMappingURL=mergeTranscendInputs-CWHXH0kF.mjs.map