@transcend-io/cli 10.0.0 → 10.1.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 (413) hide show
  1. package/README.md +16 -5
  2. package/dist/{RequestDataSilo-_Iv44M9u.mjs → RequestDataSilo-Rrc2dL9g.mjs} +4 -1
  3. package/dist/RequestDataSilo-Rrc2dL9g.mjs.map +1 -0
  4. package/dist/{app-By_zDIkK.mjs → app-Cx8-4u8K.mjs} +21 -21
  5. package/dist/{app-By_zDIkK.mjs.map → app-Cx8-4u8K.mjs.map} +1 -1
  6. package/dist/approvePrivacyRequests-Bjq5cPSI.mjs +2 -0
  7. package/dist/approvePrivacyRequests-Bjq5cPSI.mjs.map +1 -0
  8. package/dist/bin/bash-complete.mjs +1 -1
  9. package/dist/bin/cli.mjs +1 -1
  10. package/dist/bin/deprecated-command.mjs +1 -1
  11. package/dist/buildXdiSyncEndpoint-DWs9ImOw.mjs +9 -0
  12. package/dist/buildXdiSyncEndpoint-DWs9ImOw.mjs.map +1 -0
  13. package/dist/bulkRestartRequests-sie3tM3W.mjs +2 -0
  14. package/dist/bulkRestartRequests-sie3tM3W.mjs.map +1 -0
  15. package/dist/bulkRetryEnrichers-C1RrxiTR.mjs +2 -0
  16. package/dist/bulkRetryEnrichers-C1RrxiTR.mjs.map +1 -0
  17. package/dist/cancelPrivacyRequests-DmvFijq_.mjs +2 -0
  18. package/dist/cancelPrivacyRequests-DmvFijq_.mjs.map +1 -0
  19. package/dist/{codecs-BE3Wmoh8.mjs → codecs-CeDPaLYa.mjs} +1 -1
  20. package/dist/{codecs-BE3Wmoh8.mjs.map → codecs-CeDPaLYa.mjs.map} +1 -1
  21. package/dist/collectCsvFilesOrExit-D-csvd13.mjs +2 -0
  22. package/dist/collectCsvFilesOrExit-D-csvd13.mjs.map +1 -0
  23. package/dist/collectParquetFilesOrExit-C8qT5_57.mjs +2 -0
  24. package/dist/collectParquetFilesOrExit-C8qT5_57.mjs.map +1 -0
  25. package/dist/{command-BUnCUxva.mjs → command-rzZKmlky.mjs} +2 -2
  26. package/dist/{command-BUnCUxva.mjs.map → command-rzZKmlky.mjs.map} +1 -1
  27. package/dist/commands/admin/chunk-csv/worker.d.mts +48 -0
  28. package/dist/commands/admin/chunk-csv/worker.d.mts.map +1 -0
  29. package/dist/commands/admin/chunk-csv/worker.mjs +2 -0
  30. package/dist/commands/admin/chunk-csv/worker.mjs.map +1 -0
  31. package/dist/commands/admin/parquet-to-csv/worker.d.mts +25 -0
  32. package/dist/commands/admin/parquet-to-csv/worker.d.mts.map +1 -0
  33. package/dist/commands/admin/parquet-to-csv/worker.mjs +2 -0
  34. package/dist/commands/admin/parquet-to-csv/worker.mjs.map +1 -0
  35. package/dist/{consentManagersToBusinessEntities-BDgOFga7.mjs → consentManagersToBusinessEntities-D1bdBgnA.mjs} +2 -2
  36. package/dist/{consentManagersToBusinessEntities-BDgOFga7.mjs.map → consentManagersToBusinessEntities-D1bdBgnA.mjs.map} +1 -1
  37. package/dist/{constants-lIvXgkdp.mjs → constants-DYbzl8QH.mjs} +1 -1
  38. package/dist/{constants-lIvXgkdp.mjs.map → constants-DYbzl8QH.mjs.map} +1 -1
  39. package/dist/constants-XOsAW1__.mjs +2 -0
  40. package/dist/constants-XOsAW1__.mjs.map +1 -0
  41. package/dist/{constants-AFtS5Nad.mjs → constants-mjLYTIJm.mjs} +2 -2
  42. package/dist/{constants-AFtS5Nad.mjs.map → constants-mjLYTIJm.mjs.map} +1 -1
  43. package/dist/{context-CdSyuBlf.mjs → context-bkKpii_t.mjs} +1 -1
  44. package/dist/{context-CdSyuBlf.mjs.map → context-bkKpii_t.mjs.map} +1 -1
  45. package/dist/createExtraKeyHandler-Jp5XpTJi.mjs +14 -0
  46. package/dist/createExtraKeyHandler-Jp5XpTJi.mjs.map +1 -0
  47. package/dist/{dataFlowsToDataSilos-NhvBw1iy.mjs → dataFlowsToDataSilos-DUj1NhOt.mjs} +1 -1
  48. package/dist/dataFlowsToDataSilos-DUj1NhOt.mjs.map +1 -0
  49. package/dist/{dataSilo-DrFetFXw.mjs → dataSilo-Dvi8-PkH.mjs} +1 -1
  50. package/dist/{dataSilo-DrFetFXw.mjs.map → dataSilo-Dvi8-PkH.mjs.map} +1 -1
  51. package/dist/{dataSubject-y_aXI0pa.mjs → dataSubject-CF784Ug0.mjs} +1 -1
  52. package/dist/{dataSubject-y_aXI0pa.mjs.map → dataSubject-CF784Ug0.mjs.map} +1 -1
  53. package/dist/{done-input-validation-DLR0-MJ7.mjs → done-input-validation-C5rgR0Wr.mjs} +1 -1
  54. package/dist/{done-input-validation-DLR0-MJ7.mjs.map → done-input-validation-C5rgR0Wr.mjs.map} +1 -1
  55. package/dist/downloadPrivacyRequestFiles-GUbd_PRc.mjs +2 -0
  56. package/dist/downloadPrivacyRequestFiles-GUbd_PRc.mjs.map +1 -0
  57. package/dist/{extractClientError-DPjv09EH.mjs → extractClientError-X9wJVqGq.mjs} +1 -1
  58. package/dist/{extractClientError-DPjv09EH.mjs.map → extractClientError-X9wJVqGq.mjs.map} +1 -1
  59. package/dist/{fetchAllRequestEnrichers-q34mRuE5.mjs → fetchAllRequestEnrichers-Bt97Bb7F.mjs} +5 -5
  60. package/dist/fetchAllRequestEnrichers-Bt97Bb7F.mjs.map +1 -0
  61. package/dist/fetchAllRequestIdentifiers-BXx3rSee.mjs +10 -0
  62. package/dist/fetchAllRequestIdentifiers-BXx3rSee.mjs.map +1 -0
  63. package/dist/fetchAllRequests-xGgt_STo.mjs +2 -0
  64. package/dist/fetchAllRequests-xGgt_STo.mjs.map +1 -0
  65. package/dist/fetchRequestDataSilo-0UvyeL60.mjs +2 -0
  66. package/dist/fetchRequestDataSilo-0UvyeL60.mjs.map +1 -0
  67. package/dist/{fetchRequestFilesForRequest-DrHGOdih.mjs → fetchRequestFilesForRequest-CJH2iB-P.mjs} +4 -4
  68. package/dist/fetchRequestFilesForRequest-CJH2iB-P.mjs.map +1 -0
  69. package/dist/generateCrossAccountApiKeys-DztJoLQS.mjs +2 -0
  70. package/dist/generateCrossAccountApiKeys-DztJoLQS.mjs.map +1 -0
  71. package/dist/impl-B-PzeHxN.mjs +2 -0
  72. package/dist/impl-B-PzeHxN.mjs.map +1 -0
  73. package/dist/impl-B6TXE2oE.mjs +4 -0
  74. package/dist/impl-B6TXE2oE.mjs.map +1 -0
  75. package/dist/impl-BBKJIP0Q.mjs +2 -0
  76. package/dist/impl-BBKJIP0Q.mjs.map +1 -0
  77. package/dist/impl-BBnnC5xq.mjs +2 -0
  78. package/dist/impl-BBnnC5xq.mjs.map +1 -0
  79. package/dist/impl-BGGm947r2.mjs +2 -0
  80. package/dist/impl-BGGm947r2.mjs.map +1 -0
  81. package/dist/{impl-G1brwI4o.mjs → impl-BKrNGF2F.mjs} +2 -2
  82. package/dist/{impl-G1brwI4o.mjs.map → impl-BKrNGF2F.mjs.map} +1 -1
  83. package/dist/{impl-DgyjJ8RY2.mjs → impl-BMnXA_Vd.mjs} +2 -2
  84. package/dist/impl-BMnXA_Vd.mjs.map +1 -0
  85. package/dist/{impl-Zr8uLP_n.mjs → impl-BRiRfzgu.mjs} +2 -2
  86. package/dist/{impl-Zr8uLP_n.mjs.map → impl-BRiRfzgu.mjs.map} +1 -1
  87. package/dist/{impl-CyJBbyuF.mjs → impl-BSKl6rC6.mjs} +2 -2
  88. package/dist/{impl-CyJBbyuF.mjs.map → impl-BSKl6rC6.mjs.map} +1 -1
  89. package/dist/impl-BVHfSIVG.mjs +2 -0
  90. package/dist/{impl-ArGeiHuz.mjs.map → impl-BVHfSIVG.mjs.map} +1 -1
  91. package/dist/impl-BVnfUDUm.mjs +2 -0
  92. package/dist/impl-BVnfUDUm.mjs.map +1 -0
  93. package/dist/impl-BfeWet_F2.mjs +2 -0
  94. package/dist/impl-BfeWet_F2.mjs.map +1 -0
  95. package/dist/{impl--Lmj1RHh2.mjs → impl-BffzTHKU.mjs} +2 -2
  96. package/dist/impl-BffzTHKU.mjs.map +1 -0
  97. package/dist/impl-BxOydpyJ.mjs +2 -0
  98. package/dist/impl-BxOydpyJ.mjs.map +1 -0
  99. package/dist/{impl-r8tHyAHB.mjs → impl-C-u5h8We.mjs} +2 -2
  100. package/dist/{impl-r8tHyAHB.mjs.map → impl-C-u5h8We.mjs.map} +1 -1
  101. package/dist/{impl-Cq_RqK0_2.mjs → impl-C3DXXn8M.mjs} +2 -2
  102. package/dist/impl-C3DXXn8M.mjs.map +1 -0
  103. package/dist/{impl-KV3yZaHz2.mjs → impl-CC0rkA9s.mjs} +2 -2
  104. package/dist/impl-CC0rkA9s.mjs.map +1 -0
  105. package/dist/impl-CODwodEc.mjs +7 -0
  106. package/dist/impl-CODwodEc.mjs.map +1 -0
  107. package/dist/impl-CPIMsZg-.mjs +2 -0
  108. package/dist/{impl-BkyC7nnu.mjs.map → impl-CPIMsZg-.mjs.map} +1 -1
  109. package/dist/{impl-D-ldjJzl2.mjs → impl-CZsYoSZQ.mjs} +2 -2
  110. package/dist/impl-CZsYoSZQ.mjs.map +1 -0
  111. package/dist/impl-CnHiD4zU.mjs +2 -0
  112. package/dist/impl-CnHiD4zU.mjs.map +1 -0
  113. package/dist/impl-CpJljZV2.mjs +2 -0
  114. package/dist/impl-CpJljZV2.mjs.map +1 -0
  115. package/dist/impl-Cpndlxar.mjs +4 -0
  116. package/dist/impl-Cpndlxar.mjs.map +1 -0
  117. package/dist/{impl-1U4QBT_L.mjs → impl-CqH3YYuv.mjs} +2 -2
  118. package/dist/impl-CqH3YYuv.mjs.map +1 -0
  119. package/dist/{impl-C05tQHSq.mjs → impl-CvJtt8H2.mjs} +2 -2
  120. package/dist/{impl-C05tQHSq.mjs.map → impl-CvJtt8H2.mjs.map} +1 -1
  121. package/dist/impl-Cw10WeUv.mjs +2 -0
  122. package/dist/impl-Cw10WeUv.mjs.map +1 -0
  123. package/dist/{impl-CMX0qQr_2.mjs → impl-Cy8-6_Oo2.mjs} +2 -2
  124. package/dist/{impl-CMX0qQr_2.mjs.map → impl-Cy8-6_Oo2.mjs.map} +1 -1
  125. package/dist/{impl-DZnSlfwn2.mjs → impl-DJ4VCAcc.mjs} +2 -2
  126. package/dist/impl-DJ4VCAcc.mjs.map +1 -0
  127. package/dist/impl-DKAV-8XC.mjs +3 -0
  128. package/dist/impl-DKAV-8XC.mjs.map +1 -0
  129. package/dist/{impl-y1I9Muyc2.mjs → impl-D_AxguFh2.mjs} +2 -2
  130. package/dist/{impl-y1I9Muyc2.mjs.map → impl-D_AxguFh2.mjs.map} +1 -1
  131. package/dist/{impl-D-cp0CYr.mjs → impl-DaK9UOwL.mjs} +2 -2
  132. package/dist/{impl-D-cp0CYr.mjs.map → impl-DaK9UOwL.mjs.map} +1 -1
  133. package/dist/{impl-Cgg_bv7j.mjs → impl-DfVep2mE.mjs} +2 -2
  134. package/dist/{impl-Cgg_bv7j.mjs.map → impl-DfVep2mE.mjs.map} +1 -1
  135. package/dist/impl-DhXQb3bm.mjs +2 -0
  136. package/dist/impl-DhXQb3bm.mjs.map +1 -0
  137. package/dist/impl-DpGVNllB.mjs +2 -0
  138. package/dist/impl-DpGVNllB.mjs.map +1 -0
  139. package/dist/impl-DpwyYsfg.mjs +2 -0
  140. package/dist/impl-DpwyYsfg.mjs.map +1 -0
  141. package/dist/impl-DvrSuAJv.mjs +12 -0
  142. package/dist/impl-DvrSuAJv.mjs.map +1 -0
  143. package/dist/{impl-CeLfAnyA2.mjs → impl-Dw9uW5zy2.mjs} +2 -2
  144. package/dist/{impl-CeLfAnyA2.mjs.map → impl-Dw9uW5zy2.mjs.map} +1 -1
  145. package/dist/impl-PdIU1pLr2.mjs +2 -0
  146. package/dist/impl-PdIU1pLr2.mjs.map +1 -0
  147. package/dist/{impl-BpUksm1b2.mjs → impl-StdJMCiM.mjs} +2 -2
  148. package/dist/impl-StdJMCiM.mjs.map +1 -0
  149. package/dist/impl-daUiLV3c.mjs +2 -0
  150. package/dist/impl-daUiLV3c.mjs.map +1 -0
  151. package/dist/{impl-Rt3C_fDF.mjs → impl-iGMjSniP.mjs} +2 -2
  152. package/dist/{impl-Rt3C_fDF.mjs.map → impl-iGMjSniP.mjs.map} +1 -1
  153. package/dist/impl-ogUHfunr.mjs +2 -0
  154. package/dist/impl-ogUHfunr.mjs.map +1 -0
  155. package/dist/impl-uwkj-RbF.mjs +2 -0
  156. package/dist/impl-uwkj-RbF.mjs.map +1 -0
  157. package/dist/{impl-D6nwGrO8.mjs → impl-yvc0y1uO.mjs} +2 -2
  158. package/dist/{impl-D6nwGrO8.mjs.map → impl-yvc0y1uO.mjs.map} +1 -1
  159. package/dist/index.d.mts +4143 -7330
  160. package/dist/index.d.mts.map +1 -1
  161. package/dist/index.mjs +4 -78
  162. package/dist/index.mjs.map +1 -1
  163. package/dist/{inquirer-BgNcicZ4.mjs → inquirer-DyRwhvoh.mjs} +2 -2
  164. package/dist/{inquirer-BgNcicZ4.mjs.map → inquirer-DyRwhvoh.mjs.map} +1 -1
  165. package/dist/{listFiles-qzyQMaYH.mjs → listFiles-Odj7j2E1.mjs} +1 -1
  166. package/dist/{listFiles-qzyQMaYH.mjs.map → listFiles-Odj7j2E1.mjs.map} +1 -1
  167. package/dist/{logger-B-LXIf3U.mjs → logger-Bj782ZYD.mjs} +1 -1
  168. package/dist/{logger-B-LXIf3U.mjs.map → logger-Bj782ZYD.mjs.map} +1 -1
  169. package/dist/markRequestDataSiloIdsCompleted-DJSICILv.mjs +2 -0
  170. package/dist/markRequestDataSiloIdsCompleted-DJSICILv.mjs.map +1 -0
  171. package/dist/markSilentPrivacyRequests-ytCzpUkY.mjs +2 -0
  172. package/dist/markSilentPrivacyRequests-ytCzpUkY.mjs.map +1 -0
  173. package/dist/notifyPrivacyRequestsAdditionalTime-D8v68eAg.mjs +2 -0
  174. package/dist/notifyPrivacyRequestsAdditionalTime-D8v68eAg.mjs.map +1 -0
  175. package/dist/parquetToCsvOneFile-bgEgRoAi.mjs +6 -0
  176. package/dist/parquetToCsvOneFile-bgEgRoAi.mjs.map +1 -0
  177. package/dist/parseAttributesFromString-B8h4DudO.mjs +2 -0
  178. package/dist/{parseAttributesFromString-CZStzJc0.mjs.map → parseAttributesFromString-B8h4DudO.mjs.map} +1 -1
  179. package/dist/parseVariablesFromString-CvoeZZ75.mjs +23 -0
  180. package/dist/parseVariablesFromString-CvoeZZ75.mjs.map +1 -0
  181. package/dist/pullAllDatapoints-CqgqXRbp.mjs +45 -0
  182. package/dist/pullAllDatapoints-CqgqXRbp.mjs.map +1 -0
  183. package/dist/pullChunkedCustomSiloOutstandingIdentifiers-DaYEDZ66.mjs +2 -0
  184. package/dist/pullChunkedCustomSiloOutstandingIdentifiers-DaYEDZ66.mjs.map +1 -0
  185. package/dist/pullConsentManagerMetrics-BO0hYPDG.mjs +2 -0
  186. package/dist/pullConsentManagerMetrics-BO0hYPDG.mjs.map +1 -0
  187. package/dist/pullManualEnrichmentIdentifiersToCsv-BNuhsG20.mjs +2 -0
  188. package/dist/pullManualEnrichmentIdentifiersToCsv-BNuhsG20.mjs.map +1 -0
  189. package/dist/pullTranscendConfiguration-DSyMRyPe.mjs +58 -0
  190. package/dist/pullTranscendConfiguration-DSyMRyPe.mjs.map +1 -0
  191. package/dist/{pullUnstructuredSubDataPointRecommendations-C4aVhH-W.mjs → pullUnstructuredSubDataPointRecommendations-jE-tdoVK.mjs} +4 -4
  192. package/dist/pullUnstructuredSubDataPointRecommendations-jE-tdoVK.mjs.map +1 -0
  193. package/dist/pushCronIdentifiersFromCsv-D9Hzna0W.mjs +2 -0
  194. package/dist/pushCronIdentifiersFromCsv-D9Hzna0W.mjs.map +1 -0
  195. package/dist/pushManualEnrichmentIdentifiersFromCsv-BiR7PS_d.mjs +2 -0
  196. package/dist/pushManualEnrichmentIdentifiersFromCsv-BiR7PS_d.mjs.map +1 -0
  197. package/dist/{readCsv-CyOL7eCc.mjs → readCsv-0PIlJQCN.mjs} +1 -1
  198. package/dist/{readCsv-CyOL7eCc.mjs.map → readCsv-0PIlJQCN.mjs.map} +1 -1
  199. package/dist/{readTranscendYaml-D-J1ilS0.mjs → readTranscendYaml-DVkQL2SC.mjs} +2 -2
  200. package/dist/{readTranscendYaml-D-J1ilS0.mjs.map → readTranscendYaml-DVkQL2SC.mjs.map} +1 -1
  201. package/dist/removeUnverifiedRequestIdentifiers-B0Gx09XN.mjs +35 -0
  202. package/dist/removeUnverifiedRequestIdentifiers-B0Gx09XN.mjs.map +1 -0
  203. package/dist/{request-CAsR6CMY.mjs → request-SLqRySNU.mjs} +1 -1
  204. package/dist/{request-CAsR6CMY.mjs.map → request-SLqRySNU.mjs.map} +1 -1
  205. package/dist/retryRequestDataSilos-DFjFhhC0.mjs +2 -0
  206. package/dist/retryRequestDataSilos-DFjFhhC0.mjs.map +1 -0
  207. package/dist/skipPreflightJobs-Bm8lZZk-.mjs +2 -0
  208. package/dist/skipPreflightJobs-Bm8lZZk-.mjs.map +1 -0
  209. package/dist/skipRequestDataSilos-B5FByYTj.mjs +2 -0
  210. package/dist/skipRequestDataSilos-B5FByYTj.mjs.map +1 -0
  211. package/dist/streamPrivacyRequestsToCsv-CBzh80oQ.mjs +2 -0
  212. package/dist/streamPrivacyRequestsToCsv-CBzh80oQ.mjs.map +1 -0
  213. package/dist/syncCodePackages-BOS5foh6.mjs +2 -0
  214. package/dist/syncCodePackages-BOS5foh6.mjs.map +1 -0
  215. package/dist/syncEnrichers-C9HcWCrs.mjs +3 -0
  216. package/dist/syncEnrichers-C9HcWCrs.mjs.map +1 -0
  217. package/dist/updateConsentManagerVersionToLatest-X1HAM_IX.mjs +2 -0
  218. package/dist/updateConsentManagerVersionToLatest-X1HAM_IX.mjs.map +1 -0
  219. package/dist/uploadConsents-BP5XILuw.mjs +2 -0
  220. package/dist/uploadConsents-BP5XILuw.mjs.map +1 -0
  221. package/dist/uploadCookiesFromCsv-B42cZgYW.mjs +2 -0
  222. package/dist/uploadCookiesFromCsv-B42cZgYW.mjs.map +1 -0
  223. package/dist/uploadDataFlowsFromCsv-D2V567pP.mjs +2 -0
  224. package/dist/uploadDataFlowsFromCsv-D2V567pP.mjs.map +1 -0
  225. package/dist/uploadPrivacyRequestsFromCsv-Czc3vGfJ.mjs +2 -0
  226. package/dist/uploadPrivacyRequestsFromCsv-Czc3vGfJ.mjs.map +1 -0
  227. package/dist/{validateTranscendAuth-1W1IylqE.mjs → validateTranscendAuth-DCwAtgvh.mjs} +2 -2
  228. package/dist/{validateTranscendAuth-1W1IylqE.mjs.map → validateTranscendAuth-DCwAtgvh.mjs.map} +1 -1
  229. package/dist/{writeCsv-B51ulrVl.mjs → writeCsv-Da8NUe1V.mjs} +1 -1
  230. package/dist/{writeCsv-B51ulrVl.mjs.map → writeCsv-Da8NUe1V.mjs.map} +1 -1
  231. package/package.json +15 -12
  232. package/dist/RateCounter-DFL_mnk2.mjs +0 -2
  233. package/dist/RateCounter-DFL_mnk2.mjs.map +0 -1
  234. package/dist/RequestDataSilo-_Iv44M9u.mjs.map +0 -1
  235. package/dist/approvePrivacyRequests-1cguqGqq.mjs +0 -2
  236. package/dist/approvePrivacyRequests-1cguqGqq.mjs.map +0 -1
  237. package/dist/assessment-BDywVaGR.mjs +0 -284
  238. package/dist/assessment-BDywVaGR.mjs.map +0 -1
  239. package/dist/bluebird-CUitXgsY.mjs +0 -2
  240. package/dist/bluebird-CUitXgsY.mjs.map +0 -1
  241. package/dist/buildXdiSyncEndpoint-BMaMHO7Z.mjs +0 -9
  242. package/dist/buildXdiSyncEndpoint-BMaMHO7Z.mjs.map +0 -1
  243. package/dist/bulkRestartRequests-DEPSHov-.mjs +0 -2
  244. package/dist/bulkRestartRequests-DEPSHov-.mjs.map +0 -1
  245. package/dist/bulkRetryEnrichers-BLkcFKXC.mjs +0 -2
  246. package/dist/bulkRetryEnrichers-BLkcFKXC.mjs.map +0 -1
  247. package/dist/cancelPrivacyRequests-C8MZQvsq.mjs +0 -2
  248. package/dist/cancelPrivacyRequests-C8MZQvsq.mjs.map +0 -1
  249. package/dist/codecs-Dx_vGxsl.mjs +0 -2
  250. package/dist/codecs-Dx_vGxsl.mjs.map +0 -1
  251. package/dist/constants-CeMiHaHx.mjs +0 -2
  252. package/dist/constants-CeMiHaHx.mjs.map +0 -1
  253. package/dist/createExtraKeyHandler-C_0EVj10.mjs +0 -23
  254. package/dist/createExtraKeyHandler-C_0EVj10.mjs.map +0 -1
  255. package/dist/createPreferenceAccessTokens-6WLr6z-l.mjs +0 -10
  256. package/dist/createPreferenceAccessTokens-6WLr6z-l.mjs.map +0 -1
  257. package/dist/createSombraGotInstance-CahOgD6V.mjs +0 -10
  258. package/dist/createSombraGotInstance-CahOgD6V.mjs.map +0 -1
  259. package/dist/dataFlowsToDataSilos-NhvBw1iy.mjs.map +0 -1
  260. package/dist/downloadPrivacyRequestFiles-B2yduagB.mjs +0 -2
  261. package/dist/downloadPrivacyRequestFiles-B2yduagB.mjs.map +0 -1
  262. package/dist/extractErrorMessage-CPnTsT1S.mjs +0 -2
  263. package/dist/extractErrorMessage-CPnTsT1S.mjs.map +0 -1
  264. package/dist/fetchAllActions-C0l3wjQV.mjs +0 -832
  265. package/dist/fetchAllActions-C0l3wjQV.mjs.map +0 -1
  266. package/dist/fetchAllDataFlows-AQ9j_NRa.mjs +0 -2
  267. package/dist/fetchAllDataFlows-AQ9j_NRa.mjs.map +0 -1
  268. package/dist/fetchAllPreferenceTopics-Bn9PG-rO.mjs +0 -36
  269. package/dist/fetchAllPreferenceTopics-Bn9PG-rO.mjs.map +0 -1
  270. package/dist/fetchAllPurposes-CykSkZRY.mjs +0 -29
  271. package/dist/fetchAllPurposes-CykSkZRY.mjs.map +0 -1
  272. package/dist/fetchAllPurposesAndPreferences-Dog6N9L2.mjs +0 -2
  273. package/dist/fetchAllPurposesAndPreferences-Dog6N9L2.mjs.map +0 -1
  274. package/dist/fetchAllRequestEnrichers-q34mRuE5.mjs.map +0 -1
  275. package/dist/fetchAllRequestIdentifiers-YP-geTV4.mjs +0 -10
  276. package/dist/fetchAllRequestIdentifiers-YP-geTV4.mjs.map +0 -1
  277. package/dist/fetchAllRequests-DEPTEUbi.mjs +0 -2
  278. package/dist/fetchAllRequests-DEPTEUbi.mjs.map +0 -1
  279. package/dist/fetchApiKeys-DkBco7W0.mjs +0 -33
  280. package/dist/fetchApiKeys-DkBco7W0.mjs.map +0 -1
  281. package/dist/fetchCatalogs-CBk871k6.mjs +0 -12
  282. package/dist/fetchCatalogs-CBk871k6.mjs.map +0 -1
  283. package/dist/fetchConsentManagerId-DHDA5Py9.mjs +0 -321
  284. package/dist/fetchConsentManagerId-DHDA5Py9.mjs.map +0 -1
  285. package/dist/fetchIdentifiers-DjqjUnaw.mjs +0 -54
  286. package/dist/fetchIdentifiers-DjqjUnaw.mjs.map +0 -1
  287. package/dist/fetchRequestDataSilo-CF6XOTQ-.mjs +0 -2
  288. package/dist/fetchRequestDataSilo-CF6XOTQ-.mjs.map +0 -1
  289. package/dist/fetchRequestFilesForRequest-DrHGOdih.mjs.map +0 -1
  290. package/dist/generateCrossAccountApiKeys-F11uqpc5.mjs +0 -33
  291. package/dist/generateCrossAccountApiKeys-F11uqpc5.mjs.map +0 -1
  292. package/dist/impl--Lmj1RHh2.mjs.map +0 -1
  293. package/dist/impl-0ooudQ_J2.mjs +0 -4
  294. package/dist/impl-0ooudQ_J2.mjs.map +0 -1
  295. package/dist/impl-1U4QBT_L.mjs.map +0 -1
  296. package/dist/impl-2FbPcOv_2.mjs +0 -2
  297. package/dist/impl-2FbPcOv_2.mjs.map +0 -1
  298. package/dist/impl-ArGeiHuz.mjs +0 -2
  299. package/dist/impl-B8iVBYdg.mjs +0 -2
  300. package/dist/impl-B8iVBYdg.mjs.map +0 -1
  301. package/dist/impl-BWjBYTQZ.mjs +0 -2
  302. package/dist/impl-BWjBYTQZ.mjs.map +0 -1
  303. package/dist/impl-Bc8Es_bT.mjs +0 -7
  304. package/dist/impl-Bc8Es_bT.mjs.map +0 -1
  305. package/dist/impl-BkyC7nnu.mjs +0 -2
  306. package/dist/impl-BpUksm1b2.mjs.map +0 -1
  307. package/dist/impl-BzupMfJi.mjs +0 -12
  308. package/dist/impl-BzupMfJi.mjs.map +0 -1
  309. package/dist/impl-CWHnw3oX.mjs +0 -2
  310. package/dist/impl-CWHnw3oX.mjs.map +0 -1
  311. package/dist/impl-CXK-D84c.mjs +0 -4
  312. package/dist/impl-CXK-D84c.mjs.map +0 -1
  313. package/dist/impl-CdoTu8TH.mjs +0 -2
  314. package/dist/impl-CdoTu8TH.mjs.map +0 -1
  315. package/dist/impl-CoLIqiH-2.mjs +0 -2
  316. package/dist/impl-CoLIqiH-2.mjs.map +0 -1
  317. package/dist/impl-Cq_RqK0_2.mjs.map +0 -1
  318. package/dist/impl-Cwj9LeEI.mjs +0 -3
  319. package/dist/impl-Cwj9LeEI.mjs.map +0 -1
  320. package/dist/impl-D-ldjJzl2.mjs.map +0 -1
  321. package/dist/impl-DGRuk3AB.mjs +0 -2
  322. package/dist/impl-DGRuk3AB.mjs.map +0 -1
  323. package/dist/impl-DXWN22xV.mjs +0 -2
  324. package/dist/impl-DXWN22xV.mjs.map +0 -1
  325. package/dist/impl-DZnSlfwn2.mjs.map +0 -1
  326. package/dist/impl-DcC8_dCy.mjs +0 -2
  327. package/dist/impl-DcC8_dCy.mjs.map +0 -1
  328. package/dist/impl-Dfc_yQML2.mjs +0 -2
  329. package/dist/impl-Dfc_yQML2.mjs.map +0 -1
  330. package/dist/impl-DgyjJ8RY2.mjs.map +0 -1
  331. package/dist/impl-DhIyASha.mjs +0 -2
  332. package/dist/impl-DhIyASha.mjs.map +0 -1
  333. package/dist/impl-Dny1LX9A.mjs +0 -2
  334. package/dist/impl-Dny1LX9A.mjs.map +0 -1
  335. package/dist/impl-KV3yZaHz2.mjs.map +0 -1
  336. package/dist/impl-VHp2K2bg.mjs +0 -2
  337. package/dist/impl-VHp2K2bg.mjs.map +0 -1
  338. package/dist/impl-dEQtD5uE.mjs +0 -2
  339. package/dist/impl-dEQtD5uE.mjs.map +0 -1
  340. package/dist/impl-dlRlTYAQ.mjs +0 -2
  341. package/dist/impl-dlRlTYAQ.mjs.map +0 -1
  342. package/dist/impl-f4UPMoS_2.mjs +0 -2
  343. package/dist/impl-f4UPMoS_2.mjs.map +0 -1
  344. package/dist/impl-ph0q6K3i.mjs +0 -2
  345. package/dist/impl-ph0q6K3i.mjs.map +0 -1
  346. package/dist/makeGraphQLRequest-G078PsEL.mjs +0 -2
  347. package/dist/makeGraphQLRequest-G078PsEL.mjs.map +0 -1
  348. package/dist/markRequestDataSiloIdsCompleted-DmAz-R0M.mjs +0 -2
  349. package/dist/markRequestDataSiloIdsCompleted-DmAz-R0M.mjs.map +0 -1
  350. package/dist/markSilentPrivacyRequests-s7_aBROE.mjs +0 -2
  351. package/dist/markSilentPrivacyRequests-s7_aBROE.mjs.map +0 -1
  352. package/dist/mergeTranscendInputs-C64BJsse.mjs +0 -2
  353. package/dist/mergeTranscendInputs-C64BJsse.mjs.map +0 -1
  354. package/dist/notifyPrivacyRequestsAdditionalTime-BvXIXZYu.mjs +0 -2
  355. package/dist/notifyPrivacyRequestsAdditionalTime-BvXIXZYu.mjs.map +0 -1
  356. package/dist/package-BjNQxHlz.mjs +0 -2
  357. package/dist/package-BjNQxHlz.mjs.map +0 -1
  358. package/dist/parquetToCsvOneFile-DZVKXrjn.mjs +0 -6
  359. package/dist/parquetToCsvOneFile-DZVKXrjn.mjs.map +0 -1
  360. package/dist/parseAttributesFromString-CZStzJc0.mjs +0 -2
  361. package/dist/pullAllDatapoints-DiMWp8a7.mjs +0 -45
  362. package/dist/pullAllDatapoints-DiMWp8a7.mjs.map +0 -1
  363. package/dist/pullChunkedCustomSiloOutstandingIdentifiers-DgWgggQt.mjs +0 -2
  364. package/dist/pullChunkedCustomSiloOutstandingIdentifiers-DgWgggQt.mjs.map +0 -1
  365. package/dist/pullConsentManagerMetrics-pFRPXTHJ.mjs +0 -2
  366. package/dist/pullConsentManagerMetrics-pFRPXTHJ.mjs.map +0 -1
  367. package/dist/pullManualEnrichmentIdentifiersToCsv-DA_4rIzW.mjs +0 -2
  368. package/dist/pullManualEnrichmentIdentifiersToCsv-DA_4rIzW.mjs.map +0 -1
  369. package/dist/pullTranscendConfiguration-D2cYlu6V.mjs +0 -80
  370. package/dist/pullTranscendConfiguration-D2cYlu6V.mjs.map +0 -1
  371. package/dist/pullUnstructuredSubDataPointRecommendations-C4aVhH-W.mjs.map +0 -1
  372. package/dist/pushCronIdentifiersFromCsv-C34TB9tG.mjs +0 -2
  373. package/dist/pushCronIdentifiersFromCsv-C34TB9tG.mjs.map +0 -1
  374. package/dist/pushManualEnrichmentIdentifiersFromCsv-CGS9E3Ft.mjs +0 -2
  375. package/dist/pushManualEnrichmentIdentifiersFromCsv-CGS9E3Ft.mjs.map +0 -1
  376. package/dist/removeUnverifiedRequestIdentifiers-pGGOFbfE.mjs +0 -35
  377. package/dist/removeUnverifiedRequestIdentifiers-pGGOFbfE.mjs.map +0 -1
  378. package/dist/retryRequestDataSilos-DXwN5uPw.mjs +0 -2
  379. package/dist/retryRequestDataSilos-DXwN5uPw.mjs.map +0 -1
  380. package/dist/skipPreflightJobs-BNQhuPZ8.mjs +0 -2
  381. package/dist/skipPreflightJobs-BNQhuPZ8.mjs.map +0 -1
  382. package/dist/skipRequestDataSilos-C39ji4lO.mjs +0 -2
  383. package/dist/skipRequestDataSilos-C39ji4lO.mjs.map +0 -1
  384. package/dist/splitCsvToList-BRq_CIfd.mjs +0 -2
  385. package/dist/splitCsvToList-BRq_CIfd.mjs.map +0 -1
  386. package/dist/streamPrivacyRequestsToCsv-C8lquiyd.mjs +0 -2
  387. package/dist/streamPrivacyRequestsToCsv-C8lquiyd.mjs.map +0 -1
  388. package/dist/syncCodePackages-BHgjfXCI.mjs +0 -232
  389. package/dist/syncCodePackages-BHgjfXCI.mjs.map +0 -1
  390. package/dist/syncCookies-CiLtxDFf.mjs +0 -2
  391. package/dist/syncCookies-CiLtxDFf.mjs.map +0 -1
  392. package/dist/syncDataFlows-DmBUs3G_.mjs +0 -2
  393. package/dist/syncDataFlows-DmBUs3G_.mjs.map +0 -1
  394. package/dist/syncTemplates-BNu1_dmW.mjs +0 -23
  395. package/dist/syncTemplates-BNu1_dmW.mjs.map +0 -1
  396. package/dist/time-Bl_c3W8U.mjs +0 -2
  397. package/dist/time-Bl_c3W8U.mjs.map +0 -1
  398. package/dist/types-B4CVJCpj.mjs +0 -2
  399. package/dist/types-B4CVJCpj.mjs.map +0 -1
  400. package/dist/updateConsentManagerVersionToLatest-BBMN94Hs.mjs +0 -2
  401. package/dist/updateConsentManagerVersionToLatest-BBMN94Hs.mjs.map +0 -1
  402. package/dist/uploadConsents-BbR7_sSt.mjs +0 -2
  403. package/dist/uploadConsents-BbR7_sSt.mjs.map +0 -1
  404. package/dist/uploadCookiesFromCsv-BKZx_E_2.mjs +0 -2
  405. package/dist/uploadCookiesFromCsv-BKZx_E_2.mjs.map +0 -1
  406. package/dist/uploadDataFlowsFromCsv-CJFVLvCJ.mjs +0 -2
  407. package/dist/uploadDataFlowsFromCsv-CJFVLvCJ.mjs.map +0 -1
  408. package/dist/uploadPrivacyRequestsFromCsv-BmP1JluQ.mjs +0 -17
  409. package/dist/uploadPrivacyRequestsFromCsv-BmP1JluQ.mjs.map +0 -1
  410. package/dist/uploadSiloDiscoveryResults-XpDp2u35.mjs +0 -20
  411. package/dist/uploadSiloDiscoveryResults-XpDp2u35.mjs.map +0 -1
  412. package/dist/withPreferenceRetry-Cb5S310L.mjs +0 -2
  413. package/dist/withPreferenceRetry-Cb5S310L.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"pushManualEnrichmentIdentifiersFromCsv-CGS9E3Ft.mjs","names":[],"sources":["../src/lib/manual-enrichment/enrichPrivacyRequest.ts","../src/lib/manual-enrichment/pushManualEnrichmentIdentifiersFromCsv.ts"],"sourcesContent":["import colors from 'colors';\nimport type { Got } from 'got';\nimport * as t from 'io-ts';\nimport { uniq } from 'lodash-es';\n\nimport { logger } from '../../logger.js';\nimport { splitCsvToList } from '../requests/splitCsvToList.js';\n\nconst ADMIN_URL = 'https://app.transcend.io/privacy-requests/incoming-requests/';\n/**\n * Minimal set required to mark as completed\n */\nexport const EnrichPrivacyRequest = t.record(t.string, t.string);\n\n/** Type override */\nexport type EnrichPrivacyRequest = t.TypeOf<typeof EnrichPrivacyRequest>;\n\n/**\n * Upload identifiers to a privacy request or mark request as\n *\n * @param sombra - Sombra instance configured to make requests\n * @param request - Request to enricher\n * @param enricherId - The ID of the enricher being uploaded to\n * @param index - Index of request ID\n * @returns True if enriched successfully, false if skipped, throws error if failed\n */\nexport async function enrichPrivacyRequest(\n sombra: Got,\n { id: rawId, ...rest }: EnrichPrivacyRequest,\n enricherId: string,\n index?: number,\n): Promise<boolean> {\n if (!rawId) {\n // error\n const msg = `Request ID must be provided to enricher request.${\n index ? ` Found error in row: ${index}` : ''\n }`;\n logger.error(colors.red(msg));\n throw new Error(msg);\n }\n\n const id = rawId.toLowerCase();\n\n // Pull out the identifiers\n const enrichedIdentifiers = Object.entries(rest).reduce(\n (acc, [key, value]) => {\n const values = uniq(splitCsvToList(value));\n return values.length === 0\n ? acc\n : Object.assign(acc, {\n [key]: uniq(splitCsvToList(value)).map((val) => ({\n value: key === 'email' ? val.toLowerCase() : val,\n })),\n });\n },\n {} as Record<string, string[]>,\n );\n\n // Make the GraphQL request\n try {\n await sombra\n .post('v1/enrich-identifiers', {\n headers: {\n 'x-transcend-request-id': id,\n 'x-transcend-enricher-id': enricherId,\n },\n json: {\n enrichedIdentifiers,\n },\n })\n .json();\n\n logger.error(colors.green(`Successfully enriched request: ${ADMIN_URL}${id}`));\n return true;\n } catch (err) {\n // skip if already enriched\n if (\n typeof err.response.body === 'string' &&\n err.response.body.includes('Cannot update a resolved RequestEnricher')\n ) {\n logger.warn(\n colors.magenta(\n `Skipped enrichment for request: ${ADMIN_URL}${id}, request is no longer in the enriching phase.`,\n ),\n );\n return false;\n }\n\n // error\n logger.error(\n colors.red(\n `Failed to enricher identifiers for request with id: ${ADMIN_URL}${id} - ${err.message} - ${err.response.body}`,\n ),\n );\n throw err;\n }\n}\n","import colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { map } from '../bluebird.js';\nimport {\n UPDATE_PRIVACY_REQUEST,\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n makeGraphQLRequest,\n} from '../graphql/index.js';\nimport { readCsv } from '../requests/index.js';\nimport { enrichPrivacyRequest, EnrichPrivacyRequest } from './enrichPrivacyRequest.js';\n\n/**\n * Push a CSV of enriched requests back into Transcend\n *\n * @param options - Options\n * @returns Number of items processed\n */\nexport async function pushManualEnrichmentIdentifiersFromCsv({\n file,\n auth,\n sombraAuth,\n enricherId,\n markSilent,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** CSV file path */\n file: string;\n /** Transcend API key authentication */\n auth: string;\n /** ID of enricher being uploaded to */\n enricherId: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** Concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Mark requests in silent mode before enriching */\n markSilent?: boolean;\n}): Promise<number> {\n // Create sombra instance to communicate with\n const sombra = await createSombraGotInstance(transcendUrl, auth, sombraAuth);\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n\n // Read from CSV\n logger.info(colors.magenta(`Reading \"${file}\" from disk`));\n const activeResults = readCsv(file, EnrichPrivacyRequest);\n\n // Notify Transcend\n logger.info(colors.magenta(`Enriching \"${activeResults.length}\" privacy requests.`));\n\n let successCount = 0;\n let skippedCount = 0;\n let errorCount = 0;\n\n await map(\n activeResults,\n async (request, index) => {\n try {\n // Mark requests in silent mode before a certain date\n if (markSilent) {\n await makeGraphQLRequest(client, UPDATE_PRIVACY_REQUEST, {\n input: {\n id: request.id,\n isSilent: true,\n },\n });\n\n logger.info(colors.magenta(`Mark request as silent mode - ${request.id}`));\n }\n\n const result = await enrichPrivacyRequest(sombra, request, enricherId, index);\n if (result) {\n successCount += 1;\n } else {\n skippedCount += 1;\n }\n } catch (err) {\n errorCount += 1;\n }\n },\n { concurrency },\n );\n\n logger.info(colors.green(`Successfully notified Transcend! \\n Success count: ${successCount}.`));\n\n if (skippedCount > 0) {\n logger.info(colors.magenta(`Skipped count: ${skippedCount}.`));\n }\n\n if (errorCount > 0) {\n logger.info(colors.red(`Error Count: ${errorCount}.`));\n throw new Error(`Failed to enrich: ${errorCount} requests.`);\n }\n\n return activeResults.length;\n}\n"],"mappings":"6cAQA,MAAM,EAAY,+DAIL,EAAuB,EAAE,OAAO,EAAE,OAAQ,EAAE,OAAO,CAchE,eAAsB,EACpB,EACA,CAAE,GAAI,EAAO,GAAG,GAChB,EACA,EACkB,CAClB,GAAI,CAAC,EAAO,CAEV,IAAM,EAAM,mDACV,EAAQ,wBAAwB,IAAU,KAG5C,MADA,EAAO,MAAM,EAAO,IAAI,EAAI,CAAC,CACnB,MAAM,EAAI,CAGtB,IAAM,EAAK,EAAM,aAAa,CAGxB,EAAsB,OAAO,QAAQ,EAAK,CAAC,QAC9C,EAAK,CAAC,EAAK,KACK,EAAK,EAAe,EAAM,CAAC,CAC5B,SAAW,EACrB,EACA,OAAO,OAAO,EAAK,EAChB,GAAM,EAAK,EAAe,EAAM,CAAC,CAAC,IAAK,IAAS,CAC/C,MAAO,IAAQ,QAAU,EAAI,aAAa,CAAG,EAC9C,EAAE,CACJ,CAAC,CAER,EAAE,CACH,CAGD,GAAI,CAcF,OAbA,MAAM,EACH,KAAK,wBAAyB,CAC7B,QAAS,CACP,yBAA0B,EAC1B,0BAA2B,EAC5B,CACD,KAAM,CACJ,sBACD,CACF,CAAC,CACD,MAAM,CAET,EAAO,MAAM,EAAO,MAAM,kCAAkC,IAAY,IAAK,CAAC,CACvE,SACA,EAAK,CAEZ,GACE,OAAO,EAAI,SAAS,MAAS,UAC7B,EAAI,SAAS,KAAK,SAAS,2CAA2C,CAOtE,OALA,EAAO,KACL,EAAO,QACL,mCAAmC,IAAY,EAAG,gDACnD,CACF,CACM,GAST,MALA,EAAO,MACL,EAAO,IACL,uDAAuD,IAAY,EAAG,KAAK,EAAI,QAAQ,KAAK,EAAI,SAAS,OAC1G,CACF,CACK,GC1EV,eAAsB,EAAuC,CAC3D,OACA,OACA,aACA,aACA,aACA,cAAc,IACd,eAAe,GAgBG,CAElB,IAAM,EAAS,MAAM,EAAwB,EAAc,EAAM,EAAW,CACtE,EAAS,EAA4B,EAAc,EAAK,CAG9D,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAK,aAAa,CAAC,CAC1D,IAAM,EAAgB,EAAQ,EAAM,EAAqB,CAGzD,EAAO,KAAK,EAAO,QAAQ,cAAc,EAAc,OAAO,qBAAqB,CAAC,CAEpF,IAAI,EAAe,EACf,EAAe,EACf,EAAa,EAqCjB,GAnCA,MAAM,EACJ,EACA,MAAO,EAAS,IAAU,CACxB,GAAI,CAEE,IACF,MAAM,EAAmB,EAAQ,EAAwB,CACvD,MAAO,CACL,GAAI,EAAQ,GACZ,SAAU,GACX,CACF,CAAC,CAEF,EAAO,KAAK,EAAO,QAAQ,iCAAiC,EAAQ,KAAK,CAAC,EAG7D,MAAM,EAAqB,EAAQ,EAAS,EAAY,EAAM,CAE3E,GAAgB,EAEhB,GAAgB,OAEN,CACZ,GAAc,IAGlB,CAAE,cAAa,CAChB,CAED,EAAO,KAAK,EAAO,MAAM,sDAAsD,EAAa,GAAG,CAAC,CAE5F,EAAe,GACjB,EAAO,KAAK,EAAO,QAAQ,kBAAkB,EAAa,GAAG,CAAC,CAG5D,EAAa,EAEf,MADA,EAAO,KAAK,EAAO,IAAI,gBAAgB,EAAW,GAAG,CAAC,CAC5C,MAAM,qBAAqB,EAAW,YAAY,CAG9D,OAAO,EAAc"}
