@transcend-io/cli 7.0.0 → 8.0.0-alpha.1

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 (271) hide show
  1. package/dist/bin/bash-complete.js +4 -0
  2. package/dist/bin/bash-complete.js.map +1 -0
  3. package/dist/bin/cli.js +3 -0
  4. package/dist/bin/cli.js.map +1 -0
  5. package/dist/bin/deprecated-command.js +7 -0
  6. package/dist/bin/deprecated-command.js.map +1 -0
  7. package/dist/chunk-26T4RUOI.js +12 -0
  8. package/dist/chunk-26T4RUOI.js.map +1 -0
  9. package/dist/chunk-2LCGZ77N.js +2 -0
  10. package/dist/chunk-2LCGZ77N.js.map +1 -0
  11. package/dist/chunk-2V6ABZRI.js +2 -0
  12. package/dist/chunk-2V6ABZRI.js.map +1 -0
  13. package/dist/chunk-347UQP43.js +2 -0
  14. package/dist/chunk-347UQP43.js.map +1 -0
  15. package/dist/chunk-43JWXG77.js +2 -0
  16. package/dist/chunk-43JWXG77.js.map +1 -0
  17. package/dist/chunk-4GLITB3Y.js +2 -0
  18. package/dist/chunk-4GLITB3Y.js.map +1 -0
  19. package/dist/chunk-65I2PF73.js +2 -0
  20. package/dist/chunk-65I2PF73.js.map +1 -0
  21. package/dist/chunk-72U6ETHG.js +2 -0
  22. package/dist/chunk-72U6ETHG.js.map +1 -0
  23. package/dist/chunk-ARVEJERC.js +2 -0
  24. package/dist/chunk-ARVEJERC.js.map +1 -0
  25. package/dist/chunk-CBAHSBSW.js +2 -0
  26. package/dist/{chunk-UBUNHRCG.cjs.map → chunk-CBAHSBSW.js.map} +1 -1
  27. package/dist/chunk-EZHASXA5.js +2 -0
  28. package/dist/chunk-EZHASXA5.js.map +1 -0
  29. package/dist/chunk-FHZRITAV.js +2 -0
  30. package/dist/chunk-FHZRITAV.js.map +1 -0
  31. package/dist/chunk-HJULYIHF.js +3 -0
  32. package/dist/chunk-HJULYIHF.js.map +1 -0
  33. package/dist/chunk-HOZXN2EM.js +94 -0
  34. package/dist/chunk-HOZXN2EM.js.map +1 -0
  35. package/dist/chunk-L5ULN3IT.js +2 -0
  36. package/dist/chunk-L5ULN3IT.js.map +1 -0
  37. package/dist/chunk-L7ZIX4SU.js +2 -0
  38. package/dist/chunk-L7ZIX4SU.js.map +1 -0
  39. package/dist/chunk-LAYHULHH.js +2 -0
  40. package/dist/chunk-LAYHULHH.js.map +1 -0
  41. package/dist/chunk-MA4JWWRO.js +6 -0
  42. package/dist/chunk-MA4JWWRO.js.map +1 -0
  43. package/dist/chunk-MK5T6DBK.js +2831 -0
  44. package/dist/chunk-MK5T6DBK.js.map +1 -0
  45. package/dist/chunk-N6JZHL5U.js +2 -0
  46. package/dist/chunk-N6JZHL5U.js.map +1 -0
  47. package/dist/chunk-NZZKRVAI.js +4 -0
  48. package/dist/chunk-NZZKRVAI.js.map +1 -0
  49. package/dist/chunk-OEB7WG3G.js +4 -0
  50. package/dist/chunk-OEB7WG3G.js.map +1 -0
  51. package/dist/chunk-SRLEEKKQ.js +9 -0
  52. package/dist/chunk-SRLEEKKQ.js.map +1 -0
  53. package/dist/chunk-WO5MQBXP.js +75 -0
  54. package/dist/chunk-WO5MQBXP.js.map +1 -0
  55. package/dist/impl-24IS3GIF.js +2 -0
  56. package/dist/impl-24IS3GIF.js.map +1 -0
  57. package/dist/impl-3YESYKVQ.js +2 -0
  58. package/dist/impl-3YESYKVQ.js.map +1 -0
  59. package/dist/impl-6MGNPY7O.js +2 -0
  60. package/dist/impl-6MGNPY7O.js.map +1 -0
  61. package/dist/impl-6SYXV3YI.js +2 -0
  62. package/dist/impl-6SYXV3YI.js.map +1 -0
  63. package/dist/impl-BVOF3W2V.js +4 -0
  64. package/dist/impl-BVOF3W2V.js.map +1 -0
  65. package/dist/impl-D4AEXEMN.js +12 -0
  66. package/dist/impl-D4AEXEMN.js.map +1 -0
  67. package/dist/impl-EAY4M3OY.js +2 -0
  68. package/dist/impl-EAY4M3OY.js.map +1 -0
  69. package/dist/impl-F4IQEKTF.js +9 -0
  70. package/dist/impl-F4IQEKTF.js.map +1 -0
  71. package/dist/impl-G4JGSVWD.js +2 -0
  72. package/dist/impl-G4JGSVWD.js.map +1 -0
  73. package/dist/impl-HFXHM3PH.js +2 -0
  74. package/dist/impl-HFXHM3PH.js.map +1 -0
  75. package/dist/impl-HMHOYOZZ.js +2 -0
  76. package/dist/impl-HMHOYOZZ.js.map +1 -0
  77. package/dist/impl-IU4EANSX.js +7 -0
  78. package/dist/impl-IU4EANSX.js.map +1 -0
  79. package/dist/impl-IWDHKBWZ.js +2 -0
  80. package/dist/impl-IWDHKBWZ.js.map +1 -0
  81. package/dist/impl-JFD2JMP6.js +2 -0
  82. package/dist/impl-JFD2JMP6.js.map +1 -0
  83. package/dist/impl-JH4VBMNT.js +2 -0
  84. package/dist/impl-JH4VBMNT.js.map +1 -0
  85. package/dist/impl-LSP4V37Z.js +6 -0
  86. package/dist/impl-LSP4V37Z.js.map +1 -0
  87. package/dist/impl-MIJFNSLS.js +2 -0
  88. package/dist/impl-MIJFNSLS.js.map +1 -0
  89. package/dist/impl-NL32KFH4.js +2 -0
  90. package/dist/impl-NL32KFH4.js.map +1 -0
  91. package/dist/impl-NLCPSIYZ.js +2 -0
  92. package/dist/impl-NLCPSIYZ.js.map +1 -0
  93. package/dist/impl-NXRQU2U5.js +6 -0
  94. package/dist/impl-NXRQU2U5.js.map +1 -0
  95. package/dist/impl-QEOVZIM5.js +2 -0
  96. package/dist/impl-QEOVZIM5.js.map +1 -0
  97. package/dist/impl-QRK4B3FD.js +2 -0
  98. package/dist/impl-QRK4B3FD.js.map +1 -0
  99. package/dist/impl-QZBKOJBQ.js +2 -0
  100. package/dist/impl-QZBKOJBQ.js.map +1 -0
  101. package/dist/impl-RFRQUKQY.js +2 -0
  102. package/dist/impl-RFRQUKQY.js.map +1 -0
  103. package/dist/impl-RIVVHWBR.js +2 -0
  104. package/dist/impl-RIVVHWBR.js.map +1 -0
  105. package/dist/impl-SJHU5PR7.js +2 -0
  106. package/dist/impl-SJHU5PR7.js.map +1 -0
  107. package/dist/impl-SYC5TORT.js +2 -0
  108. package/dist/impl-SYC5TORT.js.map +1 -0
  109. package/dist/impl-TP4QITXR.js +2 -0
  110. package/dist/impl-TP4QITXR.js.map +1 -0
  111. package/dist/impl-UOB7PV4W.js +2 -0
  112. package/dist/impl-UOB7PV4W.js.map +1 -0
  113. package/dist/impl-UUQ2BEZR.js +2 -0
  114. package/dist/impl-UUQ2BEZR.js.map +1 -0
  115. package/dist/impl-WH2I2JB7.js +2 -0
  116. package/dist/impl-WH2I2JB7.js.map +1 -0
  117. package/dist/impl-X6N6NFUV.js +6 -0
  118. package/dist/impl-X6N6NFUV.js.map +1 -0
  119. package/dist/impl-XF3OTAQZ.js +2 -0
  120. package/dist/impl-XF3OTAQZ.js.map +1 -0
  121. package/dist/impl-XH3KTZRN.js +2 -0
  122. package/dist/{impl-EJT3AX73.cjs.map → impl-XH3KTZRN.js.map} +1 -1
  123. package/dist/impl-XQBTTRCU.js +2 -0
  124. package/dist/impl-XQBTTRCU.js.map +1 -0
  125. package/dist/impl-YA2HU57Y.js +2 -0
  126. package/dist/impl-YA2HU57Y.js.map +1 -0
  127. package/dist/impl-YEGS4G24.js +2 -0
  128. package/dist/impl-YEGS4G24.js.map +1 -0
  129. package/dist/impl-YNBHGQJK.js +2 -0
  130. package/dist/impl-YNBHGQJK.js.map +1 -0
  131. package/dist/impl-ZJL2YE7A.js +2 -0
  132. package/dist/impl-ZJL2YE7A.js.map +1 -0
  133. package/dist/{index.d.cts → index.d.ts} +1 -1
  134. package/dist/index.js +5 -0
  135. package/dist/index.js.map +1 -0
  136. package/package.json +45 -48
  137. package/dist/bin/bash-complete.cjs +0 -4
  138. package/dist/bin/bash-complete.cjs.map +0 -1
  139. package/dist/bin/cli.cjs +0 -3
  140. package/dist/bin/cli.cjs.map +0 -1
  141. package/dist/bin/deprecated-command.cjs +0 -7
  142. package/dist/bin/deprecated-command.cjs.map +0 -1
  143. package/dist/chunk-ANCIGXE5.cjs +0 -4
  144. package/dist/chunk-ANCIGXE5.cjs.map +0 -1
  145. package/dist/chunk-AW6I4V4F.cjs +0 -3
  146. package/dist/chunk-AW6I4V4F.cjs.map +0 -1
  147. package/dist/chunk-BY7W4UQF.cjs +0 -2
  148. package/dist/chunk-BY7W4UQF.cjs.map +0 -1
  149. package/dist/chunk-CHTWXNEA.cjs +0 -2
  150. package/dist/chunk-CHTWXNEA.cjs.map +0 -1
  151. package/dist/chunk-DS6VH676.cjs +0 -2
  152. package/dist/chunk-DS6VH676.cjs.map +0 -1
  153. package/dist/chunk-EG4L6YAJ.cjs +0 -2
  154. package/dist/chunk-EG4L6YAJ.cjs.map +0 -1
  155. package/dist/chunk-ETNRSKUM.cjs +0 -2
  156. package/dist/chunk-ETNRSKUM.cjs.map +0 -1
  157. package/dist/chunk-GM2EDRKN.cjs +0 -12
  158. package/dist/chunk-GM2EDRKN.cjs.map +0 -1
  159. package/dist/chunk-IBTP5OXE.cjs +0 -2
  160. package/dist/chunk-IBTP5OXE.cjs.map +0 -1
  161. package/dist/chunk-KOV2SQO2.cjs +0 -4
  162. package/dist/chunk-KOV2SQO2.cjs.map +0 -1
  163. package/dist/chunk-LBDIZJ23.cjs +0 -2844
  164. package/dist/chunk-LBDIZJ23.cjs.map +0 -1
  165. package/dist/chunk-LZYEIVWM.cjs +0 -94
  166. package/dist/chunk-LZYEIVWM.cjs.map +0 -1
  167. package/dist/chunk-MPJABCSW.cjs +0 -75
  168. package/dist/chunk-MPJABCSW.cjs.map +0 -1
  169. package/dist/chunk-R5N2S5UU.cjs +0 -2
  170. package/dist/chunk-R5N2S5UU.cjs.map +0 -1
  171. package/dist/chunk-RW5GSSAA.cjs +0 -2
  172. package/dist/chunk-RW5GSSAA.cjs.map +0 -1
  173. package/dist/chunk-RZWMOCW3.cjs +0 -2
  174. package/dist/chunk-RZWMOCW3.cjs.map +0 -1
  175. package/dist/chunk-SAEKBZGF.cjs +0 -2
  176. package/dist/chunk-SAEKBZGF.cjs.map +0 -1
  177. package/dist/chunk-T462ONFX.cjs +0 -2
  178. package/dist/chunk-T462ONFX.cjs.map +0 -1
  179. package/dist/chunk-TD7ADMVO.cjs +0 -2
  180. package/dist/chunk-TD7ADMVO.cjs.map +0 -1
  181. package/dist/chunk-UBUNHRCG.cjs +0 -2
  182. package/dist/chunk-UEGX6GZ2.cjs +0 -2
  183. package/dist/chunk-UEGX6GZ2.cjs.map +0 -1
  184. package/dist/chunk-VCWGXJ2H.cjs +0 -9
  185. package/dist/chunk-VCWGXJ2H.cjs.map +0 -1
  186. package/dist/chunk-ZUNVPK23.cjs +0 -2
  187. package/dist/chunk-ZUNVPK23.cjs.map +0 -1
  188. package/dist/chunk-ZVK4HIDF.cjs +0 -6
  189. package/dist/chunk-ZVK4HIDF.cjs.map +0 -1
  190. package/dist/impl-2GU6CYMY.cjs +0 -2
  191. package/dist/impl-2GU6CYMY.cjs.map +0 -1
  192. package/dist/impl-2OEHQTIR.cjs +0 -2
  193. package/dist/impl-2OEHQTIR.cjs.map +0 -1
  194. package/dist/impl-2QXJ3WST.cjs +0 -9
  195. package/dist/impl-2QXJ3WST.cjs.map +0 -1
  196. package/dist/impl-442H4ODN.cjs +0 -7
  197. package/dist/impl-442H4ODN.cjs.map +0 -1
  198. package/dist/impl-44QRPPUX.cjs +0 -6
  199. package/dist/impl-44QRPPUX.cjs.map +0 -1
  200. package/dist/impl-4DOGSDPC.cjs +0 -2
  201. package/dist/impl-4DOGSDPC.cjs.map +0 -1
  202. package/dist/impl-5J3MG42D.cjs +0 -2
  203. package/dist/impl-5J3MG42D.cjs.map +0 -1
  204. package/dist/impl-5YMSNFJU.cjs +0 -2
  205. package/dist/impl-5YMSNFJU.cjs.map +0 -1
  206. package/dist/impl-6TBKGA4Y.cjs +0 -2
  207. package/dist/impl-6TBKGA4Y.cjs.map +0 -1
  208. package/dist/impl-7VYQSZVO.cjs +0 -2
  209. package/dist/impl-7VYQSZVO.cjs.map +0 -1
  210. package/dist/impl-BB24LU3N.cjs +0 -2
  211. package/dist/impl-BB24LU3N.cjs.map +0 -1
  212. package/dist/impl-CWZ26FTN.cjs +0 -2
  213. package/dist/impl-CWZ26FTN.cjs.map +0 -1
  214. package/dist/impl-EFTKRWUA.cjs +0 -2
  215. package/dist/impl-EFTKRWUA.cjs.map +0 -1
  216. package/dist/impl-EJT3AX73.cjs +0 -2
  217. package/dist/impl-EKQ6ZNN3.cjs +0 -2
  218. package/dist/impl-EKQ6ZNN3.cjs.map +0 -1
  219. package/dist/impl-EV6T5UOK.cjs +0 -6
  220. package/dist/impl-EV6T5UOK.cjs.map +0 -1
  221. package/dist/impl-FPFUAY4Q.cjs +0 -2
  222. package/dist/impl-FPFUAY4Q.cjs.map +0 -1
  223. package/dist/impl-GDKUHX2J.cjs +0 -2
  224. package/dist/impl-GDKUHX2J.cjs.map +0 -1
  225. package/dist/impl-GXDABG5X.cjs +0 -2
  226. package/dist/impl-GXDABG5X.cjs.map +0 -1
  227. package/dist/impl-IG7QEF6D.cjs +0 -2
  228. package/dist/impl-IG7QEF6D.cjs.map +0 -1
  229. package/dist/impl-JQLYJA5L.cjs +0 -2
  230. package/dist/impl-JQLYJA5L.cjs.map +0 -1
  231. package/dist/impl-LPI3M7L3.cjs +0 -6
  232. package/dist/impl-LPI3M7L3.cjs.map +0 -1
  233. package/dist/impl-M7WMSIK4.cjs +0 -4
  234. package/dist/impl-M7WMSIK4.cjs.map +0 -1
  235. package/dist/impl-MRGZ5OLO.cjs +0 -2
  236. package/dist/impl-MRGZ5OLO.cjs.map +0 -1
  237. package/dist/impl-OI4UWRAU.cjs +0 -12
  238. package/dist/impl-OI4UWRAU.cjs.map +0 -1
  239. package/dist/impl-OX24YDRR.cjs +0 -2
  240. package/dist/impl-OX24YDRR.cjs.map +0 -1
  241. package/dist/impl-PFQKPCUL.cjs +0 -2
  242. package/dist/impl-PFQKPCUL.cjs.map +0 -1
  243. package/dist/impl-PXJZK6BV.cjs +0 -2
  244. package/dist/impl-PXJZK6BV.cjs.map +0 -1
  245. package/dist/impl-QOGUUIE6.cjs +0 -2
  246. package/dist/impl-QOGUUIE6.cjs.map +0 -1
  247. package/dist/impl-QR3LLBZL.cjs +0 -2
  248. package/dist/impl-QR3LLBZL.cjs.map +0 -1
  249. package/dist/impl-RODUB22E.cjs +0 -2
  250. package/dist/impl-RODUB22E.cjs.map +0 -1
  251. package/dist/impl-S56PHXGG.cjs +0 -2
  252. package/dist/impl-S56PHXGG.cjs.map +0 -1
  253. package/dist/impl-SDGCTSWN.cjs +0 -2
  254. package/dist/impl-SDGCTSWN.cjs.map +0 -1
  255. package/dist/impl-VEMQEG27.cjs +0 -2
  256. package/dist/impl-VEMQEG27.cjs.map +0 -1
  257. package/dist/impl-VFWBSWT5.cjs +0 -2
  258. package/dist/impl-VFWBSWT5.cjs.map +0 -1
  259. package/dist/impl-XRRNIJUK.cjs +0 -2
  260. package/dist/impl-XRRNIJUK.cjs.map +0 -1
  261. package/dist/impl-YA7HWMYB.cjs +0 -2
  262. package/dist/impl-YA7HWMYB.cjs.map +0 -1
  263. package/dist/impl-YOWRUVYG.cjs +0 -2
  264. package/dist/impl-YOWRUVYG.cjs.map +0 -1
  265. package/dist/impl-ZHZOMOST.cjs +0 -2
  266. package/dist/impl-ZHZOMOST.cjs.map +0 -1
  267. package/dist/index.cjs +0 -5
  268. package/dist/index.cjs.map +0 -1
  269. /package/dist/bin/{bash-complete.d.cts → bash-complete.d.ts} +0 -0
  270. /package/dist/bin/{cli.d.cts → cli.d.ts} +0 -0
  271. /package/dist/bin/{deprecated-command.d.cts → deprecated-command.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/bluebird-replace.ts","../src/lib/graphql/gqls/dataPoint.ts","../src/lib/graphql/gqls/entry.ts","../src/lib/graphql/gqls/dataSilo.ts","../src/lib/graphql/gqls/enricher.ts","../src/lib/graphql/gqls/catalog.ts","../src/lib/graphql/gqls/identifier.ts","../src/lib/graphql/gqls/dataSubject.ts","../src/lib/graphql/gqls/repository.ts","../src/lib/graphql/gqls/apiKey.ts","../src/lib/graphql/gqls/siloDiscovery.ts","../src/lib/graphql/gqls/template.ts","../src/lib/graphql/gqls/organization.ts","../src/lib/graphql/gqls/attributeKey.ts","../src/lib/graphql/gqls/softwareDevelopmentKit.ts","../src/lib/graphql/gqls/codePackage.ts","../src/lib/graphql/gqls/promptThread.ts","../src/lib/graphql/gqls/policy.ts","../src/lib/graphql/gqls/request.ts","../src/lib/graphql/gqls/message.ts","../src/lib/graphql/gqls/RequestEnricher.ts","../src/lib/graphql/gqls/assessment.ts","../src/lib/graphql/gqls/purpose.ts","../src/lib/graphql/gqls/preferenceTopic.ts","../src/lib/graphql/gqls/assessmentTemplate.ts","../src/lib/graphql/gqls/prompt.ts","../src/lib/graphql/gqls/RequestDataSilo.ts","../src/lib/graphql/gqls/team.ts","../src/lib/graphql/gqls/RequestIdentifier.ts","../src/lib/graphql/gqls/user.ts","../src/lib/graphql/gqls/requestFile.ts","../src/lib/graphql/gqls/promptRun.ts","../src/lib/graphql/gqls/actionItemCollection.ts","../src/lib/graphql/gqls/attribute.ts","../src/lib/graphql/gqls/consentManager.ts","../src/lib/graphql/gqls/consentManagerMetrics.ts","../src/lib/graphql/gqls/businessEntity.ts","../src/lib/graphql/gqls/action.ts","../src/lib/graphql/gqls/actionItem.ts","../src/lib/graphql/gqls/privacyCenter.ts","../src/lib/graphql/gqls/auth.ts","../src/lib/graphql/gqls/largeLanguageModel.ts","../src/lib/graphql/gqls/agent.ts","../src/lib/graphql/gqls/agentFile.ts","../src/lib/graphql/gqls/agentFunction.ts","../src/lib/graphql/gqls/vendor.ts","../src/lib/graphql/gqls/dataCategory.ts","../src/lib/graphql/gqls/processingPurpose.ts","../src/lib/graphql/gqls/sombraVersion.ts","../src/lib/graphql/makeGraphQLRequest.ts","../src/lib/graphql/fetchIdentifiers.ts","../src/lib/graphql/syncIdentifier.ts","../src/lib/graphql/syncEnrichers.ts","../src/lib/graphql/syncAttribute.ts","../src/lib/graphql/fetchDataSubjects.ts","../src/lib/graphql/syncDataSilos.ts","../src/lib/graphql/fetchConsentManagerId.ts","../src/lib/graphql/syncCookies.ts","../src/lib/graphql/fetchAllTeams.ts","../src/lib/graphql/syncDataSubject.ts","../src/lib/graphql/fetchApiKeys.ts","../src/lib/graphql/fetchPrompts.ts","../src/lib/graphql/syncPrompts.ts","../src/lib/graphql/fetchPrivacyCenterId.ts","../src/lib/graphql/fetchAllPolicies.ts","../src/lib/graphql/syncPolicies.ts","../src/lib/graphql/syncIntlMessages.ts","../src/lib/graphql/syncPrivacyCenter.ts","../src/lib/graphql/syncPartitions.ts","../src/lib/graphql/fetchAllPurposes.ts","../src/lib/graphql/syncConsentManager.ts","../src/lib/graphql/fetchAllAttributes.ts","../src/lib/graphql/fetchAllBusinessEntities.ts","../src/lib/graphql/syncBusinessEntities.ts","../src/lib/graphql/fetchAllDataFlows.ts","../src/lib/graphql/syncDataFlows.ts","../src/lib/graphql/syncAction.ts","../src/lib/graphql/syncTemplates.ts","../src/lib/graphql/fetchAllActions.ts","../src/lib/graphql/fetchPromptPartials.ts","../src/lib/graphql/fetchPromptGroups.ts","../src/lib/graphql/fetchAllAgents.ts","../src/lib/graphql/syncAgents.ts","../src/lib/graphql/syncActionItemCollections.ts","../src/lib/graphql/fetchAllActionItemCollections.ts","../src/lib/graphql/fetchAllActionItems.ts","../src/lib/graphql/syncActionItems.ts","../src/lib/graphql/fetchAllAgentFunctions.ts","../src/lib/graphql/syncAgentFunctions.ts","../src/lib/graphql/fetchAllAgentFiles.ts","../src/lib/graphql/syncAgentFiles.ts","../src/lib/graphql/fetchAllVendors.ts","../src/lib/graphql/syncVendors.ts","../src/lib/graphql/fetchAllDataCategories.ts","../src/lib/graphql/syncDataCategories.ts","../src/lib/graphql/fetchAllProcessingPurposes.ts","../src/lib/graphql/syncProcessingPurposes.ts","../src/lib/graphql/syncConfigurationToTranscend.ts","../src/lib/graphql/syncTeams.ts","../src/lib/graphql/syncPromptPartials.ts","../src/lib/graphql/syncPromptGroups.ts","../src/lib/graphql/fetchActiveSiloDiscoPlugin.ts","../src/lib/graphql/fetchAllPrivacyCenters.ts","../src/lib/graphql/fetchAllMessages.ts","../src/lib/graphql/fetchAllCookies.ts","../src/lib/graphql/fetchAllAssessments.ts","../src/lib/graphql/fetchAllAssessmentTemplates.ts","../src/lib/graphql/parseAssessmentDisplayLogic.ts","../src/lib/graphql/parseAssessmentRiskLogic.ts","../src/lib/graphql/fetchAllPreferenceTopics.ts","../src/lib/graphql/fetchAllPurposesAndPreferences.ts","../src/lib/graphql/pullTranscendConfiguration.ts","../src/lib/graphql/formatAttributeValues.ts","../src/lib/graphql/syncSoftwareDevelopmentKits.ts","../src/lib/graphql/fetchAllSoftwareDevelopmentKits.ts","../src/lib/graphql/syncRepositories.ts","../src/lib/graphql/fetchAllRepositories.ts","../src/lib/graphql/syncCodePackages.ts","../src/lib/graphql/fetchAllCodePackages.ts","../src/lib/graphql/uploadSiloDiscoveryResults.ts","../src/lib/graphql/fetchCatalogs.ts","../src/lib/graphql/buildTranscendGraphQLClient.ts","../src/lib/graphql/createSombraGotInstance.ts","../src/lib/graphql/setResourceAttributes.ts","../src/lib/graphql/retryRequestEnricher.ts","../src/lib/graphql/fetchPromptThreads.ts","../src/lib/graphql/fetchAllRequestIdentifierMetadata.ts","../src/lib/graphql/fetchRequestDataSiloActiveCount.ts","../src/lib/graphql/fetchAllAttributeKeys.ts","../src/lib/graphql/fetchAllRequests.ts","../src/lib/graphql/fetchAllRequestIdentifiers.ts","../src/lib/graphql/fetchAllRequestEnrichers.ts","../src/lib/graphql/fetchRequestDataSilo.ts","../src/lib/graphql/createTranscendConsentGotInstance.ts","../src/lib/graphql/loginUser.ts","../src/lib/graphql/fetchAllUsers.ts","../src/lib/graphql/manageApiKeys.ts","../src/lib/graphql/fetchRequestFilesForRequest.ts","../src/lib/graphql/deployConsentManager.ts","../src/lib/graphql/reportPromptRun.ts","../src/lib/graphql/addMessagesToPromptRun.ts"],"sourcesContent":["/**\n * Replace bluebird's mapSeries with a simple for loop\n *\n * @param array - The array to iterate over\n * @param iterator - The iterator function that receives (item, index)\n * @returns The results of the iterator function\n */\nexport async function mapSeries<R, U>(\n array: R[],\n iterator: (item: R, index: number, arrayLength: number) => Promise<U>,\n): Promise<U[]> {\n const results = [];\n for (let i = 0; i < array.length; i += 1) {\n results.push(await iterator(array[i], i, array.length));\n }\n return results;\n}\n\n/**\n * Replace bluebird's map with Promise.all\n *\n * @param array - The array to iterate over\n * @param iterator - The iterator function that receives (item, index, arrayLength)\n * @param options - Options\n * @returns The results of the iterator function\n */\nexport async function map<R, U>(\n array: R[],\n iterator: (item: R, index: number, arrayLength: number) => Promise<U>,\n options: {\n /** Concurrency level for the Promise.all call */\n concurrency?: number;\n } = {},\n): Promise<U[]> {\n const { concurrency = Infinity } = options;\n const results: U[] = new Array(array.length);\n const executing: Promise<void>[] = [];\n let nextIndex = 0;\n\n const executeNext = async (): Promise<void> => {\n if (nextIndex >= array.length) return;\n\n const currentIndex = nextIndex;\n nextIndex += 1;\n\n const promise = iterator(\n array[currentIndex],\n currentIndex,\n array.length,\n ).then((result) => {\n results[currentIndex] = result;\n });\n\n executing.push(promise);\n await promise;\n\n // Remove the completed promise from executing array\n const index = executing.indexOf(promise);\n if (index > -1) {\n executing.splice(index, 1);\n }\n };\n\n // Start initial batch of promises up to concurrency limit\n const initialBatch = Math.min(concurrency, array.length);\n const initialPromises = [];\n for (let i = 0; i < initialBatch; i += 1) {\n initialPromises.push(executeNext());\n }\n\n // Wait for initial batch to start\n await Promise.all(initialPromises);\n\n // Continue executing remaining items as slots become available\n while (nextIndex < array.length) {\n if (executing.length < concurrency) {\n await executeNext();\n } else {\n // Wait for any promise to complete before continuing\n await Promise.race(executing);\n }\n }\n\n // Wait for all remaining promises to complete\n await Promise.all(executing);\n\n return results;\n}\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const DATA_POINTS = gql`\n query TranscendCliDataPoints(\n $filterBy: DataPointFiltersInput\n $first: Int!\n $offset: Int!\n ) {\n dataPoints(\n filterBy: $filterBy\n first: $first\n offset: $offset\n useMaster: false\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\n ) {\n nodes {\n id\n title {\n defaultMessage\n }\n description {\n defaultMessage\n }\n owners {\n email\n }\n teams {\n name\n }\n name\n path\n actionSettings {\n type\n active\n }\n dataCollection {\n title {\n defaultMessage\n }\n }\n dbIntegrationQueries {\n query\n suggestedQuery\n requestType\n }\n }\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const DATA_POINT_COUNT = gql`\n query TranscendCliDataPointCount($filterBy: DataPointFiltersInput) {\n dataPoints(filterBy: $filterBy, useMaster: false) {\n totalCount\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - add orderBy\n// isExportCsv: true\nexport const SUB_DATA_POINTS = gql`\n query TranscendCliSubDataPoints(\n $filterBy: SubDataPointFiltersInput\n $first: Int!\n $offset: Int!\n ) {\n subDataPoints(\n filterBy: $filterBy\n first: $first\n offset: $offset\n useMaster: false\n ) {\n nodes {\n id\n name\n description\n purposes {\n name\n purpose\n }\n categories {\n name\n category\n }\n accessRequestVisibilityEnabled\n erasureRequestRedactionEnabled\n attributeValues {\n attributeKey {\n name\n }\n name\n }\n }\n }\n }\n`;\n\nexport const SUB_DATA_POINTS_COUNT = gql`\n query TranscendCliSubDataPointsCount($filterBy: SubDataPointFiltersInput) {\n subDataPoints(filterBy: $filterBy, useMaster: false) {\n totalCount\n }\n }\n`;\n\nexport const SUB_DATA_POINTS_WITH_GUESSES = gql`\n query TranscendCliSubDataPointGuesses(\n $filterBy: SubDataPointFiltersInput\n $first: Int!\n $offset: Int!\n ) {\n subDataPoints(\n filterBy: $filterBy\n first: $first\n offset: $offset\n useMaster: false\n ) {\n nodes {\n id\n name\n description\n purposes {\n name\n purpose\n }\n categories {\n name\n category\n }\n pendingCategoryGuesses {\n category {\n name\n category\n }\n status\n confidence\n classifierVersion\n }\n accessRequestVisibilityEnabled\n erasureRequestRedactionEnabled\n attributeValues {\n attributeKey {\n name\n }\n name\n }\n }\n }\n }\n`;\n\nexport const UPDATE_OR_CREATE_DATA_POINT = gql`\n mutation TranscendCliUpdateOrCreateDataPoint(\n $dataSiloId: ID!\n $name: String!\n $path: [String!]\n $title: String\n $description: String\n $ownerIds: [ID!]\n $ownerEmails: [String!]\n $teamNames: [String!]\n $teamIds: [ID!]\n $dataCollectionTag: String\n $querySuggestions: [DbIntegrationQuerySuggestionInput!]\n $enabledActions: [RequestActionObjectResolver!]\n $subDataPoints: [DataPointSubDataPointInput!]\n ) {\n updateOrCreateDataPoint(\n input: {\n dataSiloId: $dataSiloId\n name: $name\n path: $path\n title: $title\n teamNames: $teamNames\n ownerEmails: $ownerEmails\n dataCollectionTag: $dataCollectionTag\n description: $description\n ownerIds: $ownerIds\n teamIds: $teamIds\n querySuggestions: $querySuggestions\n enabledActions: $enabledActions\n subDataPoints: $subDataPoints\n }\n ) {\n dataPoint {\n id\n name\n }\n }\n }\n`;\n\nexport const DATAPOINT_EXPORT = gql`\n query TranscendCliDataPointCsvExport(\n $filterBy: DataPointFiltersInput\n $first: Int!\n ) {\n dataPoints(filterBy: $filterBy, first: $first, useMaster: false) {\n nodes {\n id\n title {\n defaultMessage\n }\n description {\n defaultMessage\n }\n owners {\n email\n }\n teams {\n name\n }\n name\n path\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const ENTRY_COUNT = gql`\n query TranscendCliEntryCount(\n $filterBy: UnstructuredSubDataPointRecommendationsFilterInput\n ) {\n unstructuredSubDataPointRecommendations(\n filterBy: $filterBy\n useMaster: false\n ) {\n totalCount\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const DATA_SILOS = gql`\n query TranscendCliDataSilos(\n $filterBy: DataSiloFiltersInput!\n $first: Int!\n $offset: Int!\n ) {\n dataSilos(\n filterBy: $filterBy\n first: $first\n offset: $offset\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: title, direction: ASC }\n ]\n useMaster: false\n ) {\n nodes {\n id\n title\n link\n type\n catalog {\n hasAvcFunctionality\n }\n }\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const DATA_SILO_EXPORT = gql`\n query TranscendCliDataSiloExport(\n $filterBy: DataSiloFiltersInput!\n $first: Int!\n ) {\n dataSilos(filterBy: $filterBy, first: $first, useMaster: false) {\n nodes {\n id\n title\n }\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const DATA_SILOS_ENRICHED = gql`\n query TranscendCliDataSilosEnriched(\n $filterBy: DataSiloFiltersInput!\n $first: Int!\n $offset: Int!\n ) {\n dataSilos(\n filterBy: $filterBy\n first: $first\n offset: $offset\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: title, direction: ASC }\n ]\n useMaster: false\n ) {\n nodes {\n id\n title\n description\n type\n outerType\n link\n country\n countrySubDivision\n url\n notifyEmailAddress\n attributeValues {\n attributeKey {\n name\n }\n name\n }\n apiKeys {\n title\n }\n subjectBlocklist {\n type\n }\n identifiers {\n name\n isConnected\n }\n dependentDataSilos {\n title\n }\n owners {\n email\n }\n teams {\n id\n name\n }\n catalog {\n hasAvcFunctionality\n }\n isLive\n promptAVendorEmailSendFrequency\n promptAVendorEmailSendType\n promptAVendorEmailIncludeIdentifiersAttachment\n promptAVendorEmailCompletionLinkType\n manualWorkRetryFrequency\n discoveredBy {\n title\n }\n businessEntities {\n title\n }\n }\n }\n }\n`;\n\nexport const UPDATE_DATA_SILOS = gql`\n mutation TranscendCliUpdateDataSilo($input: UpdateDataSilosInput!) {\n updateDataSilos(input: $input) {\n clientMutationId\n dataSilos {\n id\n title\n }\n }\n }\n`;\n\nexport const CREATE_DATA_SILOS = gql`\n mutation TranscendCliCreateDataSilo($input: [CreateDataSilosInput!]!) {\n createDataSilos(input: $input) {\n dataSilos {\n id\n title\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const ENRICHERS = gql`\n query TranscendCliEnrichers($title: String, $first: Int!, $offset: Int!) {\n enrichers(\n filterBy: { text: $title }\n first: $first\n offset: $offset\n useMaster: false\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: title, direction: ASC }\n ]\n ) {\n nodes {\n id\n title\n url\n type\n expirationDuration\n lookerQueryTitle\n testRegex\n transitionRequestStatus\n phoneNumbers\n regionList\n inputIdentifier {\n name\n }\n identifiers {\n name\n }\n dataSubjects {\n type\n }\n actions\n }\n }\n }\n`;\n\nexport interface Initializer {\n /** ID of enricher */\n id: string;\n /** Identifiers */\n identifiers: {\n /** Name of identifier */\n name: string;\n }[];\n}\n\nexport const INITIALIZER = gql`\n query TranscendCliInitializer {\n initializer {\n id\n identifiers {\n name\n }\n }\n }\n`;\n\nexport const CREATE_ENRICHER = gql`\n mutation TranscendCliCreateEnricher($input: EnricherInput!) {\n createEnricher(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const UPDATE_ENRICHER = gql`\n mutation TranscendCliUpdateEnricher($input: UpdateEnricherInput!) {\n updateEnricher(input: $input) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - order by createdAt\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const CATALOGS = gql`\n query TranscendCliCatalogs($first: Int!, $offset: Int!) {\n catalogs(first: $first, offset: $offset, filterBy: {}, useMaster: false) {\n nodes {\n integrationName\n title\n hasApiFunctionality\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const IDENTIFIERS = gql`\n query TranscendCliIdentifiers($first: Int!, $offset: Int!) {\n identifiers(\n first: $first\n offset: $offset\n useMaster: false\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\n ) {\n nodes {\n id\n name\n type\n regex\n selectOptions\n privacyCenterVisibility\n dataSubjects {\n type\n }\n isRequiredInForm\n placeholder\n displayTitle {\n defaultMessage\n }\n displayDescription {\n defaultMessage\n }\n displayOrder\n }\n }\n }\n`;\n\nexport const NEW_IDENTIFIER_TYPES = gql`\n query TranscendCliNewIdentifierTypes {\n newIdentifierTypes {\n name\n }\n }\n`;\n\nexport const CREATE_IDENTIFIER = gql`\n mutation TranscendCliCreateIdentifier($input: IdentifierInput!) {\n createIdentifier(input: $input) {\n identifier {\n id\n name\n }\n }\n }\n`;\n\nexport const UPDATE_IDENTIFIER = gql`\n mutation TranscendCliUpdateIdentifier($input: UpdateIdentifierInput!) {\n updateIdentifier(input: $input) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const DATA_SUBJECTS = gql`\n query TranscendCliDataSubjects {\n internalSubjects {\n id\n title {\n defaultMessage\n }\n active\n type\n adminDashboardDefaultSilentMode\n actions {\n type\n }\n }\n }\n`;\n\nexport const CREATE_DATA_SUBJECT = gql`\n mutation TranscendCliCreateDataSubject($type: String!) {\n createSubject(input: { type: $type, title: $type, subjectClass: OTHER }) {\n subject {\n id\n type\n }\n }\n }\n`;\n\nexport const UPDATE_DATA_SUBJECT = gql`\n mutation TranscendCliUpdateDataSubject($input: UpdateSubjectInput!) {\n updateSubject(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const TOGGLE_DATA_SUBJECT = gql`\n mutation TranscendCliToggleDataSubject($input: ToggleSubjectInput!) {\n toggleSubject(input: $input) {\n clientMutationId\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 REPOSITORIES = gql`\n query TranscendCliRepositories(\n $first: Int!\n $offset: Int!\n $input: RepositoryFiltersInput\n ) {\n repositories(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\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\nexport const API_KEYS = gql`\n query TranscendCliApiKeys($first: Int!, $offset: Int!, $titles: [String!]) {\n apiKeys(\n first: $first\n offset: $offset\n filterBy: { titles: $titles }\n useMaster: false\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: title, direction: ASC }\n ]\n ) {\n nodes {\n id\n title\n }\n }\n }\n`;\n\nexport const CREATE_API_KEY = gql`\n mutation TranscendCliCreateApiKey($input: ApiKeyInput!) {\n createApiKey(input: $input) {\n apiKey {\n id\n apiKey\n title\n }\n }\n }\n`;\n\nexport const DELETE_API_KEY = gql`\n mutation TranscendCliDeleteApiKey($id: ID!) {\n deleteApiKey(id: $id) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const ADD_SILO_DISCOVERY_RESULTS = gql`\n mutation AddSiloDiscoveryResults(\n $pluginId: ID!\n $rawResults: [SiloDiscoveryRawResultInput!]!\n ) {\n addSiloDiscoveryResults(\n input: { pluginId: $pluginId, rawResults: $rawResults }\n ) {\n success\n }\n }\n`;\n\nexport const ENABLED_PLUGINS = gql`\n query Plugins($dataSiloId: String!, $type: PluginType!) {\n plugins(filterBy: { dataSiloId: $dataSiloId, type: $type, enabled: true }) {\n plugins {\n id\n dataSilo {\n type\n }\n }\n totalCount\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - order by createdAt\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const TEMPLATES = gql`\n query TranscendCliTemplates($title: String, $first: Int!, $offset: Int!) {\n templates(\n filterBy: { text: $title }\n first: $first\n offset: $offset\n useMaster: false\n ) {\n nodes {\n id\n title\n subject {\n defaultMessage\n }\n template {\n defaultMessage\n }\n }\n }\n }\n`;\n\nexport const CREATE_TEMPLATE = gql`\n mutation TranscendCliCreateTemplate($title: String!) {\n createTemplate(input: { title: $title, template: \"\", subject: $title }) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const ORGANIZATION = gql`\n query TranscendCliOrganization {\n organization {\n sombra {\n customerUrl\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// TODO: https://transcend.height.app/T-27909 - order by createdAt\nexport const ATTRIBUTE_KEYS_REQUESTS = gql`\n query TranscendCliAttributeKeys($first: Int!, $offset: Int!) {\n attributeKeys(\n filterBy: { enabledOn: [request] }\n first: $first\n useMaster: false\n offset: $offset\n ) {\n nodes {\n id\n name\n type\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: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\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(\n $input: UpdateSoftwareDevelopmentKitsInput!\n ) {\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(\n $input: CreateSoftwareDevelopmentKitInput!\n ) {\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(\n $first: Int!\n $offset: Int!\n $input: CodePackageFiltersInput\n ) {\n codePackages(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\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 { gql } from 'graphql-request';\n\nexport const PROMPT_THREADS = gql`\n query TranscendCliPromptThreads(\n $first: Int!\n $offset: Int!\n $filterBy: PromptThreadFiltersInput!\n ) {\n promptThreads(first: $first, offset: $offset, filterBy: $filterBy) {\n nodes {\n id\n threadId\n slackMessageTs\n slackTeamId\n slackChannelId\n slackChannelName\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const POLICIES = gql`\n query TranscendCliFetchPolicies($url: String!) {\n privacyCenterPolicies(lookup: { url: $url }) {\n id\n title {\n defaultMessage\n }\n disableEffectiveOn\n disabledLocales\n versions {\n effectiveOn\n content {\n defaultMessage\n }\n }\n }\n }\n`;\n\nexport const UPDATE_POLICIES = gql`\n mutation TranscendCliUpdatePolicies(\n $policies: [PolicyInput!]!\n $privacyCenterId: ID!\n ) {\n updatePolicies(\n input: {\n privacyCenterId: $privacyCenterId\n policies: $policies\n skipPublish: true\n }\n ) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const REQUESTS = gql`\n query TranscendCliRequests(\n $first: Int!\n $offset: Int!\n $filterBy: RequestFiltersInput!\n ) {\n requests(\n filterBy: $filterBy\n first: $first\n offset: $offset\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: id, direction: ASC }\n ]\n useMaster: false\n ) {\n nodes {\n id\n createdAt\n email\n link\n status\n details\n isTest\n locale\n origin\n isSilent\n coreIdentifier\n daysRemaining\n type\n subjectType\n country\n countrySubDivision\n attributeValues {\n id\n name\n attributeKey {\n id\n name\n }\n }\n }\n totalCount\n }\n }\n`;\n\nexport const APPROVE_PRIVACY_REQUEST = gql`\n mutation TranscendCliApprovePrivacyRequest($input: CommunicationInput!) {\n approveRequest(input: $input) {\n request {\n id\n }\n }\n }\n`;\nexport const CANCEL_PRIVACY_REQUEST = gql`\n mutation TranscendCliCancelPrivacyRequest($input: CommunicationInput!) {\n cancelRequest(input: $input) {\n request {\n id\n }\n }\n }\n`;\n\nexport const UPDATE_PRIVACY_REQUEST = gql`\n mutation TranscendCliUpdatePrivacyRequest($input: UpdateRequestInput!) {\n updateRequest(input: $input) {\n request {\n id\n }\n }\n }\n`;\n\nexport const NOTIFY_ADDITIONAL_TIME = gql`\n mutation TranscendCliNotifyAdditionalTime($input: AdditionalTimeInput!) {\n notifyAdditionalTime(input: $input) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const MESSAGES = gql`\n query TranscendCliFetchMessage {\n translatedMessages {\n id\n defaultMessage\n targetReactIntlId\n translations {\n locale\n value\n }\n }\n }\n`;\n\nexport const UPDATE_INTL_MESSAGES = gql`\n mutation TranscendCliUpdateIntlMessages($messages: [MessageInput!]!) {\n updateIntlMessages(input: { messages: $messages, skipPublish: true }) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const REQUEST_ENRICHERS = gql`\n query TranscendCliRequestEnrichers(\n $first: Int!\n $offset: Int!\n $requestId: ID!\n ) {\n requestEnrichers(\n input: { requestId: $requestId }\n first: $first\n offset: $offset\n useMaster: false\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: title, direction: ASC, model: enricher }\n ]\n ) {\n nodes {\n id\n status\n enricher {\n id\n type\n title\n }\n }\n totalCount\n }\n }\n`;\n\nexport const RETRY_REQUEST_ENRICHER = gql`\n mutation TranscendCliRetryRequestEnricher($requestEnricherId: ID!) {\n retryRequestEnricher(id: $requestEnricherId) {\n requestEnricher {\n id\n }\n }\n }\n`;\n\nexport const SKIP_REQUEST_ENRICHER = gql`\n mutation TranscendCliSkipRequestEnricher($requestEnricherId: ID!) {\n skipRequestEnricher(id: $requestEnricherId) {\n requestEnricher {\n id\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const ASSESSMENT_SECTION_FIELDS = `\n id\n title\n status\n index\n questions {\n id\n title\n index\n type\n subType\n placeholder\n description\n isRequired\n displayLogic\n riskLogic\n requireRiskEvaluation\n requireRiskMatrixEvaluation\n riskCategories {\n id\n title\n }\n riskFramework {\n id\n title\n description\n riskLevels {\n id\n title\n }\n riskCategories {\n id\n title\n }\n riskMatrixColumns {\n id\n title\n }\n riskMatrixRows {\n id\n title\n }\n riskMatrix {\n id\n title\n }\n creator {\n id\n email\n name\n }\n riskMatrixRowTitle\n riskMatrixColumnTitle\n }\n riskLevel {\n id\n title\n }\n reviewerRiskLevel {\n id\n title\n }\n riskLevelFromRiskMatrix {\n id\n title\n }\n answerOptions {\n id\n index\n value\n }\n selectedAnswers {\n ... on AssessmentAnswerInterface {\n id\n index\n value\n }\n }\n respondent {\n id\n email\n name\n }\n attributeKey {\n name\n }\n externalRespondentEmail\n comments {\n id\n content\n createdAt\n updatedAt\n author {\n id\n email\n name\n }\n }\n allowedMimeTypes\n updatedAt\n referenceId\n previousSubmissions {\n id\n updatedAt\n assessmentQuestionId\n answers {\n ... on AssessmentAnswerInterface {\n id\n index\n value\n }\n }\n }\n allowSelectOther\n syncModel\n syncColumn\n syncRowIds\n syncOverride\n }\n assignees {\n id\n email\n name\n }\n externalAssignees {\n id\n email\n }\n isReviewed\n`;\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\n// orderBy: [\n// { field: createdAt, direction: ASC }\n// { field: name, direction: ASC }\n// ]\nexport const ASSESSMENTS = gql`\n query TranscendCliAssessments(\n $first: Int!\n $offset: Int!\n $filterBy: AssessmentFormFiltersInput\n ) {\n assessmentForms(first: $first, offset: $offset, filterBy: $filterBy) {\n nodes {\n id\n creator {\n id\n email\n name\n }\n lastEditor {\n id\n email\n name\n }\n title\n description\n status\n assignees {\n id\n email\n name\n }\n externalAssignees {\n id\n email\n }\n reviewers {\n id\n email\n name\n }\n isLocked\n isArchived\n isExternallyCreated\n dueDate\n createdAt\n updatedAt\n assignedAt\n submittedAt\n approvedAt\n rejectedAt\n titleIsInternal\n retentionSchedule {\n id\n type\n durationDays\n operation\n }\n attributeValues {\n name\n attributeKey {\n name\n }\n }\n sections {\n ${ASSESSMENT_SECTION_FIELDS}\n }\n assessmentGroup {\n id\n title\n description\n }\n resources {\n resourceType\n ... on AttributeBusinessEntityResource {\n id\n title\n }\n ... on AttributeDataSiloResource {\n id\n title\n }\n ... on AttributeDataSubCategoryResource {\n id\n name\n category\n }\n ... on AttributeSubDataPointResource {\n id\n name\n }\n ... on AttributeProcessingPurposeSubCategoryResource {\n id\n name\n purpose\n }\n ... on AttributeRequestResource {\n id\n type\n }\n ... on AttributeVendorResource {\n id\n title\n }\n ... on AttributePromptResource {\n id\n title\n }\n ... on AttributePromptRunResource {\n id\n title\n }\n ... on AttributePromptGroupResource {\n id\n title\n }\n }\n syncedRows {\n resourceType\n ... on AttributeBusinessEntityResource {\n id\n title\n }\n ... on AttributeDataSiloResource {\n id\n title\n }\n ... on AttributeDataSubCategoryResource {\n id\n name\n category\n }\n ... on AttributeSubDataPointResource {\n id\n name\n }\n ... on AttributeProcessingPurposeSubCategoryResource {\n id\n name\n purpose\n }\n ... on AttributeVendorResource {\n id\n title\n }\n }\n }\n }\n }\n`;\n\nexport const IMPORT_ONE_TRUST_ASSESSMENT_FORMS = gql`\n mutation TranscendCliImportOneTrustAssessmentForms(\n $input: ImportOnetrustAssessmentsInput!\n ) {\n importOneTrustAssessmentForms(input: $input) {\n assessmentForms {\n id\n title\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\n// orderBy: [\n// { field: createdAt, direction: ASC }\n// { field: name, direction: ASC }\n// ]\nexport const PURPOSES = gql`\n query TranscendCliPurposes(\n $first: Int!\n $offset: Int!\n $filterBy: TrackingPurposeFiltersInput\n $input: TrackingPurposeInput!\n ) {\n purposes(\n first: $first\n offset: $offset\n filterBy: $filterBy\n input: $input\n ) {\n nodes {\n id\n name\n description\n defaultConsent\n trackingType\n configurable\n essential\n showInConsentManager\n isActive\n displayOrder\n optOutSignals\n deletedAt\n authLevel\n showInPrivacyCenter\n title\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\n// orderBy: [\n// { field: createdAt, direction: ASC }\n// { field: name, direction: ASC }\n// ]\nexport const PREFERENCE_TOPICS = gql`\n query TranscendCliPreferenceTopics(\n $first: Int!\n $offset: Int!\n $filterBy: PreferenceTopicFilterInput\n ) {\n preferenceTopics(first: $first, offset: $offset, filterBy: $filterBy) {\n nodes {\n id\n slug\n type\n title {\n id\n defaultMessage\n }\n showInPrivacyCenter\n displayDescription {\n id\n defaultMessage\n }\n defaultConfiguration\n preferenceOptionValues {\n slug\n title {\n id\n defaultMessage\n }\n }\n purpose {\n trackingType\n }\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\nimport { ASSESSMENT_SECTION_FIELDS } from './assessment';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\n// orderBy: [\n// { field: createdAt, direction: ASC }\n// { field: name, direction: ASC }\n// ]\nexport const ASSESSMENT_TEMPLATES = gql`\n query TranscendCliAssessmentTemplates(\n $first: Int!\n $offset: Int!\n $filterBy: AssessmentFormTemplateFiltersInput\n ) {\n assessmentFormTemplates(\n first: $first\n offset: $offset\n filterBy: $filterBy\n ) {\n nodes {\n id\n creator {\n id\n email\n name\n }\n lastEditor {\n id\n email\n name\n }\n title\n description\n status\n source\n parentId\n isLocked\n isArchived\n createdAt\n updatedAt\n retentionSchedule {\n id\n type\n durationDays\n operation\n createdAt\n updatedAt\n }\n assessmentEmailSet {\n id\n title\n description\n isDefault\n templates {\n id\n title\n }\n }\n sections {\n ${ASSESSMENT_SECTION_FIELDS}\n }\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\nexport const PROMPTS = gql`\n query TranscendCliPrompts(\n $first: Int!\n $offset: Int!\n $filterBy: PromptFiltersInput\n ) {\n prompts(\n first: $first\n orderBy: [{ field: title, direction: ASC }]\n offset: $offset\n filterBy: $filterBy\n ) {\n nodes {\n id\n title\n status\n content\n temperature\n topP\n maxTokensToSample\n }\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\n// TODO: https://transcend.height.app/T-27909 - order by createdAt\n// orderBy: [{ field: title, direction: ASC }]\nexport const PROMPT_PARTIALS = gql`\n query TranscendCliPromptPartials($first: Int!, $offset: Int!) {\n promptPartials(first: $first, offset: $offset) {\n nodes {\n id\n title\n content\n }\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\n// TODO: https://transcend.height.app/T-27909 - order by createdAt\n// orderBy: [{ field: title, direction: ASC }]\nexport const PROMPT_GROUPS = gql`\n query TranscendCliPromptGroups($first: Int!, $offset: Int!) {\n promptGroups(\n first: $first\n\n offset: $offset\n ) {\n nodes {\n id\n title\n description\n prompts {\n title\n }\n }\n }\n }\n`;\n\nexport const PROMPTS_WITH_VARIABLES = gql`\n query TranscendCliPromptsWithVariables($input: PromptsWithVariablesInput!) {\n promptsWithVariables(input: $input) {\n prompts {\n id\n title\n content\n status\n temperature\n topP\n maxTokensToSample\n responseFormat\n }\n promptPartials {\n id\n title\n content\n slug\n }\n calculatedVariables {\n data\n name\n }\n runtimeVariables {\n name\n }\n }\n }\n`;\n\nexport const UPDATE_PROMPTS = gql`\n mutation TranscendCliUpdatePrompts($input: UpdatePromptsInput!) {\n updatePrompts(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const CREATE_PROMPT = gql`\n mutation TranscendCliCreatePrompt($input: CreatePromptInput!) {\n createPrompt(input: $input) {\n clientMutationId\n prompt {\n id\n }\n }\n }\n`;\n\nexport const UPDATE_PROMPT_PARTIALS = gql`\n mutation TranscendCliUpdatePromptPartials(\n $input: UpdatePromptPartialsInput!\n ) {\n updatePromptPartials(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const CREATE_PROMPT_PARTIAL = gql`\n mutation TranscendCliCreatePromptPartial($input: CreatePromptPartialInput!) {\n createPromptPartial(input: $input) {\n clientMutationId\n promptPartial {\n id\n }\n }\n }\n`;\n\nexport const UPDATE_PROMPT_GROUPS = gql`\n mutation TranscendCliUpdatePromptGroups($input: UpdatePromptGroupsInput!) {\n updatePromptGroups(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const CREATE_PROMPT_GROUP = gql`\n mutation TranscendCliCreatePromptPartial($input: CreatePromptGroupInput!) {\n createPromptGroup(input: $input) {\n clientMutationId\n promptGroup {\n id\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const REQUEST_DATA_SILOS = gql`\n query TranscendCliRequestDataSilos(\n $first: Int!\n $offset: Int!\n $filterBy: RequestDataSiloFiltersInput!\n ) {\n requestDataSilos(\n filterBy: $filterBy\n first: $first\n offset: $offset\n useMaster: false\n orderBy: [\n { field: createdAt, direction: DESC }\n { field: title, direction: ASC, model: dataSilo }\n ]\n ) {\n nodes {\n id\n }\n totalCount\n }\n }\n`;\n\nexport const CHANGE_REQUEST_DATA_SILO_STATUS = gql`\n mutation TranscendCliMarkRequestDataSiloCompleted(\n $requestDataSiloId: ID!\n $status: UpdateRequestDataSiloStatus!\n ) {\n changeRequestDataSiloStatus(\n input: { id: $requestDataSiloId, status: $status }\n ) {\n requestDataSilo {\n id\n }\n }\n }\n`;\n\nexport const RETRY_REQUEST_DATA_SILO = gql`\n mutation TranscendCliRetryRequestDataSilo($requestDataSiloId: ID!) {\n retryRequestDataSilo(id: $requestDataSiloId) {\n requestDataSilo {\n id\n }\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\n// orderBy: [\n// { field: createdAt, direction: DESC }\n// { field: title, direction: ASC, model: dataSilo }\n// ]\nexport const REDUCED_REQUESTS_FOR_DATA_SILO_COUNT = gql`\n query TranscendCliListReducedRequestsForDataSiloCount(\n $input: BulkCompletionReducedRequestInput!\n ) {\n listReducedRequestsForDataSilo(input: $input) {\n totalCount\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 TEAMS = gql`\n query TranscendCliTeams(\n $first: Int!\n $offset: Int!\n $input: TeamFiltersInput\n ) {\n teams(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\n ) {\n nodes {\n id\n name\n description\n ssoDepartment\n ssoGroup\n ssoTitle\n users {\n id\n email\n name\n }\n scopes {\n id\n name\n title\n }\n }\n }\n }\n`;\n\nexport const CREATE_TEAM = gql`\n mutation TranscendCliCreateTeam($input: TeamInput!) {\n createTeam(input: $input) {\n team {\n id\n name\n }\n }\n }\n`;\n\nexport const UPDATE_TEAM = gql`\n mutation TranscendCliUpdateTeam($input: UpdateTeamInput!) {\n updateTeam(input: $input) {\n team {\n id\n name\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const REMOVE_REQUEST_IDENTIFIERS = gql`\n mutation TranscendCliRemoveRequestIdentifiers(\n $input: RemoveRequestIdentifiersInput!\n ) {\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 ) {\n requestIdentifiers(\n input: { requestIds: $requestIds }\n first: $first\n offset: $offset\n useMaster: false\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\n ) {\n nodes {\n id\n name\n isVerifiedAtLeastOnce\n }\n totalCount\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 USERS = gql`\n query TranscendCliUsers(\n $first: Int!\n $offset: Int!\n $input: UserFiltersInput\n ) {\n users(\n first: $first\n offset: $offset\n filterBy: $input\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\n ) {\n nodes {\n id\n name\n email\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 REQUEST_FILES = gql`\n query TranscendCliRequestFiles(\n $first: Int!\n $offset: Int!\n $filterBy: RequestFileFiltersInput!\n ) {\n requestFiles(\n filterBy: $filterBy\n first: $first\n offset: $offset\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: id, direction: ASC }\n ]\n ) {\n nodes {\n remoteId\n fileName\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const REPORT_PROMPT_RUN = gql`\n mutation TranscendCliReportPromptRun($input: ReportPromptRunInput!) {\n reportPromptRun(input: $input) {\n clientMutationId\n promptRun {\n id\n }\n }\n }\n`;\n\nexport const ADD_MESSAGES_TO_PROMPT_RUN = gql`\n mutation TranscendCliAddMessagesToPromptRun(\n $input: AddMessagesToPromptRunInput!\n ) {\n addMessagesToPromptRun(input: $input) {\n clientMutationId\n promptRun {\n id\n }\n }\n }\n`;\n","import { gql } from 'graphql-request';\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// useMaster: false\n// orderBy: [\n// { field: createdAt, direction: ASC }\n// { field: title, direction: ASC }\n// ]\nexport const GLOBAL_ACTION_ITEM_COLLECTIONS = gql`\n query TranscendCliGlobalActionItemCollectionss(\n $filterBy: GlobalActionItemCollectionFiltersInput!\n ) {\n globalActionItemCollections(filterBy: $filterBy) {\n nodes {\n id\n title\n description\n hidden\n productLine\n }\n }\n }\n`;\n\nexport const CREATE_ACTION_ITEM_COLLECTION = gql`\n mutation TranscendCliCreateActionItemCollection(\n $input: CreateActionItemCollectionInput!\n ) {\n createActionItemCollection(input: $input) {\n created {\n id\n title\n }\n }\n }\n`;\n\nexport const UPDATE_ACTION_ITEM_COLLECTION = gql`\n mutation TranscendCliUpdateActionItemCollection(\n $input: UpdateActionItemCollectionInput!\n ) {\n updateActionItemCollection(input: $input) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - order by createdAt\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const ATTRIBUTES = gql`\n query TranscendCliAttributes($first: Int!, $offset: Int!) {\n attributeKeys(first: $first, offset: $offset, useMaster: false) {\n nodes {\n id\n isCustom\n description\n enabledOn\n name\n type\n }\n }\n }\n`;\n\nexport const CREATE_ATTRIBUTE_VALUES = gql`\n mutation TranscendCliCreateAttributeValues(\n $input: [CreateAttributeValuesInput!]!\n ) {\n createAttributeValues(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const UPDATE_ATTRIBUTE_VALUES = gql`\n mutation TranscendCliUpdateAttributeValues(\n $input: [UpdateAttributeValueInput!]!\n ) {\n updateAttributeValues(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const DELETE_ATTRIBUTE_VALUE = gql`\n mutation TranscendCliDeleteAttributeValue($id: ID!) {\n deleteAttributeValue(id: $id) {\n clientMutationId\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - order by createdAt\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const ATTRIBUTE_VALUES = gql`\n query TranscendCliAttributeValues(\n $first: Int!\n $offset: Int!\n $attributeKeyId: ID!\n ) {\n attributeValues(\n first: $first\n offset: $offset\n useMaster: false\n filterBy: { attributeKeys: [$attributeKeyId] }\n ) {\n nodes {\n id\n name\n description\n color\n }\n }\n }\n`;\n\nexport const CREATE_ATTRIBUTE = gql`\n mutation TranscendCliCreateAttribute(\n $name: String!\n $type: AttributeKeyType!\n $description: String\n $enabledOn: [AttributeSupportedResourceType!]\n ) {\n createAttributeKey(\n input: {\n name: $name\n type: $type\n description: $description\n enabledOn: $enabledOn\n }\n ) {\n clientMutationId\n attributeKey {\n id\n }\n }\n }\n`;\n\nexport const UPDATE_ATTRIBUTE = gql`\n mutation TranscendCliCreateAttribute(\n $attributeKeyId: ID!\n $description: String\n $enabledOn: [AttributeSupportedResourceType!]\n ) {\n updateAttributeKey(\n input: {\n id: $attributeKeyId\n description: $description\n enabledOn: $enabledOn\n }\n ) {\n clientMutationId\n attributeKey {\n id\n }\n }\n }\n`;\n\nexport const SET_RESOURCE_ATTRIBUTES = gql`\n mutation TranscendCliSetResourceAttributes(\n $input: SetResourceAttributesInput!\n ) {\n setResourceAttributes(input: $input) {\n clientMutationId\n }\n }\n`;\n","/* eslint-disable max-lines */\nimport { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - order by createdAt\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const EXPERIENCES = gql`\n query TranscendCliExperiences($first: Int!, $offset: Int!) {\n experiences(first: $first, offset: $offset, useMaster: false) {\n nodes {\n id\n name\n displayName\n regions {\n countrySubDivision\n country\n }\n operator\n displayPriority\n onConsentExpiry\n consentExpiry\n viewState\n purposes {\n name\n trackingType\n }\n optedOutPurposes {\n name\n trackingType\n }\n browserLanguages\n browserTimeZones\n }\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - order by createdAt\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// useMaster: false\n// isExportCsv: true\nexport const CONSENT_PARTITIONS = gql`\n query TranscendCliConsentPartitions($first: Int!, $offset: Int!) {\n consentPartitions(first: $first, offset: $offset) {\n nodes {\n id\n name\n partition\n }\n }\n }\n`;\n\nexport const CREATE_DATA_FLOWS = gql`\n mutation TranscendCliCreateDataFlows(\n $dataFlows: [DataFlowInput!]!\n $airgapBundleId: ID!\n $classifyService: Boolean\n ) {\n createDataFlows(\n input: {\n airgapBundleId: $airgapBundleId\n dataFlows: $dataFlows\n classifyService: $classifyService\n }\n ) {\n dataFlows {\n id\n }\n }\n }\n`;\n\nexport const UPDATE_DATA_FLOWS = gql`\n mutation TranscendCliUpdateDataFlows(\n $airgapBundleId: ID!\n $dataFlows: [UpdateDataFlowInput!]!\n $classifyService: Boolean\n ) {\n updateDataFlows(\n input: {\n airgapBundleId: $airgapBundleId\n dataFlows: $dataFlows\n classifyService: $classifyService\n }\n ) {\n dataFlows {\n id\n }\n }\n }\n`;\n\nexport const UPDATE_OR_CREATE_COOKIES = gql`\n mutation TranscendCliUpdateOrCreateCookies(\n $cookies: [UpdateOrCreateCookieInput!]!\n $airgapBundleId: ID!\n ) {\n updateOrCreateCookies(\n input: { airgapBundleId: $airgapBundleId, cookies: $cookies }\n ) {\n clientMutationId\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const DATA_FLOWS = gql`\n query TranscendCliDataFlows(\n $first: Int!\n $airgapBundleId: ID!\n $offset: Int!\n $status: ConsentTrackerStatus\n $showZeroActivity: Boolean\n ) {\n dataFlows(\n first: $first\n offset: $offset\n filterBy: { status: $status, showZeroActivity: $showZeroActivity }\n input: { airgapBundleId: $airgapBundleId }\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: value, direction: ASC }\n ]\n useMaster: false\n ) {\n nodes {\n id\n value\n type\n description\n trackingType\n service {\n integrationName\n }\n source\n status\n owners {\n email\n }\n teams {\n name\n }\n attributeValues {\n name\n attributeKey {\n name\n }\n }\n }\n }\n }\n`;\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\nexport const COOKIES = gql`\n query TranscendCliCookies(\n $first: Int!\n $offset: Int!\n $airgapBundleId: ID!\n $status: ConsentTrackerStatus\n ) {\n cookies(\n first: $first\n offset: $offset\n filterBy: { status: $status }\n input: { airgapBundleId: $airgapBundleId }\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\n useMaster: false\n ) {\n nodes {\n id\n name\n isRegex\n description\n trackingPurposes\n service {\n integrationName\n }\n source\n status\n owners {\n email\n }\n teams {\n name\n }\n attributeValues {\n name\n attributeKey {\n name\n }\n }\n }\n }\n }\n`;\n\nexport const FETCH_CONSENT_MANAGER_ID = gql`\n query TranscendCliFetchConsentManagerId {\n consentManager {\n consentManager {\n id\n }\n }\n }\n`;\n\nexport const FETCH_CONSENT_MANAGER = gql`\n query TranscendCliFetchConsentManager {\n consentManager {\n consentManager {\n id\n bundleURL\n testBundleURL\n configuration {\n domains\n consentPrecedence\n unknownRequestPolicy\n unknownCookiePolicy\n syncEndpoint\n telemetryPartitioning\n signedIabAgreement\n uspapi\n syncGroups\n partition\n }\n partition {\n partition\n }\n }\n }\n }\n`;\n\nexport const FETCH_CONSENT_MANAGER_THEME = gql`\n query TranscendCliFetchConsentManagerTheme($airgapBundleId: ID!) {\n consentManagerTheme(input: { airgapBundleId: $airgapBundleId }) {\n theme {\n primaryColor\n fontColor\n privacyPolicy\n prompt\n }\n }\n }\n`;\n\nexport const CREATE_CONSENT_MANAGER = gql`\n mutation TranscendCliCreateConsentManager($privacyCenterId: ID!) {\n createConsentManager(input: { privacyCenterId: $privacyCenterId }) {\n consentManager {\n id\n }\n }\n }\n`;\n\nexport const UPDATE_CONSENT_MANAGER_VERSION = gql`\n mutation TranscendCliUpdateConsentManager(\n $airgapBundleId: ID!\n $version: String!\n ) {\n updateConsentManager(id: $airgapBundleId, input: { version: $version }) {\n clientMutationId\n }\n }\n`;\n\nexport const UPDATE_CONSENT_MANAGER_TO_LATEST = gql`\n mutation TranscendCliUpdateConsentManagerToLatest(\n $airgapBundleId: ID!\n $bundleType: ConsentBundleType!\n ) {\n updateConsentManagerToLatestVersion(\n id: $airgapBundleId\n input: { bundleType: $bundleType }\n ) {\n clientMutationId\n }\n }\n`;\n\nexport const DEPLOY_CONSENT_MANAGER = gql`\n mutation TranscendCliDeployConsentManager(\n $airgapBundleId: ID!\n $bundleType: ConsentBundleType!\n ) {\n deployConsentManagerBundle(\n id: $airgapBundleId\n input: { bundleType: $bundleType }\n ) {\n clientMutationId\n }\n }\n`;\n\nexport const UPDATE_CONSENT_MANAGER_DOMAINS = gql`\n mutation TranscendCliUpdateConsentManagerDomains(\n $airgapBundleId: ID!\n $domains: [String!]!\n ) {\n updateConsentManagerDomains(\n input: { id: $airgapBundleId, domains: $domains }\n ) {\n clientMutationId\n }\n }\n`;\n\nexport const UPDATE_CONSENT_MANAGER_PARTITION = gql`\n mutation TranscendCliUpdateConsentManagerPartition(\n $airgapBundleId: ID!\n $partitionId: ID!\n ) {\n updateConsentManagerPartition(\n input: { id: $airgapBundleId, partitionId: $partitionId }\n ) {\n clientMutationId\n }\n }\n`;\n\nexport const UPDATE_TOGGLE_USP_API = gql`\n mutation TranscendCliToggleUspAPI($input: ToggleUspapiInput!) {\n toggleUspapi(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const TOGGLE_UNKNOWN_REQUEST_POLICY = gql`\n mutation TranscendCliToggleUnknownRequestPolicy(\n $input: ToggleUnknownRequestPolicyInput!\n ) {\n toggleUnknownRequestPolicy(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const TOGGLE_UNKNOWN_COOKIE_POLICY = gql`\n mutation TranscendCliToggleUnknownCookiePolicy(\n $input: ToggleUnknownCookiePolicyInput!\n ) {\n toggleUnknownCookiePolicy(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const TOGGLE_TELEMETRY_PARTITION_STRATEGY = gql`\n mutation TranscendCliToggleTelemetryPartitionStrategy(\n $input: ToggleTelemetryPartitionStrategyInput!\n ) {\n toggleTelemetryPartitioning(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const TOGGLE_CONSENT_PRECEDENCE = gql`\n mutation TranscendCliToggleConsentPrecedence(\n $input: ToggleConsentPrecedenceInput!\n ) {\n toggleConsentPrecedence(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const UPDATE_CONSENT_MANAGER_THEME = gql`\n mutation TranscendCliUpdateConsentManagerTheme(\n $input: UpdateConsentManagerThemeInput!\n ) {\n updateConsentManagerTheme(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const UPDATE_CONSENT_EXPERIENCE = gql`\n mutation TranscendCliUpdateConsentExperience($input: UpdateExperienceInput!) {\n updateExperience(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const CREATE_CONSENT_EXPERIENCE = gql`\n mutation TranscendCliCreateConsentExperience($input: CreateExperienceInput!) {\n createExperience(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const CREATE_CONSENT_PARTITION = gql`\n mutation TranscendCliCreateConsentPartition(\n $input: CreateConsentPartitionInput!\n ) {\n createConsentPartition(input: $input) {\n clientMutationId\n }\n }\n`;\n/* eslint-enable max-lines */\n","import { gql } from 'graphql-request';\n\nexport const CONSENT_MANAGER_ANALYTICS_DATA = gql`\n query TranscendCliConsentManagerAnalyticsData($input: AnalyticsInput!) {\n analyticsData(input: $input) {\n series {\n name\n points {\n key\n value\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\nexport const BUSINESS_ENTITIES = gql`\n query TranscendCliBusinessEntities($first: Int!, $offset: Int!) {\n businessEntities(\n first: $first\n offset: $offset\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: title, direction: ASC }\n ]\n useMaster: false\n ) {\n nodes {\n id\n title\n description\n dataProtectionOfficerName\n dataProtectionOfficerEmail\n address\n headquarterCountry\n headquarterSubDivision\n attributeValues {\n name\n attributeKey {\n name\n }\n }\n }\n }\n }\n`;\n\nexport const CREATE_BUSINESS_ENTITY = gql`\n mutation TranscendCliCreateBusinessEntity(\n $input: CreateBusinessEntityInput!\n ) {\n createBusinessEntity(input: $input) {\n businessEntity {\n id\n title\n description\n dataProtectionOfficerName\n dataProtectionOfficerEmail\n address\n headquarterCountry\n headquarterSubDivision\n attributeValues {\n name\n attributeKey {\n name\n }\n }\n }\n }\n }\n`;\n\nexport const UPDATE_BUSINESS_ENTITIES = gql`\n mutation TranscendCliUpdateBusinessEntities(\n $input: [UpdateBusinessEntityInput!]!\n ) {\n updateBusinessEntities(input: { businessEntities: $input }) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// isExportCsv: true\n// TODO: https://transcend.height.app/T-27909 - order by createdAt\nexport const ACTIONS = gql`\n query TranscendCliActions($first: Int!, $offset: Int!) {\n actions(\n first: $first\n offset: $offset\n useMaster: false\n orderBy: [{ field: type, direction: ASC }]\n ) {\n nodes {\n id\n type\n skipSecondaryIfNoFiles\n skipDownloadableStep\n requiresReview\n regionList\n regionDetectionMethod\n waitingPeriod\n }\n }\n }\n`;\n\nexport const UPDATE_ACTION = gql`\n mutation TranscendCliUpdateAction($input: UpdateActionInput!) {\n updateAction(input: $input) {\n clientMutationId\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\n// orderBy: [\n// { field: createdAt, direction: ASC }\n// { field: title, direction: ASC }\n// ]\nexport const GLOBAL_ACTION_ITEMS = gql`\n query TranscendCliGlobalActionItems(\n $first: Int!\n $offset: Int!\n $filterBy: GlobalActionItemFiltersInput!\n ) {\n globalActionItems(first: $first, offset: $offset, filterBy: $filterBy) {\n nodes {\n ids\n count\n teams {\n id\n name\n }\n customerExperienceActionItemIds\n users {\n id\n email\n }\n collections {\n title\n id\n }\n dueDate\n priority\n titles\n resolved\n notes\n links\n type\n additionalContexts {\n iconOverride\n requestId\n dataSiloId\n requestType\n latestAirgapVersion\n parentTitle\n }\n attributeValues {\n name\n attributeKey {\n name\n }\n }\n }\n }\n }\n`;\n\nexport const UPDATE_ACTION_ITEMS = gql`\n mutation TranscendCliUpdateActionItems($input: UpdateActionItemsInput!) {\n updateActionItems(input: $input) {\n clientMutationId\n }\n }\n`;\n\nexport const CREATE_ACTION_ITEMS = gql`\n mutation TranscendCliCreateActionItems($input: [CreateActionItemsInput!]!) {\n createActionItems(input: $input) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const FETCH_PRIVACY_CENTER_ID = gql`\n query TranscendCliFetchPrivacyCenterId($url: String!) {\n privacyCenter(lookup: { url: $url }) {\n id\n }\n }\n`;\n\nexport const DEPLOYED_PRIVACY_CENTER_URL = gql`\n query TranscendCliDeployedPrivacyCenterUrl {\n organization {\n deployedPrivacyCenterUrl\n }\n }\n`;\n\nexport const PRIVACY_CENTER = gql`\n query TranscendCliFetchPrivacyCenters($url: String!) {\n privacyCenter(lookup: { url: $url }) {\n id\n url\n isDisabled\n showPrivacyRequestButton\n showPolicies\n showTrackingTechnologies\n showCookies\n showDataFlows\n showConsentManager\n showManageYourPrivacy\n showMarketingPreferences\n locales\n defaultLocale\n preferBrowserDefaultLocale\n supportEmail\n replyToEmail\n useNoReplyEmailAddress\n useCustomEmailDomain\n transformAccessReportJsonToCsv\n themeStr\n }\n }\n`;\n\nexport const UPDATE_PRIVACY_CENTER = gql`\n mutation TranscendCliUpdatePrivacyCenter($input: UpdatePrivacyCenterInput!) {\n updatePrivacyCenter(input: $input) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const DETERMINE_LOGIN_METHOD = gql`\n mutation TranscendCliDetermineLoginMethod($email: String!) {\n determineLoginMethod(input: { email: $email }) {\n loginMethod {\n email\n sombraPublicKey\n }\n }\n }\n`;\n\nexport const LOGIN = gql`\n mutation TranscendCliLogin(\n $email: String!\n $password: String!\n $publicKey: String!\n ) {\n login(\n input: { email: $email, password: $password }\n publicKey: $publicKey\n ) {\n user {\n roles {\n id\n organization {\n name\n id\n uri\n parentOrganizationId\n }\n }\n }\n }\n }\n`;\n\nexport const ASSUME_ROLE = gql`\n mutation TranscendCliAssumeRole($id: ID!, $publicKey: String!) {\n assumeRole(id: $id, publicKey: $publicKey) {\n clientMutationId\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 LARGE_LANGUAGE_MODELS = gql`\n query TranscendCliLargeLanguageModels(\n $first: Int!\n $offset: Int!\n $filterBy: LargeLanguageModelFiltersInput\n ) {\n largeLanguageModels(\n first: $first\n orderBy: [\n { field: name, direction: ASC }\n { field: client, direction: ASC }\n { field: isTranscendHosted, direction: ASC }\n ]\n offset: $offset\n filterBy: $filterBy\n ) {\n nodes {\n id\n name\n client\n isTranscendHosted\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 AGENTS = gql`\n query TranscendCliAgents(\n $first: Int!\n $offset: Int!\n $filterBy: AgentFiltersInput\n ) {\n agents(\n first: $first\n offset: $offset\n filterBy: $filterBy\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\n ) {\n nodes {\n id\n name\n agentId\n instructions\n description\n codeInterpreterEnabled\n retrievalEnabled\n prompt {\n title\n }\n largeLanguageModel {\n name\n client\n }\n teams {\n name\n }\n owners {\n email\n }\n agentFunctions {\n name\n }\n agentFiles {\n name\n }\n }\n }\n }\n`;\n\nexport const CREATE_AGENT = gql`\n mutation TranscendCliCreateAgent($input: CreateAgentInput!) {\n createAgent(input: $input) {\n agent {\n id\n name\n agentId\n }\n }\n }\n`;\n\nexport const UPDATE_AGENTS = gql`\n mutation TranscendCliUpdateAgents($input: UpdateAgentsInput!) {\n updateAgents(input: $input) {\n clientMutationId\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 AGENT_FILES = gql`\n query TranscendCliAgentFiles(\n $first: Int!\n $offset: Int!\n $filterBy: AgentFileFiltersInput\n ) {\n agentFiles(\n first: $first\n offset: $offset\n filterBy: $filterBy\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\n ) {\n nodes {\n id\n name\n description\n fileId\n size\n purpose\n initialFileName\n }\n }\n }\n`;\n\nexport const CREATE_AGENT_FILE = gql`\n mutation TranscendCliCreateAgentFile($input: CreateAgentFileInput!) {\n createAgentFile(input: $input) {\n agentFile {\n id\n name\n fileId\n initialFileName\n }\n }\n }\n`;\n\nexport const UPDATE_AGENT_FILES = gql`\n mutation TranscendCliUpdateAgentFiles($input: UpdateAgentFilesInput!) {\n updateAgentFiles(input: $input) {\n clientMutationId\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 AGENT_FUNCTIONS = gql`\n query TranscendCliAgentFunctions($first: Int!, $offset: Int!) {\n agentFunctions(\n first: $first\n offset: $offset\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: name, direction: ASC }\n ]\n ) {\n nodes {\n id\n name\n description\n parameters\n }\n }\n }\n`;\n\nexport const CREATE_AGENT_FUNCTION = gql`\n mutation TranscendCliCreateAgentFunction($input: CreateAgentFunctionInput!) {\n createAgentFunction(input: $input) {\n agentFunction {\n id\n name\n }\n }\n }\n`;\n\nexport const UPDATE_AGENT_FUNCTIONS = gql`\n mutation TranscendCliUpdateAgentFunctions(\n $input: UpdateAgentFunctionsInput!\n ) {\n updateAgentFunctions(input: $input) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const VENDORS = gql`\n query TranscendCliVendors($first: Int!, $offset: Int!) {\n vendors(\n first: $first\n offset: $offset\n useMaster: false\n isExportCsv: true\n orderBy: [\n { field: createdAt, direction: ASC }\n { field: title, direction: ASC }\n ]\n ) {\n nodes {\n id\n title\n description\n dataProcessingAgreementLink\n contactName\n contactEmail\n contactPhone\n address\n headquarterCountry\n headquarterSubDivision\n websiteUrl\n businessEntity {\n title\n }\n teams {\n name\n }\n owners {\n email\n }\n attributeValues {\n attributeKey {\n name\n }\n name\n }\n }\n }\n }\n`;\n\nexport const CREATE_VENDOR = gql`\n mutation TranscendCliCreateVendor($input: CreateVendorInput!) {\n createVendor(input: $input) {\n vendor {\n id\n title\n }\n }\n }\n`;\n\nexport const UPDATE_VENDORS = gql`\n mutation TranscendCliUpdateVendor($input: UpdateVendorsInput!) {\n updateVendors(input: $input) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// orderBy: [\n// { field: createdAt, direction: ASC }\n// { field: name, direction: ASC }\n// ]\nexport const DATA_SUB_CATEGORIES = gql`\n query TranscendCliDataSubCategories($first: Int!, $offset: Int!) {\n dataSubCategories(\n first: $first\n offset: $offset\n isExportCsv: true\n useMaster: false\n ) {\n nodes {\n id\n name\n category\n description\n regex\n teams {\n name\n }\n owners {\n email\n }\n attributeValues {\n attributeKey {\n name\n }\n name\n }\n }\n }\n }\n`;\n\nexport const CREATE_DATA_SUB_CATEGORY = gql`\n mutation TranscendCliCreateDataSubCategory(\n $input: CreateDataInventorySubCategoryInput!\n ) {\n createDataSubCategory(input: $input) {\n dataSubCategory {\n id\n name\n category\n }\n }\n }\n`;\n\nexport const UPDATE_DATA_SUB_CATEGORIES = gql`\n mutation TranscendCliUpdateDataSubCategories(\n $input: UpdateDataSubCategoriesInput!\n ) {\n updateDataSubCategories(input: $input) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\n// TODO: https://transcend.height.app/T-27909 - enable optimizations\n// orderBy: [\n// { field: createdAt, direction: ASC }\n// { field: name, direction: ASC }\n// ]\nexport const PROCESSING_PURPOSE_SUB_CATEGORIES = gql`\n query TranscendCliProcessingPurposeSubCategories(\n $first: Int!\n $offset: Int!\n ) {\n processingPurposeSubCategories(\n first: $first\n offset: $offset\n isExportCsv: true\n useMaster: false\n ) {\n nodes {\n id\n name\n purpose\n description\n teams {\n name\n }\n owners {\n email\n }\n attributeValues {\n attributeKey {\n name\n }\n name\n }\n }\n }\n }\n`;\n\nexport const CREATE_PROCESSING_PURPOSE_SUB_CATEGORY = gql`\n mutation TranscendCliCreateProcessingPurposeSubCategory(\n $input: CreateProcessingPurposeCategoryInput!\n ) {\n createProcessingPurposeSubCategory(input: $input) {\n processingPurposeSubCategory {\n id\n name\n purpose\n }\n }\n }\n`;\n\nexport const UPDATE_PROCESSING_PURPOSE_SUB_CATEGORIES = gql`\n mutation TranscendCliUpdateProcessingPurposeSubCategories(\n $input: UpdateProcessingPurposeSubCategoriesInput!\n ) {\n updateProcessingPurposeSubCategories(input: $input) {\n clientMutationId\n }\n }\n`;\n","import { gql } from 'graphql-request';\n\nexport const SOMBRA_VERSION = gql`\n query TranscendSombraVersion {\n organization {\n sombra {\n version\n }\n }\n }\n`;\n","import type {\n GraphQLClient,\n RequestDocument,\n Variables,\n} from 'graphql-request';\nimport { logger } from '../../logger';\nimport colors from 'colors';\n\nconst MAX_RETRIES = 4;\n\n/**\n * Sleep in a promise\n *\n * @param sleepTime - The time to sleep in milliseconds.\n * @returns Resolves promise\n */\nfunction sleepPromise(sleepTime: number): Promise<number> {\n return new Promise((resolve) => {\n setTimeout(() => resolve(sleepTime), sleepTime);\n });\n}\n\nconst KNOWN_ERRORS = [\n 'syntax error',\n 'got invalid value',\n 'Client error',\n 'cannot affect row a second time',\n 'GRAPHQL_VALIDATION_FAILED',\n];\n\n/**\n * Make a GraphQL request with retries\n *\n * @param client - GraphQL client\n * @param document - document\n * @param variables - Variable\n * @param requestHeaders - Headers\n * @param maxRequests - Max number of requests\n * @returns Response\n */\nexport async function makeGraphQLRequest<T, V extends Variables = Variables>(\n client: GraphQLClient,\n document: RequestDocument,\n variables?: V,\n requestHeaders?: Record<string, string> | string[][] | Headers,\n maxRequests = MAX_RETRIES,\n): Promise<T> {\n let retryCount = 0;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n try {\n const result = await client.request(document, variables, requestHeaders);\n return result as T;\n } catch (err) {\n if (err.message.includes('API key is invalid')) {\n logger.error(\n colors.red(\n 'API key is invalid. ' +\n 'Please ensure that the key provided to `transcendAuth` has the proper scope and is not expired, ' +\n 'and that `transcendUrl` corresponds to the correct backend for your organization.',\n ),\n );\n process.exit(1);\n }\n\n if (KNOWN_ERRORS.some((msg) => err.message.includes(msg))) {\n throw err;\n }\n\n // wait for rate limit to resolve\n if (err.message.startsWith('Client error: Too many requests')) {\n const rateLimitResetAt = err.response.headers?.get('x-ratelimit-reset');\n const sleepTime = rateLimitResetAt\n ? new Date(rateLimitResetAt).getTime() - new Date().getTime() + 100\n : 1000 * 10;\n logger.log(\n colors.yellow(\n `DETECTED RATE LIMIT: ${err.message}. Sleeping for ${sleepTime}ms`,\n ),\n );\n\n await sleepPromise(sleepTime);\n }\n\n if (retryCount >= maxRequests) {\n throw err;\n }\n retryCount += 1;\n logger.log(\n colors.yellow(\n `REQUEST FAILED: ${err.message}. Retrying ${retryCount}/${maxRequests}...`,\n ),\n );\n }\n }\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { IdentifierType, RequestAction } from '@transcend-io/privacy-types';\nimport { CREATE_IDENTIFIER, IDENTIFIERS, NEW_IDENTIFIER_TYPES } from './gqls';\nimport { keyBy, uniq, flatten, difference } from 'lodash-es';\nimport { TranscendInput } from '../../codecs';\nimport { logger } from '../../logger';\nimport colors from 'colors';\nimport { mapSeries } from '../bluebird-replace';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface Identifier {\n /** ID of identifier */\n id: string;\n /** Name of identifier */\n name: string;\n /** The type of identifier */\n type: IdentifierType;\n /** Regular expression to */\n regex: string;\n /** The set of options that the identifier */\n selectOptions: string[];\n /** Whether identifier is enabled on privacy center */\n privacyCenterVisibility: RequestAction[];\n /** Enabled data subjects that are exposed this identifier on the privacy center */\n dataSubjects: {\n /** type of data subjects */\n type: string;\n }[];\n /** Whether identifier is a required field in privacy center form */\n isRequiredInForm: boolean;\n /** Identifier placeholder text */\n placeholder: string;\n /** Display title for identifier */\n displayTitle: {\n /** Default message */\n defaultMessage: string;\n };\n /** Display description for identifier */\n displayDescription: {\n /** Default */\n defaultMessage: string;\n };\n /** Display order */\n displayOrder: number;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all identifiers in the organization\n *\n * @param client - GraphQL client\n * @returns All identifiers in the organization\n */\nexport async function fetchAllIdentifiers(\n client: GraphQLClient,\n): Promise<Identifier[]> {\n const identifiers: Identifier[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n identifiers: { nodes },\n } = await makeGraphQLRequest<{\n /** Identifiers */\n identifiers: {\n /** List */\n nodes: Identifier[];\n };\n }>(client, IDENTIFIERS, {\n first: PAGE_SIZE,\n offset,\n });\n identifiers.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return identifiers.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * Fetch all identifiers and if any are found in the config that are\n * missing, create those identifiers.\n *\n * @param input - Transcend input\n * @param client - GraphQL client\n * @param skipPublish - When true, skip publishing to privacy center\n * @returns A map from identifier name to Identifier\n */\nexport async function fetchIdentifiersAndCreateMissing(\n {\n enrichers = [],\n 'data-silos': dataSilos = [],\n identifiers = [],\n }: TranscendInput,\n client: GraphQLClient,\n skipPublish = false,\n): Promise<{ [k in string]: Identifier }> {\n // Grab all existing identifiers\n const allIdentifiers = await fetchAllIdentifiers(client);\n\n // Create a map\n const identifiersByName = keyBy(allIdentifiers, 'name');\n\n // Determine expected set of identifiers\n const expectedIdentifiers = uniq([\n ...flatten(\n enrichers.map((enricher) => [\n enricher['input-identifier'],\n ...enricher['output-identifiers'],\n ]),\n ),\n ...flatten(dataSilos.map((dataSilo) => dataSilo['identity-keys'])),\n ...identifiers.map(({ name }) => name),\n ]).filter((x) => !!x);\n const missingIdentifiers = difference(\n expectedIdentifiers,\n allIdentifiers.map(({ name }) => name),\n );\n\n // If there are missing identifiers, create new ones\n if (missingIdentifiers.length > 0) {\n logger.info(\n colors.magenta(\n `Creating ${missingIdentifiers.length} new identifiers...`,\n ),\n );\n const { newIdentifierTypes } = await makeGraphQLRequest<{\n /** Query response */\n newIdentifierTypes: {\n /** Name of identifier type remaining */\n name: string;\n }[];\n }>(client, NEW_IDENTIFIER_TYPES);\n const nativeTypesRemaining = newIdentifierTypes.map(({ name }) => name);\n await mapSeries(missingIdentifiers, async (identifier) => {\n logger.info(colors.magenta(`Creating identifier ${identifier}...`));\n const { createIdentifier } = await makeGraphQLRequest<{\n /** createIdentifier Response */\n createIdentifier: {\n /** Created identifier */\n identifier: Identifier;\n };\n }>(client, CREATE_IDENTIFIER, {\n input: {\n name: identifier,\n type: nativeTypesRemaining.includes(identifier!)\n ? identifier\n : 'custom',\n skipPublish,\n },\n });\n logger.info(colors.green(`Created identifier ${identifier}!`));\n\n identifiersByName[identifier!] = createIdentifier.identifier;\n });\n }\n return identifiersByName;\n}\n","import { IdentifierInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { UPDATE_IDENTIFIER } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport type { DataSubject } from './fetchDataSubjects';\n\n/**\n * Sync the consent manager\n *\n * @param client - GraphQL client\n * @param options - Options\n */\nexport async function syncIdentifier(\n client: GraphQLClient,\n {\n identifier,\n dataSubjectsByName,\n identifierId,\n skipPublish = false,\n }: {\n /** Identifier update input */\n identifier: IdentifierInput;\n /** Data subject lookup by name */\n dataSubjectsByName: { [k in string]: DataSubject };\n /** Existing identifier Id */\n identifierId: string;\n /** When true, skip publishing to privacy center */\n skipPublish?: boolean;\n },\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_IDENTIFIER, {\n input: {\n id: identifierId,\n selectOptions: identifier.selectOptions,\n isRequiredInForm: identifier.isRequiredInForm,\n regex: identifier.regex,\n placeholder: identifier.placeholder,\n displayTitle: identifier.displayTitle,\n displayDescription: identifier.displayDescription,\n displayOrder: identifier.displayOrder,\n privacyCenterVisibility: identifier.privacyCenterVisibility,\n dataSubjectIds: identifier.dataSubjects\n ? identifier.dataSubjects.map((type) => dataSubjectsByName[type].id)\n : undefined,\n skipPublish,\n },\n });\n}\n","import { EnricherInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { ENRICHERS, CREATE_ENRICHER, UPDATE_ENRICHER } from './gqls';\nimport {\n EnricherType,\n IsoCountryCode,\n IsoCountrySubdivisionCode,\n PreflightRequestStatus,\n RequestAction,\n} from '@transcend-io/privacy-types';\nimport { Identifier } from './fetchIdentifiers';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { DataSubject } from './fetchDataSubjects';\n\nexport interface Enricher {\n /** ID of enricher */\n id: string;\n /** Title of enricher */\n title: string;\n /** URL of enricher */\n url: string;\n /** Server silo */\n type: EnricherType;\n /** Input identifier */\n inputIdentifier: {\n /** Identifier name */\n name: string;\n };\n /** The selected actions */\n actions: RequestAction[];\n /** Output identifiers */\n identifiers: {\n /** Identifier name */\n name: string;\n }[];\n /** Data subjects that the preflight check is configured for */\n dataSubjects: {\n /** Data subject type */\n type: string;\n }[];\n /** The duration (in ms) that the enricher should take to execute. - BigInt */\n expirationDuration: string;\n /** Looker query title */\n lookerQueryTitle?: string;\n /** A regular expression that can be used to match on for cancelation */\n testRegex?: string;\n /** The status that the enricher should transfer to when condition is met. */\n transitionRequestStatus?: PreflightRequestStatus;\n /** The twilio phone number to send from */\n phoneNumbers: string[];\n /**\n * The list of regions that should trigger the enrichment condition\n */\n regionList: (IsoCountryCode | IsoCountrySubdivisionCode)[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all enrichers in the organization\n *\n * @param client - GraphQL client\n * @param title - Filter by title\n * @returns All enrichers in the organization\n */\nexport async function fetchAllEnrichers(\n client: GraphQLClient,\n title?: string,\n): Promise<Enricher[]> {\n const enrichers: Enricher[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n enrichers: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n enrichers: {\n /** List of matches */\n nodes: Enricher[];\n };\n }>(client, ENRICHERS, {\n first: PAGE_SIZE,\n offset,\n title,\n });\n enrichers.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return enrichers.sort((a, b) => a.title.localeCompare(b.title));\n}\n\n/**\n * Sync an enricher configuration\n *\n * @param client - GraphQL client\n * @param options - Options\n */\nexport async function syncEnricher(\n client: GraphQLClient,\n {\n enricher,\n identifierByName,\n dataSubjectsByName,\n }: {\n /** The enricher input */\n enricher: EnricherInput;\n /** Index of identifiers in the organization */\n identifierByName: { [name in string]: Identifier };\n /** Lookup data subject by name */\n dataSubjectsByName: { [name in string]: DataSubject };\n },\n): Promise<void> {\n // Whether to continue looping\n const matches = await fetchAllEnrichers(client, enricher.title);\n const existingEnricher = matches.find(\n ({ title }) => title === enricher.title,\n );\n\n // Map to data subject Ids\n const dataSubjectIds = enricher['data-subjects']?.map((subject) => {\n const existing = dataSubjectsByName[subject];\n if (!existing) {\n throw new Error(`Failed to find a data subject with name: ${subject}`);\n }\n return existing.id;\n });\n\n // If enricher exists, update it, else create new\n const inputIdentifier = enricher['input-identifier'];\n const actionUpdates =\n enricher['privacy-actions'] || Object.values(RequestAction);\n if (existingEnricher) {\n await makeGraphQLRequest(client, UPDATE_ENRICHER, {\n input: {\n id: existingEnricher.id,\n title: enricher.title,\n url: enricher.url,\n headers: enricher.headers,\n testRegex: enricher.testRegex,\n lookerQueryTitle: enricher.lookerQueryTitle,\n expirationDuration:\n typeof enricher.expirationDuration === 'number'\n ? enricher.expirationDuration.toString()\n : undefined,\n transitionRequestStatus: enricher.transitionRequestStatus,\n phoneNumbers: enricher.phoneNumbers,\n regionList: enricher.regionList,\n dataSubjectIds,\n description: enricher.description || '',\n inputIdentifier: inputIdentifier\n ? identifierByName[inputIdentifier].id\n : undefined,\n identifiers: enricher['output-identifiers'].map(\n (id) => identifierByName[id].id,\n ),\n ...(existingEnricher.type === EnricherType.Sombra\n ? {}\n : { actions: actionUpdates }),\n },\n });\n } else if (inputIdentifier) {\n await makeGraphQLRequest(client, CREATE_ENRICHER, {\n input: {\n title: enricher.title,\n url: enricher.url,\n type: enricher.type || EnricherType.Server,\n headers: enricher.headers,\n testRegex: enricher.testRegex,\n lookerQueryTitle: enricher.lookerQueryTitle,\n expirationDuration:\n typeof enricher.expirationDuration === 'number'\n ? enricher.expirationDuration.toString()\n : undefined,\n transitionRequestStatus: enricher.transitionRequestStatus,\n phoneNumbers: enricher.phoneNumbers,\n dataSubjectIds,\n regionList: enricher.regionList,\n description: enricher.description || '',\n inputIdentifier: identifierByName[inputIdentifier].id,\n identifiers: enricher['output-identifiers'].map(\n (id) => identifierByName[id].id,\n ),\n actions: actionUpdates,\n },\n });\n }\n}\n","import { AttributeInput } from '../../codecs';\nimport colors from 'colors';\nimport { keyBy, difference, groupBy } from 'lodash-es';\nimport { GraphQLClient } from 'graphql-request';\nimport {\n CREATE_ATTRIBUTE,\n CREATE_ATTRIBUTE_VALUES,\n DELETE_ATTRIBUTE_VALUE,\n UPDATE_ATTRIBUTE,\n UPDATE_ATTRIBUTE_VALUES,\n} from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { Attribute } from './fetchAllAttributes';\nimport { map } from '../bluebird-replace';\nimport { logger } from '../../logger';\n\n/**\n * Sync attribute\n *\n * @param client - GraphQL client\n * @param attribute - The attribute input\n * @param options - Options\n */\nexport async function syncAttribute(\n client: GraphQLClient,\n attribute: AttributeInput,\n {\n existingAttribute,\n deleteExtraAttributeValues,\n }: {\n /** The existing attribute configuration if it exists */\n existingAttribute?: Attribute;\n /** When true, delete extra attributes not specified in the list of values */\n deleteExtraAttributeValues?: boolean;\n },\n): Promise<void> {\n // attribute key input\n const input = {\n name: attribute.name,\n enabledOn: attribute.resources,\n };\n\n // create or update attribute key\n let attributeKeyId: string;\n if (!existingAttribute) {\n const {\n createAttributeKey: { attributeKey },\n } = await makeGraphQLRequest<{\n /** Create attribute key response */\n createAttributeKey: {\n /** Attribute key */\n attributeKey: {\n /** ID */\n id: string;\n };\n };\n }>(client, CREATE_ATTRIBUTE, {\n type: attribute.type,\n description: attribute.description,\n ...input,\n });\n attributeKeyId = attributeKey.id;\n } else {\n await makeGraphQLRequest(client, UPDATE_ATTRIBUTE, {\n attributeKeyId: existingAttribute.id,\n description: existingAttribute.isCustom\n ? attribute.description\n : undefined,\n ...input,\n });\n attributeKeyId = existingAttribute.id;\n }\n\n // upsert attribute values\n const existingAttributeMap = keyBy(existingAttribute?.values || [], 'name');\n const { existingValues = [], newValues = [] } = groupBy(\n attribute.values || [],\n (field) =>\n existingAttributeMap[field.name] ? 'existingValues' : 'newValues',\n );\n const removedValues = difference(\n (existingAttribute?.values || []).map(({ name }) => name),\n (attribute.values || []).map(({ name }) => name),\n );\n\n // Create new attribute values\n if (newValues.length > 0) {\n await makeGraphQLRequest(client, CREATE_ATTRIBUTE_VALUES, {\n input: newValues.map(({ name, ...rest }) => ({\n name,\n attributeKeyId,\n ...rest,\n })),\n });\n logger.info(colors.green(`Created ${newValues.length} attribute values`));\n }\n\n // Update existing attribute values\n if (existingValues.length > 0) {\n await makeGraphQLRequest(client, UPDATE_ATTRIBUTE_VALUES, {\n input: existingValues.map(({ name, ...rest }) => ({\n id: existingAttributeMap[name].id,\n name,\n description: existingAttributeMap[name].description,\n color: existingAttributeMap[name].color,\n ...rest,\n attributeKeyId,\n })),\n });\n logger.info(\n colors.green(`Updated ${existingValues.length} attribute values`),\n );\n }\n\n // Delete removed attribute values\n if (removedValues.length > 0 && deleteExtraAttributeValues) {\n await map(\n removedValues,\n async (value) => {\n await makeGraphQLRequest(client, DELETE_ATTRIBUTE_VALUE, {\n id: existingAttributeMap[value].id,\n });\n },\n {\n concurrency: 10,\n },\n );\n logger.info(\n colors.green(`Deleted ${removedValues.length} attribute values`),\n );\n }\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { CREATE_DATA_SUBJECT, DATA_SUBJECTS } from './gqls';\nimport { keyBy, flatten, uniq, difference } from 'lodash-es';\nimport { RequestActionObjectResolver } from '@transcend-io/privacy-types';\nimport { TranscendInput } from '../../codecs';\nimport { logger } from '../../logger';\nimport colors from 'colors';\nimport { mapSeries } from '../bluebird-replace';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface DataSubject {\n /** ID of data subject */\n id: string;\n /** Type of data subject */\n type: string;\n /** Whether active */\n active: boolean;\n /** Title of data subject */\n title: {\n /** Default message */\n defaultMessage: string;\n };\n /** Whether silent mode is enabled by default */\n adminDashboardDefaultSilentMode: boolean;\n /** Enabled actions */\n actions: {\n /** Type of action */\n type: RequestActionObjectResolver;\n }[];\n}\n\n/**\n * Fetch all data subjects in an organization\n *\n * @param client - GraphQL client\n * @returns List of data subject configurations\n */\nexport async function fetchAllDataSubjects(\n client: GraphQLClient,\n): Promise<DataSubject[]> {\n // Fetch all data subjects in the organization\n const { internalSubjects } = await makeGraphQLRequest<{\n /** Query response */\n internalSubjects: DataSubject[];\n }>(client, DATA_SUBJECTS);\n return internalSubjects;\n}\n\n/**\n * Fetch all of the data subjects in the organization\n *\n * @param input - Input to fetch\n * @param client - GraphQL client\n * @param fetchAll - When true, always fetch all subjects\n * @returns The list of data subjects\n */\nexport async function ensureAllDataSubjectsExist(\n {\n 'data-silos': dataSilos = [],\n 'data-subjects': dataSubjects = [],\n enrichers = [],\n }: TranscendInput,\n client: GraphQLClient,\n fetchAll = false,\n): Promise<{ [type in string]: DataSubject }> {\n // Only need to fetch data subjects if specified in config\n const expectedDataSubjects = uniq([\n ...flatten(dataSilos.map((silo) => silo['data-subjects'] || []) || []),\n ...flatten(\n enrichers.map((enricher) => enricher['data-subjects'] || []) || [],\n ),\n ...dataSubjects.map((subject) => subject.type),\n ]);\n if (expectedDataSubjects.length === 0 && !fetchAll) {\n return {};\n }\n\n // Fetch all data subjects in the organization\n const internalSubjects = await fetchAllDataSubjects(client);\n const dataSubjectByName = keyBy(internalSubjects, 'type');\n\n // Determine expected set of data subjects to create\n const missingDataSubjects = difference(\n expectedDataSubjects,\n internalSubjects.map(({ type }) => type),\n );\n\n // If there are missing data subjects, create new ones\n if (missingDataSubjects.length > 0) {\n logger.info(\n colors.magenta(\n `Creating ${missingDataSubjects.length} new data subjects...`,\n ),\n );\n await mapSeries(missingDataSubjects, async (dataSubject) => {\n logger.info(colors.magenta(`Creating data subject ${dataSubject}...`));\n const { createSubject } = await makeGraphQLRequest<{\n /** Create Subject Response */\n createSubject: {\n /** Created Data Subject */\n subject: DataSubject;\n };\n }>(client, CREATE_DATA_SUBJECT, {\n type: dataSubject,\n skipPublish: true,\n });\n logger.info(colors.green(`Created data subject ${dataSubject}!`));\n\n dataSubjectByName[dataSubject] = createSubject.subject;\n });\n }\n\n return dataSubjectByName;\n}\n\n/**\n * Convert a list of data subject types into the block list of IDs to assign to the data silo\n *\n * @param dataSubjectTypes - The list of data subject types that the data silo should be for\n * @param allDataSubjects - All data subjects in the organization\n * @returns The block list of data subject ids to not process against this data silo\n */\nexport function convertToDataSubjectBlockList(\n dataSubjectTypes: string[],\n allDataSubjects: { [type in string]: DataSubject },\n): string[] {\n dataSubjectTypes.forEach((type) => {\n if (!allDataSubjects[type]) {\n throw new Error(`Expected to find data subject definition: ${type}`);\n }\n });\n\n return Object.values(allDataSubjects)\n .filter((silo) => !dataSubjectTypes.includes(silo.type))\n .map(({ id }) => id);\n}\n\n/**\n * Convert a list of data subject types into the allow list of types\n *\n * @param dataSubjectTypes - The list of data subject types that the data silo should be for\n * @param allDataSubjects - All data subjects in the organization\n * @returns The allow list of data subjects for that silo\n */\nexport function convertToDataSubjectAllowlist(\n dataSubjectTypes: string[],\n allDataSubjects: { [type in string]: DataSubject },\n): string[] {\n dataSubjectTypes.forEach((type) => {\n if (!allDataSubjects[type]) {\n throw new Error(`Expected to find data subject definition: ${type}`);\n }\n });\n\n return Object.values(allDataSubjects)\n .filter((silo) => !dataSubjectTypes.includes(silo.type))\n .map(({ type }) => type);\n}\n","/* eslint-disable max-lines */\nimport cliProgress from 'cli-progress';\nimport {\n DataCategoryInput,\n DataSiloInput,\n ProcessingPurposeInput,\n} from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { logger } from '../../logger';\nimport colors from 'colors';\nimport { mapSeries, map } from '../bluebird-replace';\nimport {\n DATA_SILOS,\n CREATE_DATA_SILOS,\n UPDATE_OR_CREATE_DATA_POINT,\n DATA_POINTS,\n SUB_DATA_POINTS,\n UPDATE_DATA_SILOS,\n DATA_SILOS_ENRICHED,\n SUB_DATA_POINTS_WITH_GUESSES,\n} from './gqls';\nimport {\n convertToDataSubjectBlockList,\n DataSubject,\n} from './fetchDataSubjects';\nimport { ApiKey } from './fetchApiKeys';\nimport {\n IsoCountryCode,\n IsoCountrySubdivisionCode,\n PromptAVendorEmailCompletionLinkType,\n PromptAVendorEmailSendType,\n ConfidenceLabel,\n RequestActionObjectResolver,\n SubDataPointDataSubCategoryGuessStatus,\n} from '@transcend-io/privacy-types';\nimport { sortBy, chunk, keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { apply } from '@transcend-io/type-utils';\n\nexport interface DataSiloAttributeValue {\n /** Key associated to value */\n attributeKey: {\n /** Name of key */\n name: string;\n };\n /** Name of value */\n name: string;\n}\nexport interface DataSilo {\n /** ID of dataSilo */\n id: string;\n /** Title of dataSilo */\n title: string;\n /** Type of silo */\n type: string;\n /** The link to the data silo */\n link: string;\n /** Attribute labels */\n attributeValues: DataSiloAttributeValue[];\n /** description */\n description: string;\n /** Metadata for this data silo */\n catalog: {\n /** Whether the data silo supports automated vendor coordination */\n hasAvcFunctionality: boolean;\n };\n}\n\nconst BATCH_SILOS_LIMIT = 20;\n\n/**\n * Fetch all dataSilos in the organization\n *\n * @param client - GraphQL client\n * @param title - Filter by title\n * @returns All dataSilos in the organization\n */\nexport async function fetchAllDataSilos<TDataSilo extends DataSilo>(\n client: GraphQLClient,\n {\n titles,\n pageSize,\n ids = [],\n gql = DATA_SILOS,\n integrationNames = [],\n }: {\n /** Page size to fetch datapoints in */\n pageSize: number;\n /** Title */\n titles?: string[];\n /** IDs */\n ids?: string[];\n /** Set of integration names to fetch */\n integrationNames?: string[];\n /** GQL query for data silos */\n gql?: string;\n },\n): Promise<TDataSilo[]> {\n logger.info(\n colors.magenta(\n `Fetching ${ids.length === 0 ? 'all' : ids.length} Data Silos...`,\n ),\n );\n\n const dataSilos: TDataSilo[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n dataSilos: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n dataSilos: {\n /** List of matches */\n nodes: TDataSilo[];\n };\n }>(client, gql, {\n filterBy: {\n ids: ids.length > 0 ? ids : undefined,\n type: integrationNames.length > 0 ? integrationNames : undefined,\n titles,\n },\n first: pageSize,\n offset,\n });\n dataSilos.push(...nodes);\n offset += pageSize;\n shouldContinue = nodes.length === pageSize;\n } while (shouldContinue);\n logger.info(\n colors.green(\n `Found a total of ${dataSilos.length} data silo${\n ids.length > 0 ? ` matching IDs ${ids.join(',')}` : ''\n }s${\n integrationNames.length > 0\n ? ` matching integrationNames ${integrationNames.join(',')}`\n : ''\n }`,\n ),\n );\n\n return dataSilos.sort((a, b) => a.title.localeCompare(b.title));\n}\n\nexport interface SubDataPoint {\n /** Name (or key) of the subdatapoint */\n name: string;\n /** The description */\n description?: string;\n /** Personal data category */\n categories: DataCategoryInput[];\n /** The processing purpose for this sub datapoint */\n purposes: ProcessingPurposeInput[];\n /**\n * When true, this subdatapoint should be revealed in a data access request.\n * When false, this field should be redacted\n */\n accessRequestVisibilityEnabled: boolean;\n /**\n * When true, this subdatapoint should be redacted during an erasure request.\n * There normally is a choice of enabling hard deletion or redaction at the\n * datapoint level, but if redaction is enabled, this column can be used\n * to define which fields should be redacted.\n */\n erasureRequestRedactionEnabled: boolean;\n /** Attribute attached to subdatapoint */\n attributeValues: DataSiloAttributeValue[];\n /** Data category guesses that are output by the classifier */\n pendingCategoryGuesses?: {\n /** Data category being guessed */\n category: DataCategoryInput;\n /** Status of guess */\n status: SubDataPointDataSubCategoryGuessStatus;\n /** Confidence level of guess */\n confidence: number;\n /** Confidence label */\n confidenceLabel: ConfidenceLabel;\n /** classifier version that produced the guess */\n classifierVersion: number;\n }[];\n}\n\ninterface DataPoint {\n /** ID of dataPoint */\n id: string;\n /** Title of dataPoint */\n title: {\n /** Default message */\n defaultMessage: string;\n };\n /** The path to this data point */\n path: string[];\n /** Description */\n description: {\n /** Default message */\n defaultMessage: string;\n };\n /** Name */\n name: string;\n /** Global actions */\n actionSettings: {\n /** Action type */\n type: RequestActionObjectResolver;\n /** Is enabled */\n active: boolean;\n }[];\n /** Data collection tag for privacy request download zip labeling */\n dataCollection?: {\n /** Title of data collection */\n title: {\n /** Default message (since message can be translated) */\n defaultMessage: string;\n };\n };\n /** Metadata for this data silo */\n catalog: {\n /** Whether the data silo supports automated vendor coordination */\n hasAvcFunctionality: boolean;\n };\n /** Owners of the datapoint */\n owners: {\n /** Email address of the owner */\n email: string;\n }[];\n /** Teams that own the datapoint */\n teams: {\n /** Name of the team */\n name: string;\n }[];\n /** Database integration queries */\n dbIntegrationQueries: {\n /** Approved query */\n query: string | null;\n /** Suggested query */\n suggestedQuery: string | null;\n /** Request action */\n requestType: RequestActionObjectResolver;\n }[];\n}\n\ninterface DataPointWithSubDataPoint extends DataPoint {\n /** The associated subdatapoints */\n subDataPoints: SubDataPoint[];\n}\n\n/**\n * Helper to fetch all subdatapoints for a given datapoint\n *\n * @param client - The GraphQL client\n * @param dataPointId - The datapoint ID\n * @param options - Options\n * @returns The list of subdatapoints\n */\nexport async function fetchAllSubDataPoints(\n client: GraphQLClient,\n dataPointId: string,\n {\n debug,\n includeGuessedCategories,\n pageSize,\n }: {\n /** Debug logs */\n debug: boolean;\n /** Page size */\n pageSize: number;\n /** When true, metadata around guessed data categories should be included */\n includeGuessedCategories?: boolean;\n },\n): Promise<SubDataPoint[]> {\n const subDataPoints: SubDataPoint[] = [];\n\n let offset = 0;\n\n let shouldContinue = false;\n do {\n try {\n if (debug) {\n logger.log(\n colors.magenta(`Pulling in subdatapoints for offset ${offset}`),\n );\n }\n const {\n subDataPoints: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n subDataPoints: {\n /** List of matches */\n nodes: SubDataPoint[];\n };\n }>(\n client,\n includeGuessedCategories\n ? SUB_DATA_POINTS_WITH_GUESSES\n : SUB_DATA_POINTS,\n {\n first: pageSize,\n filterBy: {\n dataPoints: [dataPointId],\n },\n offset,\n },\n );\n\n subDataPoints.push(...nodes);\n offset += pageSize;\n shouldContinue = nodes.length === pageSize;\n\n if (debug) {\n logger.log(\n colors.green(\n `Pulled in subdatapoints for offset ${offset} for dataPointId=${dataPointId}`,\n ),\n );\n }\n } catch (err) {\n logger.error(\n colors.red(\n `An error fetching subdatapoints for offset ${offset} for dataPointId=${dataPointId}`,\n ),\n );\n throw err;\n }\n } while (shouldContinue);\n return sortBy(subDataPoints, 'name');\n}\n\n/**\n * Fetch all datapoints for a data silo\n *\n * @param client - GraphQL client\n * @param dataSiloId - Data silo ID\n * @param options - Options\n * @returns List of datapoints\n */\nexport async function fetchAllDataPoints(\n client: GraphQLClient,\n dataSiloId: string,\n {\n debug,\n pageSize,\n skipSubDatapoints,\n includeGuessedCategories,\n }: {\n /** Debug logs */\n debug: boolean;\n /** Page size */\n pageSize: number;\n /** Skip fetching of subdatapoints */\n skipSubDatapoints?: boolean;\n /** When true, metadata around guessed data categories should be included */\n includeGuessedCategories?: boolean;\n },\n): Promise<DataPointWithSubDataPoint[]> {\n const dataPoints: DataPointWithSubDataPoint[] = [];\n\n // TODO: https://transcend.height.app/T-40481 - add cursor pagination\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n if (debug) {\n logger.info(colors.magenta(`Fetching datapoints with offset: ${offset}`));\n }\n\n const {\n dataPoints: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n dataPoints: {\n /** List of matches */\n nodes: DataPoint[];\n };\n }>(client, DATA_POINTS, {\n first: pageSize,\n filterBy: {\n dataSilos: [dataSiloId],\n },\n offset,\n });\n\n if (debug) {\n logger.info(\n colors.magenta(\n `Fetched ${nodes.length} datapoints at offset: ${offset}`,\n ),\n );\n }\n\n if (!skipSubDatapoints) {\n await map(\n nodes,\n /* eslint-disable no-loop-func */\n async (node) => {\n try {\n if (debug) {\n logger.info(\n colors.magenta(\n `Fetching subdatapoints for ${node.name} for datapoint offset ${offset}`,\n ),\n );\n }\n\n const subDataPoints = await fetchAllSubDataPoints(client, node.id, {\n pageSize: 1000, // max page size\n debug,\n includeGuessedCategories,\n });\n dataPoints.push({\n ...node,\n subDataPoints: subDataPoints.sort((a, b) =>\n a.name.localeCompare(b.name),\n ),\n });\n\n if (debug) {\n logger.info(\n colors.green(\n `Successfully fetched subdatapoints for ${node.name}`,\n ),\n );\n }\n } catch (err) {\n logger.error(\n colors.red(\n `An error fetching subdatapoints for ${node.name} datapoint offset ${offset}`,\n ),\n );\n throw err;\n }\n },\n /* eslint-enable no-loop-func */\n {\n concurrency: 5,\n },\n );\n\n if (debug) {\n logger.info(\n colors.green(\n `Fetched all subdatapoints for page of datapoints at offset: ${offset}`,\n ),\n );\n }\n }\n\n offset += pageSize;\n shouldContinue = nodes.length === pageSize;\n } while (shouldContinue);\n return dataPoints.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport interface DataSiloEnriched {\n /** ID of dataSilo */\n id: string;\n /** Title of dataSilo */\n title: string;\n /** Type of silo */\n type: string;\n /** Link to silo */\n link: string;\n /** Outer type of silo */\n outerType: string;\n /** Description of data silo */\n description: string;\n /** Webhook URL */\n url?: string;\n /** Email address of user to notify for prompt a person use case */\n notifyEmailAddress?: string;\n /** Associated API keys */\n apiKeys: {\n /** Title */\n title: string;\n }[];\n /** Data subject block list */\n subjectBlocklist: {\n /** Type of data subject */\n type: string;\n }[];\n /** Identifiers */\n identifiers: {\n /** Name of identifier */\n name: string;\n /** True if identifier is wired */\n isConnected: boolean;\n }[];\n /** Dependent data silos */\n dependentDataSilos: {\n /** Title of silo */\n title: string;\n }[];\n /** Silo owners */\n owners: {\n /** Email owners */\n email: string;\n }[];\n /** The teams assigned to this data silo */\n teams: {\n /** Name of the team assigned to this data silo */\n name: string;\n }[];\n /** Metadata for this data silo */\n catalog: {\n /** Whether the data silo supports automated vendor coordination */\n hasAvcFunctionality: boolean;\n };\n /** Silo is live */\n isLive: boolean;\n /** Hosting country of data silo */\n country?: IsoCountryCode;\n /** Hosting subdivision data silo */\n countrySubDivision?: IsoCountrySubdivisionCode;\n /**\n * The frequency with which we should be sending emails for this data silo, in milliseconds.\n */\n promptAVendorEmailSendFrequency: number;\n /**\n * The type of emails to send for this data silo, i.e. send an email for each DSR, across all open DSRs,\n * or per profile in a DSR.\n */\n promptAVendorEmailSendType: PromptAVendorEmailSendType;\n /**\n * Indicates whether prompt-a-vendor emails should include a list of identifiers\n * in addition to a link to the bulk processing UI.\n */\n promptAVendorEmailIncludeIdentifiersAttachment: boolean;\n /**\n * Indicates what kind of link to generate as part of the emails sent out for this Prompt-a-Vendor silo.\n */\n promptAVendorEmailCompletionLinkType: PromptAVendorEmailCompletionLinkType;\n /**\n * The frequency with which we should retry sending emails for this data silo, in milliseconds.\n * Needs to be a string because the number can be larger than the MAX_INT\n */\n manualWorkRetryFrequency: string;\n /** Attribute values tagged to data silo */\n attributeValues: DataSiloAttributeValue[];\n /**\n * The data silos that discovered this particular data silo\n */\n discoveredBy: {\n /** Title of data silo */\n title: string;\n }[];\n /**\n * The business entities assigned directly to this data silo\n */\n businessEntities: {\n /** Title of business entity */\n title: string;\n }[];\n}\n\n/**\n * Fetch all dataSilos with additional metadata\n *\n * @param client - GraphQL client\n * @param options - Filter options\n * @returns All dataSilos in the organization\n */\nexport async function fetchEnrichedDataSilos(\n client: GraphQLClient,\n {\n ids,\n pageSize,\n titles,\n debug,\n skipDatapoints,\n skipSubDatapoints,\n includeGuessedCategories,\n integrationNames,\n }: {\n /** Page size */\n pageSize: number;\n /** Filter by IDs */\n ids?: string[];\n /** Enable debug logs */\n debug: boolean;\n /** Filter by title */\n titles?: string[];\n /** Integration names */\n integrationNames?: string[];\n /** Skip fetching of datapoints */\n skipDatapoints?: boolean;\n /** Skip fetching of subdatapoints */\n skipSubDatapoints?: boolean;\n /** When true, metadata around guessed data categories should be included */\n includeGuessedCategories?: boolean;\n },\n): Promise<[DataSiloEnriched, DataPointWithSubDataPoint[]][]> {\n const dataSilos: [DataSiloEnriched, DataPointWithSubDataPoint[]][] = [];\n\n // Grab silos\n const silos = await fetchAllDataSilos<DataSiloEnriched>(client, {\n titles,\n ids,\n integrationNames,\n pageSize,\n gql: DATA_SILOS_ENRICHED,\n });\n\n // Graph datapoints for each silo\n if (!skipDatapoints) {\n await mapSeries(silos, async (silo, index) => {\n logger.info(\n colors.magenta(\n `[${index + 1}/${silos.length}] Fetching data silo - ${silo.title}`,\n ),\n );\n\n const dataPoints = await fetchAllDataPoints(client, silo.id, {\n debug,\n pageSize,\n skipSubDatapoints,\n includeGuessedCategories,\n });\n\n if (debug) {\n logger.info(\n colors.green(\n `[${index + 1}/${\n silos.length\n }] Successfully fetched datapoint for - ${silo.title}`,\n ),\n );\n }\n\n dataSilos.push([silo, dataPoints]);\n });\n }\n\n logger.info(\n colors.green(\n `Successfully fetched all ${silos.length} data silo configurations`,\n ),\n );\n\n return dataSilos;\n}\n\n/**\n * Sync a data silo configuration\n *\n * @param dataSilos - Data silos to sync\n * @param client - GraphQL client\n * @param options - Options\n * @returns Data silo info\n */\nexport async function syncDataSilos(\n dataSilos: DataSiloInput[],\n client: GraphQLClient,\n {\n pageSize,\n dataSubjectsByName,\n apiKeysByTitle,\n }: {\n /** Page size */\n pageSize: number;\n /** The data subjects in the organization */\n dataSubjectsByName: { [type in string]: DataSubject };\n /** API key title to API key */\n apiKeysByTitle: { [title in string]: ApiKey };\n },\n): Promise<{\n /** Whether successfully updated */\n success: boolean;\n /** A mapping between data silo title to data silo ID */\n dataSiloTitleToId: { [k in string]: string };\n}> {\n let encounteredError = false;\n\n // Time duration\n const t0 = new Date().getTime();\n logger.info(colors.magenta(`Syncing \"${dataSilos.length}\" data silos...`));\n\n // Determine the set of data silos that already exist\n const existingDataSilos = await fetchAllDataSilos(client, {\n titles: dataSilos.map(({ title }) => title),\n pageSize,\n });\n\n // Create a mapping of title -> existing silo, if it exists\n const existingDataSiloByTitle = keyBy<Pick<DataSilo, 'id' | 'title'>>(\n existingDataSilos,\n 'title',\n );\n\n // Create new silos that do not exist\n const newDataSiloInputs = dataSilos.filter(\n ({ title }) => !existingDataSiloByTitle[title],\n );\n if (newDataSiloInputs.length > 0) {\n logger.info(\n colors.magenta(\n `Creating \"${newDataSiloInputs.length}\" data silos that did not exist...`,\n ),\n );\n\n // Batch the creation\n const chunked = chunk(newDataSiloInputs, BATCH_SILOS_LIMIT);\n await mapSeries(chunked, async (dependencyUpdateChunk) => {\n const {\n createDataSilos: { dataSilos },\n } = await makeGraphQLRequest<{\n /** Mutation result */\n createDataSilos: {\n /** New data silos */\n dataSilos: Pick<DataSilo, 'id' | 'title'>[];\n };\n }>(client, CREATE_DATA_SILOS, {\n input: dependencyUpdateChunk.map((input) => ({\n name: input['outer-type'] || input.integrationName,\n title: input.title,\n country: input.country,\n countrySubDivision: input.countrySubDivision,\n })),\n });\n\n // save mapping of title and id\n dataSilos.forEach((silo) => {\n existingDataSiloByTitle[silo.title] = silo;\n });\n });\n\n logger.info(\n colors.green(\n `Successfully created \"${newDataSiloInputs.length}\" data silos!`,\n ),\n );\n }\n\n // Batch the updates\n const chunkedUpdates = chunk(dataSilos, BATCH_SILOS_LIMIT);\n await mapSeries(chunkedUpdates, async (dataSiloUpdateChunk, ind) => {\n logger.info(\n colors.magenta(\n `[Batch ${ind + 1}/${chunkedUpdates.length}] Syncing \"${\n dataSiloUpdateChunk.length\n }\" data silos`,\n ),\n );\n await makeGraphQLRequest<{\n /** Mutation result */\n updateDataSilos: {\n /** New data silos */\n dataSilos: Pick<DataSilo, 'id' | 'title'>[];\n };\n }>(client, UPDATE_DATA_SILOS, {\n input: {\n dataSilos: dataSiloUpdateChunk.map((input) => ({\n id: existingDataSiloByTitle[input.title].id,\n country: input.country,\n countrySubDivision: input.countrySubDivision,\n url: input.url,\n headers: input.headers,\n description: input.description,\n identifiers: input['identity-keys'],\n isLive: !input.disabled,\n ownerEmails: input.owners,\n teamNames: input.teams,\n // clear out if not specified, otherwise the update needs to be applied after\n // all data silos are created\n dependedOnDataSiloTitles: input['deletion-dependencies']\n ? undefined\n : [],\n apiKeyId: input['api-key-title']\n ? apiKeysByTitle[input['api-key-title']].id\n : undefined,\n dataSubjectBlockListIds: input['data-subjects']\n ? convertToDataSubjectBlockList(\n input['data-subjects'],\n dataSubjectsByName,\n )\n : undefined,\n attributes: input.attributes,\n businessEntityTitles: input.businessEntityTitles,\n // AVC settings\n notifyEmailAddress: input['email-settings']?.['notify-email-address'],\n promptAVendorEmailSendFrequency:\n input['email-settings']?.['send-frequency'],\n promptAVendorEmailSendType: input['email-settings']?.['send-type'],\n promptAVendorEmailIncludeIdentifiersAttachment:\n input['email-settings']?.['include-identifiers-attachment'],\n promptAVendorEmailCompletionLinkType:\n input['email-settings']?.['completion-link-type'],\n manualWorkRetryFrequency:\n input['email-settings']?.['manual-work-retry-frequency'],\n })),\n },\n });\n logger.info(\n colors.green(\n `[Batch ${ind + 1}/${chunkedUpdates.length}] Synced \"${\n dataSiloUpdateChunk.length\n }\" data silos!`,\n ),\n );\n });\n\n // Sync datapoints\n\n // create a new progress bar instance and use shades_classic theme\n const progressBar = new cliProgress.SingleBar(\n {},\n cliProgress.Presets.shades_classic,\n );\n const dataSilosWithDataPoints = dataSilos.filter(\n ({ datapoints = [] }) => datapoints.length > 0,\n );\n const totalDataPoints = dataSilos\n .map(({ datapoints = [] }) => datapoints.length)\n .reduce((acc, count) => acc + count, 0);\n logger.info(\n colors.magenta(\n `Syncing \"${totalDataPoints}\" datapoints from \"${dataSilosWithDataPoints.length}\" data silos...`,\n ),\n );\n progressBar.start(totalDataPoints, 0);\n let total = 0;\n\n await map(\n dataSilosWithDataPoints,\n async ({ datapoints, title }) => {\n if (datapoints) {\n await mapSeries(datapoints, async (datapoint) => {\n const fields = datapoint.fields\n ? datapoint.fields.map(\n ({\n key,\n description,\n categories,\n purposes,\n attributes,\n ...rest\n }) =>\n // TODO: Support setting title separately from the 'key/name'\n ({\n name: key,\n description,\n categories: !categories\n ? undefined\n : categories.map((category) => ({\n ...category,\n name: category.name || 'Other',\n })),\n purposes: !purposes\n ? undefined\n : purposes.map((purpose) => ({\n ...purpose,\n name: purpose.name || 'Other',\n })),\n attributes,\n accessRequestVisibilityEnabled:\n rest['access-request-visibility-enabled'],\n erasureRequestRedactionEnabled:\n rest['erasure-request-redaction-enabled'],\n }),\n )\n : undefined;\n\n const payload = {\n dataSiloId: existingDataSiloByTitle[title].id,\n path: datapoint.path,\n name: datapoint.key,\n title: datapoint.title,\n description: datapoint.description,\n ...(datapoint.owners\n ? {\n ownerEmails: datapoint.owners,\n }\n : {}),\n ...(datapoint.teams\n ? {\n teamNames: datapoint.teams,\n }\n : {}),\n ...(datapoint['data-collection-tag']\n ? { dataCollectionTag: datapoint['data-collection-tag'] }\n : {}),\n querySuggestions: !datapoint['privacy-action-queries']\n ? undefined\n : Object.entries(datapoint['privacy-action-queries']).map(\n ([key, value]) => ({\n requestType: key,\n suggestedQuery: value,\n }),\n ),\n enabledActions: datapoint['privacy-actions'] || [], // clear out when not specified\n subDataPoints: fields,\n };\n\n // Ensure no duplicate sub-datapoints are provided\n const subDataPointsToUpdate = (payload.subDataPoints || []).map(\n ({ name }) => name,\n );\n const duplicateDataPoints = subDataPointsToUpdate.filter(\n (name, index) => subDataPointsToUpdate.indexOf(name) !== index,\n );\n if (duplicateDataPoints.length > 0) {\n logger.info(\n colors.red(\n `\\nCannot update datapoint \"${\n datapoint.key\n }\" as it has duplicate sub-datapoints with the same name: \\n${duplicateDataPoints.join(\n '\\n',\n )}`,\n ),\n );\n encounteredError = true;\n } else {\n try {\n await makeGraphQLRequest(\n client,\n UPDATE_OR_CREATE_DATA_POINT,\n payload,\n );\n } catch (err) {\n logger.info(\n colors.red(\n `\\nFailed to update datapoint \"${datapoint.key}\" for data silo \"${title}\"! - \\n${err.message}`,\n ),\n );\n encounteredError = true;\n }\n }\n total += 1;\n progressBar.update(total);\n });\n }\n },\n {\n concurrency: 10,\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 `Synced \"${\n dataSilos.length\n }\" data silos and \"${totalDataPoints}\" datapoints in \"${\n totalTime / 1000\n }\" seconds!`,\n ),\n );\n return {\n success: !encounteredError,\n dataSiloTitleToId: apply(existingDataSiloByTitle, ({ id }) => id),\n };\n}\n\n/**\n * Sync data silo dependencies\n *\n * @param client - GraphQL client\n * @param dependencyUpdates - Mapping from [data silo ID, dependency titles]\n * @returns True upon success\n */\nexport async function syncDataSiloDependencies(\n client: GraphQLClient,\n dependencyUpdates: [string, string[]][],\n): Promise<boolean> {\n let encounteredError = false;\n logger.info(\n colors.magenta(\n `Syncing \"${dependencyUpdates.length}\" data silo dependencies...`,\n ),\n );\n\n // Batch the updates\n const chunkedUpdates = chunk(dependencyUpdates, BATCH_SILOS_LIMIT);\n await mapSeries(chunkedUpdates, async (dependencyUpdateChunk, ind) => {\n logger.info(\n colors.magenta(\n `[Batch ${ind}/${dependencyUpdateChunk.length}] Updating \"${dependencyUpdateChunk.length}\" data silos...`,\n ),\n );\n try {\n await makeGraphQLRequest<{\n /** Mutation result */\n updateDataSilos: {\n /** New data silos */\n dataSilos: Pick<DataSilo, 'id' | 'title'>[];\n };\n }>(client, UPDATE_DATA_SILOS, {\n input: {\n dataSilos: dependencyUpdateChunk.map(\n ([id, dependedOnDataSiloTitles]) => ({\n id,\n dependedOnDataSiloTitles,\n }),\n ),\n },\n });\n logger.info(\n colors.green(\n `[Batch ${ind + 1}/${dependencyUpdateChunk.length}] ` +\n `Synced \"${dependencyUpdateChunk.length}\" data silos!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `[Batch ${ind + 1}/${dependencyUpdateChunk.length}] ` +\n `Failed to update \"${dependencyUpdateChunk.length}\" silos! - ${err.message}`,\n ),\n );\n }\n });\n return !encounteredError;\n}\n/* eslint-enable max-lines */\n","import { GraphQLClient } from 'graphql-request';\nimport {\n ConsentPrecedenceOption,\n UnknownRequestPolicy,\n UspapiOption,\n TelemetryPartitionStrategy,\n RegionsOperator,\n IsoCountrySubdivisionCode,\n IsoCountryCode,\n BrowserTimeZone,\n SignedIabAgreementOption,\n} from '@transcend-io/privacy-types';\nimport {\n InitialViewState,\n BrowserLanguage,\n OnConsentExpiry,\n} from '@transcend-io/airgap.js-types';\nimport {\n FETCH_CONSENT_MANAGER_ID,\n FETCH_CONSENT_MANAGER,\n EXPERIENCES,\n CONSENT_MANAGER_ANALYTICS_DATA,\n FETCH_CONSENT_MANAGER_THEME,\n} from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface ConsentManager {\n /** ID of consent manager */\n id: string;\n /** Production bundle URL */\n bundleURL: string;\n /** Test bundle URL */\n testBundleURL: string;\n /** Configuration of consent manager */\n configuration: {\n /** Domain list */\n domains: string[];\n /** Consent precedence of user vs signal */\n consentPrecedence: ConsentPrecedenceOption;\n /** Unknown request policy */\n unknownRequestPolicy: UnknownRequestPolicy;\n /** Unknown cookie policy */\n unknownCookiePolicy: UnknownRequestPolicy;\n /** Sync endpoint */\n syncEndpoint: string;\n /** Telemetry partitioning */\n telemetryPartitioning: TelemetryPartitionStrategy;\n /** Signed IAB agreement */\n signedIabAgreement: SignedIabAgreementOption;\n /** USP API support */\n uspapi: UspapiOption;\n /** Sync groups */\n syncGroups: string;\n /** Partition parameter */\n partition: string;\n };\n /** When using a custom partition, this is the partition value */\n partition?: {\n /** Partition value */\n partition: string;\n };\n}\n\n/**\n * Fetch consent manager\n *\n * @param client - GraphQL client\n * @returns Consent manager ID in organization\n */\nexport async function fetchConsentManager(\n client: GraphQLClient,\n): Promise<ConsentManager> {\n const {\n consentManager: { consentManager },\n } = await makeGraphQLRequest<{\n /** Consent manager query */\n consentManager: {\n /** Consent manager object */\n consentManager: ConsentManager;\n };\n }>(client, FETCH_CONSENT_MANAGER);\n return consentManager;\n}\n\n/**\n * Fetch consent manager ID\n *\n * @param client - GraphQL client\n * @param maxRequests - = Max number of requests to send\n * @returns Consent manager ID in organization\n */\nexport async function fetchConsentManagerId(\n client: GraphQLClient,\n maxRequests?: number,\n): Promise<string> {\n const {\n consentManager: { consentManager },\n } = await makeGraphQLRequest<{\n /** Consent manager query */\n consentManager: {\n /** Consent manager object */\n consentManager: {\n /** ID of bundle */\n id: string;\n };\n };\n }>(client, FETCH_CONSENT_MANAGER_ID, {}, {}, maxRequests);\n return consentManager.id;\n}\n\nconst PAGE_SIZE = 50;\n\nexport interface ConsentExperience {\n /** ID of experience */\n id: string;\n /** Name of experience */\n name: string;\n /** Experience display name */\n displayName?: string;\n /** Region that define this regional experience */\n regions: {\n /** Sub division */\n countrySubDivision?: IsoCountrySubdivisionCode;\n /** Country */\n country?: IsoCountryCode;\n }[];\n /** In vs not in operator */\n operator: RegionsOperator;\n /** Priority of experience */\n displayPriority: number;\n /** View state to prompt when auto prompting is enabled */\n viewState: InitialViewState;\n /** Consent expiry setting */\n onConsentExpiry: OnConsentExpiry;\n /** Consent expiry */\n consentExpiry: number;\n /** Purposes that can be opted out of in a particular experience */\n purposes: {\n /** Name of purpose */\n name: string;\n /** Purpose slug */\n trackingType: string;\n }[];\n /** Purposes that are opted out by default in a particular experience */\n optedOutPurposes: {\n /** Name of purpose */\n name: string;\n /** Purpose slug */\n trackingType: string;\n }[];\n /**\n * Browser languages that define this regional experience\n */\n browserLanguages: BrowserLanguage[];\n /** Browser time zones that define this regional experience */\n browserTimeZones: BrowserTimeZone[];\n}\n\n/**\n * Fetch consent manager experiences\n *\n * @param client - GraphQL client\n * @returns Consent manager experiences in the organization\n */\nexport async function fetchConsentManagerExperiences(\n client: GraphQLClient,\n): Promise<ConsentExperience[]> {\n const experiences: ConsentExperience[] = [];\n let offset = 0;\n\n // Fetch all experiences\n let shouldContinue = false;\n do {\n const {\n experiences: { nodes },\n } = await makeGraphQLRequest<{\n /** Consent experience */\n experiences: {\n /** List */\n nodes: ConsentExperience[];\n };\n }>(client, EXPERIENCES, {\n first: PAGE_SIZE,\n offset,\n });\n experiences.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return experiences.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * The allowed bin sizes for pulling consent metrics\n */\nexport enum ConsentManagerMetricBin {\n Hourly = '1h',\n Daily = '1d',\n}\n\nexport interface ConsentManagerMetric {\n /** Name of metric */\n name: string;\n /** The metrics */\n points: {\n /** Key of metric */\n key: string;\n /** Value of metric */\n value: string;\n }[];\n}\n\n/**\n * Fetch consent manager analytics data\n *\n * @param client - GraphQL client\n * @param input - Input for fetching data\n * @returns Consent manager purposes in the organization\n */\nexport async function fetchConsentManagerAnalyticsData(\n client: GraphQLClient,\n input: {\n /** Data source */\n dataSource:\n | 'PRIVACY_SIGNAL_TIMESERIES'\n | 'CONSENT_CHANGES_TIMESERIES'\n | 'CONSENT_SESSIONS_BY_REGIME';\n /** Start date, in ISO string format */\n startDate: string;\n /** End date, in ISO string format */\n endDate: string;\n /** Force refetching */\n forceRefetch?: boolean;\n /** Airgap bundle ID */\n airgapBundleId: string;\n /** Bin interval */\n binInterval: ConsentManagerMetricBin;\n /** Whether or not to smooth the time series */\n smoothTimeseries: false;\n },\n): Promise<ConsentManagerMetric[]> {\n const {\n analyticsData: { series },\n } = await makeGraphQLRequest<{\n /** Analytics data response */\n analyticsData: {\n /** Consent manager metrics */\n series: ConsentManagerMetric[];\n };\n }>(client, CONSENT_MANAGER_ANALYTICS_DATA, {\n input,\n });\n return series;\n}\n\nexport interface ConsentManagerTheme {\n /** Primary color */\n primaryColor: string;\n /** Font color */\n fontColor: string;\n /** Privacy policy URL */\n privacyPolicy?: string;\n /** Auto-prompt setting */\n prompt: number;\n}\n\n/**\n * Fetch consent manager theme\n *\n * @param client - GraphQL client\n * @param airgapBundleId - Airgap bundle ID to fetch for\n * @returns Consent manager ID in organization\n */\nexport async function fetchConsentManagerTheme(\n client: GraphQLClient,\n airgapBundleId: string,\n): Promise<ConsentManagerTheme> {\n const {\n consentManagerTheme: { theme },\n } = await makeGraphQLRequest<{\n /** Consent manager query */\n consentManagerTheme: {\n /** Consent manager object */\n theme: ConsentManagerTheme;\n };\n }>(client, FETCH_CONSENT_MANAGER_THEME, {\n airgapBundleId,\n });\n return theme;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { logger } from '../../logger';\nimport { CookieInput } from '../../codecs';\nimport colors from 'colors';\nimport { UPDATE_OR_CREATE_COOKIES } from './gqls';\nimport { chunk } from 'lodash-es';\nimport { fetchConsentManagerId } from './fetchConsentManagerId';\nimport { mapSeries } from '../bluebird-replace';\n// import { keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\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(\n client: GraphQLClient,\n cookies: CookieInput[],\n): 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(\n (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","import { GraphQLClient } from 'graphql-request';\nimport { TEAMS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nexport interface Team {\n /** ID of team */\n id: string;\n /** Name of team */\n name: string;\n /** Description of team */\n description: string;\n /** SSO department for automated provisioning */\n ssoDepartment?: string;\n /** SSO group name for automated provisioning */\n ssoGroup?: string;\n /** SSO title mapping for automated provisioning */\n ssoTitle?: string;\n /** List of users on the team */\n users: {\n /** ID of user */\n id: string;\n /** Email of user */\n email: string;\n /** Name of user */\n name: string;\n }[];\n /** List of scopes on the team */\n scopes: {\n /** ID of scope */\n id: string;\n /** Name of scope */\n name: ScopeName;\n /** Title of scope */\n title: string;\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all teams in the organization\n *\n * @param client - GraphQL client\n * @returns All teams in the organization\n */\nexport async function fetchAllTeams(client: GraphQLClient): Promise<Team[]> {\n const teams: Team[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n teams: { nodes },\n } = await makeGraphQLRequest<{\n /** Teams */\n teams: {\n /** List */\n nodes: Team[];\n };\n }>(client, TEAMS, {\n first: PAGE_SIZE,\n offset,\n });\n teams.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return teams.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { DataSubjectInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { UPDATE_DATA_SUBJECT, TOGGLE_DATA_SUBJECT } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\n/**\n * Sync the data subjects\n *\n * @param client - GraphQL client\n * @param options - Options\n */\nexport async function syncDataSubject(\n client: GraphQLClient,\n {\n dataSubject,\n dataSubjectId,\n skipPublish = false,\n }: {\n /** DataSubject update input */\n dataSubject: DataSubjectInput;\n /** Existing data subject Id */\n dataSubjectId: string;\n /** When true, skip publishing to privacy center */\n skipPublish?: boolean;\n },\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_DATA_SUBJECT, {\n input: {\n id: dataSubjectId,\n title: dataSubject.title,\n adminDashboardDefaultSilentMode:\n dataSubject.adminDashboardDefaultSilentMode,\n actions: dataSubject.actions,\n skipPublish: skipPublish && typeof dataSubject.active === 'undefined',\n },\n });\n\n if (typeof dataSubject.active === 'boolean') {\n await makeGraphQLRequest(client, TOGGLE_DATA_SUBJECT, {\n input: {\n id: dataSubjectId,\n active: dataSubject.active,\n skipPublish,\n },\n });\n }\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { API_KEYS } from './gqls';\nimport { keyBy, uniq, difference } from 'lodash-es';\nimport { logger } from '../../logger';\nimport colors from 'colors';\nimport { TranscendInput } from '../../codecs';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface ApiKey {\n /** ID of API key */\n id: string;\n /** Title of API key */\n title: string;\n}\n\nconst PAGE_SIZE = 20;\n\nconst ADMIN_LINK = 'https://app.transcend.io/infrastructure/api-keys';\n\n/**\n * Fetch all API keys in an organization\n *\n * @param client - Client\n * @param titles - Filter on titles\n * @returns API keys\n */\nexport async function fetchAllApiKeys(\n client: GraphQLClient,\n titles?: string[],\n): Promise<ApiKey[]> {\n const apiKeys: ApiKey[] = [];\n let offset = 0;\n\n // Paginate\n let shouldContinue = false;\n do {\n const {\n apiKeys: { nodes },\n } = await makeGraphQLRequest<{\n /** API keys */\n apiKeys: {\n /** List */\n nodes: ApiKey[];\n };\n }>(client, API_KEYS, {\n first: PAGE_SIZE,\n offset,\n titles,\n });\n apiKeys.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n return apiKeys.sort((a, b) => a.title.localeCompare(b.title));\n}\n\n/**\n * Fetch all apiKeys and if any are found in the config that are\n * missing, create those apiKeys.\n *\n * @param apiKeyInputs - API keys to fetch metadata on\n * @param client - GraphQL client\n * @param fetchAll - When true, fetch all API keys\n * @returns A map from apiKey title to Identifier\n */\nexport async function fetchApiKeys(\n {\n 'api-keys': apiKeyInputs = [],\n 'data-silos': dataSilos = [],\n }: TranscendInput,\n client: GraphQLClient,\n fetchAll = false,\n): Promise<{ [k in string]: ApiKey }> {\n logger.info(\n colors.magenta(\n `Fetching ${fetchAll ? 'all' : apiKeyInputs.length} API keys...`,\n ),\n );\n const titles = apiKeyInputs.map(({ title }) => title);\n const expectedApiKeyTitles = uniq(\n dataSilos\n .map((silo) => silo['api-key-title'])\n .filter((x): x is string => !!x),\n );\n const allTitlesExpected = [...expectedApiKeyTitles, ...titles];\n const apiKeys = await fetchAllApiKeys(\n client,\n fetchAll ? undefined : [...expectedApiKeyTitles, ...titles],\n );\n\n // Create a map\n const apiKeysByTitle = keyBy(apiKeys, 'title');\n\n // Determine expected set of apiKeys expected\n const missingApiKeys = difference(\n allTitlesExpected,\n apiKeys.map(({ title }) => title),\n );\n\n // If there are missing apiKeys, throw an error\n if (missingApiKeys.length > 0) {\n logger.info(\n colors.red(\n `Failed to find API keys \"${missingApiKeys.join(\n '\", \"',\n )}\"! Make sure these API keys are created at: ${ADMIN_LINK}`,\n ),\n );\n process.exit(1);\n }\n return apiKeysByTitle;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { PROMPTS, PROMPTS_WITH_VARIABLES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport {\n PromptStatus,\n PromptResponseFormat,\n} from '@transcend-io/privacy-types';\n\nexport interface Prompt {\n /** ID of prompt */\n id: string;\n /** The title of the prompt */\n title: string;\n /** The status of the prompt */\n status: PromptStatus;\n /** The content of the prompt */\n content: string;\n /** Temperature to use with prompt */\n temperature: number;\n /** Top P to use with prompt */\n topP: number;\n /** Max tokens to sample for prompt */\n maxTokensToSample: number;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all Prompts in the organization\n *\n * @param client - GraphQL client\n * @param options - Options\n * @returns All Prompts in the organization\n */\nexport async function fetchAllPrompts(\n client: GraphQLClient,\n {\n text,\n titles = [],\n ids = [],\n }: {\n /** Filter by text */\n text?: string;\n /** Filter by ids */\n ids?: string[];\n /** Filter by titles */\n titles?: string[];\n } = {},\n): Promise<Prompt[]> {\n const prompts: Prompt[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n prompts: { nodes },\n } = await makeGraphQLRequest<{\n /** Prompts */\n prompts: {\n /** List */\n nodes: Prompt[];\n };\n }>(client, PROMPTS, {\n first: PAGE_SIZE,\n offset,\n filterBy: {\n ...(text ? { text } : {}),\n ...(titles.length > 0 ? { title: titles } : {}),\n ...(ids.length > 0 ? { id: ids } : {}),\n },\n });\n prompts.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return prompts.sort((a, b) => a.title.localeCompare(b.title));\n}\n\n/**\n * The basic metadata needed to use a prompt at runtime\n */\nexport type TranscendPromptTemplated = {\n /** ID of prompt */\n id: string;\n /** Title of prompt */\n title: string;\n /** Content of prompt */\n content: string;\n /** Status of prompt */\n status: PromptStatus;\n /** Temperature */\n temperature?: number;\n /** Top P */\n topP?: number;\n /** Max tokens to sample */\n maxTokensToSample?: number;\n /** Response format */\n responseFormat?: PromptResponseFormat;\n};\n\n/**\n * The basic metadata needed to use a prompt partial at runtime\n */\nexport type TranscendPromptPartialTemplated = {\n /** ID of prompt */\n id: string;\n /** Title of prompt */\n title: string;\n /** Slug of prompt */\n slug: string;\n /** Content of prompt */\n content: string;\n};\n\n/**\n * Calculated variables\n */\nexport type PromptCalculatedVariable = {\n /** JSON stringified data to template */\n data: string | null;\n /** Name of variable */\n name: string;\n};\n\n/**\n * Runtime variables\n */\nexport type PromptRuntimeVariable = {\n /** Type of variable */\n type: string;\n /** Name of variable */\n name: string;\n};\n\n/**\n * Metadata useful for filling variables within a prompt\n */\nexport type TranscendPromptsAndVariables = {\n /** Prompts ready to be templated */\n prompts: TranscendPromptTemplated[];\n /** Prompt partials */\n promptPartials: TranscendPromptPartialTemplated[];\n /** Calculated variables to be templated */\n calculatedVariables: PromptCalculatedVariable[];\n /** Runtime variables to be templated */\n runtimeVariables: PromptRuntimeVariable[];\n};\n\n/**\n * Fetch prompts with templated variables\n *\n * @param client - GraphQL client\n * @param options - Options\n * @returns Prompts and template variables\n */\nexport async function fetchPromptsWithVariables(\n client: GraphQLClient,\n {\n promptTitles = [],\n promptIds = [],\n }: {\n /** Filter by prompt ids */\n promptIds?: string[];\n /** Filter by prompt titles */\n promptTitles?: string[];\n } = {},\n): Promise<TranscendPromptsAndVariables> {\n const { promptsWithVariables } = await makeGraphQLRequest<{\n /** Prompts */\n promptsWithVariables: TranscendPromptsAndVariables;\n }>(client, PROMPTS_WITH_VARIABLES, {\n input: {\n ...(promptTitles.length > 0 ? { promptTitles } : {}),\n ...(promptIds.length > 0 ? { promptIds } : {}),\n },\n });\n\n return promptsWithVariables;\n}\n","import { PromptInput } from '../../codecs';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { UPDATE_PROMPTS, CREATE_PROMPT } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { map } from '../bluebird-replace';\nimport { fetchAllPrompts } from './fetchPrompts';\nimport { keyBy } from 'lodash-es';\nimport { logger } from '../../logger';\n\n/**\n * Create a new prompt\n *\n * @param client - GraphQL client\n * @param input - Prompt input\n * @returns Prompt ID\n */\nexport async function createPrompt(\n client: GraphQLClient,\n input: {\n /** Title of prompt */\n title: string;\n /** Prompt content */\n content: string;\n },\n): Promise<string> {\n const {\n createPrompt: { prompt },\n } = await makeGraphQLRequest<{\n /** createPrompt mutation */\n createPrompt: {\n /** Prompt */\n prompt: {\n /** ID */\n id: string;\n };\n };\n }>(client, CREATE_PROMPT, {\n // TODO: https://transcend.height.app/T-31994 - include models and groups, teams, users\n input,\n });\n logger.info(colors.green(`Successfully created prompt \"${input.title}\"!`));\n return prompt.id;\n}\n\n/**\n * Update a set of existing prompts\n *\n * @param client - GraphQL client\n * @param input - Prompt input\n */\nexport async function updatePrompts(\n client: GraphQLClient,\n input: [PromptInput, string][],\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_PROMPTS, {\n input: {\n prompts: input.map(([input, id]) => ({\n ...input,\n id,\n })),\n },\n });\n logger.info(colors.green(`Successfully updated ${input.length} prompts!`));\n}\n\n/**\n * Sync the prompts\n *\n * @param client - GraphQL client\n * @param prompts - Prompts\n * @param concurrency - Concurrency\n * @returns True if synced successfully\n */\nexport async function syncPrompts(\n client: GraphQLClient,\n prompts: PromptInput[],\n concurrency = 20,\n): Promise<boolean> {\n let encounteredError = false;\n logger.info(colors.magenta(`Syncing \"${prompts.length}\" prompts...`));\n\n // Index existing prompts\n const existing = await fetchAllPrompts(client);\n const promptByTitle = keyBy(existing, 'title');\n\n // Determine which prompts are new vs existing\n const mapPromptsToExisting = prompts.map((promptInput) => [\n promptInput,\n promptByTitle[promptInput.title]?.id,\n ]);\n\n // Create the new prompts\n const newPrompts = mapPromptsToExisting\n .filter(([, existing]) => !existing)\n .map(([promptInput]) => promptInput as PromptInput);\n try {\n logger.info(\n colors.magenta(`Creating \"${newPrompts.length}\" new prompts...`),\n );\n await map(\n newPrompts,\n async (prompt) => {\n await createPrompt(client, prompt);\n },\n {\n concurrency,\n },\n );\n logger.info(\n colors.green(`Successfully synced ${newPrompts.length} prompts!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create prompts! - ${err.message}`));\n }\n\n // Update existing prompts\n const existingPrompts = mapPromptsToExisting.filter(\n (x): x is [PromptInput, string] => !!x[1],\n );\n try {\n logger.info(\n colors.magenta(`Updating \"${existingPrompts.length}\" prompts...`),\n );\n await updatePrompts(client, existingPrompts);\n logger.info(\n colors.green(`Successfully updated \"${existingPrompts.length}\" prompts!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create prompts! - ${err.message}`));\n }\n\n logger.info(colors.green(`Synced \"${prompts.length}\" prompts!`));\n\n // Return true upon success\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { DEPLOYED_PRIVACY_CENTER_URL, FETCH_PRIVACY_CENTER_ID } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\n/**\n * Fetch default privacy center URL\n *\n * @param client - GraphQL client\n * @returns Privacy Center ID in organization\n */\nexport async function fetchPrivacyCenterUrl(\n client: GraphQLClient,\n): Promise<string> {\n const { organization } = await makeGraphQLRequest<{\n /** Organization */\n organization: {\n /** URL */\n deployedPrivacyCenterUrl: string;\n };\n }>(client, DEPLOYED_PRIVACY_CENTER_URL);\n return organization.deployedPrivacyCenterUrl;\n}\n\n/**\n * Fetch privacy center ID\n *\n * @param client - GraphQL client\n * @param url - URLto lookup\n * @returns Privacy Center ID in organization\n */\nexport async function fetchPrivacyCenterId(\n client: GraphQLClient,\n url?: string,\n): Promise<string> {\n let urlToUse = url;\n if (!urlToUse) {\n urlToUse = await fetchPrivacyCenterUrl(client);\n }\n const { privacyCenter } = await makeGraphQLRequest<{\n /** Privacy Center query */\n privacyCenter: {\n /** ID of bundle */\n id: string;\n };\n }>(client, FETCH_PRIVACY_CENTER_ID, {\n url: urlToUse,\n });\n return privacyCenter.id;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { POLICIES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { LanguageKey } from '@transcend-io/internationalization';\nimport { fetchPrivacyCenterUrl } from './fetchPrivacyCenterId';\n\nexport interface Policy {\n /** ID of policy */\n id: string;\n /** Title of policy */\n title: {\n /** Default message */\n defaultMessage: string;\n };\n /** Disabled locales */\n disabledLocales: LanguageKey[];\n /** Versions */\n versions: {\n /** Message content */\n content: {\n /** Default message */\n defaultMessage: string;\n };\n }[];\n}\n\n/**\n * Fetch all policies in the organization\n *\n * @param client - GraphQL client\n * @returns All policies in the organization\n */\nexport async function fetchAllPolicies(\n client: GraphQLClient,\n): Promise<Policy[]> {\n const deployedPrivacyCenterUrl = await fetchPrivacyCenterUrl(client);\n const { privacyCenterPolicies } = await makeGraphQLRequest<{\n /** Policies */\n privacyCenterPolicies: Policy[];\n }>(client, POLICIES, {\n url: deployedPrivacyCenterUrl,\n });\n\n return privacyCenterPolicies.sort((a, b) =>\n a.title.defaultMessage.localeCompare(b.title.defaultMessage),\n );\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { logger } from '../../logger';\nimport { PolicyInput } from '../../codecs';\nimport colors from 'colors';\nimport { UPDATE_POLICIES } from './gqls';\nimport { chunk, keyBy } from 'lodash-es';\nimport { mapSeries } from '../bluebird-replace';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { fetchPrivacyCenterId } from './fetchPrivacyCenterId';\nimport { fetchAllPolicies } from './fetchAllPolicies';\n\nconst MAX_PAGE_SIZE = 100;\n\n/**\n * Update or create policies\n *\n * @param client - GraphQL client\n * @param policyInputs - List of policy input\n */\nexport async function updatePolicies(\n client: GraphQLClient,\n policyInputs: [PolicyInput, string | undefined][],\n): Promise<void> {\n const privacyCenterId = await fetchPrivacyCenterId(client);\n\n // Batch update policies\n await mapSeries(chunk(policyInputs, MAX_PAGE_SIZE), async (page) => {\n await makeGraphQLRequest(client, UPDATE_POLICIES, {\n privacyCenterId,\n policies: page.map(([policy, policyId]) => ({\n id: policyId,\n title: policy.title,\n disableEffectiveOn: policy.disableEffectiveOn,\n disabledLocales: policy.disabledLocales,\n ...(policy.effectiveOn || policy.content\n ? {\n version: {\n ...(policy.effectiveOn\n ? { effectiveOn: policy.effectiveOn }\n : {}),\n ...(policy.content\n ? {\n content: {\n defaultMessage: policy.content,\n },\n }\n : {}),\n },\n }\n : {}),\n })),\n });\n });\n}\n\n/**\n * Sync the set of policies from the YML interface into the product\n *\n * @param client - GraphQL client\n * @param policies - policies to sync\n * @returns True upon success, false upon failure\n */\nexport async function syncPolicies(\n client: GraphQLClient,\n policies: PolicyInput[],\n): Promise<boolean> {\n let encounteredError = false;\n logger.info(colors.magenta(`Syncing \"${policies.length}\" policies...`));\n\n // Ensure no duplicates are being uploaded\n const notUnique = policies.filter(\n (policy) => policies.filter((pol) => policy.title === pol.title).length > 1,\n );\n if (notUnique.length > 0) {\n throw new Error(\n `Failed to upload policies as there were non-unique entries found: ${notUnique\n .map(({ title }) => title)\n .join(',')}`,\n );\n }\n\n // Grab existing policies\n const existingPolicies = await fetchAllPolicies(client);\n const policiesById = keyBy(\n existingPolicies,\n ({ title }) => title.defaultMessage,\n );\n\n try {\n logger.info(\n colors.magenta(`Upserting \"${policies.length}\" new policies...`),\n );\n await updatePolicies(\n client,\n policies.map((policy) => [policy, policiesById[policy.title]?.id]),\n );\n logger.info(\n colors.green(`Successfully synced ${policies.length} policies!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create policies! - ${err.message}`));\n }\n\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { logger } from '../../logger';\nimport { IntlMessageInput } from '../../codecs';\nimport colors from 'colors';\nimport { UPDATE_INTL_MESSAGES } from './gqls';\nimport { chunk } from 'lodash-es';\nimport { mapSeries } from '../bluebird-replace';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nconst MAX_PAGE_SIZE = 100;\n\n/**\n * Update or create intl messages\n *\n * @param client - GraphQL client\n * @param messageInputs - List of message inputs\n */\nexport async function updateIntlMessages(\n client: GraphQLClient,\n messageInputs: IntlMessageInput[],\n): Promise<void> {\n // Batch update messages\n await mapSeries(chunk(messageInputs, MAX_PAGE_SIZE), async (page) => {\n await makeGraphQLRequest(client, UPDATE_INTL_MESSAGES, {\n messages: page.map((message) => ({\n ...(message.id.includes('.') ? {} : { id: message.id }),\n defaultMessage: message.defaultMessage,\n targetReactIntlId: message.targetReactIntlId,\n translations: !message.translations\n ? undefined\n : Object.entries(message.translations).map(([locale, value]) => ({\n locale,\n value,\n })),\n })),\n });\n });\n}\n\n/**\n * Sync the set of messages from the YML interface into the product\n *\n * @param client - GraphQL client\n * @param messages - messages to sync\n * @returns True upon success, false upon failure\n */\nexport async function syncIntlMessages(\n client: GraphQLClient,\n messages: IntlMessageInput[],\n): Promise<boolean> {\n let encounteredError = false;\n logger.info(colors.magenta(`Syncing \"${messages.length}\" messages...`));\n\n // Ensure no duplicates are being uploaded\n const notUnique = messages.filter(\n (message) => messages.filter((pol) => message.id === pol.id).length > 1,\n );\n if (notUnique.length > 0) {\n throw new Error(\n `Failed to upload messages as there were non-unique entries found: ${notUnique\n .map(({ id }) => id)\n .join(',')}`,\n );\n }\n\n try {\n logger.info(\n colors.magenta(`Upserting \"${messages.length}\" new messages...`),\n );\n await updateIntlMessages(client, messages);\n logger.info(\n colors.green(`Successfully synced ${messages.length} messages!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create messages! - ${err.message}`));\n }\n\n return !encounteredError;\n}\n","import { PrivacyCenterInput } from '../../codecs';\nimport { logger } from '../../logger';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { UPDATE_PRIVACY_CENTER } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { fetchPrivacyCenterId } from './fetchPrivacyCenterId';\n\n/**\n * Sync the privacy center\n *\n * @param client - GraphQL client\n * @param privacyCenter - The privacy center input\n * @returns Whether the privacy center was synced successfully\n */\nexport async function syncPrivacyCenter(\n client: GraphQLClient,\n privacyCenter: PrivacyCenterInput,\n): Promise<boolean> {\n let encounteredError = false;\n logger.info(colors.magenta('Syncing privacy center...'));\n\n // Grab the privacy center ID\n const privacyCenterId = await fetchPrivacyCenterId(client);\n\n try {\n await makeGraphQLRequest(client, UPDATE_PRIVACY_CENTER, {\n input: {\n privacyCenterId,\n transformAccessReportJsonToCsv:\n privacyCenter.transformAccessReportJsonToCsv,\n useCustomEmailDomain: privacyCenter.useCustomEmailDomain,\n useNoReplyEmailAddress: privacyCenter.useNoReplyEmailAddress,\n replyToEmail: privacyCenter.replyToEmail,\n supportEmail: privacyCenter.supportEmail,\n preferBrowserDefaultLocale: privacyCenter.preferBrowserDefaultLocale,\n defaultLocale: privacyCenter.defaultLocale,\n locales: privacyCenter.locales,\n showMarketingPreferences: privacyCenter.showMarketingPreferences,\n showManageYourPrivacy: privacyCenter.showManageYourPrivacy,\n showPolicies: privacyCenter.showPolicies,\n showConsentManager: privacyCenter.showConsentManager,\n showDataFlows: privacyCenter.showDataFlows,\n showCookies: privacyCenter.showCookies,\n showTrackingTechnologies: privacyCenter.showTrackingTechnologies,\n showPrivacyRequestButton: privacyCenter.showPrivacyRequestButton,\n isDisabled: privacyCenter.isDisabled,\n ...(privacyCenter.theme\n ? {\n colorPalette: privacyCenter.theme.colors,\n componentStyles: privacyCenter.theme.componentStyles,\n textStyles: privacyCenter.theme.textStyles,\n }\n : {}),\n },\n });\n logger.info(colors.green('Successfully synced privacy center!'));\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to create privacy center! - ${err.message}`),\n );\n }\n\n return !encounteredError;\n}\n","import colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { CREATE_CONSENT_PARTITION, CONSENT_PARTITIONS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { mapSeries } from '../bluebird-replace';\nimport { difference } from 'lodash-es';\nimport { logger } from '../../logger';\nimport { PartitionInput } from '../../codecs';\nimport { fetchConsentManagerId } from './fetchConsentManagerId';\n\nconst PAGE_SIZE = 50;\n\nexport interface TranscendPartition {\n /** ID of the partition */\n id: string;\n /** Name of partition */\n name: string;\n /** Partition value */\n partition: string;\n}\n\n/**\n * Fetch the list of partitions\n *\n * @param client - GraphQL client\n * @returns Partition list\n */\nexport async function fetchPartitions(\n client: GraphQLClient,\n): Promise<TranscendPartition[]> {\n const partitions: TranscendPartition[] = [];\n let offset = 0;\n\n // Fetch all partitions\n let shouldContinue = false;\n do {\n const {\n consentPartitions: { nodes },\n } = await makeGraphQLRequest<{\n /** Consent experience */\n consentPartitions: {\n /** List */\n nodes: TranscendPartition[];\n };\n }>(client, CONSENT_PARTITIONS, {\n first: PAGE_SIZE,\n offset,\n });\n partitions.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return partitions.sort((a, b) => a.name.localeCompare(b.name));\n}\n\n/**\n * Sync the consent manager\n *\n * @param client - GraphQL client\n * @param partitionInputs - The partition input\n *@returns true on success\n */\nexport async function syncPartitions(\n client: GraphQLClient,\n partitionInputs: PartitionInput[],\n): Promise<boolean> {\n // Grab the bundleId associated with this API key\n const airgapBundleId = await fetchConsentManagerId(client);\n let encounteredError = false;\n const partitions = await fetchPartitions(client);\n const newPartitionNames = difference(\n partitionInputs.map(({ name }) => name),\n partitions.map(({ name }) => name),\n );\n await mapSeries(newPartitionNames, async (name) => {\n try {\n await makeGraphQLRequest(client, CREATE_CONSENT_PARTITION, {\n input: {\n id: airgapBundleId,\n name,\n },\n });\n logger.info(\n colors.green(`Successfully created consent partition: ${name}!`),\n );\n } catch (err) {\n logger.error(\n colors.red(\n `Failed to create consent partition: ${name}! - ${err.message}`,\n ),\n );\n encounteredError = true;\n }\n });\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { PURPOSES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport {\n DefaultConsentOption,\n PreferenceStoreAuthLevel,\n} from '@transcend-io/privacy-types';\nimport { UserPrivacySignalEnum } from '@transcend-io/airgap.js-types';\n\nexport interface Purpose {\n /** ID of purpose */\n id: string;\n /** Name of purpose */\n name: string;\n /** Description of purpose */\n description: string;\n /** Default consent status */\n defaultConsent: DefaultConsentOption;\n /** Slug of purpose */\n trackingType: string;\n /** Whether the purpose is configurable */\n configurable: boolean;\n /** Whether the purpose is essential */\n essential: boolean;\n /** Whether to show the purpose in the consent manager */\n showInConsentManager: boolean;\n /** Whether the purpose is active */\n isActive: boolean;\n /** Display order of the purpose */\n displayOrder: number;\n /** Opt-out signals for the purpose */\n optOutSignals: UserPrivacySignalEnum[];\n /** Whether the purpose is deleted */\n deletedAt?: string;\n /** Authorization level required for the purpose */\n authLevel: PreferenceStoreAuthLevel;\n /** Whether to show the purpose in the privacy center */\n showInPrivacyCenter: boolean;\n /** Title of the purpose */\n title: string;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all purposes in the organization\n *\n * @param client - GraphQL client\n * @param input - Input\n * @returns All purposes in the organization\n */\nexport async function fetchAllPurposes(\n client: GraphQLClient,\n {\n includeDeleted = false,\n }: {\n /** Whether to include deleted purposes */\n includeDeleted?: boolean;\n } = {},\n): Promise<Purpose[]> {\n const purposes: Purpose[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n purposes: { nodes },\n } = await makeGraphQLRequest<{\n /** Purposes */\n purposes: {\n /** List */\n nodes: Purpose[];\n };\n }>(client, PURPOSES, {\n first: PAGE_SIZE,\n offset,\n input: {\n includeDeleted,\n },\n });\n purposes.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return purposes.sort((a, b) => a.trackingType.localeCompare(b.trackingType));\n}\n","import {\n ConsentManageExperienceInput,\n ConsentManagerInput,\n} from '../../codecs';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport {\n UPDATE_CONSENT_MANAGER_DOMAINS,\n CREATE_CONSENT_MANAGER,\n UPDATE_TOGGLE_USP_API,\n UPDATE_CONSENT_MANAGER_PARTITION,\n UPDATE_CONSENT_MANAGER_VERSION,\n TOGGLE_TELEMETRY_PARTITION_STRATEGY,\n TOGGLE_UNKNOWN_COOKIE_POLICY,\n TOGGLE_CONSENT_PRECEDENCE,\n TOGGLE_UNKNOWN_REQUEST_POLICY,\n UPDATE_CONSENT_EXPERIENCE,\n CREATE_CONSENT_EXPERIENCE,\n UPDATE_CONSENT_MANAGER_THEME,\n} from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport {\n fetchConsentManagerId,\n fetchConsentManagerExperiences,\n} from './fetchConsentManagerId';\nimport { keyBy } from 'lodash-es';\nimport { map } from '../bluebird-replace';\nimport {\n InitialViewState,\n OnConsentExpiry,\n} from '@transcend-io/airgap.js-types';\nimport { logger } from '../../logger';\nimport { fetchPrivacyCenterId } from './fetchPrivacyCenterId';\nimport { fetchPartitions } from './syncPartitions';\nimport { fetchAllPurposes } from './fetchAllPurposes';\n\nconst PURPOSES_LINK =\n 'https://app.transcend.io/consent-manager/regional-experiences/purposes';\n\n/**\n * Sync consent manager experiences up to Transcend\n *\n * @param client - GraphQL client\n * @param experiences - The experience inputs\n */\nexport async function syncConsentManagerExperiences(\n client: GraphQLClient,\n experiences: ConsentManageExperienceInput[],\n): Promise<void> {\n // Fetch existing experiences and\n const existingExperiences = await fetchConsentManagerExperiences(client);\n const experienceLookup = keyBy(existingExperiences, 'name');\n\n // Fetch existing purposes\n const purposes = await fetchAllPurposes(client);\n const purposeLookup = keyBy(purposes, 'trackingType');\n\n // Bulk update or create experiences\n await map(\n experiences,\n async (exp, ind) => {\n // Purpose IDs\n const purposeIds = exp.purposes?.map((purpose, ind2) => {\n const existingPurpose = purposeLookup[purpose.trackingType];\n if (!existingPurpose) {\n throw new Error(\n `Invalid purpose trackingType provided at consentManager.experiences[${ind}].purposes[${ind2}]: ` +\n `${purpose.trackingType}. See list of valid purposes ${PURPOSES_LINK}`,\n );\n }\n return existingPurpose.id;\n });\n const optedOutPurposeIds = exp.optedOutPurposes?.map((purpose, ind2) => {\n const existingPurpose = purposeLookup[purpose.trackingType];\n if (!existingPurpose) {\n throw new Error(\n `Invalid purpose trackingType provided at consentManager.experiences[${ind}].optedOutPurposes[${ind2}]: ` +\n `${purpose.trackingType}. See list of valid purposes ${PURPOSES_LINK}`,\n );\n }\n return existingPurpose.id;\n });\n\n // update experience\n const existingExperience = experienceLookup[exp.name];\n if (existingExperience) {\n await makeGraphQLRequest(client, UPDATE_CONSENT_EXPERIENCE, {\n input: {\n id: existingExperience.id,\n name: exp.displayName,\n regions: exp.regions,\n operator: exp.operator,\n onConsentExpiry: exp.onConsentExpiry,\n consentExpiry: exp.consentExpiry,\n displayPriority:\n exp.displayPriority !== existingExperience.displayPriority\n ? exp.displayPriority\n : undefined,\n viewState: exp.viewState,\n purposes: purposeIds,\n optedOutPurposes: optedOutPurposeIds,\n browserLanguages: exp.browserLanguages,\n browserTimeZones: exp.browserTimeZones,\n },\n });\n logger.info(\n colors.green(`Successfully synced consent experience \"${exp.name}\"!`),\n );\n } else {\n // create new experience\n await makeGraphQLRequest(client, CREATE_CONSENT_EXPERIENCE, {\n input: {\n name: exp.name,\n displayName: exp.displayName,\n regions: exp.regions,\n operator: exp.operator,\n onConsentExpiry: exp.onConsentExpiry || OnConsentExpiry.Prompt,\n consentExpiry: exp.consentExpiry,\n displayPriority: exp.displayPriority,\n viewState: exp.viewState || InitialViewState.Hidden,\n purposes: purposeIds || [],\n optedOutPurposes: optedOutPurposeIds || [],\n browserLanguages: exp.browserLanguages,\n browserTimeZones: exp.browserTimeZones,\n },\n });\n logger.info(\n colors.green(\n `Successfully created consent experience \"${exp.name}\"!`,\n ),\n );\n }\n },\n {\n concurrency: 10,\n },\n );\n}\n\n/**\n * Sync the consent manager\n *\n * @param client - GraphQL client\n * @param consentManager - The consent manager input\n */\nexport async function syncConsentManager(\n client: GraphQLClient,\n consentManager: ConsentManagerInput,\n): Promise<void> {\n let airgapBundleId: string;\n\n // ensure the consent manager is created and deployed\n try {\n airgapBundleId = await fetchConsentManagerId(client, 1);\n } catch (err) {\n // TODO: https://transcend.height.app/T-23778\n if (err.message.includes('AirgapBundle not found')) {\n const privacyCenterId = await fetchPrivacyCenterId(client);\n\n const { createConsentManager } = await makeGraphQLRequest<{\n /** Create consent manager */\n createConsentManager: {\n /** Consent manager */\n consentManager: {\n /** ID */\n id: string;\n };\n };\n }>(client, CREATE_CONSENT_MANAGER, {\n domains: consentManager.domains,\n privacyCenterId,\n });\n airgapBundleId = createConsentManager.consentManager.id;\n } else {\n throw err;\n }\n }\n\n // sync domains\n if (consentManager.domains) {\n await makeGraphQLRequest(client, UPDATE_CONSENT_MANAGER_DOMAINS, {\n domains: consentManager.domains,\n airgapBundleId,\n });\n }\n\n // sync partition\n if (consentManager.partition) {\n const partitions = await fetchPartitions(client);\n const partitionToUpdate = partitions.find(\n (part) => part.name === consentManager.partition,\n );\n if (!partitionToUpdate) {\n throw new Error(\n `Partition \"${consentManager.partition}\" not found. Please create the partition first.`,\n );\n }\n await makeGraphQLRequest(client, UPDATE_CONSENT_MANAGER_PARTITION, {\n partitionId: partitionToUpdate.id,\n airgapBundleId,\n });\n }\n\n if (consentManager.version) {\n await makeGraphQLRequest(client, UPDATE_CONSENT_MANAGER_VERSION, {\n airgapBundleId,\n version: consentManager.version,\n });\n }\n\n // sync uspapi\n if (consentManager.uspapi || consentManager.signedIabAgreement) {\n await makeGraphQLRequest(client, UPDATE_TOGGLE_USP_API, {\n input: {\n id: airgapBundleId,\n ...(consentManager.uspapi ? { uspapi: consentManager.uspapi } : {}),\n ...(consentManager.signedIabAgreement\n ? { signedIabAgreement: consentManager.signedIabAgreement }\n : {}),\n },\n });\n }\n\n // sync default request policy\n if (consentManager.unknownRequestPolicy) {\n await makeGraphQLRequest(client, TOGGLE_UNKNOWN_REQUEST_POLICY, {\n input: {\n id: airgapBundleId,\n unknownRequestPolicy: consentManager.unknownRequestPolicy,\n },\n });\n }\n\n // sync default cookie policy\n if (consentManager.unknownRequestPolicy) {\n await makeGraphQLRequest(client, TOGGLE_UNKNOWN_COOKIE_POLICY, {\n input: {\n id: airgapBundleId,\n unknownCookiePolicy: consentManager.unknownCookiePolicy,\n },\n });\n }\n\n // sync telemetry partition strategy\n if (consentManager.telemetryPartitioning) {\n await makeGraphQLRequest(client, TOGGLE_TELEMETRY_PARTITION_STRATEGY, {\n input: {\n id: airgapBundleId,\n strategy: consentManager.telemetryPartitioning,\n },\n });\n }\n\n // sync telemetry partition strategy\n if (consentManager.consentPrecedence) {\n await makeGraphQLRequest(client, TOGGLE_CONSENT_PRECEDENCE, {\n input: {\n id: airgapBundleId,\n consentPrecedence: consentManager.consentPrecedence,\n },\n });\n }\n\n // Update experience configurations\n if (consentManager.experiences) {\n await syncConsentManagerExperiences(client, consentManager.experiences);\n }\n\n // update theme\n if (consentManager.theme) {\n await makeGraphQLRequest(client, UPDATE_CONSENT_MANAGER_THEME, {\n input: {\n airgapBundleId,\n ...consentManager.theme,\n },\n });\n }\n\n // TODO: https://transcend.height.app/T-23875\n // syncEndpoint: string;\n // TODO: https://transcend.height.app/T-23919\n // syncGroups: string;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { ATTRIBUTES, ATTRIBUTE_VALUES } from './gqls';\n\nimport { logger } from '../../logger';\nimport colors from 'colors';\nimport {\n AttributeKeyType,\n AttributeSupportedResourceType,\n} from '@transcend-io/privacy-types';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface AttributeValue {\n /** Attribute ID */\n id: string;\n /** Attribute name */\n name: string;\n /** Attribute description */\n description: string;\n /** Color of attribute value */\n color: string;\n}\n\nexport interface Attribute {\n /** ID of attribute */\n id: string;\n /** Name of attribute */\n name: string;\n /** if custom attribute */\n isCustom: boolean;\n /** Description */\n description: string;\n /** Type of attribute */\n type: AttributeKeyType;\n /** Values */\n values: AttributeValue[];\n /** The different fields that the attribute is enabled on */\n enabledOn: AttributeSupportedResourceType[];\n}\n\nconst PAGE_SIZE = 100;\n\n/**\n * Fetch all attribute values for an attribute key\n *\n * @param client - GraphQL client\n * @param attributeKeyId - Attribute keyID\n * @returns A map from apiKey title to Identifier\n */\nexport async function fetchAllAttributeValues(\n client: GraphQLClient,\n attributeKeyId: string,\n): Promise<AttributeValue[]> {\n logger.info(\n colors.magenta(`Fetching all attribute values for ${attributeKeyId}...`),\n );\n const attributeValues: AttributeValue[] = [];\n let offset = 0;\n\n // Paginate\n let shouldContinue = false;\n do {\n const {\n attributeValues: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n attributeValues: {\n /** List of matches */\n nodes: AttributeValue[];\n };\n }>(client, ATTRIBUTE_VALUES, {\n first: PAGE_SIZE,\n offset,\n attributeKeyId,\n });\n attributeValues.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return attributeValues.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport const SYNC_ATTRIBUTE_TYPES = [\n AttributeKeyType.MultiSelect,\n AttributeKeyType.SingleSelect,\n];\n\n/**\n * Fetch all attributes in an organization\n *\n * @param client - GraphQL client\n * @returns A map from apiKey title to Identifier\n */\nexport async function fetchAllAttributes(\n client: GraphQLClient,\n): Promise<Attribute[]> {\n logger.info(colors.magenta('Fetching all attributes...'));\n const attributes: Attribute[] = [];\n let offset = 0;\n\n // Paginate\n let shouldContinue = false;\n do {\n const {\n attributeKeys: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n attributeKeys: {\n /** List of matches */\n nodes: Attribute[];\n };\n }>(client, ATTRIBUTES, {\n first: PAGE_SIZE,\n offset,\n });\n attributes.push(\n ...(await Promise.all(\n nodes.map(async (node) => ({\n ...node,\n values: SYNC_ATTRIBUTE_TYPES.includes(node.type)\n ? await fetchAllAttributeValues(client, node.id)\n : [],\n })),\n )),\n );\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return attributes.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { BUSINESS_ENTITIES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport {\n IsoCountryCode,\n IsoCountrySubdivisionCode,\n} from '@transcend-io/privacy-types';\n\nexport interface BusinessEntity {\n /** ID of business entity */\n id: string;\n /** Title of business entity */\n title: string;\n /** Description of business entity */\n description?: string;\n /** Data protection officer name */\n dataProtectionOfficerName?: string;\n /** Data protection officer email */\n dataProtectionOfficerEmail?: string;\n /** Address of business entity */\n address?: string;\n /** Headquarters of business entity */\n headquarterCountry?: IsoCountryCode;\n /** Subdivision of business entity */\n headquarterSubDivision?: IsoCountrySubdivisionCode;\n /** Attributes */\n attributeValues: {\n /** Name of attribute value */\n name: string;\n /** Attribute key */\n attributeKey: {\n /** Name of attribute key */\n name: string;\n };\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all businessEntities in the organization\n *\n * @param client - GraphQL client\n * @returns All businessEntities in the organization\n */\nexport async function fetchAllBusinessEntities(\n client: GraphQLClient,\n): Promise<BusinessEntity[]> {\n const businessEntities: BusinessEntity[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n businessEntities: { nodes },\n } = await makeGraphQLRequest<{\n /** Business entities */\n businessEntities: {\n /** List */\n nodes: BusinessEntity[];\n };\n }>(client, BUSINESS_ENTITIES, {\n first: PAGE_SIZE,\n offset,\n });\n businessEntities.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return businessEntities.sort((a, b) => a.title.localeCompare(b.title));\n}\n","import { BusinessEntityInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { mapSeries } from '../bluebird-replace';\nimport { UPDATE_BUSINESS_ENTITIES, CREATE_BUSINESS_ENTITY } from './gqls';\nimport { logger } from '../../logger';\nimport { keyBy, chunk } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport {\n fetchAllBusinessEntities,\n BusinessEntity,\n} from './fetchAllBusinessEntities';\nimport colors from 'colors';\n\n/**\n * Input to create a new business entity\n *\n * @param client - GraphQL client\n * @param businessEntity - Input\n * @returns Created business entity\n */\nexport async function createBusinessEntity(\n client: GraphQLClient,\n businessEntity: BusinessEntityInput,\n): Promise<BusinessEntity> {\n const input = {\n title: businessEntity.title,\n description: businessEntity.description,\n address: businessEntity.address,\n headquarterCountry: businessEntity.headquarterCountry,\n headquarterSubDivision: businessEntity.headquarterSubDivision,\n dataProtectionOfficerName: businessEntity.dataProtectionOfficerName,\n dataProtectionOfficerEmail: businessEntity.dataProtectionOfficerEmail,\n attributes: businessEntity.attributes,\n teamNames: businessEntity.teams,\n ownerEmails: businessEntity.owners,\n };\n\n const { createBusinessEntity } = await makeGraphQLRequest<{\n /** Create business entity mutation */\n createBusinessEntity: {\n /** Created business entity */\n businessEntity: BusinessEntity;\n };\n }>(client, CREATE_BUSINESS_ENTITY, {\n input,\n });\n return createBusinessEntity.businessEntity;\n}\n\n/**\n * Input to update business entities\n *\n * @param client - GraphQL client\n * @param businessEntityIdParis - [BusinessEntityInput, businessEntityId] list\n */\nexport async function updateBusinessEntities(\n client: GraphQLClient,\n businessEntityIdParis: [BusinessEntityInput, string][],\n): Promise<void> {\n const chunkedUpdates = chunk(businessEntityIdParis, 100);\n await mapSeries(chunkedUpdates, async (chunked) => {\n await makeGraphQLRequest(client, UPDATE_BUSINESS_ENTITIES, {\n input: chunked.map(([businessEntity, id]) => ({\n id,\n title: businessEntity.title,\n description: businessEntity.description,\n address: businessEntity.address,\n headquarterCountry: businessEntity.headquarterCountry,\n headquarterSubDivision: businessEntity.headquarterSubDivision,\n dataProtectionOfficerName: businessEntity.dataProtectionOfficerName,\n dataProtectionOfficerEmail: businessEntity.dataProtectionOfficerEmail,\n attributes: businessEntity.attributes,\n teamNames: businessEntity.teams,\n ownerEmails: businessEntity.owners,\n })),\n });\n });\n}\n\n/**\n * Sync the data inventory business entities\n *\n * @param client - GraphQL client\n * @param inputs - Inputs to create\n * @returns True if run without error, returns false if an error occurred\n */\nexport async function syncBusinessEntities(\n client: GraphQLClient,\n inputs: BusinessEntityInput[],\n): Promise<boolean> {\n // Fetch existing\n logger.info(\n colors.magenta(`Syncing \"${inputs.length}\" business entities...`),\n );\n\n let encounteredError = false;\n\n // Fetch existing\n const existingBusinessEntities = await fetchAllBusinessEntities(client);\n\n // Look up by title\n const businessEntityByTitle = keyBy(existingBusinessEntities, 'title');\n\n // Create new business entities\n const newBusinessEntities = inputs.filter(\n (input) => !businessEntityByTitle[input.title],\n );\n\n // Create new business entities\n await mapSeries(newBusinessEntities, async (businessEntity) => {\n try {\n const newBusinessEntity = await createBusinessEntity(\n client,\n businessEntity,\n );\n businessEntityByTitle[newBusinessEntity.title] = newBusinessEntity;\n logger.info(\n colors.green(\n `Successfully synced business entity \"${businessEntity.title}\"!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync business entity \"${businessEntity.title}\"! - ${err.message}`,\n ),\n );\n }\n });\n\n // Update all business entities\n try {\n logger.info(\n colors.magenta(`Updating \"${inputs.length}\" business entities!`),\n );\n await updateBusinessEntities(\n client,\n inputs.map((input) => [input, businessEntityByTitle[input.title].id]),\n );\n logger.info(\n colors.green(`Successfully synced \"${inputs.length}\" business entities!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync \"${inputs.length}\" business entities ! - ${err.message}`,\n ),\n );\n }\n\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { DATA_FLOWS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { fetchConsentManagerId } from './fetchConsentManagerId';\nimport {\n DataFlowScope,\n ConsentTrackerSource,\n ConsentTrackerStatus,\n} from '@transcend-io/privacy-types';\n\nexport interface DataFlow {\n /** ID of data flow */\n id: string;\n /** Value of data flow */\n value: string;\n /** Type of data flow */\n type: DataFlowScope;\n /** Description of data flow */\n description: string;\n /** Enabled tracking purposes */\n trackingType: string[];\n /** The consent service */\n service: {\n /** Integration name of service */\n integrationName: string;\n };\n /** Source of how tracker was added */\n source: ConsentTrackerSource;\n /** Status of data flow labeling */\n status: ConsentTrackerStatus;\n /** Owners of that data flow */\n owners: {\n /** Email address of owner */\n email: string;\n }[];\n /** Teams assigned to that data flow */\n teams: {\n /** Name of team */\n name: string;\n }[];\n /** Attributes assigned to that data flow */\n attributeValues: {\n /** Name of attribute value */\n name: string;\n /** Attribute key that the value represents */\n attributeKey: {\n /** Name of attribute team */\n name: string;\n };\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all DataFlows in the organization\n *\n * @param client - GraphQL client\n * @param status - The status to fetch\n * @returns All DataFlows in the organization\n */\nexport async function fetchAllDataFlows(\n client: GraphQLClient,\n status = ConsentTrackerStatus.Live,\n): Promise<DataFlow[]> {\n const dataFlows: DataFlow[] = [];\n let offset = 0;\n\n const airgapBundleId = await fetchConsentManagerId(client);\n\n // Try to fetch an DataFlow with the same title\n let shouldContinue = false;\n do {\n const {\n dataFlows: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n dataFlows: {\n /** List of matches */\n nodes: DataFlow[];\n };\n }>(client, DATA_FLOWS, {\n first: PAGE_SIZE,\n offset,\n airgapBundleId,\n status,\n ...(status === ConsentTrackerStatus.NeedsReview\n ? { showZeroActivity: true }\n : {}),\n });\n dataFlows.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return dataFlows.sort((a, b) => a.value.localeCompare(b.value));\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { CREATE_DATA_FLOWS, UPDATE_DATA_FLOWS } from './gqls';\nimport { chunk } from 'lodash-es';\nimport { mapSeries } from '../bluebird-replace';\nimport { DataFlowInput } from '../../codecs';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { fetchConsentManagerId } from './fetchConsentManagerId';\nimport { logger } from '../../logger';\nimport colors from 'colors';\nimport { fetchAllDataFlows } from './fetchAllDataFlows';\nimport { ConsentTrackerStatus } from '@transcend-io/privacy-types';\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(\n (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(\n (flow) => dataFlow.value === flow.value && dataFlow.type === flow.type,\n )?.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(\n colors.magenta(`Creating \"${newDataFlows.length}\" new data flows...`),\n );\n await createDataFlows(client, newDataFlows, classifyService);\n logger.info(\n colors.green(`Successfully synced ${newDataFlows.length} data flows!`),\n );\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(\n colors.magenta(`Updating \"${existingDataFlows.length}\" data flows...`),\n );\n await updateDataFlows(client, existingDataFlows, classifyService);\n logger.info(\n colors.green(\n `Successfully updated \"${existingDataFlows.length}\" data flows!`,\n ),\n );\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","import { ActionInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { UPDATE_ACTION } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { difference } from 'lodash-es';\nimport {\n IsoCountryCode,\n IsoCountrySubdivisionCode,\n} from '@transcend-io/privacy-types';\n\nconst ALL_COUNTRIES_AND_SUBDIVISIONS = [\n ...Object.values(IsoCountryCode),\n ...Object.values(IsoCountrySubdivisionCode),\n];\n\n/**\n * Sync the consent manager\n *\n * @param client - GraphQL client\n * @param options - Options\n */\nexport async function syncAction(\n client: GraphQLClient,\n {\n action,\n actionId,\n skipPublish = false,\n }: {\n /** Action update input */\n action: ActionInput;\n /** Existing action Id */\n actionId: string;\n /** When true, skip publishing to privacy center */\n skipPublish?: boolean;\n },\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_ACTION, {\n input: {\n id: actionId,\n skipSecondaryIfNoFiles: action.skipSecondaryIfNoFiles,\n skipDownloadableStep: action.skipDownloadableStep,\n requiresReview: action.requiresReview,\n waitingPeriod: action.waitingPeriod,\n skipPublish,\n regionList: action.regionBlockList\n ? difference(ALL_COUNTRIES_AND_SUBDIVISIONS, action.regionBlockList)\n : action.regionList,\n regionDetectionMethod: action.regionDetectionMethod,\n },\n });\n}\n","import { TemplateInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { TEMPLATES, CREATE_TEMPLATE } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface Template {\n /** ID of Template */\n id: string;\n /** Title of Template */\n title: string;\n /** Template subject (e.g. email subject) */\n subject: {\n /** Default message for template subject */\n defaultMessage: string;\n };\n /** Template body - rich text HTML */\n template: {\n /** Default message for template body */\n defaultMessage: string;\n };\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all Templates in the organization\n *\n * @param client - GraphQL client\n * @param title - Filter by title\n * @returns All Templates in the organization\n */\nexport async function fetchAllTemplates(\n client: GraphQLClient,\n title?: string,\n): Promise<Template[]> {\n const templates: Template[] = [];\n let offset = 0;\n\n // Try to fetch an Template with the same title\n let shouldContinue = false;\n do {\n const {\n templates: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n templates: {\n /** List of matches */\n nodes: Template[];\n };\n }>(client, TEMPLATES, {\n first: PAGE_SIZE,\n offset,\n title,\n });\n templates.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return templates.sort((a, b) => a.title.localeCompare(b.title));\n}\n\n/**\n * Sync an email template configuration\n *\n * @param template - The email template input\n * @param client - GraphQL client\n */\nexport async function syncTemplate(\n template: TemplateInput,\n client: GraphQLClient,\n): Promise<void> {\n // Try to fetch an Template with the same title\n const matches = await fetchAllTemplates(client, template.title);\n const existingTemplate = matches.find(\n ({ title }) => title === template.title,\n );\n\n // If Template exists, update it\n if (!existingTemplate) {\n await makeGraphQLRequest(client, CREATE_TEMPLATE, {\n title: template.title,\n });\n }\n}\n","import { GraphQLClient } from 'graphql-request';\nimport {\n IsoCountryCode,\n IsoCountrySubdivisionCode,\n RegionDetectionMethod,\n RequestAction,\n} from '@transcend-io/privacy-types';\nimport { ACTIONS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface Action {\n /** ID of identifier */\n id: string;\n /** Type of action */\n type: RequestAction;\n /** Whether to skip secondary when no files exist */\n skipSecondaryIfNoFiles: boolean;\n /** Whether to skip downloadable step */\n skipDownloadableStep: boolean;\n /** Whether action requires review */\n requiresReview: boolean;\n /** Waiting period for action */\n waitingPeriod: number;\n /** Method in which the data subject's region is detected */\n regionDetectionMethod: RegionDetectionMethod;\n /** The list of regions to show in the form */\n regionList: (IsoCountryCode | IsoCountrySubdivisionCode)[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all actions in the organization\n *\n * @param client - GraphQL client\n * @returns All actions in the organization\n */\nexport async function fetchAllActions(\n client: GraphQLClient,\n): Promise<Action[]> {\n const actions: Action[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n actions: { nodes },\n } = await makeGraphQLRequest<{\n /** Actions */\n actions: {\n /** List */\n nodes: Action[];\n };\n }>(client, ACTIONS, {\n first: PAGE_SIZE,\n offset,\n });\n actions.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return actions.sort((a, b) => a.type.localeCompare(b.type));\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { PROMPT_PARTIALS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface PromptPartial {\n /** ID of prompts */\n id: string;\n /** The title of the prompt partial. */\n title: string;\n /** The content of the prompt partial. */\n content: string;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all PromptPartials in the organization\n *\n * @param client - GraphQL client\n * @returns All PromptPartials in the organization\n */\nexport async function fetchAllPromptPartials(\n client: GraphQLClient,\n): Promise<PromptPartial[]> {\n const promptPartials: PromptPartial[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n promptPartials: { nodes },\n } = await makeGraphQLRequest<{\n /** PromptPartials */\n promptPartials: {\n /** List */\n nodes: PromptPartial[];\n };\n }>(client, PROMPT_PARTIALS, {\n first: PAGE_SIZE,\n offset,\n });\n promptPartials.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return promptPartials.sort((a, b) => a.title.localeCompare(b.title));\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { PROMPT_GROUPS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface PromptGroup {\n /** ID of prompts */\n id: string;\n /** The title of the prompt group. */\n title: string;\n /** The description of the prompt group. */\n description: string;\n /** Prompts in the group */\n prompts: {\n /** Title of prompt */\n title: string;\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all PromptGroups in the organization\n *\n * @param client - GraphQL client\n * @returns All PromptGroups in the organization\n */\nexport async function fetchAllPromptGroups(\n client: GraphQLClient,\n): Promise<PromptGroup[]> {\n const promptGroups: PromptGroup[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n promptGroups: { nodes },\n } = await makeGraphQLRequest<{\n /** PromptGroups */\n promptGroups: {\n /** List */\n nodes: PromptGroup[];\n };\n }>(client, PROMPT_GROUPS, {\n first: PAGE_SIZE,\n offset,\n });\n promptGroups.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return promptGroups.sort((a, b) => a.title.localeCompare(b.title));\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { AGENTS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { LargeLanguageModelClient } from '@transcend-io/privacy-types';\n\nexport interface Agent {\n /** ID of agent */\n id: string;\n /** Name of agent */\n name: string;\n /** Agent instructions */\n instructions: string;\n /** The ID of the agent */\n agentId: string;\n /** Description of the agent */\n description: string;\n /** Whether the agent has code interpreter enabled */\n codeInterpreterEnabled: boolean;\n /** Whether the agent has retrieval enabled */\n retrievalEnabled: boolean;\n /** The prompt that the agent is based on */\n prompt?: {\n /** Title of the prompt */\n title: string;\n };\n /** Large language model that the agent is based on */\n largeLanguageModel: {\n /** Name of model */\n name: string;\n /** Client */\n client: LargeLanguageModelClient;\n };\n /** Teams assigned to the agent */\n teams: {\n /** Team name */\n name: string;\n }[];\n /** Users assigned to the agent */\n owners: {\n /** User email */\n email: string;\n }[];\n /** Functions that the agent has access to */\n agentFunctions: {\n /** Function name */\n name: string;\n }[];\n /** Files that the agent has access to */\n agentFiles: {\n /** File name */\n name: string;\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all agents in the organization\n *\n * @param client - GraphQL client\n * @param filterBy - Filter by\n * @returns All agents in the organization\n */\nexport async function fetchAllAgents(\n client: GraphQLClient,\n filterBy: {\n /** Names of the agents to filter for */\n names?: string[];\n /** IDs of agents */\n agentIds?: string[];\n } = {},\n): Promise<Agent[]> {\n const agents: Agent[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n agents: { nodes },\n } = await makeGraphQLRequest<{\n /** Agents */\n agents: {\n /** List */\n nodes: Agent[];\n };\n }>(client, AGENTS, {\n first: PAGE_SIZE,\n offset,\n filterBy,\n });\n agents.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return agents.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { AgentInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { mapSeries } from '../bluebird-replace';\nimport { UPDATE_AGENTS, CREATE_AGENT } from './gqls';\nimport { logger } from '../../logger';\nimport { keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport colors from 'colors';\nimport { fetchAllAgents, Agent } from './fetchAllAgents';\n\n/**\n * Input to create a new agent\n *\n * @param client - GraphQL client\n * @param agent - Input\n * @returns Created agent\n */\nexport async function createAgent(\n client: GraphQLClient,\n agent: AgentInput,\n): Promise<Pick<Agent, 'id' | 'name' | 'agentId'>> {\n const input = {\n name: agent.name,\n description: agent.description,\n codeInterpreterEnabled: agent.codeInterpreterEnabled,\n retrievalEnabled: agent.retrievalEnabled,\n promptTitle: agent.prompt,\n largeLanguageModelName: agent['large-language-model'].name,\n largeLanguageModelClient: agent['large-language-model'].client,\n // TODO: https://transcend.height.app/T-32760 - agentFunction, agentFile\n // TODO: https://transcend.height.app/T-31994 - owners and teams\n };\n\n const { createAgent } = await makeGraphQLRequest<{\n /** Create agent mutation */\n createAgent: {\n /** Created agent */\n agent: Agent;\n };\n }>(client, CREATE_AGENT, {\n input,\n });\n return createAgent.agent;\n}\n\n/**\n * Input to update agents\n *\n * @param client - GraphQL client\n * @param agentIdParis - [AgentInput, agentId] list\n */\nexport async function updateAgents(\n client: GraphQLClient,\n agentIdParis: [AgentInput, string][],\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_AGENTS, {\n input: {\n agents: agentIdParis.map(([agent, id]) => ({\n id,\n name: agent.name,\n description: agent.description,\n codeInterpreterEnabled: agent.codeInterpreterEnabled,\n retrievalEnabled: agent.retrievalEnabled,\n // TODO: https://transcend.height.app/T-31995 - prompt, largeLanguageModel, agentFunction, agentFile\n })),\n },\n });\n}\n\n/**\n * Sync the data inventory agents\n *\n * @param client - GraphQL client\n * @param inputs - Inputs to create\n * @returns True if run without error, returns false if an error occurred\n */\nexport async function syncAgents(\n client: GraphQLClient,\n inputs: AgentInput[],\n): Promise<boolean> {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${inputs.length}\" agents...`));\n\n let encounteredError = false;\n\n // Fetch existing\n const existingAgents = await fetchAllAgents(client);\n\n // Look up by name\n const agentByName: {\n [k in string]: Pick<Agent, 'id' | 'name' | 'agentId'>;\n } = keyBy(existingAgents, 'name');\n\n // Create new agents\n const newAgents = inputs.filter((input) => !agentByName[input.name]);\n\n // Create new agents\n await mapSeries(newAgents, async (agent) => {\n try {\n const newAgent = await createAgent(client, agent);\n agentByName[newAgent.name] = newAgent;\n logger.info(colors.green(`Successfully synced agent \"${agent.name}\"!`));\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to sync agent \"${agent.name}\"! - ${err.message}`),\n );\n }\n });\n\n // Update all agents\n try {\n logger.info(colors.magenta(`Updating \"${inputs.length}\" agents!`));\n await updateAgents(\n client,\n inputs.map((input) => [input, agentByName[input.name].id]),\n );\n logger.info(colors.green(`Successfully synced \"${inputs.length}\" agents!`));\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to sync \"${inputs.length}\" agents ! - ${err.message}`),\n );\n }\n\n return !encounteredError;\n}\n","import { ActionItemCollectionInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { mapSeries } from '../bluebird-replace';\nimport {\n UPDATE_ACTION_ITEM_COLLECTION,\n CREATE_ACTION_ITEM_COLLECTION,\n} from './gqls';\nimport { logger } from '../../logger';\nimport { keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport colors from 'colors';\nimport {\n ActionItemCollection,\n fetchAllActionItemCollections,\n} from './fetchAllActionItemCollections';\n\n/**\n * Input to create a new action item collection\n *\n * @param client - GraphQL client\n * @param actionItemCollection - Input\n * @returns Created action item collection\n */\nexport async function createActionItemCollection(\n client: GraphQLClient,\n actionItemCollection: ActionItemCollectionInput,\n): Promise<Pick<ActionItemCollection, 'id' | 'title'>> {\n const input = {\n title: actionItemCollection.title,\n description: actionItemCollection.description || '',\n hidden: actionItemCollection.hidden || false,\n productLine: actionItemCollection.productLine,\n };\n\n const { createActionItemCollection } = await makeGraphQLRequest<{\n /** Create actionItemCollection mutation */\n createActionItemCollection: {\n /** Created actionItemCollection */\n created: ActionItemCollection;\n };\n }>(client, CREATE_ACTION_ITEM_COLLECTION, {\n input,\n });\n return createActionItemCollection.created;\n}\n\n/**\n * Input to update actionItem collection\n *\n * @param client - GraphQL client\n * @param input - Input to update\n * @param actionItemCollectionId - ID of action item collection to update\n */\nexport async function updateActionItemCollection(\n client: GraphQLClient,\n input: ActionItemCollectionInput,\n actionItemCollectionId: string,\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_ACTION_ITEM_COLLECTION, {\n input: {\n id: actionItemCollectionId,\n title: input.title,\n description: input.description,\n hidden: input.hidden,\n productLine: input.productLine,\n },\n });\n}\n\n/**\n * Sync the action item collections\n *\n * @param client - GraphQL client\n * @param inputs - Inputs to create\n * @returns True if run without error, returns false if an error occurred\n */\nexport async function syncActionItemCollections(\n client: GraphQLClient,\n inputs: ActionItemCollectionInput[],\n): Promise<boolean> {\n let encounteredError = false;\n // Fetch existing\n logger.info(\n colors.magenta(`Syncing \"${inputs.length}\" action item collections...`),\n );\n\n // Fetch existing\n const existingActionItemCollections = await fetchAllActionItemCollections(\n client,\n );\n\n // Look up by title\n const collectionByTitle: { [k in string]: ActionItemCollection } = keyBy(\n existingActionItemCollections,\n 'title',\n );\n\n // Create new actionItems\n const newCollections = inputs.filter(\n (input) => !collectionByTitle[input.title],\n );\n\n // Create new actionItem collections\n await mapSeries(newCollections, async (input) => {\n try {\n await createActionItemCollection(client, input);\n logger.info(\n colors.green(\n `Successfully created action item collection \"${input.title}\"!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to create action item collection \"${input.title}\"! - ${err.message}`,\n ),\n );\n }\n });\n\n // Update all actionItems\n const actionItemsToUpdate = inputs\n .map((input) => [input, collectionByTitle[input.title]?.id])\n .filter((x): x is [ActionItemCollectionInput, string] => !!x[1]);\n await mapSeries(actionItemsToUpdate, async ([input, actionItemId]) => {\n try {\n await updateActionItemCollection(client, input, actionItemId);\n logger.info(\n colors.green(\n `Successfully synced action item collection \"${input.title}\"!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync action item collection \"${input.title}\"! - ${err.message}`,\n ),\n );\n }\n });\n\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { GLOBAL_ACTION_ITEM_COLLECTIONS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { TranscendProduct } from '@transcend-io/privacy-types';\n\nexport interface ActionItemCollection {\n /** ID of collection */\n id: string;\n /** Title of collection */\n title: string;\n /** Description of collection */\n description: string;\n /** Whether section is hidden */\n hidden: boolean;\n /** Which locations/products the action item shows up in */\n productLine: TranscendProduct;\n}\n\n/**\n * Fetch all action item collections in the organization\n *\n * @param client - GraphQL client\n * @param filterBy - Filter by\n * @returns All action item collections in the organization\n */\nexport async function fetchAllActionItemCollections(\n client: GraphQLClient,\n filterBy: {\n /** Filter on location */\n location?: TranscendProduct;\n } = {},\n): Promise<ActionItemCollection[]> {\n const {\n globalActionItemCollections: { nodes },\n } = await makeGraphQLRequest<{\n /** ActionItemCollections */\n globalActionItemCollections: {\n /** List */\n nodes: ActionItemCollection[];\n };\n }>(client, GLOBAL_ACTION_ITEM_COLLECTIONS, {\n filterBy: {\n ...filterBy,\n },\n });\n return nodes;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { GLOBAL_ACTION_ITEMS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport {\n ActionItemCode,\n ActionItemPriorityOverride,\n} from '@transcend-io/privacy-types';\n\nexport interface ActionItemRaw {\n /** ID of action item */\n ids: string[];\n /** Count of action items */\n count: number;\n /** Teams assigned to action items */\n teams: {\n /** ID of team */\n id: string;\n /** Name of team */\n name: string;\n }[];\n /** Customer experience action item ID */\n customerExperienceActionItemIds: string[];\n /** Users assigned to the action item */\n users: {\n /** ID of user */\n id: string;\n /** User email */\n email: string;\n }[];\n /** Due date of action item */\n dueDate?: string;\n /** Priority of action item */\n priority?: ActionItemPriorityOverride;\n /** Titles of action items */\n titles: string[];\n /** Description of the action item */\n resolved: boolean;\n /** Notes */\n notes: string[];\n /** links */\n links: string[];\n /** Action item types */\n type: ActionItemCode;\n /** Custom fields */\n attributeValues: {\n /** Name of attribute value */\n name: string;\n /** Attribute key that the value represents */\n attributeKey: {\n /** Name of attribute team */\n name: string;\n };\n }[];\n /** Additional context related to action item */\n additionalContexts?: {\n /** Override of icon */\n iconOverride?: string;\n /** Request ID */\n requestId?: string;\n /** Data Silo ID */\n dataSiloId?: string;\n /** Request type */\n requestType?: string;\n /** Airgap version */\n latestAirgapVersion?: string;\n /** Parent title */\n parentTitle?: string;\n };\n /** Sections where action item is grouped under */\n collections: {\n /** ID of collection that action item belongs to */\n id: string;\n /** Title of collection */\n title: string;\n }[];\n}\n\nexport interface ActionItem\n extends Omit<ActionItemRaw, 'ids' | 'titles' | 'links' | 'notes'> {\n /** ID of action item */\n id: string;\n /** Title of action item */\n title: string;\n /** Notes */\n notes: string;\n /** Links */\n link: string;\n /** Sections where action item is grouped under */\n collections: {\n /** ID of collection that action item belongs to */\n id: string;\n /** Title of collection */\n title: string;\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all action items in the organization\n *\n * @param client - GraphQL client\n * @param filterBy - Filter by\n * @returns All action items in the organization\n */\nexport async function fetchAllActionItems(\n client: GraphQLClient,\n filterBy: {\n /** Names of the action items to filter for */\n priority?: ActionItemPriorityOverride[];\n /** Type of action item */\n type?: ActionItemCode[];\n /** Whether resolved or not */\n resolved?: boolean;\n /** Filter for action items due before this date */\n startDueDate?: Date;\n /** Filter for action items due after this date */\n endDueDate?: Date;\n } = {},\n): Promise<ActionItem[]> {\n const actionItems: ActionItem[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n globalActionItems: { nodes },\n } = await makeGraphQLRequest<{\n /** ActionItems */\n globalActionItems: {\n /** List */\n nodes: ActionItemRaw[];\n };\n }>(client, GLOBAL_ACTION_ITEMS, {\n first: PAGE_SIZE,\n offset,\n filterBy: {\n ...filterBy,\n ...(filterBy.startDueDate\n ? { startDueDate: filterBy.startDueDate.toISOString() }\n : {}),\n ...(filterBy.endDueDate\n ? { endDueDate: filterBy.endDueDate.toISOString() }\n : {}),\n },\n });\n actionItems.push(\n ...nodes.map((node) => ({\n ...node,\n id: node.ids[0],\n title: node.titles[0],\n notes: node.notes[0],\n link: node.links[0],\n })),\n );\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return actionItems;\n}\n","import { ActionItemInput } from '../../codecs';\nimport { uniq, keyBy, chunk } from 'lodash-es';\nimport { GraphQLClient } from 'graphql-request';\nimport { mapSeries } from '../bluebird-replace';\nimport { UPDATE_ACTION_ITEMS, CREATE_ACTION_ITEMS } from './gqls';\nimport { logger } from '../../logger';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport colors from 'colors';\nimport { fetchAllActionItems, ActionItem } from './fetchAllActionItems';\nimport {\n ActionItemCollection,\n fetchAllActionItemCollections,\n} from './fetchAllActionItemCollections';\nimport { Attribute, fetchAllAttributes } from './fetchAllAttributes';\n\n/**\n * Input to create a new actionItem\n *\n * @param client - GraphQL client\n * @param actionItems - Action item inputs\n * @param actionItemCollectionByTitle - Action item collections indexed by title\n * @param attributeKeysByName - Lookup attribute by name\n */\nexport async function createActionItems(\n client: GraphQLClient,\n actionItems: ActionItemInput[],\n actionItemCollectionByTitle: { [k in string]: ActionItemCollection },\n // TODO: https://transcend.height.app/T-38961 - insert attributes\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n attributeKeysByName: { [k in string]: Attribute } = {},\n): Promise<void> {\n // TODO: https://transcend.height.app/T-38961 - insert attributes\n // const getAttribute = (key: string): string => {\n // const existing = attributeKeysByName[key];\n // if (!existing) {\n // throw new Error(`Attribute key \"${key}\" does not exist!`);\n // }\n // return existing.id;\n // };\n const chunked = chunk(actionItems, 100);\n await mapSeries(chunked, async (chunkToUpload) => {\n await makeGraphQLRequest(client, CREATE_ACTION_ITEMS, {\n input: chunkToUpload.map((actionItem) => ({\n title: actionItem.title,\n type: actionItem.type,\n priorityOverride: actionItem.priority,\n dueDate: actionItem.dueDate,\n customerExperienceActionItemId:\n actionItem.customerExperienceActionItemId,\n resolved: actionItem.resolved,\n notes: actionItem.notes,\n link: actionItem.link,\n assigneesUserEmails: actionItem.users,\n assigneesTeamNames: actionItem.teams,\n ...(actionItem.attributes\n ? {\n // TODO: https://transcend.height.app/T-38961 - insert attributes\n // attributes: actionItem.attributes.map(({ key, values }) => ({\n // attributeKeyId: getAttribute(key),\n // attributeValueNames: values,\n // })),\n }\n : {}),\n collectionIds: actionItem.collections.map(\n (collectionTitle) => actionItemCollectionByTitle[collectionTitle].id,\n ),\n })),\n });\n });\n}\n\n/**\n * Input to update actionItems\n *\n * @param client - GraphQL client\n * @param input - Input to update\n * @param actionItemId - ID of action item to update\n * @param attributeKeysByName - Attribute keys by name\n */\nexport async function updateActionItem(\n client: GraphQLClient,\n input: ActionItemInput,\n actionItemId: string,\n attributeKeysByName: {\n [k in string]: Attribute;\n } = {},\n): Promise<void> {\n const getAttribute = (key: string): string => {\n const existing = attributeKeysByName[key];\n if (!existing) {\n throw new Error(`Attribute key \"${key}\" does not exist!`);\n }\n return existing.id;\n };\n await makeGraphQLRequest(client, UPDATE_ACTION_ITEMS, {\n input: {\n ids: [actionItemId],\n title: input.title,\n priorityOverride: input.priority,\n dueDate: input.dueDate,\n resolved: input.resolved,\n customerExperienceActionItemId: input.customerExperienceActionItemId,\n notes: input.notes,\n link: input.link,\n assigneesUserEmails: input.users,\n assigneesTeamNames: input.teams,\n ...(input.attributes\n ? {\n attributes: input.attributes.map(({ key, values }) => ({\n attributeKeyId: getAttribute(key),\n attributeValueNames: values,\n })),\n }\n : {}),\n },\n });\n}\n\n/**\n * Convert action item to a unique key\n *\n * @param actionItem - action item\n * @returns Unique key\n */\nfunction actionItemToUniqueCode({\n title,\n collections,\n}: Pick<ActionItem, 'title' | 'collections'>): string {\n return `${title}-${collections\n .map((c) => c.title)\n .sort()\n .join('-')}`;\n}\n\n/**\n * Convert action item to a unique key\n *\n * @param actionItem - action item\n * @returns Unique key\n */\nfunction actionItemInputToUniqueCode({\n title,\n collections,\n}: Pick<ActionItemInput, 'title' | 'collections'>): string {\n return `${title}-${collections.sort().join('-')}`;\n}\n\n/**\n * Sync the action item\n *\n * @param client - GraphQL client\n * @param inputs - Inputs to create\n * @returns True if run without error, returns false if an error occurred\n */\nexport async function syncActionItems(\n client: GraphQLClient,\n inputs: ActionItemInput[],\n): Promise<boolean> {\n let encounteredError = false;\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${inputs.length}\" actionItems...`));\n\n // Determine if attributes are syncing\n const hasAttributes = inputs.some(\n (input) => input.attributes && input.attributes.length > 0,\n );\n\n // Fetch existing\n const [existingActionItems, existingActionItemCollections, attributeKeys] =\n await Promise.all([\n fetchAllActionItems(client),\n fetchAllActionItemCollections(client),\n hasAttributes ? fetchAllAttributes(client) : [],\n ]);\n\n // Look up by title\n const actionItemCollectionByTitle: { [k in string]: ActionItemCollection } =\n keyBy(existingActionItemCollections, 'title');\n const actionItemByTitle: { [k in string]: ActionItem } = keyBy(\n existingActionItems,\n actionItemToUniqueCode,\n );\n const attributeKeysByName = keyBy(attributeKeys, 'name');\n const actionItemByCxId: { [k in string]: ActionItem } = keyBy(\n existingActionItems.filter((x) => !!x.customerExperienceActionItemIds),\n ({ customerExperienceActionItemIds }) => customerExperienceActionItemIds[0],\n );\n\n // Ensure all collections exist\n const missingCollections = uniq(\n inputs.map((input) => input.collections).flat(),\n ).filter((collectionTitle) => !actionItemCollectionByTitle[collectionTitle]);\n if (missingCollections.length > 0) {\n logger.info(\n colors.red(\n `Missing action item collections: \"${missingCollections.join(\n '\", \"',\n )}\" - please create them first!`,\n ),\n );\n return false;\n }\n\n // Create new actionItems\n const newActionItems = inputs.filter(\n (input) =>\n !actionItemByTitle[actionItemInputToUniqueCode(input)] &&\n !actionItemByCxId[input.customerExperienceActionItemId!],\n );\n\n // Create new actionItems\n if (newActionItems.length > 0) {\n try {\n logger.info(\n colors.magenta(`Creating \"${newActionItems.length}\" actionItems...`),\n );\n await createActionItems(\n client,\n newActionItems,\n actionItemCollectionByTitle,\n attributeKeysByName,\n );\n logger.info(\n colors.green(\n `Successfully created \"${newActionItems.length}\" actionItems!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to create action items! - ${err.message}`),\n );\n }\n }\n\n // Update all actionItems\n const actionItemsToUpdate = inputs\n .map((input) => [\n input,\n actionItemByTitle[actionItemInputToUniqueCode(input)]?.id ||\n actionItemByCxId[input.customerExperienceActionItemId!]?.id,\n ])\n .filter((x): x is [ActionItemInput, string] => !!x[1]);\n await mapSeries(actionItemsToUpdate, async ([input, actionItemId]) => {\n try {\n await updateActionItem(client, input, actionItemId, attributeKeysByName);\n logger.info(\n colors.green(`Successfully synced action item \"${input.title}\"!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync action item \"${input.title}\"! - ${err.message}`,\n ),\n );\n }\n });\n\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { AGENT_FUNCTIONS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport type { JSONSchema7 } from 'json-schema';\n\nexport interface AgentFunction {\n /** ID of agentFunction */\n id: string;\n /** Name of agentFunction */\n name: string;\n /** Description of the agentFunction */\n description: string;\n /** The JSON schema */\n parameters: JSONSchema7;\n}\n\ninterface AgentFunctionInput extends Omit<AgentFunction, 'parameters'> {\n /** Stringified parameters */\n parameters: string;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all agentFunctions in the organization\n *\n * @param client - GraphQL client\n * @returns All agentFunctions in the organization\n */\nexport async function fetchAllAgentFunctions(\n client: GraphQLClient,\n): Promise<AgentFunction[]> {\n const agentFunctions: AgentFunction[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n agentFunctions: { nodes },\n } = await makeGraphQLRequest<{\n /** AgentFunctions */\n agentFunctions: {\n /** List */\n nodes: AgentFunctionInput[];\n };\n }>(client, AGENT_FUNCTIONS, {\n first: PAGE_SIZE,\n offset,\n });\n agentFunctions.push(\n ...nodes.map((node) => ({\n ...node,\n parameters: JSON.parse(node.parameters),\n })),\n );\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return agentFunctions.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { AgentFunctionInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { mapSeries } from '../bluebird-replace';\nimport { UPDATE_AGENT_FUNCTIONS, CREATE_AGENT_FUNCTION } from './gqls';\nimport { logger } from '../../logger';\nimport { keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport colors from 'colors';\nimport {\n fetchAllAgentFunctions,\n AgentFunction,\n} from './fetchAllAgentFunctions';\n\n/**\n * Input to create a new agent function\n *\n * @param client - GraphQL client\n * @param agentFunction - Input\n * @returns Created agent function\n */\nexport async function createAgentFunction(\n client: GraphQLClient,\n agentFunction: AgentFunctionInput,\n): Promise<Pick<AgentFunction, 'id' | 'name'>> {\n const input = {\n name: agentFunction.name,\n description: agentFunction.description,\n parameters: agentFunction.parameters,\n agentIds: [],\n // TODO: https://transcend.height.app/T-31994 - sync agents\n };\n\n const { createAgentFunction } = await makeGraphQLRequest<{\n /** Create agent function mutation */\n createAgentFunction: {\n /** Created agent function */\n agentFunction: AgentFunction;\n };\n }>(client, CREATE_AGENT_FUNCTION, {\n input,\n });\n return createAgentFunction.agentFunction;\n}\n\n/**\n * Input to update agent functions\n *\n * @param client - GraphQL client\n * @param agentFunctionIdPairs - [AgentFunctionInput, agentFunctionId] list\n */\nexport async function updateAgentFunctions(\n client: GraphQLClient,\n agentFunctionIdPairs: [AgentFunctionInput, string][],\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_AGENT_FUNCTIONS, {\n input: {\n agentFunctions: agentFunctionIdPairs.map(([agentFunction, id]) => ({\n id,\n name: agentFunction.name,\n description: agentFunction.description,\n parameters: agentFunction.parameters,\n })),\n },\n });\n}\n\n/**\n * Sync the data inventory agent functions\n *\n * @param client - GraphQL client\n * @param inputs - Inputs to create\n * @returns True if run without error, returns false if an error occurred\n */\nexport async function syncAgentFunctions(\n client: GraphQLClient,\n inputs: AgentFunctionInput[],\n): Promise<boolean> {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${inputs.length}\" agent functions...`));\n\n let encounteredError = false;\n\n // Fetch existing\n const existingAgentFunctions = await fetchAllAgentFunctions(client);\n\n // Look up by name\n const agentFunctionByName: {\n [k in string]: Pick<AgentFunction, 'id' | 'name'>;\n } = keyBy(existingAgentFunctions, 'name');\n\n // Create new agent functions\n const newAgentFunctions = inputs.filter(\n (input) => !agentFunctionByName[input.name],\n );\n\n // Create new agent functions\n await mapSeries(newAgentFunctions, async (agentFunction) => {\n try {\n const newAgentFunction = await createAgentFunction(client, agentFunction);\n agentFunctionByName[newAgentFunction.name] = newAgentFunction;\n logger.info(\n colors.green(\n `Successfully synced agent function \"${agentFunction.name}\"!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync agent function \"${agentFunction.name}\"! - ${err.message}`,\n ),\n );\n }\n });\n\n // Update all agent functions\n try {\n logger.info(colors.magenta(`Updating \"${inputs.length}\" agent functions!`));\n await updateAgentFunctions(\n client,\n inputs.map((input) => [input, agentFunctionByName[input.name].id]),\n );\n logger.info(\n colors.green(`Successfully synced \"${inputs.length}\" agent functions!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync \"${inputs.length}\" agent functions! - ${err.message}`,\n ),\n );\n }\n\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { AGENT_FILES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { PromptFilePurpose } from '@transcend-io/privacy-types';\n\nexport interface AgentFile {\n /** ID of agentFile */\n id: string;\n /** Name of agentFile */\n name: string;\n /** Description of the agentFile */\n description: string;\n /** Initial file name, useful to track if a file was split into multiple chunks */\n initialFileName?: string;\n /** File ID */\n fileId: string;\n /** File size */\n size: number;\n /** File purpose */\n purpose: PromptFilePurpose;\n}\n\nconst PAGE_SIZE = 20;\n\nexport interface AgentFileFilterBy {\n /** Filter by remote file IDs */\n fileIds?: string[];\n /** Filter by file names */\n names?: string[];\n /** Filter by initial file names (when split into chunks) */\n initialFileNames?: string[];\n}\n\n/**\n * Fetch all agentFiles in the organization\n *\n * @param client - GraphQL client\n * @param filterBy - Filter by options\n * @returns All agentFiles in the organization\n */\nexport async function fetchAllAgentFiles(\n client: GraphQLClient,\n filterBy: AgentFileFilterBy = {},\n): Promise<AgentFile[]> {\n const agentFiles: AgentFile[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n agentFiles: { nodes },\n } = await makeGraphQLRequest<{\n /** AgentFiles */\n agentFiles: {\n /** List */\n nodes: AgentFile[];\n };\n }>(client, AGENT_FILES, {\n first: PAGE_SIZE,\n offset,\n filterBy,\n });\n agentFiles.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return agentFiles.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { AgentFileInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { mapSeries } from '../bluebird-replace';\nimport { UPDATE_AGENT_FILES, CREATE_AGENT_FILE } from './gqls';\nimport { logger } from '../../logger';\nimport { keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport colors from 'colors';\nimport { fetchAllAgentFiles, AgentFile } from './fetchAllAgentFiles';\n\n/**\n * Input to create a new agent file\n *\n * @param client - GraphQL client\n * @param agentFile - Input\n * @returns Created agent file\n */\nexport async function createAgentFile(\n client: GraphQLClient,\n agentFile: AgentFileInput,\n): Promise<Pick<AgentFile, 'id' | 'name' | 'fileId'>> {\n const input = {\n name: agentFile.name,\n description: agentFile.description,\n fileId: agentFile.fileId,\n size: agentFile.size,\n purpose: agentFile.purpose,\n fileUploadedAt: new Date(),\n agentIds: [],\n // TODO: https://transcend.height.app/T-31994 - sync agents\n };\n\n const { createAgentFile } = await makeGraphQLRequest<{\n /** Create agent file mutation */\n createAgentFile: {\n /** Created agent file */\n agentFile: AgentFile;\n };\n }>(client, CREATE_AGENT_FILE, {\n input,\n });\n return createAgentFile.agentFile;\n}\n\n/**\n * Input to update agent files\n *\n * @param client - GraphQL client\n * @param agentFileIdPairs - [AgentFileInput, agentFileId] list\n */\nexport async function updateAgentFiles(\n client: GraphQLClient,\n agentFileIdPairs: [AgentFileInput, string][],\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_AGENT_FILES, {\n input: {\n agentFiles: agentFileIdPairs.map(([agentFile, id]) => ({\n id,\n name: agentFile.name,\n description: agentFile.description,\n fileId: agentFile.fileId,\n size: agentFile.size,\n purpose: agentFile.purpose,\n })),\n },\n });\n}\n\n/**\n * Sync the data inventory agent files\n *\n * @param client - GraphQL client\n * @param inputs - Inputs to create\n * @returns True if run without error, returns false if an error occurred\n */\nexport async function syncAgentFiles(\n client: GraphQLClient,\n inputs: AgentFileInput[],\n): Promise<boolean> {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${inputs.length}\" agent files...`));\n\n let encounteredError = false;\n\n // Fetch existing\n const existingAgentFiles = await fetchAllAgentFiles(client);\n\n // Look up by name\n const agentFileByName: {\n [k in string]: Pick<AgentFile, 'id' | 'name' | 'fileId'>;\n } = keyBy(existingAgentFiles, 'name');\n\n // Create new agent files\n const newAgentFiles = inputs.filter((input) => !agentFileByName[input.name]);\n\n // Create new agent files\n await mapSeries(newAgentFiles, async (agentFile) => {\n try {\n const newAgentFile = await createAgentFile(client, agentFile);\n agentFileByName[newAgentFile.name] = newAgentFile;\n logger.info(\n colors.green(`Successfully synced agent file \"${agentFile.name}\"!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync agent file \"${agentFile.name}\"! - ${err.message}`,\n ),\n );\n }\n });\n\n // Update all agent files\n try {\n logger.info(colors.magenta(`Updating \"${inputs.length}\" agent files!`));\n await updateAgentFiles(\n client,\n inputs.map((input) => [input, agentFileByName[input.name].id]),\n );\n logger.info(\n colors.green(`Successfully synced \"${inputs.length}\" agent files!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync \"${inputs.length}\" agent files! - ${err.message}`,\n ),\n );\n }\n\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { VENDORS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport {\n IsoCountryCode,\n IsoCountrySubdivisionCode,\n} from '@transcend-io/privacy-types';\n\nexport interface Vendor {\n /** ID of vendor */\n id: string;\n /** Title of vendor */\n title: string;\n /** Description of vendor */\n description: string;\n /** DPA link */\n dataProcessingAgreementLink?: string;\n /** Contract email */\n contactName?: string;\n /** Contract phone */\n contactPhone?: string;\n /** Address */\n address?: string;\n /** Headquarters country */\n headquarterCountry?: IsoCountryCode;\n /** Headquarters subdivision */\n headquarterSubDivision?: IsoCountrySubdivisionCode;\n /** Website URL */\n websiteUrl?: string;\n /** Business entity */\n businessEntity?: {\n /** Business entity title */\n title: string;\n };\n /** Assigned teams */\n teams: {\n /** Team name */\n name: string;\n }[];\n /** Assigned owners */\n owners: {\n /** Email */\n email: string;\n }[];\n /** Custom fields */\n attributeValues: {\n /** Name of attribute value */\n name: string;\n /** Attribute key that the value represents */\n attributeKey: {\n /** Name of attribute team */\n name: string;\n };\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all vendors in the organization\n *\n * @param client - GraphQL client\n * @returns All vendors in the organization\n */\nexport async function fetchAllVendors(\n client: GraphQLClient,\n): Promise<Vendor[]> {\n const vendors: Vendor[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n vendors: { nodes },\n } = await makeGraphQLRequest<{\n /** Vendors */\n vendors: {\n /** List */\n nodes: Vendor[];\n };\n }>(client, VENDORS, {\n first: PAGE_SIZE,\n offset,\n });\n vendors.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return vendors.sort((a, b) => a.title.localeCompare(b.title));\n}\n","import { VendorInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { mapSeries } from '../bluebird-replace';\nimport { UPDATE_VENDORS, CREATE_VENDOR } from './gqls';\nimport { logger } from '../../logger';\nimport { keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport colors from 'colors';\nimport { fetchAllVendors, Vendor } from './fetchAllVendors';\n\n/**\n * Input to create a new vendor\n *\n * @param client - GraphQL client\n * @param vendor - Input\n * @returns Created vendor\n */\nexport async function createVendor(\n client: GraphQLClient,\n vendor: VendorInput,\n): Promise<Pick<Vendor, 'id' | 'title'>> {\n const input = {\n title: vendor.title,\n description: vendor.description,\n address: vendor.address,\n headquarterCountry: vendor.headquarterCountry,\n headquarterSubDivision: vendor.headquarterSubDivision,\n dataProcessingAgreementLink: vendor.dataProcessingAgreementLink,\n contactName: vendor.contactName,\n contactPhone: vendor.contactPhone,\n websiteUrl: vendor.websiteUrl,\n // TODO: https://transcend.height.app/T-31994 - add attributes, teams, owners\n };\n\n const { createVendor } = await makeGraphQLRequest<{\n /** Create vendor mutation */\n createVendor: {\n /** Created vendor */\n vendor: Vendor;\n };\n }>(client, CREATE_VENDOR, {\n input,\n });\n return createVendor.vendor;\n}\n\n/**\n * Input to update vendors\n *\n * @param client - GraphQL client\n * @param vendorIdParis - [VendorInput, vendorId] list\n */\nexport async function updateVendors(\n client: GraphQLClient,\n vendorIdParis: [VendorInput, string][],\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_VENDORS, {\n input: {\n vendors: vendorIdParis.map(([vendor, id]) => ({\n id,\n title: vendor.title,\n description: vendor.description,\n address: vendor.address,\n headquarterCountry: vendor.headquarterCountry,\n headquarterSubDivision: vendor.headquarterSubDivision,\n dataProcessingAgreementLink: vendor.dataProcessingAgreementLink,\n contactName: vendor.contactName,\n contactPhone: vendor.contactPhone,\n websiteUrl: vendor.websiteUrl,\n // TODO: https://transcend.height.app/T-31994 - add teams, owners\n attributes: vendor.attributes,\n })),\n },\n });\n}\n\n/**\n * Sync the data inventory vendors\n *\n * @param client - GraphQL client\n * @param inputs - Inputs to create\n * @returns True if run without error, returns false if an error occurred\n */\nexport async function syncVendors(\n client: GraphQLClient,\n inputs: VendorInput[],\n): Promise<boolean> {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${inputs.length}\" vendors...`));\n\n let encounteredError = false;\n\n // Fetch existing\n const existingVendors = await fetchAllVendors(client);\n\n // Look up by title\n const vendorByTitle: { [k in string]: Pick<Vendor, 'id' | 'title'> } = keyBy(\n existingVendors,\n 'title',\n );\n\n // Create new vendors\n const newVendors = inputs.filter((input) => !vendorByTitle[input.title]);\n\n // Create new vendors\n await mapSeries(newVendors, async (vendor) => {\n try {\n const newVendor = await createVendor(client, vendor);\n vendorByTitle[newVendor.title] = newVendor;\n logger.info(\n colors.green(`Successfully synced vendor \"${vendor.title}\"!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to sync vendor \"${vendor.title}\"! - ${err.message}`),\n );\n }\n });\n\n // Update all vendors\n try {\n logger.info(colors.magenta(`Updating \"${inputs.length}\" vendors!`));\n await updateVendors(\n client,\n inputs.map((input) => [input, vendorByTitle[input.title].id]),\n );\n logger.info(\n colors.green(`Successfully synced \"${inputs.length}\" vendors!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync \"${inputs.length}\" vendors ! - ${err.message}`,\n ),\n );\n }\n\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { DATA_SUB_CATEGORIES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { DataCategoryType } from '@transcend-io/privacy-types';\n\nexport interface DataSubCategory {\n /** ID of data category */\n id: string;\n /** Name of data category */\n name: string;\n /** Type of data category */\n category: DataCategoryType;\n /** Description of data category */\n description?: string;\n /** Regex for data category */\n regex?: string;\n /** Assigned teams */\n teams: {\n /** Team name */\n name: string;\n }[];\n /** Assigned owners */\n owners: {\n /** Email */\n email: string;\n }[];\n /** Custom fields */\n attributeValues: {\n /** Name of attribute value */\n name: string;\n /** Attribute key that the value represents */\n attributeKey: {\n /** Name of attribute team */\n name: string;\n };\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all dataSubCategories in the organization\n *\n * @param client - GraphQL client\n * @returns All dataSubCategories in the organization\n */\nexport async function fetchAllDataCategories(\n client: GraphQLClient,\n): Promise<DataSubCategory[]> {\n const dataSubCategories: DataSubCategory[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n dataSubCategories: { nodes },\n } = await makeGraphQLRequest<{\n /** DataCategories */\n dataSubCategories: {\n /** List */\n nodes: DataSubCategory[];\n };\n }>(client, DATA_SUB_CATEGORIES, {\n first: PAGE_SIZE,\n offset,\n });\n dataSubCategories.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return dataSubCategories.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { DataCategoryInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { mapSeries } from '../bluebird-replace';\nimport { UPDATE_DATA_SUB_CATEGORIES, CREATE_DATA_SUB_CATEGORY } from './gqls';\nimport { logger } from '../../logger';\nimport { keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport colors from 'colors';\nimport {\n fetchAllDataCategories,\n DataSubCategory,\n} from './fetchAllDataCategories';\n\n/**\n * Input to create a new data category\n *\n * @param client - GraphQL client\n * @param dataCategory - Input\n * @returns Created data category\n */\nexport async function createDataCategory(\n client: GraphQLClient,\n dataCategory: DataCategoryInput,\n): Promise<Pick<DataSubCategory, 'id' | 'name' | 'category'>> {\n const input = {\n name: dataCategory.name,\n category: dataCategory.category,\n description: dataCategory.description,\n // TODO: https://transcend.height.app/T-31994 - add attributes, teams, owners\n };\n\n const { createDataCategory } = await makeGraphQLRequest<{\n /** Create data category mutation */\n createDataCategory: {\n /** Created data category */\n dataCategory: DataSubCategory;\n };\n }>(client, CREATE_DATA_SUB_CATEGORY, {\n input,\n });\n return createDataCategory.dataCategory;\n}\n\n/**\n * Input to update data categories\n *\n * @param client - GraphQL client\n * @param dataCategoryIdPairs - [DataCategoryInput, dataCategoryId] list\n */\nexport async function updateDataCategories(\n client: GraphQLClient,\n dataCategoryIdPairs: [DataCategoryInput, string][],\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_DATA_SUB_CATEGORIES, {\n input: {\n dataSubCategories: dataCategoryIdPairs.map(([dataCategory, id]) => ({\n id,\n description: dataCategory.description,\n // TODO: https://transcend.height.app/T-31994 - add teams, owners\n attributes: dataCategory.attributes,\n })),\n },\n });\n}\n\n/**\n * Sync the data inventory data categories\n *\n * @param client - GraphQL client\n * @param inputs - Inputs to create\n * @returns True if run without error, returns false if an error occurred\n */\nexport async function syncDataCategories(\n client: GraphQLClient,\n inputs: DataCategoryInput[],\n): Promise<boolean> {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${inputs.length}\" data categories...`));\n\n let encounteredError = false;\n\n // Fetch existing\n const existingDataCategories = await fetchAllDataCategories(client);\n\n // Look up by name\n const dataCategoryByName: {\n [k in string]: Pick<DataSubCategory, 'id' | 'name' | 'category'>;\n } = keyBy(\n existingDataCategories,\n ({ name, category }) => `${name}:${category}`,\n );\n\n // Create new data categories\n const newDataCategories = inputs.filter(\n (input) => !dataCategoryByName[`${input.name}:${input.category}`],\n );\n\n // Create new data categories\n await mapSeries(newDataCategories, async (dataCategory) => {\n try {\n const newDataCategory = await createDataCategory(client, dataCategory);\n dataCategoryByName[\n `${newDataCategory.name}:${newDataCategory.category}`\n ] = newDataCategory;\n logger.info(\n colors.green(\n `Successfully synced data category \"${dataCategory.name}\"!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync data category \"${dataCategory.name}\"! - ${err.message}`,\n ),\n );\n }\n });\n\n // Update all data categories\n try {\n logger.info(colors.magenta(`Updating \"${inputs.length}\" data categories!`));\n await updateDataCategories(\n client,\n inputs.map((input) => [\n input,\n dataCategoryByName[`${input.name}:${input.category}`].id,\n ]),\n );\n logger.info(\n colors.green(`Successfully synced \"${inputs.length}\" data categories!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync \"${inputs.length}\" data categories ! - ${err.message}`,\n ),\n );\n }\n\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { PROCESSING_PURPOSE_SUB_CATEGORIES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { ProcessingPurpose } from '@transcend-io/privacy-types';\n\nexport interface ProcessingPurposeSubCategory {\n /** ID of processing purpose */\n id: string;\n /** Name of processing purpose */\n name: string;\n /** Type of processing purpose */\n purpose: ProcessingPurpose;\n /** Description of processing purpose */\n description?: string;\n /** Assigned teams */\n teams: {\n /** Team name */\n name: string;\n }[];\n /** Assigned owners */\n owners: {\n /** Email */\n email: string;\n }[];\n /** Custom fields */\n attributeValues: {\n /** Name of attribute value */\n name: string;\n /** Attribute key that the value represents */\n attributeKey: {\n /** Name of attribute team */\n name: string;\n };\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all processingPurposeSubCategories in the organization\n *\n * @param client - GraphQL client\n * @returns All processingPurposeSubCategories in the organization\n */\nexport async function fetchAllProcessingPurposes(\n client: GraphQLClient,\n): Promise<ProcessingPurposeSubCategory[]> {\n const processingPurposeSubCategories: ProcessingPurposeSubCategory[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n processingPurposeSubCategories: { nodes },\n } = await makeGraphQLRequest<{\n /** DataCategories */\n processingPurposeSubCategories: {\n /** List */\n nodes: ProcessingPurposeSubCategory[];\n };\n }>(client, PROCESSING_PURPOSE_SUB_CATEGORIES, {\n first: PAGE_SIZE,\n offset,\n });\n processingPurposeSubCategories.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return processingPurposeSubCategories.sort((a, b) =>\n a.name.localeCompare(b.name),\n );\n}\n","import { ProcessingPurposeInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { mapSeries } from '../bluebird-replace';\nimport {\n UPDATE_PROCESSING_PURPOSE_SUB_CATEGORIES,\n CREATE_PROCESSING_PURPOSE_SUB_CATEGORY,\n} from './gqls';\nimport { logger } from '../../logger';\nimport { keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport colors from 'colors';\nimport {\n fetchAllProcessingPurposes,\n ProcessingPurposeSubCategory,\n} from './fetchAllProcessingPurposes';\n\n/**\n * Input to create a new processing purpose\n *\n * @param client - GraphQL client\n * @param processingPurpose - Input\n * @returns Created processing purpose\n */\nexport async function createProcessingPurpose(\n client: GraphQLClient,\n processingPurpose: ProcessingPurposeInput,\n): Promise<Pick<ProcessingPurposeSubCategory, 'id' | 'name' | 'purpose'>> {\n const input = {\n name: processingPurpose.name,\n purpose: processingPurpose.purpose,\n description: processingPurpose.description,\n // TODO: https://transcend.height.app/T-31994 - add attributes, teams, owners\n };\n\n const { createProcessingPurposeSubCategory } = await makeGraphQLRequest<{\n /** Create processing purpose mutation */\n createProcessingPurposeSubCategory: {\n /** Created processing purpose */\n processingPurposeSubCategory: ProcessingPurposeSubCategory;\n };\n }>(client, CREATE_PROCESSING_PURPOSE_SUB_CATEGORY, {\n input,\n });\n return createProcessingPurposeSubCategory.processingPurposeSubCategory;\n}\n\n/**\n * Input to update processing purposes\n *\n * @param client - GraphQL client\n * @param processingPurposeIdPairs - [ProcessingPurposeInput, processingPurposeId] list\n */\nexport async function updateProcessingPurposes(\n client: GraphQLClient,\n processingPurposeIdPairs: [ProcessingPurposeInput, string][],\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_PROCESSING_PURPOSE_SUB_CATEGORIES, {\n input: {\n processingPurposeSubCategories: processingPurposeIdPairs.map(\n ([processingPurpose, id]) => ({\n id,\n description: processingPurpose.description,\n // TODO: https://transcend.height.app/T-31994 - add teams, owners\n attributes: processingPurpose.attributes,\n }),\n ),\n },\n });\n}\n\n/**\n * Sync the data inventory processing purposes\n *\n * @param client - GraphQL client\n * @param inputs - Inputs to create\n * @returns True if run without error, returns false if an error occurred\n */\nexport async function syncProcessingPurposes(\n client: GraphQLClient,\n inputs: ProcessingPurposeInput[],\n): Promise<boolean> {\n // Fetch existing\n logger.info(\n colors.magenta(`Syncing \"${inputs.length}\" processing purposes...`),\n );\n\n let encounteredError = false;\n\n // Fetch existing\n const existingProcessingPurposes = await fetchAllProcessingPurposes(client);\n\n // Look up by name\n const processingPurposeByName: {\n [k in string]: Pick<ProcessingPurposeSubCategory, 'id' | 'name'>;\n } = keyBy(\n existingProcessingPurposes,\n ({ name, purpose }) => `${name}:${purpose}`,\n );\n\n // Create new processing purposes\n const newProcessingPurposes = inputs.filter(\n (input) => !processingPurposeByName[`${input.name}:${input.purpose}`],\n );\n\n // Create new processing purposes\n await mapSeries(newProcessingPurposes, async (processingPurpose) => {\n try {\n const newProcessingPurpose = await createProcessingPurpose(\n client,\n processingPurpose,\n );\n processingPurposeByName[\n `${newProcessingPurpose.name}:${newProcessingPurpose.purpose}`\n ] = newProcessingPurpose;\n logger.info(\n colors.green(\n `Successfully synced processing purpose \"${processingPurpose.name}\"!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync processing purpose \"${processingPurpose.name}\"! - ${err.message}`,\n ),\n );\n }\n });\n\n // Update all processing purposes\n try {\n logger.info(\n colors.magenta(`Updating \"${inputs.length}\" processing purposes!`),\n );\n await updateProcessingPurposes(\n client,\n inputs.map((input) => [\n input,\n processingPurposeByName[`${input.name}:${input.purpose}`].id,\n ]),\n );\n logger.info(\n colors.green(\n `Successfully synced \"${inputs.length}\" processing purposes!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync \"${inputs.length}\" processing purposes ! - ${err.message}`,\n ),\n );\n }\n\n return !encounteredError;\n}\n","/* eslint-disable max-lines */\nimport { TranscendInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { logger } from '../../logger';\nimport colors from 'colors';\nimport { map } from '../bluebird-replace';\nimport {\n fetchIdentifiersAndCreateMissing,\n Identifier,\n} from './fetchIdentifiers';\nimport { syncIdentifier } from './syncIdentifier';\nimport { syncEnricher } from './syncEnrichers';\nimport { syncAttribute } from './syncAttribute';\nimport { syncDataSiloDependencies, syncDataSilos } from './syncDataSilos';\nimport { syncCookies } from './syncCookies';\nimport {\n fetchAllDataSubjects,\n ensureAllDataSubjectsExist,\n} from './fetchDataSubjects';\nimport { syncTeams } from './syncTeams';\nimport { syncDataSubject } from './syncDataSubject';\nimport { fetchApiKeys } from './fetchApiKeys';\nimport { syncPrompts } from './syncPrompts';\nimport { syncPolicies } from './syncPolicies';\nimport { syncIntlMessages } from './syncIntlMessages';\nimport { syncPrivacyCenter } from './syncPrivacyCenter';\nimport { syncConsentManager } from './syncConsentManager';\nimport { fetchAllAttributes } from './fetchAllAttributes';\nimport { syncBusinessEntities } from './syncBusinessEntities';\nimport { syncDataFlows } from './syncDataFlows';\nimport { syncAction } from './syncAction';\nimport { syncTemplate } from './syncTemplates';\nimport { fetchAllActions } from './fetchAllActions';\nimport { syncPromptPartials } from './syncPromptPartials';\nimport { syncPromptGroups } from './syncPromptGroups';\nimport { syncAgents } from './syncAgents';\nimport { syncActionItemCollections } from './syncActionItemCollections';\nimport { syncActionItems } from './syncActionItems';\nimport { syncAgentFunctions } from './syncAgentFunctions';\nimport { syncAgentFiles } from './syncAgentFiles';\nimport { syncVendors } from './syncVendors';\nimport { syncDataCategories } from './syncDataCategories';\nimport { syncProcessingPurposes } from './syncProcessingPurposes';\nimport { syncPartitions } from './syncPartitions';\n\nconst CONCURRENCY = 10;\n\n/**\n * Sync the yaml input back to Transcend using the GraphQL APIs\n *\n * @param input - The yml input\n * @param client - GraphQL client\n * @param pageSize - Page size\n * @returns True if an error was encountered\n */\nexport async function syncConfigurationToTranscend(\n input: TranscendInput,\n client: GraphQLClient,\n {\n pageSize = 50,\n // TODO: https://transcend.height.app/T-23779\n publishToPrivacyCenter = true,\n classifyService = false,\n deleteExtraAttributeValues = false,\n }: {\n /** Page size */\n pageSize?: number;\n /** When true, skip publishing to privacy center */\n publishToPrivacyCenter?: boolean;\n /** When true, delete any attributes being synced up */\n deleteExtraAttributeValues?: boolean;\n /** classify data flow service if missing */\n classifyService?: boolean;\n },\n): Promise<boolean> {\n let encounteredError = false;\n\n logger.info(colors.magenta(`Fetching data with page size ${pageSize}...`));\n\n const {\n templates,\n attributes,\n actions,\n identifiers,\n 'data-subjects': dataSubjects,\n 'business-entities': businessEntities,\n enrichers,\n cookies,\n 'consent-manager': consentManager,\n 'data-silos': dataSilos,\n 'data-flows': dataFlows,\n prompts,\n 'prompt-groups': promptGroups,\n 'prompt-partials': promptPartials,\n agents,\n 'agent-functions': agentFunctions,\n 'agent-files': agentFiles,\n vendors,\n 'data-categories': dataCategories,\n 'processing-purposes': processingPurposes,\n 'action-items': actionItems,\n 'action-item-collections': actionItemCollections,\n teams,\n 'privacy-center': privacyCenter,\n messages,\n policies,\n partitions,\n } = input;\n\n const [identifierByName, dataSubjectsByName, apiKeyTitleMap] =\n await Promise.all([\n // Ensure all identifiers are created and create a map from name -> identifier.id\n enrichers || identifiers\n ? fetchIdentifiersAndCreateMissing(\n input,\n client,\n !publishToPrivacyCenter,\n )\n : ({} as { [k in string]: Identifier }),\n // Grab all data subjects in the organization\n dataSilos || dataSubjects || enrichers\n ? ensureAllDataSubjectsExist(input, client)\n : {},\n // Grab API keys\n dataSilos &&\n dataSilos\n .map((dataSilo) => dataSilo['api-key-title'] || [])\n .reduce((acc, lst) => acc + lst.length, 0) > 0\n ? fetchApiKeys(input, client)\n : {},\n ]);\n\n // Sync consent manager\n if (consentManager) {\n logger.info(colors.magenta('Syncing consent manager...'));\n try {\n await syncConsentManager(client, consentManager);\n logger.info(colors.green('Successfully synced consent manager!'));\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to sync consent manager! - ${err.message}`),\n );\n }\n }\n\n // Sync prompts\n if (prompts) {\n const promptsSuccess = await syncPrompts(client, prompts);\n encounteredError = encounteredError || !promptsSuccess;\n }\n if (promptPartials) {\n const promptsSuccess = await syncPromptPartials(client, promptPartials);\n encounteredError = encounteredError || !promptsSuccess;\n }\n if (promptGroups) {\n const promptsSuccess = await syncPromptGroups(client, promptGroups);\n encounteredError = encounteredError || !promptsSuccess;\n }\n\n if (teams) {\n const teamsSuccess = await syncTeams(client, teams);\n encounteredError = encounteredError || !teamsSuccess;\n }\n\n // Sync email templates\n if (templates) {\n logger.info(\n colors.magenta(`Syncing \"${templates.length}\" email templates...`),\n );\n await map(\n templates,\n async (template) => {\n logger.info(colors.magenta(`Syncing template \"${template.title}\"...`));\n try {\n await syncTemplate(template, client);\n logger.info(\n colors.green(`Successfully synced template \"${template.title}\"!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync template \"${template.title}\"! - ${err.message}`,\n ),\n );\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${templates.length}\" email templates!`));\n }\n\n // Sync business entities\n if (businessEntities) {\n const businessEntitySuccess = await syncBusinessEntities(\n client,\n businessEntities,\n );\n encounteredError = encounteredError || !businessEntitySuccess;\n }\n\n // Sync vendors\n if (vendors) {\n const vendorsSuccess = await syncVendors(client, vendors);\n encounteredError = encounteredError || !vendorsSuccess;\n }\n\n // Sync data categories\n if (dataCategories) {\n const dataCategoriesSuccess = await syncDataCategories(\n client,\n dataCategories,\n );\n encounteredError = encounteredError || !dataCategoriesSuccess;\n }\n\n // Sync processing purposes\n if (processingPurposes) {\n const processingPurposesSuccess = await syncProcessingPurposes(\n client,\n processingPurposes,\n );\n encounteredError = encounteredError || !processingPurposesSuccess;\n }\n\n // Sync partitions\n if (partitions) {\n const partitionsSuccess = await syncPartitions(client, partitions);\n encounteredError = encounteredError || !partitionsSuccess;\n }\n\n // Sync agents\n if (agents) {\n const agentsSuccess = await syncAgents(client, agents);\n encounteredError = encounteredError || !agentsSuccess;\n }\n\n // Sync agent functions\n if (agentFunctions) {\n const agentFunctionsSuccess = await syncAgentFunctions(\n client,\n agentFunctions,\n );\n encounteredError = encounteredError || !agentFunctionsSuccess;\n }\n\n // Sync agent files\n if (agentFiles) {\n const agentFilesSuccess = await syncAgentFiles(client, agentFiles);\n encounteredError = encounteredError || !agentFilesSuccess;\n }\n\n // Sync cookies\n if (cookies) {\n const cookiesSuccess = await syncCookies(client, cookies);\n encounteredError = encounteredError || !cookiesSuccess;\n }\n\n // Sync action item collections\n if (actionItemCollections) {\n const actionItemCollectionsSuccess = await syncActionItemCollections(\n client,\n actionItemCollections,\n );\n encounteredError = encounteredError || !actionItemCollectionsSuccess;\n }\n\n // Sync attributes\n if (attributes) {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${attributes.length}\" attributes...`));\n const existingAttributes = await fetchAllAttributes(client);\n await map(\n attributes,\n async (attribute) => {\n const existing = existingAttributes.find(\n (attr) => attr.name === attribute.name,\n );\n\n logger.info(colors.magenta(`Syncing attribute \"${attribute.name}\"...`));\n try {\n await syncAttribute(client, attribute, {\n existingAttribute: existing,\n deleteExtraAttributeValues,\n });\n logger.info(\n colors.green(`Successfully synced attribute \"${attribute.name}\"!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync attribute \"${attribute.name}\"! - ${err.message}`,\n ),\n );\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${attributes.length}\" attributes!`));\n }\n\n // Sync action items\n if (actionItems) {\n const actionItemsSuccess = await syncActionItems(client, actionItems);\n encounteredError = encounteredError || !actionItemsSuccess;\n }\n\n // Sync enrichers\n if (enrichers) {\n logger.info(colors.magenta(`Syncing \"${enrichers.length}\" enrichers...`));\n await map(\n enrichers,\n async (enricher) => {\n logger.info(colors.magenta(`Syncing enricher \"${enricher.title}\"...`));\n try {\n await syncEnricher(client, {\n enricher,\n identifierByName,\n dataSubjectsByName,\n });\n logger.info(\n colors.green(`Successfully synced enricher \"${enricher.title}\"!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync enricher \"${enricher.title}\"! - ${err.message}`,\n ),\n );\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${enrichers.length}\" enrichers!`));\n }\n\n // Sync identifiers\n if (identifiers) {\n // Fetch existing\n logger.info(\n colors.magenta(`Syncing \"${identifiers.length}\" identifiers...`),\n );\n await map(\n identifiers,\n async (identifier) => {\n const existing = identifierByName[identifier.name];\n if (!existing) {\n throw new Error(\n `Failed to find identifier with name: ${identifier.type}. Should have been auto-created by cli.`,\n );\n }\n\n logger.info(\n colors.magenta(`Syncing identifier \"${identifier.type}\"...`),\n );\n try {\n await syncIdentifier(client, {\n identifier,\n dataSubjectsByName,\n identifierId: existing.id,\n skipPublish: !publishToPrivacyCenter,\n });\n logger.info(\n colors.green(\n `Successfully synced identifier \"${identifier.type}\"!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync identifier \"${identifier.type}\"! - ${err.message}`,\n ),\n );\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${identifiers.length}\" identifiers!`));\n }\n\n // Sync actions\n if (actions) {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${actions.length}\" actions...`));\n const existingActions = await fetchAllActions(client);\n await map(\n actions,\n async (action) => {\n const existing = existingActions.find(\n (act) => act.type === action.type,\n );\n if (!existing) {\n throw new Error(\n `Failed to find action with type: ${action.type}. Should have already existing in the organization.`,\n );\n }\n\n logger.info(colors.magenta(`Syncing action \"${action.type}\"...`));\n try {\n await syncAction(client, {\n action,\n actionId: existing.id,\n skipPublish: !publishToPrivacyCenter,\n });\n logger.info(\n colors.green(`Successfully synced action \"${action.type}\"!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync action \"${action.type}\"! - ${err.message}`,\n ),\n );\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${actions.length}\" actions!`));\n }\n\n // Sync data subjects\n if (dataSubjects) {\n // Fetch existing\n logger.info(\n colors.magenta(`Syncing \"${dataSubjects.length}\" data subjects...`),\n );\n const existingDataSubjects = await fetchAllDataSubjects(client);\n await map(\n dataSubjects,\n async (dataSubject) => {\n const existing = existingDataSubjects.find(\n (subj) => subj.type === dataSubject.type,\n );\n if (!existing) {\n throw new Error(\n `Failed to find data subject with type: ${dataSubject.type}. Should have already existing in the organization.`,\n );\n }\n\n logger.info(\n colors.magenta(`Syncing data subject \"${dataSubject.type}\"...`),\n );\n try {\n await syncDataSubject(client, {\n dataSubject,\n dataSubjectId: existing.id,\n skipPublish: !publishToPrivacyCenter,\n });\n logger.info(\n colors.green(\n `Successfully synced data subject \"${dataSubject.type}\"!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(\n `Failed to sync data subject \"${dataSubject.type}\"! - ${err.message}`,\n ),\n );\n }\n },\n {\n concurrency: CONCURRENCY,\n },\n );\n logger.info(colors.green(`Synced \"${dataSubjects.length}\" data subjects!`));\n }\n\n // Sync data flows\n if (dataFlows) {\n const syncedDataFlows = await syncDataFlows(\n client,\n dataFlows,\n classifyService,\n );\n encounteredError = encounteredError || !syncedDataFlows;\n }\n\n // Sync privacy center\n if (privacyCenter) {\n const privacyCenterSuccess = await syncPrivacyCenter(client, privacyCenter);\n encounteredError = encounteredError || !privacyCenterSuccess;\n }\n\n // Sync messages\n if (messages) {\n const messagesSuccess = await syncIntlMessages(client, messages);\n encounteredError = encounteredError || !messagesSuccess;\n }\n\n // Sync policies\n if (policies) {\n const policiesSuccess = await syncPolicies(client, policies);\n encounteredError = encounteredError || !policiesSuccess;\n }\n\n // Store dependency updates\n const dependencyUpdates: [string, string[]][] = [];\n // Sync data silos\n if (dataSilos) {\n const { success, dataSiloTitleToId } = await syncDataSilos(\n dataSilos,\n client,\n {\n dataSubjectsByName,\n apiKeysByTitle: apiKeyTitleMap,\n pageSize,\n },\n );\n dataSilos?.forEach((dataSilo) => {\n // Queue up dependency update\n if (dataSilo['deletion-dependencies']) {\n dependencyUpdates.push([\n dataSiloTitleToId[dataSilo.title],\n dataSilo['deletion-dependencies'],\n ]);\n }\n });\n encounteredError = encounteredError || !success;\n }\n\n // Dependencies updated at the end after all data silos are created\n if (dependencyUpdates.length > 0) {\n await syncDataSiloDependencies(client, dependencyUpdates);\n }\n\n if (publishToPrivacyCenter) {\n // TODO: https://transcend.height.app/T-23779\n }\n\n return encounteredError;\n}\n/* eslint-enable max-lines */\n","import { TeamInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { mapSeries } from '../bluebird-replace';\nimport { UPDATE_TEAM, CREATE_TEAM } from './gqls';\nimport { logger } from '../../logger';\nimport { keyBy } from 'lodash-es';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport colors from 'colors';\nimport { fetchAllTeams, Team } from './fetchAllTeams';\n\n/**\n * Input to create a new team\n *\n * @param client - GraphQL client\n * @param team - Input\n * @returns Created team\n */\nexport async function createTeam(\n client: GraphQLClient,\n team: TeamInput,\n): Promise<Pick<Team, 'id' | 'name'>> {\n const input = {\n name: team.name,\n description: team.description,\n ssoTitle: team['sso-title'],\n ssoDepartment: team['sso-department'],\n ssoGroup: team['sso-group'],\n scopes: team.scopes,\n userEmails: team.users,\n };\n\n const { createTeam } = await makeGraphQLRequest<{\n /** Create team mutation */\n createTeam: {\n /** Created team */\n team: Team;\n };\n }>(client, CREATE_TEAM, {\n input,\n });\n return createTeam.team;\n}\n\n/**\n * Input to update teams\n *\n * @param client - GraphQL client\n * @param input - Team input to update\n * @param teamId - ID of team\n * @returns Updated team\n */\nexport async function updateTeam(\n client: GraphQLClient,\n input: TeamInput,\n teamId: string,\n): Promise<Pick<Team, 'id' | 'name'>> {\n const { updateTeam } = await makeGraphQLRequest<{\n /** Update team mutation */\n updateTeam: {\n /** Updated team */\n team: Team;\n };\n }>(client, UPDATE_TEAM, {\n input: {\n id: teamId,\n name: input.name,\n description: input.description,\n ssoTitle: input['sso-title'],\n ssoDepartment: input['sso-department'],\n ssoGroup: input['sso-group'],\n scopes: input.scopes,\n userEmails: input.users,\n },\n });\n return updateTeam.team;\n}\n\n/**\n * Sync the teams\n *\n * @param client - GraphQL client\n * @param inputs - Inputs to create\n * @returns True if run without error, returns false if an error occurred\n */\nexport async function syncTeams(\n client: GraphQLClient,\n inputs: TeamInput[],\n): Promise<boolean> {\n // Fetch existing\n logger.info(colors.magenta(`Syncing \"${inputs.length}\" teams...`));\n\n let encounteredError = false;\n\n // Fetch existing\n const existingTeams = await fetchAllTeams(client);\n\n // Look up by name\n const teamsByName: { [k in string]: Pick<Team, 'id' | 'name'> } = keyBy(\n existingTeams,\n 'name',\n );\n\n // Create new teams\n const newTeams = inputs.filter((input) => !teamsByName[input.name]);\n const updatedTeams = inputs.filter((input) => !!teamsByName[input.name]);\n\n // Create new teams\n await mapSeries(newTeams, async (team) => {\n try {\n const newTeam = await createTeam(client, team);\n teamsByName[newTeam.name] = newTeam;\n logger.info(colors.green(`Successfully created team \"${team.name}\"!`));\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to sync team \"${team.name}\"! - ${err.message}`),\n );\n }\n });\n\n // Update all teams\n await mapSeries(updatedTeams, async (input) => {\n try {\n const newTeam = await updateTeam(\n client,\n input,\n teamsByName[input.name].id,\n );\n teamsByName[newTeam.name] = newTeam;\n logger.info(colors.green(`Successfully updated team \"${input.name}\"!`));\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to sync team \"${input.name}\"! - ${err.message}`),\n );\n }\n });\n\n return !encounteredError;\n}\n","import { PromptPartialInput } from '../../codecs';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { UPDATE_PROMPT_PARTIALS, CREATE_PROMPT_PARTIAL } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { map } from '../bluebird-replace';\nimport { fetchAllPromptPartials } from './fetchPromptPartials';\nimport { keyBy } from 'lodash-es';\nimport { logger } from '../../logger';\n\n/**\n * Create a new prompt partial\n *\n * @param client - GraphQL client\n * @param input - Prompt input\n * @returns Prompt partial ID\n */\nexport async function createPromptPartial(\n client: GraphQLClient,\n input: {\n /** Title of prompt partial */\n title: string;\n /** Prompt content */\n content: string;\n },\n): Promise<string> {\n const {\n createPromptPartial: { promptPartial },\n } = await makeGraphQLRequest<{\n /** createPromptPartial mutation */\n createPromptPartial: {\n /** Prompt partial */\n promptPartial: {\n /** ID */\n id: string;\n };\n };\n }>(client, CREATE_PROMPT_PARTIAL, {\n input,\n });\n logger.info(\n colors.green(`Successfully created prompt partial \"${input.title}\"!`),\n );\n return promptPartial.id;\n}\n\n/**\n * Update a set of existing prompt partials\n *\n * @param client - GraphQL client\n * @param input - Prompt input\n */\nexport async function updatePromptPartials(\n client: GraphQLClient,\n input: [PromptPartialInput, string][],\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_PROMPT_PARTIALS, {\n input: {\n promptPartials: input.map(([input, id]) => ({\n ...input,\n id,\n })),\n },\n });\n logger.info(\n colors.green(`Successfully updated ${input.length} prompt partials!`),\n );\n}\n\n/**\n * Sync the prompt partials\n *\n * @param client - GraphQL client\n * @param promptPartials - PromptPartials\n * @param concurrency - Concurrency\n * @returns True if synced successfully\n */\nexport async function syncPromptPartials(\n client: GraphQLClient,\n promptPartials: PromptPartialInput[],\n concurrency = 20,\n): Promise<boolean> {\n let encounteredError = false;\n logger.info(\n colors.magenta(`Syncing \"${promptPartials.length}\" prompt partials...`),\n );\n\n // Index existing prompt partials\n const existing = await fetchAllPromptPartials(client);\n const promptPartialByTitle = keyBy(existing, 'title');\n\n // Determine which promptPartials are new vs existing\n const mapPromptPartialsToExisting = promptPartials.map((promptInput) => [\n promptInput,\n promptPartialByTitle[promptInput.title]?.id,\n ]);\n\n // Create the new promptPartials\n const newPromptPartials = mapPromptPartialsToExisting\n .filter(([, existing]) => !existing)\n .map(([promptInput]) => promptInput as PromptPartialInput);\n try {\n logger.info(\n colors.magenta(\n `Creating \"${newPromptPartials.length}\" new prompt partials...`,\n ),\n );\n await map(\n newPromptPartials,\n async (prompt) => {\n await createPromptPartial(client, prompt);\n },\n {\n concurrency,\n },\n );\n logger.info(\n colors.green(\n `Successfully synced ${newPromptPartials.length} prompt partials!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to create prompt partials! - ${err.message}`),\n );\n }\n\n // Update existing promptPartials\n const existingPromptPartials = mapPromptPartialsToExisting.filter(\n (x): x is [PromptPartialInput, string] => !!x[1],\n );\n try {\n logger.info(\n colors.magenta(\n `Updating \"${existingPromptPartials.length}\" prompt partials...`,\n ),\n );\n await updatePromptPartials(client, existingPromptPartials);\n logger.info(\n colors.green(\n `Successfully updated \"${existingPromptPartials.length}\" prompt partials!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to create prompt partials! - ${err.message}`),\n );\n }\n\n logger.info(\n colors.green(`Synced \"${promptPartials.length}\" prompt partials!`),\n );\n\n // Return true upon success\n return !encounteredError;\n}\n","import { PromptGroupInput } from '../../codecs';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { UPDATE_PROMPT_GROUPS, CREATE_PROMPT_GROUP } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { map } from '../bluebird-replace';\nimport { fetchAllPromptGroups } from './fetchPromptGroups';\nimport { keyBy } from 'lodash-es';\nimport { logger } from '../../logger';\nimport { fetchAllPrompts } from './fetchPrompts';\n\nexport interface EditPromptGroupInput {\n /** Title of prompt group */\n title: string;\n /** Prompt group description */\n description: string;\n /** Prompt IDs */\n promptIds: string[];\n}\n\n/**\n * Create a new prompt group\n *\n * @param client - GraphQL client\n * @param input - Prompt input\n * @returns Prompt group ID\n */\nexport async function createPromptGroup(\n client: GraphQLClient,\n input: EditPromptGroupInput,\n): Promise<string> {\n const {\n createPromptGroup: { promptGroup },\n } = await makeGraphQLRequest<{\n /** createPromptGroup mutation */\n createPromptGroup: {\n /** Prompt group */\n promptGroup: {\n /** ID */\n id: string;\n };\n };\n }>(client, CREATE_PROMPT_GROUP, {\n input,\n });\n logger.info(\n colors.green(`Successfully created prompt group \"${input.title}\"!`),\n );\n return promptGroup.id;\n}\n\n/**\n * Update a set of existing prompt groups\n *\n * @param client - GraphQL client\n * @param input - Prompt input\n */\nexport async function updatePromptGroups(\n client: GraphQLClient,\n input: [EditPromptGroupInput, string][],\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_PROMPT_GROUPS, {\n input: {\n promptGroups: input.map(([input, id]) => ({\n ...input,\n id,\n })),\n },\n });\n logger.info(\n colors.green(`Successfully updated ${input.length} prompt groups!`),\n );\n}\n\n/**\n * Sync the prompt groups\n *\n * @param client - GraphQL client\n * @param promptGroups - PromptGroups\n * @param concurrency - Concurrency\n * @returns True if synced successfully\n */\nexport async function syncPromptGroups(\n client: GraphQLClient,\n promptGroups: PromptGroupInput[],\n concurrency = 20,\n): Promise<boolean> {\n let encounteredError = false;\n logger.info(\n colors.magenta(`Syncing \"${promptGroups.length}\" prompt groups...`),\n );\n\n // Index existing prompt groups\n const existing = await fetchAllPromptGroups(client);\n const existingPrompts = await fetchAllPrompts(client);\n const promptByTitle = keyBy(existingPrompts, 'title');\n const promptGroupByTitle = keyBy(existing, 'title');\n\n // Determine which promptGroups are new vs existing\n const mapPromptGroupsToExisting = promptGroups.map((promptInput) => [\n promptInput,\n promptGroupByTitle[promptInput.title]?.id,\n ]);\n\n // Create the new promptGroups\n const newPromptGroups = mapPromptGroupsToExisting\n .filter(([, existing]) => !existing)\n .map(([promptInput]) => promptInput as PromptGroupInput);\n try {\n logger.info(\n colors.magenta(\n `Creating \"${newPromptGroups.length}\" new prompt groups...`,\n ),\n );\n await map(\n newPromptGroups,\n async (prompt) => {\n await createPromptGroup(client, {\n ...prompt,\n promptIds: prompt.prompts.map((title) => {\n const prompt = promptByTitle[title];\n if (!prompt) {\n throw new Error(`Failed to find prompt with title: \"${title}\"`);\n }\n return prompt.id;\n }),\n });\n },\n {\n concurrency,\n },\n );\n logger.info(\n colors.green(\n `Successfully synced ${newPromptGroups.length} prompt groups!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create prompt groups! - ${err.message}`));\n }\n\n // Update existing promptGroups\n const existingPromptGroups = mapPromptGroupsToExisting.filter(\n (x): x is [PromptGroupInput, string] => !!x[1],\n );\n try {\n logger.info(\n colors.magenta(\n `Updating \"${existingPromptGroups.length}\" prompt groups...`,\n ),\n );\n await updatePromptGroups(\n client,\n existingPromptGroups.map(([{ prompts, ...input }, id]) => [\n {\n ...input,\n promptIds: prompts.map((title) => {\n const prompt = promptByTitle[title];\n if (!prompt) {\n throw new Error(`Failed to find prompt with title: \"${title}\"`);\n }\n return prompt.id;\n }),\n },\n id,\n ]),\n );\n logger.info(\n colors.green(\n `Successfully updated \"${existingPromptGroups.length}\" prompt groups!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(colors.red(`Failed to create prompt groups! - ${err.message}`));\n }\n\n logger.info(colors.green(`Synced \"${promptGroups.length}\" prompt groups!`));\n\n // Return true upon success\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { logger } from '../../logger';\nimport { ENABLED_PLUGINS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface Plugin {\n /** Associated data silo */\n dataSilo: {\n /** The type of plugin */\n type: string;\n };\n /** The ID of this plugin */\n id: string;\n}\n\nexport interface PluginResponse {\n /** The key object of the response */\n plugins: {\n /** The total count */\n totalCount: number;\n /** The list of plugins */\n plugins: Plugin[];\n };\n}\n\n/**\n * Fetch a data silo discovery plugin\n *\n * @param client - GraphQL client\n * @param dataSiloId - The data silo to look up plugins for\n * @returns An active data silo plugin (if multiple, returns the first)\n */\nexport async function fetchActiveSiloDiscoPlugin(\n client: GraphQLClient,\n dataSiloId: string,\n): Promise<Plugin> {\n const response = await makeGraphQLRequest<PluginResponse>(\n client,\n ENABLED_PLUGINS,\n {\n dataSiloId,\n type: 'DATA_SILO_DISCOVERY',\n },\n );\n\n const { plugins, totalCount } = response.plugins;\n if (totalCount === 0) {\n logger.error('No active data silo plugins found for this data silo.');\n process.exit(1);\n }\n\n const plugin = plugins[0];\n return plugin;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { PRIVACY_CENTER } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { LanguageKey } from '@transcend-io/internationalization';\nimport { PrivacyCenterThemePartial } from '@transcend-io/privacy-types';\nimport { fetchPrivacyCenterUrl } from './fetchPrivacyCenterId';\n\nexport interface PrivacyCenter {\n /** ID of the privacy center */\n id: string;\n /** The URL of the privacy center */\n url: string;\n /** Whether or not the entire privacy center is enabled or disabled */\n isDisabled: boolean;\n /** Whether or not to show the privacy requests button */\n showPrivacyRequestButton: boolean;\n /** Whether or not to show the policies page */\n showPolicies: boolean;\n /** Whether or not to show the tracking technologies page */\n showTrackingTechnologies: boolean;\n /** Whether or not to show the cookies on the tracking technologies page */\n showCookies: boolean;\n /** Whether or not to show the data flows on the tracking technologies page */\n showDataFlows: boolean;\n /** Whether or not to show the consent manager opt out options on the tracking technologies page */\n showConsentManager: boolean;\n /** Whether or not to show the manage your privacy page */\n showManageYourPrivacy: boolean;\n /** Whether or not to show the marketing preferences page */\n showMarketingPreferences: boolean;\n /** What languages are supported for the privacy center */\n locales: LanguageKey[];\n /** The default locale for the privacy center */\n defaultLocale: LanguageKey;\n /** Whether or not to prefer the browser default locale */\n preferBrowserDefaultLocale: boolean;\n /** The email addresses of the employees within your company that are the go-to individuals for managing this privacy center */\n supportEmail: string;\n /** The email addresses of the employees within your company that are the go-to individuals for managing this privacy center */\n replyToEmail: string;\n /** Whether or not to send emails from a no reply email */\n useNoReplyEmailAddress: boolean;\n /** Whether or not to use a custom email domain */\n useCustomEmailDomain: boolean;\n /** Whether or not to transcend access requests from JSON to CSV */\n transformAccessReportJsonToCsv: boolean;\n /** The theme object of colors to display on the privacy center */\n theme: PrivacyCenterThemePartial;\n}\n\n/**\n * Fetch all privacy centers in the organization\n *\n * @param client - GraphQL client\n * @returns All privacy centers in the organization\n */\nexport async function fetchAllPrivacyCenters(\n client: GraphQLClient,\n): Promise<PrivacyCenter[]> {\n const deployedPrivacyCenterUrl = await fetchPrivacyCenterUrl(client);\n const {\n privacyCenter: { themeStr, ...rest },\n } = await makeGraphQLRequest<{\n /** Privacy centers */\n privacyCenter: Omit<PrivacyCenter, 'theme'> & {\n /** Theme string */\n themeStr: string;\n };\n }>(client, PRIVACY_CENTER, {\n url: deployedPrivacyCenterUrl,\n });\n\n return [\n {\n ...rest,\n theme: JSON.parse(themeStr),\n },\n ];\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { MESSAGES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { LanguageKey } from '@transcend-io/internationalization';\n\nexport interface Message {\n /** ID of message */\n id: string;\n /** Default message */\n defaultMessage: string;\n /** React Intl ID */\n targetReactIntlId: string | null;\n /** Disabled locales */\n translations: {\n /** Locale */\n locale: LanguageKey;\n /** Value */\n value: string;\n }[];\n}\n\n/**\n * Fetch all messages in the organization\n *\n * @param client - GraphQL client\n * @returns All messages in the organization\n */\nexport async function fetchAllMessages(\n client: GraphQLClient,\n): Promise<Message[]> {\n const { translatedMessages } = await makeGraphQLRequest<{\n /** Messages */\n translatedMessages: Message[];\n }>(client, MESSAGES, {});\n return translatedMessages;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { COOKIES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { fetchConsentManagerId } from './fetchConsentManagerId';\nimport {\n ConsentTrackerSource,\n ConsentTrackerStatus,\n} from '@transcend-io/privacy-types';\n\nexport interface Cookie {\n /** ID of the cookie */\n id: string;\n /** Name of the cookie */\n name: string;\n /** Whether cookie is a regular express */\n isRegex: boolean;\n /** Description of cookie */\n description: string;\n /** Enabled tracking purposes for the cookie */\n trackingPurposes: string[];\n /** The consent service */\n service: {\n /** Integration name of service */\n integrationName: string;\n };\n /** Source of how tracker was added */\n source: ConsentTrackerSource;\n /** Status of cookie labeling */\n status: ConsentTrackerStatus;\n /** Owners of that cookie */\n owners: {\n /** Email address of owner */\n email: string;\n }[];\n /** Teams assigned to that cookie */\n teams: {\n /** Name of team */\n name: string;\n }[];\n /** Attributes assigned to that cookie */\n attributeValues: {\n /** Name of attribute value */\n name: string;\n /** Attribute key that the value represents */\n attributeKey: {\n /** Name of attribute team */\n name: string;\n };\n }[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all Cookies in the organization\n *\n * @param client - GraphQL client\n * @param status - The status to fetch\n * @returns All Cookies in the organization\n */\nexport async function fetchAllCookies(\n client: GraphQLClient,\n status = ConsentTrackerStatus.Live,\n): Promise<Cookie[]> {\n const cookies: Cookie[] = [];\n let offset = 0;\n\n const airgapBundleId = await fetchConsentManagerId(client);\n\n // Try to fetch an Cookies with the same title\n let shouldContinue = false;\n do {\n const {\n cookies: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n cookies: {\n /** List of matches */\n nodes: Cookie[];\n };\n }>(client, COOKIES, {\n first: PAGE_SIZE,\n offset,\n airgapBundleId,\n status,\n });\n cookies.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return cookies.sort((a, b) => a.name.localeCompare(b.name));\n}\n","/* eslint-disable max-lines */\nimport { GraphQLClient } from 'graphql-request';\nimport { ASSESSMENTS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport {\n AssessmentFormStatus,\n AssessmentQuestionSubType,\n AssessmentQuestionType,\n AssessmentSyncColumn,\n AssessmentSyncModel,\n AttributeSupportedResourceType,\n DataCategoryType,\n ProcessingPurpose,\n RetentionScheduleOperation,\n RetentionScheduleType,\n} from '@transcend-io/privacy-types';\n\n/**\n * Represents an assessment with various properties and metadata.\n */\nexport interface Assessment {\n /** The ID of the assessment */\n id: string;\n /** The user who created the assessment */\n creator: UserPreview;\n /** The user who last edited the assessment */\n lastEditor: UserPreview;\n /** The title of the assessment */\n title: string;\n /** The description of the assessment */\n description: string;\n /** The current status of the assessment */\n status: AssessmentFormStatus;\n /** The users assigned to the assessment */\n assignees: UserPreview[];\n /** The external users assigned to the assessment */\n externalAssignees: ExternalUser[];\n /** The users who are reviewers of the assessment */\n reviewers: UserPreview[];\n /** Indicates if the assessment is locked */\n isLocked: boolean;\n /** Indicates if the assessment is archived */\n isArchived: boolean;\n /** Indicates if the assessment was created externally */\n isExternallyCreated: boolean;\n /** The due date of the assessment */\n dueDate: string;\n /** The date when the assessment was created */\n createdAt: string;\n /** The date when the assessment was last updated */\n updatedAt: string;\n /** The date when the assessment was assigned */\n assignedAt: string;\n /** The date when the assessment was submitted */\n submittedAt: string;\n /** The date when the assessment was approved */\n approvedAt: string;\n /** The date when the assessment was rejected */\n rejectedAt: string;\n /** Indicates if the title of the assessment is internal */\n titleIsInternal: boolean;\n /** The retention schedule of the assessment */\n retentionSchedule?: RetentionSchedule;\n /** The attribute values associated with the assessment */\n attributeValues: AttributeValue[];\n /** The sections of the assessment */\n sections: AssessmentSection[];\n /** The group to which the assessment belongs */\n assessmentGroup: AssessmentGroup;\n /** The resources associated with the assessment */\n resources: AssessmentResource[];\n /** The rows that are synced with the assessment */\n syncedRows: AssessmentResource[];\n}\n\nexport interface UserPreview {\n /** ID of user */\n id: string;\n /** Email of user */\n email: string;\n /** Name of user */\n name: string;\n}\n\nexport interface ExternalUser {\n /** ID of external user */\n id: string;\n /** Email of external user */\n email: string;\n}\n\nexport interface RetentionSchedule {\n /** ID of retention schedule */\n id: string;\n /** Type */\n type: RetentionScheduleType;\n /** Duration of retention schedule */\n durationDays: number;\n /** The operation to perform on the retention schedule */\n operation: RetentionScheduleOperation;\n}\n\ninterface AttributeValue {\n /** Name of attribute value */\n name: string;\n /** Key */\n attributeKey: {\n /** Name of key */\n name: string;\n };\n}\n\nexport interface AssessmentSection {\n /** ID of section */\n id: string;\n /** Title of section */\n title: string;\n /** Status of section */\n status: string;\n /** Index of section */\n index: number;\n /** Questions */\n questions: AssessmentQuestion[];\n /** Assignees */\n assignees: UserPreview[];\n /** External assignees */\n externalAssignees: ExternalUser[];\n /** Whether is reviewed */\n isReviewed: boolean;\n}\n\n/**\n * Represents a question in the assessment.\n */\nexport interface AssessmentQuestion {\n /**\n * Unique identifier for the question.\n */\n id: string;\n /** Title of the question */\n title: string;\n /** Index of the question in the assessment */\n index: number;\n /** Type of the question */\n type: AssessmentQuestionType;\n /** Subtype of the question */\n subType: AssessmentQuestionSubType;\n /** Placeholder text for the question */\n placeholder: string;\n /** Description of the question */\n description: string;\n /** Indicates if the question is required */\n isRequired: boolean;\n /** Logic for displaying the question */\n displayLogic: string;\n /** Logic for assessing risk related to the question */\n riskLogic: string[];\n /** Indicates if risk evaluation is required for the question */\n requireRiskEvaluation: boolean;\n /** Indicates if risk matrix evaluation is required for the question */\n requireRiskMatrixEvaluation: boolean;\n /** Categories of risk associated with the question */\n riskCategories: RiskCategory[];\n /** Framework used for risk assessment */\n riskFramework?: RiskFramework;\n /** Level of risk associated with the question */\n riskLevel?: RiskLevel;\n /** Risk level assigned by the reviewer */\n reviewerRiskLevel?: RiskLevel;\n /** Risk level derived from the risk matrix */\n riskLevelFromRiskMatrix?: RiskLevel;\n /** Options available for answering the question */\n answerOptions: AssessmentAnswerOption[];\n /** Answers selected for the question */\n selectedAnswers: AssessmentAnswer[];\n /** User who responded to the question */\n respondent: UserPreview;\n /** Key attribute associated with the question */\n attributeKey?: {\n /** Name of key */\n name: string;\n };\n /** Email of the external respondent */\n externalRespondentEmail?: string;\n /** Comments related to the question */\n comments: unknown[];\n /** Allowed MIME types for file uploads in the question */\n allowedMimeTypes: string[];\n /** Timestamp of the last update to the question */\n updatedAt: string;\n /** Reference identifier for the question */\n referenceId: string;\n /** Previous submissions related to the question */\n previousSubmissions: AssessmentPreviousSubmission[];\n /** Indicates if selecting \"Other\" is allowed for the question */\n allowSelectOther: boolean;\n /** Model used for synchronization */\n syncModel: AssessmentSyncModel;\n /** Column used for synchronization */\n syncColumn: AssessmentSyncColumn;\n /** Row IDs used for synchronization */\n syncRowIds: string[];\n /** Indicates if synchronization override is allowed */\n syncOverride: boolean;\n}\n\nexport interface RiskCategory {\n /** ID of category */\n id: string;\n /** Title of category */\n title: string;\n}\n\nexport interface RiskFramework {\n /** ID of framework */\n id: string;\n /** Title of framework */\n title: string;\n /** Description of framework */\n description: string;\n /** Risk levels */\n riskLevels: RiskLevel[];\n /** Risk categories */\n riskCategories: RiskCategory[];\n /** Risk matrix columns */\n riskMatrixColumns: RiskMatrixColumn[];\n /** Risk matrix rows */\n riskMatrixRows: RiskMatrixRow[];\n /** Risk matrix settings */\n riskMatrix: RiskMatrix[][];\n /** Creator of risk framework */\n creator?: UserPreview;\n /** Risk matrix row title */\n riskMatrixRowTitle: string;\n /** Risk matrix column title */\n riskMatrixColumnTitle: string;\n}\n\nexport interface RiskLevel {\n /** ID of risk level */\n id: string;\n /** Title of risk level */\n title: string;\n}\n\nexport interface RiskMatrix {\n /** ID of risk matrix */\n id: string;\n /** Title of risk matrix */\n title: string;\n}\n\nexport interface RiskMatrixColumn {\n /** ID of column */\n id: string;\n /** Title of column */\n title: string;\n}\n\nexport interface RiskMatrixRow {\n /** ID of row */\n id: string;\n /** Title of row */\n title: string;\n}\n\nexport interface AssessmentAnswerOption {\n /** ID of answer option */\n id: string;\n /** Index of answer option */\n index: number;\n /** Value of answer */\n value: string;\n}\n\nexport interface AssessmentAnswer {\n /** ID of answer */\n id: string;\n /** Index of answer */\n index: number;\n /** Value of answer */\n value: string;\n}\n\nexport interface AssessmentComment {\n /** ID of comment */\n id: string;\n /** Content of comment */\n content: string;\n /** Date comment made */\n createdAt: string;\n /** Date comment updated */\n updatedAt: string;\n /** Author of comment */\n author?: UserPreview;\n}\n\nexport interface AssessmentPreviousSubmission {\n /** Id of submission */\n id: string;\n /** Date updated */\n updatedAt: string;\n /** ID of question */\n assessmentQuestionId: string;\n /** Answers */\n answers: AssessmentAnswer[];\n}\n\nexport interface AssessmentGroup {\n /** ID of group */\n id: string;\n /** Title of group */\n title: string;\n /** Description of group */\n description: string;\n}\n\nexport interface AssessmentResource {\n /** Type of resource */\n resourceType: AttributeSupportedResourceType;\n /** ID of resource */\n id: string;\n /** Title of resource */\n title?: string;\n /** Name of resource */\n name?: string;\n /** Category of resource */\n category?: DataCategoryType;\n /** Purpose of resource */\n purpose?: ProcessingPurpose;\n /** Type of integration */\n type?: string;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all assessments in the organization\n *\n * @param client - GraphQL client\n * @returns All assessments in the organization\n */\nexport async function fetchAllAssessments(\n client: GraphQLClient,\n): Promise<Assessment[]> {\n const assessments: Assessment[] = [];\n let offset = 0;\n\n let shouldContinue = false;\n do {\n const {\n assessmentForms: { nodes },\n } = await makeGraphQLRequest<{\n /** Forms */\n assessmentForms: {\n /** Nodes */\n nodes: Assessment[];\n };\n }>(client, ASSESSMENTS, {\n first: PAGE_SIZE,\n offset,\n });\n assessments.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return assessments.sort((a, b) => a.title.localeCompare(b.title));\n}\n/* eslint-enable max-lines */\n","import { GraphQLClient } from 'graphql-request';\nimport { ASSESSMENT_TEMPLATES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport type {\n AssessmentSection,\n RetentionSchedule,\n UserPreview,\n} from './fetchAllAssessments';\nimport {\n AssessmentFormTemplateSource,\n AssessmentFormTemplateStatus,\n} from '@transcend-io/privacy-types';\n\n/**\n * Represents an assessment template with various properties and metadata.\n */\nexport interface AssessmentTemplate {\n /** The ID of the assessment template */\n id: string;\n /** The user who created the assessment template */\n creator: UserPreview;\n /** The user who last edited the assessment template */\n lastEditor: UserPreview;\n /** The title of the assessment template */\n title: string;\n /** The description of the assessment template */\n description: string;\n /** The current status of the assessment template */\n status: AssessmentFormTemplateStatus;\n /** The source fo the form template */\n source: AssessmentFormTemplateSource;\n /** ID of parent template */\n parentId: string;\n /** Indicates if the assessment template is locked */\n isLocked: boolean;\n /** Indicates if the assessment template is archived */\n isArchived: boolean;\n /** The date when the assessment template was created */\n createdAt: string;\n /** The date when the assessment template was last updated */\n updatedAt: string;\n /** The retention schedule of the assessment template */\n retentionSchedule?: RetentionSchedule;\n /** The sections of the assessment template */\n sections: AssessmentSection[];\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all assessment templates in the organization\n *\n * @param client - GraphQL client\n * @returns All assessment templates in the organization\n */\nexport async function fetchAllAssessmentTemplates(\n client: GraphQLClient,\n): Promise<AssessmentTemplate[]> {\n const assessmentTemplates: AssessmentTemplate[] = [];\n let offset = 0;\n\n let shouldContinue = false;\n do {\n const {\n assessmentFormTemplates: { nodes },\n } = await makeGraphQLRequest<{\n /** Templates */\n assessmentFormTemplates: {\n /** Nodes */\n nodes: AssessmentTemplate[];\n };\n }>(client, ASSESSMENT_TEMPLATES, {\n first: PAGE_SIZE,\n offset,\n });\n assessmentTemplates.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return assessmentTemplates.sort((a, b) => a.title.localeCompare(b.title));\n}\n","import {\n AssessmentsDisplayLogicAction,\n ComparisonOperator,\n LogicOperator,\n} from '@transcend-io/privacy-types';\nimport { decodeCodec, valuesOf } from '@transcend-io/type-utils';\nimport * as t from 'io-ts';\n\nexport const AssessmentRule = t.type({\n dependsOnQuestionReferenceId: t.string,\n comparisonOperator: valuesOf(ComparisonOperator),\n comparisonOperands: t.array(t.string),\n});\n\n/** Type override */\nexport type AssessmentRule = t.TypeOf<typeof AssessmentRule>;\n\nexport interface AssessmentNestedRule {\n /** The operator to use when comparing the nested rules */\n logicOperator: LogicOperator;\n /** The rules to evaluate and be compared with to other using the LogicOperator */\n rules?: AssessmentRule[];\n /** The nested rules to add one more level of nesting to the rules. They are also compared to each other. */\n nestedRules?: AssessmentNestedRule[];\n}\n\nexport const AssessmentNestedRule: t.RecursiveType<\n t.Type<AssessmentNestedRule>\n> = t.recursion('AssessmentNestedRule', (self) =>\n t.intersection([\n t.type({\n /** The operator to use when comparing the nested rules */\n logicOperator: valuesOf(LogicOperator),\n }),\n t.partial({\n /** The rules to evaluate and be compared with to other using the LogicOperator */\n rules: t.array(AssessmentRule),\n /** The nested rules to add one more level of nesting to the rules. They are also compared to each other. */\n nestedRules: t.array(self),\n }),\n ]),\n);\n\nexport const AssessmentAction = t.partial({\n action: valuesOf(AssessmentsDisplayLogicAction),\n rule: AssessmentRule,\n nestedRule: AssessmentNestedRule,\n});\n\n/** Type override */\nexport type AssessmentAction = t.TypeOf<typeof AssessmentAction>;\n\n/**\n * Parse the assessment display logic\n *\n * @param displayLogic - Stringified rule\n * @returns The parsed assessment display logic\n */\nexport function parseAssessmentDisplayLogic(\n displayLogic: string,\n): AssessmentAction {\n return decodeCodec(AssessmentAction, displayLogic);\n}\n","import { ComparisonOperator } from '@transcend-io/privacy-types';\nimport { decodeCodec, valuesOf } from '@transcend-io/type-utils';\nimport * as t from 'io-ts';\n\nexport const AssessmentRiskLogic = t.intersection([\n t.partial({\n riskAssignment: t.partial({\n riskLevelId: t.string,\n riskMatrixRowId: t.string,\n riskMatrixColumnId: t.string,\n }),\n }),\n t.type({\n comparisonOperands: t.array(t.string),\n comparisonOperator: valuesOf(ComparisonOperator),\n }),\n]);\n\n/** Type override */\nexport type AssessmentRiskLogic = t.TypeOf<typeof AssessmentRiskLogic>;\n\n/**\n * Parse the assessment risk logic\n *\n * @param riskLogic - Stringified rule\n * @returns The parsed assessment risk logic\n */\nexport function parseAssessmentRiskLogic(\n riskLogic: string,\n): AssessmentRiskLogic {\n return decodeCodec(AssessmentRiskLogic, riskLogic);\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { PREFERENCE_TOPICS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { PreferenceTopicType } from '@transcend-io/privacy-types';\n\nexport interface PreferenceTopic {\n /** ID of preference topic */\n id: string;\n /** Slug of preference topic */\n slug: string;\n /** Title of topic */\n title: {\n /** ID */\n id: string;\n /** Default message */\n defaultMessage: string;\n };\n /** Whether to show in privacy center */\n showInPrivacyCenter: boolean;\n /** Description to display in privacy center */\n displayDescription: {\n /** ID */\n id: string;\n /** Default message */\n defaultMessage: string;\n };\n /** Type of preference topic */\n type: PreferenceTopicType;\n /** Default configuration */\n defaultConfiguration: string;\n /** Option values */\n preferenceOptionValues: {\n /** Slug of value */\n slug: string;\n /** Title of value */\n title: {\n /** ID */\n id: string;\n /** Default message */\n defaultMessage: string;\n };\n }[];\n /** Related purpose */\n purpose: {\n /** Slug */\n trackingType: string;\n };\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all preference topics in the organization\n *\n * @param client - GraphQL client\n * @returns All preference topics in the organization\n */\nexport async function fetchAllPreferenceTopics(\n client: GraphQLClient,\n): Promise<PreferenceTopic[]> {\n const preferenceTopics: PreferenceTopic[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n preferenceTopics: { nodes },\n } = await makeGraphQLRequest<{\n /** Preference topics */\n preferenceTopics: {\n /** List */\n nodes: PreferenceTopic[];\n };\n }>(client, PREFERENCE_TOPICS, {\n first: PAGE_SIZE,\n offset,\n });\n preferenceTopics.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return preferenceTopics.sort((a, b) =>\n `${a.slug}:${a.purpose.trackingType}`.localeCompare(\n `${b.slug}:${b.purpose.trackingType}`,\n ),\n );\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { Purpose, fetchAllPurposes } from './fetchAllPurposes';\nimport {\n PreferenceTopic,\n fetchAllPreferenceTopics,\n} from './fetchAllPreferenceTopics';\n\nexport interface PurposeWithPreferences extends Purpose {\n /** Topics */\n topics: PreferenceTopic[];\n}\n\n/**\n * Fetch all purposes and preferences for a request]\n *\n * @param client - GraphQL client\n * @returns List of request enrichers\n */\nexport async function fetchAllPurposesAndPreferences(\n client: GraphQLClient,\n): Promise<PurposeWithPreferences[]> {\n const [purposes, topics] = await Promise.all([\n fetchAllPurposes(client),\n fetchAllPreferenceTopics(client),\n ]);\n\n return purposes.map((purpose) => {\n const purposeTopics = topics.filter(\n (topic) => topic.purpose.trackingType === purpose.trackingType,\n );\n return {\n ...purpose,\n topics: purposeTopics,\n };\n });\n}\n","/* eslint-disable max-lines */\nimport {\n TranscendInput,\n ApiKeyInput,\n DataSiloInput,\n AttributeInput,\n ActionInput,\n IdentifierInput,\n BusinessEntityInput,\n EnricherInput,\n PromptGroupInput,\n DataFlowInput,\n PromptPartialInput,\n DataSubjectInput,\n CookieInput,\n PromptInput,\n DatapointInput,\n FieldInput,\n ProcessingPurposeInput,\n DataCategoryInput,\n VendorInput,\n AgentFileInput,\n AgentFunctionInput,\n AgentInput,\n PolicyInput,\n IntlMessageInput,\n ActionItemInput,\n TeamInput,\n ActionItemCollectionInput,\n AssessmentInput,\n AssessmentTemplateInput,\n AssessmentSectionInput,\n AssessmentSectionQuestionInput,\n RiskLogicInput,\n ConsentPurpose,\n} from '../../codecs';\nimport {\n RequestAction,\n ConsentTrackerStatus,\n ActionItemCode,\n} from '@transcend-io/privacy-types';\nimport { GraphQLClient } from 'graphql-request';\nimport { flatten, keyBy, mapValues } from 'lodash-es';\nimport { fetchEnrichedDataSilos } from './syncDataSilos';\nimport {\n convertToDataSubjectAllowlist,\n fetchAllDataSubjects,\n} from './fetchDataSubjects';\nimport { fetchApiKeys } from './fetchApiKeys';\nimport {\n fetchConsentManager,\n fetchConsentManagerExperiences,\n fetchConsentManagerTheme,\n} from './fetchConsentManagerId';\nimport { fetchAllEnrichers } from './syncEnrichers';\nimport { fetchAllDataFlows } from './fetchAllDataFlows';\nimport { fetchAllBusinessEntities } from './fetchAllBusinessEntities';\nimport { fetchAllActions } from './fetchAllActions';\nimport { fetchAllAgents } from './fetchAllAgents';\nimport { fetchAllAgentFunctions } from './fetchAllAgentFunctions';\nimport { fetchAllAgentFiles } from './fetchAllAgentFiles';\nimport { fetchAllVendors } from './fetchAllVendors';\nimport { fetchAllDataCategories } from './fetchAllDataCategories';\nimport { fetchAllProcessingPurposes } from './fetchAllProcessingPurposes';\nimport { fetchAllIdentifiers } from './fetchIdentifiers';\nimport { fetchAllPrompts } from './fetchPrompts';\nimport { fetchAllPromptPartials } from './fetchPromptPartials';\nimport { fetchAllPolicies } from './fetchAllPolicies';\nimport { fetchAllPrivacyCenters } from './fetchAllPrivacyCenters';\nimport { fetchAllMessages } from './fetchAllMessages';\nimport { fetchAllPromptGroups } from './fetchPromptGroups';\nimport { fetchAllCookies } from './fetchAllCookies';\nimport { fetchAllTemplates } from './syncTemplates';\nimport { fetchAllAttributes } from './fetchAllAttributes';\nimport { formatAttributeValues } from './formatAttributeValues';\nimport { logger } from '../../logger';\nimport colors from 'colors';\nimport { TranscendPullResource } from '../../enums';\nimport { fetchAllActionItems } from './fetchAllActionItems';\nimport { fetchAllTeams } from './fetchAllTeams';\nimport { fetchAllActionItemCollections } from './fetchAllActionItemCollections';\nimport { LanguageKey } from '@transcend-io/internationalization';\nimport { fetchPartitions } from './syncPartitions';\nimport { fetchAllAssessments } from './fetchAllAssessments';\nimport { fetchAllAssessmentTemplates } from './fetchAllAssessmentTemplates';\nimport {\n AssessmentNestedRule,\n parseAssessmentDisplayLogic,\n} from './parseAssessmentDisplayLogic';\nimport { parseAssessmentRiskLogic } from './parseAssessmentRiskLogic';\nimport { fetchAllPurposesAndPreferences } from './fetchAllPurposesAndPreferences';\n\nexport const DEFAULT_TRANSCEND_PULL_RESOURCES = [\n TranscendPullResource.DataSilos,\n TranscendPullResource.Enrichers,\n TranscendPullResource.Templates,\n TranscendPullResource.ApiKeys,\n];\n\nexport interface TranscendPullConfigurationInput {\n /** Page size */\n pageSize: number;\n /** Enable debug logs */\n debug: boolean;\n /** The data silo IDs to sync. If empty list, pull all. */\n dataSiloIds: string[];\n /** Resources to pull in */\n resources?: TranscendPullResource[];\n /** The data silo types to sync.If empty list, pull all. */\n integrationNames: string[];\n /** The tracker statuses to pull */\n trackerStatuses?: ConsentTrackerStatus[];\n /** Skip fetching of datapoints */\n skipDatapoints?: boolean;\n /** Skip fetching of subdatapoints */\n skipSubDatapoints?: boolean;\n /** When true, metadata around guessed data categories should be included */\n includeGuessedCategories?: boolean;\n}\n\n/**\n * Pull a yaml configuration from Transcend\n *\n * @param client - GraphQL client\n * @param dataSiloIds - The data silos to sync. If empty list, pull all.\n * @returns The configuration\n */\nexport async function pullTranscendConfiguration(\n client: GraphQLClient,\n {\n dataSiloIds,\n integrationNames,\n debug,\n resources = DEFAULT_TRANSCEND_PULL_RESOURCES,\n pageSize,\n skipDatapoints,\n includeGuessedCategories,\n skipSubDatapoints,\n trackerStatuses = Object.values(ConsentTrackerStatus),\n }: TranscendPullConfigurationInput,\n): Promise<TranscendInput> {\n if (dataSiloIds.length > 0 && integrationNames.length > 0) {\n throw new Error(\n 'Only 1 of integrationNames OR dataSiloIds can be provided',\n );\n }\n\n logger.info(colors.magenta(`Fetching data with page size ${pageSize}...`));\n\n // Fetch all data, but only conditional fetch data that is requested\n const [\n dataSubjects,\n apiKeyTitleMap,\n dataSilos,\n enrichers,\n dataFlows,\n cookies,\n attributes,\n templates,\n identifiers,\n actions,\n businessEntities,\n consentManager,\n consentManagerExperiences,\n prompts,\n promptPartials,\n promptGroups,\n agents,\n agentFunctions,\n agentFiles,\n vendors,\n dataCategories,\n processingPurposes,\n actionItems,\n actionItemCollections,\n teams,\n policies,\n privacyCenters,\n messages,\n partitions,\n assessments,\n assessmentTemplates,\n purposes,\n ] = await Promise.all([\n // Grab all data subjects in the organization\n resources.includes(TranscendPullResource.DataSilos) ||\n resources.includes(TranscendPullResource.DataSubjects)\n ? fetchAllDataSubjects(client)\n : [],\n // Grab API keys\n resources.includes(TranscendPullResource.ApiKeys)\n ? fetchApiKeys({}, client, true)\n : [],\n // Fetch the data silos\n resources.includes(TranscendPullResource.DataSilos)\n ? fetchEnrichedDataSilos(client, {\n ids: dataSiloIds,\n integrationNames,\n pageSize,\n debug,\n includeGuessedCategories,\n skipDatapoints,\n skipSubDatapoints,\n })\n : [],\n // Fetch enrichers\n resources.includes(TranscendPullResource.Enrichers)\n ? fetchAllEnrichers(client)\n : [],\n // Fetch data flows\n resources.includes(TranscendPullResource.DataFlows)\n ? [\n ...(trackerStatuses.includes(ConsentTrackerStatus.Live)\n ? await fetchAllDataFlows(client, ConsentTrackerStatus.Live)\n : []),\n ...(trackerStatuses.includes(ConsentTrackerStatus.NeedsReview)\n ? await fetchAllDataFlows(client, ConsentTrackerStatus.NeedsReview)\n : []),\n ]\n : [],\n // Fetch data flows\n resources.includes(TranscendPullResource.Cookies)\n ? [\n ...(trackerStatuses.includes(ConsentTrackerStatus.Live)\n ? await fetchAllCookies(client, ConsentTrackerStatus.Live)\n : []),\n ...(trackerStatuses.includes(ConsentTrackerStatus.NeedsReview)\n ? await fetchAllCookies(client, ConsentTrackerStatus.NeedsReview)\n : []),\n ]\n : [],\n // Fetch attributes\n resources.includes(TranscendPullResource.Attributes)\n ? fetchAllAttributes(client)\n : [],\n // Fetch email templates\n resources.includes(TranscendPullResource.Templates)\n ? fetchAllTemplates(client)\n : [],\n // Fetch identifiers\n resources.includes(TranscendPullResource.Identifiers)\n ? fetchAllIdentifiers(client)\n : [],\n // Fetch actions\n resources.includes(TranscendPullResource.Actions)\n ? fetchAllActions(client)\n : [],\n // Fetch business entities\n resources.includes(TranscendPullResource.BusinessEntities)\n ? fetchAllBusinessEntities(client)\n : [],\n // Fetch consent manager\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentManager(client)\n : undefined,\n // Fetch consent manager experiences\n resources.includes(TranscendPullResource.ConsentManager)\n ? fetchConsentManagerExperiences(client)\n : [],\n // Fetch prompts\n resources.includes(TranscendPullResource.Prompts)\n ? fetchAllPrompts(client)\n : [],\n // Fetch promptPartials\n resources.includes(TranscendPullResource.PromptPartials)\n ? fetchAllPromptPartials(client)\n : [],\n // Fetch promptGroups\n resources.includes(TranscendPullResource.PromptGroups)\n ? fetchAllPromptGroups(client)\n : [],\n // Fetch agents\n resources.includes(TranscendPullResource.Agents)\n ? fetchAllAgents(client)\n : [],\n // Fetch agentFunctions\n resources.includes(TranscendPullResource.AgentFunctions)\n ? fetchAllAgentFunctions(client)\n : [],\n // Fetch agentFiles\n resources.includes(TranscendPullResource.AgentFiles)\n ? fetchAllAgentFiles(client)\n : [],\n // Fetch vendors\n resources.includes(TranscendPullResource.Vendors)\n ? fetchAllVendors(client)\n : [],\n // Fetch dataCategories\n resources.includes(TranscendPullResource.DataCategories)\n ? fetchAllDataCategories(client)\n : [],\n // Fetch dataCategories\n resources.includes(TranscendPullResource.ProcessingPurposes)\n ? fetchAllProcessingPurposes(client)\n : [],\n // Fetch actionItems\n resources.includes(TranscendPullResource.ActionItems)\n ? fetchAllActionItems(client, { type: [ActionItemCode.Onboarding] })\n : [],\n // Fetch actionItemCollections\n resources.includes(TranscendPullResource.ActionItemCollections)\n ? fetchAllActionItemCollections(client)\n : [],\n // Fetch teams\n resources.includes(TranscendPullResource.Teams)\n ? fetchAllTeams(client)\n : [],\n // Fetch policies\n resources.includes(TranscendPullResource.Policies)\n ? fetchAllPolicies(client)\n : [],\n // Fetch privacy centers\n resources.includes(TranscendPullResource.PrivacyCenters)\n ? fetchAllPrivacyCenters(client)\n : [],\n // Fetch messages\n resources.includes(TranscendPullResource.Messages)\n ? fetchAllMessages(client)\n : [],\n // Fetch partitions\n resources.includes(TranscendPullResource.Partitions)\n ? fetchPartitions(client)\n : [],\n // Fetch assessments\n resources.includes(TranscendPullResource.Assessments)\n ? fetchAllAssessments(client)\n : [],\n // Fetch assessmentTemplates\n resources.includes(TranscendPullResource.AssessmentTemplates)\n ? fetchAllAssessmentTemplates(client)\n : [],\n // Fetch purpose and preferences\n resources.includes(TranscendPullResource.Purposes)\n ? fetchAllPurposesAndPreferences(client)\n : [],\n ]);\n\n const consentManagerTheme =\n resources.includes(TranscendPullResource.ConsentManager) && consentManager\n ? await fetchConsentManagerTheme(client, consentManager.id)\n : undefined;\n\n const result: TranscendInput = {};\n\n // Save API keys\n const apiKeyTitles = flatten(\n dataSilos.map(([{ apiKeys }]) => apiKeys.map(({ title }) => title)),\n );\n const relevantApiKeys = Object.values(apiKeyTitleMap).filter(({ title }) =>\n resources.includes(TranscendPullResource.ApiKeys)\n ? true\n : apiKeyTitles.includes(title),\n );\n if (\n relevantApiKeys.length > 0 &&\n resources.includes(TranscendPullResource.ApiKeys)\n ) {\n result['api-keys'] = relevantApiKeys.map(\n ({ title }): ApiKeyInput => ({\n title,\n }),\n );\n }\n\n // Save Partitions\n if (\n partitions.length > 0 &&\n resources.includes(TranscendPullResource.Partitions)\n ) {\n result.partitions = partitions.map(({ name, partition }) => ({\n name,\n partition,\n }));\n }\n\n // Save Consent Manager\n if (\n consentManager &&\n resources.includes(TranscendPullResource.ConsentManager)\n ) {\n result['consent-manager'] = {\n bundleUrls: {\n TEST: consentManager.testBundleURL,\n PRODUCTION: consentManager.bundleURL,\n },\n domains: consentManager.configuration.domains || undefined,\n partition: consentManager.configuration.partition || undefined,\n consentPrecedence:\n consentManager.configuration.consentPrecedence || undefined,\n unknownRequestPolicy:\n consentManager.configuration.unknownRequestPolicy || undefined,\n unknownCookiePolicy:\n consentManager.configuration.unknownCookiePolicy || undefined,\n syncEndpoint: consentManager.configuration.syncEndpoint || undefined,\n telemetryPartitioning:\n consentManager.configuration.telemetryPartitioning || undefined,\n signedIabAgreement:\n consentManager.configuration.signedIabAgreement || undefined,\n uspapi: consentManager.configuration.uspapi || undefined,\n // TODO: https://transcend.height.app/T-23919 - reconsider simpler yml shape\n syncGroups: consentManager.configuration.syncGroups || undefined,\n theme: !consentManagerTheme\n ? undefined\n : {\n primaryColor: consentManagerTheme.primaryColor || undefined,\n fontColor: consentManagerTheme.fontColor || undefined,\n privacyPolicy: consentManagerTheme.privacyPolicy || undefined,\n prompt: consentManagerTheme.prompt,\n },\n experiences: consentManagerExperiences.map((experience) => ({\n name: experience.name,\n displayName: experience.displayName || undefined,\n regions: experience.regions.map((region) => ({\n countrySubDivision: region.countrySubDivision || undefined,\n country: region.country || undefined,\n })),\n onConsentExpiry: experience.onConsentExpiry,\n consentExpiry: experience.consentExpiry,\n operator: experience.operator,\n displayPriority: experience.displayPriority,\n viewState: experience.viewState,\n purposes: experience.purposes.map((purpose) => ({\n trackingType: purpose.trackingType,\n })),\n optedOutPurposes: experience.optedOutPurposes.map((purpose) => ({\n trackingType: purpose.trackingType,\n })),\n browserLanguages: experience.browserLanguages,\n browserTimeZones: experience.browserTimeZones,\n })),\n };\n }\n\n // Save assessments\n if (\n assessments.length > 0 &&\n resources.includes(TranscendPullResource.Assessments)\n ) {\n result.assessments = assessments.map(\n ({\n title,\n assessmentGroup,\n sections,\n creator,\n description,\n status,\n assignees,\n externalAssignees,\n reviewers,\n isLocked,\n isArchived,\n isExternallyCreated,\n dueDate,\n createdAt,\n assignedAt,\n submittedAt,\n approvedAt,\n rejectedAt,\n titleIsInternal,\n retentionSchedule,\n attributeValues,\n resources,\n syncedRows,\n }): AssessmentInput => ({\n title,\n group: assessmentGroup.title,\n sections: sections.map(\n ({\n title,\n status,\n questions,\n assignees,\n isReviewed,\n externalAssignees,\n }): AssessmentSectionInput => ({\n title,\n status,\n questions: questions.map(\n ({\n title,\n type,\n subType,\n placeholder,\n description,\n isRequired,\n referenceId,\n displayLogic,\n riskLogic,\n riskCategories,\n riskFramework,\n answerOptions,\n selectedAnswers,\n allowedMimeTypes,\n allowSelectOther,\n syncModel,\n syncColumn,\n attributeKey,\n requireRiskEvaluation,\n requireRiskMatrixEvaluation,\n }): AssessmentSectionQuestionInput => {\n const displayLogicParsed = displayLogic\n ? parseAssessmentDisplayLogic(displayLogic)\n : undefined;\n return {\n title,\n type,\n 'sub-type': subType,\n placeholder,\n description,\n 'is-required': isRequired,\n 'reference-id': referenceId,\n 'display-logic':\n displayLogicParsed &&\n Object.keys(displayLogicParsed).length > 0\n ? {\n action: displayLogicParsed.action!,\n rule: displayLogicParsed.rule\n ? {\n 'depends-on-question-reference-id':\n displayLogicParsed.rule\n .dependsOnQuestionReferenceId,\n 'comparison-operator':\n displayLogicParsed.rule.comparisonOperator,\n 'comparison-operands':\n displayLogicParsed.rule.comparisonOperands,\n }\n : undefined,\n 'nested-rule': displayLogicParsed.nestedRule\n ? {\n 'logic-operator':\n displayLogicParsed.nestedRule.logicOperator,\n rules:\n /* eslint-disable @typescript-eslint/no-explicit-any */\n (\n (\n (displayLogicParsed as any)\n .nestedRule as AssessmentNestedRule\n ).rules || []\n ).map((rule) => ({\n 'depends-on-question-reference-id':\n rule.dependsOnQuestionReferenceId,\n 'comparison-operator':\n rule.comparisonOperator,\n 'comparison-operands':\n rule.comparisonOperands,\n })),\n /* eslint-enable @typescript-eslint/no-explicit-any */\n }\n : undefined,\n }\n : undefined,\n 'risk-logic': riskLogic.map((logic): RiskLogicInput => {\n const parsed = parseAssessmentRiskLogic(logic);\n return {\n 'risk-level': parsed.riskAssignment?.riskLevelId,\n 'comparison-operands': parsed.comparisonOperands,\n 'comparison-operator': parsed.comparisonOperator,\n };\n }),\n 'risk-categories': riskCategories.map(({ title }) => title),\n 'risk-framework': riskFramework?.title,\n 'answer-options': answerOptions.map(({ value }) => ({\n value,\n })),\n 'selected-answers': selectedAnswers.map(({ value }) => value),\n 'allowed-mime-types': allowedMimeTypes,\n 'allow-select-other': allowSelectOther,\n 'sync-model': syncModel || undefined,\n 'sync-column': syncColumn || undefined,\n 'attribute-key': attributeKey?.name,\n 'require-risk-evaluation': requireRiskEvaluation,\n 'require-risk-matrix-evaluation': requireRiskMatrixEvaluation,\n };\n },\n ),\n assignees: assignees.map(({ email }) => email),\n 'external-assignees': externalAssignees.map(({ email }) => email),\n 'is-reviewed': isReviewed,\n }),\n ),\n creator: creator?.email,\n description,\n status,\n assignees: assignees.map(({ email }) => email),\n 'external-assignees': externalAssignees.map(({ email }) => email),\n reviewers: reviewers.map(({ email }) => email),\n locked: isLocked,\n archived: isArchived,\n external: isExternallyCreated,\n 'title-is-internal': titleIsInternal,\n 'due-date': dueDate || undefined,\n 'created-at': createdAt || undefined,\n 'assigned-at': assignedAt || undefined,\n 'submitted-at': submittedAt || undefined,\n 'approved-at': approvedAt || undefined,\n 'rejected-at': rejectedAt || undefined,\n 'retention-schedule': retentionSchedule\n ? {\n type: retentionSchedule.type,\n 'duration-days': retentionSchedule.durationDays,\n operand: retentionSchedule.operation,\n }\n : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n resources: resources.map(\n ({ resourceType, title, name, category, type, purpose }) => ({\n type: resourceType,\n title: category\n ? `${category} - ${name}`\n : purpose\n ? `${purpose} - ${name}`\n : title || name || type || '',\n }),\n ),\n rows: syncedRows.map(\n ({ resourceType, title, name, category, type, purpose }) => ({\n type: resourceType,\n title: category\n ? `${category} - ${name}`\n : purpose\n ? `${purpose} - ${name}`\n : title || name || type || '',\n }),\n ),\n }),\n );\n }\n\n // Save assessmentTemplates\n if (\n assessmentTemplates.length > 0 &&\n resources.includes(TranscendPullResource.AssessmentTemplates)\n ) {\n result['assessment-templates'] = assessmentTemplates.map(\n ({\n title,\n description,\n sections,\n status,\n source,\n creator,\n isLocked,\n isArchived,\n createdAt,\n retentionSchedule,\n }): AssessmentTemplateInput => ({\n title,\n description,\n sections: sections.map(\n ({ title, questions }): AssessmentSectionInput => ({\n title,\n questions: questions.map(\n ({\n title,\n type,\n subType,\n placeholder,\n description,\n isRequired,\n referenceId,\n displayLogic,\n riskLogic,\n riskCategories,\n riskFramework,\n answerOptions,\n allowedMimeTypes,\n allowSelectOther,\n syncModel,\n syncColumn,\n attributeKey,\n requireRiskEvaluation,\n requireRiskMatrixEvaluation,\n }): AssessmentSectionQuestionInput => {\n const displayLogicParsed = displayLogic\n ? parseAssessmentDisplayLogic(displayLogic)\n : undefined;\n return {\n title,\n type,\n 'sub-type': subType,\n placeholder,\n description,\n 'is-required': isRequired,\n 'reference-id': referenceId,\n 'display-logic':\n displayLogicParsed &&\n Object.keys(displayLogicParsed).length > 0\n ? {\n action: displayLogicParsed.action!,\n rule: displayLogicParsed.rule\n ? {\n 'depends-on-question-reference-id':\n displayLogicParsed.rule\n .dependsOnQuestionReferenceId,\n 'comparison-operator':\n displayLogicParsed.rule.comparisonOperator,\n 'comparison-operands':\n displayLogicParsed.rule.comparisonOperands,\n }\n : undefined,\n 'nested-rule': displayLogicParsed.nestedRule\n ? {\n 'logic-operator':\n displayLogicParsed.nestedRule.logicOperator,\n rules:\n /* eslint-disable @typescript-eslint/no-explicit-any */\n (\n (\n (displayLogicParsed as any)\n .nestedRule as AssessmentNestedRule\n ).rules || []\n ).map((rule) => ({\n 'depends-on-question-reference-id':\n rule.dependsOnQuestionReferenceId,\n 'comparison-operator':\n rule.comparisonOperator,\n 'comparison-operands':\n rule.comparisonOperands,\n })),\n /* eslint-enable @typescript-eslint/no-explicit-any */\n }\n : undefined,\n }\n : undefined,\n 'risk-logic': riskLogic.map((logic): RiskLogicInput => {\n const parsed = parseAssessmentRiskLogic(logic);\n return {\n 'risk-level': parsed.riskAssignment?.riskLevelId,\n 'risk-matrix-row': parsed.riskAssignment?.riskMatrixRowId,\n 'risk-matrix-column':\n parsed.riskAssignment?.riskMatrixColumnId,\n 'comparison-operands': parsed.comparisonOperands,\n 'comparison-operator': parsed.comparisonOperator,\n };\n }),\n 'risk-categories': riskCategories.map(({ title }) => title),\n 'risk-framework': riskFramework?.title,\n 'answer-options': answerOptions.map(({ value }) => ({\n value,\n })),\n 'allowed-mime-types': allowedMimeTypes,\n 'allow-select-other': allowSelectOther,\n 'sync-model': syncModel || undefined,\n 'sync-column': syncColumn || undefined,\n 'attribute-key': attributeKey?.name,\n 'require-risk-evaluation': requireRiskEvaluation,\n 'require-risk-matrix-evaluation': requireRiskMatrixEvaluation,\n };\n },\n ),\n }),\n ),\n status,\n source,\n creator: creator?.email,\n locked: isLocked,\n archived: isArchived,\n 'created-at': createdAt || undefined,\n 'retention-schedule': retentionSchedule\n ? {\n type: retentionSchedule.type,\n 'duration-days': retentionSchedule.durationDays,\n operand: retentionSchedule.operation,\n }\n : undefined,\n }),\n );\n }\n\n // Save prompts\n if (prompts.length > 0 && resources.includes(TranscendPullResource.Prompts)) {\n result.prompts = prompts.map(\n ({ title, content }): PromptInput => ({\n title,\n content,\n }),\n );\n }\n\n // Save promptPartials\n if (\n promptPartials.length > 0 &&\n resources.includes(TranscendPullResource.PromptPartials)\n ) {\n result['prompt-partials'] = promptPartials.map(\n ({ title, content }): PromptPartialInput => ({\n title,\n content,\n }),\n );\n }\n\n // Save promptGroups\n if (\n promptGroups.length > 0 &&\n resources.includes(TranscendPullResource.PromptGroups)\n ) {\n result['prompt-groups'] = promptGroups.map(\n ({ title, description, prompts }): PromptGroupInput => ({\n title,\n description,\n prompts: prompts.map(({ title }) => title),\n }),\n );\n }\n\n // Save teams\n if (teams.length > 0 && resources.includes(TranscendPullResource.Teams)) {\n result.teams = teams.map(\n ({\n name,\n description,\n ssoDepartment,\n ssoGroup,\n ssoTitle,\n users,\n scopes,\n }): TeamInput => ({\n name,\n description,\n 'sso-department': ssoDepartment || undefined,\n 'sso-group': ssoGroup || undefined,\n 'sso-title': ssoTitle || undefined,\n users: users.map(({ email }) => email),\n scopes: scopes.map(({ name }) => name),\n }),\n );\n }\n\n // Save Data Subjects\n if (\n dataSubjects.length > 0 &&\n resources.includes(TranscendPullResource.DataSubjects)\n ) {\n result['data-subjects'] = dataSubjects.map(\n ({\n type,\n title,\n active,\n adminDashboardDefaultSilentMode,\n actions,\n }): DataSubjectInput => ({\n type,\n title: title?.defaultMessage,\n active,\n adminDashboardDefaultSilentMode,\n actions: actions.map(({ type }) => type),\n }),\n );\n }\n\n // Save privacy policies\n if (policies.length > 0) {\n result.policies = policies.map(\n ({ title, versions, disabledLocales }): PolicyInput => ({\n title: title?.defaultMessage,\n content: versions?.[0]?.content?.defaultMessage,\n disabledLocales,\n }),\n );\n }\n\n // Save messages\n if (messages.length > 0) {\n result.messages = messages.map(\n ({\n id,\n defaultMessage,\n targetReactIntlId,\n translations,\n }): IntlMessageInput => ({\n id,\n defaultMessage,\n targetReactIntlId: targetReactIntlId || undefined,\n translations: translations.reduce(\n (acc, { locale, value }) => Object.assign(acc, { [locale]: value }),\n {} as Record<LanguageKey, string>,\n ),\n }),\n );\n }\n\n // Save privacy center\n if (privacyCenters.length > 0) {\n const privacyCenter = privacyCenters[0];\n result['privacy-center'] = {\n isDisabled: privacyCenter.isDisabled,\n showPrivacyRequestButton: privacyCenter.showPrivacyRequestButton,\n showPolicies: privacyCenter.showPolicies,\n showTrackingTechnologies: privacyCenter.showTrackingTechnologies,\n showCookies: privacyCenter.showCookies,\n showDataFlows: privacyCenter.showDataFlows,\n showConsentManager: privacyCenter.showConsentManager,\n showManageYourPrivacy: privacyCenter.showManageYourPrivacy,\n showMarketingPreferences: privacyCenter.showMarketingPreferences,\n locales: privacyCenter.locales,\n defaultLocale: privacyCenter.defaultLocale,\n preferBrowserDefaultLocale: privacyCenter.preferBrowserDefaultLocale,\n supportEmail: privacyCenter.supportEmail || undefined,\n replyToEmail: privacyCenter.replyToEmail || undefined,\n useNoReplyEmailAddress: privacyCenter.useNoReplyEmailAddress,\n useCustomEmailDomain: privacyCenter.useCustomEmailDomain,\n transformAccessReportJsonToCsv:\n privacyCenter.transformAccessReportJsonToCsv,\n theme: privacyCenter.theme,\n };\n }\n\n // Save business entities\n if (\n businessEntities.length > 0 &&\n resources.includes(TranscendPullResource.BusinessEntities)\n ) {\n result['business-entities'] = businessEntities.map(\n ({\n title,\n description,\n address,\n headquarterCountry,\n headquarterSubDivision,\n dataProtectionOfficerName,\n dataProtectionOfficerEmail,\n attributeValues,\n }): BusinessEntityInput => ({\n title,\n description: description || undefined,\n address: address || undefined,\n headquarterCountry: headquarterCountry || undefined,\n headquarterSubDivision: headquarterSubDivision || undefined,\n dataProtectionOfficerName: dataProtectionOfficerName || undefined,\n dataProtectionOfficerEmail: dataProtectionOfficerEmail || undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save Actions\n if (actions.length > 0 && resources.includes(TranscendPullResource.Actions)) {\n result.actions = actions.map(\n ({\n type,\n skipSecondaryIfNoFiles,\n skipDownloadableStep,\n requiresReview,\n regionList,\n regionDetectionMethod,\n waitingPeriod,\n }): ActionInput => ({\n type,\n ...(type === RequestAction.Erasure\n ? {\n skipSecondaryIfNoFiles,\n skipDownloadableStep,\n }\n : {}),\n requiresReview,\n waitingPeriod,\n regionDetectionMethod,\n regionList: regionList.length > 0 ? regionList : undefined,\n }),\n );\n }\n\n // Save identifiers\n if (\n identifiers.length > 0 &&\n resources.includes(TranscendPullResource.Identifiers)\n ) {\n result.identifiers = identifiers.map(\n ({\n name,\n type,\n regex,\n selectOptions,\n privacyCenterVisibility,\n isRequiredInForm,\n placeholder,\n displayTitle,\n dataSubjects,\n displayDescription,\n displayOrder,\n }): IdentifierInput => ({\n name,\n type,\n regex,\n selectOptions: selectOptions.length > 0 ? selectOptions : undefined,\n privacyCenterVisibility:\n privacyCenterVisibility.length > 0\n ? privacyCenterVisibility\n : undefined,\n isRequiredInForm,\n placeholder: placeholder || undefined,\n dataSubjects:\n dataSubjects.length > 0\n ? dataSubjects.map(({ type }) => type)\n : undefined,\n displayTitle: displayTitle?.defaultMessage,\n displayDescription: displayDescription?.defaultMessage,\n displayOrder,\n }),\n );\n }\n\n // Save agents\n if (agents.length > 0 && resources.includes(TranscendPullResource.Agents)) {\n result.agents = agents.map(\n ({\n name,\n agentId,\n description,\n instructions,\n codeInterpreterEnabled,\n retrievalEnabled,\n prompt,\n largeLanguageModel,\n teams,\n owners,\n agentFunctions,\n agentFiles,\n }): AgentInput => ({\n name,\n agentId,\n description: description || undefined,\n instructions,\n codeInterpreterEnabled,\n retrievalEnabled,\n prompt: prompt?.title,\n 'large-language-model': {\n name: largeLanguageModel.name,\n client: largeLanguageModel.client,\n },\n teams:\n teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n owners:\n owners && owners.length > 0\n ? owners.map(({ email }) => email)\n : undefined,\n 'agent-functions':\n agentFunctions && agentFunctions.length > 0\n ? agentFunctions.map(({ name }) => name)\n : undefined,\n 'agent-files':\n agentFiles && agentFiles.length > 0\n ? agentFiles.map(({ name }) => name)\n : undefined,\n }),\n );\n }\n\n // Save action items\n if (\n actionItems.length > 0 &&\n resources.includes(TranscendPullResource.ActionItems)\n ) {\n result['action-items'] = actionItems.map(\n ({\n teams,\n users,\n customerExperienceActionItemIds: [customerExperienceActionItemId],\n dueDate,\n priority,\n resolved,\n collections,\n notes,\n link,\n title,\n type,\n attributeValues,\n }): ActionItemInput => ({\n teams: teams.map(({ name }) => name),\n users: users.map(({ email }) => email),\n dueDate: dueDate || undefined,\n title,\n notes,\n customerExperienceActionItemId,\n collections: collections.map(({ title }) => title),\n link,\n priority: priority || undefined,\n resolved,\n type,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save action item collections\n if (\n actionItemCollections.length > 0 &&\n resources.includes(TranscendPullResource.ActionItemCollections)\n ) {\n result['action-item-collections'] = actionItemCollections.map(\n ({\n title,\n description,\n hidden,\n productLine,\n }): ActionItemCollectionInput => ({\n title,\n description: description || undefined,\n hidden,\n productLine,\n }),\n );\n }\n\n // Save agent functions\n if (\n agentFunctions.length > 0 &&\n resources.includes(TranscendPullResource.AgentFunctions)\n ) {\n result['agent-functions'] = agentFunctions.map(\n ({ name, description, parameters }): AgentFunctionInput => ({\n name,\n description,\n parameters: JSON.stringify(parameters),\n }),\n );\n }\n\n // Save agent files\n if (\n agentFiles.length > 0 &&\n resources.includes(TranscendPullResource.AgentFiles)\n ) {\n result['agent-files'] = agentFiles.map(\n ({ name, description, fileId, size, purpose }): AgentFileInput => ({\n name,\n description,\n fileId,\n size,\n purpose,\n }),\n );\n }\n\n // Save vendors\n if (vendors.length > 0 && resources.includes(TranscendPullResource.Vendors)) {\n result.vendors = vendors.map(\n ({\n title,\n description,\n dataProcessingAgreementLink,\n contactName,\n contactPhone,\n address,\n headquarterCountry,\n headquarterSubDivision,\n websiteUrl,\n businessEntity,\n teams,\n owners,\n attributeValues,\n }): VendorInput => ({\n title,\n description: description || undefined,\n dataProcessingAgreementLink: dataProcessingAgreementLink || undefined,\n contactName: contactName || undefined,\n contactPhone: contactPhone || undefined,\n address: address || undefined,\n headquarterCountry: headquarterCountry || undefined,\n headquarterSubDivision: headquarterSubDivision || undefined,\n websiteUrl: websiteUrl || undefined,\n businessEntity: businessEntity?.title,\n teams:\n teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n owners:\n owners && owners.length > 0\n ? owners.map(({ email }) => email)\n : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save data categories\n if (\n dataCategories.length > 0 &&\n resources.includes(TranscendPullResource.DataCategories)\n ) {\n result['data-categories'] = dataCategories.map(\n ({\n name,\n category,\n description,\n regex,\n owners,\n teams,\n attributeValues,\n }): DataCategoryInput => ({\n name,\n category,\n description: description || undefined,\n regex: regex || undefined,\n owners:\n owners && owners.length > 0\n ? owners.map(({ email }) => email)\n : undefined,\n teams:\n teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save processing purposes\n if (\n processingPurposes.length > 0 &&\n resources.includes(TranscendPullResource.ProcessingPurposes)\n ) {\n result['processing-purposes'] = processingPurposes.map(\n ({\n name,\n purpose,\n description,\n owners,\n teams,\n attributeValues,\n }): ProcessingPurposeInput => ({\n name,\n purpose,\n description: description || undefined,\n owners:\n owners && owners.length > 0\n ? owners.map(({ email }) => email)\n : undefined,\n teams:\n teams && teams.length > 0 ? teams.map(({ name }) => name) : undefined,\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save data flows\n if (\n dataFlows.length > 0 &&\n resources.includes(TranscendPullResource.DataFlows)\n ) {\n result['data-flows'] = dataFlows.map(\n ({\n value,\n type,\n description,\n trackingType,\n service,\n status,\n owners,\n teams,\n attributeValues,\n }): DataFlowInput => ({\n value,\n type,\n description: description || undefined,\n trackingPurposes: trackingType,\n status,\n service: service?.integrationName,\n owners: owners.map(({ email }) => email),\n teams: teams.map(({ name }) => name),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save cookies\n if (cookies.length > 0 && resources.includes(TranscendPullResource.Cookies)) {\n result.cookies = cookies.map(\n ({\n name,\n isRegex,\n description,\n trackingPurposes,\n service,\n status,\n owners,\n teams,\n attributeValues,\n }): CookieInput => ({\n name,\n isRegex,\n description: description || undefined,\n trackingPurposes,\n status,\n service: service?.integrationName,\n owners: owners.map(({ email }) => email),\n teams: teams.map(({ name }) => name),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n }),\n );\n }\n\n // Save attributes\n if (\n attributes.length > 0 &&\n resources.includes(TranscendPullResource.Attributes)\n ) {\n result.attributes = attributes.map(\n ({\n description,\n name,\n type,\n values,\n enabledOn = [],\n }): AttributeInput => ({\n description: description || undefined,\n resources: enabledOn,\n name,\n type,\n values: values.map(({ name, color, description }) => ({\n name,\n color: color || undefined,\n description,\n })),\n }),\n );\n }\n\n // save purposes\n if (purposes.length > 0) {\n result.purposes = purposes.map(\n ({\n name,\n description,\n trackingType,\n defaultConsent,\n configurable,\n showInConsentManager,\n isActive,\n displayOrder,\n optOutSignals,\n authLevel,\n topics,\n showInPrivacyCenter,\n title,\n }): ConsentPurpose => ({\n name,\n title,\n description: description || undefined,\n trackingType,\n 'default-consent': defaultConsent,\n configurable,\n 'show-in-consent-manager': showInConsentManager,\n 'show-in-privacy-center': showInPrivacyCenter,\n 'is-active': isActive,\n 'display-order': displayOrder,\n 'opt-out-signals': optOutSignals.length > 0 ? optOutSignals : undefined,\n 'auth-level': authLevel || undefined,\n 'preference-topics': topics.map(\n ({\n title,\n type,\n displayDescription,\n defaultConfiguration,\n showInPrivacyCenter,\n preferenceOptionValues,\n }) => ({\n title: title.defaultMessage,\n type,\n description: displayDescription.defaultMessage,\n 'default-configuration': defaultConfiguration,\n 'show-in-privacy-center': showInPrivacyCenter,\n ...(preferenceOptionValues.length > 0\n ? {\n options: preferenceOptionValues.map(({ title, slug }) => ({\n title: title.defaultMessage,\n slug,\n })),\n }\n : {}),\n }),\n ),\n }),\n );\n }\n\n // save email templates\n if (\n dataSiloIds.length === 0 &&\n templates.length > 0 &&\n resources.includes(TranscendPullResource.Templates)\n ) {\n result.templates = templates.map(({ title }) => ({ title }));\n }\n\n // Save enrichers\n if (\n enrichers.length > 0 &&\n resources.includes(TranscendPullResource.Enrichers)\n ) {\n result.enrichers = enrichers.map(\n ({\n title,\n url,\n type,\n inputIdentifier,\n identifiers,\n actions,\n testRegex,\n dataSubjects,\n expirationDuration,\n lookerQueryTitle,\n transitionRequestStatus,\n phoneNumbers,\n regionList,\n }): EnricherInput => ({\n title,\n url: url || undefined,\n type,\n 'input-identifier': inputIdentifier?.name,\n 'output-identifiers': identifiers.map(({ name }) => name),\n 'privacy-actions':\n Object.values(RequestAction).length === actions.length\n ? undefined\n : actions,\n testRegex: testRegex || undefined,\n lookerQueryTitle: lookerQueryTitle || undefined,\n expirationDuration: parseInt(expirationDuration, 10),\n transitionRequestStatus: transitionRequestStatus || undefined,\n phoneNumbers:\n phoneNumbers && phoneNumbers.length > 0 ? phoneNumbers : undefined,\n regionList:\n regionList && regionList.length > 0 ? regionList : undefined,\n 'data-subjects': dataSubjects.map(({ type }) => type),\n }),\n );\n }\n\n // Save data silos\n if (\n dataSilos.length > 0 &&\n resources.includes(TranscendPullResource.DataSilos)\n ) {\n const indexedDataSubjects = keyBy(dataSubjects, 'type');\n result['data-silos'] = dataSilos.map(\n ([\n {\n title,\n description,\n url,\n type,\n outerType,\n apiKeys,\n notifyEmailAddress,\n identifiers,\n dependentDataSilos,\n owners,\n country,\n countrySubDivision,\n teams,\n subjectBlocklist,\n isLive,\n promptAVendorEmailSendFrequency,\n promptAVendorEmailSendType,\n promptAVendorEmailIncludeIdentifiersAttachment,\n promptAVendorEmailCompletionLinkType,\n manualWorkRetryFrequency,\n catalog,\n attributeValues,\n discoveredBy,\n businessEntities,\n },\n dataPoints,\n ]): DataSiloInput => ({\n title,\n description,\n integrationName: type,\n 'outer-type': outerType || undefined,\n url: url || undefined,\n 'api-key-title': apiKeys[0]?.title,\n 'identity-keys': identifiers\n .filter(({ isConnected }) => isConnected)\n .map(({ name }) => name),\n ...(dependentDataSilos.length > 0\n ? {\n 'deletion-dependencies': dependentDataSilos.map(\n ({ title }) => title,\n ),\n }\n : {}),\n ...(owners.length > 0\n ? { owners: owners.map(({ email }) => email) }\n : {}),\n ...(teams.length > 0 ? { teams: teams.map(({ name }) => name) } : {}),\n ...(discoveredBy.length > 0\n ? { discoveredBy: discoveredBy.map(({ title }) => title) }\n : {}),\n ...(businessEntities.length > 0\n ? {\n businessEntities: businessEntities.map(({ title }) => title),\n }\n : {}),\n country: country || undefined,\n countrySubDivision: countrySubDivision || undefined,\n disabled: !isLive,\n 'data-subjects':\n subjectBlocklist.length > 0\n ? convertToDataSubjectAllowlist(\n subjectBlocklist.map(({ type }) => type),\n indexedDataSubjects,\n )\n : undefined,\n ...(catalog.hasAvcFunctionality\n ? {\n 'email-settings': {\n 'notify-email-address': notifyEmailAddress || undefined,\n 'send-frequency': promptAVendorEmailSendFrequency,\n 'send-type': promptAVendorEmailSendType,\n 'include-identifiers-attachment':\n promptAVendorEmailIncludeIdentifiersAttachment,\n 'completion-link-type': promptAVendorEmailCompletionLinkType,\n 'manual-work-retry-frequency': manualWorkRetryFrequency,\n },\n }\n : {}),\n attributes:\n attributeValues !== undefined && attributeValues.length > 0\n ? formatAttributeValues(attributeValues)\n : undefined,\n\n datapoints: dataPoints\n .map(\n (dataPoint): DatapointInput => ({\n key: dataPoint.name,\n title: dataPoint.title?.defaultMessage,\n description: dataPoint.description?.defaultMessage,\n owners: dataPoint.owners.map(({ email }) => email),\n teams: dataPoint.teams.map(({ name }) => name),\n ...(dataPoint.path.length > 0 ? { path: dataPoint.path } : {}),\n ...(dataPoint.dataCollection?.title\n ? {\n 'data-collection-tag':\n dataPoint.dataCollection.title.defaultMessage,\n }\n : {}),\n ...(dataPoint.dbIntegrationQueries.length > 0\n ? {\n 'privacy-action-queries': mapValues(\n keyBy(dataPoint.dbIntegrationQueries, 'requestType'),\n (databaseIntegrationQuery) =>\n databaseIntegrationQuery.suggestedQuery ||\n databaseIntegrationQuery.query ||\n undefined,\n ),\n }\n : {}),\n ...(dataPoint.subDataPoints.length > 0\n ? {\n fields: dataPoint.subDataPoints\n .map(\n (field): FieldInput => ({\n key: field.name,\n description: field.description,\n purposes: field.purposes,\n categories: field.categories,\n ...(includeGuessedCategories &&\n field.pendingCategoryGuesses\n ? {\n 'guessed-categories':\n field.pendingCategoryGuesses\n .filter(\n (guess) => guess.status === 'PENDING',\n )\n .map((guess) => ({\n category: {\n name: guess.category.name,\n category: guess.category.category,\n },\n status: guess.status,\n confidence: guess.confidence,\n classifierVersion:\n guess.classifierVersion || undefined,\n })),\n }\n : {}),\n 'access-request-visibility-enabled':\n field.accessRequestVisibilityEnabled,\n 'erasure-request-redaction-enabled':\n field.erasureRequestRedactionEnabled,\n attributes:\n field.attributeValues !== undefined &&\n field.attributeValues.length > 0\n ? formatAttributeValues(field.attributeValues)\n : undefined,\n }),\n )\n .sort((a, b) => a.key.localeCompare(b.key)),\n }\n : {}),\n 'privacy-actions': dataPoint.actionSettings\n .filter(({ active }) => active)\n .map(({ type }) => type),\n }),\n )\n .sort((a, b) =>\n [...(a.path ?? []), a.key]\n .join('.')\n .localeCompare([...(b.path ?? []), b.key].join('.')),\n ),\n }),\n );\n }\n return result;\n}\n/* eslint-enable max-lines */\n","import type { DataSiloAttributeValue } from './syncDataSilos';\n\nexport interface FormattedAttribute {\n /** Attribute key */\n key: string;\n /** Attribute values */\n values: string[];\n}\n\n/**\n * Format attribute value objects to key-pair values\n *\n * @param vals - Attribute values\n * @returns formatted attributes\n */\nexport function formatAttributeValues(\n vals: DataSiloAttributeValue[],\n): FormattedAttribute[] {\n const attributes: FormattedAttribute[] = [];\n\n vals.map((val) => {\n let foundKey = attributes.find((att) => att.key === val.attributeKey.name);\n\n if (foundKey === undefined) {\n foundKey = {\n key: val.attributeKey.name,\n values: [val.name],\n };\n attributes.push(foundKey);\n } else {\n foundKey.values.push(val.name);\n }\n return attributes;\n });\n\n return attributes;\n}\n","import colors from 'colors';\nimport { chunk, keyBy } from 'lodash-es';\nimport { SoftwareDevelopmentKitInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport {\n UPDATE_SOFTWARE_DEVELOPMENT_KITS,\n CREATE_SOFTWARE_DEVELOPMENT_KIT,\n} from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { mapSeries, map } from '../bluebird-replace';\nimport {\n fetchAllSoftwareDevelopmentKits,\n SoftwareDevelopmentKit,\n} from './fetchAllSoftwareDevelopmentKits';\nimport { logger } from '../../logger';\nimport { CodePackageType } from '@transcend-io/privacy-types';\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(\n colors.green(\n `Successfully created software development kit \"${input.name}\"!`,\n ),\n );\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(\n colors.green(\n `Successfully updated ${inputs.length} software development kits!`,\n ),\n );\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(\n existing,\n ({ name, codePackageType }) => JSON.stringify({ name, codePackageType }),\n );\n\n // Determine which software development kits are new vs existing\n const mapSoftwareDevelopmentKitsToExisting = softwareDevelopmentKits.map(\n (sdkInput) => [\n sdkInput,\n softwareDevelopmentKitByTitle[\n JSON.stringify({\n name: sdkInput.name,\n codePackageType: sdkInput.codePackageType,\n })\n ]?.id,\n ],\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(\n colors.red(\n `Failed to create software development kits! - ${err.message}`,\n ),\n );\n }\n\n // Update existing software development kits\n const existingSoftwareDevelopmentKits =\n 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(\n colors.red(\n `Failed to update software development kits! - ${err.message}`,\n ),\n );\n }\n\n logger.info(\n colors.green(\n `Synced \"${softwareDevelopmentKits.length}\" software development kits!`,\n ),\n );\n });\n\n // Return true upon success\n return {\n softwareDevelopmentKits: sdks,\n success: !encounteredError,\n };\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { SOFTWARE_DEVELOPMENT_KITS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { CodePackageType } from '@transcend-io/privacy-types';\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 colors from 'colors';\nimport { chunk, keyBy } from 'lodash-es';\nimport { RepositoryInput } from '../../codecs';\nimport { GraphQLClient } from 'graphql-request';\nimport { UPDATE_REPOSITORIES, CREATE_REPOSITORY } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { mapSeries, map } from '../bluebird-replace';\nimport { fetchAllRepositories, Repository } from './fetchAllRepositories';\nimport { logger } from '../../logger';\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(\n colors.green(`Successfully updated ${inputs.length} repositories!`),\n );\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(\n colors.magenta(\n `Creating \"${newRepositories.length}\" new repositories...`,\n ),\n );\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(\n colors.green(\n `Successfully synced ${newRepositories.length} repositories!`,\n ),\n );\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(\n colors.magenta(`Updating \"${existingRepositories.length}\" repositories...`),\n );\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(\n `Successfully updated \"${existingRepositories.length}\" repositories!`,\n ),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to update repositories! - ${err.message}`),\n );\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 { GraphQLClient } from 'graphql-request';\nimport { REPOSITORIES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\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(\n client: GraphQLClient,\n): 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 { chunk, uniq, keyBy, uniqBy } from 'lodash-es';\nimport colors from 'colors';\nimport { GraphQLClient } from 'graphql-request';\nimport { CodePackage, fetchAllCodePackages } from './fetchAllCodePackages';\nimport { logger } from '../../logger';\nimport { syncSoftwareDevelopmentKits } from './syncSoftwareDevelopmentKits';\nimport { map, mapSeries } from '../bluebird-replace';\nimport { CodePackageInput, RepositoryInput } from '../../codecs';\nimport { CodePackageType } from '@transcend-io/privacy-types';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { CREATE_CODE_PACKAGE, UPDATE_CODE_PACKAGES } from './gqls';\nimport { syncRepositories } from './syncRepositories';\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(\n colors.green(`Successfully created code package \"${input.name}\"!`),\n );\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(\n colors.green(`Successfully updated ${inputs.length} code packages!`),\n );\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 [\n existingCodePackages,\n { 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 }) =>\n `${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 }) =>\n `${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[\n `${codePackageInput.name}${LOOKUP_SPLIT_KEY}${codePackageInput.type}`\n ]?.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(\n colors.magenta(\n `Creating \"${newCodePackages.length}\" new code packages...`,\n ),\n );\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[\n `${name}${LOOKUP_SPLIT_KEY}${codePackage.type}`\n ];\n if (!sdk) {\n throw new Error(\n `Failed to find SDK with name: \"${name}\"`,\n );\n }\n return sdk.id;\n }),\n ),\n }\n : {}),\n });\n },\n {\n concurrency,\n },\n );\n logger.info(\n colors.green(\n `Successfully synced ${newCodePackages.length} code packages!`,\n ),\n );\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(\n colors.magenta(\n `Updating \"${existingCodePackageInputs.length}\" code packages...`,\n ),\n );\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[\n `${name}${LOOKUP_SPLIT_KEY}${input.type}`\n ];\n if (!sdk) {\n throw new Error(\n `Failed to find SDK with name: \"${name}\"`,\n );\n }\n return sdk.id;\n }),\n ),\n }\n : {}),\n id,\n }),\n ),\n );\n logger.info(\n colors.green(`Successfully updated \"${chunk.length}\" code packages!`),\n );\n } catch (err) {\n encounteredError = true;\n logger.info(\n colors.red(`Failed to update code packages! - ${err.message}`),\n );\n }\n });\n\n logger.info(colors.green(`Synced \"${codePackages.length}\" code packages!`));\n return !encounteredError;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { CODE_PACKAGES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { CodePackageType } from '@transcend-io/privacy-types';\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(\n client: GraphQLClient,\n): 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 { chunk } from 'lodash-es';\nimport { mapSeries } from '../bluebird-replace';\nimport { ADD_SILO_DISCOVERY_RESULTS } from './gqls';\nimport { GraphQLClient } from 'graphql-request';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { SiloDiscoveryRawResults } from '../code-scanning/findFilesToScan';\n\nconst CHUNK_SIZE = 1000;\n\n/**\n * Uploads silo discovery results for Transcend to classify\n *\n * @param client - GraphQL Client\n * @param pluginId - pluginID to associate with the results\n * @param results - The results\n */\nexport async function uploadSiloDiscoveryResults(\n client: GraphQLClient,\n pluginId: string,\n results: SiloDiscoveryRawResults[],\n): Promise<void> {\n const chunks = chunk(results, CHUNK_SIZE);\n\n await mapSeries(chunks, async (rawResults) => {\n await makeGraphQLRequest<{\n /** Whether we successfully uploaded the results */\n success: boolean;\n }>(client, ADD_SILO_DISCOVERY_RESULTS, {\n pluginId,\n rawResults,\n });\n });\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { CATALOGS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface Catalog {\n /** Integration name */\n integrationName: string;\n /** Title of Data Silo */\n title: string;\n /** Whether API is supported */\n hasApiFunctionality: boolean;\n}\n\nconst PAGE_SIZE = 100;\n\n/**\n * Fetch all integration catalogs in an organization\n *\n * @param client - Client\n * @returns Integration catalogs\n */\nexport async function fetchAllCatalogs(\n client: GraphQLClient,\n): Promise<Catalog[]> {\n const catalogs: Catalog[] = [];\n let offset = 0;\n\n // Paginate\n let shouldContinue = false;\n do {\n const {\n catalogs: { nodes },\n } = await makeGraphQLRequest<{\n /** integration catalogs */\n catalogs: {\n /** List */\n nodes: Catalog[];\n };\n }>(client, CATALOGS, {\n first: PAGE_SIZE,\n offset,\n });\n catalogs.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n return catalogs.sort((a, b) =>\n a.integrationName.localeCompare(b.integrationName),\n );\n}\n\nexport interface IndexedCatalogs {\n /** Mapping from service name to service title */\n serviceToTitle: { [k in string]: string };\n /** Mapping from service name to boolean indicate if service has API integration support */\n serviceToSupportedIntegration: { [k in string]: boolean };\n}\n\n/**\n * Fetch all integration catalogs and index them for usage in common utility manners\n *\n * @param client - Client\n * @returns Integration catalogs\n */\nexport async function fetchAndIndexCatalogs(client: GraphQLClient): Promise<\n {\n /** List of all catalogs */\n catalogs: Catalog[];\n } & IndexedCatalogs\n> {\n // Fetch all integrations in the catalog\n const catalogs = await fetchAllCatalogs(client);\n\n // Create mapping from service name to service title\n const serviceToTitle = catalogs.reduce(\n (acc, catalog) =>\n Object.assign(acc, { [catalog.integrationName]: catalog.title }),\n {} as { [k in string]: string },\n );\n\n // Create mapping from service name to boolean indicate if service has API integration support\n const serviceToSupportedIntegration = catalogs.reduce(\n (acc, catalog) =>\n Object.assign(acc, {\n [catalog.integrationName]: catalog.hasApiFunctionality,\n }),\n {} as { [k in string]: boolean },\n );\n\n return {\n catalogs,\n serviceToTitle,\n serviceToSupportedIntegration,\n };\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { version } from '../../../package.json';\n\n/**\n * Create a GraphQL client\n *\n * @param transcendUrl - Transcend API URL\n * @param headers - Request headers to include in each request\n * @returns GraphQL client\n */\nexport function buildTranscendGraphQLClientGeneric(\n transcendUrl: string,\n headers: Record<string, string>,\n): GraphQLClient {\n // Create a GraphQL client\n return new GraphQLClient(`${transcendUrl}/graphql`, {\n headers: {\n ...headers,\n version,\n },\n });\n}\n\n/**\n * Create a GraphQL client capable of submitting requests with an API key\n *\n * @param transcendUrl - Transcend API URL\n * @param auth - API key to authenticate to API\n * @returns GraphQL client\n */\nexport function buildTranscendGraphQLClient(\n transcendUrl: string,\n auth: string,\n): GraphQLClient {\n return buildTranscendGraphQLClientGeneric(transcendUrl, {\n Authorization: `Bearer ${auth}`,\n });\n}\n","import got, { Got } from 'got';\nimport { ORGANIZATION } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { buildTranscendGraphQLClient } from './buildTranscendGraphQLClient';\n\n/**\n * Instantiate an instance of got that is capable of making requests\n * to a sombra gateway.\n *\n * @param transcendUrl - URL of Transcend API\n * @param transcendApiKey - Transcend API key\n * @param sombraApiKey - Sombra API key\n * @returns The instance of got that is capable of making requests to the customer ingress\n */\nexport async function createSombraGotInstance(\n transcendUrl: string,\n transcendApiKey: string,\n sombraApiKey?: string,\n): Promise<Got> {\n // Create GraphQL client to connect to Transcend backend\n const client = buildTranscendGraphQLClient(transcendUrl, transcendApiKey);\n // Grab metadata about organization's sombra from GraphQL endpoint\n const { organization } = await makeGraphQLRequest<{\n /** Requests */\n organization: {\n /** PrimarySombra related to organization */\n sombra: {\n /** URL of sombra */\n customerUrl: string;\n };\n };\n }>(client, ORGANIZATION);\n // Create got instance with default values\n return got.extend({\n prefixUrl: organization.sombra.customerUrl,\n headers: {\n Authorization: `Bearer ${transcendApiKey}`,\n ...(sombraApiKey\n ? {\n 'X-Sombra-Authorization': `Bearer ${sombraApiKey}`,\n }\n : {}),\n },\n });\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { SET_RESOURCE_ATTRIBUTES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { AttributeSupportedResourceType } from '@transcend-io/privacy-types';\n\ninterface SetResourceAttributesInput {\n /** ID of resource */\n resourceId: string;\n /** Type of resource */\n resourceType: AttributeSupportedResourceType;\n /** Attribute key ID */\n attributeKeyId: string;\n /** Attribute values by ID */\n attributeValueIds?: string[];\n /** Attribute values by name */\n attributeValueNames?: string[];\n}\n\n/**\n * Set attribute values on a particular resource\n *\n * @param client - GraphQL client\n * @param input - Input\n */\nexport async function setResourceAttributes(\n client: GraphQLClient,\n input: SetResourceAttributesInput,\n): Promise<void> {\n await makeGraphQLRequest(client, SET_RESOURCE_ATTRIBUTES, {\n input,\n });\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { RETRY_REQUEST_ENRICHER } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\n/**\n * Retry a request enricher\n *\n * @param client - GraphQL client\n * @param id - The ID of the request enricher to restart\n */\nexport async function retryRequestEnricher(\n client: GraphQLClient,\n id: string,\n): Promise<void> {\n await makeGraphQLRequest(client, RETRY_REQUEST_ENRICHER, {\n requestEnricherId: id,\n });\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { PROMPT_THREADS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface PromptThread {\n /** ID of prompts */\n id: string;\n /** Thread ID from API */\n threadId: string;\n /** Related slack message TS */\n slackMessageTs?: string;\n /** Related slack message team ID */\n slackTeamId?: string;\n /** Related slack channel ID */\n slackChannelId?: string;\n /** Related slack channel name */\n slackChannelName?: string;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all PromptThreads in the organization\n *\n * @param client - GraphQL client\n * @param filterBy - Filter options\n * @returns All PromptThreads in the organization\n */\nexport async function fetchAllPromptThreads(\n client: GraphQLClient,\n filterBy: {\n /** Thread IDs to filter on */\n threadIds?: string[];\n /** Slack message timestamps to filter on */\n slackMessageTs?: string[];\n },\n): Promise<PromptThread[]> {\n const promptThreads: PromptThread[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n promptThreads: { nodes },\n } = await makeGraphQLRequest<{\n /** PromptThreads */\n promptThreads: {\n /** List */\n nodes: PromptThread[];\n };\n }>(client, PROMPT_THREADS, {\n first: PAGE_SIZE,\n offset,\n filterBy,\n });\n promptThreads.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return promptThreads.sort((a, b) => a.threadId.localeCompare(b.threadId));\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { REQUEST_IDENTIFIERS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\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 }: {\n /** ID of request to filter on */\n requestId: string;\n },\n): Promise<RequestIdentifierMetadata[]> {\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: [requestId],\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 { GraphQLClient } from 'graphql-request';\nimport { REDUCED_REQUESTS_FOR_DATA_SILO_COUNT } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\n/**\n * Get number of open requests for a data silo\n *\n * @param client - GraphQL client\n * @param options - Filter options\n * @returns List of request identifiers\n */\nexport async function fetchRequestDataSiloActiveCount(\n client: GraphQLClient,\n {\n dataSiloId,\n }: {\n /** Data silo ID */\n dataSiloId: string;\n },\n): Promise<number> {\n const {\n listReducedRequestsForDataSilo: { totalCount },\n } = await makeGraphQLRequest<{\n /** Requests */\n listReducedRequestsForDataSilo: {\n /** Total count */\n totalCount: number;\n };\n }>(client, REDUCED_REQUESTS_FOR_DATA_SILO_COUNT, {\n input: {\n dataSiloId,\n isResolved: false,\n },\n });\n\n return totalCount;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { ATTRIBUTE_KEYS_REQUESTS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface AttributeKey {\n /** ID of attribute key */\n id: string;\n /** Name of attribute key */\n name: string;\n /** Attribute key type */\n type: string;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all attribute keys enabled for privacy requests\n *\n * @param client - GraphQL client\n * @returns All attribute keys in the organization\n */\nexport async function fetchAllRequestAttributeKeys(\n client: GraphQLClient,\n): Promise<AttributeKey[]> {\n const attributeKeys: AttributeKey[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n attributeKeys: { nodes },\n } = await makeGraphQLRequest<{\n /** Query response */\n attributeKeys: {\n /** List of matches */\n nodes: AttributeKey[];\n };\n }>(client, ATTRIBUTE_KEYS_REQUESTS, {\n first: PAGE_SIZE,\n offset,\n });\n attributeKeys.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return attributeKeys.sort((a, b) => a.name.localeCompare(b.name));\n}\n","import { GraphQLClient } from 'graphql-request';\nimport colors from 'colors';\nimport { REQUESTS } from './gqls';\nimport * as t from 'io-ts';\nimport cliProgress from 'cli-progress';\nimport { valuesOf } from '@transcend-io/type-utils';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport {\n RequestAction,\n RequestOrigin,\n RequestStatus,\n IsoCountryCode,\n IsoCountrySubdivisionCode,\n} from '@transcend-io/privacy-types';\nimport { logger } from '../../logger';\nimport { LanguageKey } from '@transcend-io/internationalization';\n\nexport const PrivacyRequest = t.intersection([\n t.type({\n /** Request ID */\n id: t.string,\n /** Time request was made */\n createdAt: t.string,\n /** Email of request */\n email: t.string,\n /** The type of request */\n type: valuesOf(RequestAction),\n /** Link to request in Transcend dashboard */\n link: t.string,\n /** Whether request is in silent mode */\n isSilent: t.boolean,\n /** Where request was made */\n origin: valuesOf(RequestOrigin),\n /** Whether request is a test request */\n isTest: t.boolean,\n /** The core identifier of the request */\n coreIdentifier: t.string,\n /** Request details */\n details: t.string,\n /** Locale of request */\n locale: valuesOf(LanguageKey),\n /** Status of request */\n status: valuesOf(RequestStatus),\n /** Type of data subject */\n subjectType: t.string,\n /** Country of request */\n country: t.union([t.null, valuesOf(IsoCountryCode)]),\n /** Subdivision of request */\n countrySubDivision: t.union([t.null, valuesOf(IsoCountrySubdivisionCode)]),\n /** Request attributes */\n attributeValues: t.array(\n t.type({\n id: t.string,\n attributeKey: t.type({ name: t.string, id: t.string }),\n name: t.string,\n }),\n ),\n }),\n t.partial({\n /** Days remaining until expired */\n daysRemaining: t.union([t.null, t.number]),\n }),\n]);\n\n/** Type override */\nexport type PrivacyRequest = t.TypeOf<typeof PrivacyRequest>;\n\nconst PAGE_SIZE = 50;\n\n/**\n * Fetch all requests matching a set of filters\n *\n * @param client - GraphQL client\n * @param options - Filter options\n * @returns List of requests\n */\nexport async function fetchAllRequests(\n client: GraphQLClient,\n {\n actions = [],\n statuses = [],\n origins = [],\n text,\n createdAtBefore,\n createdAtAfter,\n isTest,\n isSilent,\n isClosed,\n requestIds = [],\n }: {\n /** Actions to filter on */\n actions?: RequestAction[];\n /** Origins to filter on */\n origins?: RequestOrigin[];\n /** Statuses to filter on */\n statuses?: RequestStatus[];\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 with a specific identifier */\n text?: string;\n /** Return test requests */\n isTest?: boolean;\n /** Return silent mode requests */\n isSilent?: boolean;\n /** Filter by whether request is active */\n isClosed?: boolean;\n /**\n * Filter the list of requests for a set of IDs - these are applied\n * at runtime while other filters are applied at the GraphQL level.\n */\n requestIds?: string[];\n } = {},\n): Promise<PrivacyRequest[]> {\n logger.info(colors.magenta('Fetching requests...'));\n\n // create a new progress bar instance and use shades_classic theme\n const t0 = new Date().getTime();\n const progressBar = new cliProgress.SingleBar(\n {},\n cliProgress.Presets.shades_classic,\n );\n\n // read in requests\n const requests: PrivacyRequest[] = [];\n let offset = 0;\n\n // Paginate\n let shouldContinue = false;\n do {\n const {\n requests: { nodes, totalCount },\n } = await makeGraphQLRequest<{\n /** Requests */\n requests: {\n /** List */\n nodes: PrivacyRequest[];\n /** Total count */\n totalCount: number;\n };\n }>(client, REQUESTS, {\n first: PAGE_SIZE,\n offset,\n filterBy: {\n text,\n type: actions.length > 0 ? actions : undefined,\n status: statuses.length > 0 ? statuses : undefined,\n origin: origins.length > 0 ? origins : undefined,\n isTest,\n isSilent,\n isClosed,\n createdAtBefore: createdAtBefore\n ? createdAtBefore.toISOString()\n : undefined,\n createdAtAfter: createdAtAfter\n ? createdAtAfter.toISOString()\n : undefined,\n },\n });\n if (offset === 0 && totalCount > PAGE_SIZE) {\n logger.info(colors.magenta(`Fetching ${totalCount} requests`));\n progressBar.start(totalCount, 0);\n }\n\n requests.push(...nodes);\n offset += PAGE_SIZE;\n progressBar.update(offset);\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n // Log completion time\n logger.info(\n colors.green(\n `Completed fetching of ${requests.length} request in \"${\n totalTime / 1000\n }\" seconds.`,\n ),\n );\n\n // Filter down requests by request ID\n let allRequests = requests;\n if (requestIds && requestIds.length > 0) {\n allRequests = allRequests.filter((request) =>\n requestIds.includes(request.id),\n );\n logger.info(\n colors.green(\n `Filtered down to ${allRequests.length} requests based on ${requestIds.length} provided IDs.`,\n ),\n );\n }\n\n return allRequests;\n}\n","import { IdentifierType } from '@transcend-io/privacy-types';\nimport { decodeCodec, valuesOf } from '@transcend-io/type-utils';\nimport type { Got } from 'got';\nimport { GraphQLClient } from 'graphql-request';\nimport * as t from 'io-ts';\nimport semver from 'semver';\n\nimport { SOMBRA_VERSION } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nconst MIN_SOMBRA_VERSION_TO_DECRYPT = '7.180';\n\nconst RequestIdentifier = t.type({\n /** ID of request */\n id: t.string,\n /** Name of identifier */\n name: t.string,\n /** The underlying identifier value */\n value: t.string,\n /** Type of identifier */\n type: valuesOf(IdentifierType),\n});\n\n/** Type override */\nexport type RequestIdentifier = t.TypeOf<typeof RequestIdentifier>;\n\nconst PAGE_SIZE = 50;\n\nexport const RequestIdentifiersResponse = t.type({\n identifiers: t.array(RequestIdentifier),\n});\n\n/**\n * Fetch all request identifiers for a particular request\n *\n * @param client - GraphQL client\n * @param sombra - Sombra client\n * @param options - Options\n * @returns List of request identifiers\n */\nexport async function fetchAllRequestIdentifiers(\n client: GraphQLClient,\n sombra: Got,\n {\n requestId,\n }: {\n /** ID of request to filter on */\n requestId: string;\n },\n): Promise<RequestIdentifier[]> {\n const requestIdentifiers: RequestIdentifier[] = [];\n let offset = 0;\n let shouldContinue = false;\n\n // determine sombra version\n const {\n organization: {\n sombra: { version },\n },\n } = await makeGraphQLRequest<{\n /** The organization */\n organization: {\n /** Sombra */\n sombra: {\n /** Version string */\n version: string;\n };\n };\n }>(client!, SOMBRA_VERSION);\n\n if (version && semver.lt(version, MIN_SOMBRA_VERSION_TO_DECRYPT)) {\n throw new Error(\n `Please upgrade Sombra to ${MIN_SOMBRA_VERSION_TO_DECRYPT} or greater to use this command.`,\n );\n }\n\n do {\n let response: unknown;\n try {\n response = await sombra!\n .post<{\n /** Decrypted identifiers */\n identifiers: RequestIdentifier[];\n }>('v1/request-identifiers', {\n json: {\n first: PAGE_SIZE,\n offset,\n requestId,\n },\n })\n .json();\n } catch (err) {\n throw new Error(\n `Failed to fetch request identifiers: ${\n err?.response?.body || err?.message\n }`,\n );\n }\n\n const { identifiers: nodes } = decodeCodec(\n RequestIdentifiersResponse,\n response,\n );\n\n requestIdentifiers.push(...nodes);\n\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return requestIdentifiers;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { RequestEnricherStatus } from '@transcend-io/privacy-types';\nimport { REQUEST_ENRICHERS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface RequestEnricher {\n /** ID of request enricher */\n id: string;\n /** Name of identifier */\n enricher: {\n /** ID of enricher */\n id: string;\n /** Title of enricher */\n title: string;\n /** Typeof of enricher */\n type: string;\n };\n /** The status of the enricher */\n status: RequestEnricherStatus;\n}\n\nconst PAGE_SIZE = 50;\n\n/**\n * Fetch all request enrichers for a particular request\n *\n * @param client - GraphQL client\n * @param options - Filter options\n * @returns List of request enrichers\n */\nexport async function fetchAllRequestEnrichers(\n client: GraphQLClient,\n {\n requestId,\n }: {\n /** ID of request to filter on */\n requestId: string;\n },\n): Promise<RequestEnricher[]> {\n const requestEnrichers: RequestEnricher[] = [];\n let offset = 0;\n\n // Paginate\n let shouldContinue = false;\n do {\n const {\n requestEnrichers: { nodes },\n } = await makeGraphQLRequest<{\n /** Request Enrichers */\n requestEnrichers: {\n /** List */\n nodes: RequestEnricher[];\n };\n }>(client, REQUEST_ENRICHERS, {\n first: PAGE_SIZE,\n offset,\n requestId,\n });\n requestEnrichers.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return requestEnrichers;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport colors from 'colors';\nimport cliProgress from 'cli-progress';\nimport { REQUEST_DATA_SILOS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport {\n RequestDataSiloStatus,\n RequestStatus,\n} from '@transcend-io/privacy-types';\nimport { logger } from '../../logger';\n\nexport interface RequestDataSilo {\n /** ID of RequestDataSilo */\n id: string;\n}\n\nconst PAGE_SIZE = 100;\n\n/**\n * Fetch all request data silos by some filter criteria\n *\n * @param client - GraphQL client\n * @param options - Filter options\n * @returns List of request identifiers\n */\nexport async function fetchRequestDataSilos(\n client: GraphQLClient,\n {\n requestId,\n dataSiloId,\n requestStatuses,\n statuses,\n skipLog = false,\n }: {\n /** ID of request to filter on */\n requestId?: string;\n /** Data silo ID */\n dataSiloId?: string;\n /**\n * The statuses to filter on\n */\n statuses?: RequestDataSiloStatus[];\n /** The request statuses to filter on */\n requestStatuses?: RequestStatus[];\n /** When true, skip logging */\n skipLog?: boolean;\n },\n): Promise<RequestDataSilo[]> {\n // create a new progress bar instance and use shades_classic theme\n const t0 = new Date().getTime();\n const progressBar = new cliProgress.SingleBar(\n {},\n cliProgress.Presets.shades_classic,\n );\n\n const requestDataSilos: RequestDataSilo[] = [];\n let offset = 0;\n\n // Try to fetch an DataFlow with the same title\n let shouldContinue = false;\n do {\n const {\n requestDataSilos: { nodes, totalCount },\n } = await makeGraphQLRequest<{\n /** Request Data Silos */\n requestDataSilos: {\n /** List */\n nodes: RequestDataSilo[];\n /** Total count */\n totalCount: number;\n };\n }>(client, REQUEST_DATA_SILOS, {\n first: PAGE_SIZE,\n offset,\n filterBy: {\n dataSiloId,\n requestId,\n status: statuses,\n requestStatus: requestStatuses,\n },\n });\n requestDataSilos.push(...nodes);\n\n if (offset === 0 && totalCount > PAGE_SIZE) {\n logger.info(colors.magenta(`Fetching ${totalCount} requests`));\n progressBar.start(totalCount, 0);\n }\n\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n progressBar.update(offset);\n } while (shouldContinue);\n\n progressBar.stop();\n const t1 = new Date().getTime();\n const totalTime = t1 - t0;\n\n // Log completion time\n if (!skipLog) {\n logger.info(\n colors.green(\n `Completed fetching of ${\n requestDataSilos.length\n } request data silos in \"${totalTime / 1000}\" seconds.`,\n ),\n );\n }\n\n return requestDataSilos;\n}\n\n/**\n * Fetch all request identifiers 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 fetchRequestDataSilo(\n client: GraphQLClient,\n {\n requestId,\n dataSiloId,\n }: {\n /** ID of request to filter on */\n requestId: string;\n /** Data silo ID */\n dataSiloId: string;\n },\n): Promise<RequestDataSilo> {\n const nodes = await fetchRequestDataSilos(client, {\n requestId,\n dataSiloId,\n skipLog: true,\n });\n if (nodes.length !== 1) {\n throw new Error(\n `Failed to find RequestDataSilo with requestId:${requestId},dataSiloId:${dataSiloId}`,\n );\n }\n\n return nodes[0];\n}\n","import got, { Got } from 'got';\n\n/**\n * Instantiate an instance of got that is capable of making requests\n * to a sombra gateway.\n *\n * @param transcendUrl - URL of Transcend API\n * @returns The instance of got that is capable of making requests to the customer ingress\n */\nexport function createTranscendConsentGotInstance(transcendUrl: string): Got {\n // Create got instance with default values\n return got.extend({\n prefixUrl: transcendUrl,\n });\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { DETERMINE_LOGIN_METHOD, ASSUME_ROLE, LOGIN } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface OrganizationPreview {\n /** Name of organization */\n name: string;\n /** Id of organization */\n id: string;\n /** uri of organization */\n uri: string;\n /** ID of parent organization */\n parentOrganizationId?: string;\n}\n\nexport interface UserRole {\n /** ID of role */\n id: string;\n /** Related organization */\n organization: OrganizationPreview;\n}\n\n/**\n * Log in as a user\n *\n * @param client - GraphQL client\n * @param options - Email/password\n * @returns Cookie and roles\n */\nexport async function loginUser(\n client: GraphQLClient,\n {\n email,\n password,\n }: {\n /** Email of user */\n email: string;\n /** Password of user */\n password: string;\n },\n): Promise<{\n /** Cookie to be used to make subsequent requests */\n loginCookie: string;\n /** Roles of the user */\n roles: UserRole[];\n}> {\n const {\n determineLoginMethod: { loginMethod },\n } = await makeGraphQLRequest<{\n /** Determine login method */\n determineLoginMethod: {\n /** Login method info */\n loginMethod: {\n /** Email being logged in */\n email: string;\n /** Sombra public key */\n sombraPublicKey: string;\n };\n };\n }>(client, DETERMINE_LOGIN_METHOD, {\n email,\n });\n\n const res = await client.rawRequest<{\n /** Login */\n login: {\n /** User */\n user: {\n /** Roles of user */\n roles: UserRole[];\n };\n };\n }>(LOGIN, {\n email,\n password,\n publicKey: loginMethod.sombraPublicKey,\n });\n const {\n login: { user },\n } = res.data;\n\n // Get login cookie from response\n const loginCookie = res.headers.get('set-cookie');\n if (!loginCookie || !loginCookie.includes('laravel')) {\n throw new Error('Failed to get login cookie in response');\n }\n\n return {\n roles: user.roles,\n loginCookie,\n };\n}\n\n/**\n * Assume role for user into another organization\n *\n * @param client - GraphQL client\n * @param options - Email/password\n */\nexport async function assumeRole(\n client: GraphQLClient,\n {\n email,\n roleId,\n }: {\n /** Email of user */\n email: string;\n /** Role of user assuming into */\n roleId: string;\n },\n): Promise<void> {\n const {\n determineLoginMethod: { loginMethod },\n } = await makeGraphQLRequest<{\n /** Determine login method */\n determineLoginMethod: {\n /** Login method info */\n loginMethod: {\n /** Email being logged in */\n email: string;\n /** Sombra public key */\n sombraPublicKey: string;\n };\n };\n }>(client, DETERMINE_LOGIN_METHOD, {\n email,\n userId: roleId,\n });\n\n await client.rawRequest<{\n /** Assume role */\n assumeRole: {\n /** Mutation ID */\n clientMutationId: string;\n };\n }>(ASSUME_ROLE, {\n id: roleId,\n publicKey: loginMethod.sombraPublicKey,\n });\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { USERS } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface User {\n /** ID of user */\n id: string;\n /** Name of user */\n name: string;\n /** Email of user */\n email: string;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all users in the organization\n *\n * @param client - GraphQL client\n * @returns All users in the organization\n */\nexport async function fetchAllUsers(client: GraphQLClient): Promise<User[]> {\n const users: User[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n users: { nodes },\n } = await makeGraphQLRequest<{\n /** Users */\n users: {\n /** List */\n nodes: User[];\n };\n }>(client, USERS, {\n first: PAGE_SIZE,\n offset,\n });\n users.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return users.sort((a, b) => a.email.localeCompare(b.email));\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { CREATE_API_KEY, DELETE_API_KEY } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { ScopeName } from '@transcend-io/privacy-types';\n\nexport interface CreatedApiKey {\n /** ID of API key */\n id: string;\n /** Actual API key */\n apiKey: string;\n /** Title of the API key */\n title: string;\n}\n\n/**\n * Create an API key\n *\n * @param client - GraphQL client\n * @param input - Input\n * @returns The API key\n */\nexport async function createApiKey(\n client: GraphQLClient,\n input: {\n /** Title of API key */\n title: string;\n /** Scopes for API key */\n scopes: ScopeName[];\n },\n): Promise<CreatedApiKey> {\n const {\n createApiKey: { apiKey },\n } = await makeGraphQLRequest<{\n /** Create API key */\n createApiKey: {\n /** API key */\n apiKey: CreatedApiKey;\n };\n }>(client, CREATE_API_KEY, { input });\n\n return apiKey;\n}\n\n/**\n * Delete an API key\n *\n * @param client - GraphQL client\n * @param id - API key Id\n */\nexport async function deleteApiKey(\n client: GraphQLClient,\n id: string,\n): Promise<void> {\n await makeGraphQLRequest(client, DELETE_API_KEY, { id });\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { REQUEST_FILES } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\nexport interface RequestFile {\n /** The remote ID */\n remoteId: string;\n /** The file name */\n fileName: string;\n}\n\nconst PAGE_SIZE = 20;\n\n/**\n * Fetch all RequestFiles for a single request\n *\n * @param client - GraphQL client\n * @param filterBy - Filter by\n * @returns All RequestFiles in the organization\n */\nexport async function fetchRequestFilesForRequest(\n client: GraphQLClient,\n filterBy: {\n /** Filter by request ID */\n requestId: string;\n /** Filter by data silo ID */\n dataSiloId?: string;\n },\n): Promise<RequestFile[]> {\n const requestFiles: RequestFile[] = [];\n let offset = 0;\n\n // Whether to continue looping\n let shouldContinue = false;\n do {\n const {\n requestFiles: { nodes },\n } = await makeGraphQLRequest<{\n /** RequestFiles */\n requestFiles: {\n /** List */\n nodes: RequestFile[];\n };\n }>(client, REQUEST_FILES, {\n first: PAGE_SIZE,\n offset,\n filterBy,\n });\n requestFiles.push(...nodes);\n offset += PAGE_SIZE;\n shouldContinue = nodes.length === PAGE_SIZE;\n } while (shouldContinue);\n\n return requestFiles.sort((a, b) => a.remoteId.localeCompare(b.remoteId));\n}\n","import { ConsentBundleType } from '@transcend-io/privacy-types';\nimport { GraphQLClient } from 'graphql-request';\nimport {\n UPDATE_CONSENT_MANAGER_TO_LATEST,\n DEPLOY_CONSENT_MANAGER,\n} from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\n\n/**\n * Deploy the Consent Manager\n *\n * @param client - GraphQL client\n * @param options - Options\n */\nexport async function deployConsentManager(\n client: GraphQLClient,\n {\n id,\n bundleType,\n }: {\n /** ID of Consent Manager */\n id: string;\n /** Type of bundle */\n bundleType: ConsentBundleType;\n },\n): Promise<void> {\n await makeGraphQLRequest(client, DEPLOY_CONSENT_MANAGER, {\n airgapBundleId: id,\n bundleType,\n });\n}\n\n/**\n * Update the Consent Manager to the latest airgap.jz version\n *\n * @param client - GraphQL client\n * @param options - Options\n */\nexport async function updateConsentManagerToLatest(\n client: GraphQLClient,\n {\n id,\n bundleType,\n }: {\n /** ID of Consent Manager */\n id: string;\n /** Type of bundle */\n bundleType: ConsentBundleType;\n },\n): Promise<void> {\n await makeGraphQLRequest(client, UPDATE_CONSENT_MANAGER_TO_LATEST, {\n airgapBundleId: id,\n bundleType,\n });\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { REPORT_PROMPT_RUN } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport {\n QueueStatus,\n ChatCompletionRole,\n PromptRunProductArea,\n LargeLanguageModelClient,\n} from '@transcend-io/privacy-types';\n\nexport interface ReportPromptRunInput {\n /** Name of run */\n name: string;\n /** The related product area being uploaded to */\n productArea: PromptRunProductArea;\n /** Messages reported on */\n promptRunMessages: {\n /** Message reported */\n content: string;\n /** Role of message */\n role: ChatCompletionRole;\n /** Template used if created from prompt */\n template?: string;\n }[];\n /** ID of the Transcend prompt being reported */\n promptId?: string;\n /** Title of the prompt being reported on */\n promptTitle?: string;\n /** Error message (if one exists) */\n error?: string;\n /** The status of the run */\n status?: QueueStatus;\n /** Employee email that is executing the request */\n runByEmployeeEmail?: string;\n /** Duration of time that it took to execute the prompt */\n duration?: number;\n /** Temperature used when running prompt */\n temperature?: number;\n /** TopP parameter used when running prompt */\n topP?: number;\n /** Max tokens ot sample parameter used when running prompt */\n maxTokensToSample?: number;\n /** The ID of the prompt group being reported */\n promptGroupId?: string;\n /** The title of the prompt group being reported */\n promptGroupTitle?: string;\n /** The LLM Id being reported on */\n largeLanguageModelId?: string;\n /** The name of the large language model being reported on */\n largeLanguageModelName?: string;\n /** The name of the large language model client reported on */\n largeLanguageModelClient?: LargeLanguageModelClient;\n /** ID of the application calling pathfinder */\n applicationId?: string;\n /** Name of the application calling pathfinder */\n applicationName?: string;\n /** Name of the code package calling pathfinder */\n codePackageName?: string;\n /** Name of the repository calling pathfinder */\n repositoryName?: string;\n /** ID of the pathfinder applying policies */\n pathfinderId?: string;\n /** Name of the pathfinder applying policies */\n pathfinderName?: string;\n /** Core identifier of the application user being reported on */\n applicationUserCoreIdentifier?: string;\n /** Name of the application user being reported on */\n applicationUserName?: string;\n}\n\n/**\n * Record a new prompt run\n *\n * @param client - GraphQL client\n * @param input - Prompt input\n * @returns Prompt ID\n */\nexport async function reportPromptRun(\n client: GraphQLClient,\n input: ReportPromptRunInput,\n): Promise<string> {\n const {\n reportPromptRun: { promptRun },\n } = await makeGraphQLRequest<{\n /** reportPromptRun mutation */\n reportPromptRun: {\n /** Prompt */\n promptRun: {\n /** ID */\n id: string;\n };\n };\n }>(client, REPORT_PROMPT_RUN, {\n input: {\n ...input,\n promptRunMessages: input.promptRunMessages.map(\n ({ content, ...rest }) => ({\n ...rest,\n message: content,\n }),\n ),\n },\n });\n return promptRun.id;\n}\n","import { GraphQLClient } from 'graphql-request';\nimport { ADD_MESSAGES_TO_PROMPT_RUN } from './gqls';\nimport { makeGraphQLRequest } from './makeGraphQLRequest';\nimport { QueueStatus, ChatCompletionRole } from '@transcend-io/privacy-types';\n\nexport interface AddMessagesToPromptRunInput {\n /** ID of run */\n promptRunId:\n | {\n /** Report by prompt run name */\n name: string;\n /** Don't report by ID */\n id?: undefined;\n }\n | {\n /** Don't report by name */\n name?: undefined;\n /** Report by prompt run ID */\n id: string;\n };\n /** Messages to report on */\n promptRunMessages?: {\n /** Message reported */\n content: string;\n /** Role of message */\n role: ChatCompletionRole;\n /** Template used if created from prompt */\n template?: string;\n }[];\n /** Error message (if one exists) */\n error?: string;\n /** The status of the run */\n status?: QueueStatus;\n /** Duration of time that it took to execute the prompt */\n duration?: number;\n}\n\n/**\n * Record a new prompt run\n *\n * @param client - GraphQL client\n * @param input - Prompt input\n * @returns Prompt ID\n */\nexport async function addMessagesToPromptRun(\n client: GraphQLClient,\n { promptRunId, promptRunMessages = [], ...rest }: AddMessagesToPromptRunInput,\n): Promise<string> {\n const {\n addMessagesToPromptRun: { promptRun },\n } = await makeGraphQLRequest<{\n /** addMessagesToPromptRun mutation */\n addMessagesToPromptRun: {\n /** Prompt */\n promptRun: {\n /** ID */\n id: string;\n };\n };\n }>(client, ADD_MESSAGES_TO_PROMPT_RUN, {\n input: {\n ...rest,\n ...promptRunId,\n promptRunMessages: promptRunMessages.map(({ content, ...rest }) => ({\n ...rest,\n message: content,\n })),\n },\n });\n return promptRun.id;\n}\n"],"mappings":"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","names":["mapSeries","array","iterator","results","i","map","options","concurrency","executing","nextIndex","executeNext","currentIndex","promise","result","index","initialBatch","initialPromises","gql","DATA_POINTS","DATA_POINT_COUNT","SUB_DATA_POINTS","SUB_DATA_POINTS_COUNT","SUB_DATA_POINTS_WITH_GUESSES","UPDATE_OR_CREATE_DATA_POINT","DATAPOINT_EXPORT","gql","ENTRY_COUNT","gql","DATA_SILOS","DATA_SILO_EXPORT","DATA_SILOS_ENRICHED","UPDATE_DATA_SILOS","CREATE_DATA_SILOS","gql","ENRICHERS","INITIALIZER","CREATE_ENRICHER","UPDATE_ENRICHER","gql","CATALOGS","gql","IDENTIFIERS","NEW_IDENTIFIER_TYPES","CREATE_IDENTIFIER","UPDATE_IDENTIFIER","gql","DATA_SUBJECTS","CREATE_DATA_SUBJECT","UPDATE_DATA_SUBJECT","TOGGLE_DATA_SUBJECT","gql","REPOSITORIES","UPDATE_REPOSITORIES","CREATE_REPOSITORY","gql","API_KEYS","CREATE_API_KEY","DELETE_API_KEY","gql","ADD_SILO_DISCOVERY_RESULTS","ENABLED_PLUGINS","gql","TEMPLATES","CREATE_TEMPLATE","gql","ORGANIZATION","gql","ATTRIBUTE_KEYS_REQUESTS","gql","SOFTWARE_DEVELOPMENT_KITS","UPDATE_SOFTWARE_DEVELOPMENT_KITS","CREATE_SOFTWARE_DEVELOPMENT_KIT","gql","CODE_PACKAGES","UPDATE_CODE_PACKAGES","CREATE_CODE_PACKAGE","gql","PROMPT_THREADS","gql","POLICIES","UPDATE_POLICIES","gql","REQUESTS","APPROVE_PRIVACY_REQUEST","CANCEL_PRIVACY_REQUEST","UPDATE_PRIVACY_REQUEST","NOTIFY_ADDITIONAL_TIME","gql","MESSAGES","UPDATE_INTL_MESSAGES","gql","REQUEST_ENRICHERS","RETRY_REQUEST_ENRICHER","SKIP_REQUEST_ENRICHER","gql","ASSESSMENT_SECTION_FIELDS","ASSESSMENTS","IMPORT_ONE_TRUST_ASSESSMENT_FORMS","gql","PURPOSES","gql","PREFERENCE_TOPICS","gql","ASSESSMENT_TEMPLATES","gql","ASSESSMENT_SECTION_FIELDS","gql","PROMPTS","PROMPT_PARTIALS","PROMPT_GROUPS","PROMPTS_WITH_VARIABLES","UPDATE_PROMPTS","CREATE_PROMPT","UPDATE_PROMPT_PARTIALS","CREATE_PROMPT_PARTIAL","UPDATE_PROMPT_GROUPS","CREATE_PROMPT_GROUP","gql","REQUEST_DATA_SILOS","CHANGE_REQUEST_DATA_SILO_STATUS","RETRY_REQUEST_DATA_SILO","REDUCED_REQUESTS_FOR_DATA_SILO_COUNT","gql","TEAMS","CREATE_TEAM","UPDATE_TEAM","gql","REMOVE_REQUEST_IDENTIFIERS","REQUEST_IDENTIFIERS","gql","USERS","gql","REQUEST_FILES","gql","REPORT_PROMPT_RUN","ADD_MESSAGES_TO_PROMPT_RUN","gql","GLOBAL_ACTION_ITEM_COLLECTIONS","CREATE_ACTION_ITEM_COLLECTION","UPDATE_ACTION_ITEM_COLLECTION","gql","ATTRIBUTES","CREATE_ATTRIBUTE_VALUES","UPDATE_ATTRIBUTE_VALUES","DELETE_ATTRIBUTE_VALUE","ATTRIBUTE_VALUES","CREATE_ATTRIBUTE","UPDATE_ATTRIBUTE","SET_RESOURCE_ATTRIBUTES","gql","EXPERIENCES","CONSENT_PARTITIONS","CREATE_DATA_FLOWS","UPDATE_DATA_FLOWS","UPDATE_OR_CREATE_COOKIES","DATA_FLOWS","COOKIES","FETCH_CONSENT_MANAGER_ID","FETCH_CONSENT_MANAGER","FETCH_CONSENT_MANAGER_THEME","CREATE_CONSENT_MANAGER","UPDATE_CONSENT_MANAGER_VERSION","UPDATE_CONSENT_MANAGER_TO_LATEST","DEPLOY_CONSENT_MANAGER","UPDATE_CONSENT_MANAGER_DOMAINS","UPDATE_CONSENT_MANAGER_PARTITION","UPDATE_TOGGLE_USP_API","TOGGLE_UNKNOWN_REQUEST_POLICY","TOGGLE_UNKNOWN_COOKIE_POLICY","TOGGLE_TELEMETRY_PARTITION_STRATEGY","TOGGLE_CONSENT_PRECEDENCE","UPDATE_CONSENT_MANAGER_THEME","UPDATE_CONSENT_EXPERIENCE","CREATE_CONSENT_EXPERIENCE","CREATE_CONSENT_PARTITION","gql","CONSENT_MANAGER_ANALYTICS_DATA","gql","BUSINESS_ENTITIES","CREATE_BUSINESS_ENTITY","UPDATE_BUSINESS_ENTITIES","gql","ACTIONS","UPDATE_ACTION","gql","GLOBAL_ACTION_ITEMS","UPDATE_ACTION_ITEMS","CREATE_ACTION_ITEMS","gql","FETCH_PRIVACY_CENTER_ID","DEPLOYED_PRIVACY_CENTER_URL","PRIVACY_CENTER","UPDATE_PRIVACY_CENTER","gql","DETERMINE_LOGIN_METHOD","LOGIN","ASSUME_ROLE","gql","LARGE_LANGUAGE_MODELS","gql","AGENTS","CREATE_AGENT","UPDATE_AGENTS","gql","AGENT_FILES","CREATE_AGENT_FILE","UPDATE_AGENT_FILES","gql","AGENT_FUNCTIONS","CREATE_AGENT_FUNCTION","UPDATE_AGENT_FUNCTIONS","gql","VENDORS","CREATE_VENDOR","UPDATE_VENDORS","gql","DATA_SUB_CATEGORIES","CREATE_DATA_SUB_CATEGORY","UPDATE_DATA_SUB_CATEGORIES","gql","PROCESSING_PURPOSE_SUB_CATEGORIES","CREATE_PROCESSING_PURPOSE_SUB_CATEGORY","UPDATE_PROCESSING_PURPOSE_SUB_CATEGORIES","gql","SOMBRA_VERSION","colors","MAX_RETRIES","sleepPromise","sleepTime","resolve","KNOWN_ERRORS","makeGraphQLRequest","client","document","variables","requestHeaders","maxRequests","retryCount","err","logger","msg","rateLimitResetAt","keyBy","uniq","flatten","difference","colors","PAGE_SIZE","fetchAllIdentifiers","client","identifiers","offset","shouldContinue","nodes","makeGraphQLRequest","IDENTIFIERS","a","b","fetchIdentifiersAndCreateMissing","enrichers","dataSilos","skipPublish","allIdentifiers","identifiersByName","keyBy","expectedIdentifiers","uniq","flatten","enricher","dataSilo","name","x","missingIdentifiers","difference","logger","colors","newIdentifierTypes","NEW_IDENTIFIER_TYPES","nativeTypesRemaining","mapSeries","identifier","createIdentifier","CREATE_IDENTIFIER","syncIdentifier","client","identifier","dataSubjectsByName","identifierId","skipPublish","makeGraphQLRequest","UPDATE_IDENTIFIER","type","EnricherType","RequestAction","PAGE_SIZE","fetchAllEnrichers","client","title","enrichers","offset","shouldContinue","nodes","makeGraphQLRequest","ENRICHERS","a","b","syncEnricher","enricher","identifierByName","dataSubjectsByName","existingEnricher","dataSubjectIds","subject","existing","inputIdentifier","actionUpdates","RequestAction","UPDATE_ENRICHER","id","EnricherType","CREATE_ENRICHER","colors","keyBy","difference","groupBy","syncAttribute","client","attribute","existingAttribute","deleteExtraAttributeValues","input","attributeKeyId","makeGraphQLRequest","UPDATE_ATTRIBUTE","attributeKey","CREATE_ATTRIBUTE","existingAttributeMap","keyBy","existingValues","newValues","groupBy","field","removedValues","difference","name","CREATE_ATTRIBUTE_VALUES","rest","logger","colors","UPDATE_ATTRIBUTE_VALUES","map","value","DELETE_ATTRIBUTE_VALUE","keyBy","flatten","uniq","difference","colors","fetchAllDataSubjects","client","internalSubjects","makeGraphQLRequest","DATA_SUBJECTS","ensureAllDataSubjectsExist","dataSilos","dataSubjects","enrichers","fetchAll","expectedDataSubjects","uniq","flatten","silo","enricher","subject","dataSubjectByName","keyBy","missingDataSubjects","difference","type","logger","colors","mapSeries","dataSubject","createSubject","CREATE_DATA_SUBJECT","convertToDataSubjectBlockList","dataSubjectTypes","allDataSubjects","id","convertToDataSubjectAllowlist","cliProgress","colors","sortBy","chunk","keyBy","apply","BATCH_SILOS_LIMIT","fetchAllDataSilos","client","titles","pageSize","ids","gql","DATA_SILOS","integrationNames","logger","colors","dataSilos","offset","shouldContinue","nodes","makeGraphQLRequest","a","b","fetchAllSubDataPoints","dataPointId","debug","includeGuessedCategories","subDataPoints","SUB_DATA_POINTS_WITH_GUESSES","SUB_DATA_POINTS","err","sortBy","fetchAllDataPoints","dataSiloId","skipSubDatapoints","dataPoints","DATA_POINTS","map","node","fetchEnrichedDataSilos","skipDatapoints","silos","DATA_SILOS_ENRICHED","mapSeries","silo","index","syncDataSilos","dataSubjectsByName","apiKeysByTitle","encounteredError","t0","existingDataSilos","title","existingDataSiloByTitle","keyBy","newDataSiloInputs","chunked","chunk","dependencyUpdateChunk","CREATE_DATA_SILOS","input","chunkedUpdates","dataSiloUpdateChunk","ind","UPDATE_DATA_SILOS","convertToDataSubjectBlockList","progressBar","cliProgress","dataSilosWithDataPoints","datapoints","totalDataPoints","acc","count","total","datapoint","fields","key","description","categories","purposes","attributes","rest","category","purpose","payload","value","subDataPointsToUpdate","name","duplicateDataPoints","UPDATE_OR_CREATE_DATA_POINT","totalTime","id","syncDataSiloDependencies","dependencyUpdates","dependedOnDataSiloTitles","fetchConsentManager","client","consentManager","makeGraphQLRequest","FETCH_CONSENT_MANAGER","fetchConsentManagerId","maxRequests","FETCH_CONSENT_MANAGER_ID","PAGE_SIZE","fetchConsentManagerExperiences","experiences","offset","shouldContinue","nodes","EXPERIENCES","a","b","ConsentManagerMetricBin","fetchConsentManagerAnalyticsData","input","series","CONSENT_MANAGER_ANALYTICS_DATA","fetchConsentManagerTheme","airgapBundleId","theme","FETCH_CONSENT_MANAGER_THEME","colors","chunk","MAX_PAGE_SIZE","updateOrCreateCookies","client","cookieInputs","airgapBundleId","fetchConsentManagerId","mapSeries","chunk","page","makeGraphQLRequest","UPDATE_OR_CREATE_COOKIES","cookie","syncCookies","cookies","encounteredError","logger","colors","notUnique","cook","name","err","PAGE_SIZE","fetchAllTeams","client","teams","offset","shouldContinue","nodes","makeGraphQLRequest","TEAMS","a","b","syncDataSubject","client","dataSubject","dataSubjectId","skipPublish","makeGraphQLRequest","UPDATE_DATA_SUBJECT","TOGGLE_DATA_SUBJECT","keyBy","uniq","difference","colors","PAGE_SIZE","ADMIN_LINK","fetchAllApiKeys","client","titles","apiKeys","offset","shouldContinue","nodes","makeGraphQLRequest","API_KEYS","a","b","fetchApiKeys","apiKeyInputs","dataSilos","fetchAll","logger","colors","title","expectedApiKeyTitles","uniq","silo","x","allTitlesExpected","apiKeysByTitle","keyBy","missingApiKeys","difference","PAGE_SIZE","fetchAllPrompts","client","text","titles","ids","prompts","offset","shouldContinue","nodes","makeGraphQLRequest","PROMPTS","a","b","fetchPromptsWithVariables","promptTitles","promptIds","promptsWithVariables","PROMPTS_WITH_VARIABLES","colors","keyBy","createPrompt","client","input","prompt","makeGraphQLRequest","CREATE_PROMPT","logger","colors","updatePrompts","UPDATE_PROMPTS","id","syncPrompts","prompts","concurrency","encounteredError","existing","fetchAllPrompts","promptByTitle","keyBy","mapPromptsToExisting","promptInput","newPrompts","map","err","existingPrompts","x","fetchPrivacyCenterUrl","client","organization","makeGraphQLRequest","DEPLOYED_PRIVACY_CENTER_URL","fetchPrivacyCenterId","url","urlToUse","privacyCenter","FETCH_PRIVACY_CENTER_ID","fetchAllPolicies","client","deployedPrivacyCenterUrl","fetchPrivacyCenterUrl","privacyCenterPolicies","makeGraphQLRequest","POLICIES","a","b","colors","chunk","keyBy","MAX_PAGE_SIZE","updatePolicies","client","policyInputs","privacyCenterId","fetchPrivacyCenterId","mapSeries","chunk","page","makeGraphQLRequest","UPDATE_POLICIES","policy","policyId","syncPolicies","policies","encounteredError","logger","colors","notUnique","pol","title","existingPolicies","fetchAllPolicies","policiesById","keyBy","err","colors","chunk","MAX_PAGE_SIZE","updateIntlMessages","client","messageInputs","mapSeries","chunk","page","makeGraphQLRequest","UPDATE_INTL_MESSAGES","message","locale","value","syncIntlMessages","messages","encounteredError","logger","colors","notUnique","pol","id","err","colors","syncPrivacyCenter","client","privacyCenter","encounteredError","logger","colors","privacyCenterId","fetchPrivacyCenterId","makeGraphQLRequest","UPDATE_PRIVACY_CENTER","err","colors","difference","PAGE_SIZE","fetchPartitions","client","partitions","offset","shouldContinue","nodes","makeGraphQLRequest","CONSENT_PARTITIONS","a","b","syncPartitions","partitionInputs","airgapBundleId","fetchConsentManagerId","encounteredError","newPartitionNames","difference","name","mapSeries","CREATE_CONSENT_PARTITION","logger","colors","err","PAGE_SIZE","fetchAllPurposes","client","includeDeleted","purposes","offset","shouldContinue","nodes","makeGraphQLRequest","PURPOSES","a","b","colors","keyBy","InitialViewState","OnConsentExpiry","PURPOSES_LINK","syncConsentManagerExperiences","client","experiences","existingExperiences","fetchConsentManagerExperiences","experienceLookup","keyBy","purposes","fetchAllPurposes","purposeLookup","map","exp","ind","purposeIds","purpose","ind2","existingPurpose","optedOutPurposeIds","existingExperience","makeGraphQLRequest","UPDATE_CONSENT_EXPERIENCE","logger","colors","CREATE_CONSENT_EXPERIENCE","OnConsentExpiry","InitialViewState","syncConsentManager","consentManager","airgapBundleId","fetchConsentManagerId","err","privacyCenterId","fetchPrivacyCenterId","createConsentManager","CREATE_CONSENT_MANAGER","UPDATE_CONSENT_MANAGER_DOMAINS","partitionToUpdate","fetchPartitions","part","UPDATE_CONSENT_MANAGER_PARTITION","UPDATE_CONSENT_MANAGER_VERSION","UPDATE_TOGGLE_USP_API","TOGGLE_UNKNOWN_REQUEST_POLICY","TOGGLE_UNKNOWN_COOKIE_POLICY","TOGGLE_TELEMETRY_PARTITION_STRATEGY","TOGGLE_CONSENT_PRECEDENCE","UPDATE_CONSENT_MANAGER_THEME","colors","AttributeKeyType","PAGE_SIZE","fetchAllAttributeValues","client","attributeKeyId","logger","colors","attributeValues","offset","shouldContinue","nodes","makeGraphQLRequest","ATTRIBUTE_VALUES","a","b","SYNC_ATTRIBUTE_TYPES","AttributeKeyType","fetchAllAttributes","attributes","ATTRIBUTES","node","PAGE_SIZE","fetchAllBusinessEntities","client","businessEntities","offset","shouldContinue","nodes","makeGraphQLRequest","BUSINESS_ENTITIES","a","b","keyBy","chunk","colors","createBusinessEntity","client","businessEntity","input","makeGraphQLRequest","CREATE_BUSINESS_ENTITY","updateBusinessEntities","businessEntityIdParis","chunkedUpdates","chunk","mapSeries","chunked","UPDATE_BUSINESS_ENTITIES","id","syncBusinessEntities","inputs","logger","encounteredError","existingBusinessEntities","fetchAllBusinessEntities","businessEntityByTitle","keyBy","newBusinessEntities","newBusinessEntity","err","ConsentTrackerStatus","PAGE_SIZE","fetchAllDataFlows","client","status","dataFlows","offset","airgapBundleId","fetchConsentManagerId","shouldContinue","nodes","makeGraphQLRequest","DATA_FLOWS","a","b","chunk","colors","ConsentTrackerStatus","MAX_PAGE_SIZE","updateDataFlows","client","dataFlowInputs","classifyService","airgapBundleId","fetchConsentManagerId","mapSeries","chunk","page","makeGraphQLRequest","UPDATE_DATA_FLOWS","flow","id","createDataFlows","CREATE_DATA_FLOWS","syncDataFlows","dataFlows","encounteredError","logger","colors","notUnique","dataFlow","value","existingLiveDataFlows","existingInReviewDataFlows","fetchAllDataFlows","allDataFlows","mapDataFlowsToExisting","newDataFlows","existing","err","existingDataFlows","x","difference","IsoCountryCode","IsoCountrySubdivisionCode","ALL_COUNTRIES_AND_SUBDIVISIONS","syncAction","client","action","actionId","skipPublish","makeGraphQLRequest","UPDATE_ACTION","PAGE_SIZE","fetchAllTemplates","client","title","templates","offset","shouldContinue","nodes","makeGraphQLRequest","TEMPLATES","a","b","syncTemplate","template","CREATE_TEMPLATE","PAGE_SIZE","fetchAllActions","client","actions","offset","shouldContinue","nodes","makeGraphQLRequest","ACTIONS","a","b","PAGE_SIZE","fetchAllPromptPartials","client","promptPartials","offset","shouldContinue","nodes","makeGraphQLRequest","PROMPT_PARTIALS","a","b","PAGE_SIZE","fetchAllPromptGroups","client","promptGroups","offset","shouldContinue","nodes","makeGraphQLRequest","PROMPT_GROUPS","a","b","PAGE_SIZE","fetchAllAgents","client","filterBy","agents","offset","shouldContinue","nodes","makeGraphQLRequest","AGENTS","a","b","keyBy","colors","createAgent","client","agent","input","makeGraphQLRequest","CREATE_AGENT","updateAgents","agentIdParis","UPDATE_AGENTS","id","syncAgents","inputs","logger","colors","encounteredError","existingAgents","fetchAllAgents","agentByName","keyBy","newAgents","mapSeries","newAgent","err","keyBy","colors","fetchAllActionItemCollections","client","filterBy","nodes","makeGraphQLRequest","GLOBAL_ACTION_ITEM_COLLECTIONS","createActionItemCollection","client","actionItemCollection","input","makeGraphQLRequest","CREATE_ACTION_ITEM_COLLECTION","updateActionItemCollection","actionItemCollectionId","UPDATE_ACTION_ITEM_COLLECTION","syncActionItemCollections","inputs","encounteredError","logger","colors","existingActionItemCollections","fetchAllActionItemCollections","collectionByTitle","keyBy","newCollections","mapSeries","err","actionItemsToUpdate","x","actionItemId","PAGE_SIZE","fetchAllActionItems","client","filterBy","actionItems","offset","shouldContinue","nodes","makeGraphQLRequest","GLOBAL_ACTION_ITEMS","node","uniq","keyBy","chunk","colors","createActionItems","client","actionItems","actionItemCollectionByTitle","attributeKeysByName","chunked","chunk","mapSeries","chunkToUpload","makeGraphQLRequest","CREATE_ACTION_ITEMS","actionItem","collectionTitle","updateActionItem","input","actionItemId","getAttribute","key","existing","UPDATE_ACTION_ITEMS","values","actionItemToUniqueCode","title","collections","c","actionItemInputToUniqueCode","syncActionItems","inputs","encounteredError","logger","colors","hasAttributes","existingActionItems","existingActionItemCollections","attributeKeys","fetchAllActionItems","fetchAllActionItemCollections","fetchAllAttributes","keyBy","actionItemByTitle","actionItemByCxId","x","customerExperienceActionItemIds","missingCollections","uniq","newActionItems","err","actionItemsToUpdate","PAGE_SIZE","fetchAllAgentFunctions","client","agentFunctions","offset","shouldContinue","nodes","makeGraphQLRequest","AGENT_FUNCTIONS","node","a","b","keyBy","colors","createAgentFunction","client","agentFunction","input","makeGraphQLRequest","CREATE_AGENT_FUNCTION","updateAgentFunctions","agentFunctionIdPairs","UPDATE_AGENT_FUNCTIONS","id","syncAgentFunctions","inputs","logger","colors","encounteredError","existingAgentFunctions","fetchAllAgentFunctions","agentFunctionByName","keyBy","newAgentFunctions","mapSeries","newAgentFunction","err","PAGE_SIZE","fetchAllAgentFiles","client","filterBy","agentFiles","offset","shouldContinue","nodes","makeGraphQLRequest","AGENT_FILES","a","b","keyBy","colors","createAgentFile","client","agentFile","input","makeGraphQLRequest","CREATE_AGENT_FILE","updateAgentFiles","agentFileIdPairs","UPDATE_AGENT_FILES","id","syncAgentFiles","inputs","logger","colors","encounteredError","existingAgentFiles","fetchAllAgentFiles","agentFileByName","keyBy","newAgentFiles","mapSeries","newAgentFile","err","PAGE_SIZE","fetchAllVendors","client","vendors","offset","shouldContinue","nodes","makeGraphQLRequest","VENDORS","a","b","keyBy","colors","createVendor","client","vendor","input","makeGraphQLRequest","CREATE_VENDOR","updateVendors","vendorIdParis","UPDATE_VENDORS","id","syncVendors","inputs","logger","colors","encounteredError","existingVendors","fetchAllVendors","vendorByTitle","keyBy","newVendors","mapSeries","newVendor","err","PAGE_SIZE","fetchAllDataCategories","client","dataSubCategories","offset","shouldContinue","nodes","makeGraphQLRequest","DATA_SUB_CATEGORIES","a","b","keyBy","colors","createDataCategory","client","dataCategory","input","makeGraphQLRequest","CREATE_DATA_SUB_CATEGORY","updateDataCategories","dataCategoryIdPairs","UPDATE_DATA_SUB_CATEGORIES","id","syncDataCategories","inputs","logger","colors","encounteredError","existingDataCategories","fetchAllDataCategories","dataCategoryByName","keyBy","name","category","newDataCategories","mapSeries","newDataCategory","err","PAGE_SIZE","fetchAllProcessingPurposes","client","processingPurposeSubCategories","offset","shouldContinue","nodes","makeGraphQLRequest","PROCESSING_PURPOSE_SUB_CATEGORIES","a","b","keyBy","colors","createProcessingPurpose","client","processingPurpose","input","createProcessingPurposeSubCategory","makeGraphQLRequest","CREATE_PROCESSING_PURPOSE_SUB_CATEGORY","updateProcessingPurposes","processingPurposeIdPairs","UPDATE_PROCESSING_PURPOSE_SUB_CATEGORIES","id","syncProcessingPurposes","inputs","logger","colors","encounteredError","existingProcessingPurposes","fetchAllProcessingPurposes","processingPurposeByName","keyBy","name","purpose","newProcessingPurposes","mapSeries","newProcessingPurpose","err","colors","keyBy","colors","createTeam","client","team","input","makeGraphQLRequest","CREATE_TEAM","updateTeam","teamId","UPDATE_TEAM","syncTeams","inputs","logger","colors","encounteredError","existingTeams","fetchAllTeams","teamsByName","keyBy","newTeams","updatedTeams","mapSeries","newTeam","err","colors","keyBy","createPromptPartial","client","input","promptPartial","makeGraphQLRequest","CREATE_PROMPT_PARTIAL","logger","colors","updatePromptPartials","UPDATE_PROMPT_PARTIALS","id","syncPromptPartials","promptPartials","concurrency","encounteredError","existing","fetchAllPromptPartials","promptPartialByTitle","keyBy","mapPromptPartialsToExisting","promptInput","newPromptPartials","map","prompt","err","existingPromptPartials","x","colors","keyBy","createPromptGroup","client","input","promptGroup","makeGraphQLRequest","CREATE_PROMPT_GROUP","logger","colors","updatePromptGroups","UPDATE_PROMPT_GROUPS","id","syncPromptGroups","promptGroups","concurrency","encounteredError","existing","fetchAllPromptGroups","existingPrompts","fetchAllPrompts","promptByTitle","keyBy","promptGroupByTitle","mapPromptGroupsToExisting","promptInput","newPromptGroups","map","prompt","title","err","existingPromptGroups","x","prompts","CONCURRENCY","syncConfigurationToTranscend","input","client","pageSize","publishToPrivacyCenter","classifyService","deleteExtraAttributeValues","encounteredError","logger","colors","templates","attributes","actions","identifiers","dataSubjects","businessEntities","enrichers","cookies","consentManager","dataSilos","dataFlows","prompts","promptGroups","promptPartials","agents","agentFunctions","agentFiles","vendors","dataCategories","processingPurposes","actionItems","actionItemCollections","teams","privacyCenter","messages","policies","partitions","identifierByName","dataSubjectsByName","apiKeyTitleMap","fetchIdentifiersAndCreateMissing","ensureAllDataSubjectsExist","dataSilo","acc","lst","fetchApiKeys","syncConsentManager","err","promptsSuccess","syncPrompts","syncPromptPartials","syncPromptGroups","teamsSuccess","syncTeams","map","template","syncTemplate","businessEntitySuccess","syncBusinessEntities","vendorsSuccess","syncVendors","dataCategoriesSuccess","syncDataCategories","processingPurposesSuccess","syncProcessingPurposes","partitionsSuccess","syncPartitions","agentsSuccess","syncAgents","agentFunctionsSuccess","syncAgentFunctions","agentFilesSuccess","syncAgentFiles","cookiesSuccess","syncCookies","actionItemCollectionsSuccess","syncActionItemCollections","existingAttributes","fetchAllAttributes","attribute","existing","attr","syncAttribute","actionItemsSuccess","syncActionItems","enricher","syncEnricher","identifier","syncIdentifier","existingActions","fetchAllActions","action","act","syncAction","existingDataSubjects","fetchAllDataSubjects","dataSubject","subj","syncDataSubject","syncedDataFlows","syncDataFlows","privacyCenterSuccess","syncPrivacyCenter","messagesSuccess","syncIntlMessages","policiesSuccess","syncPolicies","dependencyUpdates","success","dataSiloTitleToId","syncDataSilos","syncDataSiloDependencies","fetchActiveSiloDiscoPlugin","client","dataSiloId","response","makeGraphQLRequest","ENABLED_PLUGINS","plugins","totalCount","logger","fetchAllPrivacyCenters","client","deployedPrivacyCenterUrl","fetchPrivacyCenterUrl","themeStr","rest","makeGraphQLRequest","PRIVACY_CENTER","fetchAllMessages","client","translatedMessages","makeGraphQLRequest","MESSAGES","ConsentTrackerStatus","PAGE_SIZE","fetchAllCookies","client","status","cookies","offset","airgapBundleId","fetchConsentManagerId","shouldContinue","nodes","makeGraphQLRequest","COOKIES","a","b","PAGE_SIZE","fetchAllAssessments","client","assessments","offset","shouldContinue","nodes","makeGraphQLRequest","ASSESSMENTS","a","b","PAGE_SIZE","fetchAllAssessmentTemplates","client","assessmentTemplates","offset","shouldContinue","nodes","makeGraphQLRequest","ASSESSMENT_TEMPLATES","a","b","AssessmentsDisplayLogicAction","ComparisonOperator","LogicOperator","decodeCodec","valuesOf","t","AssessmentRule","AssessmentNestedRule","self","AssessmentAction","parseAssessmentDisplayLogic","displayLogic","ComparisonOperator","decodeCodec","valuesOf","t","AssessmentRiskLogic","parseAssessmentRiskLogic","riskLogic","PAGE_SIZE","fetchAllPreferenceTopics","client","preferenceTopics","offset","shouldContinue","nodes","makeGraphQLRequest","PREFERENCE_TOPICS","a","b","fetchAllPurposesAndPreferences","client","purposes","topics","fetchAllPurposes","fetchAllPreferenceTopics","purpose","purposeTopics","topic","RequestAction","ConsentTrackerStatus","ActionItemCode","flatten","keyBy","mapValues","formatAttributeValues","vals","attributes","val","foundKey","att","colors","DEFAULT_TRANSCEND_PULL_RESOURCES","pullTranscendConfiguration","client","dataSiloIds","integrationNames","debug","resources","pageSize","skipDatapoints","includeGuessedCategories","skipSubDatapoints","trackerStatuses","ConsentTrackerStatus","logger","colors","dataSubjects","apiKeyTitleMap","dataSilos","enrichers","dataFlows","cookies","attributes","templates","identifiers","actions","businessEntities","consentManager","consentManagerExperiences","prompts","promptPartials","promptGroups","agents","agentFunctions","agentFiles","vendors","dataCategories","processingPurposes","actionItems","actionItemCollections","teams","policies","privacyCenters","messages","partitions","assessments","assessmentTemplates","purposes","fetchAllDataSubjects","fetchApiKeys","fetchEnrichedDataSilos","fetchAllEnrichers","fetchAllDataFlows","fetchAllCookies","fetchAllAttributes","fetchAllTemplates","fetchAllIdentifiers","fetchAllActions","fetchAllBusinessEntities","fetchConsentManager","fetchConsentManagerExperiences","fetchAllPrompts","fetchAllPromptPartials","fetchAllPromptGroups","fetchAllAgents","fetchAllAgentFunctions","fetchAllAgentFiles","fetchAllVendors","fetchAllDataCategories","fetchAllProcessingPurposes","fetchAllActionItems","ActionItemCode","fetchAllActionItemCollections","fetchAllTeams","fetchAllPolicies","fetchAllPrivacyCenters","fetchAllMessages","fetchPartitions","fetchAllAssessments","fetchAllAssessmentTemplates","fetchAllPurposesAndPreferences","consentManagerTheme","fetchConsentManagerTheme","result","apiKeyTitles","flatten","apiKeys","title","relevantApiKeys","name","partition","experience","region","purpose","assessmentGroup","sections","creator","description","status","assignees","externalAssignees","reviewers","isLocked","isArchived","isExternallyCreated","dueDate","createdAt","assignedAt","submittedAt","approvedAt","rejectedAt","titleIsInternal","retentionSchedule","attributeValues","syncedRows","questions","isReviewed","type","subType","placeholder","isRequired","referenceId","displayLogic","riskLogic","riskCategories","riskFramework","answerOptions","selectedAnswers","allowedMimeTypes","allowSelectOther","syncModel","syncColumn","attributeKey","requireRiskEvaluation","requireRiskMatrixEvaluation","displayLogicParsed","parseAssessmentDisplayLogic","rule","logic","parsed","parseAssessmentRiskLogic","value","email","formatAttributeValues","resourceType","category","source","content","ssoDepartment","ssoGroup","ssoTitle","users","scopes","active","adminDashboardDefaultSilentMode","versions","disabledLocales","id","defaultMessage","targetReactIntlId","translations","acc","locale","privacyCenter","address","headquarterCountry","headquarterSubDivision","dataProtectionOfficerName","dataProtectionOfficerEmail","skipSecondaryIfNoFiles","skipDownloadableStep","requiresReview","regionList","regionDetectionMethod","waitingPeriod","RequestAction","regex","selectOptions","privacyCenterVisibility","isRequiredInForm","displayTitle","displayDescription","displayOrder","agentId","instructions","codeInterpreterEnabled","retrievalEnabled","prompt","largeLanguageModel","owners","customerExperienceActionItemId","priority","resolved","collections","notes","link","hidden","productLine","parameters","fileId","size","dataProcessingAgreementLink","contactName","contactPhone","websiteUrl","businessEntity","trackingType","service","isRegex","trackingPurposes","values","enabledOn","color","defaultConsent","configurable","showInConsentManager","isActive","optOutSignals","authLevel","topics","showInPrivacyCenter","defaultConfiguration","preferenceOptionValues","slug","url","inputIdentifier","testRegex","expirationDuration","lookerQueryTitle","transitionRequestStatus","phoneNumbers","indexedDataSubjects","keyBy","outerType","notifyEmailAddress","dependentDataSilos","country","countrySubDivision","subjectBlocklist","isLive","promptAVendorEmailSendFrequency","promptAVendorEmailSendType","promptAVendorEmailIncludeIdentifiersAttachment","promptAVendorEmailCompletionLinkType","manualWorkRetryFrequency","catalog","discoveredBy","dataPoints","isConnected","convertToDataSubjectAllowlist","dataPoint","mapValues","databaseIntegrationQuery","field","guess","a","b","colors","chunk","keyBy","PAGE_SIZE","fetchAllSoftwareDevelopmentKits","client","softwareDevelopmentKits","offset","shouldContinue","nodes","makeGraphQLRequest","SOFTWARE_DEVELOPMENT_KITS","a","b","CHUNK_SIZE","createSoftwareDevelopmentKit","client","input","softwareDevelopmentKit","makeGraphQLRequest","CREATE_SOFTWARE_DEVELOPMENT_KIT","logger","colors","updateSoftwareDevelopmentKits","inputs","softwareDevelopmentKits","UPDATE_SOFTWARE_DEVELOPMENT_KITS","syncSoftwareDevelopmentKits","concurrency","encounteredError","sdks","existing","fetchAllSoftwareDevelopmentKits","softwareDevelopmentKitByTitle","keyBy","name","codePackageType","mapSoftwareDevelopmentKitsToExisting","sdkInput","newSoftwareDevelopmentKits","map","sdk","newSdk","err","existingSoftwareDevelopmentKits","x","chunks","chunk","mapSeries","updatedSdks","id","colors","chunk","keyBy","PAGE_SIZE","fetchAllRepositories","client","repositories","offset","shouldContinue","nodes","makeGraphQLRequest","REPOSITORIES","a","b","CHUNK_SIZE","createRepository","client","input","repository","makeGraphQLRequest","CREATE_REPOSITORY","logger","colors","updateRepositories","inputs","repositories","UPDATE_REPOSITORIES","syncRepositories","concurrency","encounteredError","repos","existing","fetchAllRepositories","repositoryByName","keyBy","mapRepositoriesToExisting","repoInput","newRepositories","map","repo","newRepo","err","existingRepositories","x","chunks","chunk","mapSeries","updatedRepos","id","chunk","uniq","keyBy","uniqBy","colors","PAGE_SIZE","fetchAllCodePackages","client","codePackages","offset","shouldContinue","nodes","makeGraphQLRequest","CODE_PACKAGES","a","b","CHUNK_SIZE","LOOKUP_SPLIT_KEY","createCodePackage","client","input","codePackage","makeGraphQLRequest","CREATE_CODE_PACKAGE","logger","colors","updateCodePackages","inputs","codePackages","UPDATE_CODE_PACKAGES","syncCodePackages","concurrency","encounteredError","existingCodePackages","existingSoftwareDevelopmentKits","fetchAllCodePackages","syncSoftwareDevelopmentKits","uniqBy","type","softwareDevelopmentKits","name","codePackageType","syncRepositories","repositoryName","softwareDevelopmentKitLookup","keyBy","codePackagesLookup","mapCodePackagesToExisting","codePackageInput","newCodePackages","existing","map","uniq","sdk","err","existingCodePackageInputs","x","chunks","chunk","mapSeries","id","chunk","CHUNK_SIZE","uploadSiloDiscoveryResults","client","pluginId","results","chunks","chunk","mapSeries","rawResults","makeGraphQLRequest","ADD_SILO_DISCOVERY_RESULTS","PAGE_SIZE","fetchAllCatalogs","client","catalogs","offset","shouldContinue","nodes","makeGraphQLRequest","CATALOGS","a","b","fetchAndIndexCatalogs","serviceToTitle","acc","catalog","serviceToSupportedIntegration","GraphQLClient","buildTranscendGraphQLClientGeneric","transcendUrl","headers","GraphQLClient","version","buildTranscendGraphQLClient","auth","got","createSombraGotInstance","transcendUrl","transcendApiKey","sombraApiKey","client","buildTranscendGraphQLClient","organization","makeGraphQLRequest","ORGANIZATION","got","setResourceAttributes","client","input","makeGraphQLRequest","SET_RESOURCE_ATTRIBUTES","retryRequestEnricher","client","id","makeGraphQLRequest","RETRY_REQUEST_ENRICHER","PAGE_SIZE","fetchAllPromptThreads","client","filterBy","promptThreads","offset","shouldContinue","nodes","makeGraphQLRequest","PROMPT_THREADS","a","b","PAGE_SIZE","fetchAllRequestIdentifierMetadata","client","requestId","requestIdentifiers","offset","shouldContinue","nodes","makeGraphQLRequest","REQUEST_IDENTIFIERS","fetchRequestDataSiloActiveCount","client","dataSiloId","totalCount","makeGraphQLRequest","REDUCED_REQUESTS_FOR_DATA_SILO_COUNT","PAGE_SIZE","fetchAllRequestAttributeKeys","client","attributeKeys","offset","shouldContinue","nodes","makeGraphQLRequest","ATTRIBUTE_KEYS_REQUESTS","a","b","colors","t","cliProgress","valuesOf","RequestAction","RequestOrigin","RequestStatus","IsoCountryCode","IsoCountrySubdivisionCode","LanguageKey","PrivacyRequest","valuesOf","RequestAction","RequestOrigin","RequestStatus","IsoCountryCode","IsoCountrySubdivisionCode","PAGE_SIZE","fetchAllRequests","client","actions","statuses","origins","text","createdAtBefore","createdAtAfter","isTest","isSilent","isClosed","requestIds","logger","colors","t0","progressBar","cliProgress","requests","offset","shouldContinue","nodes","totalCount","makeGraphQLRequest","REQUESTS","totalTime","allRequests","request","IdentifierType","decodeCodec","valuesOf","t","semver","MIN_SOMBRA_VERSION_TO_DECRYPT","RequestIdentifier","valuesOf","IdentifierType","PAGE_SIZE","RequestIdentifiersResponse","fetchAllRequestIdentifiers","client","sombra","requestId","requestIdentifiers","offset","shouldContinue","version","makeGraphQLRequest","SOMBRA_VERSION","semver","response","err","nodes","decodeCodec","PAGE_SIZE","fetchAllRequestEnrichers","client","requestId","requestEnrichers","offset","shouldContinue","nodes","makeGraphQLRequest","REQUEST_ENRICHERS","colors","cliProgress","PAGE_SIZE","fetchRequestDataSilos","client","requestId","dataSiloId","requestStatuses","statuses","skipLog","t0","progressBar","cliProgress","requestDataSilos","offset","shouldContinue","nodes","totalCount","makeGraphQLRequest","REQUEST_DATA_SILOS","logger","colors","totalTime","fetchRequestDataSilo","got","createTranscendConsentGotInstance","transcendUrl","loginUser","client","email","password","loginMethod","makeGraphQLRequest","DETERMINE_LOGIN_METHOD","res","LOGIN","user","loginCookie","assumeRole","roleId","ASSUME_ROLE","PAGE_SIZE","fetchAllUsers","client","users","offset","shouldContinue","nodes","makeGraphQLRequest","USERS","a","b","createApiKey","client","input","apiKey","makeGraphQLRequest","CREATE_API_KEY","deleteApiKey","id","DELETE_API_KEY","PAGE_SIZE","fetchRequestFilesForRequest","client","filterBy","requestFiles","offset","shouldContinue","nodes","makeGraphQLRequest","REQUEST_FILES","a","b","deployConsentManager","client","id","bundleType","makeGraphQLRequest","DEPLOY_CONSENT_MANAGER","updateConsentManagerToLatest","UPDATE_CONSENT_MANAGER_TO_LATEST","reportPromptRun","client","input","promptRun","makeGraphQLRequest","REPORT_PROMPT_RUN","content","rest","addMessagesToPromptRun","client","promptRunId","promptRunMessages","rest","promptRun","makeGraphQLRequest","ADD_MESSAGES_TO_PROMPT_RUN","content"]}