@@ -1,35 +0,0 @@
1
- import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{t as n}from"./bluebird-CUitXgsY.mjs";import{r,t as i}from"./makeGraphQLRequest-G078PsEL.mjs";import{r as a}from"./fetchAllRequests-DEPTEUbi.mjs";import{RequestStatus as o}from"@transcend-io/privacy-types";import s from"colors";import{gql as c}from"graphql-request";import l from"cli-progress";const u=c`
2
- mutation TranscendCliRemoveRequestIdentifiers($input: RemoveRequestIdentifiersInput!) {
3
- removeRequestIdentifiers(input: $input) {
4
- count
5
- }
6
- }
7
- `,d=c`
8
- query TranscendCliRequestIdentifiers(
9
- $first: Int!
10
- $offset: Int!
11
- $requestIds: [ID!]
12
- $updatedAtBefore: Date
13
- $updatedAtAfter: Date
14
- ) {
15
- requestIdentifiers(
16
- input: {
17
- requestIds: $requestIds
18
- updatedAtBefore: $updatedAtBefore
19
- updatedAtAfter: $updatedAtAfter
20
- }
21
- first: $first
22
- offset: $offset
23
- useMaster: false
24
- orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]
25
- ) {
26
- nodes {
27
- id
28
- name
29
- isVerifiedAtLeastOnce
30
- }
31
- totalCount
32
- }
33
- }
34
- `;async function f(e,{requestId:t,requestIds:n,updatedAtBefore:r,updatedAtAfter:a}){let o=n??(t?[t]:void 0),s=[],c=0,l=!1;do{let{requestIdentifiers:{nodes:t}}=await i(e,d,{first:50,offset:c,requestIds:o,updatedAtBefore:r?r.toISOString():void 0,updatedAtAfter:a?a.toISOString():void 0});s.push(...t),c+=50,l=t.length===50}while(l);return s}async function p({requestActions:c,identifierNames:d,auth:p,concurrency:m=20,transcendUrl:h=e}){let g=r(h,p),_=new Date().getTime(),v=new l.SingleBar({},l.Presets.shades_classic),y=await a(g,{actions:c,statuses:[o.Enriching]});t.info(s.magenta(`Fetched requests in preflight/enriching state.`));let b=0,x=0;v.start(y.length,0),await n(y,async e=>{let t=(await f(g,{requestId:e.id})).filter(({isVerifiedAtLeastOnce:e,name:t})=>e===!1&&d.includes(t)).map(({id:e})=>e);t.length>0&&(await i(g,u,{input:{requestId:e.id,requestIdentifierIds:t}}),x+=t.length),b+=1,v.update(b)},{concurrency:m}),v.stop();let S=new Date().getTime()-_;return t.info(s.green(`Successfully cleared out unverified identifiers "${S/1e3}" seconds for ${b} requests, ${x} identifiers were cleared out!`)),y.length}export{d as i,f as n,u as r,p as t};
35
- //# sourceMappingURL=removeUnverifiedRequestIdentifiers-pGGOFbfE.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"removeUnverifiedRequestIdentifiers-pGGOFbfE.mjs","names":[],"sources":["../src/lib/graphql/gqls/RequestIdentifier.ts","../src/lib/graphql/fetchAllRequestIdentifierMetadata.ts","../src/lib/requests/removeUnverifiedRequestIdentifiers.ts"],"sourcesContent":["import { gql } from 'graphql-request';\n\nexport const REMOVE_REQUEST_IDENTIFIERS = gql`\n mutation TranscendCliRemoveRequestIdentifiers($input: RemoveRequestIdentifiersInput!) {\n removeRequestIdentifiers(input: $input) {\n count\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const REQUEST_IDENTIFIERS = gql`\n query TranscendCliRequestIdentifiers(\n $first: Int!\n $offset: Int!\n $requestIds: [ID!]\n $updatedAtBefore: Date\n $updatedAtAfter: Date\n ) {\n requestIdentifiers(\n input: {\n requestIds: $requestIds\n updatedAtBefore: $updatedAtBefore\n updatedAtAfter: $updatedAtAfter\n }\n first: $first\n offset: $offset\n useMaster: false\n orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]\n ) {\n nodes {\n id\n name\n isVerifiedAtLeastOnce\n }\n totalCount\n }\n }\n`;\n","import { GraphQLClient } from 'graphql-request';\n\nimport { REQUEST_IDENTIFIERS } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nexport interface RequestIdentifierMetadata {\n /** ID of request identifier */\n id: string;\n /** Name of identifier */\n name: string;\n /** Status of identifier */\n isVerifiedAtLeastOnce: boolean;\n}\n\nconst PAGE_SIZE = 50;\n\n/**\n * Fetch all request identifier metadata for a particular request\n *\n * @param client - GraphQL client\n * @param options - Filter options\n * @returns List of request identifiers\n */\nexport async function fetchAllRequestIdentifierMetadata(\n client: GraphQLClient,\n {\n requestId,\n requestIds,\n updatedAtBefore,\n updatedAtAfter,\n }: {\n /** ID of request to filter on */\n requestId?: string;\n /** IDs of requests to filter on */\n requestIds?: string[];\n /** Filter for request identifiers updated before this date */\n updatedAtBefore?: Date;\n /** Filter for request identifiers updated after this date */\n updatedAtAfter?: Date;\n },\n): Promise<RequestIdentifierMetadata[]> {\n const resolvedRequestIds = requestIds ?? (requestId ? [requestId] : undefined);\n const requestIdentifiers: RequestIdentifierMetadata[] = [];\n let offset = 0;\n\n // Paginate\n let shouldContinue = false;\n do {\n const {\n requestIdentifiers: { nodes },\n } = await makeGraphQLRequest<{\n /** Request Identifiers */\n requestIdentifiers: {\n /** List */\n nodes: RequestIdentifierMetadata[];\n };\n }>(client, REQUEST_IDENTIFIERS, {\n first: PAGE_SIZE,\n offset,\n requestIds: resolvedRequestIds,\n updatedAtBefore: updatedAtBefore ? updatedAtBefore.toISOString() : undefined,\n updatedAtAfter: updatedAtAfter ? updatedAtAfter.toISOString() : undefined,\n });\n requestIdentifiers.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return requestIdentifiers;\n}\n","import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { map } from '../bluebird.js';\nimport {\n REMOVE_REQUEST_IDENTIFIERS,\n fetchAllRequests,\n fetchAllRequestIdentifierMetadata,\n makeGraphQLRequest,\n buildTranscendGraphQLClient,\n} from '../graphql/index.js';\n\n/**\n * Remove a set of unverified request identifier\n *\n * @param options - Options\n * @returns Number of items marked as completed\n */\nexport async function removeUnverifiedRequestIdentifiers({\n requestActions,\n identifierNames,\n auth,\n concurrency = 20,\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 /** The set of identifier names to remove */\n identifierNames: string[];\n /** Concurrency to upload requests in parallel */\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 // Pull in the requests\n const allRequests = await fetchAllRequests(client, {\n actions: requestActions,\n statuses: [RequestStatus.Enriching],\n });\n\n // Notify Transcend\n logger.info(colors.magenta('Fetched requests in preflight/enriching state.'));\n\n let total = 0;\n let processed = 0;\n progressBar.start(allRequests.length, 0);\n await map(\n allRequests,\n async (requestToRestart) => {\n const requestIdentifiers = await fetchAllRequestIdentifierMetadata(client, {\n requestId: requestToRestart.id,\n });\n const clearOut = requestIdentifiers\n .filter(\n ({ isVerifiedAtLeastOnce, name }) =>\n isVerifiedAtLeastOnce === false && identifierNames.includes(name),\n )\n .map(({ id }) => id);\n\n if (clearOut.length > 0) {\n await makeGraphQLRequest<{\n /** Whether we successfully uploaded the results */\n success: boolean;\n }>(client, REMOVE_REQUEST_IDENTIFIERS, {\n input: {\n requestId: requestToRestart.id,\n requestIdentifierIds: clearOut,\n },\n });\n processed += clearOut.length;\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 cleared out unverified identifiers \"${\n totalTime / 1000\n }\" seconds for ${total} requests, ${processed} identifiers were cleared out!`,\n ),\n );\n return allRequests.length;\n}\n"],"mappings":"8XAEA,MAAa,EAA6B,CAAG;;;;;;EAUhC,EAAsB,CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;ECWtC,eAAsB,EACpB,EACA,CACE,YACA,aACA,kBACA,kBAWoC,CACtC,IAAM,EAAqB,IAAe,EAAY,CAAC,EAAU,CAAG,IAAA,IAC9D,EAAkD,EAAE,CACtD,EAAS,EAGT,EAAiB,GACrB,EAAG,CACD,GAAM,CACJ,mBAAoB,CAAE,UACpB,MAAM,EAMP,EAAQ,EAAqB,CAC9B,MAAO,GACP,SACA,WAAY,EACZ,gBAAiB,EAAkB,EAAgB,aAAa,CAAG,IAAA,GACnE,eAAgB,EAAiB,EAAe,aAAa,CAAG,IAAA,GACjE,CAAC,CACF,EAAmB,KAAK,GAAG,EAAM,CACjC,GAAU,GACV,EAAiB,EAAM,SAAW,SAC3B,GAET,OAAO,EC/CT,eAAsB,EAAmC,CACvD,iBACA,kBACA,OACA,cAAc,GACd,eAAe,GAYG,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,SAAU,CAAC,EAAc,UAAU,CACpC,CAAC,CAGF,EAAO,KAAK,EAAO,QAAQ,iDAAiD,CAAC,CAE7E,IAAI,EAAQ,EACR,EAAY,EAChB,EAAY,MAAM,EAAY,OAAQ,EAAE,CACxC,MAAM,EACJ,EACA,KAAO,IAAqB,CAI1B,IAAM,GAHqB,MAAM,EAAkC,EAAQ,CACzE,UAAW,EAAiB,GAC7B,CAAC,EAEC,QACE,CAAE,wBAAuB,UACxB,IAA0B,IAAS,EAAgB,SAAS,EAAK,CACpE,CACA,KAAK,CAAE,QAAS,EAAG,CAElB,EAAS,OAAS,IACpB,MAAM,EAGH,EAAQ,EAA4B,CACrC,MAAO,CACL,UAAW,EAAiB,GAC5B,qBAAsB,EACvB,CACF,CAAC,CACF,GAAa,EAAS,QAGxB,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SAAS,CACR,EASvB,OAPA,EAAO,KACL,EAAO,MACL,oDACE,EAAY,IACb,gBAAgB,EAAM,aAAa,EAAU,gCAC/C,CACF,CACM,EAAY"}
@@ -1,2 +0,0 @@
1
- import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{t as n}from"./bluebird-CUitXgsY.mjs";import{i as r}from"./RequestDataSilo-_Iv44M9u.mjs";import{r as i,t as a}from"./makeGraphQLRequest-G078PsEL.mjs";import{r as o}from"./fetchAllRequests-DEPTEUbi.mjs";import{t as s}from"./fetchRequestDataSilo-CF6XOTQ-.mjs";import{RequestStatus as c}from"@transcend-io/privacy-types";import l from"colors";import u from"cli-progress";async function d({requestActions:d,dataSiloId:f,auth:p,concurrency:m=20,transcendUrl:h=e}){let g=i(h,p),_=new Date().getTime(),v=new u.SingleBar({},u.Presets.shades_classic),y=await o(g,{actions:d,statuses:[c.Compiling,c.Approving]});t.info(l.magenta(`Retrying requests for Data Silo: "${f}", restarting "${y.length}" requests.`));let b=0,x=0;v.start(y.length,0),await n(y,async e=>{try{await a(g,r,{requestDataSiloId:(await s(g,{requestId:e.id,dataSiloId:f})).id})}catch(e){if(!e.message.includes(`Failed to find RequestDataSilo`))throw e;x+=1}b+=1,v.update(b)},{concurrency:m}),v.stop();let S=new Date().getTime()-_;return t.info(l.green(`Successfully notified Transcend in "${S/1e3}" seconds for ${b} requests, ${x} requests were skipped because data silo was not attached to the request!`)),y.length}export{d as t};
2
- //# sourceMappingURL=retryRequestDataSilos-DXwN5uPw.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retryRequestDataSilos-DXwN5uPw.mjs","names":[],"sources":["../src/lib/requests/retryRequestDataSilos.ts"],"sourcesContent":["import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { map } from '../bluebird.js';\nimport {\n RETRY_REQUEST_DATA_SILO,\n fetchRequestDataSilo,\n fetchAllRequests,\n makeGraphQLRequest,\n buildTranscendGraphQLClient,\n} from '../graphql/index.js';\n\n/**\n * Retry a set of RequestDataSilos\n *\n * @param options - Options\n * @returns Number of items marked as completed\n */\nexport async function retryRequestDataSilos({\n requestActions,\n dataSiloId,\n auth,\n concurrency = 20,\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 /** Data Silo ID to pull down jobs for */\n dataSiloId: string;\n /** Concurrency to upload requests in parallel */\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 // Pull in the requests\n const allRequests = await fetchAllRequests(client, {\n actions: requestActions,\n statuses: [RequestStatus.Compiling, RequestStatus.Approving],\n });\n\n // Notify Transcend\n logger.info(\n colors.magenta(\n `Retrying requests for Data Silo: \"${dataSiloId}\", restarting \"${allRequests.length}\" requests.`,\n ),\n );\n\n let total = 0;\n let skipped = 0;\n progressBar.start(allRequests.length, 0);\n await map(\n allRequests,\n async (requestToRestart) => {\n try {\n const requestDataSilo = await fetchRequestDataSilo(client, {\n requestId: requestToRestart.id,\n dataSiloId,\n });\n\n await makeGraphQLRequest<{\n /** Whether we successfully uploaded the results */\n success: boolean;\n }>(client, RETRY_REQUEST_DATA_SILO, {\n requestDataSiloId: requestDataSilo.id,\n });\n } catch (err) {\n // some requests may not have this data silo connected\n if (!err.message.includes('Failed to find RequestDataSilo')) {\n throw err;\n }\n skipped += 1;\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 notified Transcend in \"${\n totalTime / 1000\n }\" seconds for ${total} requests, ${skipped} requests were skipped because data silo was not attached to the request!`,\n ),\n );\n return allRequests.length;\n}\n"],"mappings":"wcAqBA,eAAsB,EAAsB,CAC1C,iBACA,aACA,OACA,cAAc,GACd,eAAe,GAYG,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,SAAU,CAAC,EAAc,UAAW,EAAc,UAAU,CAC7D,CAAC,CAGF,EAAO,KACL,EAAO,QACL,qCAAqC,EAAW,iBAAiB,EAAY,OAAO,aACrF,CACF,CAED,IAAI,EAAQ,EACR,EAAU,EACd,EAAY,MAAM,EAAY,OAAQ,EAAE,CACxC,MAAM,EACJ,EACA,KAAO,IAAqB,CAC1B,GAAI,CAMF,MAAM,EAGH,EAAQ,EAAyB,CAClC,mBATsB,MAAM,EAAqB,EAAQ,CACzD,UAAW,EAAiB,GAC5B,aACD,CAAC,EAMmC,GACpC,CAAC,OACK,EAAK,CAEZ,GAAI,CAAC,EAAI,QAAQ,SAAS,iCAAiC,CACzD,MAAM,EAER,GAAW,EAGb,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SAAS,CACR,EASvB,OAPA,EAAO,KACL,EAAO,MACL,uCACE,EAAY,IACb,gBAAgB,EAAM,aAAa,EAAQ,2EAC7C,CACF,CACM,EAAY"}
@@ -1,2 +0,0 @@
1
- import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{n,t as r}from"./bluebird-CUitXgsY.mjs";import{i,t as a}from"./fetchAllRequestEnrichers-q34mRuE5.mjs";import{r as o,t as s}from"./makeGraphQLRequest-G078PsEL.mjs";import{r as c}from"./fetchAllRequests-DEPTEUbi.mjs";import{RequestEnricherStatus as l,RequestStatus as u}from"@transcend-io/privacy-types";import d from"colors";import f from"cli-progress";async function p({enricherIds:p,auth:m,concurrency:h=100,transcendUrl:g=e}){let _=o(g,m),v=new Date().getTime(),y=await c(_,{statuses:[u.Enriching]});t.info(d.magenta(`Processing enricher: "${p.join(`,`)}" fetched "${y.length}" in enriching status.`));let b=new f.SingleBar({},f.Presets.shades_classic),x=0;b.start(y.length,0);let S=0;await r(y,async e=>{let t=(await a(_,{requestId:e.id})).filter(e=>p.includes(e.enricher.id)&&![l.Resolved,l.Skipped].includes(e.status));t.length>0&&await n(t,async e=>{try{await s(_,i,{requestEnricherId:e.id}),S+=1}catch(e){if(!e.message.includes(`Client error: Cannot skip Request enricher because it has already completed`))throw e}}),x+=1,b.update(x)},{concurrency:h}),b.stop();let C=new Date().getTime()-v;return t.info(d.green(`Successfully skipped "${S}" for "${y.length}" requests in "${C/1e3}" seconds!`)),y.length}export{p as t};
2
- //# sourceMappingURL=skipPreflightJobs-BNQhuPZ8.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skipPreflightJobs-BNQhuPZ8.mjs","names":[],"sources":["../src/lib/requests/skipPreflightJobs.ts"],"sourcesContent":["import { RequestEnricherStatus, RequestStatus } from '@transcend-io/privacy-types';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries, map } from '../bluebird.js';\nimport {\n makeGraphQLRequest,\n buildTranscendGraphQLClient,\n fetchAllRequestEnrichers,\n fetchAllRequests,\n SKIP_REQUEST_ENRICHER,\n} from '../graphql/index.js';\n\n/**\n * Given an enricher ID, mark all open request enrichers as skipped\n *\n * @param options - Options\n * @returns Number of items skipped\n */\nexport async function skipPreflightJobs({\n enricherIds,\n auth,\n concurrency = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n}: {\n /** Transcend API key authentication */\n auth: string;\n /** Enricher IDs to pull down jobs for */\n enricherIds: string[];\n /** Upload concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Request statuses to mark as completed */\n requestStatuses?: RequestStatus[];\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\n // fetch all RequestDataSilos that are open\n const requests = await fetchAllRequests(client, {\n statuses: [RequestStatus.Enriching],\n });\n\n // Notify Transcend\n logger.info(\n colors.magenta(\n `Processing enricher: \"${enricherIds.join(',')}\" fetched \"${\n requests.length\n }\" in enriching status.`,\n ),\n );\n\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n let total = 0;\n progressBar.start(requests.length, 0);\n let totalSkipped = 0;\n await map(\n requests,\n async (request) => {\n // TODO dont pull all in\n const requestEnrichers = await fetchAllRequestEnrichers(client, {\n requestId: request.id,\n });\n const requestEnrichersFiltered = requestEnrichers.filter(\n (enricher) =>\n enricherIds.includes(enricher.enricher.id) &&\n ![\n RequestEnricherStatus.Resolved,\n RequestEnricherStatus.Skipped,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ].includes(enricher.status as any),\n );\n\n // TODO\n if (requestEnrichersFiltered.length > 0) {\n await mapSeries(requestEnrichersFiltered, async (requestEnricher) => {\n try {\n await makeGraphQLRequest<{\n /** Whether we successfully uploaded the results */\n success: boolean;\n }>(client, SKIP_REQUEST_ENRICHER, {\n requestEnricherId: requestEnricher.id,\n });\n totalSkipped += 1;\n } catch (err) {\n if (\n !err.message.includes(\n 'Client error: Cannot skip Request enricher because it has already completed',\n )\n ) {\n throw err;\n }\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(\n colors.green(\n `Successfully skipped \"${totalSkipped}\" for \"${\n requests.length\n }\" requests in \"${totalTime / 1000}\" seconds!`,\n ),\n );\n return requests.length;\n}\n"],"mappings":"wbAqBA,eAAsB,EAAkB,CACtC,cACA,OACA,cAAc,IACd,eAAe,GAYG,CAElB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAK,IAAI,MAAM,CAAC,SAAS,CAGzB,EAAW,MAAM,EAAiB,EAAQ,CAC9C,SAAU,CAAC,EAAc,UAAU,CACpC,CAAC,CAGF,EAAO,KACL,EAAO,QACL,yBAAyB,EAAY,KAAK,IAAI,CAAC,aAC7C,EAAS,OACV,wBACF,CACF,CAGD,IAAM,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAEjF,EAAQ,EACZ,EAAY,MAAM,EAAS,OAAQ,EAAE,CACrC,IAAI,EAAe,EACnB,MAAM,EACJ,EACA,KAAO,IAAY,CAKjB,IAAM,GAHmB,MAAM,EAAyB,EAAQ,CAC9D,UAAW,EAAQ,GACpB,CAAC,EACgD,OAC/C,GACC,EAAY,SAAS,EAAS,SAAS,GAAG,EAC1C,CAAC,CACC,EAAsB,SACtB,EAAsB,QAEvB,CAAC,SAAS,EAAS,OAAc,CACrC,CAGG,EAAyB,OAAS,GACpC,MAAM,EAAU,EAA0B,KAAO,IAAoB,CACnE,GAAI,CACF,MAAM,EAGH,EAAQ,EAAuB,CAChC,kBAAmB,EAAgB,GACpC,CAAC,CACF,GAAgB,QACT,EAAK,CACZ,GACE,CAAC,EAAI,QAAQ,SACX,8EACD,CAED,MAAM,IAGV,CAEJ,GAAS,EACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAED,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SAAS,CACR,EASvB,OAPA,EAAO,KACL,EAAO,MACL,yBAAyB,EAAa,UACpC,EAAS,OACV,iBAAiB,EAAY,IAAK,YACpC,CACF,CACM,EAAS"}
@@ -1,2 +0,0 @@
1
- import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{t as n}from"./bluebird-CUitXgsY.mjs";import{t as r}from"./RequestDataSilo-_Iv44M9u.mjs";import{r as i,t as a}from"./makeGraphQLRequest-G078PsEL.mjs";import{n as o,r as s}from"./fetchRequestDataSilo-CF6XOTQ-.mjs";import{RequestStatus as c}from"@transcend-io/privacy-types";import l from"colors";import u from"cli-progress";async function d({dataSiloId:d,auth:f,concurrency:p=50,maxUploadPerChunk:m=5e4,status:h=`SKIPPED`,transcendUrl:g=e,requestStatuses:_=[c.Compiling,c.Secondary]}){let v=i(g,f),y=new Date().getTime(),b=await s(v,{dataSiloId:d,requestStatuses:_});t.info(l.magenta(`Marking ${b} request data silos as completed`));let x=new u.SingleBar({},u.Presets.shades_classic),S=0;for(x.start(b,0);S<b;)await n(await o(v,{dataSiloId:d,requestStatuses:_,limit:m,onProgress:e=>{S+=e/2,x.update(S)}}),async e=>{try{await a(v,r,{requestDataSiloId:e.id,status:h})}catch(e){if(!e.message.includes(`Client error: Request must be active:`))throw e}S+=.5,x.update(S)},{concurrency:p});x.stop();let C=new Date().getTime()-y;return t.info(l.green(`Successfully skipped "${b}" requests in "${C/1e3}" seconds!`)),b}export{d as t};
2
- //# sourceMappingURL=skipRequestDataSilos-C39ji4lO.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skipRequestDataSilos-C39ji4lO.mjs","names":[],"sources":["../src/lib/requests/skipRequestDataSilos.ts"],"sourcesContent":["import { RequestStatus } from '@transcend-io/privacy-types';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { map } from '../bluebird.js';\nimport {\n CHANGE_REQUEST_DATA_SILO_STATUS,\n makeGraphQLRequest,\n buildTranscendGraphQLClient,\n fetchRequestDataSilos,\n fetchRequestDataSilosCount,\n} from '../graphql/index.js';\n\n/**\n * Given a data silo ID, mark all open request data silos as skipped\n *\n * @param options - Options\n * @returns Number of items skipped\n */\nexport async function skipRequestDataSilos({\n dataSiloId,\n auth,\n concurrency = 50,\n maxUploadPerChunk = 50000,\n status = 'SKIPPED',\n transcendUrl = DEFAULT_TRANSCEND_API,\n requestStatuses = [RequestStatus.Compiling, RequestStatus.Secondary],\n}: {\n /** Transcend API key authentication */\n auth: string;\n /** Data Silo ID to pull down jobs for */\n dataSiloId: string;\n /** Status to set */\n status?: 'SKIPPED' | 'RESOLVED';\n /** Upload concurrency */\n concurrency?: number;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Request statuses to mark as completed */\n requestStatuses?: RequestStatus[];\n /** Maximum number of items to mark skipped per go */\n maxUploadPerChunk?: number;\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\n // Determine total number of request data silos\n const requestDataSiloCount = await fetchRequestDataSilosCount(client, {\n dataSiloId,\n requestStatuses,\n });\n\n logger.info(colors.magenta(`Marking ${requestDataSiloCount} request data silos as completed`));\n\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\n let total = 0;\n progressBar.start(requestDataSiloCount, 0);\n\n // fetch all RequestDataSilos that are open\n while (total < requestDataSiloCount) {\n const requestDataSilos = await fetchRequestDataSilos(client, {\n dataSiloId,\n requestStatuses,\n limit: maxUploadPerChunk,\n // eslint-disable-next-line no-loop-func\n onProgress: (numUpdated) => {\n total += numUpdated / 2;\n progressBar.update(total);\n },\n });\n\n await map(\n requestDataSilos,\n // eslint-disable-next-line no-loop-func\n async (requestDataSilo) => {\n try {\n await makeGraphQLRequest<{\n /** Whether we successfully uploaded the results */\n success: boolean;\n }>(client, CHANGE_REQUEST_DATA_SILO_STATUS, {\n requestDataSiloId: requestDataSilo.id,\n status,\n });\n } catch (err) {\n if (!err.message.includes('Client error: Request must be active:')) {\n throw err;\n }\n }\n\n total += 0.5;\n progressBar.update(total);\n },\n { concurrency },\n );\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 skipped \"${requestDataSiloCount}\" requests in \"${totalTime / 1000}\" seconds!`,\n ),\n );\n return requestDataSiloCount;\n}\n"],"mappings":"2ZAqBA,eAAsB,EAAqB,CACzC,aACA,OACA,cAAc,GACd,oBAAoB,IACpB,SAAS,UACT,eAAe,EACf,kBAAkB,CAAC,EAAc,UAAW,EAAc,UAAU,EAgBlD,CAElB,IAAM,EAAS,EAA4B,EAAc,EAAK,CAGxD,EAAK,IAAI,MAAM,CAAC,SAAS,CAGzB,EAAuB,MAAM,EAA2B,EAAQ,CACpE,aACA,kBACD,CAAC,CAEF,EAAO,KAAK,EAAO,QAAQ,WAAW,EAAqB,kCAAkC,CAAC,CAG9F,IAAM,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CAEjF,EAAQ,EAIZ,IAHA,EAAY,MAAM,EAAsB,EAAE,CAGnC,EAAQ,GAYb,MAAM,EAXmB,MAAM,EAAsB,EAAQ,CAC3D,aACA,kBACA,MAAO,EAEP,WAAa,GAAe,CAC1B,GAAS,EAAa,EACtB,EAAY,OAAO,EAAM,EAE5B,CAAC,CAKA,KAAO,IAAoB,CACzB,GAAI,CACF,MAAM,EAGH,EAAQ,EAAiC,CAC1C,kBAAmB,EAAgB,GACnC,SACD,CAAC,OACK,EAAK,CACZ,GAAI,CAAC,EAAI,QAAQ,SAAS,wCAAwC,CAChE,MAAM,EAIV,GAAS,GACT,EAAY,OAAO,EAAM,EAE3B,CAAE,cAAa,CAChB,CAGH,EAAY,MAAM,CAElB,IAAM,EADK,IAAI,MAAM,CAAC,SAAS,CACR,EAOvB,OALA,EAAO,KACL,EAAO,MACL,0BAA0B,EAAqB,iBAAiB,EAAY,IAAK,YAClF,CACF,CACM"}
@@ -1,2 +0,0 @@
1
- function e(e){return e.split(`,`).map(e=>e.trim()).filter(e=>e)}export{e as t};
2
- //# sourceMappingURL=splitCsvToList-BRq_CIfd.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"splitCsvToList-BRq_CIfd.mjs","names":[],"sources":["../src/lib/requests/splitCsvToList.ts"],"sourcesContent":["/**\n * Split string to CSV\n *\n * Filter out double commas and spaces like:\n * Dog, Cat -> ['Dog', 'Cat']\n * Dog,,Cat -> ['Dog', 'Cat']\n *\n * @param value - Value\n * @returns List of values\n */\nexport function splitCsvToList(value: string): string[] {\n return value\n .split(',')\n .map((x) => x.trim())\n .filter((x) => x);\n}\n"],"mappings":"AAUA,SAAgB,EAAe,EAAyB,CACtD,OAAO,EACJ,MAAM,IAAI,CACV,IAAK,GAAM,EAAE,MAAM,CAAC,CACpB,OAAQ,GAAM,EAAE"}
@@ -1,2 +0,0 @@
1
- import{a as e}from"./constants-CeMiHaHx.mjs";import{t}from"./logger-B-LXIf3U.mjs";import{t as n}from"./bluebird-CUitXgsY.mjs";import{t as r}from"./createSombraGotInstance-CahOgD6V.mjs";import{n as i,r as a}from"./fetchAllRequestIdentifiers-YP-geTV4.mjs";import{r as o}from"./makeGraphQLRequest-G078PsEL.mjs";import{i as s,r as c}from"./fetchAllRequests-DEPTEUbi.mjs";import{i as l,r as u,t as d}from"./writeCsv-B51ulrVl.mjs";import{groupBy as f,uniq as p}from"lodash-es";import m from"colors";import h from"cli-progress";function g({attributeValues:e,requestIdentifiers:t,id:n,email:r,type:i,status:a,subjectType:o,details:s,createdAt:c,successfullyCompletedAt:l,country:u,locale:d,origin:p,countrySubDivision:m,isSilent:h,isTest:g,coreIdentifier:_,purpose:v,...y}){return{"Request ID":n,"Created At":c,"Successfully Completed At":l||``,Email:r,"Core Identifier":_,"Request Type":i,"Data Subject Type":o,Status:a,Country:u,"Country Sub Division":m,Details:s,Origin:p,"Silent Mode":h,"Is Test Request":g,Language:d,"Purpose Trigger Name":v?.title||v?.name||``,"Purpose Trigger Value":v?.consent?.toString()||``,...(v?.enrichedPreferences||[]).reduce((e,t)=>{let n=t.preferenceTopic?.title.defaultMessage||t.name;return n?{...e,[n]:t.selectValues?t.selectValues.map(e=>e.name).join(`;`):t.selectValue?.name||t.booleanValue}:e},{}),...y,...Object.entries(f(e,`attributeKey.name`)).reduce((e,[t,n])=>Object.assign(e,{[t]:n.map(({name:e})=>e).join(`,`)}),{}),...Object.entries(f(t,`name`)).reduce((e,[t,n])=>Object.assign(e,{[t]:n.map(({value:e})=>e).join(`,`)}),{})}}function _(e,t,n){let r=e.getTime(),i=t.getTime(),a=(i-r)/n;return Array.from({length:n},(e,t)=>({createdAtAfter:new Date(r+a*t),createdAtBefore:new Date(t===n-1?i:r+a*(t+1))}))}async function v({auth:f,sombraAuth:v,actions:y=[],statuses:b=[],identifierSearch:x,concurrency:S=1,pageLimit:C=100,transcendUrl:w=e,createdAtBefore:T,createdAtAfter:E,updatedAtBefore:D,updatedAtAfter:O,isTest:k,skipRequestIdentifiers:A=!1,file:j}){let M=o(w,f),N=A?void 0:await r(w,f,v),P=``;T&&(P+=` before ${T.toISOString()}`),E&&(P+=`${P?`, and`:``} after ${E.toISOString()}`),t.info(m.magenta(`${y.length>0?`Pulling requests of type "${y.join(`" , "`)}"`:`Pulling all requests`}${P}`));let F=S>1&&E&&T,I=F?_(E,T,S):[{createdAtAfter:E,createdAtBefore:T}];F&&t.info(m.magenta(`Splitting date range into ${S} parallel chunks`));let L={type:y.length>0?y:void 0,status:b.length>0?b:void 0,isTest:k,createdAtBefore:T?T.toISOString():void 0,createdAtAfter:E?E.toISOString():void 0,updatedAtBefore:D?D.toISOString():void 0,updatedAtAfter:O?O.toISOString():void 0},R=Date.now();A||await a(M);let z=await s(M,L);t.info(m.magenta(`Fetching ${z} requests`));let B=new h.SingleBar({},h.Presets.shades_classic);B.start(z,0);let V=0,{baseName:H,extension:U}=l(j),W=I.map((e,t)=>I.length===1?j:`${H}-${t}${U}`),G=[],K=await n(I,async(e,r)=>{let a=W[r],o,s=0;try{await c(M,{actions:y,text:x,statuses:b,createdAtBefore:e.createdAtBefore,createdAtAfter:e.createdAtAfter,updatedAtBefore:D,updatedAtAfter:O,isTest:k,onPage:async e=>{if(e.length===0)return;let t=(A?e.map(e=>({...e,requestIdentifiers:[]})):await n(e,async e=>({...e,requestIdentifiers:await i(M,N,{requestId:e.id,skipSombraCheck:!0})}),{concurrency:C})).map(g);o||(o=p(t.map(e=>Object.keys(e)).flat()),u(a,o)),d(a,t,o),s+=t.length,V+=t.length,B.update(V)}})}catch(n){let i=n instanceof Error?n.message:String(n);t.error(m.red(`Chunk ${r} failed (${e.createdAtAfter?.toISOString()??`start`} → ${e.createdAtBefore?.toISOString()??`end`}): ${i}`)),G.push({index:r,createdAtAfter:e.createdAtAfter,createdAtBefore:e.createdAtBefore,error:i})}return o||u(a,[]),s},{concurrency:F?S:1});B.stop();let q=K.reduce((e,t)=>e+t,0),J=(Date.now()-R)/1e3;if(G.length>0){t.error(m.red(`\n${G.length} chunk(s) failed. Re-run with these date ranges to fill the gaps:`));for(let e of G)t.error(m.red(` Chunk ${e.index}: --createdAtAfter=${e.createdAtAfter?.toISOString()??``} --createdAtBefore=${e.createdAtBefore?.toISOString()??``}`))}return t.info(m.green(`Streamed ${q} requests to ${W.length} file(s) in ${J}s`)),{filePaths:W,totalCount:q}}export{g as n,v as t};
2
- //# sourceMappingURL=streamPrivacyRequestsToCsv-C8lquiyd.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"streamPrivacyRequestsToCsv-C8lquiyd.mjs","names":[],"sources":["../src/lib/requests/formatRequestForCsv.ts","../src/lib/requests/streamPrivacyRequestsToCsv.ts"],"sourcesContent":["import { groupBy } from 'lodash-es';\n\nimport type { PrivacyRequest, RequestIdentifier } from '../graphql/index.js';\n\nexport interface ExportedPrivacyRequest extends PrivacyRequest {\n /** Request identifiers */\n requestIdentifiers: RequestIdentifier[];\n}\n\n/** A single CSV row */\nexport type CsvRow = { [k in string]: string | null | number | boolean };\n\n/**\n * Format a single privacy request (with optional identifiers) into a flat CSV row.\n *\n * @param request - The request with identifiers attached\n * @returns Flat object suitable for CSV output\n */\nexport function formatRequestForCsv({\n attributeValues,\n requestIdentifiers,\n id,\n email,\n type,\n status,\n subjectType,\n details,\n createdAt,\n successfullyCompletedAt,\n country,\n locale,\n origin,\n countrySubDivision,\n isSilent,\n isTest,\n coreIdentifier,\n purpose,\n ...request\n}: ExportedPrivacyRequest): CsvRow {\n return {\n 'Request ID': id,\n 'Created At': createdAt,\n 'Successfully Completed At': successfullyCompletedAt || '',\n Email: email,\n 'Core Identifier': coreIdentifier,\n 'Request Type': type,\n 'Data Subject Type': subjectType,\n Status: status,\n Country: country,\n 'Country Sub Division': countrySubDivision,\n Details: details,\n Origin: origin,\n 'Silent Mode': isSilent,\n 'Is Test Request': isTest,\n Language: locale,\n 'Purpose Trigger Name': purpose?.title || purpose?.name || '',\n 'Purpose Trigger Value': purpose?.consent?.toString() || '',\n ...(purpose?.enrichedPreferences || []).reduce((acc: Record<string, string | boolean>, p) => {\n const title = p.preferenceTopic?.title.defaultMessage || p.name;\n return title\n ? {\n ...acc,\n [title]: p.selectValues\n ? p.selectValues.map((x) => x.name).join(';')\n : p.selectValue?.name || p.booleanValue,\n }\n : acc;\n }, {}),\n ...request,\n ...Object.entries(groupBy(attributeValues, 'attributeKey.name')).reduce(\n (acc, [name, values]) =>\n Object.assign(acc, {\n [name]: values.map(({ name: n }) => n).join(','),\n }),\n {},\n ),\n ...Object.entries(groupBy(requestIdentifiers, 'name')).reduce(\n (acc, [name, values]) =>\n Object.assign(acc, {\n [name]: values.map(({ value }) => value).join(','),\n }),\n {},\n ),\n };\n}\n","import { RequestAction, RequestStatus } from '@transcend-io/privacy-types';\nimport cliProgress from 'cli-progress';\nimport colors from 'colors';\nimport { uniq } from 'lodash-es';\n\nimport { DEFAULT_TRANSCEND_API } from '../../constants.js';\nimport { logger } from '../../logger.js';\nimport { map } from '../bluebird.js';\nimport {\n buildTranscendGraphQLClient,\n createSombraGotInstance,\n fetchAllRequestIdentifiers,\n fetchAllRequests,\n fetchRequestsTotalCount,\n validateSombraVersion,\n} from '../graphql/index.js';\nimport { initCsvFile, appendCsvRowsOrdered, parseFilePath } from '../helpers/index.js';\nimport { formatRequestForCsv, ExportedPrivacyRequest } from './formatRequestForCsv.js';\n\ninterface ChunkedDateRange {\n /** Chunk start */\n createdAtAfter: Date;\n /** Chunk end */\n createdAtBefore: Date;\n}\n\n/**\n * Split a date range into N evenly-spaced chunks.\n *\n * @param after - Start of the date range\n * @param before - End of the date range\n * @param chunks - Number of chunks to split into\n * @returns Array of date range bounds\n */\nfunction splitDateRange(after: Date, before: Date, chunks: number): ChunkedDateRange[] {\n const startMs = after.getTime();\n const endMs = before.getTime();\n const chunkSize = (endMs - startMs) / chunks;\n return Array.from({ length: chunks }, (_, i) => ({\n createdAtAfter: new Date(startMs + chunkSize * i),\n createdAtBefore: new Date(i === chunks - 1 ? endMs : startMs + chunkSize * (i + 1)),\n }));\n}\n\n/**\n * Stream privacy requests directly to CSV files, one file per date-range chunk.\n * Memory stays bounded to a single page of results at a time.\n * Supports both with and without request identifier enrichment.\n *\n * @param options - Options\n * @returns The list of written file paths and total row count\n */\nexport async function streamPrivacyRequestsToCsv({\n auth,\n sombraAuth,\n actions = [],\n statuses = [],\n identifierSearch,\n concurrency = 1,\n pageLimit = 100,\n transcendUrl = DEFAULT_TRANSCEND_API,\n createdAtBefore,\n createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n isTest,\n skipRequestIdentifiers = false,\n file,\n}: {\n /** Transcend API key authentication */\n auth: string;\n /** Search for a specific identifier */\n identifierSearch?: string;\n /** Sombra API key authentication */\n sombraAuth?: string;\n /** API URL for Transcend backend */\n transcendUrl?: string;\n /** Statuses to filter on */\n statuses?: RequestStatus[];\n /** The request action to fetch */\n actions?: RequestAction[];\n /** Number of parallel date-range chunks */\n concurrency?: number;\n /** Concurrency for fetching identifiers per page */\n pageLimit?: number;\n /** Filter for requests created before this date */\n createdAtBefore?: Date;\n /** Filter for requests created after this date */\n createdAtAfter?: Date;\n /** Filter for requests updated before this date */\n updatedAtBefore?: Date;\n /** Filter for requests updated after this date */\n updatedAtAfter?: Date;\n /** Return test requests */\n isTest?: boolean;\n /** Skip fetching request identifiers */\n skipRequestIdentifiers?: boolean;\n /** Output CSV file path */\n file: string;\n}): Promise<{\n /** Paths to written CSV files */\n filePaths: string[];\n /** Total rows written */\n totalCount: number;\n}> {\n const client = buildTranscendGraphQLClient(transcendUrl, auth);\n const sombra = skipRequestIdentifiers\n ? undefined\n : await createSombraGotInstance(transcendUrl, auth, sombraAuth);\n\n // Log date range\n let dateRange = '';\n if (createdAtBefore) {\n dateRange += ` before ${createdAtBefore.toISOString()}`;\n }\n if (createdAtAfter) {\n dateRange += `${dateRange ? ', and' : ''} after ${createdAtAfter.toISOString()}`;\n }\n logger.info(\n colors.magenta(\n `${\n actions.length > 0\n ? `Pulling requests of type \"${actions.join('\" , \"')}\"`\n : 'Pulling all requests'\n }${dateRange}`,\n ),\n );\n\n // Split into parallel date-range chunks when possible\n const useChunks = concurrency > 1 && createdAtAfter && createdAtBefore;\n const chunks = useChunks\n ? splitDateRange(createdAtAfter, createdAtBefore, concurrency)\n : [{ createdAtAfter, createdAtBefore }];\n\n if (useChunks) {\n logger.info(colors.magenta(`Splitting date range into ${concurrency} parallel chunks`));\n }\n\n // Fetch total count once for the shared progress bar\n const filterBy = {\n type: actions.length > 0 ? actions : undefined,\n status: statuses.length > 0 ? statuses : undefined,\n isTest,\n createdAtBefore: createdAtBefore ? createdAtBefore.toISOString() : undefined,\n createdAtAfter: createdAtAfter ? createdAtAfter.toISOString() : undefined,\n updatedAtBefore: updatedAtBefore ? updatedAtBefore.toISOString() : undefined,\n updatedAtAfter: updatedAtAfter ? updatedAtAfter.toISOString() : undefined,\n };\n\n const t0 = Date.now();\n\n // Validate Sombra version once before bulk-fetching identifiers\n if (!skipRequestIdentifiers) {\n await validateSombraVersion(client);\n }\n\n const totalExpected = await fetchRequestsTotalCount(client, filterBy);\n logger.info(colors.magenta(`Fetching ${totalExpected} requests`));\n\n const progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n progressBar.start(totalExpected, 0);\n\n let globalFetched = 0;\n\n const { baseName, extension } = parseFilePath(file);\n\n const filePaths = chunks.map((_, i) =>\n chunks.length === 1 ? file : `${baseName}-${i}${extension}`,\n );\n\n interface FailedChunk {\n /** Chunk index */\n index: number;\n /** Start of failed date range */\n createdAtAfter?: Date;\n /** End of failed date range */\n createdAtBefore?: Date;\n /** Error message */\n error: string;\n }\n\n const failedChunks: FailedChunk[] = [];\n\n const chunkCounts = await map(\n chunks,\n async (chunk, i) => {\n const chunkFile = filePaths[i];\n let headers: string[] | undefined;\n let rowCount = 0;\n\n try {\n await fetchAllRequests(client, {\n actions,\n text: identifierSearch,\n statuses,\n createdAtBefore: chunk.createdAtBefore,\n createdAtAfter: chunk.createdAtAfter,\n updatedAtBefore,\n updatedAtAfter,\n isTest,\n onPage: async (nodes) => {\n if (nodes.length === 0) return;\n\n // Optionally enrich each request with its identifiers\n const enriched: ExportedPrivacyRequest[] = skipRequestIdentifiers\n ? nodes.map((n) => ({ ...n, requestIdentifiers: [] }))\n : await map(\n nodes,\n async (n) => ({\n ...n,\n requestIdentifiers: await fetchAllRequestIdentifiers(client, sombra!, {\n requestId: n.id,\n skipSombraCheck: true,\n }),\n }),\n { concurrency: pageLimit },\n );\n\n const rows: Record<string, string | null | number | boolean>[] =\n enriched.map(formatRequestForCsv);\n\n if (!headers) {\n headers = uniq(rows.map((r: Record<string, unknown>) => Object.keys(r)).flat());\n initCsvFile(chunkFile, headers);\n }\n\n appendCsvRowsOrdered(chunkFile, rows, headers);\n rowCount += rows.length;\n globalFetched += rows.length;\n progressBar.update(globalFetched);\n },\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n logger.error(\n colors.red(\n `Chunk ${i} failed (${\n chunk.createdAtAfter?.toISOString() ?? 'start'\n } → ${chunk.createdAtBefore?.toISOString() ?? 'end'}): ${message}`,\n ),\n );\n failedChunks.push({\n index: i,\n createdAtAfter: chunk.createdAtAfter,\n createdAtBefore: chunk.createdAtBefore,\n error: message,\n });\n }\n\n if (!headers) {\n initCsvFile(chunkFile, []);\n }\n\n return rowCount;\n },\n { concurrency: useChunks ? concurrency : 1 },\n );\n\n progressBar.stop();\n const totalCount = chunkCounts.reduce((a, b) => a + b, 0);\n const elapsed = (Date.now() - t0) / 1000;\n\n if (failedChunks.length > 0) {\n logger.error(\n colors.red(\n `\\n${failedChunks.length} chunk(s) failed. ` +\n 'Re-run with these date ranges to fill the gaps:',\n ),\n );\n for (const fc of failedChunks) {\n logger.error(\n colors.red(\n ` Chunk ${fc.index}: --createdAtAfter=${\n fc.createdAtAfter?.toISOString() ?? ''\n } --createdAtBefore=${fc.createdAtBefore?.toISOString() ?? ''}`,\n ),\n );\n }\n }\n\n logger.info(\n colors.green(`Streamed ${totalCount} requests to ${filePaths.length} file(s) in ${elapsed}s`),\n );\n\n return { filePaths, totalCount };\n}\n"],"mappings":"ygBAkBA,SAAgB,EAAoB,CAClC,kBACA,qBACA,KACA,QACA,OACA,SACA,cACA,UACA,YACA,0BACA,UACA,SACA,SACA,qBACA,WACA,SACA,iBACA,UACA,GAAG,GAC8B,CACjC,MAAO,CACL,aAAc,EACd,aAAc,EACd,4BAA6B,GAA2B,GACxD,MAAO,EACP,kBAAmB,EACnB,eAAgB,EAChB,oBAAqB,EACrB,OAAQ,EACR,QAAS,EACT,uBAAwB,EACxB,QAAS,EACT,OAAQ,EACR,cAAe,EACf,kBAAmB,EACnB,SAAU,EACV,uBAAwB,GAAS,OAAS,GAAS,MAAQ,GAC3D,wBAAyB,GAAS,SAAS,UAAU,EAAI,GACzD,IAAI,GAAS,qBAAuB,EAAE,EAAE,QAAQ,EAAuC,IAAM,CAC3F,IAAM,EAAQ,EAAE,iBAAiB,MAAM,gBAAkB,EAAE,KAC3D,OAAO,EACH,CACE,GAAG,GACF,GAAQ,EAAE,aACP,EAAE,aAAa,IAAK,GAAM,EAAE,KAAK,CAAC,KAAK,IAAI,CAC3C,EAAE,aAAa,MAAQ,EAAE,aAC9B,CACD,GACH,EAAE,CAAC,CACN,GAAG,EACH,GAAG,OAAO,QAAQ,EAAQ,EAAiB,oBAAoB,CAAC,CAAC,QAC9D,EAAK,CAAC,EAAM,KACX,OAAO,OAAO,EAAK,EAChB,GAAO,EAAO,KAAK,CAAE,KAAM,KAAQ,EAAE,CAAC,KAAK,IAAI,CACjD,CAAC,CACJ,EAAE,CACH,CACD,GAAG,OAAO,QAAQ,EAAQ,EAAoB,OAAO,CAAC,CAAC,QACpD,EAAK,CAAC,EAAM,KACX,OAAO,OAAO,EAAK,EAChB,GAAO,EAAO,KAAK,CAAE,WAAY,EAAM,CAAC,KAAK,IAAI,CACnD,CAAC,CACJ,EAAE,CACH,CACF,CCjDH,SAAS,EAAe,EAAa,EAAc,EAAoC,CACrF,IAAM,EAAU,EAAM,SAAS,CACzB,EAAQ,EAAO,SAAS,CACxB,GAAa,EAAQ,GAAW,EACtC,OAAO,MAAM,KAAK,CAAE,OAAQ,EAAQ,EAAG,EAAG,KAAO,CAC/C,eAAgB,IAAI,KAAK,EAAU,EAAY,EAAE,CACjD,gBAAiB,IAAI,KAAK,IAAM,EAAS,EAAI,EAAQ,EAAU,GAAa,EAAI,GAAG,CACpF,EAAE,CAWL,eAAsB,EAA2B,CAC/C,OACA,aACA,UAAU,EAAE,CACZ,WAAW,EAAE,CACb,mBACA,cAAc,EACd,YAAY,IACZ,eAAe,EACf,kBACA,iBACA,kBACA,iBACA,SACA,yBAAyB,GACzB,QAqCC,CACD,IAAM,EAAS,EAA4B,EAAc,EAAK,CACxD,EAAS,EACX,IAAA,GACA,MAAM,EAAwB,EAAc,EAAM,EAAW,CAG7D,EAAY,GACZ,IACF,GAAa,WAAW,EAAgB,aAAa,IAEnD,IACF,GAAa,GAAG,EAAY,QAAU,GAAG,SAAS,EAAe,aAAa,IAEhF,EAAO,KACL,EAAO,QACL,GACE,EAAQ,OAAS,EACb,6BAA6B,EAAQ,KAAK,QAAQ,CAAC,GACnD,yBACH,IACJ,CACF,CAGD,IAAM,EAAY,EAAc,GAAK,GAAkB,EACjD,EAAS,EACX,EAAe,EAAgB,EAAiB,EAAY,CAC5D,CAAC,CAAE,iBAAgB,kBAAiB,CAAC,CAErC,GACF,EAAO,KAAK,EAAO,QAAQ,6BAA6B,EAAY,kBAAkB,CAAC,CAIzF,IAAM,EAAW,CACf,KAAM,EAAQ,OAAS,EAAI,EAAU,IAAA,GACrC,OAAQ,EAAS,OAAS,EAAI,EAAW,IAAA,GACzC,SACA,gBAAiB,EAAkB,EAAgB,aAAa,CAAG,IAAA,GACnE,eAAgB,EAAiB,EAAe,aAAa,CAAG,IAAA,GAChE,gBAAiB,EAAkB,EAAgB,aAAa,CAAG,IAAA,GACnE,eAAgB,EAAiB,EAAe,aAAa,CAAG,IAAA,GACjE,CAEK,EAAK,KAAK,KAAK,CAGhB,GACH,MAAM,EAAsB,EAAO,CAGrC,IAAM,EAAgB,MAAM,EAAwB,EAAQ,EAAS,CACrE,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAc,WAAW,CAAC,CAEjE,IAAM,EAAc,IAAI,EAAY,UAAU,EAAE,CAAE,EAAY,QAAQ,eAAe,CACrF,EAAY,MAAM,EAAe,EAAE,CAEnC,IAAI,EAAgB,EAEd,CAAE,WAAU,aAAc,EAAc,EAAK,CAE7C,EAAY,EAAO,KAAK,EAAG,IAC/B,EAAO,SAAW,EAAI,EAAO,GAAG,EAAS,GAAG,IAAI,IACjD,CAaK,EAA8B,EAAE,CAEhC,EAAc,MAAM,EACxB,EACA,MAAO,EAAO,IAAM,CAClB,IAAM,EAAY,EAAU,GACxB,EACA,EAAW,EAEf,GAAI,CACF,MAAM,EAAiB,EAAQ,CAC7B,UACA,KAAM,EACN,WACA,gBAAiB,EAAM,gBACvB,eAAgB,EAAM,eACtB,kBACA,iBACA,SACA,OAAQ,KAAO,IAAU,CACvB,GAAI,EAAM,SAAW,EAAG,OAiBxB,IAAM,GAdqC,EACvC,EAAM,IAAK,IAAO,CAAE,GAAG,EAAG,mBAAoB,EAAE,CAAE,EAAE,CACpD,MAAM,EACJ,EACA,KAAO,KAAO,CACZ,GAAG,EACH,mBAAoB,MAAM,EAA2B,EAAQ,EAAS,CACpE,UAAW,EAAE,GACb,gBAAiB,GAClB,CAAC,CACH,EACD,CAAE,YAAa,EAAW,CAC3B,EAGM,IAAI,EAAoB,CAE9B,IACH,EAAU,EAAK,EAAK,IAAK,GAA+B,OAAO,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAC/E,EAAY,EAAW,EAAQ,EAGjC,EAAqB,EAAW,EAAM,EAAQ,CAC9C,GAAY,EAAK,OACjB,GAAiB,EAAK,OACtB,EAAY,OAAO,EAAc,EAEpC,CAAC,OACK,EAAK,CACZ,IAAM,EAAU,aAAe,MAAQ,EAAI,QAAU,OAAO,EAAI,CAChE,EAAO,MACL,EAAO,IACL,SAAS,EAAE,WACT,EAAM,gBAAgB,aAAa,EAAI,QACxC,KAAK,EAAM,iBAAiB,aAAa,EAAI,MAAM,KAAK,IAC1D,CACF,CACD,EAAa,KAAK,CAChB,MAAO,EACP,eAAgB,EAAM,eACtB,gBAAiB,EAAM,gBACvB,MAAO,EACR,CAAC,CAOJ,OAJK,GACH,EAAY,EAAW,EAAE,CAAC,CAGrB,GAET,CAAE,YAAa,EAAY,EAAc,EAAG,CAC7C,CAED,EAAY,MAAM,CAClB,IAAM,EAAa,EAAY,QAAQ,EAAG,IAAM,EAAI,EAAG,EAAE,CACnD,GAAW,KAAK,KAAK,CAAG,GAAM,IAEpC,GAAI,EAAa,OAAS,EAAG,CAC3B,EAAO,MACL,EAAO,IACL,KAAK,EAAa,OAAO,mEAE1B,CACF,CACD,IAAK,IAAM,KAAM,EACf,EAAO,MACL,EAAO,IACL,WAAW,EAAG,MAAM,qBAClB,EAAG,gBAAgB,aAAa,EAAI,GACrC,qBAAqB,EAAG,iBAAiB,aAAa,EAAI,KAC5D,CACF,CAQL,OAJA,EAAO,KACL,EAAO,MAAM,YAAY,EAAW,eAAe,EAAU,OAAO,cAAc,EAAQ,GAAG,CAC9F,CAEM,CAAE,YAAW,aAAY"}
@@ -1,232 +0,0 @@
1
- import{t as e}from"./logger-B-LXIf3U.mjs";import{n as t,t as n}from"./bluebird-CUitXgsY.mjs";import{t as r}from"./makeGraphQLRequest-G078PsEL.mjs";import{chunk as i,keyBy as a,uniq as o,uniqBy as s}from"lodash-es";import c from"colors";import{gql as l}from"graphql-request";const u=l`
2
- query TranscendCliRepositories($first: Int!, $offset: Int!, $input: RepositoryFiltersInput) {
3
- repositories(
4
- first: $first
5
- offset: $offset
6
- filterBy: $input
7
- orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]
8
- ) {
9
- nodes {
10
- id
11
- name
12
- description
13
- url
14
- teams {
15
- id
16
- name
17
- }
18
- owners {
19
- id
20
- email
21
- }
22
- }
23
- }
24
- }
25
- `,d=l`
26
- mutation TranscendCliUpdateRepositories($input: UpdateRepositoriesInput!) {
27
- updateRepositories(input: $input) {
28
- clientMutationId
29
- repositories {
30
- id
31
- name
32
- url
33
- teams {
34
- id
35
- name
36
- }
37
- owners {
38
- id
39
- email
40
- }
41
- }
42
- }
43
- }
44
- `,f=l`
45
- mutation TranscendCliCreateRepository($input: CreateRepositoryInput!) {
46
- createRepository(input: $input) {
47
- clientMutationId
48
- repository {
49
- id
50
- name
51
- url
52
- teams {
53
- id
54
- name
55
- }
56
- owners {
57
- id
58
- email
59
- }
60
- }
61
- }
62
- }
63
- `,p=l`
64
- query TranscendCliSoftwareDevelopmentKits(
65
- $first: Int!
66
- $offset: Int!
67
- $input: SoftwareDevelopmentKitFiltersInput
68
- ) {
69
- softwareDevelopmentKits(
70
- first: $first
71
- offset: $offset
72
- filterBy: $input
73
- orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]
74
- ) {
75
- nodes {
76
- id
77
- name
78
- description
79
- codePackageType
80
- documentationLinks
81
- repositoryUrl
82
- teams {
83
- id
84
- name
85
- }
86
- owners {
87
- id
88
- email
89
- }
90
- }
91
- }
92
- }
93
- `,m=l`
94
- mutation TranscendCliUpdateSoftwareDevelopmentKits($input: UpdateSoftwareDevelopmentKitsInput!) {
95
- updateSoftwareDevelopmentKits(input: $input) {
96
- clientMutationId
97
- softwareDevelopmentKits {
98
- id
99
- name
100
- description
101
- codePackageType
102
- documentationLinks
103
- repositoryUrl
104
- teams {
105
- id
106
- name
107
- }
108
- owners {
109
- id
110
- email
111
- }
112
- }
113
- }
114
- }
115
- `,h=l`
116
- mutation TranscendCliCreateSoftwareDevelopmentKit($input: CreateSoftwareDevelopmentKitInput!) {
117
- createSoftwareDevelopmentKit(input: $input) {
118
- clientMutationId
119
- softwareDevelopmentKit {
120
- id
121
- name
122
- description
123
- codePackageType
124
- documentationLinks
125
- repositoryUrl
126
- teams {
127
- id
128
- name
129
- }
130
- owners {
131
- id
132
- email
133
- }
134
- }
135
- }
136
- }
137
- `,g=l`
138
- query TranscendCliCodePackages($first: Int!, $offset: Int!, $input: CodePackageFiltersInput) {
139
- codePackages(
140
- first: $first
141
- offset: $offset
142
- filterBy: $input
143
- orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]
144
- ) {
145
- nodes {
146
- id
147
- name
148
- description
149
- type
150
- relativePath
151
- teams {
152
- id
153
- name
154
- }
155
- owners {
156
- id
157
- email
158
- }
159
- repository {
160
- id
161
- name
162
- }
163
- dataSilo {
164
- id
165
- title
166
- type
167
- }
168
- }
169
- }
170
- }
171
- `,_=l`
172
- mutation TranscendCliUpdateCodePackages($input: UpdateCodePackagesInput!) {
173
- updateCodePackages(input: $input) {
174
- clientMutationId
175
- codePackages {
176
- id
177
- name
178
- description
179
- type
180
- relativePath
181
- teams {
182
- id
183
- name
184
- }
185
- owners {
186
- id
187
- email
188
- }
189
- repository {
190
- id
191
- name
192
- }
193
- dataSilo {
194
- id
195
- title
196
- type
197
- }
198
- }
199
- }
200
- }
201
- `,v=l`
202
- mutation TranscendCliCreateCodePackage($input: CreateCodePackageInput!) {
203
- createCodePackage(input: $input) {
204
- clientMutationId
205
- codePackage {
206
- id
207
- name
208
- description
209
- type
210
- relativePath
211
- teams {
212
- id
213
- name
214
- }
215
- owners {
216
- id
217
- email
218
- }
219
- repository {
220
- id
221
- name
222
- }
223
- dataSilo {
224
- id
225
- title
226
- type
227
- }
228
- }
229
- }
230
- }
231
- `;async function y(e){let t=[],n=0,i=!1;do{let{codePackages:{nodes:a}}=await r(e,g,{first:20,offset:n});t.push(...a),n+=20,i=a.length===20}while(i);return t.sort((e,t)=>e.name.localeCompare(t.name))}async function b(e){let t=[],n=0,i=!1;do{let{repositories:{nodes:a}}=await r(e,u,{first:20,offset:n});t.push(...a),n+=20,i=a.length===20}while(i);return t.sort((e,t)=>e.name.localeCompare(t.name))}async function x(t,n){let{createRepository:{repository:i}}=await r(t,f,{input:n});return e.info(c.green(`Successfully created repository "${n.name}"!`)),i}async function S(t,n){let{updateRepositories:{repositories:i}}=await r(t,d,{input:{repositories:n}});return e.info(c.green(`Successfully updated ${n.length} repositories!`)),i}async function C(r,o,s=20){let l=!1,u=[],d=a(await b(r),`name`),f=o.map(e=>[e,d[e.name]?.id]),p=f.filter(([,e])=>!e).map(([e])=>e);try{e.info(c.magenta(`Creating "${p.length}" new repositories...`)),await n(p,async e=>{let t=await x(r,e);u.push(t)},{concurrency:s}),e.info(c.green(`Successfully synced ${p.length} repositories!`))}catch(t){l=!0,e.info(c.red(`Failed to create repositories! - ${t.message}`))}let m=f.filter(e=>!!e[1]),h=i(m,100);return e.info(c.magenta(`Updating "${m.length}" repositories...`)),await t(h,async t=>{try{let n=await S(r,t.map(([e,t])=>({...e,id:t})));u.push(...n),e.info(c.green(`Successfully updated "${m.length}" repositories!`))}catch(t){l=!0,e.info(c.red(`Failed to update repositories! - ${t.message}`))}e.info(c.green(`Synced "${o.length}" repositories!`))}),{repositories:u,success:!l}}async function w(e){let t=[],n=0,i=!1;do{let{softwareDevelopmentKits:{nodes:a}}=await r(e,p,{first:20,offset:n});t.push(...a),n+=20,i=a.length===20}while(i);return t.sort((e,t)=>e.name.localeCompare(t.name))}async function T(t,n){let{createSoftwareDevelopmentKit:{softwareDevelopmentKit:i}}=await r(t,h,{input:n});return e.info(c.green(`Successfully created software development kit "${n.name}"!`)),i}async function E(t,n){let{updateSoftwareDevelopmentKits:{softwareDevelopmentKits:i}}=await r(t,m,{input:{softwareDevelopmentKits:n}});return e.info(c.green(`Successfully updated ${n.length} software development kits!`)),i}async function D(r,o,s=20){let l=!1,u=[];e.info(c.magenta(`Syncing software development kits...`));let d=a(await w(r),({name:e,codePackageType:t})=>JSON.stringify({name:e,codePackageType:t})),f=o.map(e=>[e,d[JSON.stringify({name:e.name,codePackageType:e.codePackageType})]?.id]),p=f.filter(([,e])=>!e).map(([e])=>e);try{e.info(c.magenta(`Creating "${p.length}" new software development kits...`)),await n(p,async e=>{let t=await T(r,e);u.push(t)},{concurrency:s}),e.info(c.green(`Successfully synced ${p.length} software development kits!`))}catch(t){l=!0,e.info(c.red(`Failed to create software development kits! - ${t.message}`))}let m=f.filter(e=>!!e[1]),h=i(m,100);return e.info(c.magenta(`Updating "${m.length}" software development kits...`)),await t(h,async t=>{try{let n=await E(r,t.map(([{codePackageType:e,...t},n])=>({...t,id:n})));u.push(...n),e.info(c.green(`Successfully updated "${m.length}" software development kits!`))}catch(t){l=!0,e.info(c.red(`Failed to update software development kits! - ${t.message}`))}e.info(c.green(`Synced "${o.length}" software development kits!`))}),{softwareDevelopmentKits:u,success:!l}}const O=`%%%%`;async function k(t,n){let{createCodePackage:{codePackage:i}}=await r(t,v,{input:n});return e.info(c.green(`Successfully created code package "${n.name}"!`)),i}async function A(t,n){let{updateCodePackages:{codePackages:i}}=await r(t,_,{input:{codePackages:n}});return e.info(c.green(`Successfully updated ${n.length} code packages!`)),i}async function j(r,l,u=20){let d=!1,[f,{softwareDevelopmentKits:p}]=await Promise.all([y(r),D(r,s(l.map(({type:e,softwareDevelopmentKits:t=[]})=>t.map(({name:t})=>({name:t,codePackageType:e}))).flat(),({name:e,codePackageType:t})=>`${e}${O}${t}`),u),C(r,s(l,`repositoryName`).map(({repositoryName:e})=>({name:e,url:`https://github.com/${e}`})))]),m=a(p,({name:e,codePackageType:t})=>`${e}${O}${t}`),h=a(f,({name:e,type:t})=>`${e}${O}${t}`),g=l.map(e=>[e,h[`${e.name}${O}${e.type}`]?.id]),_=g.filter(([,e])=>!e).map(([e])=>e);try{e.info(c.magenta(`Creating "${_.length}" new code packages...`)),await n(_,async({softwareDevelopmentKits:e,...t})=>{await k(r,{...t,...e?{softwareDevelopmentKitIds:o(e.map(({name:e})=>{let n=m[`${e}${O}${t.type}`];if(!n)throw Error(`Failed to find SDK with name: "${e}"`);return n.id}))}:{}})},{concurrency:u}),e.info(c.green(`Successfully synced ${_.length} code packages!`))}catch(t){d=!0,e.info(c.red(`Failed to create code packages! - ${t.message}`))}let v=g.filter(e=>!!e[1]);return e.info(c.magenta(`Updating "${v.length}" code packages...`)),await t(i(v,100),async t=>{try{await A(r,t.map(([{softwareDevelopmentKits:e,repositoryName:t,...n},r])=>({...n,...e?{softwareDevelopmentKitIds:o(e.map(({name:e})=>{let t=m[`${e}${O}${n.type}`];if(!t)throw Error(`Failed to find SDK with name: "${e}"`);return t.id}))}:{},id:r}))),e.info(c.green(`Successfully updated "${t.length}" code packages!`))}catch(t){d=!0,e.info(c.red(`Failed to update code packages! - ${t.message}`))}}),e.info(c.green(`Synced "${l.length}" code packages!`)),!d}export{u as _,D as a,C as c,v as d,_ as f,f as g,m as h,T as i,S as l,p as m,j as n,E as o,h as p,A as r,x as s,k as t,g as u,d as v};
232
- //# sourceMappingURL=syncCodePackages-BHgjfXCI.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"syncCodePackages-BHgjfXCI.mjs","names":["PAGE_SIZE","PAGE_SIZE","CHUNK_SIZE","CHUNK_SIZE"],"sources":["../src/lib/graphql/gqls/repository.ts","../src/lib/graphql/gqls/softwareDevelopmentKit.ts","../src/lib/graphql/gqls/codePackage.ts","../src/lib/graphql/fetchAllCodePackages.ts","../src/lib/graphql/fetchAllRepositories.ts","../src/lib/graphql/syncRepositories.ts","../src/lib/graphql/fetchAllSoftwareDevelopmentKits.ts","../src/lib/graphql/syncSoftwareDevelopmentKits.ts","../src/lib/graphql/syncCodePackages.ts"],"sourcesContent":["import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\nexport const REPOSITORIES = gql`\n query TranscendCliRepositories($first: Int!, $offset: Int!, $input: RepositoryFiltersInput) {\n repositories(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]\n ) {\n nodes {\n id\n name\n description\n url\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const UPDATE_REPOSITORIES = gql`\n mutation TranscendCliUpdateRepositories($input: UpdateRepositoriesInput!) {\n updateRepositories(input: $input) {\n clientMutationId\n repositories {\n id\n name\n url\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const CREATE_REPOSITORY = gql`\n mutation TranscendCliCreateRepository($input: CreateRepositoryInput!) {\n createRepository(input: $input) {\n clientMutationId\n repository {\n id\n name\n url\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\nexport const SOFTWARE_DEVELOPMENT_KITS = gql`\n query TranscendCliSoftwareDevelopmentKits(\n $first: Int!\n $offset: Int!\n $input: SoftwareDevelopmentKitFiltersInput\n ) {\n softwareDevelopmentKits(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]\n ) {\n nodes {\n id\n name\n description\n codePackageType\n documentationLinks\n repositoryUrl\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const UPDATE_SOFTWARE_DEVELOPMENT_KITS = gql`\n mutation TranscendCliUpdateSoftwareDevelopmentKits($input: UpdateSoftwareDevelopmentKitsInput!) {\n updateSoftwareDevelopmentKits(input: $input) {\n clientMutationId\n softwareDevelopmentKits {\n id\n name\n description\n codePackageType\n documentationLinks\n repositoryUrl\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n\nexport const CREATE_SOFTWARE_DEVELOPMENT_KIT = gql`\n mutation TranscendCliCreateSoftwareDevelopmentKit($input: CreateSoftwareDevelopmentKitInput!) {\n createSoftwareDevelopmentKit(input: $input) {\n clientMutationId\n softwareDevelopmentKit {\n id\n name\n description\n codePackageType\n documentationLinks\n repositoryUrl\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\nexport const CODE_PACKAGES = gql`\n query TranscendCliCodePackages($first: Int!, $offset: Int!, $input: CodePackageFiltersInput) {\n codePackages(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [{ field: createdAt, direction: ASC }, { field: name, direction: ASC }]\n ) {\n nodes {\n id\n name\n description\n type\n relativePath\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n repository {\n id\n name\n }\n dataSilo {\n id\n title\n type\n }\n }\n }\n }\n`;\n\nexport const UPDATE_CODE_PACKAGES = gql`\n mutation TranscendCliUpdateCodePackages($input: UpdateCodePackagesInput!) {\n updateCodePackages(input: $input) {\n clientMutationId\n codePackages {\n id\n name\n description\n type\n relativePath\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n repository {\n id\n name\n }\n dataSilo {\n id\n title\n type\n }\n }\n }\n }\n`;\n\nexport const CREATE_CODE_PACKAGE = gql`\n mutation TranscendCliCreateCodePackage($input: CreateCodePackageInput!) {\n createCodePackage(input: $input) {\n clientMutationId\n codePackage {\n id\n name\n description\n type\n relativePath\n teams {\n id\n name\n }\n owners {\n id\n email\n }\n repository {\n id\n name\n }\n dataSilo {\n id\n title\n type\n }\n }\n }\n }\n`;\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport { GraphQLClient } from 'graphql-request';\n\nimport { CODE_PACKAGES } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nexport interface CodePackage {\n /** ID of code package */\n id: string;\n /** Name of code package */\n name: string;\n /** Description of code package */\n description: string;\n /** Type of code package */\n type: CodePackageType;\n /** Relative path to code package in repository */\n relativePath: string;\n /** The teams that manage the code package */\n teams: {\n /** ID of team */\n id: string;\n /** Name of team */\n name: string;\n }[];\n /** The users that manage the code package */\n owners: {\n /** ID of user */\n id: string;\n /** Email of user */\n email: string;\n }[];\n /** The repository where the code package belongs */\n repository: {\n /** ID of repository */\n id: string;\n /** Name of repository */\n name: string;\n };\n /** The data silo that the code package relates to */\n dataSilo?: {\n /** ID of repository */\n id: string;\n /** Title of repository */\n title: string;\n /** Type of data silo */\n type: string;\n };\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all code packages in the organization\n *\n * @param client - GraphQL client\n * @returns All code packages in the organization\n */\nexport async function fetchAllCodePackages(client: GraphQLClient): Promise<CodePackage[]> {\n const codePackages: CodePackage[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n codePackages: { nodes },\n } = await makeGraphQLRequest<{\n /** Code packages */\n codePackages: {\n /** List */\n nodes: CodePackage[];\n };\n }>(client, CODE_PACKAGES, {\n first: PAGE_SIZE,\n offset,\n });\n codePackages.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return codePackages.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { GraphQLClient } from 'graphql-request';\n\nimport { REPOSITORIES } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nexport interface Repository {\n /** ID of repository */\n id: string;\n /** Name of repository */\n name: string;\n /** Description of repository */\n description: string;\n /** URL of repo */\n url: string;\n /** The teams that manage the repository */\n teams: {\n /** ID of team */\n id: string;\n /** Name of team */\n name: string;\n }[];\n /** The users that manage the repository */\n owners: {\n /** ID of user */\n id: string;\n /** Email of user */\n email: string;\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all repositories in the organization\n *\n * @param client - GraphQL client\n * @returns All repositories in the organization\n */\nexport async function fetchAllRepositories(client: GraphQLClient): Promise<Repository[]> {\n const repositories: Repository[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n repositories: { nodes },\n } = await makeGraphQLRequest<{\n /** Repositories */\n repositories: {\n /** List */\n nodes: Repository[];\n };\n }>(client, REPOSITORIES, {\n first: PAGE_SIZE,\n offset,\n });\n repositories.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return repositories.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk, keyBy } from 'lodash-es';\n\nimport { RepositoryInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries, map } from '../bluebird.js';\nimport { fetchAllRepositories, Repository } from './fetchAllRepositories.js';\nimport { UPDATE_REPOSITORIES, CREATE_REPOSITORY } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nconst CHUNK_SIZE = 100;\n\n/**\n * Create a new repository\n *\n * @param client - GraphQL client\n * @param input - Repository input\n * @returns Created repository\n */\nexport async function createRepository(\n client: GraphQLClient,\n input: {\n /** Title of repository */\n name: string;\n /** Description of the repository */\n description?: string;\n /** Github repository */\n url: string;\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n },\n): Promise<Repository> {\n const {\n createRepository: { repository },\n } = await makeGraphQLRequest<{\n /** createRepository mutation */\n createRepository: {\n /** Software development kit */\n repository: Repository;\n };\n }>(client, CREATE_REPOSITORY, {\n input,\n });\n logger.info(colors.green(`Successfully created repository \"${input.name}\"!`));\n return repository;\n}\n\n/**\n * Update an existing repository\n *\n * @param client - GraphQL client\n * @param inputs - Repository input\n * @returns Updated repositories\n */\nexport async function updateRepositories(\n client: GraphQLClient,\n inputs: {\n /** ID of repository */\n id: string;\n /** Title of repository */\n name?: string;\n /** Description of the repository */\n description?: string;\n /** Github repository */\n url?: string;\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n }[],\n): Promise<Repository[]> {\n const {\n updateRepositories: { repositories },\n } = await makeGraphQLRequest<{\n /** updateRepositories mutation */\n updateRepositories: {\n /** Software development kit */\n repositories: Repository[];\n };\n }>(client, UPDATE_REPOSITORIES, {\n input: {\n repositories: inputs,\n },\n });\n logger.info(colors.green(`Successfully updated ${inputs.length} repositories!`));\n return repositories;\n}\n\n/**\n * Sync the repositories\n *\n * @param client - GraphQL client\n * @param repositories - Repositories\n * @param concurrency - Concurrency\n * @returns The repositories that were upserted and whether the sync was successful\n */\nexport async function syncRepositories(\n client: GraphQLClient,\n repositories: RepositoryInput[],\n concurrency = 20,\n): Promise<{\n /** The repositories that were upserted */\n repositories: Repository[];\n /** If successful */\n success: boolean;\n}> {\n let encounteredError = false;\n const repos: Repository[] = [];\n\n // Index existing repositories\n const existing = await fetchAllRepositories(client);\n const repositoryByName = keyBy(existing, 'name');\n\n // Determine which repositories are new vs existing\n const mapRepositoriesToExisting = repositories.map((repoInput) => [\n repoInput,\n repositoryByName[repoInput.name]?.id,\n ]);\n\n // Create the new repositories\n const newRepositories = mapRepositoriesToExisting\n .filter(([, existing]) => !existing)\n .map(([repoInput]) => repoInput as RepositoryInput);\n try {\n logger.info(colors.magenta(`Creating \"${newRepositories.length}\" new repositories...`));\n await map(\n newRepositories,\n async (repo) => {\n const newRepo = await createRepository(client, repo);\n repos.push(newRepo);\n },\n {\n concurrency,\n },\n );\n logger.info(colors.green(`Successfully synced ${newRepositories.length} repositories!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create repositories! - ${err.message}`));\n }\n\n // Update existing repositories\n const existingRepositories = mapRepositoriesToExisting.filter(\n (x): x is [RepositoryInput, string] => !!x[1],\n );\n const chunks = chunk(existingRepositories, CHUNK_SIZE);\n logger.info(colors.magenta(`Updating \"${existingRepositories.length}\" repositories...`));\n\n await mapSeries(chunks, async (chunk) => {\n try {\n const updatedRepos = await updateRepositories(\n client,\n chunk.map(([input, id]) => ({\n ...input,\n id,\n })),\n );\n repos.push(...updatedRepos);\n logger.info(\n colors.green(`Successfully updated \"${existingRepositories.length}\" repositories!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to update repositories! - ${err.message}`));\n }\n\n logger.info(colors.green(`Synced \"${repositories.length}\" repositories!`));\n });\n\n // Return true upon success\n return {\n repositories: repos,\n success: !encounteredError,\n };\n}\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport { GraphQLClient } from 'graphql-request';\n\nimport { SOFTWARE_DEVELOPMENT_KITS } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nexport interface SoftwareDevelopmentKit {\n /** ID of software development kit */\n id: string;\n /** Name of software development kit */\n name: string;\n /** Description of software development kit */\n description: string;\n /** Type of software development kit */\n codePackageType: CodePackageType;\n /** Related documentation */\n documentationLinks: string[];\n /** Link to git repository */\n repositoryUrl?: string;\n /** The teams that manage the software development kit */\n teams: {\n /** ID of team */\n id: string;\n /** Name of team */\n name: string;\n }[];\n /** The users that manage the software development kit */\n owners: {\n /** ID of user */\n id: string;\n /** Email of user */\n email: string;\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all software development kits in the organization\n *\n * @param client - GraphQL client\n * @returns All software development kits in the organization\n */\nexport async function fetchAllSoftwareDevelopmentKits(\n client: GraphQLClient,\n): Promise<SoftwareDevelopmentKit[]> {\n const softwareDevelopmentKits: SoftwareDevelopmentKit[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n softwareDevelopmentKits: { nodes },\n } = await makeGraphQLRequest<{\n /** Software development kits */\n softwareDevelopmentKits: {\n /** List */\n nodes: SoftwareDevelopmentKit[];\n };\n }>(client, SOFTWARE_DEVELOPMENT_KITS, {\n first: PAGE_SIZE,\n offset,\n });\n softwareDevelopmentKits.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return softwareDevelopmentKits.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk, keyBy } from 'lodash-es';\n\nimport { SoftwareDevelopmentKitInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries, map } from '../bluebird.js';\nimport {\n fetchAllSoftwareDevelopmentKits,\n SoftwareDevelopmentKit,\n} from './fetchAllSoftwareDevelopmentKits.js';\nimport { UPDATE_SOFTWARE_DEVELOPMENT_KITS, CREATE_SOFTWARE_DEVELOPMENT_KIT } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nconst CHUNK_SIZE = 100;\n\n/**\n * Create a new software development kit\n *\n * @param client - GraphQL client\n * @param input - Software development kit input\n * @returns Created software development kit\n */\nexport async function createSoftwareDevelopmentKit(\n client: GraphQLClient,\n input: {\n /** Title of software development kit */\n name: string;\n /** Code package type */\n codePackageType: CodePackageType;\n /** Description of the SDK */\n description?: string;\n /** Github repository */\n repositoryUrl?: string;\n /** Integration name */\n catalogIntegrationName?: string;\n /** Doc links */\n documentationLinks?: string[];\n /** Code package IDs */\n codePackageIds?: string[];\n /** Code package names */\n codePackageNames?: string[];\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n },\n): Promise<SoftwareDevelopmentKit> {\n const {\n createSoftwareDevelopmentKit: { softwareDevelopmentKit },\n } = await makeGraphQLRequest<{\n /** createSoftwareDevelopmentKit mutation */\n createSoftwareDevelopmentKit: {\n /** Software development kit */\n softwareDevelopmentKit: SoftwareDevelopmentKit;\n };\n }>(client, CREATE_SOFTWARE_DEVELOPMENT_KIT, {\n input,\n });\n logger.info(colors.green(`Successfully created software development kit \"${input.name}\"!`));\n return softwareDevelopmentKit;\n}\n\n/**\n * Update an existing software development kit\n *\n * @param client - GraphQL client\n * @param inputs - Software development kit input\n * @returns Updated software development kits\n */\nexport async function updateSoftwareDevelopmentKits(\n client: GraphQLClient,\n inputs: {\n /** ID of software development kit */\n id: string;\n /** Title of software development kit */\n name?: string;\n /** Description of the SDK */\n description?: string;\n /** Github repository */\n repositoryUrl?: string;\n /** Integration name */\n catalogIntegrationName?: string;\n /** Doc links */\n documentationLinks?: string[];\n /** Code package IDs */\n codePackageIds?: string[];\n /** Code package names */\n codePackageNames?: string[];\n /** User IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** Team IDs */\n teamIds?: string[];\n /** Team names */\n teamNames?: string[];\n }[],\n): Promise<SoftwareDevelopmentKit[]> {\n const {\n updateSoftwareDevelopmentKits: { softwareDevelopmentKits },\n } = await makeGraphQLRequest<{\n /** updateSoftwareDevelopmentKits mutation */\n updateSoftwareDevelopmentKits: {\n /** Software development kit */\n softwareDevelopmentKits: SoftwareDevelopmentKit[];\n };\n }>(client, UPDATE_SOFTWARE_DEVELOPMENT_KITS, {\n input: {\n softwareDevelopmentKits: inputs,\n },\n });\n logger.info(colors.green(`Successfully updated ${inputs.length} software development kits!`));\n return softwareDevelopmentKits;\n}\n\n/**\n * Sync the software development kits\n *\n * @param client - GraphQL client\n * @param softwareDevelopmentKits - Software development kits\n * @param concurrency - Concurrency\n * @returns The software development kits that were upserted and whether the sync was successful\n */\nexport async function syncSoftwareDevelopmentKits(\n client: GraphQLClient,\n softwareDevelopmentKits: SoftwareDevelopmentKitInput[],\n concurrency = 20,\n): Promise<{\n /** The SDKs that were upserted */\n softwareDevelopmentKits: SoftwareDevelopmentKit[];\n /** If successful */\n success: boolean;\n}> {\n let encounteredError = false;\n const sdks: SoftwareDevelopmentKit[] = [];\n logger.info(colors.magenta('Syncing software development kits...'));\n\n // Index existing software development kits\n const existing = await fetchAllSoftwareDevelopmentKits(client);\n const softwareDevelopmentKitByTitle = keyBy(existing, ({ name, codePackageType }) =>\n JSON.stringify({ name, codePackageType }),\n );\n\n // Determine which software development kits are new vs existing\n const mapSoftwareDevelopmentKitsToExisting = softwareDevelopmentKits.map((sdkInput) => [\n sdkInput,\n softwareDevelopmentKitByTitle[\n JSON.stringify({\n name: sdkInput.name,\n codePackageType: sdkInput.codePackageType,\n })\n ]?.id,\n ]);\n\n // Create the new software development kits\n const newSoftwareDevelopmentKits = mapSoftwareDevelopmentKitsToExisting\n .filter(([, existing]) => !existing)\n .map(([sdkInput]) => sdkInput as SoftwareDevelopmentKitInput);\n try {\n logger.info(\n colors.magenta(\n `Creating \"${newSoftwareDevelopmentKits.length}\" new software development kits...`,\n ),\n );\n await map(\n newSoftwareDevelopmentKits,\n async (sdk) => {\n const newSdk = await createSoftwareDevelopmentKit(client, sdk);\n sdks.push(newSdk);\n },\n {\n concurrency,\n },\n );\n logger.info(\n colors.green(\n `Successfully synced ${newSoftwareDevelopmentKits.length} software development kits!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create software development kits! - ${err.message}`));\n }\n\n // Update existing software development kits\n const existingSoftwareDevelopmentKits = mapSoftwareDevelopmentKitsToExisting.filter(\n (x): x is [SoftwareDevelopmentKitInput, string] => !!x[1],\n );\n const chunks = chunk(existingSoftwareDevelopmentKits, CHUNK_SIZE);\n logger.info(\n colors.magenta(\n `Updating \"${existingSoftwareDevelopmentKits.length}\" software development kits...`,\n ),\n );\n\n await mapSeries(chunks, async (chunk) => {\n try {\n const updatedSdks = await updateSoftwareDevelopmentKits(\n client,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n chunk.map(([{ codePackageType, ...input }, id]) => ({\n ...input,\n id,\n })),\n );\n sdks.push(...updatedSdks);\n logger.info(\n colors.green(\n `Successfully updated \"${existingSoftwareDevelopmentKits.length}\" software development kits!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to update software development kits! - ${err.message}`));\n }\n\n logger.info(\n colors.green(`Synced \"${softwareDevelopmentKits.length}\" software development kits!`),\n );\n });\n\n // Return true upon success\n return {\n softwareDevelopmentKits: sdks,\n success: !encounteredError,\n };\n}\n","import { CodePackageType } from '@transcend-io/privacy-types';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk, uniq, keyBy, uniqBy } from 'lodash-es';\n\nimport { CodePackageInput, RepositoryInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { map, mapSeries } from '../bluebird.js';\nimport { CodePackage, fetchAllCodePackages } from './fetchAllCodePackages.js';\nimport { CREATE_CODE_PACKAGE, UPDATE_CODE_PACKAGES } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\nimport { syncRepositories } from './syncRepositories.js';\nimport { syncSoftwareDevelopmentKits } from './syncSoftwareDevelopmentKits.js';\n\nconst CHUNK_SIZE = 100;\n\nconst LOOKUP_SPLIT_KEY = '%%%%';\n\n/**\n * Create a new code package\n *\n * @param client - GraphQL client\n * @param input - Code package input\n * @returns Code package ID\n */\nexport async function createCodePackage(\n client: GraphQLClient,\n input: {\n /** Name of package */\n name: string;\n /** Description of package */\n description?: string;\n /** Type of package */\n type: CodePackageType;\n /** Relative path to package */\n relativePath: string;\n /** Repository ID */\n repositoryId?: string;\n /** Name of repository */\n repositoryName?: string;\n /** IDs of SDKs */\n softwareDevelopmentKitIds?: string[];\n /** IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** IDs of teams */\n teamIds?: string[];\n /** Names of teams */\n teamNames?: string[];\n },\n): Promise<CodePackage> {\n const {\n createCodePackage: { codePackage },\n } = await makeGraphQLRequest<{\n /** createCodePackage mutation */\n createCodePackage: {\n /** Code package */\n codePackage: CodePackage;\n };\n }>(client, CREATE_CODE_PACKAGE, {\n input,\n });\n logger.info(colors.green(`Successfully created code package \"${input.name}\"!`));\n return codePackage;\n}\n\n/**\n * Update an existing code package\n *\n * @param client - GraphQL client\n * @param inputs - Code package input\n * @returns Code packages that were updated\n */\nexport async function updateCodePackages(\n client: GraphQLClient,\n inputs: {\n /** ID of code package */\n id: string;\n /** Name of package */\n name: string;\n /** Description of package */\n description?: string;\n /** Type of package */\n type: CodePackageType;\n /** Relative path to package */\n relativePath: string;\n /** Repository ID */\n repositoryId?: string;\n /** Name of repository */\n repositoryName?: string;\n /** IDs of SDKs */\n softwareDevelopmentKitIds?: string[];\n /** IDs of owners */\n ownerIds?: string[];\n /** Emails of owners */\n ownerEmails?: string[];\n /** IDs of teams */\n teamIds?: string[];\n /** Names of teams */\n teamNames?: string[];\n }[],\n): Promise<CodePackage[]> {\n const {\n updateCodePackages: { codePackages },\n } = await makeGraphQLRequest<{\n /** updateCodePackages mutation */\n updateCodePackages: {\n /** Code packages */\n codePackages: CodePackage[];\n };\n }>(client, UPDATE_CODE_PACKAGES, {\n input: {\n codePackages: inputs,\n },\n });\n logger.info(colors.green(`Successfully updated ${inputs.length} code packages!`));\n return codePackages;\n}\n\n/**\n * Uploads silo discovery results for Transcend to classify\n *\n * @param client - GraphQL Client\n * @param codePackages - Packages to upload\n * @param concurrency - How many concurrent requests to make\n * @returns True if successful, false if any updates failed, or an error occurs\n */\nexport async function syncCodePackages(\n client: GraphQLClient,\n codePackages: CodePackageInput[],\n concurrency = 20,\n): Promise<boolean> {\n let encounteredError = false;\n const [existingCodePackages, { softwareDevelopmentKits: existingSoftwareDevelopmentKits }] =\n await Promise.all([\n // fetch all code packages\n fetchAllCodePackages(client),\n // make sure all SDKs exist\n syncSoftwareDevelopmentKits(\n client,\n uniqBy(\n codePackages\n .map(({ type, softwareDevelopmentKits = [] }) =>\n softwareDevelopmentKits.map(({ name }) => ({\n name,\n codePackageType: type,\n })),\n )\n .flat(),\n ({ name, codePackageType }) => `${name}${LOOKUP_SPLIT_KEY}${codePackageType}`,\n ),\n concurrency,\n ),\n // make sure all Repositories exist\n syncRepositories(\n client,\n uniqBy(codePackages, 'repositoryName').map(\n ({ repositoryName }) =>\n ({\n name: repositoryName,\n url: `https://github.com/${repositoryName}`,\n }) as RepositoryInput,\n ),\n ),\n ]);\n\n const softwareDevelopmentKitLookup = keyBy(\n existingSoftwareDevelopmentKits,\n ({ name, codePackageType }) => `${name}${LOOKUP_SPLIT_KEY}${codePackageType}`,\n );\n const codePackagesLookup = keyBy(\n existingCodePackages,\n ({ name, type }) => `${name}${LOOKUP_SPLIT_KEY}${type}`,\n );\n\n // Determine which codePackages are new vs existing\n const mapCodePackagesToExisting = codePackages.map((codePackageInput) => [\n codePackageInput,\n codePackagesLookup[`${codePackageInput.name}${LOOKUP_SPLIT_KEY}${codePackageInput.type}`]?.id,\n ]);\n\n // Create the new codePackages\n const newCodePackages = mapCodePackagesToExisting\n .filter(([, existing]) => !existing)\n .map(([codePackageInput]) => codePackageInput as CodePackageInput);\n try {\n logger.info(colors.magenta(`Creating \"${newCodePackages.length}\" new code packages...`));\n await map(\n newCodePackages,\n async ({ softwareDevelopmentKits, ...codePackage }) => {\n await createCodePackage(client, {\n ...codePackage,\n ...(softwareDevelopmentKits\n ? {\n softwareDevelopmentKitIds: uniq(\n softwareDevelopmentKits.map(({ name }) => {\n const sdk =\n softwareDevelopmentKitLookup[`${name}${LOOKUP_SPLIT_KEY}${codePackage.type}`];\n if (!sdk) {\n throw new Error(`Failed to find SDK with name: \"${name}\"`);\n }\n return sdk.id;\n }),\n ),\n }\n : {}),\n });\n },\n {\n concurrency,\n },\n );\n logger.info(colors.green(`Successfully synced ${newCodePackages.length} code packages!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create code packages! - ${err.message}`));\n }\n\n // Update existing codePackages\n const existingCodePackageInputs = mapCodePackagesToExisting.filter(\n (x): x is [CodePackageInput, string] => !!x[1],\n );\n logger.info(colors.magenta(`Updating \"${existingCodePackageInputs.length}\" code packages...`));\n const chunks = chunk(existingCodePackageInputs, CHUNK_SIZE);\n\n await mapSeries(chunks, async (chunk) => {\n try {\n await updateCodePackages(\n client,\n chunk.map(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ([{ softwareDevelopmentKits, repositoryName, ...input }, id]) => ({\n ...input,\n ...(softwareDevelopmentKits\n ? {\n softwareDevelopmentKitIds: uniq(\n softwareDevelopmentKits.map(({ name }) => {\n const sdk =\n softwareDevelopmentKitLookup[`${name}${LOOKUP_SPLIT_KEY}${input.type}`];\n if (!sdk) {\n throw new Error(`Failed to find SDK with name: \"${name}\"`);\n }\n return sdk.id;\n }),\n ),\n }\n : {}),\n id,\n }),\n ),\n );\n logger.info(colors.green(`Successfully updated \"${chunk.length}\" code packages!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to update code packages! - ${err.message}`));\n }\n });\n\n logger.info(colors.green(`Synced \"${codePackages.length}\" code packages!`));\n return !encounteredError;\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{t as e}from"./logger-B-LXIf3U.mjs";import{n as t}from"./bluebird-CUitXgsY.mjs";import{M as n,a as r}from"./fetchConsentManagerId-DHDA5Py9.mjs";import{t as i}from"./makeGraphQLRequest-G078PsEL.mjs";import{chunk as a}from"lodash-es";import o from"colors";async function s(e,o){let s=await r(e);await t(a(o,100),async t=>{await i(e,n,{airgapBundleId:s,cookies:t.map(e=>({name:e.name,trackingPurposes:e.trackingPurposes&&e.trackingPurposes.length>0?e.trackingPurposes:void 0,description:e.description,service:e.service,status:e.status,attributes:e.attributes,isRegex:e.isRegex}))})})}async function c(t,n){let r=!1;e.info(o.magenta(`Syncing "${n.length}" cookies...`));let i=n.filter(e=>n.filter(t=>e.name===t.name&&e.isRegex===t.isRegex).length>1);if(i.length>0)throw Error(`Failed to upload cookies as there were non-unique entries found: ${i.map(({name:e})=>e).join(`,`)}`);try{e.info(o.magenta(`Upserting "${n.length}" new cookies...`)),await s(t,n),e.info(o.green(`Successfully synced ${n.length} cookies!`))}catch(t){r=!0,e.info(o.red(`Failed to create cookies! - ${t.message}`))}return!r}export{s as n,c as t};
2
- //# sourceMappingURL=syncCookies-CiLtxDFf.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"syncCookies-CiLtxDFf.mjs","names":[],"sources":["../src/lib/graphql/syncCookies.ts"],"sourcesContent":["import colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk } from 'lodash-es';\n\nimport { CookieInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries } from '../bluebird.js';\nimport { fetchConsentManagerId } from './fetchConsentManagerId.js';\nimport { UPDATE_OR_CREATE_COOKIES } from './gqls/index.js';\n// import { keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nconst MAX_PAGE_SIZE = 100;\n\n/**\n * Update or create cookies that already existed\n *\n * @param client - GraphQL client\n * @param cookieInputs - List of cookie input\n */\nexport async function updateOrCreateCookies(\n client: GraphQLClient,\n cookieInputs: CookieInput[],\n): Promise<void> {\n const airgapBundleId = await fetchConsentManagerId(client);\n\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // const purposes = await fetchAllPurposes(client);\n // const purposeNameToId = keyBy(purposes, 'name');\n\n await mapSeries(chunk(cookieInputs, MAX_PAGE_SIZE), async (page) => {\n await makeGraphQLRequest(client, UPDATE_OR_CREATE_COOKIES, {\n airgapBundleId,\n cookies: page.map((cookie) => ({\n name: cookie.name,\n trackingPurposes:\n cookie.trackingPurposes && cookie.trackingPurposes.length > 0\n ? cookie.trackingPurposes\n : undefined,\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // purposeIds: cookie.trackingPurposes\n // ? cookie.trackingPurposes\n // .filter((purpose) => purpose !== 'Unknown')\n // .map((purpose) => purposeNameToId[purpose].id)\n // : undefined,\n description: cookie.description,\n service: cookie.service,\n status: cookie.status,\n attributes: cookie.attributes,\n isRegex: cookie.isRegex,\n // TODO: https://transcend.height.app/T-23718\n // owners,\n // teams,\n })),\n });\n });\n}\n\n/**\n * Sync the set of cookies from the YML interface into the product\n *\n * @param client - GraphQL client\n * @param cookies - Cookies to sync\n * @returns True upon success, false upon failure\n */\nexport async function syncCookies(client: GraphQLClient, cookies: CookieInput[]): Promise<boolean> {\n let encounteredError = false;\n logger.info(colors.magenta(`Syncing \"${cookies.length}\" cookies...`));\n\n // Ensure no duplicates are being uploaded\n const notUnique = cookies.filter(\n (cookie) =>\n cookies.filter((cook) => cookie.name === cook.name && cookie.isRegex === cook.isRegex)\n .length > 1,\n );\n if (notUnique.length > 0) {\n throw new Error(\n `Failed to upload cookies as there were non-unique entries found: ${notUnique\n .map(({ name }) => name)\n .join(',')}`,\n );\n }\n\n try {\n logger.info(colors.magenta(`Upserting \"${cookies.length}\" new cookies...`));\n await updateOrCreateCookies(client, cookies);\n logger.info(colors.green(`Successfully synced ${cookies.length} cookies!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create cookies! - ${err.message}`));\n }\n\n return !encounteredError;\n}\n"],"mappings":"oQAoBA,eAAsB,EACpB,EACA,EACe,CACf,IAAM,EAAiB,MAAM,EAAsB,EAAO,CAM1D,MAAM,EAAU,EAAM,EAAc,IAAc,CAAE,KAAO,IAAS,CAClE,MAAM,EAAmB,EAAQ,EAA0B,CACzD,iBACA,QAAS,EAAK,IAAK,IAAY,CAC7B,KAAM,EAAO,KACb,iBACE,EAAO,kBAAoB,EAAO,iBAAiB,OAAS,EACxD,EAAO,iBACP,IAAA,GAON,YAAa,EAAO,YACpB,QAAS,EAAO,QAChB,OAAQ,EAAO,OACf,WAAY,EAAO,WACnB,QAAS,EAAO,QAIjB,EAAE,CACJ,CAAC,EACF,CAUJ,eAAsB,EAAY,EAAuB,EAA0C,CACjG,IAAI,EAAmB,GACvB,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAQ,OAAO,cAAc,CAAC,CAGrE,IAAM,EAAY,EAAQ,OACvB,GACC,EAAQ,OAAQ,GAAS,EAAO,OAAS,EAAK,MAAQ,EAAO,UAAY,EAAK,QAAQ,CACnF,OAAS,EACf,CACD,GAAI,EAAU,OAAS,EACrB,MAAU,MACR,oEAAoE,EACjE,KAAK,CAAE,UAAW,EAAK,CACvB,KAAK,IAAI,GACb,CAGH,GAAI,CACF,EAAO,KAAK,EAAO,QAAQ,cAAc,EAAQ,OAAO,kBAAkB,CAAC,CAC3E,MAAM,EAAsB,EAAQ,EAAQ,CAC5C,EAAO,KAAK,EAAO,MAAM,uBAAuB,EAAQ,OAAO,WAAW,CAAC,OACpE,EAAK,CACZ,EAAmB,GACnB,EAAO,KAAK,EAAO,IAAI,+BAA+B,EAAI,UAAU,CAAC,CAGvE,MAAO,CAAC"}
@@ -1,2 +0,0 @@
1
- import{t as e}from"./logger-B-LXIf3U.mjs";import{n as t}from"./bluebird-CUitXgsY.mjs";import{A as n,a as r,p as i}from"./fetchConsentManagerId-DHDA5Py9.mjs";import{t as a}from"./makeGraphQLRequest-G078PsEL.mjs";import{t as o}from"./fetchAllDataFlows-AQ9j_NRa.mjs";import{ConsentTrackerStatus as s}from"@transcend-io/privacy-types";import{chunk as c}from"lodash-es";import l from"colors";async function u(e,i,o=!1){let s=await r(e);await t(c(i,100),async t=>{await a(e,n,{airgapBundleId:s,dataFlows:t.map(([e,t])=>({id:t,value:e.value,type:e.type,trackingType:e.trackingPurposes&&e.trackingPurposes.length>0?e.trackingPurposes:void 0,description:e.description,service:e.service,status:e.status,attributes:e.attributes})),classifyService:o})})}async function d(e,n,o=!1){let s=await r(e);await t(c(n,100),async t=>{await a(e,i,{airgapBundleId:s,dataFlows:t.map(e=>({value:e.value,type:e.type,trackingType:e.trackingPurposes&&e.trackingPurposes.length>0?e.trackingPurposes:void 0,description:e.description,service:e.service,status:e.status,attributes:e.attributes})),dropMatchingDataFlowsInTriage:!0,classifyService:o})})}async function f(t,n,r){let i=!1;e.info(l.magenta(`Syncing "${n.length}" data flows...`));let a=n.filter(e=>n.filter(t=>e.value===t.value&&e.type===t.type).length>1);if(a.length>0)throw Error(`Failed to upload data flows as there were non-unique entries found: ${a.map(({value:e})=>e).join(`,`)}`);e.info(l.magenta(`Fetching data flows...`));let[c,f]=await Promise.all([o(t,s.Live),o(t,s.NeedsReview)]),p=[...c,...f],m=n.map(e=>[e,p.find(t=>e.value===t.value&&e.type===t.type)?.id]),h=m.filter(([,e])=>!e).map(([e])=>e);try{e.info(l.magenta(`Creating "${h.length}" new data flows...`)),await d(t,h,r),e.info(l.green(`Successfully synced ${h.length} data flows!`))}catch(t){i=!0,e.info(l.red(`Failed to create data flows! - ${t.message}`))}let g=m.filter(e=>!!e[1]);try{e.info(l.magenta(`Updating "${g.length}" data flows...`)),await u(t,g,r),e.info(l.green(`Successfully updated "${g.length}" data flows!`))}catch(t){i=!0,e.info(l.red(`Failed to create data flows! - ${t.message}`))}return e.info(l.green(`Synced "${n.length}" data flows!`)),!i}export{f as n,u as r,d as t};
2
- //# sourceMappingURL=syncDataFlows-DmBUs3G_.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"syncDataFlows-DmBUs3G_.mjs","names":[],"sources":["../src/lib/graphql/syncDataFlows.ts"],"sourcesContent":["import { ConsentTrackerStatus } from '@transcend-io/privacy-types';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { chunk } from 'lodash-es';\n\nimport { DataFlowInput } from '../../codecs.js';\nimport { logger } from '../../logger.js';\nimport { mapSeries } from '../bluebird.js';\nimport { fetchAllDataFlows } from './fetchAllDataFlows.js';\nimport { fetchConsentManagerId } from './fetchConsentManagerId.js';\nimport { CREATE_DATA_FLOWS, UPDATE_DATA_FLOWS } from './gqls/index.js';\nimport { makeGraphQLRequest } from './makeGraphQLRequest.js';\n\nconst MAX_PAGE_SIZE = 100;\n\n/**\n * Update data flows that already existed\n *\n * @param client - GraphQL client\n * @param dataFlowInputs - [DataFlowInput, Data Flow ID] mappings to update\n * @param classifyService - classify service if missing\n */\nexport async function updateDataFlows(\n client: GraphQLClient,\n dataFlowInputs: [DataFlowInput, string][],\n classifyService = false,\n): Promise<void> {\n const airgapBundleId = await fetchConsentManagerId(client);\n\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // const purposes = await fetchAllPurposes(client);\n // const purposeNameToId = keyBy(purposes, 'name');\n\n await mapSeries(chunk(dataFlowInputs, MAX_PAGE_SIZE), async (page) => {\n await makeGraphQLRequest(client, UPDATE_DATA_FLOWS, {\n airgapBundleId,\n dataFlows: page.map(([flow, id]) => ({\n id,\n value: flow.value,\n type: flow.type,\n trackingType:\n flow.trackingPurposes && flow.trackingPurposes.length > 0\n ? flow.trackingPurposes\n : undefined,\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // purposeIds: flow.trackingPurposes\n // ? flow.trackingPurposes\n // .filter((purpose) => purpose !== 'Unknown')\n // .map((purpose) => purposeNameToId[purpose].id)\n // : undefined,\n description: flow.description,\n service: flow.service,\n status: flow.status,\n attributes: flow.attributes,\n // TODO: https://transcend.height.app/T-23718\n // owners,\n // teams,\n })),\n classifyService,\n });\n });\n}\n\n/**\n * Create new data flows\n *\n * @param client - GraphQL client\n * @param dataFlowInputs - List of data flows to create\n * @param classifyService - classify service if missing\n */\nexport async function createDataFlows(\n client: GraphQLClient,\n dataFlowInputs: DataFlowInput[],\n classifyService = false,\n): Promise<void> {\n const airgapBundleId = await fetchConsentManagerId(client);\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // const purposes = await fetchAllPurposes(client);\n // const purposeNameToId = keyBy(purposes, 'name');\n await mapSeries(chunk(dataFlowInputs, MAX_PAGE_SIZE), async (page) => {\n await makeGraphQLRequest(client, CREATE_DATA_FLOWS, {\n airgapBundleId,\n dataFlows: page.map((flow) => ({\n value: flow.value,\n type: flow.type,\n trackingType:\n flow.trackingPurposes && flow.trackingPurposes.length > 0\n ? flow.trackingPurposes\n : undefined,\n // TODO: https://transcend.height.app/T-19841 - add with custom purposes\n // purposeIds: flow.trackingPurposes\n // ? flow.trackingPurposes\n // .filter((purpose) => purpose !== 'Unknown')\n // .map((purpose) => purposeNameToId[purpose].id)\n // : undefined,\n description: flow.description,\n service: flow.service,\n status: flow.status,\n attributes: flow.attributes,\n // TODO: https://transcend.height.app/T-23718\n // owners,\n // teams,\n })),\n dropMatchingDataFlowsInTriage: true,\n classifyService,\n });\n });\n}\n\n/**\n * Sync data flow configurations into Transcend\n *\n * @param client - GraphQL client\n * @param dataFlows - The data flows to upload\n * @param classifyService - When true, auto classify the service based on the data flow value\n * @returns True if the command ran successfully, returns false if an error occurred\n */\nexport async function syncDataFlows(\n client: GraphQLClient,\n dataFlows: DataFlowInput[],\n classifyService: boolean,\n): Promise<boolean> {\n let encounteredError = false;\n logger.info(colors.magenta(`Syncing \"${dataFlows.length}\" data flows...`));\n\n // Ensure no duplicates are being uploaded\n // De-dupe the data flows based on [value, type]\n const notUnique = dataFlows.filter(\n (dataFlow) =>\n dataFlows.filter((flow) => dataFlow.value === flow.value && dataFlow.type === flow.type)\n .length > 1,\n );\n\n // Throw error to prompt user to de-dupe before uploading\n if (notUnique.length > 0) {\n throw new Error(\n `Failed to upload data flows as there were non-unique entries found: ${notUnique\n .map(({ value }) => value)\n .join(',')}`,\n );\n }\n\n // Fetch existing data flows to determine whether we are creating a new data flow\n // or updating an existing data flow\n logger.info(colors.magenta('Fetching data flows...'));\n const [existingLiveDataFlows, existingInReviewDataFlows] = await Promise.all([\n fetchAllDataFlows(client, ConsentTrackerStatus.Live),\n fetchAllDataFlows(client, ConsentTrackerStatus.NeedsReview),\n ]);\n const allDataFlows = [...existingLiveDataFlows, ...existingInReviewDataFlows];\n\n // Determine which data flows are new vs existing\n const mapDataFlowsToExisting = dataFlows.map((dataFlow) => [\n dataFlow,\n allDataFlows.find((flow) => dataFlow.value === flow.value && dataFlow.type === flow.type)?.id,\n ]);\n\n // Create the new data flows\n const newDataFlows = mapDataFlowsToExisting\n .filter(([, existing]) => !existing)\n .map(([flow]) => flow as DataFlowInput);\n try {\n logger.info(colors.magenta(`Creating \"${newDataFlows.length}\" new data flows...`));\n await createDataFlows(client, newDataFlows, classifyService);\n logger.info(colors.green(`Successfully synced ${newDataFlows.length} data flows!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create data flows! - ${err.message}`));\n }\n\n // Update existing data flows\n const existingDataFlows = mapDataFlowsToExisting.filter(\n (x): x is [DataFlowInput, string] => !!x[1],\n );\n try {\n logger.info(colors.magenta(`Updating \"${existingDataFlows.length}\" data flows...`));\n await updateDataFlows(client, existingDataFlows, classifyService);\n logger.info(colors.green(`Successfully updated \"${existingDataFlows.length}\" data flows!`));\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create data flows! - ${err.message}`));\n }\n\n logger.info(colors.green(`Synced \"${dataFlows.length}\" data flows!`));\n\n // Return true upon success\n return !encounteredError;\n}\n"],"mappings":"mYAsBA,eAAsB,EACpB,EACA,EACA,EAAkB,GACH,CACf,IAAM,EAAiB,MAAM,EAAsB,EAAO,CAM1D,MAAM,EAAU,EAAM,EAAgB,IAAc,CAAE,KAAO,IAAS,CACpE,MAAM,EAAmB,EAAQ,EAAmB,CAClD,iBACA,UAAW,EAAK,KAAK,CAAC,EAAM,MAAS,CACnC,KACA,MAAO,EAAK,MACZ,KAAM,EAAK,KACX,aACE,EAAK,kBAAoB,EAAK,iBAAiB,OAAS,EACpD,EAAK,iBACL,IAAA,GAON,YAAa,EAAK,YAClB,QAAS,EAAK,QACd,OAAQ,EAAK,OACb,WAAY,EAAK,WAIlB,EAAE,CACH,kBACD,CAAC,EACF,CAUJ,eAAsB,EACpB,EACA,EACA,EAAkB,GACH,CACf,IAAM,EAAiB,MAAM,EAAsB,EAAO,CAI1D,MAAM,EAAU,EAAM,EAAgB,IAAc,CAAE,KAAO,IAAS,CACpE,MAAM,EAAmB,EAAQ,EAAmB,CAClD,iBACA,UAAW,EAAK,IAAK,IAAU,CAC7B,MAAO,EAAK,MACZ,KAAM,EAAK,KACX,aACE,EAAK,kBAAoB,EAAK,iBAAiB,OAAS,EACpD,EAAK,iBACL,IAAA,GAON,YAAa,EAAK,YAClB,QAAS,EAAK,QACd,OAAQ,EAAK,OACb,WAAY,EAAK,WAIlB,EAAE,CACH,8BAA+B,GAC/B,kBACD,CAAC,EACF,CAWJ,eAAsB,EACpB,EACA,EACA,EACkB,CAClB,IAAI,EAAmB,GACvB,EAAO,KAAK,EAAO,QAAQ,YAAY,EAAU,OAAO,iBAAiB,CAAC,CAI1E,IAAM,EAAY,EAAU,OACzB,GACC,EAAU,OAAQ,GAAS,EAAS,QAAU,EAAK,OAAS,EAAS,OAAS,EAAK,KAAK,CACrF,OAAS,EACf,CAGD,GAAI,EAAU,OAAS,EACrB,MAAU,MACR,uEAAuE,EACpE,KAAK,CAAE,WAAY,EAAM,CACzB,KAAK,IAAI,GACb,CAKH,EAAO,KAAK,EAAO,QAAQ,yBAAyB,CAAC,CACrD,GAAM,CAAC,EAAuB,GAA6B,MAAM,QAAQ,IAAI,CAC3E,EAAkB,EAAQ,EAAqB,KAAK,CACpD,EAAkB,EAAQ,EAAqB,YAAY,CAC5D,CAAC,CACI,EAAe,CAAC,GAAG,EAAuB,GAAG,EAA0B,CAGvE,EAAyB,EAAU,IAAK,GAAa,CACzD,EACA,EAAa,KAAM,GAAS,EAAS,QAAU,EAAK,OAAS,EAAS,OAAS,EAAK,KAAK,EAAE,GAC5F,CAAC,CAGI,EAAe,EAClB,QAAQ,EAAG,KAAc,CAAC,EAAS,CACnC,KAAK,CAAC,KAAU,EAAsB,CACzC,GAAI,CACF,EAAO,KAAK,EAAO,QAAQ,aAAa,EAAa,OAAO,qBAAqB,CAAC,CAClF,MAAM,EAAgB,EAAQ,EAAc,EAAgB,CAC5D,EAAO,KAAK,EAAO,MAAM,uBAAuB,EAAa,OAAO,cAAc,CAAC,OAC5E,EAAK,CACZ,EAAmB,GACnB,EAAO,KAAK,EAAO,IAAI,kCAAkC,EAAI,UAAU,CAAC,CAI1E,IAAM,EAAoB,EAAuB,OAC9C,GAAoC,CAAC,CAAC,EAAE,GAC1C,CACD,GAAI,CACF,EAAO,KAAK,EAAO,QAAQ,aAAa,EAAkB,OAAO,iBAAiB,CAAC,CACnF,MAAM,EAAgB,EAAQ,EAAmB,EAAgB,CACjE,EAAO,KAAK,EAAO,MAAM,yBAAyB,EAAkB,OAAO,eAAe,CAAC,OACpF,EAAK,CACZ,EAAmB,GACnB,EAAO,KAAK,EAAO,IAAI,kCAAkC,EAAI,UAAU,CAAC,CAM1E,OAHA,EAAO,KAAK,EAAO,MAAM,WAAW,EAAU,OAAO,eAAe,CAAC,CAG9D,CAAC"}
@@ -1,23 +0,0 @@
1
- import{t as e}from"./makeGraphQLRequest-G078PsEL.mjs";import{gql as t}from"graphql-request";const n=t`
2
- query TranscendCliTemplates($title: String, $first: Int!, $offset: Int!) {
3
- templates(filterBy: { text: $title }, first: $first, offset: $offset, useMaster: false) {
4
- nodes {
5
- id
6
- title
7
- subject {
8
- defaultMessage
9
- }
10
- template {
11
- defaultMessage
12
- }
13
- }
14
- }
15
- }
16
- `,r=t`
17
- mutation TranscendCliCreateTemplate($title: String!) {
18
- createTemplate(input: { title: $title, template: "", subject: $title }) {
19
- clientMutationId
20
- }
21
- }
22
- `;async function i(t,r){let i=[],a=0,o=!1;do{let{templates:{nodes:s}}=await e(t,n,{first:20,offset:a,title:r});i.push(...s),a+=20,o=s.length===20}while(o);return i.sort((e,t)=>e.title.localeCompare(t.title))}async function a(t,n){(await i(n,t.title)).find(({title:e})=>e===t.title)||await e(n,r,{title:t.title})}export{n as i,a as n,r,i as t};
23
- //# sourceMappingURL=syncTemplates-BNu1_dmW.mjs.map